rally_api 0.8.5 → 0.9.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/lib/rally_api.rb CHANGED
@@ -10,6 +10,7 @@ require "rally_api/rally_query"
10
10
  require "rally_api/rally_query_result"
11
11
  require "rally_api/rally_rest_json"
12
12
  require "rally_api/version"
13
+ require "rally_api/rally_collection"
13
14
 
14
15
  module RallyAPI
15
16
  end
@@ -0,0 +1,58 @@
1
+ # :stopdoc:
2
+ #Copyright (c) 2002-2012 Rally Software Development Corp. All Rights Reserved.
3
+ #Your use of this Software is governed by the terms and conditions
4
+ #of the applicable Subscription Agreement between your company and
5
+ #Rally Software Development Corp.
6
+ # :startdoc:
7
+
8
+ module RallyAPI
9
+
10
+ class RallyCollection
11
+ include Enumerable
12
+
13
+ attr_reader :results
14
+ alias :values :results
15
+
16
+ def initialize(results)
17
+ @results = results
18
+ end
19
+
20
+ def [](index)
21
+ if (index.kind_of? Fixnum)
22
+ @results[index]
23
+ else
24
+ all = @results.find_all { |object| object.name == index }
25
+ all.length == 1 ? all[0] : all
26
+ end
27
+ end
28
+
29
+ def each(&block)
30
+ if (block.parameters.length == 2)
31
+ @results.each do |record|
32
+ block.call(record.to_s, record)
33
+ end
34
+ else
35
+ @results.each &block
36
+ end
37
+ end
38
+ alias :each_value :each
39
+
40
+ def size
41
+ length
42
+ end
43
+
44
+ def length
45
+ @results.count
46
+ end
47
+
48
+ def include?(name)
49
+ self[name.to_s] != []
50
+ end
51
+
52
+ def empty?
53
+ length == 0
54
+ end
55
+
56
+ end
57
+
58
+ end
@@ -25,7 +25,7 @@ module RallyAPI
25
25
  end
26
26
 
27
27
  def to_s(*args)
28
- rally_object.to_json
28
+ get_val('Name') || get_val('_refObjectName')
29
29
  end
30
30
 
31
31
  def to_json(*args)
@@ -45,6 +45,7 @@ module RallyAPI
45
45
  @rally_object = @rally_rest.reread(rally_object, params)
46
46
  self
47
47
  end
48
+ alias :refresh :read
48
49
 
49
50
  def getref
50
51
  ref
@@ -54,6 +55,58 @@ module RallyAPI
54
55
  rally_object["_ref"]
55
56
  end
56
57
 
58
+ def camel_case_word(sym)
59
+ RallyAPI::RallyRestJson.camel_case_word(sym)
60
+ end
61
+
62
+ def elements
63
+ @rally_object.inject({}) do |elements, (key, value)|
64
+ if key.to_s.starts_with?("c_")
65
+ key = key.to_s[2..-1]
66
+ end
67
+ elements[underscore(key).to_sym] = value
68
+ elements
69
+ end
70
+ end
71
+
72
+ def oid
73
+ object_i_d
74
+ end
75
+
76
+ def username
77
+ user_name || login_name
78
+ end
79
+
80
+ def password
81
+ @rally_rest.rally_password
82
+ end
83
+
84
+ def ==(object)
85
+ object.equal?(self) ||
86
+ (object.instance_of?(self.class) &&
87
+ object.ref == ref)
88
+ end
89
+
90
+ def eql?(object)
91
+ self == (object)
92
+ end
93
+
94
+ def <=>(object)
95
+ self.ref <=> object.ref
96
+ end
97
+
98
+ def hash
99
+ self.ref.hash
100
+ end
101
+
102
+ def name
103
+ get_val('Name') || get_val('_refObjectName')
104
+ end
105
+
106
+ def to_q
107
+ @rally_object["_ref"]
108
+ end
109
+
57
110
  def rank_above(relative_rally_object)
58
111
  @rally_object = @rally_rest.rank_above(rally_object["_ref"],relative_rally_object["_ref"]).rally_object
59
112
  self
@@ -90,21 +143,55 @@ module RallyAPI
90
143
  ret_val
91
144
  end
92
145
 
146
+ #def get_val(field)
147
+ # return_val = rally_object[field]
148
+ #
149
+ # if return_val.class == Hash
150
+ # return RallyObject.new(@rally_rest, return_val)
151
+ # end
152
+ #
153
+ # if return_val.class == Array
154
+ # make_object_array(field)
155
+ # return_val = rally_object[field]
156
+ # end
157
+ #
158
+ # return_val
159
+ #end
160
+
93
161
  def get_val(field)
