wrest 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -1,10 +1,21 @@
1
- = Wrest
1
+ = Wrest
2
2
 
3
3
  (c) Copyright 2009 {Sidu Ponnappa}[http://blog.sidu.in]. All Rights Reserved.
4
4
 
5
5
  Wrest is a ruby REST client library which allows you to quickly build object oriented wrappers around any web service. It has two components - Wrest Core and Wrest::Resource.
6
6
 
7
- Since no single framework can provide an object oriented wrapper suitable for _all_ available web services, it follows that Wrest should focus on providing you with the tools to help you roll your own with ease. Wrest::Resource is an example of this - an object oriented wrapper for the kind of REST APIs exposed by Rails applications built using Wrest Core.
7
+ If you were wondering why the words 'demon', 'chi' and 'puppies' (among others) show up in nearly every example and spec, it's because they all refer to characters and ideas from {Roger Zelazny's}[http://en.wikipedia.org/wiki/Roger_Zelazny] last book, 'Lord Demon.'
8
+
9
+ == Wrest Core: Features
10
+
11
+ * Provides convenient HTTP wrappers, serialisation and deserialisation with caching and redirect handling in the works.
12
+ * Designed to be used as a library, not just a command line REST client (fewer class methods, more object oriented)
13
+ * Isn't coupled to Rails (usable in a pure Ruby application to consume any HTTP/REST api)
14
+ * Can be used both stand alone as well as to build object oriented abstractions around resources and web services (Wrest::Resource is an example of the latter)
15
+
16
+ == Examples
17
+
18
+ See http://github.com/kaiwren/wrest/tree/master/examples
8
19
 
9
20
  == Installation
10
21
 
@@ -12,20 +23,14 @@ The source is available at git://github.com/kaiwren/wrest.git
12
23
 
13
24
  To install as a Rails plugin, do <tt>script/plugin install git://github.com/kaiwren/wrest.git</tt>
14
25
 
15
- To install the Wrest gem, do <tt>sudo gem install wrest</tt>; Wrest is also available as a gem for JRuby using the same command.
16
-
17
- == Wrest Core
18
-
19
- * Designed to be used as a library, not just a command line REST client
20
- * Provides infrastructure components such as convenient HTTP wrappers api, caching, redirect handling, serialisation, deserialisation etc.
21
- * Isn't coupled to Rails (usable in a pure Ruby application to consume any REST api)
22
- * Can be used both stand alone as well as to build object oriented abstractions around web services (Wrest::Resource is an example of the latter)
26
+ To install the Wrest gem, do <tt>(sudo) gem install wrest</tt>
27
+ Wrest is also available as a gem for JRuby; you can instally it by running <tt>(sudo) jruby -S gem install wrest</tt>.
23
28
 
24
29
  === Usage: Shell
25
30
 
26
31
  You can launch the interactive Wrest shell by running bin/wrest if you have the source or invoking <tt>wrest</tt> from your prompt if you've installed the gem.
27
32
  $ wrest
28
- >> "http://search.yahooapis.com/NewsSearchService/V1/newsSearch?appid=YahooDemo&output=json&query=India&results=3&start=1".to_uri.get
33
+ >> y 'http://twitter.com/statuses/public_timeline.json'.to_uri.get.deserialise
29
34
 
30
35
  === Usage: Library
31
36
 
@@ -38,11 +43,11 @@ You can launch the interactive Wrest shell by running bin/wrest if you have the
38
43
  :results=> '3',
39
44
  :start => '1'
40
45
  )
41
- === Basic Http Calls
46
+ === Usage: Basic Http Calls
42
47
 
43
48
  ==== GET
44
49
 
45
- A couple of ways to get the Yahoo news as hash map.
50
+ A couple of ways to get Yahoo news as a hash map.
46
51
 
47
52
  * This example simply does a get on a uri and figures out the appropriate deserialiser using the content-type (in this case 'text/javascript', which uses Wrest::Translators::Json). See content_types.rb under lib/wrest/mappers/translators.
48
53
  "http://search.yahooapis.com/NewsSearchService/V1/newsSearch?appid=YahooDemo&output=json&query=India&results=3&start=1".to_uri.get.deserialise
@@ -60,8 +65,20 @@ A couple of ways to get the Yahoo news as hash map.
60
65
  ).deserialise_using(
61
66
  Translators::Xml
62
67
  ).mutate_using(
63
- Mutators::XmlSimpleTypeCaster.new
64
- )
68
+ Mutators::XmlMiniTypeCaster.new
69
+ )
70
+
71
+ ==== DELETE
72
+
73
+ To delete a resource:
74
+
75
+ 'https://api.del.icio.us/v1/posts/delete'.to_uri(
76
+ :username => 'kaiwren',
77
+ :password => 'fupupp1es'
78
+ ).delete(
79
+ :url => 'http://c2.com'
80
+ )
81
+
65
82
 
66
83
  ==== OPTIONS
67
84
 
@@ -70,7 +87,7 @@ To find out what actions are permitted on a URI:
70
87
  'http://www.yahoo.com'.to_uri.options.headers['allow']
71
88
 
72
89
 
73
- === Attributes Container
90
+ === Usage: Attributes Container
74
91
 
75
92
  Allows any class to hold an attributes hash, somewhat like ActiveResource. It also supports several extensions to this base fuctionality such as support for typecasting attribute values.
76
93
 
@@ -80,18 +97,18 @@ Example:
80
97
  include Wrest::Components::AttributesContainer
81
98
  include Wrest::Components::AttributesContainer::Typecaster
82
99
 
83
- always_has :id
100
+ always_has :id
84
101
  typecast :age => as_integer,
85
102
  :chi => lambda{|chi| Chi.new(chi)}
86
103
  end
87
104
 
88
105
  kai_wren = Demon.new('id => '1', 'age' => '1500', 'chi' => '1024', 'teacher' => 'Viss')
89
- kai_wren.id # => '1'
90
- kai_wren.age # => 1500
91
- kai_wren.chi # => #<Chi:0x113af8c @count="1024">
106
+ kai_wren.id # => '1'
107
+ kai_wren.age # => 1500
108
+ kai_wren.chi # => #<Chi:0x113af8c @count="1024">
92
109
  kai_wren.teacher # => 'Viss'
93
110
 
94
- === Logging
111
+ === Usage: Logging
95
112
 
96
113
  The Wrest logger can be set and accessed through Wrest.logger and is configured by default to log to STDOUT. If you're using Wrest in a Rails application, you can configure logging by placing the following line in your environment file:
97
114
  Wrest.logger = ActiveRecord::Base.logger
@@ -106,7 +123,8 @@ Wrest RDocs can be found at http://wrest.rubyforge.org
106
123
 
107
124
  == Wrest::Resource
108
125
 
109
- Wrest::Resource is an alternative to ActiveResource. It targets Rails REST (well, POX - turns out Rails isn't really REST) services and is currently under development.
126
+ Wrest::Resource is an alternative to Rails' ActiveResource. It targets Rails REST (well, POX, since Rails isn't really RESTful) services and is currently under development. Since no single REST library can provide an object oriented wrapper suitable for _all_ available web services, it follows that Wrest should focus on providing you with the tools to help you roll your own. Wrest::Resource is an example of this - an object oriented wrapper for the kind of REST APIs exposed by Rails applications, that you would otherwise use ActiveResource to consume.
127
+
110
128
 
111
129
  * No more pretending that REST resources are the same as records in a database (yeah, no more freaking ActiveResource::Connection)
112
130
  * Treat put as 'create or update,' not just 'update'
@@ -123,6 +141,7 @@ Wrest::Resource is an alternative to ActiveResource. It targets Rails REST (well
123
141
  * More natural mapping of deserialised entities to existing classes
124
142
  * No communication via exceptions for http error status codes
125
143
  * Better extensibility - allows access to request/response objects, avoids class variables, favours symbols over strings etc.
144
+ * Content Types in request headers
126
145
  * Consider support for OPTIONS and response codes 100/417
127
146
 
128
147
  == Dependencies
data/Rakefile CHANGED
@@ -7,13 +7,24 @@
7
7
  # is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8
8
  # See the License for the specific language governing permissions and limitations under the License.
9
9
 
10
- require 'rubygems'
11
- gem 'rspec'
12
- require 'rake'
13
- require 'spec'
14
- require 'spec/rake/spectask'
15
-
16
10
  puts "Building on Ruby #{RUBY_VERSION}, #{RUBY_RELEASE_DATE}, #{RUBY_PLATFORM}"
11
+ puts "Note that some optional libraries/gems that the build (not Wrest itself) uses may not be available on all implementations of Ruby."
12
+
13
+ if Object.const_defined?('RAILS_ROOT')
14
+ require File.dirname(__FILE__) + '/../../../config/environment'
15
+ else
16
+ require 'rubygems'
17
+ gem 'rspec'
18
+ require 'rake'
19
+ require 'spec'
20
+ require 'spec/rake/spectask'
21
+
22
+ begin
23
+ require 'metric_fu'
24
+ rescue LoadError
25
+ puts 'metric_fu is not available. Install it with: gem install jscruggs-metric_fu -s http://gems.github.com'
26
+ end
27
+ end
17
28
 
18
29
  desc 'Default: run spec tests.'
19
30
  task :default => :spec
@@ -27,9 +38,9 @@ end
27
38
  begin
28
39
  require 'hanna/rdoctask'
29
40
  rescue LoadError
30
- puts 'Hanna not available, using standard Rake rdoctask. Fix this by running gem install mislav-hanna.'
41
+ puts 'Hanna not available, using standard Rake rdoctask. Install it with: gem install mislav-hanna.'
31
42
  require 'rake/rdoctask'
32
- end
43
+ end
33
44
  desc 'Generate documentation for Wrest'
34
45
  Rake::RDocTask.new(:rdoc) do |rdoc|
35
46
  rdoc.rdoc_dir = 'rdoc'
@@ -74,15 +85,15 @@ begin
74
85
  gemspec.add_dependency('activesupport', '>= 2.3.2')
75
86
  case RUBY_PLATFORM
76
87
  when /java/
77
- gemspec.add_dependency('json-jruby', '>= 1.1.3')
88
+ gemspec.add_dependency('json-jruby', '>= 1.1.3')
78
89
  gemspec.platform = 'java'
79
90
  else
80
- gemspec.add_dependency('json', '>= 1.1.3')
91
+ gemspec.add_dependency('json', '>= 1.1.3')
81
92
  gemspec.platform = Gem::Platform::RUBY
82
93
  end
83
94
  end
84
95
  rescue LoadError
85
- puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
96
+ puts "Jeweler not available. Install it with: gem install technicalpickles-jeweler -s http://gems.github.com"
86
97
  end
87
98
 
88
99
  begin
data/VERSION.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  ---
2
- :patch: 7
2
+ :patch: 8
3
3
  :minor: 0
4
4
  :major: 0
@@ -0,0 +1,58 @@
1
+ # Copyright 2009 Sidu Ponnappa
2
+
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+ # Unless required by applicable law or agreed to in writing, software distributed under the License
7
+ # is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8
+ # See the License for the specific language governing permissions and limitations under the License.
9
+
10
+ require File.expand_path(File.dirname(__FILE__) + "/../lib/wrest")
11
+ require 'pp'
12
+
13
+ Wrest.logger = Logger.new(STDOUT)
14
+ Wrest.logger.level = Logger::DEBUG # Set this to Logger::INFO or higher to disable request logging
15
+
16
+ # API reference: http://delicious.com/help/api
17
+ class Delicious
18
+ def initialize(options)
19
+ @uri = "https://api.del.icio.us/v1/posts".to_uri(options)
20
+ end
21
+
22
+ def bookmarks(parameters = {})
23
+ @uri['/get'].get(parameters)
24
+ end
25
+
26
+ def recent(parameters = {})
27
+ @uri['/recent'].get(parameters)
28
+ end
29
+
30
+ def bookmark(parameters)
31
+ @uri['/add'].post('', {}, parameters)
32
+ end
33
+
34
+ def delete(parameters)
35
+ @uri['/delete'].delete(parameters)
36
+ end
37
+ end
38
+
39
+ account = Delicious.new :username => 'kaiwren', :password => 'fupupp1es'
40
+
41
+ pp account.bookmark(
42
+ :url => 'http://blog.sidu.in/search/label/ruby',
43
+ :description => 'The Ruby related posts on my blog!',
44
+ :extended => "All posts tagged with 'ruby'",
45
+ :tags => 'ruby hacking'
46
+ ).deserialise
47
+
48
+ puts '----------'
49
+
50
+ pp account.bookmarks(:tag => 'rails', :dt => '20090712').deserialise
51
+
52
+ puts '----------'
53
+
54
+ pp recently_saved_uris = account.recent(:tag => 'ruby').deserialise["posts"]["post"].collect{|bookmark| bookmark['href']}
55
+
56
+ puts '----------'
57
+
58
+ pp account.delete(:url => 'http://blog.sidu.in/search/label/ruby').deserialise
@@ -0,0 +1,57 @@
1
+ # Copyright 2009 Sidu Ponnappa
2
+
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+ # Unless required by applicable law or agreed to in writing, software distributed under the License
7
+ # is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8
+ # See the License for the specific language governing permissions and limitations under the License.
9
+
10
+ require File.expand_path(File.dirname(__FILE__) + "/../lib/wrest")
11
+
12
+ Wrest.logger = Logger.new(STDOUT)
13
+ Wrest.logger.level = Logger::DEBUG # Set this to Logger::INFO or higher to disable request logging
14
+
15
+ include Wrest
16
+
17
+ class Realm
18
+ include Components::AttributesContainer
19
+ include Components::AttributesContainer::Typecaster
20
+
21
+ typecast :t => lambda{|type|
22
+ case type
23
+ when '1' then 'Normal'
24
+ when '2' then 'PvP'
25
+ when '3' then 'RP'
26
+ when '4' then 'RP PvP'
27
+ end
28
+ },
29
+ :s => lambda{|status|
30
+ case status
31
+ when '1' then 'Available'
32
+ else 'Unavailable'
33
+ end
34
+ },
35
+ :l => lambda{|load|
36
+ case load
37
+ when '1' then 'Low'
38
+ when '2' then 'Normal'
39
+ when '3' then 'High'
40
+ when '4' then 'Max'
41
+ end
42
+ }
43
+
44
+ def available?
45
+ self.s == 'Available'
46
+ end
47
+ end
48
+
49
+ realms = "http://www.worldofwarcraft.com/realmstatus/status.xml".to_uri.get.deserialise['page']['rs']['r'].collect{|data| Realm.new(data)}
50
+
51
+ puts "Status of Nagrand: #{realms.find{|realm| realm.n == 'Nagrand'}.s}"
52
+ puts
53
+ puts "All Available Realms:"
54
+ puts
55
+ puts "Realm\tLoad\tType"
56
+ puts "-----------"
57
+ realms.select(&:available?).each{|realm| puts "#{realm.n}\t#{realm.l}\t#{realm.t}" }
@@ -100,8 +100,6 @@ module Wrest::Components
100
100
  # own class.
101
101
  def initialize(attributes = {})
102
102
  @attributes = attributes.symbolize_keys
103
- @interface = Module.new
104
- self.extend @interface
105
103
  end
106
104
 
107
105
  def [](key)
@@ -124,11 +122,11 @@ module Wrest::Components
124
122
  if @attributes.include?(attribute_name.to_sym) || method_name.last == '='
125
123
  case method_name.last
126
124
  when '='
127
- @interface.module_eval AttributesContainer.build_attribute_setter(attribute_name)
125
+ self.instance_eval AttributesContainer.build_attribute_setter(attribute_name)
128
126
  when '?'
129
- @interface.module_eval AttributesContainer.build_attribute_queryer(attribute_name)
127
+ self.instance_eval AttributesContainer.build_attribute_queryer(attribute_name)
130
128
  else
131
- @interface.module_eval AttributesContainer.build_attribute_getter(attribute_name)
129
+ self.instance_eval AttributesContainer.build_attribute_getter(attribute_name)
132
130
  end
133
131
  send(method_sym, *arguments)
134
132
  else
@@ -14,8 +14,8 @@ module Wrest
14
14
  module Conversions
15
15
 
16
16
  # A convenience method equivalent to Wrest::Uri.new(string)
17
- def to_uri
18
- Wrest::Uri.new(self)
17
+ def to_uri(options = {})
18
+ Wrest::Uri.new(self, options)
19
19
  end
20
20
  end
21
21
  end
@@ -0,0 +1,23 @@
1
+ # Copyright 2009 Sidu Ponnappa
2
+
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+ # Unless required by applicable law or agreed to in writing, software distributed under the License
7
+ # is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8
+ # See the License for the specific language governing permissions and limitations under the License.
9
+
10
+ module Wrest::Http
11
+ class Delete < Request
12
+ def initialize(wrest_uri, parameters = {}, headers = {}, options = {})
13
+ super(
14
+ wrest_uri,
15
+ Net::HTTP::Delete,
16
+ parameters,
17
+ nil,
18
+ headers,
19
+ options
20
+ )
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ # Copyright 2009 Sidu Ponnappa
2
+
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+ # Unless required by applicable law or agreed to in writing, software distributed under the License
7
+ # is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8
+ # See the License for the specific language governing permissions and limitations under the License.
9
+
10
+ module Wrest::Http
11
+ class Get < Request
12
+ def initialize(wrest_uri, parameters = {}, headers = {}, options = {})
13
+ super(
14
+ wrest_uri,
15
+ Net::HTTP::Get,
16
+ parameters,
17
+ nil,
18
+ headers,
19
+ options
20
+ )
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ # Copyright 2009 Sidu Ponnappa
2
+
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+ # Unless required by applicable law or agreed to in writing, software distributed under the License
7
+ # is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8
+ # See the License for the specific language governing permissions and limitations under the License.
9
+
10
+ module Wrest::Http
11
+ class Options < Request
12
+ def initialize(wrest_uri, options = {})
13
+ super(
14
+ wrest_uri,
15
+ Net::HTTP::Options,
16
+ {},
17
+ nil,
18
+ {},
19
+ options
20
+ )
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ # Copyright 2009 Sidu Ponnappa
2
+
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+ # Unless required by applicable law or agreed to in writing, software distributed under the License
7
+ # is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8
+ # See the License for the specific language governing permissions and limitations under the License.
9
+
10
+ module Wrest::Http
11
+ class Post < Request
12
+ def initialize(wrest_uri, body = '', headers = {}, parameters = {}, options = {})
13
+ super(
14
+ wrest_uri,
15
+ Net::HTTP::Post,
16
+ parameters,
17
+ body,
18
+ headers,
19
+ options
20
+ )
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ # Copyright 2009 Sidu Ponnappa
2
+
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+ # Unless required by applicable law or agreed to in writing, software distributed under the License
7
+ # is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8
+ # See the License for the specific language governing permissions and limitations under the License.
9
+
10
+ module Wrest::Http
11
+ class Put < Request
12
+ def initialize(wrest_uri, body = '', headers = {}, parameters = {}, options = {})
13
+ super(
14
+ wrest_uri,
15
+ Net::HTTP::Put,
16
+ parameters,
17
+ body,
18
+ headers,
19
+ options
20
+ )
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,48 @@
1
+ # Copyright 2009 Sidu Ponnappa
2
+
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+ # Unless required by applicable law or agreed to in writing, software distributed under the License
7
+ # is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8
+ # See the License for the specific language governing permissions and limitations under the License.
9
+
10
+ module Wrest::Http
11
+ class Request
12
+ attr_reader :http_request, :uri, :body, :headers, :username, :password
13
+ def initialize(wrest_uri, http_request_klass, parameters = {}, body = nil, headers = {}, options = {})
14
+ @uri = wrest_uri
15
+ @headers = headers.stringify_keys
16
+ @http_request = http_request_klass.new(parameters.empty? ? wrest_uri.full_path : "#{wrest_uri.full_path}?#{parameters.to_query}", @headers)
17
+ @body = body
18
+ @options = options
19
+ @username = options[:username]
20
+ @password = options[:password]
21
+ end
22
+
23
+ # Makes a request and returns a Wrest::Http::Response.
24
+ # Data about the request is and logged to Wrest.logger
25
+ def invoke
26
+ response = nil
27
+
28
+ prefix = "#{http_request.method} #{http_request.hash}"
29
+ http_request.basic_auth username, password
30
+
31
+ Wrest.logger.debug "--> (#{prefix}) #{@uri.protocol}://#{@uri.host}:#{@uri.port}#{@http_request.path}"
32
+ time = Benchmark.realtime { response = Wrest::Http::Response.new( http.request(@http_request, @body) ) }
33
+ Wrest.logger.debug "<-- (#{prefix}) %d %s (%d bytes %.2fs)" % [response.code, response.message, response.body ? response.body.length : 0, time]
34
+
35
+ response
36
+ end
37
+
38
+ private
39
+ def http
40
+ http = Net::HTTP.new(@uri.host, @uri.port)
41
+ if @uri.https?
42
+ http.use_ssl = true
43
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
44
+ end
45
+ http
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,44 @@
1
+ # Copyright 2009 Sidu Ponnappa
2
+
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at Http://www.apache.org/licenses/LICENSE-2.0
6
+ # Unless required by applicable law or agreed to in writing, software distributed under the License
7
+ # is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8
+ # See the License for the specific language governing permissions and limitations under the License.
9
+
10
+ module Wrest #:nodoc:
11
+ module Http #:nodoc:
12
+ # Decorates a response providing support for deserialisation.
13
+ #
14
+ # The following methods are also available (unlisted by rdoc because they're forwarded):
15
+ #
16
+ # <tt>:@Http_response, :code, :message, :body, :Http_version,
17
+ # :[], :content_length, :content_type, :each_header, :each_name, :each_value, :fetch,
18
+ # :get_fields, :key?, :type_params</tt>
19
+ #
20
+ # They behave exactly like their Net::HttpResponse equivalents.
21
+ class Response
22
+ extend Forwardable
23
+ def_delegators :@http_response, :code, :message, :body, :Http_version,
24
+ :[], :content_length, :content_type, :each_header, :each_name, :each_value, :fetch,
25
+ :get_fields, :key?, :type_params
26
+
27
+ def initialize(http_response)
28
+ @http_response = http_response
29
+ end
30
+
31
+ def deserialise
32
+ deserialise_using(Wrest::Components::Translators.lookup(@http_response.content_type))
33
+ end
34
+
35
+ def deserialise_using(translator)
36
+ translator.deserialise(@http_response)
37
+ end
38
+
39
+ def headers
40
+ @http_response.to_hash
41
+ end
42
+ end
43
+ end
44
+ end
data/lib/wrest/http.rb ADDED
@@ -0,0 +1,24 @@
1
+ # Copyright 2009 Sidu Ponnappa
2
+
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+ # Unless required by applicable law or agreed to in writing, software distributed under the License
7
+ # is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8
+ # See the License for the specific language governing permissions and limitations under the License.
9
+
10
+ module Wrest #:nodoc:
11
+
12
+ # Contains all HTTP protocol related classes such as
13
+ # Get, Post, Request, Response etc.
14
+ module Http
15
+ end
16
+ end
17
+
18
+ require "#{WREST_ROOT}/wrest/http/response"
19
+ require "#{WREST_ROOT}/wrest/http/request"
20
+ require "#{WREST_ROOT}/wrest/http/get"
21
+ require "#{WREST_ROOT}/wrest/http/put"
22
+ require "#{WREST_ROOT}/wrest/http/post"
23
+ require "#{WREST_ROOT}/wrest/http/delete"
24
+ require "#{WREST_ROOT}/wrest/http/options"