jira-ruby 0.1.0 → 0.1.1
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 +2 -2
- data/Rakefile +11 -1
- data/example.rb +6 -0
- data/http-basic-example.rb +6 -0
- data/lib/jira/base_factory.rb +1 -1
- data/lib/jira/client.rb +1 -1
- data/lib/jira/http_client.rb +2 -2
- data/lib/jira/oauth_client.rb +1 -1
- data/lib/jira/resource/issue.rb +11 -0
- data/lib/jira/version.rb +1 -1
- data/spec/integration/issue_spec.rb +16 -0
- data/spec/jira/http_client_spec.rb +3 -5
- data/spec/support/shared_examples/integration.rb +16 -0
- metadata +18 -18
data/README.rdoc
CHANGED
@@ -15,8 +15,8 @@ API version 2).
|
|
15
15
|
|
16
16
|
issue.comments.each {|comment| ... }
|
17
17
|
|
18
|
-
comment = issue.comments.build
|
19
|
-
comment.save
|
18
|
+
comment = issue.comments.build
|
19
|
+
comment.save({'body':'My new comment'})
|
20
20
|
comment.delete
|
21
21
|
|
22
22
|
== Links to JIRA REST API documentation
|
data/Rakefile
CHANGED
@@ -6,7 +6,17 @@ require 'rake/rdoctask'
|
|
6
6
|
|
7
7
|
Dir.glob('lib/tasks/*.rake').each { |r| import r }
|
8
8
|
|
9
|
-
task :default => [:
|
9
|
+
task :default => [:test]
|
10
|
+
|
11
|
+
task :test => [:prepare, :spec]
|
12
|
+
|
13
|
+
describe "Prepare and run rspec tests"
|
14
|
+
task :prepare do
|
15
|
+
rsa_key = File.expand_path('rsakey.pem')
|
16
|
+
if !File.exists?(rsa_key)
|
17
|
+
raise "rsakey.pem does not exist, tests will fail. Run `rake jira:generate_public_cert` first"
|
18
|
+
end
|
19
|
+
end
|
10
20
|
|
11
21
|
desc "Run RSpec tests"
|
12
22
|
RSpec::Core::RakeTask.new(:spec)
|
data/example.rb
CHANGED
@@ -52,6 +52,12 @@ pp issue
|
|
52
52
|
# puts "#{issue.id} - #{issue.fields['summary']}"
|
53
53
|
# end
|
54
54
|
#
|
55
|
+
# # List issues by JQL query
|
56
|
+
# # ------------------------
|
57
|
+
# client.Issue.jql('PROJECT = "SAMPLEPROJECT"').each do |issue|
|
58
|
+
# puts "#{issue.id} - #{issue.fields['summary']}"
|
59
|
+
# end
|
60
|
+
#
|
55
61
|
# # Delete an issue
|
56
62
|
# # ---------------
|
57
63
|
# issue = client.Issue.find('SAMPLEPROJECT-2')
|
data/http-basic-example.rb
CHANGED
@@ -49,6 +49,12 @@ end
|
|
49
49
|
# puts "#{issue.id} - #{issue.fields['summary']}"
|
50
50
|
# end
|
51
51
|
#
|
52
|
+
# # List issues by JQL query
|
53
|
+
# # ------------------------
|
54
|
+
# client.Issue.jql('PROJECT = "SAMPLEPROJECT"').each do |issue|
|
55
|
+
# puts "#{issue.id} - #{issue.fields['summary']}"
|
56
|
+
# end
|
57
|
+
#
|
52
58
|
# # Delete an issue
|
53
59
|
# # ---------------
|
54
60
|
# issue = client.Issue.find('SAMPLEPROJECT-2')
|
data/lib/jira/base_factory.rb
CHANGED
@@ -38,7 +38,7 @@ module JIRA
|
|
38
38
|
# The priciple 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
|
41
|
+
delegate_to_target_class :all, :find, :collection_path, :singular_path, :jql
|
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
@@ -137,7 +137,7 @@ module JIRA
|
|
137
137
|
|
138
138
|
# Sends the specified HTTP request to the REST API through the
|
139
139
|
# appropriate method (oauth, basic).
|
140
|
-
def request(http_method, path, body = '', headers)
|
140
|
+
def request(http_method, path, body = '', headers={})
|
141
141
|
@request_client.request(http_method, path, body, headers)
|
142
142
|
end
|
143
143
|
|
data/lib/jira/http_client.rb
CHANGED
@@ -15,8 +15,8 @@ module JIRA
|
|
15
15
|
@options = DEFAULT_OPTIONS.merge(options)
|
16
16
|
end
|
17
17
|
|
18
|
-
def make_request(http_method, path, body='', headers)
|
19
|
-
request = Net::HTTP.const_get(http_method.capitalize).new(path, headers)
|
18
|
+
def make_request(http_method, path, body='', headers={})
|
19
|
+
request = Net::HTTP.const_get(http_method.to_s.capitalize).new(path, headers)
|
20
20
|
request.body = body unless body.nil?
|
21
21
|
request.basic_auth(@options[:username], @options[:password])
|
22
22
|
response = basic_auth_http_conn.request(request)
|
data/lib/jira/oauth_client.rb
CHANGED
@@ -71,7 +71,7 @@ module JIRA
|
|
71
71
|
@access_token
|
72
72
|
end
|
73
73
|
|
74
|
-
def make_request(http_method, path, body='', headers)
|
74
|
+
def make_request(http_method, path, body='', headers={})
|
75
75
|
case http_method
|
76
76
|
when :delete, :get, :head
|
77
77
|
response = access_token.send http_method, path, headers
|
data/lib/jira/resource/issue.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'cgi'
|
2
|
+
|
1
3
|
module JIRA
|
2
4
|
module Resource
|
3
5
|
|
@@ -37,6 +39,15 @@ module JIRA
|
|
37
39
|
end
|
38
40
|
end
|
39
41
|
|
42
|
+
def self.jql(client, jql)
|
43
|
+
url = client.options[:rest_base_path] + "/search?jql=" + CGI.escape(jql)
|
44
|
+
response = client.get(url)
|
45
|
+
json = parse_json(response.body)
|
46
|
+
json['issues'].map do |issue|
|
47
|
+
client.Issue.build(issue)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
40
51
|
def respond_to?(method_name)
|
41
52
|
if attrs.keys.include?('fields') && attrs['fields'].keys.include?(method_name.to_s)
|
42
53
|
true
|
data/lib/jira/version.rb
CHANGED
@@ -74,5 +74,21 @@ describe JIRA::Resource::Issue do
|
|
74
74
|
|
75
75
|
end
|
76
76
|
|
77
|
+
describe "GET jql issues" do # JIRA::Resource::Issue.jql uses the search endpoint
|
78
|
+
jql_query_string = "PROJECT = 'SAMPLEPROJECT'"
|
79
|
+
let(:client) { client }
|
80
|
+
let(:site_url) { site_url }
|
81
|
+
let(:jql_query_string) { jql_query_string }
|
82
|
+
|
83
|
+
let(:expected_attributes) {
|
84
|
+
{
|
85
|
+
"id"=>"10014",
|
86
|
+
"self"=>"http://localhost:2990/jira/rest/api/2/issue/10014",
|
87
|
+
"key"=>"SAMPLEPROJECT-13"
|
88
|
+
}
|
89
|
+
}
|
90
|
+
it_should_behave_like "a resource with JQL inputs and a collection GET endpoint"
|
91
|
+
end
|
92
|
+
|
77
93
|
end
|
78
94
|
end
|
@@ -23,16 +23,14 @@ describe JIRA::HttpClient do
|
|
23
23
|
basic_auth_http_conn = mock()
|
24
24
|
request = mock()
|
25
25
|
basic_client.stub(:basic_auth_http_conn => basic_auth_http_conn)
|
26
|
-
request.should_receive(:basic_auth)
|
27
|
-
.with(basic_client.options[:username], basic_client.options[:password])
|
28
|
-
.exactly(5).times.and_return(request)
|
26
|
+
request.should_receive(:basic_auth).with(basic_client.options[:username], basic_client.options[:password]).exactly(5).times.and_return(request)
|
29
27
|
basic_auth_http_conn.should_receive(:request).exactly(5).times.with(request).and_return(response)
|
30
28
|
[:delete, :get, :head].each do |method|
|
31
|
-
Net::HTTP.const_get(method.capitalize).should_receive(:new).with('/path', headers).and_return(request)
|
29
|
+
Net::HTTP.const_get(method.to_s.capitalize).should_receive(:new).with('/path', headers).and_return(request)
|
32
30
|
basic_client.make_request(method, '/path', nil, headers).should == response
|
33
31
|
end
|
34
32
|
[:post, :put].each do |method|
|
35
|
-
Net::HTTP.const_get(method.capitalize).should_receive(:new).with('/path', headers).and_return(request)
|
33
|
+
Net::HTTP.const_get(method.to_s.capitalize).should_receive(:new).with('/path', headers).and_return(request)
|
36
34
|
request.should_receive(:body=).with(body).and_return(request)
|
37
35
|
basic_client.make_request(method, '/path', body, headers).should == response
|
38
36
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'cgi'
|
2
|
+
|
1
3
|
def get_mock_from_path(method, options = {})
|
2
4
|
if defined? belongs_to
|
3
5
|
prefix = belongs_to.path_component + '/'
|
@@ -79,6 +81,20 @@ shared_examples "a resource with a collection GET endpoint" do
|
|
79
81
|
|
80
82
|
end
|
81
83
|
|
84
|
+
shared_examples "a resource with JQL inputs and a collection GET endpoint" do
|
85
|
+
|
86
|
+
it "should get the collection" do
|
87
|
+
stub_request(:get, site_url + client.options[:rest_base_path] + '/search?jql=' + CGI.escape(jql_query_string)).
|
88
|
+
to_return(:status => 200, :body => get_mock_response('issue.json'))
|
89
|
+
collection = build_receiver.jql(jql_query_string)
|
90
|
+
collection.length.should == expected_collection_length
|
91
|
+
|
92
|
+
first = collection.first
|
93
|
+
first.should have_attributes(expected_attributes)
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
97
|
+
|
82
98
|
shared_examples "a resource with a singular GET endpoint" do
|
83
99
|
|
84
100
|
it "GETs a single resource" do
|
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: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-08-24 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: oauth
|
16
|
-
requirement: &
|
16
|
+
requirement: &70287782974040 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70287782974040
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: oauth
|
27
|
-
requirement: &
|
27
|
+
requirement: &70287782973620 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70287782973620
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: railties
|
38
|
-
requirement: &
|
38
|
+
requirement: &70287782973200 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70287782973200
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: railties
|
49
|
-
requirement: &
|
49
|
+
requirement: &70287782972780 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70287782972780
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: activesupport
|
60
|
-
requirement: &
|
60
|
+
requirement: &70287782972360 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :runtime
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70287782972360
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: activesupport
|
71
|
-
requirement: &
|
71
|
+
requirement: &70287782971940 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *70287782971940
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: webmock
|
82
|
-
requirement: &
|
82
|
+
requirement: &70287782971520 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: '0'
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *70287782971520
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: rspec
|
93
|
-
requirement: &
|
93
|
+
requirement: &70287782987480 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ! '>='
|
@@ -98,7 +98,7 @@ dependencies:
|
|
98
98
|
version: '0'
|
99
99
|
type: :development
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *70287782987480
|
102
102
|
description: API for JIRA 5
|
103
103
|
email:
|
104
104
|
executables: []
|