rally_rest_api 0.6.6 → 0.6.12

Sign up to get free protection for your applications and to get access to all the features.
data/Manifest.txt CHANGED
@@ -6,6 +6,7 @@ lib/rally_rest_api/query_result.rb
6
6
  lib/rally_rest_api/rally_rest.rb
7
7
  lib/rally_rest_api.rb
8
8
  lib/rally_rest_api/rest_builder.rb
9
+ lib/rally_rest_api/timeout_catching_rest_builder.rb
9
10
  lib/rally_rest_api/rest_object.rb
10
11
  lib/rally_rest_api/typedef.rb
11
12
  lib/rally_rest_api/version.rb
@@ -21,3 +22,6 @@ test/tc_rest_api.rb
21
22
  test/rest_object_spec.rb
22
23
  test/tc_rest_query.rb
23
24
  test/test_helper.rb
25
+ test/rest_builder_spec.rb
26
+ lib/rally_rest_api/timeout_catching_rest_builder.rb
27
+
@@ -37,7 +37,7 @@ class RallyRestAPI
37
37
  @parse_collections_as_hash = options[:parse_collections_as_hash] || false
38
38
 
39
39
  if options[:builder]
40
- builder = options[:builder]
40
+ builder = options[:builder]
41
41
  else
42
42
  builder = RestBuilder.new(@base_url, @username, @password)
43
43
  end
@@ -65,7 +65,8 @@ class RallyRestAPI
65
65
  # returns the created object as a RestObject.
66
66
  def create(type, values) # :yields: new_object
67
67
  # raise "'#{type}' is not a supported type. Supported types are: #{ALLOWED_TYPES.inspect}" unless ALLOWED_TYPES.include?(type.to_s)
68
- object = builder.create_rest(type, values, @username, @password)
68
+ xml = builder.create_rest(type, values, @username, @password)
69
+ object = RestObject.new(self, xml)
69
70
  yield object if block_given?
70
71
  object
71
72
  end
@@ -14,7 +14,7 @@ class RestBuilder # :nodoc:
14
14
  end
15
15
 
16
16
  # create_rest - convert slm builder style:
17
- # slm.feature(:name => "feature name")
17
+ # slm.create(:feature, :name => "feature name")
18
18
  #
19
19
  # Into xml builder style:
20
20
  # b.feature {
@@ -29,8 +29,7 @@ class RestBuilder # :nodoc:
29
29
 
30
30
  result = post_xml("#{self.base_url}/webservice/1.0/#{type}/create", xml, username, password)
31
31
  doc = REXML::Document.new result
32
- created_object = doc.root.elements["Object"]
33
- RestObject.new(self, created_object.to_s)
32
+ doc.root.elements["Object"].to_s
34
33
  end
35
34
 
36
35
  # update_rest - convert slm builder style:
@@ -108,7 +107,7 @@ class RestBuilder # :nodoc:
108
107
 
109
108
  # Because we are adapting to the xml builder as such:
110
109
  # We say to the RallyRestAPI:
111
- # slm.feature(:name => "feature name")
110
+ # slm.create(:feature, :name => "feature name")
112
111
  #
113
112
  # We tell the xml builder:
114
113
  # b.feature {
@@ -116,9 +115,9 @@ class RestBuilder # :nodoc:
116
115
  # }
117
116
  #
118
117
  # in the case where one element is a collection, RallyRest would look like
119
- # slm.feature(:name => "name", :dependancies => [sr1, sr2])
118
+ # slm.create(:feature, :name => "name", :dependancies => [sr1, sr2])
120
119
  #
121
- # This need to be converted to
120
+ # This needs to be converted to
122
121
  #
123
122
  # b.feature {
124
123
  # b.name("name")
@@ -129,6 +128,17 @@ class RestBuilder # :nodoc:
129
128
  # }
130
129
  # in this case we need to create a block to handle the nested calls (b.Supp...)
131
130
  #
131
+ #
132
+ # There are also nested/complex values, for example
133
+ # slm.create(:defect, :web_link => {:id => "123", :description => "foo"} )
134
+ #
135
+ # b.defect {
136
+ # b.web_link {
137
+ # b.id "123"
138
+ # b.description "foo"
139
+ # }
140
+ # }
141
+ #
132
142
  # We need to convert the args hash into a block that can be fed to the builder.
133
143
  # This will send the keys of the map as "methods" (b.name) and the values of
134
144
  # map as the arguments to the method ("feature name").
@@ -137,13 +147,15 @@ class RestBuilder # :nodoc:
137
147
  # #convert_arg_for_builder will convert the value portion of the hash to the appropiate
138
148
  # string, or block for the xml builder
139
149
  def builder_block(args)
150
+ sort_block = lambda { |a,b| a.to_s <=> b.to_s } # Sort the keys, for testing
140
151
  lambda do |builder|
141
- args.each do |attr, value|
142
- case attr
143
- when *COLLECTION_TYPES
152
+ args.sort(&sort_block).each do |(attr, value)|
153
+ if COLLECTION_TYPES.include? attr
144
154
  # The call to builder with only a type and a block needs to be marked as such
145
155
  # note the '&'
146
156
  builder.__send__(camel_case_word(attr), &convert_arg_for_builder([value].flatten))
157
+ elsif value.instance_of? Hash
158
+ builder.__send__(camel_case_word(attr), &builder_block(value))
147
159
  else
148
160
  builder.__send__(camel_case_word(attr), convert_arg_for_builder(value))
149
161
  end
@@ -157,7 +157,7 @@ class RestObject
157
157
 
158
158
  # The oid of the underlying resource
159
159
  def oid
160
- self.elements[:object_id]
160
+ self.elements[:object_i_d]
161
161
  end
162
162
 
163
163
  # return the typedef for this resource.
@@ -183,11 +183,19 @@ class RestObject
183
183
  @elements
184
184
  end
185
185
 
186
- def ==(other)
187
- return true if self.equal other
188
- return false unless other.kind_of? RestObject
189
- other.ref == self.ref
190
- end
186
+ def ==(object)
187
+ object.equal?(self) ||
188
+ (object.instance_of?(self.class) &&
189
+ object.ref == ref)
190
+ end
191
+
192
+ def hash
193
+ ref.hash
194
+ end
195
+
196
+ def eql?(object)
197
+ self == (object)
198
+ end
191
199
 
192
200
  public
193
201
 
@@ -0,0 +1,11 @@
1
+
2
+ class TimeoutCatchingRestBuilder < RestBuilder
3
+ def send_request(url, req, username, password)
4
+ begin
5
+ super
6
+ rescue Timeout::Error => e
7
+ @logger.warn "Caught Timeout Exception. Trying again..."
8
+ retry
9
+ end
10
+ end
11
+ end
@@ -15,7 +15,7 @@ class TypeDefinition < RestObject # :nodoc:
15
15
  end
16
16
 
17
17
  def self.get_type_definition(workspace, type)
18
- # This is a hack
18
+ # This is a hack - having to do with parse_collections_as_hash?
19
19
  typedefs = case workspace.type_definitions
20
20
  when Hash : workspace.type_definitions.values.flatten
21
21
  when Array : workspace.type_definitions
@@ -50,9 +50,7 @@ class TypeDefinition < RestObject # :nodoc:
50
50
  end
51
51
 
52
52
  def object_attributes(include_parent = false)
53
- collect_attributes(include_parent) do |element_name, attrdef|
54
- attrdef.attribute_type == "OBJECT"
55
- end
53
+ collect_attributes(include_parent) { |element_name, attrdef| attrdef.attribute_type == "OBJECT" }
56
54
  end
57
55
 
58
56
  def reference_attributes(include_parent = false)
@@ -2,7 +2,7 @@ module RallyRestVersion #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 6
5
- TINY = 6
5
+ TINY = 12
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
@@ -3,11 +3,7 @@ require 'test_helper'
3
3
  context "A QueryResult" do
4
4
 
5
5
  setup do
6
- @api = mock("RallyRestAPI")
7
- @api.stub! :username
8
- @api.stub! :password
9
- @api.stub!(:logger).and_return(nil)
10
- @api.stub!(:parse_collections_as_hash?).and_return true
6
+ @api = RallyRestAPI.new(:parse_collections_as_hash => true)
11
7
  end
12
8
 
13
9
  def make_result(total = 20, page_size = 20, start_index = 1)
@@ -84,11 +80,7 @@ end
84
80
  context "A QueryResult with full objects" do
85
81
 
86
82
  setup do
87
- @api = mock("RallyRestAPI")
88
- @api.stub! :username
89
- @api.stub! :password
90
- @api.stub!(:logger).and_return(nil)
91
- @api.stub!(:parse_collections_as_hash?).and_return true
83
+ @api = RallyRestAPI.new(:parse_collections_as_hash => true)
92
84
  end
93
85
 
94
86
  def make_result(total = 20, page_size = 20, start_index = 1)
