rc-rest 2.1.0 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,13 @@
1
+ = 2.2.0
2
+
3
+ * Moved to seattlerb rubyforge project
4
+ * Moved to p4
5
+ * Wrap communication errors in RCRest::CommunicationError
6
+
7
+ = 2.1.1
8
+
9
+ * Fix dependency on ZenTest for testing
10
+
1
11
  = 2.1.0
2
12
 
3
13
  * Don't split strings into extra params pairs on newlines
@@ -7,8 +17,8 @@
7
17
  = 2.0.0
8
18
 
9
19
  * Added +method+ parameter to RCRest#make_url to add path components
10
- to a generic endpoint.
11
- * Added RCRest#post.
20
+ to a generic endpoint
21
+ * Added RCRest#post
12
22
 
13
23
  = 1.0.0
14
24
 
data/Rakefile CHANGED
@@ -1,24 +1,17 @@
1
1
  require 'hoe'
2
2
  require './lib/rc_rest'
3
3
 
4
- DEV_DOC_PATH = 'Libraries/rc-rest'
5
-
6
- hoe = Hoe.new 'rc-rest', RCRest::VERSION do |p|
4
+ Hoe.new 'rc-rest', RCRest::VERSION do |p|
7
5
  p.summary = 'Robot Co-op REST web services base class'
8
6
  p.description = 'This library makes it easy to implement REST-like web services APIs.'
9
7
  p.author = 'Eric Hodel'
10
8
  p.email = 'drbrain@segment7.net'
11
- p.url = "http://dev.robotcoop.com/#{DEV_DOC_PATH}"
12
- p.rubyforge_name = 'rctools'
9
+ p.url = "http://seattlerb.rubyforge.org/rc-rest"
10
+ p.rubyforge_name = 'seattlerb'
13
11
 
14
12
  p.changes = File.read('History.txt').scan(/\A(=.*?)^=/m).first.first
15
- end
16
-
17
- SPEC = hoe.spec
18
13
 
19
- begin
20
- require '../tasks'
21
- rescue LoadError
14
+ p.extra_deps << ['ZenTest', '>= 3.4.2']
22
15
  end
23
16
 
24
17
  # vim: syntax=Ruby
@@ -49,13 +49,34 @@ class RCRest
49
49
  ##
50
50
  # You are using this version of RCRest
51
51
 
52
- VERSION = '2.1.0'
52
+ VERSION = '2.2.0'
53
53
 
54
54
  ##
55
55
  # Abstract Error class.
56
56
 
57
57
  class Error < RuntimeError; end
58
58
 
59
+ ##
60
+ # Error raised when communicating with the server
61
+
62
+ class CommunicationError < Error
63
+
64
+ ##
65
+ # The original exception
66
+
67
+ attr_accessor :original_exception
68
+
69
+ ##
70
+ # Creates a new CommunicationError with +message+ and +original_exception+
71
+
72
+ def initialize(original_exception)
73
+ @original_exception = original_exception
74
+ message = "Communication error: #{original_exception.message}(#{original_exception.class})"
75
+ super message
76
+ end
77
+
78
+ end
79
+
59
80
  ##
60
81
  # Web services initializer.
61
82
  #
@@ -103,10 +124,18 @@ class RCRest
103
124
 
104
125
  return parse_response(res)
105
126
  end
127
+ rescue IOError, SystemCallError, SocketError, Timeout::Error,
128
+ REXML::ParseException => e
129
+ raise CommunicationError.new(e)
106
130
  rescue OpenURI::HTTPError => e
107
- xml = REXML::Document.new e.io.read
108
- check_error xml
109
- raise
131
+ begin
132
+ xml = REXML::Document.new e.io.read
133
+ check_error xml
134
+ rescue REXML::ParseException => e
135
+ end
136
+ new_e = CommunicationError.new e
137
+ new_e.message << "\n\nunhandled error:\n#{xml.to_s}"
138
+ raise new_e
110
139
  end
111
140
 
112
141
  ##
@@ -202,12 +231,15 @@ class RCRest
202
231
  xml = REXML::Document.new res.body
203
232
 
204
233
  check_error xml
205
-
206
- return parse_response(xml)
234
+
235
+ parse_response xml
236
+ rescue SystemCallError, SocketError, Timeout::Error,
237
+ REXML::ParseException => e
238
+ raise CommunicationError.new(e)
207
239
  rescue Net::HTTPError => e
208
240
  xml = REXML::Document.new e.res.body
209
241
  check_error xml
210
- raise
242
+ raise CommunicationError.new(e)
211
243
  end
212
244
 
213
245
  ##
@@ -232,12 +264,15 @@ class RCRest
232
264
  xml = REXML::Document.new res.body
233
265
 
234
266
  check_error xml
235
-
236
- return parse_response(xml)
267
+
268
+ parse_response xml
269
+ rescue SystemCallError, SocketError, Timeout::Error,
270
+ REXML::ParseException => e
271
+ raise CommunicationError.new(e)
237
272
  rescue Net::HTTPError => e
238
273
  xml = REXML::Document.new e.res.body
239
274
  check_error xml
240
- raise
275
+ raise CommunicationError.new(e)
241
276
  end
242
277
 
243
278
  end
@@ -51,9 +51,14 @@ class Net::HTTP
51
51
  def request(req)
52
52
  self.class.paths << req.path
53
53
  self.class.params << req.body
54
- res = Net::HTTPResponse.new '1.0', 200, 'OK'
55
- res.body = self.class.responses.shift
56
- res
54
+ response = self.class.responses.shift
55
+ if response.respond_to? :call then
56
+ response.call req
57
+ else
58
+ res = Net::HTTPResponse.new '1.0', 200, 'OK'
59
+ res.body = response
60
+ res
61
+ end
57
62
  end
58
63
 
59
64
  end
@@ -44,7 +44,12 @@ class URI::HTTP # :nodoc:
44
44
 
45
45
  def open
46
46
  self.class.uris << self.to_s
47
- yield StringIO.new(self.class.responses.shift)
47
+ response = self.class.responses.shift
48
+ if response.respond_to? :call then
49
+ response.call
50
+ else
51
+ yield StringIO.new(response)
52
+ end
48
53
  end
49
54
 
50
55
  end
@@ -71,19 +71,58 @@ class TestFakeService < Test::Unit::TestCase
71
71
  assert_equal 'http://example.com/method?', URI::HTTP.uris.first
72
72
  end
73
73
 
74
- def test_do_get_error
75
- def @fs.make_url(*args) # HACK extend uri_stub with error raising ability
76
- u = Object.new
77
- def u.open
78
- xml = '<error>you did the bad thing</error>'
79
- raise OpenURI::HTTPError.new('400 Bad Request', StringIO.new(xml))
80
- end
81
- return u
74
+ def test_do_get_bad_xml
75
+ xml = '<result>stuff</result><extra/>'
76
+ URI::HTTP.responses << xml
77
+
78
+ assert_raise RCRest::CommunicationError do @fs.do_get end
79
+ end
80
+
81
+ def test_do_get_error_400
82
+ URI::HTTP.responses << proc do
83
+ xml = '<error>you did the bad thing</error>'
84
+ raise OpenURI::HTTPError.new('400 Bad Request', StringIO.new(xml))
82
85
  end
83
86
 
84
87
  assert_raise FakeService::Error do @fs.do_get end
85
88
  end
86
89
 
90
+ def test_do_get_error_400_bad_xml
91
+ URI::HTTP.responses << proc do
92
+ xml = '<error>you did the bad thing</error><extra/>'
93
+ raise OpenURI::HTTPError.new('400 Bad Request', StringIO.new(xml))
94
+ end
95
+
96
+ assert_raise RCRest::CommunicationError do @fs.do_get end
97
+ end
98
+
99
+ def test_do_get_error_unhandled
100
+ URI::HTTP.responses << proc do
101
+ xml = '<other_error>you did the bad thing</other_error>'
102
+ raise OpenURI::HTTPError.new('500 Internal Server Error', StringIO.new(xml))
103
+ end
104
+
105
+ e = assert_raise RCRest::CommunicationError do @fs.do_get end
106
+
107
+ expected = <<-EOF.strip
108
+ Communication error: 500 Internal Server Error(OpenURI::HTTPError)
109
+
110
+ unhandled error:
111
+ <other_error>you did the bad thing</other_error>
112
+ EOF
113
+
114
+ assert_equal expected, e.message
115
+ end
116
+
117
+ def test_do_get_eof_error
118
+ URI::HTTP.responses << proc do
119
+ xml = '<error>you did the bad thing</error>'
120
+ raise EOFError, 'end of file reached'
121
+ end
122
+
123
+ assert_raise RCRest::CommunicationError do @fs.do_get end
124
+ end
125
+
87
126
  def test_do_post
88
127
  xml = '<result>stuff</result>'
89
128
  Net::HTTP.responses << xml
@@ -100,6 +139,13 @@ class TestFakeService < Test::Unit::TestCase
100
139
  assert_equal '/method', Net::HTTP.paths.first
101
140
  end
102
141
 
142
+ def test_do_post_bad_xml
143
+ xml = '<result>stuff</result><extra/>'
144
+ Net::HTTP.responses << xml
145
+
146
+ assert_raise RCRest::CommunicationError do @fs.do_post end
147
+ end
148
+
103
149
  def test_do_post_multipart
104
150
  xml = '<result>stuff</result>'
105
151
  Net::HTTP.responses << xml
@@ -124,16 +170,23 @@ value\r
124
170
  assert_equal '/method', Net::HTTP.paths.first
125
171
  end
126
172
 
173
+ def test_do_post_multipart_bad_xml
174
+ xml = '<result>stuff</result><extra/>'
175
+ Net::HTTP.responses << xml
176
+
177
+ assert_raise RCRest::CommunicationError do @fs.do_post_multipart end
178
+ end
179
+
127
180
  end
128
181
 
129
182
  class TestRCRest < Test::Unit::TestCase
130
183
 
131
184
  def test_initialize
132
- RCRest.new
133
- rescue NotImplementedError => e
185
+ e = assert_raise NotImplementedError do
186
+ RCRest.new
187
+ end
188
+
134
189
  assert_equal 'need to implement #intialize and set @url', e.message
135
- else
136
- flunk 'expected NotImplementedError'
137
190
  end
138
191
 
139
192
  def test_check_error
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.0.7
2
+ rubygems_version: 0.9.1
3
3
  specification_version: 1
4
4
  name: rc-rest
5
5
  version: !ruby/object:Gem::Version
6
- version: 2.1.0
7
- date: 2006-11-29 00:00:00 -08:00
6
+ version: 2.2.0
7
+ date: 2007-01-29 00:00:00 -08:00
8
8
  summary: Robot Co-op REST web services base class
9
9
  require_paths:
10
10
  - lib
11
11
  email: drbrain@segment7.net
12
- homepage: http://dev.robotcoop.com/Libraries/rc-rest
13
- rubyforge_project: rctools
12
+ homepage: http://seattlerb.rubyforge.org/rc-rest
13
+ rubyforge_project: seattlerb
14
14
  description: This library makes it easy to implement REST-like web services APIs.
15
15
  autorequire:
16
16
  default_executable:
@@ -51,6 +51,15 @@ extensions: []
51
51
  requirements: []
52
52
 
53
53
  dependencies:
54
+ - !ruby/object:Gem::Dependency
55
+ name: ZenTest
56
+ version_requirement:
57
+ version_requirements: !ruby/object:Gem::Version::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 3.4.2
62
+ version:
54
63
  - !ruby/object:Gem::Dependency
55
64
  name: hoe
56
65
  version_requirement:
@@ -58,5 +67,5 @@ dependencies:
58
67
  requirements:
59
68
  - - ">="
60
69
  - !ruby/object:Gem::Version
61
- version: 1.1.5
70
+ version: 1.1.7
62
71
  version: