jira-ruby 1.3.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/example.rb +5 -0
- data/jira-ruby.gemspec +1 -0
- data/lib/jira-ruby.rb +1 -0
- data/lib/jira/base.rb +2 -2
- data/lib/jira/base_factory.rb +1 -1
- data/lib/jira/client.rb +4 -0
- data/lib/jira/resource/agile.rb +10 -0
- data/lib/jira/resource/issue.rb +3 -0
- data/lib/jira/resource/sprint.rb +2 -1
- data/lib/jira/resource/watcher.rb +32 -0
- data/lib/jira/version.rb +1 -1
- data/spec/integration/watcher_spec.rb +59 -0
- data/spec/jira/base_spec.rb +0 -1
- data/spec/jira/resource/agile_spec.rb +57 -1
- data/spec/mock_responses/board/1_issues.json +62 -0
- data/spec/mock_responses/issue/10002/watchers.json +13 -0
- metadata +11 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d500867486cb6b1bd336052a0ecfc8d7074a91e0
|
4
|
+
data.tar.gz: fe5e8f0fea4235def463b9224b20d354769d1f33
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bb6a109900b2d8b7a39e5f2ce07820e4414dd3ade3e34e90054d739eb27c88b96c494ccd2c7240a777fd01dba39e7ce5ff5e3e7602b91bc586772bf42dd046d1
|
7
|
+
data.tar.gz: d7e408d142019a4c92dbf801caf132929750d81692fd94a05fbd3053165affc1cba6dc50785cabe8ca0450216bf77d35cffac57b90ce07fcfc0ef324550c7a67
|
data/example.rb
CHANGED
@@ -123,6 +123,11 @@ client.Issue.jql(a_normal_jql_search, max_results: 500)
|
|
123
123
|
# user = client.User.find('admin')
|
124
124
|
# pp user
|
125
125
|
#
|
126
|
+
# # Get all issue watchers
|
127
|
+
# # ----------------------
|
128
|
+
# issue = client.Issue.find("10002")
|
129
|
+
# watchers = issue.watchers.all
|
130
|
+
# watchers = client.Watcher.all(:issue => issue)
|
126
131
|
# # Get all issue types
|
127
132
|
# # -------------------
|
128
133
|
# issuetypes = client.Issuetype.all
|
data/jira-ruby.gemspec
CHANGED
@@ -10,6 +10,7 @@ Gem::Specification.new do |s|
|
|
10
10
|
s.summary = %q{Ruby Gem for use with the Atlassian JIRA REST API}
|
11
11
|
s.description = %q{API for JIRA}
|
12
12
|
s.licenses = ['MIT']
|
13
|
+
s.metadata = { 'source_code_uri' => 'https://github.com/sumoheavy/jira-ruby' }
|
13
14
|
|
14
15
|
s.required_ruby_version = '>= 1.9.3'
|
15
16
|
|
data/lib/jira-ruby.rb
CHANGED
data/lib/jira/base.rb
CHANGED
@@ -428,8 +428,8 @@ module JIRA
|
|
428
428
|
end
|
429
429
|
end
|
430
430
|
if @attrs['self']
|
431
|
-
the_url = @attrs['self']
|
432
|
-
the_url =
|
431
|
+
the_url = @attrs['self']
|
432
|
+
the_url = the_url.sub(@client.options[:site], '') if @client.options[:site]
|
433
433
|
the_url
|
434
434
|
elsif key_value
|
435
435
|
self.class.singular_path(client, key_value.to_s, prefix)
|
data/lib/jira/base_factory.rb
CHANGED
@@ -38,7 +38,7 @@ module JIRA
|
|
38
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
|
-
delegate_to_target_class :all, :find, :collection_path, :singular_path, :jql, :get_backlog_issues, :get_sprints, :get_sprint_issues, :get_projects, :get_projects_full
|
41
|
+
delegate_to_target_class :all, :find, :collection_path, :singular_path, :jql, :get_backlog_issues, :get_board_issues, :get_sprints, :get_sprint_issues, :get_projects, :get_projects_full
|
42
42
|
|
43
43
|
# This method needs special handling as it has a default argument value
|
44
44
|
def build(attrs={})
|
data/lib/jira/client.rb
CHANGED
data/lib/jira/resource/agile.rb
CHANGED
@@ -19,6 +19,16 @@ module JIRA
|
|
19
19
|
parse_json(response.body)
|
20
20
|
end
|
21
21
|
|
22
|
+
def self.get_board_issues(client, board_id, options = {})
|
23
|
+
response = client.get(path_base(client) + "/board/#{board_id}/issue?#{hash_to_query_string(options)}")
|
24
|
+
json = parse_json(response.body)
|
25
|
+
# To get Issue objects with the same structure as for Issue.all
|
26
|
+
issue_ids = json['issues'].map { |issue|
|
27
|
+
issue['id']
|
28
|
+
}
|
29
|
+
client.Issue.jql("id IN(#{issue_ids.join(', ')})")
|
30
|
+
end
|
31
|
+
|
22
32
|
def self.get_sprints(client, board_id, options = {})
|
23
33
|
options[:maxResults] ||= 100
|
24
34
|
response = client.get(path_base(client) + "/board/#{board_id}/sprint?#{hash_to_query_string(options)}")
|
data/lib/jira/resource/issue.rb
CHANGED
@@ -39,6 +39,9 @@ module JIRA
|
|
39
39
|
|
40
40
|
has_many :remotelink, :class => JIRA::Resource::Remotelink
|
41
41
|
|
42
|
+
has_many :watchers, :attribute_key => 'watches',
|
43
|
+
:nested_under => ['fields', 'watches']
|
44
|
+
|
42
45
|
def self.all(client)
|
43
46
|
url = client.options[:rest_base_path] + "/search?expand=transitions.fields"
|
44
47
|
response = client.get(url)
|
data/lib/jira/resource/sprint.rb
CHANGED
@@ -15,8 +15,9 @@ module JIRA
|
|
15
15
|
|
16
16
|
def self.find(client, key, options = {})
|
17
17
|
options[:maxResults] ||= 100
|
18
|
+
options[:startAt] ||= 0
|
18
19
|
fields = options[:fields].join(',') unless options[:fields].nil?
|
19
|
-
response = client.get("/rest/api/latest/search?jql=sprint=#{key}&fields=#{fields}&maxResults=#{options[:maxResults]}")
|
20
|
+
response = client.get("/rest/api/latest/search?jql=sprint=#{key}&fields=#{fields}&startAt=#{options[:startAt]}&maxResults=#{options[:maxResults]}")
|
20
21
|
parse_json(response.body)
|
21
22
|
end
|
22
23
|
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module JIRA
|
2
|
+
module Resource
|
3
|
+
|
4
|
+
class WatcherFactory < JIRA::BaseFactory # :nodoc:
|
5
|
+
end
|
6
|
+
|
7
|
+
class Watcher < JIRA::Base
|
8
|
+
belongs_to :issue
|
9
|
+
|
10
|
+
nested_collections true
|
11
|
+
|
12
|
+
def self.endpoint_name
|
13
|
+
'watchers'
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.all(client, options = {})
|
17
|
+
issue = options[:issue]
|
18
|
+
unless issue
|
19
|
+
raise ArgumentError.new("parent issue is required")
|
20
|
+
end
|
21
|
+
|
22
|
+
path = "#{issue.self}/#{endpoint_name}"
|
23
|
+
response = client.get(path)
|
24
|
+
json = parse_json(response.body)
|
25
|
+
json['watchers'].map do |watcher|
|
26
|
+
issue.watchers.build(watcher)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
data/lib/jira/version.rb
CHANGED
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe JIRA::Resource::Watcher do
|
4
|
+
|
5
|
+
with_each_client do |site_url, client|
|
6
|
+
let(:client) { client }
|
7
|
+
let(:site_url) { site_url }
|
8
|
+
|
9
|
+
|
10
|
+
let(:target) { JIRA::Resource::Watcher.new(client, :attrs => {'id' => '99999'}, :issue_id => '10002') }
|
11
|
+
|
12
|
+
let(:belongs_to) {
|
13
|
+
JIRA::Resource::Issue.new(client, :attrs => {
|
14
|
+
'id' => '10002',
|
15
|
+
'fields' => {
|
16
|
+
'comment' => {'comments' => []}
|
17
|
+
}
|
18
|
+
})
|
19
|
+
}
|
20
|
+
|
21
|
+
let(:expected_attributes) do
|
22
|
+
{
|
23
|
+
"self" => "http://localhost:2990/jira/rest/api/2/issue/10002/watchers",
|
24
|
+
"isWatching": false,
|
25
|
+
"watchCount": 1,
|
26
|
+
"watchers": [
|
27
|
+
{
|
28
|
+
"self": "http://www.example.com/jira/rest/api/2/user?username=admin",
|
29
|
+
"name": "admin",
|
30
|
+
"displayName": "admin",
|
31
|
+
"active": false
|
32
|
+
}
|
33
|
+
]
|
34
|
+
}
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "watchers" do
|
38
|
+
it "should returns all the watchers" do
|
39
|
+
|
40
|
+
stub_request(:get,
|
41
|
+
site_url + "/jira/rest/api/2/issue/10002").
|
42
|
+
to_return(:status => 200, :body => get_mock_response('issue/10002.json'))
|
43
|
+
|
44
|
+
stub_request(:get,
|
45
|
+
site_url + "/jira/rest/api/2/issue/10002/watchers").
|
46
|
+
to_return(:status => 200, :body => get_mock_response('issue/10002/watchers.json'))
|
47
|
+
|
48
|
+
issue = client.Issue.find("10002")
|
49
|
+
watchers = client.Watcher.all(options = {:issue => issue})
|
50
|
+
expect(watchers.length).to eq(1)
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
it_should_behave_like "a resource"
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
data/spec/jira/base_spec.rb
CHANGED
@@ -1,7 +1,11 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe JIRA::Resource::Agile do
|
4
|
-
let(:client)
|
4
|
+
let(:client) do
|
5
|
+
client = double(options: {rest_base_path: '/jira/rest/api/2', context_path: '/jira'})
|
6
|
+
allow(client).to receive(:Issue).and_return(JIRA::Resource::IssueFactory.new(client))
|
7
|
+
client
|
8
|
+
end
|
5
9
|
let(:response) { double }
|
6
10
|
|
7
11
|
describe '#all' do
|
@@ -22,6 +26,44 @@ describe JIRA::Resource::Agile do
|
|
22
26
|
end
|
23
27
|
end
|
24
28
|
|
29
|
+
describe '#get_board_issues' do
|
30
|
+
it 'should query correct url without parameters' do
|
31
|
+
expect(client).to receive(:get).with('/jira/rest/agile/1.0/board/1/issue?').and_return(response)
|
32
|
+
expect(response).to receive(:body).and_return(get_mock_response('board/1_issues.json'))
|
33
|
+
|
34
|
+
expect(client).to receive(:get).with('/jira/rest/api/2/search?jql=id+IN%2810546%2C+10547%2C+10556%2C+10557%2C+10558%2C+10559%2C+10600%2C+10601%2C+10604%29').and_return(response)
|
35
|
+
expect(response).to receive(:body).and_return(get_mock_response('board/1_issues.json'))
|
36
|
+
|
37
|
+
issues = JIRA::Resource::Agile.get_board_issues(client, 1)
|
38
|
+
expect(issues).to be_an(Array)
|
39
|
+
expect(issues.size).to eql(9)
|
40
|
+
|
41
|
+
issues.each do |issue|
|
42
|
+
expect(issue.class).to eq(JIRA::Resource::Issue)
|
43
|
+
expect(issue.expanded?).to be_falsey
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'should query correct url with parameters' do
|
49
|
+
expect(client).to receive(:get).with('/jira/rest/agile/1.0/board/1/issue?startAt=50').and_return(response)
|
50
|
+
expect(response).to receive(:body).and_return(get_mock_response('board/1_issues.json'))
|
51
|
+
|
52
|
+
expect(client).to receive(:get).with('/jira/rest/api/2/search?jql=id+IN%2810546%2C+10547%2C+10556%2C+10557%2C+10558%2C+10559%2C+10600%2C+10601%2C+10604%29').and_return(response)
|
53
|
+
expect(response).to receive(:body).and_return(get_mock_response('board/1_issues.json'))
|
54
|
+
|
55
|
+
issues = JIRA::Resource::Agile.get_board_issues(client, 1, startAt: 50)
|
56
|
+
expect(issues).to be_an(Array)
|
57
|
+
expect(issues.size).to eql(9)
|
58
|
+
|
59
|
+
issues.each do |issue|
|
60
|
+
expect(issue.class).to eq(JIRA::Resource::Issue)
|
61
|
+
expect(issue.expanded?).to be_falsey
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
25
67
|
describe '#get_sprints' do
|
26
68
|
it 'should query correct url without parameters' do
|
27
69
|
expect(client).to receive(:get).with('/jira/rest/agile/1.0/board/1/sprint?maxResults=100').and_return(response)
|
@@ -36,6 +78,20 @@ describe JIRA::Resource::Agile do
|
|
36
78
|
|
37
79
|
JIRA::Resource::Agile.get_sprints(client, 1, startAt: 50)
|
38
80
|
end
|
81
|
+
|
82
|
+
it 'should work with pagination starting at 0' do
|
83
|
+
expect(client).to receive(:get).with('/jira/rest/agile/1.0/board/1/sprint?maxResults=1&startAt=0').and_return(response)
|
84
|
+
expect(response).to receive(:body).and_return(get_mock_response('board/1.json'))
|
85
|
+
|
86
|
+
JIRA::Resource::Agile.get_sprints(client, 1, maxResults: 1, startAt: 0)
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'should work with pagination not starting at 0' do
|
90
|
+
expect(client).to receive(:get).with('/jira/rest/agile/1.0/board/1/sprint?maxResults=1&startAt=1').and_return(response)
|
91
|
+
expect(response).to receive(:body).and_return(get_mock_response('board/1.json'))
|
92
|
+
|
93
|
+
JIRA::Resource::Agile.get_sprints(client, 1, maxResults: 1, startAt: 1)
|
94
|
+
end
|
39
95
|
end
|
40
96
|
|
41
97
|
describe '#get_sprint_issues' do
|
@@ -0,0 +1,62 @@
|
|
1
|
+
{
|
2
|
+
"expand": "schema,names",
|
3
|
+
"startAt": 0,
|
4
|
+
"maxResults": 1000,
|
5
|
+
"total": 9,
|
6
|
+
"issues": [
|
7
|
+
{
|
8
|
+
"expand": "operations,versionedRepresentations,editmeta,changelog,renderedFields",
|
9
|
+
"id": "10546",
|
10
|
+
"self": "https://jira.example.com/rest/agile/1.0/issue/10546",
|
11
|
+
"key": "SBT-1"
|
12
|
+
},
|
13
|
+
{
|
14
|
+
"expand": "operations,versionedRepresentations,editmeta,changelog,renderedFields",
|
15
|
+
"id": "10547",
|
16
|
+
"self": "https://jira.example.com/rest/agile/1.0/issue/10547",
|
17
|
+
"key": "SBT-2"
|
18
|
+
},
|
19
|
+
{
|
20
|
+
"expand": "operations,versionedRepresentations,editmeta,changelog,renderedFields",
|
21
|
+
"id": "10556",
|
22
|
+
"self": "https://jira.example.com/rest/agile/1.0/issue/10556",
|
23
|
+
"key": "SBT-11"
|
24
|
+
},
|
25
|
+
{
|
26
|
+
"expand": "operations,versionedRepresentations,editmeta,changelog,renderedFields",
|
27
|
+
"id": "10557",
|
28
|
+
"self": "https://jira.example.com/rest/agile/1.0/issue/10557",
|
29
|
+
"key": "SBT-12"
|
30
|
+
},
|
31
|
+
{
|
32
|
+
"expand": "operations,versionedRepresentations,editmeta,changelog,renderedFields",
|
33
|
+
"id": "10558",
|
34
|
+
"self": "https://jira.example.com/rest/agile/1.0/issue/10558",
|
35
|
+
"key": "SBT-13"
|
36
|
+
},
|
37
|
+
{
|
38
|
+
"expand": "operations,versionedRepresentations,editmeta,changelog,renderedFields",
|
39
|
+
"id": "10559",
|
40
|
+
"self": "https://jira.example.com/rest/agile/1.0/issue/10559",
|
41
|
+
"key": "SBT-14"
|
42
|
+
},
|
43
|
+
{
|
44
|
+
"expand": "operations,versionedRepresentations,editmeta,changelog,renderedFields",
|
45
|
+
"id": "10600",
|
46
|
+
"self": "https://jira.example.com/rest/agile/1.0/issue/10600",
|
47
|
+
"key": "SBT-16"
|
48
|
+
},
|
49
|
+
{
|
50
|
+
"expand": "operations,versionedRepresentations,editmeta,changelog,renderedFields",
|
51
|
+
"id": "10601",
|
52
|
+
"self": "https://jira.example.com/rest/agile/1.0/issue/10601",
|
53
|
+
"key": "SBT-17"
|
54
|
+
},
|
55
|
+
{
|
56
|
+
"expand": "operations,versionedRepresentations,editmeta,changelog,renderedFields",
|
57
|
+
"id": "10604",
|
58
|
+
"self": "https://jira.example.com/rest/agile/1.0/issue/10604",
|
59
|
+
"key": "SBT-19"
|
60
|
+
}
|
61
|
+
]
|
62
|
+
}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
{
|
2
|
+
"self": "http://localhost:2990/jira/rest/api/2/issue/10002/watchers",
|
3
|
+
"isWatching": false,
|
4
|
+
"watchCount": 1,
|
5
|
+
"watchers": [
|
6
|
+
{
|
7
|
+
"self": "http://www.example.com/jira/rest/api/2/user?username=admin",
|
8
|
+
"name": "admin",
|
9
|
+
"displayName": "admin",
|
10
|
+
"active": false
|
11
|
+
}
|
12
|
+
]
|
13
|
+
}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jira-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- SUMO Heavy Industries
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-
|
12
|
+
date: 2017-08-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: oauth
|
@@ -243,6 +243,7 @@ files:
|
|
243
243
|
- lib/jira/resource/transition.rb
|
244
244
|
- lib/jira/resource/user.rb
|
245
245
|
- lib/jira/resource/version.rb
|
246
|
+
- lib/jira/resource/watcher.rb
|
246
247
|
- lib/jira/resource/webhook.rb
|
247
248
|
- lib/jira/resource/worklog.rb
|
248
249
|
- lib/jira/tasks.rb
|
@@ -263,6 +264,7 @@ files:
|
|
263
264
|
- spec/integration/transition_spec.rb
|
264
265
|
- spec/integration/user_spec.rb
|
265
266
|
- spec/integration/version_spec.rb
|
267
|
+
- spec/integration/watcher_spec.rb
|
266
268
|
- spec/integration/webhook.rb
|
267
269
|
- spec/integration/worklog_spec.rb
|
268
270
|
- spec/jira/base_factory_spec.rb
|
@@ -285,6 +287,7 @@ files:
|
|
285
287
|
- spec/jira/resource/user_factory_spec.rb
|
286
288
|
- spec/jira/resource/worklog_spec.rb
|
287
289
|
- spec/mock_responses/board/1.json
|
290
|
+
- spec/mock_responses/board/1_issues.json
|
288
291
|
- spec/mock_responses/component.post.json
|
289
292
|
- spec/mock_responses/component/10000.invalid.put.json
|
290
293
|
- spec/mock_responses/component/10000.json
|
@@ -303,6 +306,7 @@ files:
|
|
303
306
|
- spec/mock_responses/issue/10002/comment/10000.put.json
|
304
307
|
- spec/mock_responses/issue/10002/transitions.json
|
305
308
|
- spec/mock_responses/issue/10002/transitions.post.json
|
309
|
+
- spec/mock_responses/issue/10002/watchers.json
|
306
310
|
- spec/mock_responses/issue/10002/worklog.json
|
307
311
|
- spec/mock_responses/issue/10002/worklog.post.json
|
308
312
|
- spec/mock_responses/issue/10002/worklog/10000.json
|
@@ -343,7 +347,8 @@ files:
|
|
343
347
|
homepage: http://www.sumoheavy.com
|
344
348
|
licenses:
|
345
349
|
- MIT
|
346
|
-
metadata:
|
350
|
+
metadata:
|
351
|
+
source_code_uri: https://github.com/sumoheavy/jira-ruby
|
347
352
|
post_install_message:
|
348
353
|
rdoc_options: []
|
349
354
|
require_paths:
|
@@ -380,6 +385,7 @@ test_files:
|
|
380
385
|
- spec/integration/transition_spec.rb
|
381
386
|
- spec/integration/user_spec.rb
|
382
387
|
- spec/integration/version_spec.rb
|
388
|
+
- spec/integration/watcher_spec.rb
|
383
389
|
- spec/integration/webhook.rb
|
384
390
|
- spec/integration/worklog_spec.rb
|
385
391
|
- spec/jira/base_factory_spec.rb
|
@@ -402,6 +408,7 @@ test_files:
|
|
402
408
|
- spec/jira/resource/user_factory_spec.rb
|
403
409
|
- spec/jira/resource/worklog_spec.rb
|
404
410
|
- spec/mock_responses/board/1.json
|
411
|
+
- spec/mock_responses/board/1_issues.json
|
405
412
|
- spec/mock_responses/component.post.json
|
406
413
|
- spec/mock_responses/component/10000.invalid.put.json
|
407
414
|
- spec/mock_responses/component/10000.json
|
@@ -420,6 +427,7 @@ test_files:
|
|
420
427
|
- spec/mock_responses/issue/10002/comment/10000.put.json
|
421
428
|
- spec/mock_responses/issue/10002/transitions.json
|
422
429
|
- spec/mock_responses/issue/10002/transitions.post.json
|
430
|
+
- spec/mock_responses/issue/10002/watchers.json
|
423
431
|
- spec/mock_responses/issue/10002/worklog.json
|
424
432
|
- spec/mock_responses/issue/10002/worklog.post.json
|
425
433
|
- spec/mock_responses/issue/10002/worklog/10000.json
|