@@ -0,0 +1,49 @@
1
+ require 'test_helper'
2
+
3
+ context "a RestBuilder " do
4
+
5
+ def xml
6
+ b = Builder::XmlMarkup.new
7
+ b.instruct!
8
+ yield b
9
+ end
10
+
11
+ setup do
12
+ @username = "username"
13
+ @password = "password"
14
+ @builder = RestBuilder.new(nil, @username, @password)
15
+ end
16
+
17
+ specify "should produce correct xml for flat xml" do
18
+ expected_xml = xml do |b|
19
+ b.defect(:ref => "url") {
20
+ b.Name "foo"
21
+ }
22
+ end
23
+ @builder.should_receive(:post_xml).with(:anything, expected_xml, @username, @password)
24
+ @builder.update_rest(:defect, "url", {:name => "foo"}, @username, @password)
25
+ end
26
+
27
+ specify "should produce correct xml for nested values" do
28
+ expected_xml = xml do |b|
29
+ b.defect(:ref => "url") {
30
+ b.Name "foo"
31
+ b.WebLink {
32
+ b.DisplayString "desc"
33
+ b.LinkID "12345"
34
+ }
35
+ }
36
+ end
37
+
38
+ @builder.should_receive(:post_xml).with(:anything, expected_xml, @username, @password)
39
+ @builder.update_rest(:defect, "url",
40
+ {
41
+ :name => "foo",
42
+ :web_link => {
43
+ :display_string => "desc",
44
+ :link_i_d => "12345"
45
+ }
46
+ }, @username, @password)
47
+ end
48
+
49
+ end
@@ -48,6 +48,16 @@ context "a RestObject" do
48
48
  o.ref.should == "ref"
49
49
  end
50
50
 
51
+ specify "should return the oid" do
52
+ o = rest_object_xml do |b|
53
+ b.Defect(:refObjectName => "name", :ref => "ref") {
54
+ b.Name("name")
55
+ b.ObjectID("12345")
56
+ }
57
+ end
58
+ o.oid.should == "12345"
59
+ end
60
+
51
61
  specify "should underscore element names" do
52
62
  o = rest_object(%Q(<Object ref="bla">
53
63
  <TextNode>text</TextNode>
data/test/tc_rest_api.rb CHANGED
@@ -41,6 +41,12 @@ class RestApiTestCase < Test::Unit::TestCase
41
41
  assert_equal(xml, @xml)
42
42
  end
43
43
 
44
+ def test_basic_create
45
+ xml = "#{preamble}<Feature><Name>name</Name></Feature>"
46
+ object = @api.create(:feature, :name => "name")
47
+ assert_equal(RallyRestAPI, object.rally_rest.class)
48
+ end
49
+
44
50
  # test that types and keys are camel cased (at least with one underscore)
45
51
  def test_camel_case
46
52
  xml = "#{preamble}<UseCase><NameName>name</NameName></UseCase>"
metadata CHANGED
@@ -1,10 +1,10 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.0
2
+ rubygems_version: 0.9.2
3
3
  specification_version: 1
4
4
  name: rally_rest_api
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.6.6
7
- date: 2007-02-06 00:00:00 -07:00
6
+ version: 0.6.12
7
+ date: 2007-02-23 00:00:00 -07:00
8
8
  summary: A ruby-ized interface to Rally's REST webservices API
9
9
  require_paths:
10
10
  - lib
@@ -37,6 +37,7 @@ files:
37
37
  - lib/rally_rest_api/rally_rest.rb
38
38
  - lib/rally_rest_api.rb
39
39
  - lib/rally_rest_api/rest_builder.rb
40
+ - lib/rally_rest_api/timeout_catching_rest_builder.rb
40
41
  - lib/rally_rest_api/rest_object.rb
41
42
  - lib/rally_rest_api/typedef.rb
42
43
  - lib/rally_rest_api/version.rb
@@ -52,15 +53,17 @@ files:
52
53
  - test/rest_object_spec.rb
53
54
  - test/tc_rest_query.rb
54
55
  - test/test_helper.rb
56
+ - test/rest_builder_spec.rb
55
57
  test_files:
56
- - test/tc_rest_api.rb
58
+ - test/attribute_definition_spec.rb
57
59
  - test/query_result_spec.rb
60
+ - test/rest_builder_spec.rb
61
+ - test/rest_object_spec.rb
62
+ - test/spec_typedef.rb
63
+ - test/tc_query_result.rb
64
+ - test/tc_rest_api.rb
58
65
  - test/tc_rest_query.rb
59
66
  - test/test_helper.rb
60
- - test/tc_query_result.rb
61
- - test/spec_typedef.rb
62
- - test/attribute_definition_spec.rb
63
- - test/rest_object_spec.rb
64
67
  rdoc_options: []
65
68
 
66
69
  extra_rdoc_files: []
@@ -81,3 +84,12 @@ dependencies:
81
84
  - !ruby/object:Gem::Version
82
85
  version: 0.0.0
83
86
  version:
87
+ - !ruby/object:Gem::Dependency
88
+ name: hoe
89
+ version_requirement:
90
+ version_requirements: !ruby/object:Gem::Version::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: 1.1.7
95
+ version: