restr 0.3.0 → 0.4.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,17 @@
1
+ == 0.4.0 :: 2008-06-19
2
+
3
+ * Better recognition of XML content; response MIME types ending in "/xml" and
4
+ "+xml" are now all parsed as XML (for example: "application/xml",
5
+ "image/svg+xml", "text/xml", etc). Note that "application/xhtml+xml" is now
6
+ considered to be XML content too, even though you may think of it as just
7
+ "HTML".
8
+ * You can set how long Restr will wait for a request to complete by setting
9
+ Restr.request_timeout = <seconds>. The default timeout is 3 minutes
10
+ (180 seconds).
11
+ * The full response body is now included in DEBUG-level log entries. Be careful
12
+ if you have the logging level set to DEBUG -- your log will now grow very
13
+ quickly.
14
+
1
15
  == 0.3.0 :: 2008-04-03
2
16
 
3
17
  * First public release -- moved out from the Reststop library into its own gem.
@@ -4,6 +4,7 @@ require 'net/http'
4
4
  require 'net/https'
5
5
  require 'uri'
6
6
  require 'cgi'
7
+ require 'timeout'
7
8
 
8
9
  begin
9
10
  require 'xml_simple'
@@ -44,17 +45,29 @@ end
44
45
  # -- see http://xml-simple.rubyforge.org/). Otherwise the response is
45
46
  # returned untouched, as a String.
46
47
  #
48
+ #
49
+ # === Authentication
50
+ #
47
51
  # If the remote REST resource requires authentication (Restr only supports
48
52
  # HTTP Basic authentication, for now):
49
53
  #
50
54
  # Restr.get('http://example.com/kittens/1.xml, {},
51
55
  # {:username => 'foo', :password => 'bar'})
52
56
  #
57
+ # === Logging
58
+ #
59
+ # A standard Ruby Logger can be attached to the Restr client like so:
60
+ #
61
+ # logger = Logger.new('restr.log')
62
+ # logger.level = Logger::DEBUG
63
+ # Restr.log = logger
64
+ #
65
+ # Restr will now log its activity to the given Logger. Be careful when using
53
66
  class Restr
54
67
 
55
68
  module VERSION #:nodoc:
56
69
  MAJOR = 0
57
- MINOR = 3
70
+ MINOR = 4
58
71
  TINY = 0
59
72
 
60
73
  STRING = [MAJOR, MINOR, TINY].join('.')
@@ -62,6 +75,9 @@ class Restr
62
75
 
63
76
 
64
77
  @@log = nil
78
+ @@request_timeout = 3.minutes
79
+
80
+ cattr_accessor :request_timeout
65
81
 
66
82
  def self.logger=(logger)
67
83
  @@log = logger.dup
@@ -102,7 +118,7 @@ class Restr
102
118
  req.basic_auth auth[:username] || auth['username'], auth[:password] || auth['password']
103
119
  end
104
120
 
105
- unless method_mod == 'Get'
121
+ if params.kind_of?(Hash) && method_mod != 'Get' && method_mod != 'get'
106
122
  req.set_form_data(params, '&')
107
123
  end
108
124
 
@@ -111,26 +127,40 @@ class Restr
111
127
 
112
128
  client = Net::HTTP.new(uri.host, uri.port)
113
129
  client.use_ssl = (uri.scheme == 'https')
114
- res = client.start do |http|
115
- http.request(req)
130
+
131
+ timeout = Restr.request_timeout
132
+ client.read_timeout = timeout
133
+
134
+ begin
135
+ res = client.start do |http|
136
+ http.request(req)
137
+ end
138
+ rescue Timeout::Error
139
+ res = TimeoutError, "Request timed out after #{timeout} seconds."
116
140
  end
117
141
 
118
142
  case res
119
143
  when Net::HTTPSuccess
120
- if res.content_type == 'text/xml'
121
- @@log.debug("Got XML response.") if @@log
144
+ if res.content_type =~ /[\/+]xml$/
145
+ @@log.debug("Got XML response: \n#{res.body}") if @@log
122
146
  return XmlSimple.xml_in_string(res.body,
123
147
  'forcearray' => false,
124
148
  'keeproot' => false
125
149
  )
126
150
  else
127
- @@log.debug("Got #{res.content_type.inspect} response.") if @@log
151
+ @@log.debug("Got #{res.content_type.inspect} response: \n#{res.body}") if @@log
128
152
  return res.body
129
153
  end
154
+ when TimeoutError
155
+ @@log.debug(res) if @@log
156
+ return XmlSimple.xml_in_string(res,
157
+ 'forcearray' => false,
158
+ 'keeproot' => false
159
+ )
130
160
  else
131
161
  $LAST_ERROR_BODY = res.body # FIXME: this is dumb... need a better way of reporting errors
132
162
  @@log.error("Got error response '#{res.message}(#{res.code})': #{$LAST_ERROR_BODY}") if @@log
133
- res.error!
163
+ res.error!
134
164
  end
135
165
  end
136
166
 
@@ -38,7 +38,17 @@
38
38
  <h1>&#x2192; &#8216;restr&#8217;</h1>
39
39
 
40
40
 
41
- <h2>What</h2>
41
+ <h3>Copyright&#169; 2008 Urbacon Ltd.</h3>
42
+
43
+
44
+ <h2>What is it?</h2>
45
+
46
+
47
+ <p><b>Restr is a very simple client for <a href="http://en.wikipedia.org/wiki/Representational_State_Transfer">RESTful</a> web services.</b>
48
+ It was developed as a lightweight alternative to <a href="http://api.rubyonrails.com/files/vendor/rails/activeresource/README.html">ActiveResource</a>.</p>
49
+
50
+
51
+ <p>For project info and downloads please see the Restr&#8217;s <a href="http://rubyforge.org/projects/restr">RubyForge Page</a></p>
42
52
 
43
53
 
44
54
  <h2>Installing</h2>
@@ -47,40 +57,57 @@
47
57
  <p><pre class='syntax'><span class="ident">sudo</span> <span class="ident">gem</span> <span class="ident">install</span> <span class="ident">restr</span></pre></p>
48
58
 
49
59
 
50
- <h2>The basics</h2>
60
+ <h2>Usage Example</h2>
51
61
 
52
62
 
53
- <h2>Demonstration of usage</h2>
63
+ <p>Fetch Kitten with id 1 and print out its name and colour:</p>
54
64
 
55
65
 
56
- <h2>Forum</h2>
66
+ <pre><code>require 'restr'
67
+ kitten = Restr.get('http://example.com/kittens/1.xml')
68
+ puts kitten['name']
69
+ puts kitten['colour']</code></pre>
57
70
 
58
71
 
59
- <p><a href="http://groups.google.com/group/restr">http://groups.google.com/group/restr</a></p>
72
+ <p>Change the Kitten&#8217;s colour and store the modification:</p>
60
73
 
61
74
 
62
- <p><span class="caps">TODO</span> &#8211; create Google Group &#8211; restr</p>
75
+ <pre><code>kitten['colour'] = 'black'
76
+ kitten = Restr.put('http://example.com/kittens/1.xml', kitten)</code></pre>
63
77
 
64
78
 
65
- <h2>How to submit patches</h2>
79
+ <h2>Further Resources</h2>
80
+
66
81
 
82
+ <ul>
83
+ <li><a href="http://restr.rubyforge.org/rdoc/" title="RDocs">Full <span class="caps">API</span> Documentation</a></li>
84
+ </ul>
67
85
 
68
- <p>Read the <a href="http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/">8 steps for fixing other people&#8217;s code</a> and for section <a href="http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/#8b-google-groups">8b: Submit patch to Google Groups</a>, use the Google Group above.</p>
86
+
87
+ <h2>How to submit patches</h2>
69
88
 
70
89
 
71
- <p>The trunk repository is <code>svn://rubyforge.org/var/svn/restr/trunk</code> for anonymous access.</p>
90
+ <ul>
91
+ <li>See below for author&#8217;s contact info.</li>
92
+ <li>The trunk repository is <code>svn://rubyforge.org/var/svn/restr/trunk</code> for anonymous access.</li>
93
+ </ul>
72
94
 
