rc-rest 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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: