rally_rest_api 0.7.10 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Manifest.txt +10 -12
- data/Rakefile +4 -3
- data/lib/rally_rest_api/attribute_definition.rb +1 -1
- data/lib/rally_rest_api/rally_rest.rb +1 -0
- data/lib/rally_rest_api/rest_object.rb +35 -13
- data/lib/rally_rest_api/version.rb +2 -2
- data/{test → spec/rally_rest_api}/attribute_definition_spec.rb +2 -4
- data/{test → spec/rally_rest_api}/custom_http_header_spec.rb +1 -1
- data/{test → spec/rally_rest_api}/query_result_spec.rb +2 -2
- data/{test → spec/rally_rest_api}/rest_builder_spec.rb +3 -3
- data/{test → spec/rally_rest_api}/rest_object_spec.rb +64 -7
- data/{test → spec/rally_rest_api}/tc_query_result.rb +1 -2
- data/{test → spec/rally_rest_api}/tc_rest_api.rb +1 -6
- data/{test → spec/rally_rest_api}/tc_rest_query.rb +1 -5
- data/{test/spec_typedef.rb → spec/rally_rest_api/typedef_spec.rb} +4 -6
- data/spec/test_helper.rb +13 -0
- data/tasks/ann.rake +19 -14
- data/tasks/bones.rake +6 -25
- data/tasks/gem.rake +46 -36
- data/tasks/post_load.rake +18 -11
- data/tasks/rubyforge.rake +15 -13
- data/tasks/setup.rb +121 -80
- data/tasks/spec.rake +12 -13
- data/tasks/svn.rake +15 -11
- data/tasks/test.rake +6 -6
- metadata +14 -16
- data/tasks/annotations.rake +0 -22
- data/tasks/doc.rake +0 -48
- data/test/test_helper.rb +0 -5
data/Manifest.txt
CHANGED
@@ -16,10 +16,18 @@ lib/rally_rest_api/timeout_catching_rest_builder.rb
|
|
16
16
|
lib/rally_rest_api/typedef.rb
|
17
17
|
lib/rally_rest_api/version.rb
|
18
18
|
setup.rb
|
19
|
+
spec/rally_rest_api/attribute_definition_spec.rb
|
20
|
+
spec/rally_rest_api/custom_http_header_spec.rb
|
21
|
+
spec/rally_rest_api/query_result_spec.rb
|
22
|
+
spec/rally_rest_api/rest_builder_spec.rb
|
23
|
+
spec/rally_rest_api/rest_object_spec.rb
|
24
|
+
spec/rally_rest_api/tc_query_result.rb
|
25
|
+
spec/rally_rest_api/tc_rest_api.rb
|
26
|
+
spec/rally_rest_api/tc_rest_query.rb
|
27
|
+
spec/rally_rest_api/typedef_spec.rb
|
28
|
+
spec/test_helper.rb
|
19
29
|
tasks/ann.rake
|
20
|
-
tasks/annotations.rake
|
21
30
|
tasks/bones.rake
|
22
|
-
tasks/doc.rake
|
23
31
|
tasks/gem.rake
|
24
32
|
tasks/manifest.rake
|
25
33
|
tasks/post_load.rake
|
@@ -28,13 +36,3 @@ tasks/setup.rb
|
|
28
36
|
tasks/spec.rake
|
29
37
|
tasks/svn.rake
|
30
38
|
tasks/test.rake
|
31
|
-
test/attribute_definition_spec.rb
|
32
|
-
test/custom_http_header_spec.rb
|
33
|
-
test/query_result_spec.rb
|
34
|
-
test/rest_builder_spec.rb
|
35
|
-
test/rest_object_spec.rb
|
36
|
-
test/spec_typedef.rb
|
37
|
-
test/tc_query_result.rb
|
38
|
-
test/tc_rest_api.rb
|
39
|
-
test/tc_rest_query.rb
|
40
|
-
test/test_helper.rb
|
data/Rakefile
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
# configured in this Rakefile. The .rake files in the tasks directory
|
3
3
|
# are where the options are used.
|
4
4
|
|
5
|
+
|
5
6
|
load 'tasks/setup.rb'
|
6
7
|
|
7
8
|
ensure_in_path 'lib'
|
@@ -13,14 +14,14 @@ PROJ.name = 'rally_rest_api'
|
|
13
14
|
PROJ.authors = 'Bob Cotton'
|
14
15
|
PROJ.email = 'bob.cotton@rallydev.com'
|
15
16
|
PROJ.url = 'http://rally-rest-api.rubyforge.org/rally_rest_api'
|
16
|
-
PROJ.
|
17
|
+
PROJ.rubyforge.name = 'rally-rest-api'
|
17
18
|
PROJ.summary = "A Ruby interface to the Rally REST API"
|
18
19
|
PROJ.version = RallyRestVersion::LIBRARY_VERSION::STRING
|
19
20
|
|
20
21
|
PROJ.exclude = ['.git/*', 'pkg/*']
|
21
22
|
|
22
|
-
PROJ.
|
23
|
+
PROJ.rdoc.dir = 'doc/output/rally_rest_api'
|
23
24
|
|
24
|
-
PROJ.
|
25
|
+
PROJ.spec.opts << '--color'
|
25
26
|
|
26
27
|
# EOF
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'logger'
|
2
2
|
require File.dirname(__FILE__) + '/rest_builder'
|
3
3
|
require 'builder/blankslate'
|
4
|
+
require 'forwardable'
|
4
5
|
|
5
6
|
# == An interface to a Rally resource
|
6
7
|
# RestObject is an adapter that is initialized with a resource ref (URL) that represents a Rally object. The adapter
|
@@ -26,14 +27,17 @@ class FancyHash < Hash # :nodoc: all
|
|
26
27
|
end
|
27
28
|
|
28
29
|
class RestObject
|
30
|
+
extend Forwardable
|
29
31
|
|
30
|
-
|
32
|
+
attr_accessor :rally_rest
|
33
|
+
def_delegator(:rally_rest, :username)
|
34
|
+
def_delegator(:rally_rest, :password)
|
31
35
|
|
32
|
-
def initialize(rally_rest, document_content)
|
36
|
+
def initialize(rally_rest = nil, document_content = nil)
|
37
|
+
@changed_values = {}
|
33
38
|
@rally_rest = rally_rest
|
34
39
|
@document_content = document_content
|
35
|
-
|
36
|
-
parse_document
|
40
|
+
parse_document if document_content
|
37
41
|
end
|
38
42
|
|
39
43
|
def parse_document
|
@@ -46,14 +50,14 @@ class RestObject
|
|
46
50
|
end
|
47
51
|
|
48
52
|
def marshal_dump
|
49
|
-
[@rally_rest, @document_content, @
|
53
|
+
[@rally_rest, @document_content, @changed_values]
|
50
54
|
end
|
51
55
|
|
52
56
|
def marshal_load(stuff)
|
53
|
-
@rally_rest, @document_content, @
|
57
|
+
@rally_rest, @document_content, @changed_values = *stuff
|
54
58
|
parse_document
|
55
59
|
end
|
56
|
-
|
60
|
+
|
57
61
|
private
|
58
62
|
def terminal?(node)
|
59
63
|
!node.has_elements?
|
@@ -156,14 +160,19 @@ class RestObject
|
|
156
160
|
|
157
161
|
# The name of the object, without having to read the entire body
|
158
162
|
def name
|
159
|
-
@document.root.attributes["refObjectName"]
|
163
|
+
@changed_values[:name] || @document.root.attributes["refObjectName"]
|
160
164
|
end
|
161
165
|
alias :to_s :name
|
162
166
|
|
163
167
|
# The type of the underlying resource
|
164
168
|
def type
|
165
|
-
@document.root.attributes["type"] || @document.root.name
|
169
|
+
@type || @document.root.attributes["type"] || @document.root.name
|
170
|
+
end
|
171
|
+
|
172
|
+
def type=(type)
|
173
|
+
@type = type
|
166
174
|
end
|
175
|
+
alias :artifact_type= :type=
|
167
176
|
|
168
177
|
# the type as symbol
|
169
178
|
def type_as_symbol
|
@@ -191,7 +200,7 @@ class RestObject
|
|
191
200
|
|
192
201
|
def elements(read = @elements.nil?) #:nodoc:
|
193
202
|
if read
|
194
|
-
@document_content = builder.read_rest(self.ref,
|
203
|
+
@document_content = builder.read_rest(self.ref, username, password)
|
195
204
|
@document = REXML::Document.new @document_content
|
196
205
|
@elements = parse(@document.root)
|
197
206
|
end
|
@@ -217,20 +226,33 @@ class RestObject
|
|
217
226
|
end
|
218
227
|
|
219
228
|
public
|
229
|
+
|
230
|
+
def save!
|
231
|
+
raise 'missing RallyRestAPI instance' unless rally_rest
|
232
|
+
raise 'missing object type' unless @type
|
233
|
+
@document_content = builder.create_rest(type, @changed_values, username, password)
|
234
|
+
parse_document
|
235
|
+
end
|
220
236
|
|
221
237
|
# update the resource. This will re-read the resource after the update
|
222
238
|
def update(args)
|
223
|
-
builder.update_rest(
|
239
|
+
builder.update_rest(type, ref, args, username, password)
|
224
240
|
self.elements(true)
|
225
241
|
end
|
226
242
|
|
227
243
|
# delete the resource
|
228
244
|
def delete
|
229
|
-
builder.delete_rest(
|
245
|
+
builder.delete_rest(ref, username, password)
|
230
246
|
end
|
231
247
|
|
232
248
|
def method_missing(sym, *args) # :nodoc:
|
233
|
-
|
249
|
+
method = sym
|
250
|
+
if sym.to_s.match(/(.*)=$/)
|
251
|
+
method = $1.intern
|
252
|
+
return @changed_values[method] = args.first
|
253
|
+
end
|
254
|
+
|
255
|
+
@changed_values[method] || self.elements[method]
|
234
256
|
# Sometimes the xml returned has no element for things that are simply null. Without
|
235
257
|
# asking the typedef, I have no way to know if the element exists, or has been ommited.
|
236
258
|
# It would not be hard to ask the typedef, but they are expensive to load. It should be an option
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require 'test_helper'
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
2
2
|
|
3
3
|
describe "A QueryResult" do
|
4
4
|
|
@@ -125,7 +125,7 @@ describe "A QueryResult with full objects" do
|
|
125
125
|
rest_builder.
|
126
126
|
should_receive(:read_rest).
|
127
127
|
twice.
|
128
|
-
with(
|
128
|
+
with(any_args(), nil, nil).
|
129
129
|
and_return( xml do |b|
|
130
130
|
b.iteration {
|
131
131
|
b.Name("name1")
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require 'test_helper'
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
2
2
|
|
3
3
|
describe "a RestBuilder " do
|
4
4
|
|
@@ -20,7 +20,7 @@ describe "a RestBuilder " do
|
|
20
20
|
b.Name "foo"
|
21
21
|
}
|
22
22
|
end
|
23
|
-
@builder.should_receive(:post_xml).with(
|
23
|
+
@builder.should_receive(:post_xml).with(anything(), expected_xml, @username, @password)
|
24
24
|
@builder.update_rest(:defect, "url", {:name => "foo"}, @username, @password)
|
25
25
|
end
|
26
26
|
|
@@ -35,7 +35,7 @@ describe "a RestBuilder " do
|
|
35
35
|
}
|
36
36
|
end
|
37
37
|
|
38
|
-
@builder.should_receive(:post_xml).with(
|
38
|
+
@builder.should_receive(:post_xml).with(anything(), expected_xml, @username, @password)
|
39
39
|
@builder.update_rest(:defect, "url",
|
40
40
|
{
|
41
41
|
:name => "foo",
|
@@ -1,5 +1,4 @@
|
|
1
|
-
|
2
|
-
require 'test_helper'
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
3
2
|
|
4
3
|
describe RestObject do
|
5
4
|
|
@@ -95,7 +94,7 @@ describe RestObject do
|
|
95
94
|
rest_builder = mock("RestBuilder")
|
96
95
|
rest_builder.
|
97
96
|
should_receive(:read_rest).
|
98
|
-
with(
|
97
|
+
with(any_args()).
|
99
98
|
and_return( xml do |b|
|
100
99
|
b.TestCase {
|
101
100
|
b.Name("name1")
|
@@ -115,7 +114,7 @@ describe RestObject do
|
|
115
114
|
rest_builder = mock("RestBuilder")
|
116
115
|
rest_builder.
|
117
116
|
should_receive(:read_rest).
|
118
|
-
with(
|
117
|
+
with(any_args()).
|
119
118
|
and_return( xml do |b|
|
120
119
|
b.TestCase {
|
121
120
|
b.Name("name1")
|
@@ -140,7 +139,7 @@ describe RestObject do
|
|
140
139
|
rest_builder.
|
141
140
|
should_receive(:read_rest).
|
142
141
|
once.
|
143
|
-
with(
|
142
|
+
with(any_args()).
|
144
143
|
and_return( xml do |b|
|
145
144
|
b.TestCase {
|
146
145
|
b.Name("name1")
|
@@ -164,7 +163,7 @@ describe RestObject do
|
|
164
163
|
rest_builder.
|
165
164
|
should_receive(:read_rest).
|
166
165
|
once.
|
167
|
-
with(
|
166
|
+
with(any_args()).
|
168
167
|
and_return( xml do |b|
|
169
168
|
b.iteration {
|
170
169
|
b.Name("name1")
|
@@ -299,7 +298,7 @@ describe RestObject do
|
|
299
298
|
rest_builder.
|
300
299
|
should_receive(:read_rest).
|
301
300
|
twice.
|
302
|
-
with(
|
301
|
+
with(any_args()).
|
303
302
|
and_return( xml do |b|
|
304
303
|
b.Task {
|
305
304
|
b.Name("name1")
|
@@ -323,5 +322,63 @@ describe RestObject do
|
|
323
322
|
object.tasks.first.description.should == "Description"
|
324
323
|
object.tasks.last.description.should == "Description"
|
325
324
|
end
|
325
|
+
|
326
|
+
it "should allow getting and setting rally_rest" do
|
327
|
+
rally_rest = RallyRestAPI.new
|
328
|
+
rest_object = RestObject.new
|
329
|
+
rest_object.rally_rest = rally_rest
|
330
|
+
rest_object.rally_rest.should equal(rally_rest)
|
331
|
+
end
|
326
332
|
|
333
|
+
it "should allow the type to be set" do
|
334
|
+
rest_object = RestObject.new
|
335
|
+
rest_object.type = :defect
|
336
|
+
rest_object.type.should == :defect
|
337
|
+
end
|
338
|
+
|
339
|
+
it "should allow the name to be set" do
|
340
|
+
rest_object = RestObject.new
|
341
|
+
rest_object.name = "name"
|
342
|
+
rest_object.name.should == "name"
|
343
|
+
end
|
344
|
+
|
345
|
+
it "should allow the setting and getting of any value" do
|
346
|
+
rest_object = RestObject.new
|
347
|
+
rest_object.description = "description"
|
348
|
+
rest_object.description.should == "description"
|
349
|
+
end
|
350
|
+
|
351
|
+
it "should pass the type and set value to create on rally_rest" do
|
352
|
+
builder = mock("builder")
|
353
|
+
rally_rest = RallyRestAPI.new(:builder => builder)
|
354
|
+
args = {:name => "name", :description => "description"}
|
355
|
+
xml = %Q(<Object ref="bla" refObjectName="name">
|
356
|
+
<Name>name</Name>
|
357
|
+
<Description>description</Description>
|
358
|
+
</Object>)
|
359
|
+
|
360
|
+
builder.should_receive(:create_rest).with(:defect, args, nil, nil).and_return(xml)
|
361
|
+
|
362
|
+
rest_object = RestObject.new
|
363
|
+
rest_object.rally_rest = rally_rest
|
364
|
+
rest_object.type = :defect
|
365
|
+
rest_object.name = "name"
|
366
|
+
rest_object.description = "description"
|
367
|
+
rest_object.save!
|
368
|
+
|
369
|
+
rest_object.ref.should == "bla"
|
370
|
+
rest_object.name.should == "name"
|
371
|
+
rest_object.description.should == "description"
|
372
|
+
end
|
373
|
+
|
374
|
+
it "should not try to save if there is no rally_rest" do
|
375
|
+
rest_object = RestObject.new
|
376
|
+
lambda { rest_object.save! }.should raise_error(StandardError, /missing RallyRestAPI instance/)
|
377
|
+
end
|
378
|
+
|
379
|
+
it "should not try to save if there is no type" do
|
380
|
+
rally_rest = stub!("RallyRest")
|
381
|
+
rest_object = RestObject.new(rally_rest)
|
382
|
+
lambda { rest_object.save! }.should raise_error(StandardError, /missing object type/)
|
383
|
+
end
|
327
384
|
end
|
@@ -1,9 +1,4 @@
|
|
1
|
-
require '
|
2
|
-
require 'test/unit/testcase'
|
3
|
-
|
4
|
-
require 'rubygems'
|
5
|
-
require 'rally_rest_api'
|
6
|
-
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
7
2
|
class RestApiTestCase < Test::Unit::TestCase
|
8
3
|
|
9
4
|
# We need to override post_xml from RestBuilder, So redefine it here
|
@@ -1,7 +1,5 @@
|
|
1
|
-
require '
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
2
2
|
require 'ostruct'
|
3
|
-
require 'logger'
|
4
|
-
require 'rally_rest_api'
|
5
3
|
|
6
4
|
|
7
5
|
describe "A Test Case type definition with 2 collection attribues, 1 object attributes, and 1 string attribute" do
|
@@ -15,11 +13,11 @@ describe "A Test Case type definition with 2 collection attribues, 1 object attr
|
|
15
13
|
:type => "TypeDefinition") {
|
16
14
|
@b.ElementName("TestCase")
|
17
15
|
@b.Attributes {
|
18
|
-
|
19
|
-
|
16
|
+
{"Notes" => {:type => "TEXT", :element_name => "Notes", :constrained => "false", :custom => "false"},
|
17
|
+
"Test Case Result" => {:type => "COLLECTION", :element_name => "TestCaseResult", :constrained => "false", :custom => "false"},
|
20
18
|
"Foo Bar" => {:type => "COLLECTION", :element_name => "FooBar", :constrained => "false", :custom => "false"},
|
21
19
|
"Requirement" => {:type => "OBJECT", :element_name => "Requirement", :constrained => "false", :custom => "false"},
|
22
|
-
|
20
|
+
"Constrained" => {:type => "STRING", :element_name => "Constrained", :constrained => "true", :custom => "false"},
|
23
21
|
"Custom" => {:type => "STRING", :element_name => "Custom", :constrained => "false", :custom => "true"},
|
24
22
|
"ConstainedCustom" => {:type => "STRING", :element_name => "ConstrainedCustom", :constrained => "true", :custom => "true"}
|
25
23
|
}.each do |name, type|
|
data/spec/test_helper.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
dir = File.dirname(__FILE__)
|
2
|
+
app_path = File.expand_path("#{dir}/../lib")
|
3
|
+
$LOAD_PATH.unshift app_path unless $LOAD_PATH.include?(app_path)
|
4
|
+
require 'test/unit'
|
5
|
+
require 'rubygems'
|
6
|
+
require 'spec'
|
7
|
+
require 'net/http'
|
8
|
+
require 'rally_rest_api'
|
9
|
+
|
10
|
+
class RallyRestAPI
|
11
|
+
def user; end
|
12
|
+
end
|
13
|
+
|