rally_api 0.8.1 → 0.8.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -45,7 +45,7 @@ module RallyAPI
45
45
  @rally_object[field_name] = value
46
46
  end
47
47
 
48
- def read(params = nil)
48
+ def read(params = {})
49
49
  @rally_object = @rally_rest.reread(@rally_object, params)
50
50
  self
51
51
  end
@@ -51,10 +51,10 @@ module RallyAPI
51
51
  query_params
52
52
  end
53
53
 
54
- def validate(allowed_objects)
54
+ def validate()
55
55
  errors = []
56
56
 
57
- if @type.nil?
57
+ if @type.nil? || type == ""
58
58
  errors.push("Object type for query cannot be nil")
59
59
  end
60
60
 
@@ -74,10 +74,6 @@ module RallyAPI
74
74
  errors.push("Project - #{@project} - must have a ref") if @project["_ref"].nil?
75
75
  end
76
76
 
77
- if (allowed_objects[@type.to_s].nil?)
78
- errors.push( "Object Type #{@type} is not query-able: inspect RallyRestJson.rally_objects for allowed types" )
79
- end
80
-
81
77
  errors
82
78
  end
83
79
 
@@ -30,7 +30,7 @@
30
30
  module RallyAPI
31
31
 
32
32
  #--
33
- #this contstant is here - a tradeoff of speed vs completeness- right now speed wins because it is so
33
+ #this contstant is here as a tradeoff of speed vs completeness- right now speed wins because it is so
34
34
  #expensive to query typedef and read all attributes for "OBJECT" or "COLLECTION" types
35
35
  #++
