jiraSOAP 0.7.1 → 0.8.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.
- data/.yardopts +2 -3
- data/ChangeLog +15 -0
- data/LICENSE.txt +1 -1
- data/README.markdown +51 -41
- data/Rakefile +57 -0
- data/docs/GettingStarted.markdown +36 -0
- data/lib/jiraSOAP.rb +7 -4
- data/lib/jiraSOAP/api.rb +59 -53
- data/lib/jiraSOAP/api/additions.rb +4 -6
- data/lib/jiraSOAP/api/attachments.rb +18 -8
- data/lib/jiraSOAP/api/avatars.rb +30 -17
- data/lib/jiraSOAP/api/comments.rb +16 -11
- data/lib/jiraSOAP/api/filters.rb +13 -10
- data/lib/jiraSOAP/api/issue_data_types.rb +29 -21
- data/lib/jiraSOAP/api/issues.rb +46 -31
- data/lib/jiraSOAP/api/project_roles.rb +22 -15
- data/lib/jiraSOAP/api/projects.rb +33 -20
- data/lib/jiraSOAP/api/schemes.rb +9 -9
- data/lib/jiraSOAP/api/server_info.rb +11 -9
- data/lib/jiraSOAP/api/users.rb +58 -10
- data/lib/jiraSOAP/api/versions.rb +15 -11
- data/lib/jiraSOAP/api/worklog.rb +14 -0
- data/lib/jiraSOAP/core_extensions.rb +8 -0
- data/lib/jiraSOAP/entities.rb +3 -0
- data/lib/jiraSOAP/entities/attachment_metadata.rb +28 -9
- data/lib/jiraSOAP/entities/avatar.rb +29 -10
- data/lib/jiraSOAP/entities/comment.rb +37 -11
- data/lib/jiraSOAP/entities/component.rb +1 -1
- data/lib/jiraSOAP/entities/custom_field_value.rb +17 -12
- data/lib/jiraSOAP/entities/described_entity.rb +9 -5
- data/lib/jiraSOAP/entities/dynamic_entity.rb +12 -5
- data/lib/jiraSOAP/entities/entity.rb +33 -27
- data/lib/jiraSOAP/entities/field.rb +1 -1
- data/lib/jiraSOAP/entities/field_value.rb +16 -6
- data/lib/jiraSOAP/entities/filter.rb +18 -5
- data/lib/jiraSOAP/entities/issue.rb +74 -29
- data/lib/jiraSOAP/entities/issue_property.rb +9 -6
- data/lib/jiraSOAP/entities/issue_security_scheme.rb +1 -1
- data/lib/jiraSOAP/entities/issue_type.rb +9 -4
- data/lib/jiraSOAP/entities/named_entity.rb +8 -4
- data/lib/jiraSOAP/entities/notification_scheme.rb +1 -1
- data/lib/jiraSOAP/entities/permission.rb +14 -6
- data/lib/jiraSOAP/entities/permission_mapping.rb +9 -5
- data/lib/jiraSOAP/entities/permission_scheme.rb +7 -4
- data/lib/jiraSOAP/entities/priority.rb +7 -4
- data/lib/jiraSOAP/entities/project.rb +29 -13
- data/lib/jiraSOAP/entities/project_role.rb +3 -2
- data/lib/jiraSOAP/entities/resolution.rb +1 -1
- data/lib/jiraSOAP/entities/scheme.rb +5 -1
- data/lib/jiraSOAP/entities/server_configuration.rb +39 -14
- data/lib/jiraSOAP/entities/server_info.rb +20 -8
- data/lib/jiraSOAP/entities/status.rb +1 -1
- data/lib/jiraSOAP/entities/time_info.rb +12 -5
- data/lib/jiraSOAP/entities/user.rb +8 -4
- data/lib/jiraSOAP/entities/usergroup.rb +15 -0
- data/lib/jiraSOAP/entities/username.rb +7 -1
- data/lib/jiraSOAP/entities/version.rb +20 -12
- data/lib/jiraSOAP/entities/worklog.rb +28 -0
- data/lib/jiraSOAP/handsoap_extensions.rb +31 -80
- data/lib/jiraSOAP/{JIRAservice.rb → jira_service.rb} +19 -14
- data/lib/jiraSOAP/{macruby_bonuses.rb → macruby_extensions.rb} +5 -14
- data/lib/jiraSOAP/nokogiri_extensions.rb +68 -0
- data/lib/jiraSOAP/url.rb +10 -2
- data/lib/jiraSOAP/version.rb +3 -0
- metadata +29 -55
- data/yard-jiraSOAP.rb +0 -65
data/.yardopts
CHANGED
data/ChangeLog
CHANGED
@@ -1,4 +1,19 @@
|
|
1
|
+
Version 0.8.0
|
2
|
+
|
3
|
+
* Deprecated the #get_ from methods that start with #get_
|
4
|
+
* Alias #login to #log_in and #logout to #log_out
|
5
|
+
* Added RemoteAPI#permission_to_edit_comment?
|
6
|
+
* Added UserGroup and related RemoteAPI methods
|
7
|
+
* Added RemoteAPI#add_worklog
|
8
|
+
* Various documentation updates and tweaks
|
9
|
+
|
10
|
+
* Removed handsoap parsing abstraction (roflscale for parsing)
|
11
|
+
* Removed the YARD plugin in favour of YARD 0.7 DSL documenting stuff
|
12
|
+
|
13
|
+
* FIx setting the assignee during Issue creation
|
14
|
+
|
1
15
|
Version 0.7.1
|
16
|
+
|
2
17
|
* Remove AOT compiled files from gem
|
3
18
|
|
4
19
|
Version 0.7
|
data/LICENSE.txt
CHANGED
data/README.markdown
CHANGED
@@ -1,74 +1,85 @@
|
|
1
|
-
jiraSOAP - Ruby interface to the JIRA SOAP API
|
2
|
-
==============================================
|
1
|
+
# jiraSOAP - Ruby interface to the JIRA SOAP API
|
3
2
|
|
4
|
-
Uses [handsoap](http://wiki.github.com/unwire/handsoap/) to build a
|
3
|
+
Uses [handsoap](http://wiki.github.com/unwire/handsoap/) to build a
|
4
|
+
client for the JIRA SOAP API that works on MacRuby as well as Ruby
|
5
|
+
1.9.
|
5
6
|
|
6
|
-
|
7
|
+
You can read the documentation for the
|
8
|
+
[latest release](http://rubydoc.info/gems/jiraSOAP/) or
|
9
|
+
the
|
10
|
+
[HEAD commit](http://rdoc.info/github/Marketcircle/jiraSOAP/master/frames).
|
11
|
+
The meat of the service is in the `RemoteAPI` module.
|
7
12
|
|
8
13
|
|
9
|
-
Motivation
|
10
|
-
----------
|
14
|
+
## Motivation
|
11
15
|
|
12
|
-
The `jira4r` gem already exists, and works well on Ruby 1.8, but is
|
16
|
+
The `jira4r` gem already exists, and works well on Ruby 1.8, but is
|
17
|
+
not compatible with Ruby 1.9 or MacRuby due to its dependance on
|
18
|
+
`soap4r`.
|
13
19
|
|
14
20
|
|
15
|
-
Goals
|
16
|
-
-----
|
21
|
+
## Goals
|
17
22
|
|
18
23
|
Pick up where `jira4r` left off:
|
19
24
|
|
20
25
|
- Implement the current API; `jira4r` does not implement APIs from JIRA 4.x
|
26
|
+
* not including APIs that have been deprecated in JIRA 4.x
|
21
27
|
- More natural interface; not adhering to the API when the API is weird
|
22
|
-
- Speed; network latency is bad enough
|
23
|
-
- Excellent documentation
|
28
|
+
- Speed; network latency is bad enough (it would be cool to roflscale)
|
29
|
+
- Excellent documentation
|
24
30
|
|
25
31
|
|
26
|
-
Getting Started
|
27
|
-
---------------
|
32
|
+
## Getting Started
|
28
33
|
|
29
34
|
`jiraSOAP` should run on Ruby 1.9.2 and MacRuby 0.8 or newer. It is available through rubygems or you can build from source:
|
30
35
|
|
31
|
-
|
32
|
-
|
36
|
+
```bash
|
37
|
+
# Using rubygems
|
38
|
+
gem install jiraSOAP
|
33
39
|
|
34
|
-
|
35
|
-
|
36
|
-
|
40
|
+
# Building from source
|
41
|
+
git clone git://github.com/Marketcircle/jiraSOAP.git
|
42
|
+
rake build install
|
43
|
+
```
|
37
44
|
|
38
45
|
Once installed, you can run a quick demo (making appropriate substitutions):
|
39
46
|
|
40
|
-
|
47
|
+
```ruby
|
48
|
+
require 'jiraSOAP'
|
41
49
|
|
42
|
-
|
43
|
-
|
50
|
+
db = JIRA::JIRAService.new 'http://jira.yourSite.com:8080'
|
51
|
+
db.login 'user', 'password'
|
44
52
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
53
|
+
issues = db.get_issues_from_jql_search 'reporter = currentUser()', 100
|
54
|
+
issues.each { |issue|
|
55
|
+
#do something...
|
56
|
+
puts issue.key
|
57
|
+
}
|
50
58
|
|
51
|
-
|
59
|
+
db.logout
|
60
|
+
```
|
52
61
|
|
53
62
|
|
54
|
-
TODO
|
55
|
-
----
|
63
|
+
## TODO
|
56
64
|
|
57
65
|
- Finish implementing all of the API
|
58
66
|
- Stabilize API
|
59
67
|
- Performance optimizations; there are a number of places that can be optimized
|
60
|
-
+ Using GCD/Threads for parsing arrays of results; a significant
|
68
|
+
+ Using GCD/Threads for parsing arrays of results; a significant
|
69
|
+
speed up for large types and large arrays (ie. creating issues from
|
70
|
+
JQL searches)
|
71
|
+
+ Parsing can be done with array indexing instead of hash lookups
|
72
|
+
+ Use a different web driver backend (net/http is slow under load)
|
61
73
|
- Public test suite
|
62
74
|
+ Needs a lot of mock data
|
75
|
+
- ActiveRecord inspired conveniences
|
76
|
+
+ ProjectRole.new( 'test role' ).unique? # => check uniqueness
|
77
|
+
+ Issue.new( args ).create! # => creates a new issue
|
78
|
+
+ Issue.with_key( 'JIRA-123' ) # => returns result of issue lookup
|
79
|
+
+ Issue.new( args ).project # => returns a JIRA::Project
|
63
80
|
|
64
81
|
|
65
|
-
Note on Patches/Pull Requests
|
66
|
-
-----------------------------
|
67
|
-
|
68
|
-
This project has a tendancy to change drastically between releases as it
|
69
|
-
is still unstable, so patches may not cleanly apply.
|
70
|
-
|
71
|
-
If you want to help by submitting patches:
|
82
|
+
## Note on Patches/Pull Requests
|
72
83
|
|
73
84
|
* Fork the project.
|
74
85
|
* Make your feature addition or bug fix.
|
@@ -80,9 +91,8 @@ If you want to help by submitting patches:
|
|
80
91
|
* Send me a pull request. Bonus points for topic branches.
|
81
92
|
|
82
93
|
|
83
|
-
License
|
84
|
-
-------
|
94
|
+
## License
|
85
95
|
|
86
|
-
Copyright: [Marketcircle Inc.](http://www.marketcircle.com/), 2010
|
96
|
+
Copyright: [Marketcircle Inc.](http://www.marketcircle.com/), 2010-2011
|
87
97
|
|
88
|
-
See LICENSE for details.
|
98
|
+
See LICENSE.txt for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
|
3
|
+
task :default => :test
|
4
|
+
|
5
|
+
|
6
|
+
### MACRUBY BONUSES
|
7
|
+
|
8
|
+
if RUBY_ENGINE == 'macruby' and MACRUBY_REVISION.match(/^git commit/)
|
9
|
+
require 'rake/compiletask'
|
10
|
+
Rake::CompileTask.new do |t|
|
11
|
+
t.files = FileList["lib/**/*.rb"]
|
12
|
+
t.verbose = true
|
13
|
+
end
|
14
|
+
|
15
|
+
desc 'Clean MacRuby binaries'
|
16
|
+
task :clean do
|
17
|
+
FileList["lib/**/*.rbo"].each { |bin| rm bin }
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
### GEM STUFF
|
23
|
+
|
24
|
+
require 'rake/gempackagetask'
|
25
|
+
spec = Gem::Specification.load('jiraSOAP.gemspec')
|
26
|
+
Rake::GemPackageTask.new(spec) do |pkg|
|
27
|
+
pkg.need_zip = false
|
28
|
+
pkg.need_tar = true
|
29
|
+
end
|
30
|
+
|
31
|
+
require 'rubygems/dependency_installer'
|
32
|
+
desc 'Build the gem and install it'
|
33
|
+
task :install => :gem do
|
34
|
+
Gem::DependencyInstaller.new.install "pkg/#{spec.file_name}"
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
### TESTING
|
39
|
+
|
40
|
+
require 'rake/testtask'
|
41
|
+
Rake::TestTask.new(:test) do |t|
|
42
|
+
t.libs << 'test'
|
43
|
+
t.pattern = 'test/**/test_*.rb'
|
44
|
+
t.ruby_opts = ['-rhelper']
|
45
|
+
t.verbose = true
|
46
|
+
end
|
47
|
+
|
48
|
+
desc 'Startup irb with jiraSOAP loaded'
|
49
|
+
task :console do
|
50
|
+
sh 'irb -Ilib -rubygems -rjiraSOAP'
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
### DOCUMENTATION
|
55
|
+
|
56
|
+
require 'yard'
|
57
|
+
YARD::Rake::YardocTask.new
|
@@ -0,0 +1,36 @@
|
|
1
|
+
Getting Started
|
2
|
+
===============
|
3
|
+
|
4
|
+
`jiraSOAP` should run on Ruby 1.9.2+ and MacRuby 0.8+. It is available through rubygems or you can build from source:
|
5
|
+
|
6
|
+
# Using rubygems
|
7
|
+
gem install jiraSOAP
|
8
|
+
|
9
|
+
# Building from source
|
10
|
+
git clone git://github.com/Marketcircle/jiraSOAP.git
|
11
|
+
rake build install
|
12
|
+
|
13
|
+
Once installed, you can run a quick demo (making appropriate substitutions):
|
14
|
+
|
15
|
+
require 'jiraSOAP'
|
16
|
+
|
17
|
+
The first thing that you need to do is create a JIRAService object:
|
18
|
+
|
19
|
+
db = JIRA::JIRAService.new 'http://jira.yourSite.com:8080'
|
20
|
+
|
21
|
+
Then you need to log in (a failed login will raise an exception):
|
22
|
+
|
23
|
+
db.login 'mrada', 'secret'
|
24
|
+
|
25
|
+
Once you are logged in, you can start querying the server for information:
|
26
|
+
|
27
|
+
issues = db.get_issues_from_jql_search 'reporter = currentUser()', 100
|
28
|
+
issues.each { |issue|
|
29
|
+
#do something...
|
30
|
+
puts issue.key
|
31
|
+
}
|
32
|
+
|
33
|
+
Don't forget to log out when you are done:
|
34
|
+
|
35
|
+
db.logout
|
36
|
+
|
data/lib/jiraSOAP.rb
CHANGED
@@ -1,19 +1,22 @@
|
|
1
1
|
require 'time'
|
2
2
|
require 'uri'
|
3
|
+
|
3
4
|
require 'nokogiri'
|
5
|
+
require 'jiraSOAP/nokogiri_extensions'
|
4
6
|
|
5
7
|
require 'handsoap'
|
6
8
|
Handsoap.http_driver = :net_http
|
9
|
+
require 'jiraSOAP/handsoap_extensions'
|
7
10
|
|
8
11
|
require 'jiraSOAP/url'
|
9
|
-
require 'jiraSOAP/
|
12
|
+
require 'jiraSOAP/macruby_extensions' if RUBY_ENGINE == 'macruby'
|
10
13
|
|
14
|
+
##
|
11
15
|
# All the remote entities as well as the SOAP service client.
|
12
16
|
module JIRA
|
13
17
|
end
|
14
18
|
|
19
|
+
require 'jiraSOAP/version'
|
15
20
|
require 'jiraSOAP/entities'
|
16
21
|
require 'jiraSOAP/api'
|
17
|
-
require 'jiraSOAP/
|
18
|
-
|
19
|
-
require 'jiraSOAP/macruby_bonuses' if RUBY_ENGINE == 'macruby'
|
22
|
+
require 'jiraSOAP/jira_service'
|
data/lib/jiraSOAP/api.rb
CHANGED
@@ -1,78 +1,77 @@
|
|
1
|
-
require 'jiraSOAP/api/
|
1
|
+
require 'jiraSOAP/api/additions'
|
2
|
+
require 'jiraSOAP/api/attachments'
|
2
3
|
require 'jiraSOAP/api/avatars'
|
3
|
-
require 'jiraSOAP/api/
|
4
|
-
require 'jiraSOAP/api/
|
4
|
+
require 'jiraSOAP/api/comments'
|
5
|
+
require 'jiraSOAP/api/filters'
|
6
|
+
require 'jiraSOAP/api/issue_data_types'
|
7
|
+
require 'jiraSOAP/api/issues'
|
5
8
|
require 'jiraSOAP/api/project_roles'
|
9
|
+
require 'jiraSOAP/api/projects'
|
6
10
|
require 'jiraSOAP/api/schemes'
|
7
|
-
require 'jiraSOAP/api/issues'
|
8
|
-
require 'jiraSOAP/api/filters'
|
9
11
|
require 'jiraSOAP/api/server_info'
|
10
|
-
require 'jiraSOAP/api/
|
11
|
-
require 'jiraSOAP/api/
|
12
|
-
require 'jiraSOAP/api/
|
13
|
-
require 'jiraSOAP/api/additions'
|
14
|
-
|
15
|
-
module JIRA
|
12
|
+
require 'jiraSOAP/api/users'
|
13
|
+
require 'jiraSOAP/api/versions'
|
14
|
+
require 'jiraSOAP/api/worklog'
|
16
15
|
|
16
|
+
##
|
17
|
+
# @todo progressWorkflowAction and friends
|
18
|
+
# @todo monkey patch Array to include a #to_soap method
|
19
|
+
#
|
17
20
|
# Contains the API defined by Atlassian for the [JIRA SOAP service](http://docs.atlassian.com/software/jira/docs/api/rpc-jira-plugin/latest/com/atlassian/jira/rpc/soap/JiraSoapService.html).
|
18
21
|
#
|
19
22
|
# There are several cases where this API diverges from the one defined by
|
20
23
|
# Atlassian; most notably, this API tries to be more idomatically Ruby by using
|
21
24
|
# snake case for method names, default values, varargs, etc..
|
22
|
-
|
23
|
-
# @todo progressWorkflowAction and friends [target v0.8]
|
24
|
-
# @todo get Nokogiri element directly and monkey patch nokogiri directly
|
25
|
-
# instead of the handsoap wrapper
|
26
|
-
# @todo remove the get_ prefix from api methods that don't need them
|
27
|
-
# @todo monkey patch Array to include a #to_soap method
|
28
|
-
# @todo document how to override the url_class setting
|
29
|
-
module RemoteAPI
|
30
|
-
|
31
|
-
# XPath constant to get a node containing a response array.
|
32
|
-
# This could be used for all responses, but is only used in cases where we
|
33
|
-
# cannot use a more blunt XPath expression.
|
34
|
-
RESPONSE_XPATH = '/node()[1]/node()[1]/node()[1]/node()[2]'
|
35
|
-
|
25
|
+
module JIRA::RemoteAPI
|
36
26
|
|
37
27
|
# @group Logging in/out
|
38
28
|
|
39
|
-
|
29
|
+
##
|
40
30
|
# The first method to call; other methods will fail until you are logged in.
|
31
|
+
#
|
41
32
|
# @param [String] user JIRA user name to login with
|
42
33
|
# @param [String] password
|
43
|
-
# @return [
|
34
|
+
# @return [String] auth_token if successful, otherwise raises an exception
|
44
35
|
def login username, password
|
45
|
-
response
|
46
|
-
|
47
|
-
@user
|
48
|
-
|
36
|
+
response = soap_call 'login', username, password
|
37
|
+
self.auth_token = response.first.content
|
38
|
+
@user = user
|
39
|
+
self.auth_token
|
49
40
|
end
|
41
|
+
alias_method :log_in, :login
|
50
42
|
|
51
|
-
|
43
|
+
##
|
52
44
|
# You only need to call this to make an explicit logout; normally, a session
|
53
45
|
# will automatically expire after a set time (configured on the server).
|
54
46
|
# @return [Boolean] true if successful, otherwise false
|
55
47
|
def logout
|
56
|
-
|
48
|
+
jira_call( 'logout' ).to_boolean
|
57
49
|
end
|
50
|
+
alias_method :log_out, :logout
|
58
51
|
|
59
52
|
# @endgroup
|
60
53
|
|
61
54
|
|
62
55
|
private
|
63
56
|
|
57
|
+
# XPath constant to get a node containing a response data.
|
58
|
+
RESPONSE_XPATH = '/node()[1]/node()[1]/node()[1]/node()[2]'.freeze
|
59
|
+
|
60
|
+
##
|
64
61
|
# @todo make this method less ugly
|
65
|
-
# @todo
|
62
|
+
# @todo handle arrays of strings
|
63
|
+
#
|
66
64
|
# A generic method for calling a SOAP method and soapifying all
|
67
|
-
# the arguments
|
68
|
-
#
|
69
|
-
# @param [
|
65
|
+
# the arguments.
|
66
|
+
#
|
67
|
+
# @param [String] method name of the JIRA SOAP API method
|
68
|
+
# @param [Object] *args the arguments for the method, excluding the
|
69
|
+
# authentication token
|
70
70
|
# @return [Handsoap::Response]
|
71
71
|
def build method, *args
|
72
72
|
invoke "soap:#{method}" do |msg|
|
73
73
|
for i in 0...args.size
|
74
|
-
arg = args.shift
|
75
|
-
case arg
|
74
|
+
case arg = args.shift
|
76
75
|
when JIRA::Entity
|
77
76
|
msg.add "soap:in#{i}", do |submsg| arg.soapify_for submsg end
|
78
77
|
else
|
@@ -82,27 +81,34 @@ module RemoteAPI
|
|
82
81
|
end
|
83
82
|
end
|
84
83
|
|
85
|
-
# @
|
84
|
+
# @return [Nokogiri::XML::NodeSet]
|
85
|
+
def soap_call method, *args
|
86
|
+
response = build method, *args
|
87
|
+
response .document.element/RESPONSE_XPATH
|
88
|
+
end
|
89
|
+
|
90
|
+
##
|
86
91
|
# A simple call, for methods that will return a single object.
|
92
|
+
#
|
87
93
|
# @param [String] method
|
88
94
|
# @param [Object] *args
|
89
|
-
# @return [
|
90
|
-
def
|
91
|
-
response =
|
92
|
-
response
|
95
|
+
# @return [Nokogiri::XML::Element]
|
96
|
+
def jira_call method, *args
|
97
|
+
response = soap_call method, self.auth_token, *args
|
98
|
+
response.first
|
93
99
|
end
|
94
100
|
|
101
|
+
##
|
95
102
|
# A more complex form of {#call} that does a little more work for
|
96
103
|
# you when you need to build an array of return values.
|
97
|
-
#
|
98
|
-
# @param [
|
99
|
-
# @
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
+
#
|
105
|
+
# @param [String] method name of the JIRA SOAP API method
|
106
|
+
# @param [Object] *args the arguments for the method, excluding the
|
107
|
+
# authentication token
|
108
|
+
# @return [Nokogiri::XML::NodeSet]
|
109
|
+
def array_jira_call type, method, *args
|
110
|
+
response = soap_call method, self.auth_token, *args
|
111
|
+
response.xpath("node()").map { |frag| type.new_with_xml(frag) }
|
104
112
|
end
|
105
113
|
|
106
114
|
end
|
107
|
-
|
108
|
-
end
|