jira-ruby 0.1.17 → 0.1.18

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2ff744bcd9ad2d2787f07ecf627888484805cadf
4
- data.tar.gz: ae9c78df7d9b0de9fb35bdfb0671119240211a91
3
+ metadata.gz: a295ea67b7236d11b1696c74e9491f80f694c698
4
+ data.tar.gz: c00568c1bba25ed92d64531df36539ba8d7d3d31
5
5
  SHA512:
6
- metadata.gz: d118f8da88f23970bb406d4cfabec43eb19fc4178fddc4c9ec9e9c893933dff4b0aa6c3aa56fdcfc92a1ee43817f8ba39d1b03d2a1645c950528bf104eebcbcd
7
- data.tar.gz: 4a9a20b2c3ecb34c7ff79c87cbf0546ec5bbb89700a3655066fd4060d5b9fa4e8dbaf68e66d40f7a8ec02b36c96712be8af4889d6618f50a603ed85f91611c6f
6
+ metadata.gz: 0e4c24dffaa5d308386ab2698391a8c0c73de5ac67582360c15df32c99775b07495776b6ab87637b0b4ccdb7d47e80508f868c5073391946ea199858fef0a12c
7
+ data.tar.gz: 89f26829c1937b26846e6557b0265e693e65ff22e764ebdfd05e06209d15034d42ca865846fc048907f06844896fa7b197b7bdd082b1acb564f3e6a969c20eb0
data/Gemfile CHANGED
@@ -1,6 +1,11 @@
1
1
  source "http://rubygems.org"
2
2
 
3
- gem 'pry'
4
-
3
+ group :development do
4
+ gem 'guard'
5
+ gem 'guard-rspec'
6
+ gem 'pry' # this was in the original Gemfile - but only needed in development
7
+ gem 'wdm', '>= 0.1.0' if Gem.win_platform?
8
+ end
9
+
5
10
  # Specify your gem's dependencies in jira_api.gemspec
6
11
  gemspec
@@ -0,0 +1,14 @@
1
+ gem 'wdm', '>= 0.1.0' if Gem.win_platform?
2
+ gem 'rspec', '~> 3.0.0'
3
+
4
+ guard 'rspec', cmd: 'bundle exec rspec --color --format doc' do
5
+ # watch /lib/ files
6
+ watch(%r{^lib/(.+).rb$}) do |m|
7
+ "spec/#{m[1]}_spec.rb"
8
+ end
9
+
10
+ # watch /spec/ files
11
+ watch(%r{^spec/(.+).rb$}) do |m|
12
+ "spec/#{m[1]}.rb"
13
+ end
14
+ end
@@ -76,6 +76,10 @@ defaults to HTTP Basic Auth.
76
76
  Using HTTP Basic Authentication, configure and connect a client to your instance
77
77
  of JIRA.
78
78
 
79
+ Note: If your Jira install is hosted on {atlassian.net}[atlassian.net], it will have no context
80
+ path by default. If you're having issues connecting, try setting context_path
81
+ to an empty string in the options hash.
82
+
79
83
  require 'rubygems'
80
84
  require 'pp'
81
85
  require 'jira'
@@ -273,7 +277,8 @@ Here's the same example as a Sinatra application:
273
277
  # Initiates the OAuth dance by first requesting a token then redirecting to
274
278
  # http://<yourserver>/auth to get the @access_token
275
279
  get '/signin' do
276
- request_token = @jira_client.request_token
280
+ callback_url = "#{request.base_url}/callback"
281
+ request_token = @jira_client.request_token(oauth_callback: callback_url)
277
282
  session[:request_token] = request_token.token
278
283
  session[:request_secret] = request_token.secret
279
284
 
@@ -283,7 +288,7 @@ Here's the same example as a Sinatra application:
283
288
  # http://<yourserver>/callback
284
289
  # Retrieves the @access_token then stores it inside a session cookie. In a real app,
285
290
  # you'll want to persist the token in a datastore associated with the user.
286
- get "/callback/" do
291
+ get "/callback" do
287
292
  request_token = @jira_client.set_request_token(
288
293
  session[:request_token], session[:request_secret]
289
294
  )
data/Rakefile CHANGED
@@ -19,7 +19,11 @@ task :prepare do
19
19
  end
20
20
 
21
21
  desc 'Run RSpec tests'
22
- RSpec::Core::RakeTask.new(:spec)
22
+ #RSpec::Core::RakeTask.new(:spec)
23
+ RSpec::Core::RakeTask.new(:spec) do |task|
24
+ task.rspec_opts = ['--color', '--format', 'doc']
25
+ end
26
+
23
27
 
24
28
  Rake::RDocTask.new(:doc) do |rd|
25
29
  rd.main = 'README.rdoc'
data/example.rb CHANGED
@@ -42,6 +42,28 @@ end
42
42
  issue = client.Issue.find('SAMPLEPROJECT-1')
43
43
  pp issue
44
44
 
45
+ # # Handling fields by name, rather than by id
46
+ # # ------------------------------------------
47
+ # Cache the Field list from the server
48
+ client.Field.map_fields
49
+ # This allows use of friendlier names for custom fields
50
+ # Say that 'Special Field' is customfield_12345
51
+ # It becomes mapped to Special_Field which is usable as a method call
52
+ #
53
+ # Say that there is a second 'Special Field' is customfield_54321
54
+ # Names are deduplicated so the second 'Special Field' becomes Special_Field_54321
55
+ #
56
+ # Names are massaged to get rid of special characters, and spaces
57
+ # So 'Special & @ Field' becomes Special_____Field - not perfect, but usable
58
+ old_way = issue.customfield_12345
59
+ new_way = issue.Special_Field
60
+ (old_way == new_way) && puts 'much easier'
61
+ #
62
+ # Can also use this to specify fields to be returned in the response
63
+ client.Issue.jql(a_normal_jql_search, fields:[:Special_Field])
64
+ # Or you could always do it the old way - if you can remember the numbers...
65
+ client.Issue.jql(a_normal_jql_search, fields:['customfield_12345'])
66
+
45
67
  # # Find a specific project by key
46
68
  # # ------------------------------
47
69
  # project = client.Project.find('SAMPLEPROJECT')
@@ -173,4 +195,4 @@ remote_link.save(
173
195
  :title => issue_1.key,
174
196
  }
175
197
  }
176
- )
198
+ )
@@ -30,6 +30,8 @@ require 'jira/resource/filter'
30
30
  require 'jira/resource/field'
31
31
  require 'jira/resource/rapidview'
32
32
  require 'jira/resource/serverinfo'
33
+ require 'jira/resource/createmeta'
34
+ require 'jira/resource/webhook'
33
35
 
34
36
  require 'jira/request_client'
35
37
  require 'jira/oauth_client'
@@ -348,7 +348,7 @@ module JIRA
348
348
  # JIRA::HTTPError if the request fails (response is not HTTP 2xx).
349
349
  def save!(attrs)
350
350
  http_method = new_record? ? :post : :put
351
- response = client.send(http_method, url, attrs.to_json)
351
+ response = client.send(http_method, new_record? ? url : patched_url, attrs.to_json)
352
352
  set_attrs(attrs, false)
353
353
  set_attrs_from_response(response)
354
354
  @expanded = false
@@ -439,6 +439,7 @@ module JIRA
439
439
  end
440
440
 
441
441
  # This method fixes issue that there is no / prefix in url. It is happened when we call for instance
442
+ # Looks like this issue is actual only in case if you use atlassian sdk your app path is not root (like /jira in example below)
442
443
  # issue.save() for existing resource.
443
444
  # As a result we got error 400 from JIRA API:
444
445
  # [07/Jun/2015:15:32:19 +0400] "PUT jira/rest/api/2/issue/10111 HTTP/1.1" 400 -
@@ -446,7 +447,7 @@ module JIRA
446
447
  # [07/Jun/2015:15:17:18 +0400] "PUT /jira/rest/api/2/issue/10111 HTTP/1.1" 204 -
447
448
  def patched_url
448
449
  result = url
449
- result if result.start_with?('/')
450
+ return result if result.start_with?('/')
450
451
  "/#{result}"
451
452
  end
452
453
 
@@ -455,8 +456,8 @@ module JIRA
455
456
  end
456
457
 
457
458
  # Returns a JSON representation of the current attributes hash.
458
- def to_json
459
- attrs.to_json
459
+ def to_json(options = {})
460
+ attrs.to_json(options)
460
461
  end
461
462
 
462
463
  # Determines if the resource is newly created by checking whether its
@@ -15,7 +15,7 @@ module JIRA
15
15
  # Need to do a little bit of work here as Module.const_get doesn't work
16
16
  # with nested class names, i.e. JIRA::Resource::Foo.
17
17
  #
18
- # So create a method chain from the class componenets. This code will
18
+ # So create a method chain from the class components. This code will
19
19
  # unroll to:
20
20
  # Module.const_get('JIRA').const_get('Resource').const_get('Foo')
21
21
  #
@@ -35,7 +35,7 @@ module JIRA
35
35
  end
36
36
  end
37
37
 
38
- # The priciple purpose of this class is to delegate methods to the corresponding
38
+ # The principle purpose of this class is to delegate methods to the corresponding
39
39
  # non-factory class and automatically prepend the client argument to the argument
40
40
  # list.
41
41
  delegate_to_target_class :all, :find, :collection_path, :singular_path, :jql
@@ -1,5 +1,6 @@
1
1
  require 'json'
2
2
  require 'forwardable'
3
+ require 'ostruct'
3
4
 
4
5
  module JIRA
5
6
 
@@ -37,7 +38,7 @@ module JIRA
37
38
  #
38
39
  # The authenticated client instance returned by the respective client type
39
40
  # (Oauth, Basic)
40
- attr_accessor :consumer, :request_client
41
+ attr_accessor :consumer, :request_client, :http_debug, :cache
41
42
 
42
43
  # The configuration options for this client instance
43
44
  attr_reader :options
@@ -50,7 +51,8 @@ module JIRA
50
51
  :rest_base_path => "/rest/api/2",
51
52
  :ssl_verify_mode => OpenSSL::SSL::VERIFY_PEER,
52
53
  :use_ssl => true,
53
- :auth_type => :oauth
54
+ :auth_type => :oauth,
55
+ :http_debug => false
54
56
  }
55
57
 
56
58
  def initialize(options={})
@@ -64,9 +66,15 @@ module JIRA
64
66
  @consumer = @request_client.consumer
65
67
  when :basic
66
68
  @request_client = HttpClient.new(@options)
69
+ else
70
+ raise ArgumentError, 'Options: ":auth_type" must be ":oauth" or ":basic"'
67
71
  end
68
72
 
73
+ @http_debug = @options[:http_debug]
74
+
69
75
  @options.freeze
76
+
77
+ @cache = OpenStruct.new
70
78
  end
71
79
 
72
80
  def Project # :nodoc:
@@ -133,10 +141,18 @@ module JIRA
133
141
  JIRA::Resource::ServerInfoFactory.new(self)
134
142
  end
135
143
 
144
+ def Createmeta
145
+ JIRA::Resource::CreatemetaFactory.new(self)
146
+ end
147
+
136
148
  def ApplicationLink
137
149
  JIRA::Resource::ApplicationLinkFactory.new(self)
138
150
  end
139
151
 
152
+ def Webhook
153
+ JIRA::Resource::WebhookFactory.new(self)
154
+ end
155
+
140
156
  def Issuelink
141
157
  JIRA::Resource::IssuelinkFactory.new(self)
142
158
  end
@@ -176,6 +192,7 @@ module JIRA
176
192
  # Sends the specified HTTP request to the REST API through the
177
193
  # appropriate method (oauth, basic).
178
194
  def request(http_method, path, body = '', headers={})
195
+ puts "#{http_method}: #{path} - [#{body}]" if @http_debug
179
196
  @request_client.request(http_method, path, body, headers)
180
197
  end
181
198
 
