jiraSOAP 0.9.2 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
data/.yardopts CHANGED
@@ -7,5 +7,6 @@ lib/**/*.rb
7
7
  -
8
8
  docs/GettingStarted.markdown
9
9
  docs/Examples.markdown
10
+ docs/SwitchingHTTPDriver.markdown
10
11
  ChangeLog
11
12
  LICENSE.txt
data/ChangeLog CHANGED
@@ -1,3 +1,14 @@
1
+ Version 0.10.0
2
+
3
+ * Add RemoteAPI#add_attachments_to_issue_with_key (thanks @rjharmon)
4
+ * Add RemoteAPI#components_for_project_with_key (thanks @rjharmon)
5
+
6
+ * Fix a typo in RemoteAPI#progress_workflow_action (thanks Vincent Beau)
7
+
8
+ * Deprecate RemoteAPI#add_base64_encoded_attachments_to_issue_with_key (thanks @rjharmon)
9
+ * Remove deprecated methods from previous release
10
+ * Begin making the test suite public
11
+
1
12
  Version 0.9.2
2
13
 
3
14
  * Remove unneeded httpclient dependency
data/README.markdown CHANGED
@@ -43,8 +43,6 @@ See the {file:docs/GettingStarted.markdown Getting Started} guide.
43
43
  JQL searches)
44
44
  + Parsing might be doable with array indexing instead of hash lookups
45
45
  + Use a different web driver backend (net/http is slow under load)
46
- - Public test suite
47
- + Needs a lot of mock data
48
46
  - ActiveRecord inspired conveniences
49
47
  + ProjectRole.new( 'test role' ).unique? # => check uniqueness
50
48
  + Issue.new( args ).create! # => creates a new issue
@@ -52,12 +50,20 @@ See the {file:docs/GettingStarted.markdown Getting Started} guide.
52
50
  + Issue.new( args ).project # => returns a JIRA::Project
53
51
 
54
52
 
53
+ ## Test Suite
54
+
55
+ The test suite relies on a specific JIRA server being available. Every
56
+ thing that might need to be configured has been abstracted to its own
57
+ method so that the values can easily be changed, but I will try to
58
+ provide a database backup in the near future if the licensing works out.
59
+
55
60
  ## Note on Patches/Pull Requests
56
61
 
57
62
  * Fork the project.
58
63
  * Make your feature addition or bug fix.
59
64
  * Add tests for it. This is important so I don't break it in a
60
- future version unintentionally.
65
+ future version unintentionally. If it is difficult for you to run
66
+ the tests then let me know.
61
67
  * Commit, do not mess with rakefile, version, or history.
62
68
  (if you want to have your own version, that is fine but
63
69
  bump version in a commit by itself I can ignore when I pull)
data/Rakefile CHANGED
@@ -37,7 +37,6 @@ end
37
37
  require 'rake/testtask'
38
38
  Rake::TestTask.new(:test) do |t|
39
39
  t.libs << 'test'
40
- t.pattern = 'test/**/test_*.rb'
41
40
  t.ruby_opts = ['-rhelper.rb']
42
41
  t.verbose = true
43
42
  end
data/lib/jiraSOAP.rb CHANGED
@@ -10,36 +10,17 @@ Handsoap.http_driver = :net_http
10
10
  require 'jiraSOAP/handsoap_extensions'
11
11
 
12
12
  require 'jiraSOAP/url'
13
- require 'jiraSOAP/macruby_extensions' if RUBY_ENGINE == 'macruby'
14
13
 
15
14
  ##
16
15
  # All the remote entities as well as the SOAP service client.
17
16
  module JIRA; end
18
17
 
19
- ##
20
- # Inspired by Gem::Deprecate from rubygems. A mixin that exposes a
21
- # method to declare deprecated methods.
22
- module JIRA::Deprecate
23
-
24
- ##
25
- # Deprecate a method that begins with `get_` by printing out a
26
- # message and then calling the original method.
27
- #
28
- # @param [Symbol] name
29
- def deprecate name
30
- define_method "get_#{name}" do |*args|
31
- $stderr.puts <<-EOM
32
- RemoteAPI#get_#{name} is deprecated and will be removed in the next release.
33
- Please use RemoteAPI##{name} instead.
34
- EOM
35
- send name, *args
36
- end
37
- end
38
-
39
- end
40
-
41
18
  require 'jiraSOAP/version'
42
19
  require 'jiraSOAP/core_extensions'
43
20
  require 'jiraSOAP/entities'
44
21
  require 'jiraSOAP/api'
45
22
  require 'jiraSOAP/jira_service'
23
+
24
+ if RUBY_ENGINE == 'macruby'
25
+ require 'jiraSOAP/macruby_extensions'
26
+ end
data/lib/jiraSOAP/api.rb CHANGED
@@ -5,8 +5,6 @@
5
5
  # Atlassian; most notably, this API tries to be more idomatically Ruby by using
6
6
  # snake case for method names, default values, varargs, etc..
7
7
  module JIRA::RemoteAPI
8
- extend JIRA::Deprecate
9
-
10
8
 
11
9
  # @group Logging in/out
12
10
 
@@ -17,10 +15,9 @@ module JIRA::RemoteAPI
17
15
  # @param [String] password
18
16
  # @return [String] auth_token if successful, otherwise raises an exception
19
17
  def login username, password
