jiraSOAP 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +17 -0
- data/LICENSE +1 -1
- data/README.markdown +5 -8
- data/lib/jiraSOAP.rb +3 -3
- data/lib/jiraSOAP/JIRAservice.rb +7 -4
- data/lib/jiraSOAP/{remoteAPI.rb → api.rb} +69 -89
- data/lib/jiraSOAP/entities.rb +26 -0
- data/lib/jiraSOAP/entities/abstract.rb +95 -0
- data/lib/jiraSOAP/entities/attachments.rb +35 -0
- data/lib/jiraSOAP/entities/avatar.rb +36 -0
- data/lib/jiraSOAP/entities/comment.rb +54 -0
- data/lib/jiraSOAP/entities/field_value.rb +73 -0
- data/lib/jiraSOAP/entities/filter.rb +26 -0
- data/lib/jiraSOAP/entities/issue.rb +166 -0
- data/lib/jiraSOAP/entities/issue_properties.rb +41 -0
- data/lib/jiraSOAP/entities/project.rb +57 -0
- data/lib/jiraSOAP/entities/read_only.rb +121 -0
- data/lib/jiraSOAP/entities/schemes.rb +25 -0
- data/lib/jiraSOAP/entities/user.rb +23 -0
- data/lib/jiraSOAP/entities/version.rb +45 -0
- data/lib/jiraSOAP/handsoap_extensions.rb +68 -0
- data/lib/{macruby_stuff.rb → jiraSOAP/macruby_bonuses.rb} +1 -1
- data/lib/jiraSOAP/url.rb +3 -3
- metadata +27 -10
- data/lib/jiraSOAP/remoteEntities.rb +0 -772
@@ -1,772 +0,0 @@
|
|
1
|
-
module JIRA
|
2
|
-
|
3
|
-
# Represents a priority level. Straightforward.
|
4
|
-
class Priority
|
5
|
-
# @return [String]
|
6
|
-
attr_accessor :id
|
7
|
-
# @return [String]
|
8
|
-
attr_accessor :name
|
9
|
-
# @return [String] is a hex value
|
10
|
-
attr_accessor :color
|
11
|
-
# @return [URL] A NSURL on MacRuby and a URI::HTTP object in CRuby
|
12
|
-
attr_accessor :icon
|
13
|
-
# @return [String]
|
14
|
-
attr_accessor :description
|
15
|
-
|
16
|
-
# Factory method that takes a fragment of a SOAP response.
|
17
|
-
# @todo change @color to be some kind of hex Fixnum object
|
18
|
-
# @param [Handsoap::XmlQueryFront::NokogiriDriver] frag
|
19
|
-
# @return [JIRA::Priority,nil]
|
20
|
-
def self.priority_with_xml_fragment(frag)
|
21
|
-
return if frag.nil?
|
22
|
-
priority = Priority.new
|
23
|
-
priority.id = frag.xpath('id').to_s
|
24
|
-
priority.name = frag.xpath('name').to_s
|
25
|
-
priority.color = frag.xpath('color').to_s
|
26
|
-
priority.description = frag.xpath('description').to_s
|
27
|
-
url = frag.xpath('icon').to_s
|
28
|
-
priority.icon = URL.new url unless url.nil?
|
29
|
-
priority
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
# Represents a resolution. Straightforward.
|
34
|
-
class Resolution
|
35
|
-
# @return [String]
|
36
|
-
attr_accessor :id
|
37
|
-
# @return [String]
|
38
|
-
attr_accessor :name
|
39
|
-
# @return [URL] A NSURL on MacRuby and a URI::HTTP object in CRuby
|
40
|
-
attr_accessor :icon
|
41
|
-
# @return [String]
|
42
|
-
attr_accessor :description
|
43
|
-
|
44
|
-
# Factory method that takes a fragment of a SOAP response.
|
45
|
-
# @param [Handsoap::XmlQueryFront::NokogiriDriver] frag
|
46
|
-
# @return [JIRA::Resolution,nil]
|
47
|
-
def self.resolution_with_xml_fragment(frag)
|
48
|
-
return if frag.nil?
|
49
|
-
resolution = Resolution.new
|
50
|
-
resolution.id = frag.xpath('id').to_s
|
51
|
-
resolution.name = frag.xpath('name').to_s
|
52
|
-
resolution.description = frag.xpath('description').to_s
|
53
|
-
url = frag.xpath('icon').to_s
|
54
|
-
resolution.icon = url unless url.nil?
|
55
|
-
resolution
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
# Represents a field mapping.
|
60
|
-
class Field
|
61
|
-
# @return [String]
|
62
|
-
attr_accessor :id
|
63
|
-
# @return [String]
|
64
|
-
attr_accessor :name
|
65
|
-
|
66
|
-
# Factory method that takes a fragment of a SOAP response.
|
67
|
-
# @param [Handsoap::XmlQueryFront::NokogiriDriver] frag
|
68
|
-
# @return [JIRA::Field,nil]
|
69
|
-
def self.field_with_xml_fragment(frag)
|
70
|
-
return if frag.nil?
|
71
|
-
field = Field.new
|
72
|
-
field.id = frag.xpath('id').to_s
|
73
|
-
field.name = frag.xpath('name').to_s
|
74
|
-
field
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
# Represents a custom field with values.
|
79
|
-
# @todo see if @key is always nil from the server
|
80
|
-
class CustomField
|
81
|
-
# @return [String]
|
82
|
-
attr_accessor :id
|
83
|
-
# @return [String]
|
84
|
-
attr_accessor :key
|
85
|
-
# @return [[String]]
|
86
|
-
attr_accessor :values
|
87
|
-
|
88
|
-
# Factory method that takes a fragment of a SOAP response.
|
89
|
-
# @param [Handsoap::XmlQueryFront::NokogiriDriver] frag
|
90
|
-
# @return [JIRA::CustomField,nil]
|
91
|
-
def self.custom_field_with_xml_fragment(frag)
|
92
|
-
return if frag.nil?
|
93
|
-
custom_field = CustomField.new
|
94
|
-
custom_field.id = frag.xpath('customfieldId').to_s
|
95
|
-
custom_field.key = frag.xpath('key').to_s
|
96
|
-
custom_field.values = frag.xpath('values/*').map { |value| value.to_s }
|
97
|
-
custom_field
|
98
|
-
end
|
99
|
-
|
100
|
-
# Generate a SOAP message fragment for the object.
|
101
|
-
# @param [Handsoap::XmlMason::Node] msg SOAP message to add the object to
|
102
|
-
# @param [String] label tag name used in wrapping tags
|
103
|
-
# @return [Handsoap::XmlMason::Element]
|
104
|
-
def soapify_for(msg, label = 'customFieldValues')
|
105
|
-
msg.add label do |submsg|
|
106
|
-
submsg.add 'customfieldId', @id
|
107
|
-
submsg.add 'key', @key
|
108
|
-
submsg.add_simple_array 'values', @values
|
109
|
-
end
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
# Represents and issue type. Straight forward.
|
114
|
-
class IssueType
|
115
|
-
# @return [String]
|
116
|
-
attr_accessor :id
|
117
|
-
# @return [String]
|
118
|
-
attr_accessor :name
|
119
|
-
# @return [URL]
|
120
|
-
attr_accessor :icon
|
121
|
-
# @return [String]
|
122
|
-
attr_accessor :description
|
123
|
-
# @return [boolean]
|
124
|
-
attr_accessor :subtask
|
125
|
-
|
126
|
-
# @return [boolean] true if the issue type is a subtask, otherwise false
|
127
|
-
def subtask?; @subtask; end
|
128
|
-
|
129
|
-
# Factory method that takes a fragment of a SOAP response.
|
130
|
-
# @param [Handsoap::XmlQueryFront::NokogiriDriver] frag
|
131
|
-
# @return [JIRA::IssueType,nil]
|
132
|
-
def self.issue_type_with_xml_fragment(frag)
|
133
|
-
return if frag.nil?
|
134
|
-
issue_type = IssueType.new
|
135
|
-
issue_type.id = frag.xpath('id').to_s
|
136
|
-
issue_type.name = frag.xpath('name').to_s
|
137
|
-
issue_type.subtask = frag.xpath('subTask').to_s == 'true'
|
138
|
-
issue_type.description = frag.xpath('description').to_s
|
139
|
-
url = frag.xpath('icon').to_s
|
140
|
-
issue_type.icon = URL.new url unless url.nil?
|
141
|
-
issue_type
|
142
|
-
end
|
143
|
-
end
|
144
|
-
|
145
|
-
# Represents a comment. Straight forward.
|
146
|
-
class Comment
|
147
|
-
# @return [String]
|
148
|
-
attr_accessor :id
|
149
|
-
# @return [String]
|
150
|
-
attr_accessor :original_author
|
151
|
-
# @return [String]
|
152
|
-
attr_accessor :role_level
|
153
|
-
# @return [String]
|
154
|
-
attr_accessor :group_level
|
155
|
-
# @return [String]
|
156
|
-
attr_accessor :body
|
157
|
-
# @return [Time]
|
158
|
-
attr_accessor :create_date
|
159
|
-
# @return [Time]
|
160
|
-
attr_accessor :last_updated
|
161
|
-
# @return [String]
|
162
|
-
attr_accessor :update_author
|
163
|
-
|
164
|
-
# Factory method that takes a fragment of a SOAP response.
|
165
|
-
# @param [Handsoap::XmlQueryFront::NokogiriDriver] frag
|
166
|
-
# @return [JIRA::Comment,nil]
|
167
|
-
def self.comment_with_xml_fragment(frag)
|
168
|
-
return if frag.nil?
|
169
|
-
comment = Comment.new
|
170
|
-
comment.id = frag.xpath('id').to_s
|
171
|
-
comment.original_author = frag.xpath('author').to_s
|
172
|
-
comment.body = frag.xpath('body').to_s
|
173
|
-
comment.group_level = frag.xpath('updateAuthor').to_s
|
174
|
-
comment.role_level = frag.xpath('roleLevel').to_s
|
175
|
-
comment.update_author = frag.xpath('updateAuthor').to_s
|
176
|
-
date = frag.xpath('created').to_s
|
177
|
-
comment.create_date = Time.xmlschema date unless date.nil?
|
178
|
-
date = frag.xpath('updated').to_s
|
179
|
-
comment.last_updated = Time.xmlschema date unless date.nil?
|
180
|
-
comment
|
181
|
-
end
|
182
|
-
|
183
|
-
# @param [Handsoap::XmlMason::Node] msg
|
184
|
-
# @return [Handsoap::XmlMason::Node]
|
185
|
-
def soapify_for(msg)
|
186
|
-
msg.add 'id', @id
|
187
|
-
msg.add 'author', @original_author
|
188
|
-
msg.add 'body', @body
|
189
|
-
msg.add 'groupLevel', @group_level
|
190
|
-
msg.add 'roleLevel', @role_level
|
191
|
-
msg.add 'updateAuthor', @update_author
|
192
|
-
end
|
193
|
-
end
|
194
|
-
|
195
|
-
# Represents a status. Straightforward.
|
196
|
-
class Status
|
197
|
-
# @return [String]
|
198
|
-
attr_accessor :id
|
199
|
-
# @return [String]
|
200
|
-
attr_accessor :name
|
201
|
-
# @return [URL]
|
202
|
-
attr_accessor :icon
|
203
|
-
# @return [String]
|
204
|
-
attr_accessor :description
|
205
|
-
|
206
|
-
# Factory method that takes a fragment of a SOAP response.
|
207
|
-
# @param [Handsoap::XmlQueryFront::NokogiriDriver] frag
|
208
|
-
# @return [JIRA::Status,nil]
|
209
|
-
def self.status_with_xml_fragment(frag)
|
210
|
-
return if frag.nil?
|
211
|
-
status = Status.new
|
212
|
-
status.id = frag.xpath('id').to_s
|
213
|
-
status.name = frag.xpath('name').to_s
|
214
|
-
status.description = frag.xpath('description').to_s
|
215
|
-
url = frag.xpath('icon').to_s
|
216
|
-
status.icon = URL.new url unless url.nil?
|
217
|
-
status
|
218
|
-
end
|
219
|
-
end
|
220
|
-
|
221
|
-
# Represents a version for a project. The description field is never
|
222
|
-
# included when you retrieve versions from the server.
|
223
|
-
# @todo find out why we don't get a description for this object
|
224
|
-
class Version
|
225
|
-
# @return [String]
|
226
|
-
attr_accessor :id
|
227
|
-
# @return [String]
|
228
|
-
attr_accessor :name
|
229
|
-
# @return [Fixnum]
|
230
|
-
attr_accessor :sequence
|
231
|
-
# @return [boolean]
|
232
|
-
attr_accessor :released
|
233
|
-
# @return [boolean]
|
234
|
-
attr_accessor :archived
|
235
|
-
# @return [Time]
|
236
|
-
attr_accessor :release_date
|
237
|
-
|
238
|
-
# @return [boolean] true if the version has been released, otherwise false
|
239
|
-
def released?; @released; end
|
240
|
-
|
241
|
-
# @return [boolean] true if the version has been archive, otherwise false
|
242
|
-
def archived?; @archived; end
|
243
|
-
|
244
|
-
# Factory method that takes a fragment of a SOAP response.
|
245
|
-
# @param [Handsoap::XmlQueryFront::NokogiriDriver] frag
|
246
|
-
# @return [JIRA::Status,nil]
|
247
|
-
def self.version_with_xml_fragment(frag)
|
248
|
-
return if frag.nil?
|
249
|
-
version = Version.new
|
250
|
-
version.id = frag.xpath('id').to_s
|
251
|
-
version.name = frag.xpath('name').to_s
|
252
|
-
version.sequence = frag.xpath('sequence').to_s.to_i
|
253
|
-
version.released = frag.xpath('released').to_s == 'true'
|
254
|
-
version.archived = frag.xpath('archived').to_s == 'true'
|
255
|
-
date = frag.xpath('releaseDate').to_s
|
256
|
-
version.release_date = Time.xmlschema date unless date.nil?
|
257
|
-
version
|
258
|
-
end
|
259
|
-
|
260
|
-
# @param [Handsoap::XmlMason::Node] msg
|
261
|
-
# @return [Handsoap::XmlMason::Node]
|
262
|
-
def soapify_for(msg)
|
263
|
-
msg.add 'name', @name
|
264
|
-
msg.add 'sequence', @sequence unless @sequence.nil?
|
265
|
-
msg.add 'releaseDate', @release_date.xmlschema unless @release_date.nil?
|
266
|
-
msg.add 'released', @released
|
267
|
-
end
|
268
|
-
end
|
269
|
-
|
270
|
-
# Represents a scheme used by the server. Not very useful for the sake of the
|
271
|
-
# API; a more useful case might be if you wanted to emulate the server's
|
272
|
-
# behaviour.
|
273
|
-
class Scheme
|
274
|
-
# @return [String]
|
275
|
-
attr_accessor :id
|
276
|
-
# @return [String]
|
277
|
-
attr_accessor :name
|
278
|
-
# @return [String]
|
279
|
-
attr_accessor :type
|
280
|
-
# @return [String]
|
281
|
-
attr_accessor :description
|
282
|
-
|
283
|
-
# Factory method that takes a fragment of a SOAP response.
|
284
|
-
# @param [Handsoap::XmlQueryFront::NokogiriDriver] frag
|
285
|
-
# @return [JIRA::Scheme,nil]
|
286
|
-
def self.scheme_with_xml_fragment(frag)
|
287
|
-
return if frag.nil?
|
288
|
-
scheme = Scheme.new
|
289
|
-
scheme.id = frag.xpath('id').to_s
|
290
|
-
scheme.name = frag.xpath('name').to_s
|
291
|
-
scheme.type = frag.xpath('type').to_s
|
292
|
-
scheme.description = frag.xpath('description').to_s
|
293
|
-
scheme
|
294
|
-
end
|
295
|
-
end
|
296
|
-
|
297
|
-
class PermissionScheme < Scheme
|
298
|
-
attr_accessor :permission_mappings
|
299
|
-
|
300
|
-
def initialize(frag)
|
301
|
-
return if frag.nil?
|
302
|
-
# @todo pain the friggin ass to figure out
|
303
|
-
end
|
304
|
-
end
|
305
|
-
|
306
|
-
# Represents a component description for a project. Straightforward.
|
307
|
-
class Component
|
308
|
-
# @return [String]
|
309
|
-
attr_accessor :id
|
310
|
-
# @return [String]
|
311
|
-
attr_accessor :name
|
312
|
-
|
313
|
-
# Factory method that takes a fragment of a SOAP response.
|
314
|
-
# @param [Handsoap::XmlQueryFront::NokogiriDriver] frag
|
315
|
-
# @return [JIRA::Component,nil]
|
316
|
-
def self.component_with_xml_fragment(frag)
|
317
|
-
return if frag.nil?
|
318
|
-
component = Component.new
|
319
|
-
component.id = frag.xpath('id').to_s
|
320
|
-
component.name = frag.xpath('name').to_s
|
321
|
-
component
|
322
|
-
end
|
323
|
-
end
|
324
|
-
|
325
|
-
# Represents a project configuration. NOT straightforward.
|
326
|
-
# You need to explicitly ask for schemes in order to get them. By
|
327
|
-
# default, most project fetching methods purposely leave out all
|
328
|
-
# the scheme information as permission schemes can be very large.
|
329
|
-
class Project
|
330
|
-
# @return [String]
|
331
|
-
attr_accessor :id
|
332
|
-
# @return [String]
|
333
|
-
attr_accessor :name
|
334
|
-
# @return [String]
|
335
|
-
attr_accessor :key
|
336
|
-
# @return [URL]
|
337
|
-
attr_accessor :url
|
338
|
-
# @return [URL]
|
339
|
-
attr_accessor :project_url
|
340
|
-
# @return [String]
|
341
|
-
attr_accessor :lead
|
342
|
-
# @return [String]
|
343
|
-
attr_accessor :description
|
344
|
-
# @return [JIRA::Scheme]
|
345
|
-
attr_accessor :issue_security_scheme
|
346
|
-
# @return [JIRA::Scheme]
|
347
|
-
attr_accessor :notification_scheme
|
348
|
-
# @return [JIRA::PermissionScheme]
|
349
|
-
attr_accessor :permission_scheme
|
350
|
-
|
351
|
-
# Factory method that takes a fragment of a SOAP response.
|
352
|
-
# @param [Handsoap::XmlQueryFront::NokogiriDriver] frag
|
353
|
-
# @return [JIRA::Project,nil]
|
354
|
-
def self.project_with_xml_fragment(frag)
|
355
|
-
return if frag.nil?
|
356
|
-
project = Project.new
|
357
|
-
project.id = frag.xpath('id').to_s
|
358
|
-
project.name = frag.xpath('name').to_s
|
359
|
-
project.key = frag.xpath('key').to_s
|
360
|
-
project.lead = frag.xpath('lead').to_s
|
361
|
-
project.description = frag.xpath('description').to_s
|
362
|
-
project.issue_security_scheme =
|
363
|
-
Scheme.scheme_with_xml_fragment frag.xpath 'issueSecurityScheme'
|
364
|
-
project.notification_scheme =
|
365
|
-
Scheme.scheme_with_xml_fragment frag.xpath 'notificationScheme'
|
366
|
-
project.permission_scheme =
|
367
|
-
PermissionScheme.scheme_with_xml_fragment frag.xpath 'permissionScheme'
|
368
|
-
url = frag.xpath('url').to_s
|
369
|
-
project.url = URL.new url unless url.nil?
|
370
|
-
url = frag.xpath('projectUrl').to_s
|
371
|
-
project.project_url = URL.new url unless url.nil?
|
372
|
-
project
|
373
|
-
end
|
374
|
-
|
375
|
-
# @todo encode the schemes
|
376
|
-
# @param [Handsoap::XmlMason::Node] msg
|
377
|
-
# @return [Handsoap::XmlMason::Node]
|
378
|
-
def soapify_for(msg)
|
379
|
-
msg.add 'id', @id
|
380
|
-
msg.add 'name', @name
|
381
|
-
msg.add 'key', @key
|
382
|
-
msg.add 'url', @url
|
383
|
-
msg.add 'projectUrl', @project_url
|
384
|
-
msg.add 'lead', @lead
|
385
|
-
msg.add 'description', @description
|
386
|
-
end
|
387
|
-
end
|
388
|
-
|
389
|
-
# Contains a base64 encoded avatar image and some metadata. Straightforward.
|
390
|
-
class Avatar
|
391
|
-
# @return [String]
|
392
|
-
attr_accessor :id
|
393
|
-
# @return [String]
|
394
|
-
attr_accessor :owner
|
395
|
-
# @return [String]
|
396
|
-
attr_accessor :type
|
397
|
-
# @return [String]
|
398
|
-
attr_accessor :content_type
|
399
|
-
# @return [String]
|
400
|
-
attr_accessor :base64_data
|
401
|
-
# @return [boolean] indicates if the image is the system default
|
402
|
-
attr_accessor :system
|
403
|
-
|
404
|
-
# @return [boolean] true if avatar is the default system avatar, else false
|
405
|
-
def system?; @system; end
|
406
|
-
|
407
|
-
# Factory method that takes a fragment of a SOAP response.
|
408
|
-
# @param [Handsoap::XmlQueryFront::NokogiriDriver] frag
|
409
|
-
# @return [JIRA::Avatar,nil]
|
410
|
-
def self.avatar_with_xml_fragment(frag)
|
411
|
-
return if frag.nil?
|
412
|
-
avatar = Avatar.new
|
413
|
-
avatar.id = frag.xpath('id').to_s
|
414
|
-
avatar.owner = frag.xpath('owner').to_s
|
415
|
-
avatar.system = frag.xpath('system').to_s == 'true'
|
416
|
-
avatar.type = frag.xpath('type').to_s
|
417
|
-
avatar.content_type = frag.xpath('contentType').to_s
|
418
|
-
avatar.base64_data = frag.xpath('base64Data').to_s
|
419
|
-
avatar
|
420
|
-
end
|
421
|
-
end
|
422
|
-
|
423
|
-
# Represents a JIRA issue; easily the most convoluted structure in the API.
|
424
|
-
# This structure and anything related directly to it will most likely be the
|
425
|
-
# greatest source of bugs.
|
426
|
-
#
|
427
|
-
# The irony of the situation is that this structure is also the most critical
|
428
|
-
# to have in working order.
|
429
|
-
#
|
430
|
-
# Issues with an UNRESOLVED status will have nil for the value of @resolution.
|
431
|
-
class Issue
|
432
|
-
# @return [String]
|
433
|
-
attr_accessor :id
|
434
|
-
# @return [String]
|
435
|
-
attr_accessor :key
|
436
|
-
# @return [String]
|
437
|
-
attr_accessor :summary
|
438
|
-
# @return [String]
|
439
|
-
attr_accessor :description
|
440
|
-
# @return [String]
|
441
|
-
attr_accessor :type_id
|
442
|
-
# @return [Time]
|
443
|
-
attr_accessor :last_updated
|
444
|
-
# @return [Fixnum]
|
445
|
-
attr_accessor :votes
|
446
|
-
# @return [String]
|
447
|
-
attr_accessor :status_id
|
448
|
-
# @return [String]
|
449
|
-
attr_accessor :assignee_name
|
450
|
-
# @return [String]
|
451
|
-
attr_accessor :reporter_name
|
452
|
-
# @return [String]
|
453
|
-
attr_accessor :priority_id
|
454
|
-
# @return [String]
|
455
|
-
attr_accessor :project_name
|
456
|
-
# @return [[JIRA::Version]]
|
457
|
-
attr_accessor :affects_versions
|
458
|
-
# @return [Time]
|
459
|
-
attr_accessor :create_date
|
460
|
-
# @return [Time]
|
461
|
-
attr_accessor :due_date
|
462
|
-
# @return [[JIRA::Version]]
|
463
|
-
attr_accessor :fix_versions
|
464
|
-
# @return [String]
|
465
|
-
attr_accessor :resolution_id
|
466
|
-
# @return [String]
|
467
|
-
attr_accessor :environment
|
468
|
-
# @return [[JIRA::Component]]
|
469
|
-
attr_accessor :components
|
470
|
-
# @return [[String]]
|
471
|
-
attr_accessor :attachment_names
|
472
|
-
# @return [[JIRA::CustomField]]
|
473
|
-
attr_accessor :custom_field_values
|
474
|
-
|
475
|
-
# Factory method that takes a fragment of a SOAP response.
|
476
|
-
# @param [Handsoap::XmlQueryFront::NokogiriDriver] frag
|
477
|
-
# @return [JIRA::Issue,nil]
|
478
|
-
def self.issue_with_xml_fragment(frag)
|
479
|
-
return if frag.nil?
|
480
|
-
issue = Issue.new
|
481
|
-
issue.affects_versions = frag.xpath('affectsVersions/*').map { |frag|
|
482
|
-
Version.version_with_xml_fragment frag
|
483
|
-
}
|
484
|
-
issue.fix_versions = frag.xpath('fixVersions/*').map { |frag|
|
485
|
-
Version.version_with_xml_fragment frag
|
486
|
-
}
|
487
|
-
issue.components = frag.xpath('components/*').map { |frag|
|
488
|
-
Component.component_with_xml_fragment frag
|
489
|
-
}
|
490
|
-
issue.custom_field_values = frag.xpath('customFieldValues/*').map { |frag|
|
491
|
-
CustomField.custom_field_with_xml_fragment frag
|
492
|
-
}
|
493
|
-
issue.attachment_names = frag.xpath('attachmentNames/*').map { |name|
|
494
|
-
name.to_s
|
495
|
-
}
|
496
|
-
issue.id = frag.xpath('id').to_s
|
497
|
-
issue.key = frag.xpath('key').to_s
|
498
|
-
issue.summary = frag.xpath('summary').to_s
|
499
|
-
issue.description = frag.xpath('description').to_s
|
500
|
-
issue.type_id = frag.xpath('type').to_s
|
501
|
-
issue.votes = frag.xpath('votes').to_s.to_i
|
502
|
-
issue.status_id = frag.xpath('status').to_s
|
503
|
-
issue.assignee_name = frag.xpath('assignee').to_s
|
504
|
-
issue.reporter_name = frag.xpath('reporter').to_s
|
505
|
-
issue.priority_id = frag.xpath('priority').to_s
|
506
|
-
issue.project_name = frag.xpath('project').to_s
|
507
|
-
issue.resolution_id = frag.xpath('resolution').to_s
|
508
|
-
issue.environment = frag.xpath('environment').to_s
|
509
|
-
date = frag.xpath('updated').to_s
|
510
|
-
issue.last_updated = Time.xmlschema date unless date.nil?
|
511
|
-
date = frag.xpath('updated').to_s
|
512
|
-
issue.create_date = Time.xmlschema date unless date.nil?
|
513
|
-
date = frag.xpath('updated').to_s
|
514
|
-
issue.due_date = Time.xmlschema date unless date.nil?
|
515
|
-
issue
|
516
|
-
end
|
517
|
-
|
518
|
-
# Generate the SOAP message fragment for an issue. Can you spot the oddities
|
519
|
-
# and inconsistencies? (hint: there are many).
|
520
|
-
#
|
521
|
-
# We don't bother including fields that are ignored. I tried to only
|
522
|
-
# ignore fields that will never be needed at creation time, but I may have
|
523
|
-
# messed up.
|
524
|
-
#
|
525
|
-
# We don't wrap the whole thing in 'issue' tags for
|
526
|
-
# {#RemoteAPI#create_issue_with_issue} calls; this is an inconsistency in the
|
527
|
-
# way jiraSOAP works and may need to be worked around for other {RemoteAPI}
|
528
|
-
# methods.
|
529
|
-
#
|
530
|
-
# Servers only seem to accept issues if components/versions are just ids
|
531
|
-
# and do not contain the rest of the {JIRA::Component}/{JIRA::Version}
|
532
|
-
# structure.
|
533
|
-
#
|
534
|
-
# To get the automatic assignee we pass '-1' as the value for @assignee.
|
535
|
-
#
|
536
|
-
# Passing an environment/due date field with a value of nil causes the
|
537
|
-
# server to complain about the formatting of the message.
|
538
|
-
# @param [Handsoap::XmlMason::Node] msg message the node to add the object to
|
539
|
-
def soapify_for(msg)
|
540
|
-
#might be going away, since it appears to have no effect at creation time
|
541
|
-
msg.add 'reporter', @reporter_name unless @reporter.nil?
|
542
|
-
|
543
|
-
msg.add 'priority', @priority_id
|
544
|
-
msg.add 'type', @type_id
|
545
|
-
msg.add 'project', @project_name
|
546
|
-
|
547
|
-
msg.add 'summary', @summary
|
548
|
-
msg.add 'description', @description
|
549
|
-
|
550
|
-
msg.add 'components' do |submsg|
|
551
|
-
(@components || []).each { |component|
|
552
|
-
submsg.add 'components' do |component_msg|
|
553
|
-
component_msg.add 'id', component.id
|
554
|
-
end
|
555
|
-
}
|
556
|
-
end
|
557
|
-
msg.add 'affectsVersions' do |submsg|
|
558
|
-
(@affects_versions || []).each { |version|
|
559
|
-
submsg.add 'affectsVersions' do |version_msg|
|
560
|
-
version_msg.add 'id', version.id
|
561
|
-
end
|
562
|
-
}
|
563
|
-
end
|
564
|
-
msg.add 'fixVersions' do |submsg|
|
565
|
-
(@fix_versions || []).each { |version|
|
566
|
-
submsg.add 'fixVersions' do |version_msg|
|
567
|
-
version_msg.add 'id', version.id end
|
568
|
-
}
|
569
|
-
end
|
570
|
-
|
571
|
-
msg.add 'assignee', (@assignee_name || '-1')
|
572
|
-
msg.add_complex_array 'customFieldValues', (@custom_field_values || [])
|
573
|
-
|
574
|
-
msg.add 'environment', @environment unless @environment.nil?
|
575
|
-
msg.add 'duedate', @due_date.xmlschema unless @due_date.nil?
|
576
|
-
end
|
577
|
-
end
|
578
|
-
|
579
|
-
# Contains the basic information about a user. Straightforward.
|
580
|
-
class User
|
581
|
-
# @return [String]
|
582
|
-
attr_accessor :name
|
583
|
-
# @return [String]
|
584
|
-
attr_accessor :full_name
|
585
|
-
# @return [String]
|
586
|
-
attr_accessor :email
|
587
|
-
|
588
|
-
# Factory method that takes a fragment of a SOAP response.
|
589
|
-
# @param [Handsoap::XmlQueryFront::NokogiriDriver] frag
|
590
|
-
# @return [JIRA::User,nil]
|
591
|
-
def self.user_with_xml_fragment(frag)
|
592
|
-
return if frag.nil?
|
593
|
-
user = User.new
|
594
|
-
user.name = frag.xpath('name').to_s
|
595
|
-
user.full_name = frag.xpath('fullname').to_s
|
596
|
-
user.email = frag.xpath('email').to_s
|
597
|
-
user
|
598
|
-
end
|
599
|
-
end
|
600
|
-
|
601
|
-
# A structure that is a bit of a hack. It is essentially just a key-value pair
|
602
|
-
# that is used mainly by {RemoteAPI#update_issue}.
|
603
|
-
class FieldValue
|
604
|
-
# @return [String]
|
605
|
-
attr_accessor :id
|
606
|
-
# @return [[String,Time,URL,JIRA::*,nil]] hard to say what the type should be
|
607
|
-
attr_accessor :values
|
608
|
-
|
609
|
-
# Factory method that gives you a nil value for the given id.
|
610
|
-
# @param [String] id name of the field for @values
|
611
|
-
# @return [JIRA::FieldValue] Will always have @values = [nil]
|
612
|
-
def self.field_value_with_nil_values(id)
|
613
|
-
fv = FieldValue.new
|
614
|
-
fv.id = id
|
615
|
-
fv.values = [nil]
|
616
|
-
fv
|
617
|
-
end
|
618
|
-
|
619
|
-
# Generate the SOAP message fragment for a field value.
|
620
|
-
# @param [Handsoap::XmlMason::Node] message the node to add the object to
|
621
|
-
# @param [String] label name for the tags that wrap the message
|
622
|
-
# @return [Handsoap::XmlMason::Element]
|
623
|
-
def soapify_for(message, label = 'fieldValue')
|
624
|
-
message.add label do |message|
|
625
|
-
message.add 'id', @id
|
626
|
-
message.add_simple_array 'values', @values
|
627
|
-
end
|
628
|
-
end
|
629
|
-
end
|
630
|
-
|
631
|
-
# Only contains the meta-data for an attachment. The URI for an attachment
|
632
|
-
# appears to be of the form
|
633
|
-
# $ENDPOINT_URL/secure/attachment/$ATTACHMENT_ID/$ATTACHMENT_FILENAME
|
634
|
-
class AttachmentMetadata
|
635
|
-
# @return [String]
|
636
|
-
attr_accessor :id
|
637
|
-
# @return [String]
|
638
|
-
attr_accessor :author
|
639
|
-
# @return [Time]
|
640
|
-
attr_accessor :create_date
|
641
|
-
# @return [String]
|
642
|
-
attr_accessor :filename
|
643
|
-
# @return [Fixnum] measured in @todo units
|
644
|
-
attr_accessor :file_size
|
645
|
-
# @return [String]
|
646
|
-
attr_accessor :mime_type
|
647
|
-
|
648
|
-
# Factory method that takes a fragment of a SOAP response.
|
649
|
-
# @param [Handsoap::XmlQueryFront::NokogiriDriver] frag
|
650
|
-
# @return [JIRA::Attachment,nil]
|
651
|
-
def self.attachment_with_xml_fragment(frag)
|
652
|
-
return if frag.nil?
|
653
|
-
attachment = AttachmentMetadata.new
|
654
|
-
attachment.id = frag.xpath('id').to_s
|
655
|
-
attachment.author = frag.xpath('author').to_s
|
656
|
-
attachment.filename = frag.xpath('filename').to_s
|
657
|
-
attachment.file_size = frag.xpath('filesize').to_s.to_i
|
658
|
-
attachment.mime_type = frag.xpath('mimetype').to_s
|
659
|
-
date = frag.xpath('created').to_s
|
660
|
-
attachment.create_date = Time.xmlschema date unless date.nil?
|
661
|
-
attachment
|
662
|
-
end
|
663
|
-
end
|
664
|
-
|
665
|
-
# Only contains basic information about the endpoint server.
|
666
|
-
# @todo turn attributes back to read-only by not using a factory for init
|
667
|
-
class ServerInfo
|
668
|
-
# @return [URL]
|
669
|
-
attr_accessor :base_url
|
670
|
-
# @return [Time]
|
671
|
-
attr_accessor :build_date
|
672
|
-
# @return [Fixnum]
|
673
|
-
attr_accessor :build_number
|
674
|
-
# @return [String]
|
675
|
-
attr_accessor :edition
|
676
|
-
# @return [JIRA::TimeInfo]
|
677
|
-
attr_accessor :server_time
|
678
|
-
# @return [String]
|
679
|
-
attr_accessor :version
|
680
|
-
|
681
|
-
# Factory method that takes a fragment of a SOAP response.
|
682
|
-
# @param [Handsoap::XmlQueryFront::NokogiriDriver] frag
|
683
|
-
# @return [JIRA::ServerInfo,nil]
|
684
|
-
def self.server_info_with_xml_fragment(frag)
|
685
|
-
return if frag.nil?
|
686
|
-
server_info = ServerInfo.new
|
687
|
-
server_info.build_number = frag.xpath('buildNumber').to_s.to_i
|
688
|
-
server_info.edition = frag.xpath('edition').to_s
|
689
|
-
server_info.version = frag.xpath('version').to_s
|
690
|
-
date = frag.xpath('buildDate').to_s
|
691
|
-
server_info.build_date = Time.xmlschema date unless date.nil?
|
692
|
-
server_info.server_time =
|
693
|
-
TimeInfo.time_info_with_xml_fragment frag.xpath 'serverTime'
|
694
|
-
url = frag.xpath('baseUrl').to_s
|
695
|
-
server_info.base_url = URL.new url unless url.nil?
|
696
|
-
server_info
|
697
|
-
end
|
698
|
-
end
|
699
|
-
|
700
|
-
# Simple structure for a time and time zone; used oddly.
|
701
|
-
# The only place this structure is used is when #get_server_info is called.
|
702
|
-
# @todo turn attributes back to read-only by not using a factory for init
|
703
|
-
class TimeInfo
|
704
|
-
# @return [Time]
|
705
|
-
attr_accessor :server_time
|
706
|
-
# @return [String]
|
707
|
-
attr_accessor :timezone
|
708
|
-
|
709
|
-
# Factory method that takes a fragment of a SOAP response.
|
710
|
-
# @param [Handsoap::XmlQueryFront::NokogiriDriver] frag
|
711
|
-
# @return [JIRA::TimeInfo,nil]
|
712
|
-
def self.time_info_with_xml_fragment(frag)
|
713
|
-
return if frag.nil?
|
714
|
-
time_info = TimeInfo.new
|
715
|
-
time_info.server_time = Time.parse frag.xpath('serverTime').to_s
|
716
|
-
time_info.timezone = frag.xpath('timeZoneId').to_s
|
717
|
-
time_info
|
718
|
-
end
|
719
|
-
end
|
720
|
-
|
721
|
-
# Represents a filter
|
722
|
-
# @todo find out what @project is supposed to be for
|
723
|
-
class Filter
|
724
|
-
# @return [String]
|
725
|
-
attr_accessor :id
|
726
|
-
# @return [String]
|
727
|
-
attr_accessor :name
|
728
|
-
# @return [String]
|
729
|
-
attr_accessor :author
|
730
|
-
# @return [String]
|
731
|
-
attr_accessor :project
|
732
|
-
# @return [String]
|
733
|
-
attr_accessor :description
|
734
|
-
# @return [nil]
|
735
|
-
attr_accessor :xml
|
736
|
-
|
737
|
-
# Factory method that takes a fragment of a SOAP response.
|
738
|
-
# @param [Handsoap::XmlQueryFront::NokogiriDriver] frag
|
739
|
-
# @return [JIRA::Filter,nil]
|
740
|
-
def self.filter_with_xml_fragment(frag)
|
741
|
-
return if frag.nil?
|
742
|
-
filter = Filter.new
|
743
|
-
filter.id = frag.xpath('id').to_s
|
744
|
-
filter.name = frag.xpath('name').to_s
|
745
|
-
filter.author = frag.xpath('author').to_s
|
746
|
-
filter.project = frag.xpath('project').to_s
|
747
|
-
filter.description = frag.xpath('description').to_s
|
748
|
-
filter.xml = frag.xpath('xml').to_s
|
749
|
-
filter
|
750
|
-
end
|
751
|
-
end
|
752
|
-
|
753
|
-
# @todo documentation for this class
|
754
|
-
# @todo write a boolean accessor macro
|
755
|
-
class ServerConfiguration
|
756
|
-
attr_reader :time_tracking_hours_per_day, :time_tracking_hours_per_week
|
757
|
-
|
758
|
-
def watching_allowed?; @watching_allowed; end
|
759
|
-
def voting_allowed?; @voting_allowed; end
|
760
|
-
def unassigned_issues_allowed?; @unassigned_issues_allowed; end
|
761
|
-
def time_tracking_allowed?; @time_tracking_allowed; end
|
762
|
-
def subtasks_allowed?; @subtasks_allowed; end
|
763
|
-
def issue_linking_allowed?; @issue_linking_allowed; end
|
764
|
-
def eternal_user_management_allowed?; @external_user_management; end
|
765
|
-
def attachments_allowed?; @attachments_allowed; end
|
766
|
-
|
767
|
-
def initialize(frag = nil)
|
768
|
-
return if frag.nil?
|
769
|
-
end
|
770
|
-
end
|
771
|
-
|
772
|
-
end
|