@@ -0,0 +1,52 @@
1
+ module JIRA
2
+ module Resource
3
+
4
+ class CreatemetaFactory < JIRA::BaseFactory # :nodoc:
5
+ end
6
+
7
+ class Createmeta < JIRA::Base
8
+ def self.endpoint_name
9
+ '/issue/createmeta'
10
+ end
11
+
12
+ def self.all(client, params={})
13
+
14
+ if params.has_key?(:projectKeys)
15
+ values = Array(params[:projectKeys]).map{|i| (i.is_a?(JIRA::Resource::Project) ? i.key : i)}
16
+ params[:projectKeys] = values.join(',')
17
+ end
18
+
19
+ if params.has_key?(:projectIds)
20
+ values = Array(params[:projectIds]).map{|i| (i.is_a?(JIRA::Resource::Project) ? i.id : i)}
21
+ params[:projectIds] = values.join(',')
22
+ end
23
+
24
+ if params.has_key?(:issuetypeNames)
25
+ values = Array(params[:issuetypeNames]).map{|i| (i.is_a?(JIRA::Resource::Issuetype) ? i.name : i)}
26
+ params[:issuetypeNames] = values.join(',')
27
+ end
28
+
29
+ if params.has_key?(:issuetypeIds)
30
+ values = Array(params[:issuetypeIds]).map{|i| (i.is_a?(JIRA::Resource::Issuetype) ? i.id : i)}
31
+ params[:issuetypeIds] = values.join(',')
32
+ end
33
+
34
+ create_meta_url = client.options[:rest_base_path] + self.endpoint_name
35
+ params = hash_to_query_string(params)
36
+
37
+ response = params.empty? ? client.get("#{create_meta_url}") : client.get("#{create_meta_url}?#{params}")
38
+
39
+ json = parse_json(response.body)
40
+ self.new(client, {:attrs => json['projects']})
41
+ end
42
+
43
+ def self.hash_to_query_string(query_params)
44
+ query_params.map do |k,v|
45
+ CGI.escape(k.to_s) + '=' + CGI.escape(v.to_s)
46
+ end.join('&')
47
+ end
48
+
49
+ end
50
+
51
+ end
52
+ end
@@ -2,9 +2,82 @@ module JIRA
2
2
  module Resource
3
3
 
4
4
  class FieldFactory < JIRA::BaseFactory # :nodoc:
5
+ delegate_to_target_class :map_fields, :name_to_id, :field_map
5
6
  end
6
7
 
7
- class Field < JIRA::Base ; end
8
+ class Field < JIRA::Base
8
9
 
10
+ #translate a custom field description to a method-safe name
11
+ def self.safe_name(description)
12
+ description.gsub(/[^a-zA-Z0-9]/,'_')
13
+ end
14
+
15
+ # safe_name plus disambiguation if it fails it uses the original jira id (customfield_#####)
16
+ def self.safer_name(description, jira_id)
17
+ "#{safe_name(description)}_#{jira_id.split('_')[1]}" rescue jira_id
18
+ end
19
+
20
+ def self.map_fields(client)
21
+ field_map = {}
22
+ field_map_reverse = {}
23
+ fields = client.Field.all
24
+
25
+ # two pass approach, so that a custom field with the same name
26
+ # as a system field can't take precedence
27
+ fields.each do |f|
28
+ next if f.custom
29
+ name = safe_name(f.name)
30
+ field_map_reverse[f.id] = [f.name, name] # capture both the official name, and the mapped name
31
+ field_map[name] = f.id
32
+ end
33
+
34
+ fields.each do |f|
35
+ next unless f.custom
36
+ name = if field_map.key? f.name
37
+ renamed = safer_name(f.name, f.id)
38
+ warn "Duplicate Field name #{f.name} #{f.id} - renaming as #{renamed}"
39
+ renamed
40
+ else
41
+ safe_name(f.name)
42
+ end
43
+ field_map_reverse[f.id] = [f.name, name] # capture both the official name, and the mapped name
44
+ field_map[name] = f.id
45
+ end
46
+
47
+ client.cache.field_map_reverse = field_map_reverse # not sure where this will be used yet, but sure to be useful
48
+ client.cache.field_map = field_map
49
+ end
50
+
51
+ def self.field_map(client)
52
+ client.cache.field_map
53
+ end
54
+
55
+ def self.name_to_id(client, field_name)
56
+ field_name = field_name.to_s
57
+ return field_name unless client.cache.field_map && client.cache.field_map[field_name]
58
+ client.cache.field_map[field_name]
59
+ end
60
+
61
+ def respond_to?(method_name, include_all=false)
62
+ if [method_name.to_s, client.Field.name_to_id(method_name)].any? {|k| attrs.key?(k)}
63
+ true
64
+ else
65
+ super(method_name)
66
+ end
67
+ end
68
+
69
+ def method_missing(method_name, *args, &block)
70
+ if attrs.keys.include?(method_name.to_s)
71
+ attrs[method_name.to_s]
72
+ else
73
+ official_name=client.Field.name_to_id(method_name)
74
+ if attrs.keys.include?(official_name)
75
+ attrs[official_name]
76
+ else
77
+ super(method_name, *args, &block)
78
+ end
79
+ end
80
+ end
81
+ end
9
82
  end
10
83
  end
@@ -51,7 +51,7 @@ module JIRA
51
51
  def self.jql(client, jql, options = {fields: nil, start_at: nil, max_results: nil, expand: nil})
52
52
  url = client.options[:rest_base_path] + "/search?jql=" + CGI.escape(jql)
53
53
 
54
- url << "&fields=#{options[:fields].map{ |value| CGI.escape(value.to_s) }.join(',')}" if options[:fields]
54
+ url << "&fields=#{options[:fields].map{ |value| CGI.escape(client.Field.name_to_id(value)) }.join(',')}" if options[:fields]
55
55
  url << "&startAt=#{CGI.escape(options[:start_at].to_s)}" if options[:start_at]
56
56
  url << "&maxResults=#{CGI.escape(options[:max_results].to_s)}" if options[:max_results]
57
57
 
@@ -67,8 +67,16 @@ module JIRA
67
67
  end
68
68
  end
69
69
 
70
+ def editmeta
71
+ editmeta_url = client.options[:rest_base_path] + "/#{self.class.endpoint_name}/#{key}/editmeta"
72
+
73
+ response = client.get(editmeta_url)
74
+ json = self.class.parse_json(response.body)
75
+ json['fields']
76
+ end
77
+
70
78
  def respond_to?(method_name, include_all=false)
71
- if attrs.keys.include?('fields') && attrs['fields'].keys.include?(method_name.to_s)
79
+ if attrs.keys.include?('fields') && [method_name.to_s, client.Field.name_to_id(method_name)].any? {|k| attrs['fields'].key?(k)}
72
80
  true
73
81
  else
74
82
  super(method_name)
@@ -76,10 +84,19 @@ module JIRA
76
84
  end
77
85
 
78
86
  def method_missing(method_name, *args, &block)