20
- response = soap_call 'login', username, password
21
- self.auth_token = response.first.content
22
- @user = user
23
- self.auth_token
18
+ response = soap_call 'login', username, password
19
+ @user = username
20
+ @auth_token = response.first.content
24
21
  end
25
22
  alias_method :log_in, :login
26
23
 
@@ -29,7 +26,10 @@ module JIRA::RemoteAPI
29
26
  # will automatically expire after a set time (configured on the server).
30
27
  # @return [Boolean] true if successful, otherwise false
31
28
  def logout
32
- jira_call( 'logout' ).to_boolean
29
+ jira_call( 'logout' ).to_boolean.tap do |_|
30
+ @user = nil
31
+ @auth_token = nil
32
+ end
33
33
  end
34
34
  alias_method :log_out, :logout
35
35
 
@@ -67,7 +67,7 @@ module JIRA::RemoteAPI
67
67
  # @return [Nokogiri::XML::NodeSet]
68
68
  def soap_call method, *args
69
69
  response = build method, *args
70
- response .document.element/RESPONSE_XPATH
70
+ response .document.native_element/RESPONSE_XPATH
71
71
  end
72
72
 
73
73
  ##
@@ -101,6 +101,7 @@ require 'jiraSOAP/api/additions'
101
101
  require 'jiraSOAP/api/attachments'
102
102
  require 'jiraSOAP/api/avatars'
103
103
  require 'jiraSOAP/api/comments'
104
+ require 'jiraSOAP/api/components'
104
105
  require 'jiraSOAP/api/filters'
105
106
  require 'jiraSOAP/api/issue_data_types'
106
107
  require 'jiraSOAP/api/issues'
@@ -3,7 +3,6 @@
3
3
  # SOAP API javadoc. They are generally close to something from the javadoc
4
4
  # but with some extra conveniences.
5
5
  module JIRA::RemoteAPIAdditions
6
- extend JIRA::Deprecate
7
6
 
8
7
  ##
9
8
  # Returns the first field that exactly matches the given
@@ -14,6 +13,5 @@ module JIRA::RemoteAPIAdditions
14
13
  def custom_field_with_name name
15
14
  get_custom_fields.find { |cf| cf.name == name }
16
15
  end
17
- deprecate :custom_field_with_name
18
16
 
19
17
  end
@@ -13,21 +13,64 @@ module JIRA::RemoteAPI
13
13
  # @todo change method name to reflect that you only get metadata
14
14
  #
15
15
  # @param [String] issue_key
16
- # @return [Array<JIRA::AttachmentMetadata>]
16
+ # @return [Array<JIRA::Attachment>]
17
17
  def attachments_for_issue_with_key issue_key
18
- array_jira_call JIRA::AttachmentMetadata, 'getAttachmentsFromIssue', issue_key
18
+ array_jira_call JIRA::Attachment, 'getAttachmentsFromIssue', issue_key
19
19
  end
20
- deprecate :attachments_for_issue_with_key
21
20
 
22
21
  ##
23
- # Expect this method to be slow.
22
+ # @note Expect this method to be slow.
23
+ #
24
+ # Uploads attachments to an issue using the `addBase64EncodedAttachmentsToIssue`
25
+ # SOAP method.
26
+ #
27
+ # The metadata is not automatically refreshed by this method. To get the
28
+ # updated metadata (e.g., `file_size` and `content_type`), call
29
+ # {RemoteAPI#attachments_for_issue_with_key}.
24
30
  #
25
31
  # @param [String] issue_key
26
- # @param [Array<String>] filenames names to put on the files
27
- # @param [Array<String>] data base64 encoded data
32
+ # @param [Array<JIRA::Attachment>] attachments files to be uploaded;
33
+ # their `content` attributes should populated with the data
28
34
  # @return [Boolean] true if successful
35
+ def add_attachments_to_issue_with_key issue_key, *attachments
36
+ invoke('soap:addBase64EncodedAttachmentsToIssue') { |msg|
37
+ msg.add 'soap:in0', self.auth_token
38
+ msg.add 'soap:in1', issue_key
39
+ msg.add 'soap:in2' do |submsg|
40
+ attachments.each { |attachment| submsg.add 'filenames', attachment.filename }
41
+ end
42
+ msg.add 'soap:in3' do |submsg|
43
+ attachments.each { |attachment| submsg.add 'base64EncodedData', [attachment.content].pack('m0') }
44
+ end
45
+ }
46
+ true
47
+ end
48
+
49
+ ##
50
+ # @deprecated This will be removed in the next release (either 0.11 or 1.0)
51
+ #
52
+ # (see #add_attachments_to_issue_with_key)
53
+ #
54
+ # @param [String] issue_key
55
+ # @param [Array<String>] filenames array of names for attachments
56
+ # @param [Array<String>] data base64 encoded data for upload
57
+ # @return [Boolean] true if successful, otherwise an exception is raised
29
58
  def add_base64_encoded_attachments_to_issue_with_key issue_key, filenames, data
30
- jira_call 'addBase64EncodedAttachmentsToIssue', issue_key, filenames, data
59
+ $stderr.puts <<-EOM
60
+ RemoteAPI#add_base64_encoded_attachments_to_issue_with_key is deprecated and will be removed in the next release.
61
+ Please use RemoteAPI#add_attachments_to_issue_with_key instead.
62
+ EOM
63
+
64
+ invoke('soap:addBase64EncodedAttachmentsToIssue') { |msg|
65
+ msg.add 'soap:in0', self.auth_token
66
+ msg.add 'soap:in1', issue_key
67
+ msg.add 'soap:in2' do |submsg|
68
+ filenames.each { |filename| submsg.add 'filenames', filename }
69
+ end
70
+ msg.add 'soap:in3' do |submsg|
71
+ data.each { |datum| submsg.add 'base64EncodedData', datum }
72
+ end
73
+ }
31
74
  true
32
75
  end
33
76
 
@@ -11,7 +11,6 @@ module JIRA::RemoteAPI
11
11
  def project_avatar_for_key project_key
12
12
  JIRA::Avatar.new_with_xml jira_call('getProjectAvatar', project_key)
13
13
  end
14
- deprecate :project_avatar_for_key
15
14
 
16
15
  ##
17
16
  # Gets ALL avatars for a given project with this method; if you
@@ -23,7 +22,6 @@ module JIRA::RemoteAPI
23
22
  def project_avatars_for_key project_key, include_default_avatars = false
24
23
  array_jira_call JIRA::Avatar, 'getProjectAvatars', project_key, include_default_avatars
25
24
  end
26
- deprecate :project_avatars_for_key
27
25
 
28
26
  ##
29
27
  # @note You cannot delete system avatars, and you need project
@@ -15,14 +15,12 @@ module JIRA::RemoteAPI
15
15
  def comment_with_id id
16
16
  JIRA::Comment.new_with_xml jira_call( 'getComment', id )
17
17
  end
18
- deprecate :comment_with_id
19
18
 
20
19
  # @param [String] issue_key
21
20
  # @return [Array<JIRA::Comment>]
22
21
  def comments_for_issue_with_key issue_key
23
22
  array_jira_call JIRA::Comment, 'getComments', issue_key
24
23
  end
25
- deprecate :comments_for_issue_with_key
26
24
 
27
25
  # @param [JIRA::Comment] comment
28
26
  # @return [JIRA::Comment]
@@ -0,0 +1,13 @@
1
+ module JIRA::RemoteAPI
2
+ # @group Components
3
+
4
+ ##
5
+ # Lists a project's components
6
+ #
7
+ # @param [String] project_key
8
+ # @return [Array<JIRA::Component>]
9
+ def components_for_project_with_key project_key
10
+ array_jira_call JIRA::Component, 'getComponents', project_key
11
+ end
12
+
13
+ end
@@ -10,14 +10,11 @@ module JIRA::RemoteAPI
10
10
  array_jira_call JIRA::Filter, 'getFavouriteFilters'
11
11
  end
12
12
  alias_method :favorite_filters, :favourite_filters
13
- deprecate :favorite_filters
14
- deprecate :favourite_filters
15
13
 
16
14
  # @param [String] id
17
15
  # @return [Fixnum]
18
16
  def issue_count_for_filter_with_id id
19
17
  jira_call( 'getIssueCountForFilter', id ).to_i
20
18
  end
21
- deprecate :issue_count_for_filter_with_id
22
19
 
23
20
  end
@@ -6,51 +6,43 @@ module JIRA::RemoteAPI
6
6
  def priorities
7
7
  array_jira_call JIRA::Priority, 'getPriorities'
8
8
  end
9
- deprecate :priorities
10
9
 
11
10
  # @return [Array<JIRA::Resolution>]
12
11
  def resolutions
13
12
  array_jira_call JIRA::Resolution, 'getResolutions'
14
13
  end
15
- deprecate :resolutions
16
14
 
17
15
  # @return [Array<JIRA::Field>]
18
16
  def custom_fields
19
17
  array_jira_call JIRA::Field, 'getCustomFields'
20
18
  end
21
- deprecate :custom_fields
22
19
 
23
20
  # @return [Array<JIRA::IssueType>]
24
21
  def issue_types
25
22
  array_jira_call JIRA::IssueType, 'getIssueTypes'
26
23
  end
27
- deprecate :issue_types
28
24
 
29
25
  # @param [String] project_name
30
26
  # @return [Array<JIRA::IssueType>]
31
27
  def issue_types_for_project_with_id project_id
32
28
  array_jira_call JIRA::IssueType, 'getIssueTypesForProject', project_id
33
29
  end
34
- deprecate :issue_types_for_project_with_id
35
30
 
36
31
  # @return [Array<JIRA::Status>]
37
32
  def statuses
38
33
  array_jira_call JIRA::Status, 'getStatuses'
39
34
  end
40
- deprecate :statuses
41
35
 
42
36
  # @return [Array<JIRA::IssueType>]
43
37
  def subtask_issue_types
44
38
  array_jira_call JIRA::IssueType, 'getSubTaskIssueTypes'
45
39
  end
46
- deprecate :subtask_issue_types
47
40
 
48
41
  # @param [String] project_id
49
42
  # @return [Array<JIRA::IssueType>]
50
43
  def subtask_issue_types_for_project_with_id project_id
51
44
  array_jira_call JIRA::IssueType, 'getSubTaskIssueTypesForProject', project_id
52
45
  end
53
- deprecate :subtask_issue_types_for_project_with_id
54
46
 
55
47
  ##
56
48
  # @todo find out what this method does
@@ -20,7 +20,6 @@ module JIRA::RemoteAPI
20
20
  def issues_from_jql_search jql_query, max_results = 2000
21
21
  array_jira_call JIRA::Issue, 'getIssuesFromJqlSearch', jql_query, max_results
22
22
  end
23
- deprecate :issues_from_jql_search
24
23
 
25
24
  ##
26
25
  # This method can update most, but not all, issue fields. Some limitations
@@ -107,14 +106,12 @@ module JIRA::RemoteAPI
107
106
  def issue_with_key issue_key
108
107
  JIRA::Issue.new_with_xml jira_call( 'getIssue', issue_key )
109
108
  end
110
- deprecate :issue_with_key
111
109
 
112
110
  # @param [String] issue_id
113
111
  # @return [JIRA::Issue]
114
112
  def issue_with_id issue_id
115
113
  JIRA::Issue.new_with_xml jira_call( 'getIssueById', issue_id )
116
114
  end
117
- deprecate :issue_with_id
118
115
 
119
116
  # @param [String] id
120
117
  # @param [Fixnum] max_results
@@ -123,21 +120,18 @@ module JIRA::RemoteAPI
123
120
  def issues_from_filter_with_id id, max_results = 500, offset = 0
124
121
  array_jira_call JIRA::Issue, 'getIssuesFromFilterWithLimit', id, offset, max_results
125
122
  end
126
- deprecate :issues_from_filter_with_id
127
123
 
128
124
  # @param [String] issue_id
129
125
  # @return [Time]
130
126
  def resolution_date_for_issue_with_id issue_id
131
127
  jira_call( 'getResolutionDateById', issue_id ).to_iso_date
132
128
  end
133
- deprecate :resolution_date_for_issue_with_id
134
129
 
135
130
  # @param [String] issue_key
136
131
  # @return [Time]
137
132
  def resolution_date_for_issue_with_key issue_key
138
133
  jira_call( 'getResolutionDateByKey', issue_key ).to_iso_date
139
134
  end
140
- deprecate :resolution_date_for_issue_with_key
141
135
 
142
136
  ##
143
137
  # This method acts like {#update_issue} except that it also updates
@@ -153,7 +147,7 @@ module JIRA::RemoteAPI
153
147
  # @return [JIRA::Issue]
154
148
  def progress_workflow_action issue_key, action_id, *field_values
155
149
  JIRA::Issue.new_with_xml jira_call('progressWorkflowAction',
156
- issue_key, action_id_string, field_values)
150
+ issue_key, action_id, field_values)
157
151
  end
158
152
 
159
153
  ##
@@ -164,6 +158,5 @@ module JIRA::RemoteAPI
164
158
  def available_actions issue_key
165
159
  array_jira_call JIRA::NamedEntity, 'getAvailableActions', issue_key
166
160
  end
167
- deprecate :available_actions
168
161
 
169
162
  end
@@ -6,14 +6,12 @@ module JIRA::RemoteAPI
6
6
  def project_roles
7
7
  array_jira_call JIRA::ProjectRole, 'getProjectRoles'
8
8
  end
9
- deprecate :project_roles
10
9
 
11
10
  # @param [String] role_id
12
11
  # @return [JIRA::ProjectRole]
13
12
  def project_role_with_id role_id
14
13
  JIRA::ProjectRole.new_with_xml jira_call( 'getProjectRole', role_id )
15
14
  end
16
- deprecate :project_role_with_id
17
15
 
18
16
  # @param [JIRA::ProjectRole] project_role
19
17
  # @return [JIRA::ProjectRole] the role that was created
@@ -12,14 +12,12 @@ module JIRA::RemoteAPI
12
12
  def project_with_key project_key
13
13
  JIRA::Project.new_with_xml jira_call( 'getProjectByKey', project_key )
14
14
  end
15
- deprecate :project_with_key
16
15
 
17
16
  # @param [String] project_id
18
17
  # @return [JIRA::Project]
19
18
  def project_with_id project_id
20
19
  JIRA::Project.new_with_xml jira_call( 'getProjectById', project_id )
21
20
  end
22
- deprecate :project_with_id
23
21
 
24
22
  ##
25
23
  # @todo Parse the permission scheme
@@ -30,7 +28,6 @@ module JIRA::RemoteAPI
30
28
  def project_including_schemes_with_id project_id
31
29
  JIRA::Project.new_with_xml jira_call( 'getProjectWithSchemesById', project_id )
32
30
  end
33
- deprecate :project_including_schemes_with_id
34
31
 
35
32
  ##
36
33
  # @note This will not fill in {JIRA::Scheme} data for the projects.
@@ -40,8 +37,6 @@ module JIRA::RemoteAPI
40
37
  array_jira_call JIRA::Project, 'getProjectsNoSchemes'
41
38
  end
42
39
  alias_method :projects_without_schemes, :projects
43
- deprecate :projects
44
- deprecate :projects_without_schemes
45
40
 
46
41
  ##
47
42
  # Requires you to set at least a project name, key, and lead.
@@ -6,12 +6,10 @@ module JIRA::RemoteAPI
6
6
  def notification_schemes
7
7
  array_jira_call JIRA::NotificationScheme, 'getNotificationSchemes'
8
8
  end
9
- deprecate :notification_schemes
10
9
 
11
10
  # @return [Array<JIRA::PermissionScheme>]
12
11
  def permission_schemes
13
12
  array_jira_call JIRA::PermissionScheme, 'getPermissionSchemes'
14
13
  end
15
- deprecate :permission_schemes
16
14
 
17
15
  end