94
- return_val = rally_object[field]
162
+ return_val = @rally_object[field]
163
+ return_val = @rally_object["c_#{field}"] if return_val.nil?
95
164
 
96
165
  if return_val.class == Hash
166
+ if return_val.has_key?("_ref")
167
+ return read_association return_val
168
+ end
97
169
  return RallyObject.new(@rally_rest, return_val)
98
170
  end
99
171
 
100
172
  if return_val.class == Array
101
173
  make_object_array(field)
102
- return_val = rally_object[field]
174
+ return_val = @rally_object[field]
103
175
  end
104
176
 
105
177
  return_val
106
178
  end
107
179
 
180
+ def read_association(object_or_collection)
181
+ return read_collection(object_or_collection) if object_or_collection.has_key? 'Count'
182
+ return RallyObject.new(@rally_rest, @rally_rest.reread(object_or_collection)) if @rally_rest.rally_rest_api_compat
183
+ RallyObject.new(@rally_rest, object_or_collection)
184
+ end
185
+
186
+ def read_collection(collection)
187
+ results = @rally_rest.reread(collection)["Results"]
188
+ RallyCollection.new(results.collect { |object| RallyObject.new(@rally_rest, object) })
189
+ end
190
+
191
+ def underscore(camel_cased_word)
192
+ camel_cased_word.split(/(?=[A-Z])/).join('_').downcase
193
+ end
194
+
108
195
  def make_object_array(field)
109
196
  object_array = []
110
197
  rally_object[field].each do |rally_obj|
@@ -113,11 +200,6 @@ module RallyAPI
113
200
  rally_object[field] = object_array
114
201
  end
115
202
 
116
- #taken from rally_rest_api - to try to help with backwards compatibility
117
- def camel_case_word(sym)
118
- sym.to_s.split("_").map { |word| word.capitalize }.join
119
- end
120
-
121
203
  end
122
204
 
123
205
  end
@@ -28,6 +28,8 @@ module RallyAPI
28
28
  attr_accessor :type, :query_string, :fetch, :workspace, :project, :project_scope_up, :project_scope_down
29
29
  attr_accessor :order, :page_size, :limit
30
30
 
31
+ alias :pagesize :page_size
32
+
31
33
  def initialize(query_hash = nil)
32
34
  parse_query_hash(query_hash) if !query_hash.nil?
33
35
  @page_size = 200 if @page_size.nil?
@@ -8,7 +8,7 @@ module RallyAPI
8
8
  class RallyQueryResult
9
9
  include Enumerable
10
10
 
11
- attr_accessor :results, :total_result_count
11
+ attr_reader :results, :total_result_count
12
12
 
13
13
  def initialize(rally_rest, json_results)
14
14
  @results = json_results["QueryResult"]["Results"]
@@ -34,5 +34,13 @@ module RallyAPI
34
34
  @results.length
35
35
  end
36
36
 
37
+ def empty?
38
+ length == 0
39
+ end
40
+
41
+ def results #for compatiblity with code using rally_rest_api
42
+ self
43
+ end
44
+
37
45
  end
38
46
  end
@@ -49,7 +49,6 @@ module RallyAPI
49
49
  attr_accessor :rally_url, :rally_user, :rally_password, :rally_workspace_name, :rally_project_name, :wsapi_version
50
50
  attr_accessor :rally_headers, :rally_default_workspace, :rally_default_project, :low_debug, :proxy_info
51
51
  attr_accessor :rally_rest_api_compat, :logger, :rally_alias_types
52
-
53
52
  attr_reader :rally_connection
54
53
 
55
54
  def initialize(args)
@@ -143,9 +142,10 @@ module RallyAPI
143
142
  end
144
143
 
145
144
  ws_ref = fields["Workspace"]
146
- ws_ref = ws_ref["_ref"] unless ws_ref.class == String
145
+ ws_ref = ws_ref["_ref"] unless ws_ref.class == String || ws_ref.nil?
147
146
  params = { :workspace => ws_ref }
148
147
 
148
+ fields = RallyAPI::RallyRestJson.fix_case(fields) if @rally_rest_api_compat
149
149
  object2create = { type => make_ref_fields(fields) }
150
150
  args = { :method => :post, :payload => object2create }
151
151
  #json_response = @rally_connection.create_object(make_create_url(rally_type), args, object2create)
@@ -183,10 +183,10 @@ module RallyAPI
183
183
  json_response[rally_type]
184
184
  end
185
185
 
186
-
187
186
  def update(type, obj_id, fields)
188
187
  type = check_type(type)
189
188
  ref = check_id(type.to_s, obj_id)
189
+ fields = RallyAPI::RallyRestJson.fix_case(fields) if @rally_rest_api_compat
190
190
  json_update = { type.to_s => make_ref_fields(fields) }
191
191
  args = { :method => :post, :payload => json_update }
192
192
  #json_response = @rally_connection.update_object(ref, args, json_update)
@@ -194,6 +194,7 @@ module RallyAPI
194
194
  #todo check for warnings on json_response["OperationResult"]
195
195
  RallyObject.new(self, reread({"_ref" => ref}))
196
196
  end
197
+ alias :update_ref :update
197
198
 
198
199
  ##-----
199
200
  #Querying Rally example
@@ -356,14 +357,15 @@ module RallyAPI
356
357
  false
357
358
  end
358
359
 
359
- #expecting idstring to have "FormattedID|DE45" or the objectID
360
+ #expecting idstring to have "FormattedID|DE45" or the objectID or a ref itself
360
361
  def check_id(type, idstring)
361
362
  if idstring.class == Fixnum
362
363
  return make_read_url(type, idstring)
363
364
  end
364
365
 
365
- if (idstring.class == String) && (idstring.index("FormattedID") == 0)
366
- return ref_by_formatted_id(type, idstring.split("|")[1])
366
+ if (idstring.class == String)
367
+ return idstring if idstring.index("http") == 0
368
+ return ref_by_formatted_id(type, idstring.split("|")[1]) if idstring.index("FormattedID") == 0
367
369
  end
368
370
  make_read_url(type, idstring)
369
371
  end
@@ -387,14 +389,56 @@ module RallyAPI
387
389
  end
388
390
 
389
391
  def make_ref_fields(fields)
390
- fields.each do |key,val|
391
- if (val.class == RallyObject)
392
- fields[key] = val.getref
393
- end
392
+ fields.each do |key, val|
393
+ fields[key] = make_ref_field(val)
394
394
  end
395
395
  fields
396
396
  end
397
397
 
398
+ def make_ref_field(val)
399
+ return val.getref if val.kind_of? RallyObject
400
+ return val if val.kind_of? Hash
401
+ return val if val.is_a?(Hash)
402
+
403
+ if val.kind_of? Enumerable
404
+ return val.collect do |collection_element|
405
+ if collection_element.kind_of? RallyObject
406
+ {"_type" => collection_element.type, "_ref" => collection_element.getref}
407
+ else
408
+ collection_element
409
+ end
410
+ end
411
+ end
412
+
413
+ val
414
+ end
415
+
416
+ def self.fix_case(values)
417
+ values.inject({}) do |new_values, (key, value)|
418
+ new_values[camel_case_word(key)] = value.is_a?(Hash) ? fix_case(value) : value
419
+ new_values
420
+ end
421
+ end
422
+
423
+ def self.camel_case_word(sym)
424
+ word = sym.to_s
425
+
426
+ if word.start_with? ("c_")
427
+ custom_field_without_c = word.sub("c_", "")
428
+ camelized = camelize(custom_field_without_c)
429
+ camelized[0] = custom_field_without_c[0]
430
+ "c_#{camelized}"
431
+ else
432
+ camelize(word)
433
+ end
434
+ end
435
+
436
+ #implemented basic version here to not have to include ActiveSupport
437
+ def self.camelize(str)
438
+ str.split('_').map {|w| w.capitalize}.join
439
+ end
440
+
441
+
398
442
  end
399
443
 
400
444
  end
@@ -4,5 +4,5 @@
4
4
  #of the applicable Subscription Agreement between your company and
5
5
  #Rally Software Development Corp.
6
6
  module RallyAPI
7
- VERSION = "0.8.5"
7
+ VERSION = "0.9.0"
8
8
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rally_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.5
4
+ version: 0.9.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: 2013-01-14 00:00:00.000000000Z
12
+ date: 2013-01-18 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: httpclient
16
- requirement: &70344430529800 !ruby/object:Gem::Requirement
16
+ requirement: &70127257258460 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,7 +21,7 @@ dependencies:
21
21
  version: 2.2.4
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70344430529800
24
+ version_requirements: *70127257258460
25
25
  description: API wrapper for Rally's JSON REST web services api
26
26
  email:
27
27
  - dsmith@rallydev.com
@@ -33,6 +33,7 @@ files:
33
33
  - Rakefile
34
34
  - lib/rally_api/custom_http_header.rb
35
35
  - lib/rally_api/lookback_api_query.rb
36
+ - lib/rally_api/rally_collection.rb
36
37
  - lib/rally_api/rally_json_connection.rb
37
38
  - lib/rally_api/rally_object.rb
38
39
  - lib/rally_api/rally_query.rb