79
- if attrs.keys.include?('fields') && attrs['fields'].keys.include?(method_name.to_s)
80
- attrs['fields'][method_name.to_s]
87
+ if attrs.keys.include?('fields')
88
+ if attrs['fields'].keys.include?(method_name.to_s)
89
+ attrs['fields'][method_name.to_s]
90
+ else
91
+ official_name=client.Field.name_to_id(method_name)
92
+ if attrs['fields'].keys.include?(official_name)
93
+ attrs['fields'][official_name]
94
+ else
95
+ super(method_name, *args, &block)
96
+ end
97
+ end
81
98
  else
82
- super(method_name)
99
+ super(method_name, *args, &block)
83
100
  end
84
101
  end
85
102
 
@@ -0,0 +1,40 @@
1
+ module JIRA
2
+ module Resource
3
+
4
+ class WebhookFactory < JIRA::BaseFactory # :nodoc:
5
+ end
6
+
7
+ class Webhook < JIRA::Base
8
+
9
+ REST_BASE_PATH = '/rest/webhooks/1.0/'
10
+
11
+ def self.endpoint_name
12
+ 'webhook'
13
+ end
14
+
15
+ def self.full_url(client)
16
+ client.options[:context_path] + REST_BASE_PATH
17
+ end
18
+
19
+ def self.collection_path(client, prefix = '/')
20
+ self.full_url(client) + prefix + self.endpoint_name
21
+ end
22
+
23
+ def self.all(client, options = {})
24
+ response = client.get(collection_path(client))
25
+ json = parse_json(response.body)
26
+ json.map do |attrs|
27
+ self.new(client, {:attrs => attrs}.merge(options))
28
+ end
29
+ end
30
+
31
+ # def self.save(options={})
32
+ # end
33
+
34
+ # def self.delete(options={})
35
+
36
+ # end
37
+
38
+ end
39
+ end
40
+ end
@@ -1,3 +1,3 @@
1
1
  module JIRA
2
- VERSION = "0.1.17"
2
+ VERSION = "0.1.18"
3
3
  end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ describe JIRA::Resource::Webhook do
4
+
5
+ with_each_client do |site_url, client|
6
+ let(:client) { client }
7
+ let(:site_url) { site_url }
8
+
9
+
10
+ let(:key) { "2" }
11
+
12
+ let(:expected_attributes) do
13
+ {"name"=>"from API", "url"=>"http://localhost:3000/webhooks/1", "excludeBody"=>false, "filters"=>{"issue-related-events-section"=>""}, "events"=>[], "enabled"=>true, "self"=>"http://localhost:2990/jira/rest/webhooks/1.0/webhook/2", "lastUpdatedUser"=>"admin", "lastUpdatedDisplayName"=>"admin", "lastUpdated"=>1453306520188}
14
+ end
15
+
16
+ let(:expected_collection_length) { 1 }
17
+
18
+ it_should_behave_like "a resource"
19
+ it_should_behave_like "a resource with a collection GET endpoint"
20
+ it_should_behave_like "a resource with a singular GET endpoint"
21
+
22
+
23
+
24
+ it "returns a collection of components" do
25
+
26
+ stub_request(:get, site_url + described_class.singular_path(client, key)).
27
+ to_return(:status => 200, :body => get_mock_response('webhook/webhook.json'))
28
+
29
+
30
+
31
+
32
+ end
33
+ end
34
+ end
@@ -427,9 +427,12 @@ describe JIRA::Base do
427
427
  end
428
428
 
429
429
  it "converts to json" do
430
- subject.attrs = {"foo" => "bar","dead" => "beef"}
431
-
430
+ subject.attrs = { 'foo' => 'bar', 'dead' => 'beef' }
432
431
  expect(subject.to_json).to eq(subject.attrs.to_json)
432
+
433
+ h = { 'key' => subject }
434
+ h_attrs = { 'key' => subject.attrs }
435
+ expect(h.to_json).to eq(h_attrs.to_json)
433
436
  end
434
437
 
435
438
  describe "extract attrs from response" do