@@ -9,12 +9,10 @@ module JIRA::RemoteAPI
9
9
  def server_info
10
10
  JIRA::ServerInfo.new_with_xml jira_call( 'getServerInfo' )
11
11
  end
12
- deprecate :server_info
13
12
 
14
13
  # @return [JIRA::ServerConfiguration]
15
14
  def server_configuration
16
15
  JIRA::ServerConfiguration.new_with_xml jira_call( 'getConfiguration' )
17
16
  end
18
- deprecate :server_configuration
19
17
 
20
18
  end
@@ -7,7 +7,6 @@ module JIRA::RemoteAPI
7
7
  def user_with_name user_name
8
8
  JIRA::User.new_with_xml jira_call( 'getUser', user_name )
9
9
  end
10
- deprecate :user_with_name
11
10
 
12
11
  ##
13
12
  # It seems that creating a user without any permission groups will trigger
@@ -39,7 +38,6 @@ module JIRA::RemoteAPI
39
38
  frag = jira_call 'getGroup', group_name
40
39
  JIRA::UserGroup.new_with_xml frag
41
40
  end
42
- deprecate :group_with_name
43
41
 
44
42
  # @param [JIRA::UserGroup] group
45
43
  # @param [JIRA::User] user
@@ -7,7 +7,6 @@ module JIRA::RemoteAPI
7
7
  def versions_for_project project_key
8
8
  array_jira_call JIRA::Version, 'getVersions', project_key
9
9
  end
10
- deprecate :versions_for_project
11
10
 
12
11
  ##
13
12
  # New versions cannot have the archived bit set and the release date
@@ -18,7 +18,7 @@ require 'jiraSOAP/entities/custom_field_value'
18
18
  require 'jiraSOAP/entities/avatar'
19
19
  require 'jiraSOAP/entities/comment'
20
20
  require 'jiraSOAP/entities/version'
21
- require 'jiraSOAP/entities/attachment_metadata'
21
+ require 'jiraSOAP/entities/attachment'
22
22
 
23
23
  require 'jiraSOAP/entities/scheme'
24
24
  require 'jiraSOAP/entities/notification_scheme'
@@ -0,0 +1,59 @@
1
+ ##
2
+ # Only contains the metadata for an attachment. The URI for an attachment
3
+ # appears to be of the form
4
+ # "{JIRA::JIRAService.endpoint_url}/secure/attachment/{#id}/{#file_name}".
5
+ class JIRA::Attachment < JIRA::NamedEntity
6
+
7
+ # @return [String]
8
+ add_attribute :author, 'author', :content
9
+
10
+ # @return [String]
11
+ add_attribute :file_name, 'filename', :content
12
+ alias_method :filename, :file_name
13
+ alias_method :filename=, :file_name=
14
+
15
+ # @return [String]
16
+ add_attribute :file_name, 'filename', :content
17
+
18
+ ##
19
+ # @note This method does not allow you to read the content of an existing
20
+ # attachment on the issue; only the metadata for the attachment may
21
+ # be read at this time.
22
+ #
23
+ # Content to be used for adding attachments, using
24
+ # {RemoteAPI#add_attachments_to_issue_with_key}. Do _not_ base64 encode
25
+ # the data yourself, it will be done for you when the attachment is
26
+ # uploaded.
27
+ #
28
+ # However, attachment data coming from the server will come down in base64
29
+ # encoded format...
30
+ #
31
+ # @return [String]
32
+ attr_accessor :content
33
+
34
+ # @return [String]
35
+ add_attribute :mime_type, 'mimetype', :content
36
+ alias_method :content_type, :mime_type
37
+ alias_method :content_type=, :mime_type=
38
+
39
+ ##
40
+ # Measured in bytes
41
+ #
42
+ # @return [Number]
43
+ add_attribute :file_size, 'filesize', :to_i
44
+
45
+ # @return [Time]
46
+ add_attribute :create_time, 'created', :to_iso_date
47
+
48
+ ##
49
+ # Fetch the attachment from the server.
50
+ def attachment
51
+ raise NotImplementedError, 'Please implement me. :('
52
+ end
53
+ end
54
+
55
+ ##
56
+ # @deprecated This is just an alias, please use {JIRA::Attachment} instead
57
+ #
58
+ # Just an alias for {JIRA::Attachment}.
59
+ JIRA::AttachmentMetadata = JIRA::Attachment
@@ -4,7 +4,7 @@
4
4
  # @todo Add attributes for the comments and the attachment metadata
5
5
  #
6
6
  # Contains most of the data and metadata for a JIRA issue, but does
7
- # not contain the {JIRA::Comment}s or {JIRA::AttachmentMetadata}.
7
+ # not contain the {JIRA::Comment}s or {JIRA::Attachment}s.
8
8
  #
9
9
  # This class is easily the most convoluted structure in the API, and will
10
10
  # likely be the greatest source of bugs. The irony of the situation is that
@@ -27,11 +27,3 @@ class Handsoap::XmlMason::Node
27
27
  array.each { |element| element.soapify_for node, name }
28
28
  end
29
29
  end
30
-
31
- ##
32
- # Monkey patch to expose the underlying Nokogiri object as jiraSOAP
33
- # can parse much faster without the Handsoap layer in between.
34
- class Handsoap::XmlQueryFront::NokogiriDriver
35
- # @return [Nokogiri::XML::Element]
36
- attr_reader :element
37
- end
@@ -13,7 +13,7 @@ class JIRA::JIRAService < Handsoap::Service
13
13
  include JIRA::RemoteAPIAdditions
14
14
 
15
15
  # @return [String]
16
- attr_accessor :auth_token
16
+ attr_reader :auth_token
17
17
 
18
18
  # @return [String]
19
19
  attr_reader :user
@@ -21,6 +21,16 @@ class JIRA::JIRAService < Handsoap::Service
21
21
  # @return [String]
22
22
  attr_reader :endpoint_url
23
23
 
24
+ class << self
25
+ ##
26
+ # Expose endpoint URL
27
+ #
28
+ # @return [String]
29
+ def endpoint_url
30
+ @@endpoint_url
31
+ end
32
+ end
33
+
24
34
  ##
25
35
  # Initialize _and_ log in. Fancy.
26
36
  #
@@ -36,7 +46,7 @@ class JIRA::JIRAService < Handsoap::Service
36
46
 
37
47
  # @param [String,URI::HTTP,NSURL] endpoint for the JIRA server
38
48
  def initialize endpoint
39
- @endpoint_url = endpoint.to_s
49
+ @@endpoint_url = @endpoint_url = endpoint.to_s
40
50
  self.class.endpoint({
41
51
  uri:"#{endpoint_url}/rpc/soap/jirasoapservice-v2",
42
52
  version:2
@@ -1,4 +1,4 @@
1
1
  module JIRA
2
2
  # @return [String]
3
- VERSION = '0.9.2'
3
+ VERSION = '0.10.0'
4
4
  end
@@ -0,0 +1,203 @@
1
+ require 'base64'
2
+
3
+ # @note These tests will bloat up your server after a while
4
+ class TestAddAttachmentsToIssueWithKey < MiniTest::Unit::TestCase
5
+ setup_usual
6
+
7
+ def key
8
+ 'JIRA-1'
9
+ end
10
+
11
+ def image1
12
+ @image1 ||= "switcheroo-#{Time.now.to_f}.rb"
13
+ end
14
+
15
+ def image2
16
+ @image2 ||= "colemak-#{Time.now.to_f}.png"
17
+ end
18
+
19
+ def attachment1
20
+ @attachment ||= JIRA::Attachment.new.tap do |x|
21
+ x.content = File.read(File.join(File.dirname(__FILE__), '..', 'Rakefile'))
22
+ x.file_name = "Rakefile-#{Time.now.to_f}"
23
+ end
24
+ end
25
+
26
+ def attachment2
27
+ @attachment ||= JIRA::Attachment.new.tap do |x|
28
+ x.content = File.read(File.join(File.dirname(__FILE__), '..', 'jiraSOAP.gemspec'))
29
+ x.file_name = "Rakefile-#{Time.now.to_f}"
30
+ end
31
+ end
32
+
33
+ def test_returns_true
34
+ assert_equal true,
35
+ db.add_attachments_to_issue_with_key(key, attachment1)
36
+ end
37
+
38
+ def test_attachment_data_is_unaltered # for some definition of unaltered
39
+ skip 'Need to implement the method for getting attachments first'
40
+ end
41
+
42
+ def test_add_one_attachment
43
+ db.add_attachments_to_issue_with_key key, attachment1
44
+ issue = db.issue_with_key key
45
+ refute_nil issue.attachment_names.find { |x| x == attachment1.file_name }
46
+ end
47
+
48
+ def test_add_two_attachments
49
+ db.add_attachments_to_issue_with_key key, attachment1, attachment2
50
+ issue = db.issue_with_key key
51
+ refute_nil issue.attachment_names.find { |x| x == attachment1.file_name }
52
+ refute_nil issue.attachment_names.find { |x| x == attachment2.file_name }
53
+ end
54
+
55
+ def test_returns_true_base64
56
+ assert_equal true,
57
+ db.add_base64_encoded_attachments_to_issue_with_key(key,
58
+ [image1],
59
+ [switcheroo])
60
+ end
61
+
62
+ def test_add_one_attachment_base64
63
+ db.add_base64_encoded_attachments_to_issue_with_key(key,
64
+ [image1],
65
+ [switcheroo])
66
+ issue = db.issue_with_key key
67
+ refute_nil issue.attachment_names.find { |x| x == image1 }
68
+ end
69
+
70
+ def test_add_two_attachments_base64
71
+ db.add_base64_encoded_attachments_to_issue_with_key(key,
72
+ [image1, image2],
73
+ [switcheroo, colemak])
74
+ issue = db.issue_with_key key
75
+ refute_nil issue.attachment_names.find { |x| x == image1 }
76
+ refute_nil issue.attachment_names.find { |x| x == image2 }
77
+ end
78
+
79
+ def switcheroo
80
+ <<-EOF
81
+ IyEvdXNyL2Jpbi9lbnYgbWFjcnVieQoKZmlsZSA9IElPLnJlYWQoJ0xvY2FsaXphYmxlLnR4dCcp
82
+ LnNwbGl0KC9cbi8pLnNlbGVjdCB7IHxsaW5lfCAhbGluZS5tYXRjaCgvOyQvKS5uaWw/IH0uZWFj
83
+ aCB7IHxsaW5lfAogIG1hZ2ljID0gbGluZS5tYXRjaCAvIiguKykiXHMrPVxzKyIoLispIjsvdQoK
84
+ ICBwdXRzIDw8RU9GCiAgICAgICA8ZGljdD4KICAgICAgICAgICAgICAgPGtleT5DcmVhdGVEYXRl
85
+ PC9rZXk+CiAgICAgICAgICAgICAgIDxyZWFsPjEuMDwvcmVhbD4KICAgICAgICAgICAgICAgPGtl
86
+ eT5LZXk8L2tleT4KICAgICAgICAgICAgICAgPHN0cmluZz4jeyQxfTwvc3RyaW5nPgogICAgICAg
87
+ ICAgICAgICA8a2V5PlZhbHVlPC9rZXk+CiAgICAgICAgICAgICAgIDxzdHJpbmc+I3skMn08L3N0
88
+ cmluZz4KICAgICAgIDwvZGljdD4KRU9GCn0K
89
+ EOF
90
+ end
91
+
92
+ def colemak
93
+ <<-EOF
94
+ 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
199
+ QyL2DYZVAAAAAElFTkSuQmCC
200
+ EOF
201
+ end
202
+
203
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,65 @@
1
+ require 'jiraSOAP'
2
+
3
+ require 'rubygems'
4
+ gem 'minitest', '~> 2.5'
5
+ require 'minitest/autorun'
6
+ require 'minitest/pride'
7
+
8
+ class MiniTest::Unit::TestCase
9
+
10
+ def user
11
+ 'marada'
12
+ end
13
+
14
+ def password
15
+ 'test'
16
+ end
17
+
18
+ def host
19
+ 'http://169.254.199.62:8080'
20
+ end
21
+
22
+ def db
23
+ @db ||= JIRA::JIRAService.new host
24
+ end
25
+
26
+ def self.setup_usual
27
+ define_method :setup do
28
+ db.login user, password
29
+ end
30
+ end
31
+
32
+ def teardown
33
+ db.logout
34
+ end
35
+
36
+ def assert_instance_of_boolean value, msg = nil
37
+ if value == true || value == false
38
+ assert true
39
+ else
40
+ msg = "Expected #{mu_pp(value)} to be a boolean" unless msg
41
+ assert false, msg
42
+ end
43
+ end
44
+
45
+ end
46
+
47
+
48
+ basic = ['login_test', 'logout_test']
49
+ create = ['attachments_test']
50
+ read = basic + []
51
+ update = []
52
+ delete = []
53
+ all = basic + create + read + update + delete
54
+
55
+ # Look at environment variables to decide which tests to run
56
+ tests = case ENV['JIRASOAP']
57
+ when 'all' then all
58
+ when 'basic' then basic
59
+ when 'create' then create
60
+ when 'read' then read
61
+ when 'update' then update
62
+ when 'delete' then delete
63
+ else read # hmm, for safeties sake, but maybe it should be all...
64
+ end
65
+ tests.each do |test| require test end
@@ -0,0 +1,21 @@
1
+ class TestLogin < MiniTest::Unit::TestCase
2
+
3
+ def test_returns_token
4
+ assert_match /^[a-zA-Z0-9]+$/, db.login(user, password)
5
+ end
6
+
7
+ def test_caches_the_token
8
+ db.login(user, password)
9
+ assert_match /^[a-zA-Z0-9]+$/, db.auth_token
10
+ end
11
+
12
+ def test_caches_the_user
13
+ db.login(user, password)
14
+ assert_equal user, db.instance_variable_get(:@user)
15
+ end
16
+
17
+ def test_aliased
18
+ assert_equal db.method(:login), db.method(:log_in)
19
+ end
20
+
21
+ end
@@ -0,0 +1,30 @@
1
+ class TestLogout < MiniTest::Unit::TestCase
2
+ setup_usual
3
+
4
+ def test_normal
5
+ db.login user, password
6
+ assert db.logout
7
+ end
8
+
9
+ def test_no_session
10
+ # strongly assert is false, not nil
11
+ db.logout
12
+ assert_equal false, db.logout
13
+ end
14
+
15
+ def test_unsets_cached_attributes
16
+ db.login user, password
17
+ db.logout
18
+ assert_nil db.instance_variable_get(:@user)
19
+ assert_nil db.auth_token
20
+ end
21
+
22
+ def test_aliased
23
+ assert_equal db.method(:logout), db.method(:log_out)
24
+ end
25
+
26
+ # override since we logout during the test
27
+ def teardown
28
+ end
29
+
30
+ end
@@ -0,0 +1,25 @@
1
+ class TestProgressWorkflowAction < MiniTest::Unit::TestCase
2
+ setup_usual
3
+
4
+ def key
5
+ 'JIRA-1'
6
+ end
7
+
8
+ def test_progress_only
9
+ action = jira.available_actions(key).find do |action|
10
+ action.name == 'Close Issue'
11
+ end
12
+ db.progress_workflow_action key, action.id
13
+
14
+ action = jira.available_actions(key).find do |action|
15
+ action.name == 'Reopen Issue'
16
+ end
17
+ db.progress_workflow_action key, action.id
18
+ end
19
+
20
+ # def test_progress_and_update_field
21
+ # assignee = JIRA::FieldValue.new 'assignee', 'mrada'
22
+ # jira.progress_workflow_action 'TST-14', action.id, assignee
23
+ # end
24
+
25
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jiraSOAP
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.2
4
+ version: 0.10.0
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: 2011-08-20 00:00:00.000000000 Z
12
+ date: 2011-09-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nokogiri
16
- requirement: &70093685999780 !ruby/object:Gem::Requirement
16
+ requirement: &70273483161760 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 1.5.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70093685999780
24
+ version_requirements: *70273483161760
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: handsoap
27
- requirement: &70093686013700 !ruby/object:Gem::Requirement
27
+ requirement: &70273483161180 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 1.1.8
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70093686013700
35
+ version_requirements: *70273483161180
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: yard
38
- requirement: &70093686011780 !ruby/object:Gem::Requirement
38
+ requirement: &70273483160560 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 0.7.2
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70093686011780
46
+ version_requirements: *70273483160560
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: redcarpet
49
- requirement: &70093686008040 !ruby/object:Gem::Requirement
49
+ requirement: &70273483160040 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,18 +54,18 @@ dependencies:
54
54
  version: '1.17'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70093686008040
57
+ version_requirements: *70273483160040
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: minitest
60
- requirement: &70093686022720 !ruby/object:Gem::Requirement
60
+ requirement: &70273483159100 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
64
64
  - !ruby/object:Gem::Version
65
- version: 2.3.1
65
+ version: '2.5'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70093686022720
68
+ version_requirements: *70273483159100
69
69
  description: Written to run fast and work on Ruby 1.9 as well as MacRuby
70
70
  email:
71
71
  - markrada26@gmail.com
@@ -82,6 +82,7 @@ files:
82
82
  - lib/jiraSOAP/api/attachments.rb
83
83
  - lib/jiraSOAP/api/avatars.rb
84
84
  - lib/jiraSOAP/api/comments.rb
85
+ - lib/jiraSOAP/api/components.rb
85
86
  - lib/jiraSOAP/api/filters.rb
86
87
  - lib/jiraSOAP/api/issue_data_types.rb
87
88
  - lib/jiraSOAP/api/issues.rb
@@ -94,7 +95,7 @@ files:
94
95
  - lib/jiraSOAP/api/worklog.rb
95
96
  - lib/jiraSOAP/api.rb
96
97
  - lib/jiraSOAP/core_extensions.rb
97
- - lib/jiraSOAP/entities/attachment_metadata.rb
98
+ - lib/jiraSOAP/entities/attachment.rb
98
99
  - lib/jiraSOAP/entities/avatar.rb
99
100
  - lib/jiraSOAP/entities/comment.rb
100
101
  - lib/jiraSOAP/entities/component.rb
@@ -138,8 +139,11 @@ files:
138
139
  - lib/jiraSOAP.rb
139
140
  - .yardopts
140
141
  - Rakefile
141
- - test/jiraSOAP_test.rb
142
- - test/test_helper.rb
142
+ - test/attachments_test.rb
143
+ - test/helper.rb
144
+ - test/login_test.rb
145
+ - test/logout_test.rb
146
+ - test/progress_workflow_action_test.rb
143
147
  - README.markdown
144
148
  - ChangeLog
145
149
  - LICENSE.txt
@@ -166,10 +170,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
166
170
  version: '0'
167
171
  requirements: []
168
172
  rubyforge_project:
169
- rubygems_version: 1.8.6
173
+ rubygems_version: 1.8.5
170
174
  signing_key:
171
175
  specification_version: 3
172
176
  summary: A Ruby client for the JIRA SOAP API
173
177
  test_files:
174
- - test/jiraSOAP_test.rb
175
- - test/test_helper.rb
178
+ - test/attachments_test.rb
179
+ - test/helper.rb
180
+ - test/login_test.rb
181
+ - test/logout_test.rb
182
+ - test/progress_workflow_action_test.rb
@@ -1,35 +0,0 @@
1
- ##
2
- # Only contains the metadata for an attachment. The URI for an attachment
3
- # appears to be of the form
4
- # "{JIRA::JIRAService.endpoint_url}/secure/attachment/{#id}/{#file_name}"
5
- class JIRA::AttachmentMetadata < JIRA::NamedEntity
6
-
7
- # @return [String]
8
- add_attribute :author, 'author', :content
9
-
10
- # @return [String]
11
- add_attribute :file_name, 'filename', :content
12
- alias_method :filename, :file_name
13
- alias_method :filename=, :file_name=
14
-
15
- # @return [String]
16
- add_attribute :mime_type, 'mimetype', :content
17
- alias_method :content_type, :mime_type
18
- alias_method :content_type=, :mime_type=
19
-
20
- ##
21
- # Measured in bytes
22
- #
23
- # @return [Number]
24
- add_attribute :file_size, 'filesize', :to_i
25
-
26
- # @return [Time]
27
- add_attribute :create_time, 'created', :to_iso_date
28
-
29
- ##
30
- # Fetch the attachment from the server.
31
- def attachment
32
- raise NotImplementedError, 'Please implement me. :('
33
- end
34
-
35
- end
@@ -1,7 +0,0 @@
1
- require 'test_helper'
2
-
3
- class JirasoapTest < Mini::Test::TestCase
4
- def test_something_for_real
5
- flunk "hey buddy, you should probably rename this file and start testing for real"
6
- end
7
- end
data/test/test_helper.rb DELETED
@@ -1,11 +0,0 @@
1
- require 'rubygems'
2
- require 'mini/test'
3
-
4
- $LOAD_PATH.unshift(File.dirname(__FILE__))
5
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
6
- require 'jiraSOAP'
7
-
8
- class Mini::Test::TestCase
9
- end
10
-
11
- Mini::Test.autorun