36
36
  RALLY_REF_FIELDS = { "Subscription" => :subscription, "Workspace" => :workspace, "Project" => :project,
@@ -44,15 +44,17 @@ module RallyAPI
44
44
 
45
45
  #Main Class to instantiate when using the tool
46
46
  class RallyRestJson
47
- DEFAULT_WSAPI_VERSION = "1.37"
47
+ DEFAULT_WSAPI_VERSION = "1.39"
48
48
 
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
- attr_accessor :rally_rest_api_compat, :logger
51
+ attr_accessor :rally_rest_api_compat, :logger, :rally_alias_types
52
52
 
53
- attr_reader :rally_connection, :rally_objects
53
+ attr_reader :rally_connection
54
54
 
55
55
  def initialize(args)
56
+ @rally_alias_types = { "story" => "HierarchicalRequirement", "userstory" => "HierarchicalRequirement" }
57
+
56
58
  @rally_url = args[:base_url] || "https://rally1.rallydev.com/slm"
57
59
  @rally_user = args[:username]
58
60
  @rally_password = args[:password]
@@ -62,6 +64,7 @@ module RallyAPI
62
64
  @rally_headers = args[:headers] || CustomHttpHeader.new
63
65
  @proxy_info = args[:proxy]
64
66
 
67
+ #flag to help RallyRestAPI users to use snake case field names eg Defect.fixed_in_build vs Defect["FixedInBuild"]
65
68
  @rally_rest_api_compat = args[:rally_rest_api_compat] || false
66
69
 
67
70
  @low_debug = args[:debug] || false
@@ -71,16 +74,11 @@ module RallyAPI
71
74
  @rally_connection.set_client_user(@rally_url, @rally_user, @rally_password)
72
75
  @rally_connection.logger = @logger unless @logger.nil?
73
76
 
74
- @rally_objects = { "typedefinition" => "TypeDefinition", "user" => "User", "subscription" => "Subscription",
75
- "workspace" => "Workspace", "project" => "Project" }
76
-
77
77
  if !@rally_workspace_name.nil?
78
78
  @rally_default_workspace = find_workspace(@rally_workspace_name)
79
79
  raise StandardError, "unable to find default workspace #{@rally_workspace_name}" if @rally_default_workspace.nil?
80
80
  end
81
81
 
82
- cache_rally_objects()
83
-
84
82
  if !@rally_project_name.nil?
85
83
  @rally_default_project = find_project(@rally_default_workspace, @rally_project_name)
86
84
  raise StandardError, "unable to find default project #{@rally_project_name}" if @rally_default_project.nil?
@@ -131,34 +129,37 @@ module RallyAPI
131
129
 
132
130
  def user
133
131
  args = { :method => :get }
134
- json_response = @rally_connection.send_request(make_get_url(@rally_objects["user"]), args)
132
+ json_response = @rally_connection.send_request(make_get_url("user"), args)
135
133
  rally_type = json_response.keys[0]
136
134
  RallyObject.new(self, json_response[rally_type])
137
135
  end
138
136
 
139
137
 
140
138
  def create(type, fields)
141
- rally_type = check_type(type)
142
-
139
+ type = check_type(type)
143
140
  if (fields["Workspace"].nil? && fields["Project"].nil?)
144
141
  fields["Workspace"] = @rally_default_workspace._ref unless @rally_default_workspace.nil?
145
142
  fields["Project"] = @rally_default_project._ref unless @rally_default_project.nil?
146
143
  end
147
144
 
148
- object2create = { rally_type => make_ref_fields(fields) }
145
+ ws_ref = fields["Workspace"]
146
+ ws_ref = ws_ref["_ref"] unless ws_ref.class == String
147
+ params = { :workspace => ws_ref }
148
+
149
+ object2create = { type => make_ref_fields(fields) }
149
150
  args = { :method => :post, :payload => object2create }
150
151
  #json_response = @rally_connection.create_object(make_create_url(rally_type), args, object2create)
151
- json_response = @rally_connection.send_request(make_create_url(rally_type), args)
152
+ json_response = @rally_connection.send_request(make_create_url(type), args, params)
152
153
  #todo - check for warnings
153
154
  RallyObject.new(self, json_response["CreateResult"]["Object"]).read()
154
155
  end
155
156
 
156
157
 
157
- def read(type, obj_id, params = nil)
158
- rally_type = check_type(type)
159
- ref = check_id(rally_type, obj_id)
158
+ def read(type, obj_id, params = {})
159
+ type = check_type(type)
160
+ ref = check_id(type.to_s, obj_id)
161
+ params[:workspace] = @rally_default_workspace.ref if params[:workspace].nil?
160
162
  args = { :method => :get }
161
- #json_response = @rally_connection.read_object(ref, args, params)
162
163
  json_response = @rally_connection.send_request(ref, args, params)
163
164
  rally_type = json_response.keys[0]
164
165
  RallyObject.new(self, json_response[rally_type])
@@ -171,8 +172,11 @@ module RallyAPI
171
172
  json_response["OperationResult"]
172
173
  end
173
174
 
174
- def reread(json_object, params = nil)
175
+ def reread(json_object, params = {})
175
176
  args = { :method => :get }
177
+ if params[:workspace].nil? && (json_object["Workspace"] && json_object["Workspace"]["_ref"])
178
+ params[:workspace] = json_object['Workspace']['_ref']
179
+ end
176
180
  #json_response = @rally_connection.read_object(json_object["_ref"], args, params)
177
181
  json_response = @rally_connection.send_request(json_object["_ref"], args, params)
178
182
  rally_type = json_response.keys[0]
@@ -181,9 +185,9 @@ module RallyAPI
181
185
 
182
186
 
183
187
  def update(type, obj_id, fields)
184
- rally_type = check_type(type)
185
- ref = check_id(rally_type, obj_id)
186
- json_update = { rally_type => make_ref_fields(fields) }
188
+ type = check_type(type)
189
+ ref = check_id(type.to_s, obj_id)
190
+ json_update = { type.to_s => make_ref_fields(fields) }
187
191
  args = { :method => :post, :payload => json_update }
188
192
  #json_response = @rally_connection.update_object(ref, args, json_update)
189
193
  json_response = @rally_connection.send_request(ref, args)
@@ -222,12 +226,12 @@ module RallyAPI
222
226
  query_obj.workspace = @rally_default_workspace unless @rally_default_workspace.nil?
223
227
  end
224
228
 
225
- errs = query_obj.validate(@rally_objects)
229
+ errs = query_obj.validate()
226
230
  if errs.length > 0
227
231
  raise StandardError, "Errors making Rally Query: #{errs.to_s}"
228
232
  end
229
233
 
230
- query_url = make_query_url(@rally_url, @wsapi_version, check_type(query_obj.type))
234
+ query_url = make_query_url(@rally_url, @wsapi_version, check_type(query_obj.type.to_s))
231
235
  query_params = query_obj.make_query_params
232
236
  args = {:user => @rally_user, :password => @rally_password}
233
237
  json_response = @rally_connection.get_all_json_results(query_url, args, query_params, query_obj.limit)
@@ -277,7 +281,7 @@ module RallyAPI
277
281
 
278
282
  def get_typedef_for(type)
279
283
  type = type.to_s if type.class == Symbol
280
- type = @rally_objects[type.downcase]
284
+ type = check_type(type)
281
285
  type_def_query = RallyQuery.new()
282
286
  type_def_query.type = "typedefinition"
283
287
  type_def_query.fetch = true
@@ -335,12 +339,12 @@ module RallyAPI
335
339
  "/#{ref_pieces[-2]}/#{ref_pieces[-1].split(".js")[0]}"
336
340
  end
337
341
 
342
+ #check for an alias of a type - eg userstory => hierarchicalrequirement
343
+ #you can add to @rally_alias_types as desired
338
344
  def check_type(type_name)
339
- type = @rally_objects[type_name.to_s]
340
- if type.nil?
341
- raise StandardError, "The object type #{type_name} is not valid for the wsapi"
342
- end
343
- type.gsub(" ", "") #for wsapi no space is expected
345
+ alias_name = @rally_alias_types[type_name.downcase.to_s]
346
+ return alias_name unless alias_name.nil?
347
+ return type_name
344
348
  end
345
349
 
346
350
  #ref should be like https://rally1.rallydev.com/slm/webservice/1.25/defect/12345.js
@@ -391,31 +395,6 @@ module RallyAPI
391
395
  fields
392
396
  end
393
397
 
394
- def cache_rally_objects()
395
- type_defs_query = RallyQuery.new()
396
- type_defs_query.type = "typedefinition"
397
- type_defs_query.fetch = "Name,Parent,ElementName,TypePath"
398
- type_defs_query.workspace = @rally_default_workspace unless @rally_default_workspace.nil?
399
-
400
- type_defs = find(type_defs_query)
401
- type_defs.each do |td|
402
- url_path = td.TypePath.nil? ? td.ElementName : td.TypePath
403
- @rally_objects[url_path.downcase] = url_path
404
-
405
- parent_type = td.Parent
406
- if !parent_type.nil? && (@rally_objects[parent_type.TypePath].nil?)
407
- url_path = parent_type.TypePath.nil? ? parent_type.ElementName : parent_type.TypePath
408
- @rally_objects[url_path.downcase] = url_path
409
- end
410
- end
411
-
412
- #some convenience keys to help people - someday we'll fix the api and make HR called story
413
- @rally_objects["useriterationcapacity"] = "User Iteration Capacity"
414
- @rally_objects["userpermission"] = "User Permission"
415
- @rally_objects["story"] = "Hierarchical Requirement"
416
- @rally_objects["userstory"] = "Hierarchical Requirement"
417
- end
418
-
419
398
  end
420
399
 
421
400
  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.1"
7
+ VERSION = "0.8.2"
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.1
4
+ version: 0.8.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-21 00:00:00.000000000Z
12
+ date: 2013-01-02 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: httpclient
16
- requirement: &70135989896340 !ruby/object:Gem::Requirement
16
+ requirement: &70193372021960 !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: *70135989896340
24
+ version_requirements: *70193372021960
25
25
  description: API wrapper for Rally's JSON REST web services api
26
26
  email:
27
27
  - dsmith@rallydev.com