@@ -0,0 +1,253 @@
1
+ require 'spec_helper'
2
+
3
+ describe JIRA::Resource::Createmeta do
4
+ let(:client) {
5
+ double(
6
+ 'client',
7
+ :options => {
8
+ :rest_base_path => '/jira/rest/api/2'
9
+ }
10
+ )
11
+ }
12
+
13
+ let(:response) {
14
+ double(
15
+ 'response',
16
+ :body => '{"expand":"projects","projects":[{"self":"http://localhost:2029/rest/api/2/project/TST"}]}'
17
+ )
18
+ }
19
+
20
+ describe 'general' do
21
+ it 'should query correct url without parameters' do
22
+ expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta').and_return(response)
23
+ JIRA::Resource::Createmeta.all(client)
24
+ end
25
+
26
+ it 'should query correct url with `expand` parameter' do
27
+ expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?expand=projects.issuetypes.fields').and_return(response)
28
+ JIRA::Resource::Createmeta.all(client, :expand => 'projects.issuetypes.fields')
29
+ end
30
+
31
+ it 'should query correct url with `foo` parameter' do
32
+ expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?foo=bar').and_return(response)
33
+ JIRA::Resource::Createmeta.all(client, :foo => 'bar')
34
+ end
35
+
36
+ end
37
+
38
+
39
+ describe 'projectKeys' do
40
+ it 'should query correct url when only one `projectKeys` given as string' do
41
+ expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?projectKeys=PROJECT_1').and_return(response)
42
+ JIRA::Resource::Createmeta.all(
43
+ client,
44
+ :projectKeys => 'PROJECT_1',
45
+ )
46
+ end
47
+
48
+ it 'should query correct url when multiple `projectKeys` given as string' do
49
+ expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?projectKeys=PROJECT_1%2CPROJECT_2').and_return(response)
50
+ JIRA::Resource::Createmeta.all(
51
+ client,
52
+ :projectKeys => ['PROJECT_1', 'PROJECT_2'],
53
+ )
54
+ end
55
+
56
+ it 'should query correct url when only one `projectKeys` given as Project' do
57
+ prj = JIRA::Resource::Project.new(client)
58
+ allow(prj).to receive(:key).and_return('PRJ')
59
+
60
+ expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?projectKeys=PRJ').and_return(response)
61
+ JIRA::Resource::Createmeta.all(
62
+ client,
63
+ :projectKeys => prj,
64
+ )
65
+ end
66
+
67
+ it 'should query correct url when multiple `projectKeys` given as Project' do
68
+ prj_1 = JIRA::Resource::Project.new(client)
69
+ allow(prj_1).to receive(:key).and_return('PRJ_1')
70
+ prj_2 = JIRA::Resource::Project.new(client)
71
+ allow(prj_2).to receive(:key).and_return('PRJ_2')
72
+
73
+ expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?projectKeys=PRJ_2%2CPRJ_1').and_return(response)
74
+ JIRA::Resource::Createmeta.all(
75
+ client,
76
+ :projectKeys => [prj_2, prj_1],
77
+ )
78
+ end
79
+
80
+ it 'should query correct url when multiple `projectKeys` given as different types' do
81
+ prj_5 = JIRA::Resource::Project.new(client)
82
+ allow(prj_5).to receive(:key).and_return('PRJ_5')
83
+
84
+ expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?projectKeys=PROJECT_1%2CPRJ_5').and_return(response)
85
+ JIRA::Resource::Createmeta.all(
86
+ client,
87
+ :projectKeys => ['PROJECT_1', prj_5],
88
+ )
89
+ end
90
+ end
91
+
92
+
93
+ describe 'projectIds' do
94
+ it 'should query correct url when only one `projectIds` given as string' do
95
+ expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?projectIds=10101').and_return(response)
96
+ JIRA::Resource::Createmeta.all(
97
+ client,
98
+ :projectIds => '10101',
99
+ )
100
+ end
101
+
102
+ it 'should query correct url when multiple `projectIds` given as string' do
103
+ expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?projectIds=10101%2C20202').and_return(response)
104
+ JIRA::Resource::Createmeta.all(
105
+ client,
106
+ :projectIds => ['10101', '20202'],
107
+ )
108
+ end
109
+
110
+ it 'should query correct url when only one `projectIds` given as Project' do
111
+ prj = JIRA::Resource::Project.new(client)
112
+ allow(prj).to receive(:id).and_return('30303')
113
+
114
+ expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?projectIds=30303').and_return(response)
115
+ JIRA::Resource::Createmeta.all(
116
+ client,
117
+ :projectIds => prj,
118
+ )
119
+ end
120
+
121
+ it 'should query correct url when multiple `projectIds` given as Project' do
122
+ prj_1 = JIRA::Resource::Project.new(client)
123
+ allow(prj_1).to receive(:id).and_return('30303')
124
+ prj_2 = JIRA::Resource::Project.new(client)
125
+ allow(prj_2).to receive(:id).and_return('50505')
126
+
127
+ expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?projectIds=50505%2C30303').and_return(response)
128
+ JIRA::Resource::Createmeta.all(
129
+ client,
130
+ :projectIds => [prj_2, prj_1],
131
+ )
132
+ end
133
+
134
+ it 'should query correct url when multiple `projectIds` given as different types' do
135
+ prj_5 = JIRA::Resource::Project.new(client)
136
+ allow(prj_5).to receive(:id).and_return('60606')
137
+
138
+ expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?projectIds=10101%2C60606').and_return(response)
139
+ JIRA::Resource::Createmeta.all(
140
+ client,
141
+ :projectIds => ['10101', prj_5],
142
+ )
143
+ end
144
+ end
145
+
146
+
147
+ describe 'issuetypeNames' do
148
+ it 'should query correct url when only one `issuetypeNames` given as string' do
149
+ expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?issuetypeNames=Feature').and_return(response)
150
+ JIRA::Resource::Createmeta.all(
151
+ client,
152
+ :issuetypeNames => 'Feature',
153
+ )
154
+ end
155
+
156
+ it 'should query correct url when multiple `issuetypeNames` given as string' do
157
+ expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?issuetypeNames=Feature%2CBug').and_return(response)
158
+ JIRA::Resource::Createmeta.all(
159
+ client,
160
+ :issuetypeNames => ['Feature', 'Bug'],
161
+ )
162
+ end
163
+
164
+ it 'should query correct url when only one `issuetypeNames` given as Issuetype' do
165
+ issue_type = JIRA::Resource::Issuetype.new(client)
166
+ allow(issue_type).to receive(:name).and_return('Epic')
167
+
168
+ expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?issuetypeNames=Epic').and_return(response)
169
+ JIRA::Resource::Createmeta.all(
170
+ client,
171
+ :issuetypeNames => issue_type,
172
+ )
173
+ end
174
+
175
+ it 'should query correct url when multiple `issuetypeNames` given as Issuetype' do
176
+ issue_type_1 = JIRA::Resource::Issuetype.new(client)
177
+ allow(issue_type_1).to receive(:name).and_return('Epic')
178
+ issue_type_2 = JIRA::Resource::Issuetype.new(client)
179
+ allow(issue_type_2).to receive(:name).and_return('Sub-Task')
180
+
181
+ expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?issuetypeNames=Sub-Task%2CEpic').and_return(response)
182
+ JIRA::Resource::Createmeta.all(
183
+ client,
184
+ :issuetypeNames => [issue_type_2, issue_type_1],
185
+ )
186
+ end
187
+
188
+ it 'should query correct url when multiple `issuetypeNames` given as different types' do
189
+ issue_type = JIRA::Resource::Issuetype.new(client)
190
+ allow(issue_type).to receive(:name).and_return('Epic')
191
+
192
+ expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?issuetypeNames=Feature%2CEpic').and_return(response)
193
+ JIRA::Resource::Createmeta.all(
194
+ client,
195
+ :issuetypeNames => ['Feature', issue_type],
196
+ )
197
+ end
198
+ end
199
+
200
+
201
+ describe 'issuetypeIds' do
202
+ it 'should query correct url when only one `issuetypeIds` given as string' do
203
+ expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?issuetypeIds=10101').and_return(response)
204
+ JIRA::Resource::Createmeta.all(
205
+ client,
206
+ :issuetypeIds => '10101',
207
+ )
208
+ end
209
+
210
+ it 'should query correct url when multiple `issuetypeIds` given as string' do
211
+ expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?issuetypeIds=10101%2C20202').and_return(response)
212
+ JIRA::Resource::Createmeta.all(
213
+ client,
214
+ :issuetypeIds => ['10101', '20202'],
215
+ )
216
+ end
217
+
218
+ it 'should query correct url when only one `issuetypeIds` given as Issuetype' do
219
+ issue_type = JIRA::Resource::Issuetype.new(client)
220
+ allow(issue_type).to receive(:id).and_return('30303')
221
+
222
+ expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?issuetypeIds=30303').and_return(response)
223
+ JIRA::Resource::Createmeta.all(
224
+ client,
225
+ :issuetypeIds => issue_type,
226
+ )
227
+ end
228
+
229
+ it 'should query correct url when multiple `issuetypeIds` given as Issuetype' do
230
+ issue_type_1 = JIRA::Resource::Issuetype.new(client)
231
+ allow(issue_type_1).to receive(:id).and_return('30303')
232
+ issue_type_2 = JIRA::Resource::Issuetype.new(client)
233
+ allow(issue_type_2).to receive(:id).and_return('50505')
234
+
235
+ expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?issuetypeIds=50505%2C30303').and_return(response)
236
+ JIRA::Resource::Createmeta.all(
237
+ client,
238
+ :issuetypeIds => [issue_type_2, issue_type_1],
239
+ )
240
+ end
241
+
242
+ it 'should query correct url when multiple `issuetypeIds` given as different types' do
243
+ issue_type = JIRA::Resource::Issuetype.new(client)
244
+ allow(issue_type).to receive(:id).and_return('30303')
245
+
246
+ expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?issuetypeIds=10101%2C30303').and_return(response)
247
+ JIRA::Resource::Createmeta.all(
248
+ client,
249
+ :issuetypeIds => ['10101', issue_type],
250
+ )
251
+ end
252
+ end
253
+ end
@@ -0,0 +1,132 @@
1
+ require 'spec_helper'
2
+
3
+ describe JIRA::Resource::Field do
4
+
5
+ let(:cache) { OpenStruct.new }
6
+
7
+ let(:client) do
8
+ client = double(options: {rest_base_path: '/jira/rest/api/2'} )
9
+ field = JIRA::Resource::FieldFactory.new(client)
10
+ allow(client).to receive(:Field).and_return(field)
11
+ allow(client).to receive(:cache).and_return(cache)
12
+ # info about all fields on the client
13
+ allow(client.Field).to receive(:all).and_return([
14
+ JIRA::Resource::Field.new(client, :attrs => {'id' =>"customfield_10666", "name" => "Priority", "custom" => true, "orderable" => true, "navigable" => true, "searchable" => true, "clauseNames" => ["cf[10666]","Priority"], "schema" =>{"type" => "string", "custom" => "com.atlassian.jira.plugin.system.customfieldtypes:select","customId" => 10666}}),
15
+ JIRA::Resource::Field.new(client, :attrs => {'id' =>"issuekey", "name" => "Key", "custom" => false, "orderable" => false, "navigable" => true, "searchable" => false, "clauseNames" => ["id","issue","issuekey","key"]}),
16
+ JIRA::Resource::Field.new(client, :attrs => {"id" =>"priority", "name" => "Priority", "custom" => false, "orderable" => true, "navigable" => true, "searchable" => true, "clauseNames" => ["priority"], "schema" =>{"type" => "priority", "system" => "priority"}}),
17
+ JIRA::Resource::Field.new(client, :attrs => {'id' =>"summary", "name" => "Summary", "custom" => false, "orderable" => true, "navigable" => true, "searchable" => true, "clauseNames" => ["summary"], "schema" =>{"type" => "string", "system" => "summary"}}),
18
+ JIRA::Resource::Field.new(client, :attrs => {'id' =>"issuetype", "name" => "Issue Type", "custom" => false, "orderable" => true, "navigable" => true, "searchable" => true, "clauseNames" => ["issuetype","type"], "schema" =>{"type" => "issuetype", "system" => "issuetype"}}),
19
+ JIRA::Resource::Field.new(client, :attrs => {'id' =>"customfield_10111", "name" => "SingleWord", "custom" => true, "orderable" => true, "navigable" => true, "searchable" => true, "clauseNames" => ["cf[10111]","SingleWord"], "schema" =>{"type" => "string", "custom" => "com.atlassian.jira.plugin.system.customfieldtypes:select","customId" => 10111}}),
20
+ JIRA::Resource::Field.new(client, :attrs => {'id' =>"customfield_10222", "name" => "Multi Word", "custom" => true, "orderable" => true, "navigable" => true, "searchable" => true, "clauseNames" => ["cf[10222]","Multi Word"], "schema" =>{"type" => "string", "custom" => "com.atlassian.jira.plugin.system.customfieldtypes:select","customId" => 10222}}),
21
+ JIRA::Resource::Field.new(client, :attrs => {'id' =>"customfield_10333", "name" => "Why/N@t", "custom" => true, "orderable" => true, "navigable" => true, "searchable" => true, "clauseNames" => ["cf[10333]","Why/N@t"], "schema" =>{"type" => "string", "custom" => "com.atlassian.jira.plugin.system.customfieldtypes:select","customId" => 10333}}),
22
+ JIRA::Resource::Field.new(client, :attrs => {'id' =>"customfield_10444", "name" => "SingleWord", "custom" => true, "orderable" => true, "navigable" => true, "searchable" => true, "clauseNames" => ["cf[10444]","SingleWord"], "schema" =>{"type" => "string", "custom" => "com.atlassian.jira.plugin.system.customfieldtypes:select","customId" => 10444}})
23
+ ])
24
+ client
25
+ end
26
+
27
+ describe "field_mappings" do
28
+
29
+ shared_context "mapped or not" do
30
+
31
+ subject {
32
+ JIRA::Resource::Field.new(client, :attrs => {
33
+ 'priority' => 1,
34
+ 'customfield_10111' => 'data_in_custom_field',
35
+ 'customfield_10222' => 'multi word custom name',
36
+ 'customfield_10333' => 'complex custom name',
37
+ 'customfield_10444' => 'duplicated custom name',
38
+ 'customfield_10666' => 'duplicate of a system name',
39
+ })
40
+ }
41
+
42
+ it "can find a standard field by id" do
43
+ expect(subject.priority).to eq(1)
44
+ end
45
+
46
+ it "can find a custom field by customfield_##### name" do
47
+ expect(subject.customfield_10111).to eq('data_in_custom_field')
48
+ end
49
+
50
+ it "is not confused by common attribute keys" do
51
+ expect{subject.name}.to raise_error(NoMethodError)
52
+ expect{subject.custom}.to raise_error(NoMethodError)
53
+ expect(subject.id).to eq(nil) # picks up ID from the parent -
54
+ end
55
+ end
56
+
57
+ context "before fields are mapped" do
58
+
59
+ include_context "mapped or not"
60
+
61
+ it "can find a standard field by id" do
62
+ expect(subject.priority).to eq(1)
63
+ end
64
+
65
+ it "cannot find a standard field by name before mapping" do
66
+ expect{subject.Priority}.to raise_error(NoMethodError)
67
+ end
68
+
69
+ it "can find a custom field by customfield_##### name" do
70
+ expect(subject.customfield_10111).to eq('data_in_custom_field')
71
+ end
72
+
73
+ it "cannot find a mapped field before mapping and raises error" do
74
+ expect{subject.SingleWork}.to raise_error(NoMethodError)
75
+ end
76
+
77
+ it "is not confused by common attribute keys and raises error" do
78
+ expect{subject.name}.to raise_error(NoMethodError)
79
+ expect{subject.custom}.to raise_error(NoMethodError)
80
+ expect(subject.id).to eq(nil) # picks up ID from the parent -
81
+ end
82
+ end
83
+
84
+ context "after fields are mapped" do
85
+
86
+ before do
87
+ silence_stream(STDERR) do
88
+ expect(client.Field.map_fields.class).to eq(Hash)
89
+ end
90
+ end
91
+
92
+ include_context "mapped or not"
93
+
94
+ it "warns of duplicate fields" do
95
+ expect{client.Field.map_fields}.to output(/renaming as Priority_10666/).to_stderr
96
+ expect{client.Field.map_fields}.to output(/renaming as SingleWord_10444/).to_stderr
97
+ end
98
+
99
+ it "can find a mapped field after mapping and returns results" do
100
+ expect{subject.SingleWord}.to_not raise_error
101
+ expect(subject.SingleWord).to eq subject.customfield_10111
102
+ end
103
+
104
+ it "handles duplicate names in a safe fashion" do
105
+ expect{subject.Multi_Word}.to_not raise_error
106
+ expect(subject.Multi_Word).to eq subject.customfield_10222
107
+ end
108
+
109
+ it "handles special characters in a safe fashion" do
110
+ expect{subject.Why_N_t}.to_not raise_error
111
+ expect(subject.Why_N_t).to eq subject.customfield_10333
112
+ end
113
+
114
+ it "handles duplicates in custom names" do
115
+ expect{subject.SingleWord_10444}.to_not raise_error
116
+ expect(subject.SingleWord_10444).to eq subject.customfield_10444
117
+ end
118
+
119
+ it "keeps custom names from overwriting system names" do
120
+ #expect(client.Field.map_fields.class).to eq(Hash)
121
+ expect{subject.Priority_10666}.to_not raise_error
122
+ expect(subject.Priority_10666).to eq subject.customfield_10666
123
+ end
124
+
125
+ it "can find a standard field by an expanded name" do
126
+ #expect(client.Field.map_fields.class).to eq(Hash)
127
+ expect(subject.priority).to eq(1)
128
+ expect(subject.Priority).to eq(1)
129
+ end
130
+ end
131
+ end
132
+ end
@@ -5,7 +5,12 @@ describe JIRA::Resource::Issue do
5
5
  class JIRAResourceDelegation < SimpleDelegator # :nodoc:
6
6
  end
7
7
 
8
- let(:client) { double(options: {rest_base_path: '/jira/rest/api/2'}) }
8
+ let(:client) do
9
+ client = double(options: {rest_base_path: '/jira/rest/api/2'} )
10
+ allow(client).to receive(:Field).and_return(JIRA::Resource::FieldFactory.new(client))
11
+ allow(client).to receive(:cache).and_return(OpenStruct.new)
12
+ client
13
+ end
9
14
 
10
15
  describe "#respond_to?" do
11
16
  describe "when decorated by SimpleDelegator" do
@@ -128,6 +133,21 @@ describe JIRA::Resource::Issue do
128
133
  expect(JIRA::Resource::Issue.jql(client,'foo bar', expand: %w(transitions))).to eq([''])
129
134
  end
130
135
 
136
+ it 'should return meta data available for editing an issue' do
137
+ subject = JIRA::Resource::Issue.new(client, :attrs => {'fields' => {'key' =>'TST=123'}})
138
+ response = double()
139
+
140
+ allow(response).to receive(:body).and_return(
141
+ '{"fields":{"summary":{"required":true,"name":"Summary","operations":["set"]}}}'
142
+ )
143
+ expect(client).to receive(:get)
144
+ .with('/jira/rest/api/2/issue/TST=123/editmeta')
145
+ .and_return(response)
146
+
147
+ expect(subject.editmeta).to eq({'summary' => {'required' => true, 'name' => 'Summary', 'operations' => ['set']}})
148
+ end
149
+
150
+
131
151
  it "provides direct accessors to the fields" do
132
152
  subject = JIRA::Resource::Issue.new(client, :attrs => {'fields' => {'foo' =>'bar'}})
133
153
  expect(subject).to respond_to(:foo)
@@ -0,0 +1,11 @@
1
+ [{"name":"from API",
2
+ "url":"http://localhost:3000/webhooks/1",
3
+ "excludeBody":false,
4
+ "filters":{"issue-related-events-section":""},
5
+ "events":[],
6
+ "enabled":true,
7
+ "self":"http://localhost:2990/jira/rest/webhooks/1.0/webhook/2",
8
+ "lastUpdatedUser":"admin",
9
+ "lastUpdatedDisplayName":"admin",
10
+ "lastUpdated":1453306520188
11
+ }]
@@ -0,0 +1,11 @@
1
+ {"name":"from API",
2
+ "url":"http://localhost:3000/webhooks/1",
3
+ "excludeBody":false,
4
+ "filters":{"issue-related-events-section":""},
5
+ "events":[],
6
+ "enabled":true,
7
+ "self":"http://localhost:2990/jira/rest/webhooks/1.0/webhook/2",
8
+ "lastUpdatedUser":"admin",
9
+ "lastUpdatedDisplayName":"admin",
10
+ "lastUpdated":1453306520188
11
+ }
@@ -0,0 +1,11 @@
1
+ [{"name":"from API",
2
+ "url":"http://localhost:3000/webhooks/1",
3
+ "excludeBody":false,
4
+ "filters":{"issue-related-events-section":""},
5
+ "events":[],
6
+ "enabled":true,
7
+ "self":"http://localhost:2990/jira/rest/webhooks/1.0/webhook/2",
8
+ "lastUpdatedUser":"admin",
9
+ "lastUpdatedDisplayName":"admin",
10
+ "lastUpdated":1453306520188}
11
+ ]
@@ -0,0 +1,11 @@
1
+ {"name":"from API",
2
+ "url":"http://localhost:3000/webhooks/1",
3
+ "excludeBody":false,
4
+ "filters":{"issue-related-events-section":""},
5
+ "events":[],
6
+ "enabled":true,
7
+ "self":"http://localhost:2990/jira/rest/webhooks/1.0/webhook/2",
8
+ "lastUpdatedUser":"admin",
9
+ "lastUpdatedDisplayName":"admin",
10
+ "lastUpdated":1453306520188
11
+ }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jira-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.17
4
+ version: 0.1.18
5
5
  platform: ruby
6
6
  authors:
7
7
  - SUMO Heavy Industries
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-28 00:00:00.000000000 Z
11
+ date: 2016-04-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties
@@ -103,6 +103,7 @@ files:
103
103
  - ".gitignore"
104
104
  - ".travis.yml"
105
105
  - Gemfile
106
+ - Guardfile
106
107
  - LICENSE.txt
107
108
  - README.rdoc
108
109
  - Rakefile
@@ -123,6 +124,7 @@ files:
123
124
  - lib/jira/resource/attachment.rb
124
125
  - lib/jira/resource/comment.rb
125
126
  - lib/jira/resource/component.rb
127
+ - lib/jira/resource/createmeta.rb
126
128
  - lib/jira/resource/field.rb
127
129
  - lib/jira/resource/filter.rb
128
130
  - lib/jira/resource/issue.rb
@@ -138,6 +140,7 @@ files:
138
140
  - lib/jira/resource/transition.rb
139
141
  - lib/jira/resource/user.rb
140
142
  - lib/jira/resource/version.rb
143
+ - lib/jira/resource/webhook.rb
141
144
  - lib/jira/resource/worklog.rb
142
145
  - lib/jira/tasks.rb
143
146
  - lib/jira/version.rb
@@ -156,6 +159,7 @@ files:
156
159
  - spec/integration/transition_spec.rb
157
160
  - spec/integration/user_spec.rb
158
161
  - spec/integration/version_spec.rb
162
+ - spec/integration/webhook.rb
159
163
  - spec/integration/worklog_spec.rb
160
164
  - spec/jira/base_factory_spec.rb
161
165
  - spec/jira/base_spec.rb
@@ -166,6 +170,8 @@ files:
166
170
  - spec/jira/oauth_client_spec.rb
167
171
  - spec/jira/request_client_spec.rb
168
172
  - spec/jira/resource/attachment_spec.rb
173
+ - spec/jira/resource/createmeta_spec.rb
174
+ - spec/jira/resource/field_spec.rb
169
175
  - spec/jira/resource/filter_spec.rb
170
176
  - spec/jira/resource/issue_spec.rb
171
177
  - spec/jira/resource/issuelink_spec.rb
@@ -198,6 +204,8 @@ files:
198
204
  - spec/mock_responses/issueLinkType/10000.json
199
205
  - spec/mock_responses/issuetype.json
200
206
  - spec/mock_responses/issuetype/5.json
207
+ - spec/mock_responses/jira/rest/webhooks/1.0/webhook.json
208
+ - spec/mock_responses/jira/rest/webhooks/1.0/webhook/2.json
201
209
  - spec/mock_responses/priority.json
202
210
  - spec/mock_responses/priority/1.json
203
211
  - spec/mock_responses/project.json
@@ -214,6 +222,8 @@ files:
214
222
  - spec/mock_responses/version/10000.invalid.put.json
215
223
  - spec/mock_responses/version/10000.json
216
224
  - spec/mock_responses/version/10000.put.json
225
+ - spec/mock_responses/webhook.json
226
+ - spec/mock_responses/webhook/webhook.json
217
227
  - spec/spec_helper.rb
218
228
  - spec/support/clients_helper.rb
219
229
  - spec/support/matchers/have_attributes.rb
@@ -259,6 +269,7 @@ test_files:
259
269
  - spec/integration/transition_spec.rb
260
270
  - spec/integration/user_spec.rb
261
271
  - spec/integration/version_spec.rb
272
+ - spec/integration/webhook.rb
262
273
  - spec/integration/worklog_spec.rb
263
274
  - spec/jira/base_factory_spec.rb
264
275
  - spec/jira/base_spec.rb
@@ -269,6 +280,8 @@ test_files:
269
280
  - spec/jira/oauth_client_spec.rb
270
281
  - spec/jira/request_client_spec.rb
271
282
  - spec/jira/resource/attachment_spec.rb
283
+ - spec/jira/resource/createmeta_spec.rb
284
+ - spec/jira/resource/field_spec.rb
272
285
  - spec/jira/resource/filter_spec.rb
273
286
  - spec/jira/resource/issue_spec.rb
274
287
  - spec/jira/resource/issuelink_spec.rb
@@ -301,6 +314,8 @@ test_files:
301
314
  - spec/mock_responses/issueLinkType/10000.json
302
315
  - spec/mock_responses/issuetype.json
303
316
  - spec/mock_responses/issuetype/5.json
317
+ - spec/mock_responses/jira/rest/webhooks/1.0/webhook.json
318
+ - spec/mock_responses/jira/rest/webhooks/1.0/webhook/2.json
304
319
  - spec/mock_responses/priority.json
305
320
  - spec/mock_responses/priority/1.json
306
321
  - spec/mock_responses/project.json
@@ -317,6 +332,8 @@ test_files:
317
332
  - spec/mock_responses/version/10000.invalid.put.json
318
333
  - spec/mock_responses/version/10000.json
319
334
  - spec/mock_responses/version/10000.put.json
335
+ - spec/mock_responses/webhook.json
336
+ - spec/mock_responses/webhook/webhook.json
320
337
  - spec/spec_helper.rb
321
338
  - spec/support/clients_helper.rb
322
339
  - spec/support/matchers/have_attributes.rb