rally_api 0.7.2 → 0.7.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +15 -9
- data/lib/rally_api/custom_http_header.rb +1 -1
- data/lib/rally_api/rally_object.rb +5 -0
- data/lib/rally_api/rally_query.rb +2 -2
- data/lib/rally_api/rally_rest_json.rb +19 -21
- data/lib/rally_api/version.rb +1 -1
- metadata +4 -4
data/README.rdoc
CHANGED
@@ -32,8 +32,14 @@ RallyAPI is a wrapper of Rally's Web Service API Json endpoints using rest-clien
|
|
32
32
|
|
33
33
|
|
34
34
|
=== Querying Rally
|
35
|
+
|
36
|
+
#type names are stored in rally.rally_objects hash, you can inspect there for a list
|
37
|
+
#Look at the TypePath for all typedefs and this is the key to each hash.
|
38
|
+
#If you pass in a symbol (for code using versions prior to 0.7.3), it will be downcased and turned into a string
|
39
|
+
# examples are: "defect", "hierarchicalrequirement", "portfolioitem/feature"
|
40
|
+
|
35
41
|
test_query = RallyAPI::RallyQuery.new()
|
36
|
-
test_query.type =
|
42
|
+
test_query.type = "defect"
|
37
43
|
test_query.fetch = "Name"
|
38
44
|
test_query.workspace = {"_ref" => "https://rally1.rallydev.com/slm/webservice/1.25/workspace/12345.js" } #optional
|
39
45
|
test_query.project = {"_ref" => "https://rally1.rallydev.com/slm/webservice/1.25/project/12345.js" } #optional
|
@@ -56,16 +62,16 @@ RallyAPI is a wrapper of Rally's Web Service API Json endpoints using rest-clien
|
|
56
62
|
|
57
63
|
#for people comfortable passing around blocks:
|
58
64
|
results = @rally.find do |q|
|
59
|
-
q.type =
|
65
|
+
q.type = "defect"
|
60
66
|
q.fetch = "Name,FormattedID"
|
61
67
|
q.query_string = "(Priority = \"Low\")"
|
62
68
|
end
|
63
69
|
|
64
70
|
|
65
71
|
=== Reading an Artifact
|
66
|
-
defect = @rally.read(
|
72
|
+
defect = @rally.read("defect", 12345) #by ObjectID
|
67
73
|
#or
|
68
|
-
defect = @rally.read(
|
74
|
+
defect = @rally.read("defect", "FormattedID|DE42") #by FormattedID
|
69
75
|
#or if you already have an object like from a query
|
70
76
|
results = @rally.find(RallyAPI::RallyQuery.new({:type => :defect, :query_string => "(FormattedID = DE42)"}))
|
71
77
|
defect = results.first
|
@@ -85,25 +91,25 @@ RallyAPI is a wrapper of Rally's Web Service API Json endpoints using rest-clien
|
|
85
91
|
=== Creating an Artifact
|
86
92
|
obj = {}
|
87
93
|
obj["Name"] = "Test Defect created #{DateTime.now()}"
|
88
|
-
new_de = @rally.create(
|
94
|
+
new_de = @rally.create("defect", obj)
|
89
95
|
puts new_de["FormattedID"]
|
90
96
|
|
91
97
|
=== Updating an Artifact
|
92
98
|
fields = {}
|
93
99
|
fields["Severity"] = "Critical"
|
94
100
|
fields["Description"] = "Description for the issue"
|
95
|
-
updated_defect = @rally.update(
|
101
|
+
updated_defect = @rally.update("defect", 12345, fields) #by ObjectID
|
96
102
|
#or
|
97
|
-
updated_defect = @rally.update(
|
103
|
+
updated_defect = @rally.update("defect", "FormattedID|DE42", fields) #by FormattedID
|
98
104
|
# or
|
99
|
-
defect = @rally.read(
|
105
|
+
defect = @rally.read("defect", 12345) #by lookup then udpating via the object
|
100
106
|
field_updates = {"Description" => "Changed Description"}
|
101
107
|
defect.update(field_updates)
|
102
108
|
|
103
109
|
=== Utils
|
104
110
|
#allowed values: pass the Artifact type string or downcased symbol and the Display Name of the field
|
105
111
|
@rally.allowed_values("Defect", "Severity")
|
106
|
-
@rally.allowed_values(
|
112
|
+
@rally.allowed_values("story", "ScheduleState")
|
107
113
|
|
108
114
|
#re-ranking: rank_above and rank_below
|
109
115
|
story1.rank_above(story2) #in a drag and drop workspace move story1 relative to story2
|
@@ -22,7 +22,7 @@ module RallyAPI
|
|
22
22
|
@os = RUBY_PLATFORM
|
23
23
|
@platform = "Ruby #{RUBY_VERSION}"
|
24
24
|
@library = "RallyRestJson version #{RallyAPI::VERSION}"
|
25
|
-
@name = "
|
25
|
+
@name = "RallyRestJsonRuby"
|
26
26
|
|
27
27
|
if custom_vals.keys.length > 0
|
28
28
|
@name = custom_vals[:name]
|
@@ -74,7 +74,7 @@ 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].nil?)
|
77
|
+
if (allowed_objects[@type.to_s].nil?)
|
78
78
|
errors.push( "Object Type #{@type} is not query-able: inspect RallyRestJson.rally_objects for allowed types" )
|
79
79
|
end
|
80
80
|
|
@@ -84,7 +84,7 @@ module RallyAPI
|
|
84
84
|
private
|
85
85
|
|
86
86
|
def parse_query_hash(query_hash)
|
87
|
-
@type = query_hash[:type]
|
87
|
+
@type = query_hash[:type].to_s
|
88
88
|
@query_string = query_hash[:query_string]
|
89
89
|
@fetch = query_hash[:fetch]
|
90
90
|
@project_scope_down = query_hash[:project_scope_down]
|
@@ -71,8 +71,8 @@ module RallyAPI
|
|
71
71
|
@rally_connection.set_client_user(@rally_url, @rally_user, @rally_password)
|
72
72
|
@rally_connection.logger = @logger unless @logger.nil?
|
73
73
|
|
74
|
-
@rally_objects = {
|
75
|
-
|
74
|
+
@rally_objects = { "typedefinition" => "TypeDefinition", "user" => "User", "subscription" => "Subscription",
|
75
|
+
"workspace" => "Workspace", "project" => "Project" }
|
76
76
|
|
77
77
|
if !@rally_workspace_name.nil?
|
78
78
|
@rally_default_workspace = find_workspace(@rally_workspace_name)
|
@@ -131,7 +131,7 @@ module RallyAPI
|
|
131
131
|
|
132
132
|
def user
|
133
133
|
args = { :method => :get }
|
134
|
-
json_response = @rally_connection.send_request(make_get_url(@rally_objects[
|
134
|
+
json_response = @rally_connection.send_request(make_get_url(@rally_objects["user"]), args)
|
135
135
|
rally_type = json_response.keys[0]
|
136
136
|
RallyObject.new(self, json_response[rally_type])
|
137
137
|
end
|
@@ -278,12 +278,12 @@ module RallyAPI
|
|
278
278
|
#todo - check support for portfolio item fields
|
279
279
|
def allowed_values(type, field)
|
280
280
|
if type.class == Symbol
|
281
|
-
query_type = @rally_objects[type]
|
281
|
+
query_type = @rally_objects[type.to_s]
|
282
282
|
else
|
283
283
|
query_type = type
|
284
284
|
end
|
285
285
|
type_defs_query = RallyQuery.new()
|
286
|
-
type_defs_query.type =
|
286
|
+
type_defs_query.type = "typedefinition"
|
287
287
|
type_defs_query.fetch = true
|
288
288
|
type_defs_query.query_string= "(ElementName = \"#{query_type}\")"
|
289
289
|
type_defs = find(type_defs_query)
|
@@ -324,10 +324,11 @@ module RallyAPI
|
|
324
324
|
end
|
325
325
|
|
326
326
|
def check_type(type_name)
|
327
|
-
|
327
|
+
type = @rally_objects[type_name.to_s]
|
328
|
+
if type.nil?
|
328
329
|
raise StandardError, "The object type #{type_name} is not valid for the wsapi"
|
329
330
|
end
|
330
|
-
|
331
|
+
type.gsub(" ", "") #for wsapi no space is expected
|
331
332
|
end
|
332
333
|
|
333
334
|
#ref should be like https://rally1.rallydev.com/slm/webservice/1.25/defect/12345.js
|
@@ -353,7 +354,7 @@ module RallyAPI
|
|
353
354
|
|
354
355
|
def ref_by_formatted_id(type, fid)
|
355
356
|
query = RallyQuery.new()
|
356
|
-
query.type = type.downcase
|
357
|
+
query.type = type.downcase
|
357
358
|
query.query_string = "(FormattedID = #{fid})"
|
358
359
|
query.limit = 20
|
359
360
|
query.fetch = "FormattedID"
|
@@ -378,32 +379,29 @@ module RallyAPI
|
|
378
379
|
fields
|
379
380
|
end
|
380
381
|
|
381
|
-
|
382
382
|
def cache_rally_objects()
|
383
383
|
type_defs_query = RallyQuery.new()
|
384
|
-
type_defs_query.type =
|
384
|
+
type_defs_query.type = "typedefinition"
|
385
385
|
type_defs_query.fetch = "Name,Parent,TypePath"
|
386
386
|
type_defs_query.workspace = @rally_default_workspace unless @rally_default_workspace.nil?
|
387
387
|
|
388
388
|
type_defs = find(type_defs_query)
|
389
389
|
type_defs.each do |td|
|
390
|
-
|
391
|
-
url_path =
|
392
|
-
@rally_objects[type_sym] = url_path
|
390
|
+
url_path = td.TypePath.nil? ? td.ElementName : td.TypePath
|
391
|
+
@rally_objects[url_path.downcase] = url_path
|
393
392
|
|
394
393
|
parent_type = td.Parent
|
395
|
-
if !parent_type.nil? && (@rally_objects[parent_type.
|
396
|
-
url_path = parent_type.TypePath.nil? ? parent_type.
|
397
|
-
@rally_objects[
|
394
|
+
if !parent_type.nil? && (@rally_objects[parent_type.TypePath].nil?)
|
395
|
+
url_path = parent_type.TypePath.nil? ? parent_type.ElementName : parent_type.TypePath
|
396
|
+
@rally_objects[url_path.downcase] = url_path
|
398
397
|
end
|
399
398
|
end
|
400
399
|
|
401
400
|
#some convenience keys to help people - someday we'll fix the api and make HR called story
|
402
|
-
@rally_objects[
|
403
|
-
@rally_objects[
|
404
|
-
@rally_objects[
|
405
|
-
@rally_objects[
|
406
|
-
|
401
|
+
@rally_objects["useriterationcapacity"] = "User Iteration Capacity"
|
402
|
+
@rally_objects["userpermission"] = "User Permission"
|
403
|
+
@rally_objects["story"] = "Hierarchical Requirement"
|
404
|
+
@rally_objects["userstory"] = "Hierarchical Requirement"
|
407
405
|
end
|
408
406
|
|
409
407
|
end
|
data/lib/rally_api/version.rb
CHANGED
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.7.
|
4
|
+
version: 0.7.3
|
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-10-
|
12
|
+
date: 2012-10-17 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: httpclient
|
16
|
-
requirement: &
|
16
|
+
requirement: &70253413466180 !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: *
|
24
|
+
version_requirements: *70253413466180
|
25
25
|
description: API wrapper for Rally's JSON REST web services api
|
26
26
|
email:
|
27
27
|
- dsmith@rallydev.com
|