73
95
 
74
96
  <h2>License</h2>
75
97
 
76
98
 
77
- <p>This code is free to use under the terms of the <span class="caps">MIT</span> license.</p>
99
+ <ul>
100
+ <li><a href="http://www.gnu.org/licenses/lgpl.html">Lesser <span class="caps">GPL</span> Version 3</a></li>
101
+ </ul>
78
102
 
79
103
 
80
104
  <h2>Contact</h2>
81
105
 
82
106
 
83
- <p>Comments are welcome. Send an email to <a href="mailto:FIXME"><span class="caps">FIXME</span> full name</a> email via the <a href="http://groups.google.com/group/restr">forum</a></p>
107
+ <ul>
108
+ <li><a href="http://rubyforge.org/users/gunark/">Author&#8217;s Rubyforge Page</a></li>
109
+ <li><a href="http://rubyforge.org/forum/?group_id=5848">Restr RubyForge Forum</a></li>
110
+ </ul>
84
111
  <p class="coda">
85
112
  <a href="FIXME email">FIXME full name</a>, 3rd April 2008<br>
86
113
  Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
@@ -2,38 +2,47 @@ h1. restr
2
2
 
3
3
  h1. &#x2192; 'restr'
4
4
 
5
+ h3. Copyright (c) 2008 Urbacon Ltd.
5
6
 
6
- h2. What
7
+ h2. What is it?
7
8
 
9
+ <b>Restr is a very simple client for "RESTful":http://en.wikipedia.org/wiki/Representational_State_Transfer web services.</b>
10
+ It was developed as a lightweight alternative to "ActiveResource":http://api.rubyonrails.com/files/vendor/rails/activeresource/README.html.
11
+
12
+ For project info and downloads please see the Restr's "RubyForge Page":http://rubyforge.org/projects/restr
8
13
 
9
14
  h2. Installing
10
15
 
11
16
  <pre syntax="ruby">sudo gem install restr</pre>
12
17
 
13
- h2. The basics
14
-
15
-
16
- h2. Demonstration of usage
18
+ h2. Usage Example
17
19
 
20
+ Fetch Kitten with id 1 and print out its name and colour:
18
21
 
22
+ require 'restr'
23
+ kitten = Restr.get('http://example.com/kittens/1.xml')
24
+ puts kitten['name']
25
+ puts kitten['colour']
26
+
27
+ Change the Kitten's colour and store the modification:
28
+
29
+ kitten['colour'] = 'black'
30
+ kitten = Restr.put('http://example.com/kittens/1.xml', kitten)
19
31
 
20
- h2. Forum
32
+ h2. Further Resources
21
33
 
22
- "http://groups.google.com/group/restr":http://groups.google.com/group/restr
23
-
24
- TODO - create Google Group - restr
34
+ * "Full API Documentation (RDocs)":http://restr.rubyforge.org/rdoc/
25
35
 
26
36
  h2. How to submit patches
27
37
 
28
- Read the "8 steps for fixing other people's code":http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/ and for section "8b: Submit patch to Google Groups":http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/#8b-google-groups, use the Google Group above.
29
-
30
- The trunk repository is <code>svn://rubyforge.org/var/svn/restr/trunk</code> for anonymous access.
38
+ * See below for author's contact info.
39
+ * The trunk repository is <code>svn://rubyforge.org/var/svn/restr/trunk</code> for anonymous access.
31
40
 
32
41
  h2. License
33
42
 
34
- This code is free to use under the terms of the MIT license.
43
+ * "Lesser GPL Version 3":http://www.gnu.org/licenses/lgpl.html
35
44
 
36
45
  h2. Contact
37
46
 
38
- Comments are welcome. Send an email to "FIXME full name":mailto:FIXME email via the "forum":http://groups.google.com/group/restr
39
-
47
+ * "Author's Rubyforge Page":http://rubyforge.org/users/gunark/
48
+ * "Restr RubyForge Forum":http://rubyforge.org/forum/?group_id=5848
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: restr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Zukowski
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-04-03 00:00:00 -04:00
12
+ date: 2008-06-19 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies: []
15
15