jira-ruby 0.0.2 → 0.0.3
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.
- data/README.rdoc +259 -0
- data/Rakefile +9 -0
- data/example.rb +47 -4
- data/jira-ruby.gemspec +5 -3
- data/lib/jira.rb +21 -7
- data/lib/jira/base.rb +466 -0
- data/lib/jira/base_factory.rb +49 -0
- data/lib/jira/client.rb +79 -8
- data/lib/jira/has_many_proxy.rb +43 -0
- data/lib/jira/http_error.rb +16 -0
- data/lib/jira/resource/attachment.rb +12 -0
- data/lib/jira/resource/comment.rb +14 -0
- data/lib/jira/resource/component.rb +4 -9
- data/lib/jira/resource/issue.rb +49 -5
- data/lib/jira/resource/issuetype.rb +10 -0
- data/lib/jira/resource/priority.rb +10 -0
- data/lib/jira/resource/project.rb +24 -3
- data/lib/jira/resource/status.rb +10 -0
- data/lib/jira/resource/user.rb +14 -0
- data/lib/jira/resource/version.rb +10 -0
- data/lib/jira/resource/worklog.rb +16 -0
- data/lib/jira/version.rb +2 -2
- data/spec/integration/attachment_spec.rb +26 -0
- data/spec/integration/comment_spec.rb +55 -0
- data/spec/integration/component_spec.rb +25 -52
- data/spec/integration/issue_spec.rb +50 -47
- data/spec/integration/issuetype_spec.rb +27 -0
- data/spec/integration/priority_spec.rb +27 -0
- data/spec/integration/project_spec.rb +32 -24
- data/spec/integration/status_spec.rb +27 -0
- data/spec/integration/user_spec.rb +25 -0
- data/spec/integration/version_spec.rb +43 -0
- data/spec/integration/worklog_spec.rb +55 -0
- data/spec/jira/base_factory_spec.rb +46 -0
- data/spec/jira/base_spec.rb +555 -0
- data/spec/jira/client_spec.rb +12 -12
- data/spec/jira/has_many_proxy_spec.rb +45 -0
- data/spec/jira/{resource/http_error_spec.rb → http_error_spec.rb} +1 -1
- data/spec/jira/resource/attachment_spec.rb +20 -0
- data/spec/jira/resource/issue_spec.rb +83 -0
- data/spec/jira/resource/project_factory_spec.rb +3 -3
- data/spec/jira/resource/project_spec.rb +28 -0
- data/spec/jira/resource/worklog_spec.rb +24 -0
- data/spec/mock_responses/attachment/10000.json +20 -0
- data/spec/mock_responses/component/10000.invalid.put.json +5 -0
- data/spec/mock_responses/issue.json +1108 -0
- data/spec/mock_responses/issue/10002.invalid.put.json +6 -0
- data/spec/mock_responses/issue/10002.json +13 -1
- data/spec/mock_responses/issue/10002.put.missing_field_update.json +6 -0
- data/spec/mock_responses/issue/10002/comment.json +65 -0
- data/spec/mock_responses/issue/10002/comment.post.json +29 -0
- data/spec/mock_responses/issue/10002/comment/10000.json +29 -0
- data/spec/mock_responses/issue/10002/comment/10000.put.json +29 -0
- data/spec/mock_responses/issue/10002/worklog.json +98 -0
- data/spec/mock_responses/issue/10002/worklog.post.json +30 -0
- data/spec/mock_responses/issue/10002/worklog/10000.json +31 -0
- data/spec/mock_responses/issue/10002/worklog/10000.put.json +30 -0
- data/spec/mock_responses/issuetype.json +42 -0
- data/spec/mock_responses/issuetype/5.json +8 -0
- data/spec/mock_responses/priority.json +42 -0
- data/spec/mock_responses/priority/1.json +8 -0
- data/spec/mock_responses/project/SAMPLEPROJECT.issues.json +1108 -0
- data/spec/mock_responses/project/SAMPLEPROJECT.json +15 -1
- data/spec/mock_responses/status.json +37 -0
- data/spec/mock_responses/status/1.json +7 -0
- data/spec/mock_responses/user?username=admin.json +17 -0
- data/spec/mock_responses/version.post.json +7 -0
- data/spec/mock_responses/version/10000.invalid.put.json +5 -0
- data/spec/mock_responses/version/10000.json +11 -0
- data/spec/mock_responses/version/10000.put.json +7 -0
- data/spec/spec_helper.rb +7 -12
- data/spec/support/matchers/have_attributes.rb +11 -0
- data/spec/support/matchers/have_many.rb +9 -0
- data/spec/support/matchers/have_one.rb +5 -0
- data/spec/support/shared_examples/integration.rb +174 -0
- metadata +139 -24
- data/README.markdown +0 -81
- data/lib/jira/resource/base.rb +0 -148
- data/lib/jira/resource/base_factory.rb +0 -44
- data/lib/jira/resource/http_error.rb +0 -17
- data/spec/jira/resource/base_factory_spec.rb +0 -36
- data/spec/jira/resource/base_spec.rb +0 -292
@@ -0,0 +1,16 @@
|
|
1
|
+
module JIRA
|
2
|
+
module Resource
|
3
|
+
|
4
|
+
class WorklogFactory < JIRA::BaseFactory # :nodoc:
|
5
|
+
end
|
6
|
+
|
7
|
+
class Worklog < JIRA::Base
|
8
|
+
has_one :author, :class => JIRA::Resource::User
|
9
|
+
has_one :update_author, :class => JIRA::Resource::User,
|
10
|
+
:attribute_key => "updateAuthor"
|
11
|
+
belongs_to :issue
|
12
|
+
nested_collections true
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
data/lib/jira/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
module
|
2
|
-
VERSION = "0.0.
|
1
|
+
module JIRA
|
2
|
+
VERSION = "0.0.3"
|
3
3
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe JIRA::Resource::Attachment do
|
4
|
+
|
5
|
+
|
6
|
+
let(:client) do
|
7
|
+
client = JIRA::Client.new('foo', 'bar')
|
8
|
+
client.set_access_token('abc', '123')
|
9
|
+
client
|
10
|
+
end
|
11
|
+
|
12
|
+
let(:key) { "10000" }
|
13
|
+
|
14
|
+
let(:expected_attributes) do
|
15
|
+
{
|
16
|
+
'self' => "http://localhost:2990/jira/rest/api/2/attachment/10000",
|
17
|
+
'size' => 15360,
|
18
|
+
'filename' => "ballmer.png"
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
it_should_behave_like "a resource"
|
23
|
+
it_should_behave_like "a resource with a singular GET endpoint"
|
24
|
+
it_should_behave_like "a resource with a DELETE endpoint"
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe JIRA::Resource::Comment do
|
4
|
+
|
5
|
+
|
6
|
+
let(:client) do
|
7
|
+
client = JIRA::Client.new('foo', 'bar')
|
8
|
+
client.set_access_token('abc', '123')
|
9
|
+
client
|
10
|
+
end
|
11
|
+
|
12
|
+
let(:key) { "10000" }
|
13
|
+
|
14
|
+
let(:target) { JIRA::Resource::Comment.new(client, :attrs => {'id' => '99999'}, :issue_id => '54321') }
|
15
|
+
|
16
|
+
let(:expected_collection_length) { 2 }
|
17
|
+
|
18
|
+
let(:belongs_to) {
|
19
|
+
JIRA::Resource::Issue.new(client, :attrs => {
|
20
|
+
'id' => '10002', 'fields' => {
|
21
|
+
'comment' => {'comments' => []}
|
22
|
+
}
|
23
|
+
})
|
24
|
+
}
|
25
|
+
|
26
|
+
let(:expected_attributes) do
|
27
|
+
{
|
28
|
+
'self' => "http://localhost:2990/jira/rest/api/2/issue/10002/comment/10000",
|
29
|
+
'id' => key,
|
30
|
+
'body' => "This is a comment. Creative."
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
let(:attributes_for_post) {
|
35
|
+
{"body" => "new comment"}
|
36
|
+
}
|
37
|
+
let(:expected_attributes_from_post) {
|
38
|
+
{ "id" => "10001", "body" => "new comment"}
|
39
|
+
}
|
40
|
+
|
41
|
+
let(:attributes_for_put) {
|
42
|
+
{"body" => "new body"}
|
43
|
+
}
|
44
|
+
let(:expected_attributes_from_put) {
|
45
|
+
{ "id" => "10000", "body" => "new body" }
|
46
|
+
}
|
47
|
+
|
48
|
+
it_should_behave_like "a resource"
|
49
|
+
it_should_behave_like "a resource with a collection GET endpoint"
|
50
|
+
it_should_behave_like "a resource with a singular GET endpoint"
|
51
|
+
it_should_behave_like "a resource with a DELETE endpoint"
|
52
|
+
it_should_behave_like "a resource with a POST endpoint"
|
53
|
+
it_should_behave_like "a resource with a PUT endpoint"
|
54
|
+
|
55
|
+
end
|
@@ -1,70 +1,43 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe
|
3
|
+
describe JIRA::Resource::Component do
|
4
4
|
|
5
5
|
|
6
6
|
let(:client) do
|
7
|
-
client =
|
7
|
+
client = JIRA::Client.new('foo', 'bar')
|
8
8
|
client.set_access_token('abc', '123')
|
9
9
|
client
|
10
10
|
end
|
11
11
|
|
12
|
+
let(:key) { "10000" }
|
13
|
+
|
12
14
|
let(:expected_attributes) do
|
13
15
|
{
|
14
16
|
'self' => "http://localhost:2990/jira/rest/api/2/component/10000",
|
15
|
-
'id' =>
|
17
|
+
'id' => key,
|
16
18
|
'name' => "Cheesecake"
|
17
19
|
}
|
18
20
|
end
|
19
21
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
component.should have_attributes(expected_attributes)
|
41
|
-
end
|
42
|
-
|
43
|
-
it "builds and fetches single component" do
|
44
|
-
component = client.Component.build('id' => 10000)
|
45
|
-
component.fetch
|
46
|
-
|
47
|
-
component.should have_attributes(expected_attributes)
|
48
|
-
end
|
49
|
-
|
50
|
-
it "deletes a component" do
|
51
|
-
component = client.Component.build('id' => "10000")
|
52
|
-
component.delete.should be_true
|
53
|
-
end
|
54
|
-
|
55
|
-
it "saves a new component" do
|
56
|
-
component = client.Component.build
|
57
|
-
component.save({"name" => "Test component", "project" => "SAMPLEPROJECT"}).should be_true
|
58
|
-
component.id.should == "10001"
|
59
|
-
component.name.should == "Test component"
|
60
|
-
end
|
61
|
-
|
62
|
-
it "saves an existing component" do
|
63
|
-
component = client.Component.build('id' => '10000')
|
64
|
-
component.fetch
|
65
|
-
component.save('name' => 'Jammy').should be_true
|
66
|
-
component.id.should == "10000"
|
67
|
-
component.name.should == "Jammy"
|
68
|
-
end
|
22
|
+
let(:attributes_for_post) {
|
23
|
+
{"name" => "Test component", "project" => "SAMPLEPROJECT" }
|
24
|
+
}
|
25
|
+
let(:expected_attributes_from_post) {
|
26
|
+
{ "id" => "10001", "name" => "Test component" }
|
27
|
+
}
|
28
|
+
|
29
|
+
let(:attributes_for_put) {
|
30
|
+
{"name" => "Jammy", "project" => "SAMPLEPROJECT" }
|
31
|
+
}
|
32
|
+
let(:expected_attributes_from_put) {
|
33
|
+
{ "id" => "10000", "name" => "Jammy" }
|
34
|
+
}
|
35
|
+
|
36
|
+
it_should_behave_like "a resource"
|
37
|
+
it_should_behave_like "a resource with a singular GET endpoint"
|
38
|
+
it_should_behave_like "a resource with a DELETE endpoint"
|
39
|
+
it_should_behave_like "a resource with a POST endpoint"
|
40
|
+
it_should_behave_like "a resource with a PUT endpoint"
|
41
|
+
it_should_behave_like "a resource with a PUT endpoint that rejects invalid fields"
|
69
42
|
|
70
43
|
end
|
@@ -1,13 +1,15 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe
|
3
|
+
describe JIRA::Resource::Issue do
|
4
4
|
|
5
5
|
let(:client) do
|
6
|
-
client =
|
6
|
+
client = JIRA::Client.new('foo', 'bar')
|
7
7
|
client.set_access_token('abc', '123')
|
8
8
|
client
|
9
9
|
end
|
10
10
|
|
11
|
+
let(:key) { "10002" }
|
12
|
+
|
11
13
|
let(:expected_attributes) do
|
12
14
|
{
|
13
15
|
'self' => "http://localhost:2990/jira/rest/api/2/issue/10002",
|
@@ -16,57 +18,58 @@ describe Jira::Resource::Issue do
|
|
16
18
|
}
|
17
19
|
end
|
18
20
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
to_return(:body => nil)
|
26
|
-
stub_request(:post, "http://localhost:2990/jira/rest/api/2/issue").
|
27
|
-
with(:body => '{"foo":"bar"}').
|
28
|
-
to_return(:body => get_mock_response('issue.post.json'))
|
29
|
-
stub_request(:put, "http://localhost:2990/jira/rest/api/2/issue/10002").
|
30
|
-
with(:body => '{"foo":"bar"}').
|
31
|
-
to_return(:body => nil)
|
32
|
-
stub_request(:get,
|
33
|
-
"http://localhost:2990/jira/rest/api/2/issue/99999").
|
34
|
-
to_return(:status => 404, :body => '{"errorMessages":["Issue Does Not Exist"],"errors": {}}')
|
35
|
-
end
|
36
|
-
|
37
|
-
it "should get a single issue by key" do
|
38
|
-
issue = client.Issue.find('10002')
|
39
|
-
|
40
|
-
issue.should have_attributes(expected_attributes)
|
41
|
-
end
|
42
|
-
|
43
|
-
it "should handle issue not found" do
|
44
|
-
lambda do
|
45
|
-
issue = client.Issue.find('99999')
|
46
|
-
end.should raise_exception(Jira::Resource::HTTPError)
|
47
|
-
end
|
21
|
+
let(:attributes_for_post) {
|
22
|
+
{ 'foo' => 'bar' }
|
23
|
+
}
|
24
|
+
let(:expected_attributes_from_post) {
|
25
|
+
{ "id" => "10005", "key" => "SAMPLEPROJECT-4" }
|
26
|
+
}
|
48
27
|
|
49
|
-
|
50
|
-
|
51
|
-
|
28
|
+
let(:attributes_for_put) {
|
29
|
+
{ 'foo' => 'bar' }
|
30
|
+
}
|
31
|
+
let(:expected_attributes_from_put) {
|
32
|
+
{ 'foo' => 'bar' }
|
33
|
+
}
|
34
|
+
let(:expected_collection_length) { 11 }
|
52
35
|
|
53
|
-
|
36
|
+
it_should_behave_like "a resource"
|
37
|
+
it_should_behave_like "a resource with a singular GET endpoint"
|
38
|
+
describe "GET all issues" do # JIRA::Resource::Issue.all uses the search endpoint
|
39
|
+
let(:expected_attributes) {
|
40
|
+
{
|
41
|
+
"id"=>"10014",
|
42
|
+
"self"=>"http://localhost:2990/jira/rest/api/2/issue/10014",
|
43
|
+
"key"=>"SAMPLEPROJECT-13"
|
44
|
+
}
|
45
|
+
}
|
46
|
+
before(:each) do
|
47
|
+
stub_request(:get, "http://localhost:2990/jira/rest/api/2/search").
|
48
|
+
to_return(:status => 200, :body => get_mock_response('issue.json'))
|
49
|
+
end
|
50
|
+
it_should_behave_like "a resource with a collection GET endpoint"
|
54
51
|
end
|
52
|
+
it_should_behave_like "a resource with a DELETE endpoint"
|
53
|
+
it_should_behave_like "a resource with a POST endpoint"
|
54
|
+
it_should_behave_like "a resource with a PUT endpoint"
|
55
|
+
it_should_behave_like "a resource with a PUT endpoint that rejects invalid fields"
|
55
56
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
57
|
+
describe "errors" do
|
58
|
+
before(:each) do
|
59
|
+
stub_request(:get,
|
60
|
+
"http://localhost:2990/jira/rest/api/2/issue/10002").
|
61
|
+
to_return(:status => 200, :body => get_mock_response('issue/10002.json'))
|
62
|
+
stub_request(:put, "http://localhost:2990/jira/rest/api/2/issue/10002").
|
63
|
+
with(:body => '{"missing":"fields and update"}').
|
64
|
+
to_return(:status => 400, :body => get_mock_response('issue/10002.put.missing_field_update.json'))
|
65
|
+
end
|
60
66
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
67
|
+
it "fails to save when fields and update are missing" do
|
68
|
+
subject = client.Issue.build('id' => '10002')
|
69
|
+
subject.fetch
|
70
|
+
subject.save('missing' => 'fields and update').should be_false
|
71
|
+
end
|
65
72
|
|
66
|
-
it "should save an existing record" do
|
67
|
-
subject = client.Issue.build('id' => '10002')
|
68
|
-
subject.fetch
|
69
|
-
subject.save('foo' => 'bar').should be_true
|
70
73
|
end
|
71
74
|
|
72
75
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe JIRA::Resource::Issuetype do
|
4
|
+
|
5
|
+
let(:client) do
|
6
|
+
client = JIRA::Client.new('foo', 'bar')
|
7
|
+
client.set_access_token('abc', '123')
|
8
|
+
client
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:key) { "5" }
|
12
|
+
|
13
|
+
let(:expected_attributes) do
|
14
|
+
{
|
15
|
+
'self' => "http://localhost:2990/jira/rest/api/2/issuetype/5",
|
16
|
+
'id' => key,
|
17
|
+
'name' => 'Sub-task'
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
let(:expected_collection_length) { 5 }
|
22
|
+
|
23
|
+
it_should_behave_like "a resource"
|
24
|
+
it_should_behave_like "a resource with a collection GET endpoint"
|
25
|
+
it_should_behave_like "a resource with a singular GET endpoint"
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe JIRA::Resource::Priority do
|
4
|
+
|
5
|
+
let(:client) do
|
6
|
+
client = JIRA::Client.new('foo', 'bar')
|
7
|
+
client.set_access_token('abc', '123')
|
8
|
+
client
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:key) { "1" }
|
12
|
+
|
13
|
+
let(:expected_attributes) do
|
14
|
+
{
|
15
|
+
'self' => "http://localhost:2990/jira/rest/api/2/priority/1",
|
16
|
+
'id' => key,
|
17
|
+
'name' => 'Blocker'
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
let(:expected_collection_length) { 5 }
|
22
|
+
|
23
|
+
it_should_behave_like "a resource"
|
24
|
+
it_should_behave_like "a resource with a collection GET endpoint"
|
25
|
+
it_should_behave_like "a resource with a singular GET endpoint"
|
26
|
+
|
27
|
+
end
|
@@ -1,48 +1,56 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe
|
3
|
+
describe JIRA::Resource::Project do
|
4
4
|
|
5
5
|
let(:client) do
|
6
|
-
client =
|
6
|
+
client = JIRA::Client.new('foo', 'bar')
|
7
7
|
client.set_access_token('abc', '123')
|
8
8
|
client
|
9
9
|
end
|
10
10
|
|
11
|
+
let(:key) { "SAMPLEPROJECT" }
|
12
|
+
|
11
13
|
let(:expected_attributes) do
|
12
14
|
{
|
13
15
|
'self' => "http://localhost:2990/jira/rest/api/2/project/SAMPLEPROJECT",
|
14
|
-
'key' =>
|
16
|
+
'key' => key,
|
15
17
|
'name' => "Sample Project for Developing RoR RESTful API"
|
16
18
|
}
|
17
19
|
end
|
18
20
|
|
19
|
-
|
20
|
-
stub_request(:get,
|
21
|
-
"http://localhost:2990/jira/rest/api/2/project").
|
22
|
-
to_return(:body => get_mock_response('project.json'))
|
23
|
-
stub_request(:get,
|
24
|
-
"http://localhost:2990/jira/rest/api/2/project/SAMPLEPROJECT").
|
25
|
-
to_return(:body => get_mock_response('project/SAMPLEPROJECT.json'))
|
26
|
-
end
|
21
|
+
let(:expected_collection_length) { 1 }
|
27
22
|
|
28
|
-
|
29
|
-
|
30
|
-
|
23
|
+
it_should_behave_like "a resource"
|
24
|
+
it_should_behave_like "a resource with a collection GET endpoint"
|
25
|
+
it_should_behave_like "a resource with a singular GET endpoint"
|
31
26
|
|
32
|
-
|
33
|
-
first.should have_attributes(expected_attributes)
|
34
|
-
end
|
27
|
+
describe "issues" do
|
35
28
|
|
36
|
-
|
37
|
-
|
29
|
+
it "returns all the issues" do
|
30
|
+
stub_request(:get, "http://localhost:2990/jira/rest/api/2/search?jql=project='SAMPLEPROJECT'").
|
31
|
+
to_return(:status => 200, :body => get_mock_response('project/SAMPLEPROJECT.issues.json'))
|
32
|
+
subject = client.Project.build('key' => key)
|
33
|
+
issues = subject.issues
|
34
|
+
issues.length.should == 11
|
35
|
+
issues.each do |issue|
|
36
|
+
issue.class.should == JIRA::Resource::Issue
|
37
|
+
issue.expanded?.should be_false
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
38
41
|
|
39
|
-
project.should have_attributes(expected_attributes)
|
40
42
|
end
|
41
43
|
|
42
|
-
it "
|
43
|
-
|
44
|
-
|
44
|
+
it "returns a collection of components" do
|
45
|
+
|
46
|
+
stub_request(:get, 'http://localhost:2990' + described_class.singular_path(client, key)).
|
47
|
+
to_return(:status => 200, :body => get_mock_response('project/SAMPLEPROJECT.json'))
|
48
|
+
|
49
|
+
subject = client.Project.find(key)
|
50
|
+
subject.components.length.should == 2
|
51
|
+
subject.components.each do |component|
|
52
|
+
component.class.should == JIRA::Resource::Component
|
53
|
+
end
|
45
54
|
|
46
|
-
project.should have_attributes(expected_attributes)
|
47
55
|
end
|
48
56
|
end
|