nap 0.1 → 0.2
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.
- data/README +23 -3
- data/lib/rest.rb +55 -8
- data/lib/rest/request.rb +43 -4
- data/lib/rest/response.rb +14 -1
- metadata +2 -2
data/README
CHANGED
@@ -1,4 +1,24 @@
|
|
1
|
-
Nap
|
2
|
-
---
|
1
|
+
= Nap
|
3
2
|
|
4
|
-
It be an extremely simple REST library, yo!
|
3
|
+
It be an extremely simple REST library, yo!
|
4
|
+
|
5
|
+
== Example
|
6
|
+
|
7
|
+
gem 'nap'
|
8
|
+
require 'rest'
|
9
|
+
require 'json'
|
10
|
+
|
11
|
+
response = REST.get('http://twitter.com/statuses/friends_timeline.json', {},
|
12
|
+
{:username => '_evan', :password => 'buttonscat'}
|
13
|
+
)
|
14
|
+
if response.ok?
|
15
|
+
timeline = JSON.parse(response.body)
|
16
|
+
puts(timeline.map do |item|
|
17
|
+
"#{item['user']['name']}\n\n#{item['text']}"
|
18
|
+
end.join("\n\n--\n\n"))
|
19
|
+
elsif response.forbidden?
|
20
|
+
puts "Are you sure you're `_evan' and your password is the name of your cat?"
|
21
|
+
else
|
22
|
+
puts "Something went wrong (#{response.status_code})"
|
23
|
+
puts response.body
|
24
|
+
end
|
data/lib/rest.rb
CHANGED
@@ -1,20 +1,67 @@
|
|
1
1
|
require 'uri'
|
2
2
|
|
3
|
+
# REST is basically a convenience wrapper around Net::HTTP. It defines a simple and consistant API for doing REST-style
|
4
|
+
# HTTP calls.
|
3
5
|
module REST
|
4
|
-
|
5
|
-
|
6
|
+
# Performs a HEAD on a resource. See REST::Request.new for a complete discussion of options.
|
7
|
+
#
|
8
|
+
# response = REST.get('http://example.com/pigeons/12',
|
9
|
+
# {'Accept' => 'text/plain'},
|
10
|
+
# {:username => 'admin', :password => 'secret'}
|
11
|
+
# )
|
12
|
+
# if response.ok?
|
13
|
+
# puts response.body
|
14
|
+
# else
|
15
|
+
# puts "Couldn't fetch your pigeon (#{response.status_code})"
|
16
|
+
# end
|
17
|
+
def self.get(uri, headers={}, options={})
|
18
|
+
REST::Request.perform(:get, URI.parse(uri), nil, headers, options)
|
6
19
|
end
|
7
20
|
|
8
|
-
|
9
|
-
|
21
|
+
# Performs a HEAD on a resource. See REST::Request.new for a complete discussion of options.
|
22
|
+
#
|
23
|
+
# response = REST.head('http://example.com/pigeons/12')
|
24
|
+
# if response.ok?
|
25
|
+
# puts "Your pigeon exists!"
|
26
|
+
# elsif response.found?
|
27
|
+
# puts "Someone moved your pigeon!"
|
28
|
+
# else
|
29
|
+
# puts "Couldn't fetch your pigeon (#{response.status_code})"
|
30
|
+
# end
|
31
|
+
def self.head(uri, headers={}, options={})
|
32
|
+
REST::Request.perform(:head, URI.parse(uri), nil, headers, options)
|
10
33
|
end
|
11
34
|
|
12
|
-
|
13
|
-
|
35
|
+
# Performs a PUT on a resource. See REST::Request.new for a complete discussion of options.
|
36
|
+
#
|
37
|
+
# response = REST.put('http://example.com/pigeons/12',
|
38
|
+
# {'Name' => 'Homer'}.to_xml,
|
39
|
+
# {'Accept' => 'application/xml, */*', 'Content-Type' => 'application/xml'}
|
40
|
+
# )
|
41
|
+
# if response.ok?
|
42
|
+
# puts "Your pigeon was renamed to 'Homer'!"
|
43
|
+
# else
|
44
|
+
# puts "Couldn't rename your pigeon (#{response.status_code})"
|
45
|
+
# puts XML.parse(response.body).reason
|
46
|
+
# end
|
47
|
+
def self.put(uri, body, headers={}, options={})
|
48
|
+
REST::Request.perform(:put, URI.parse(uri), body, headers, options)
|
14
49
|
end
|
15
50
|
|
16
|
-
|
17
|
-
|
51
|
+
# Performs a POST on a resource. See REST::Request.new for a complete discussion of options.
|
52
|
+
#
|
53
|
+
# response = REST.post('http://example.com/pigeons',
|
54
|
+
# {'Name' => 'Bowser'}.to_xml,
|
55
|
+
# {'Accept' => 'application/xml, */*', 'Content-Type' => 'application/xml'}
|
56
|
+
# )
|
57
|
+
# if response.created?
|
58
|
+
# puts "Created a new pigeon called 'Bowser'"
|
59
|
+
# else
|
60
|
+
# puts "Couldn't create your pigeon (#{response.status_code})"
|
61
|
+
# puts XML.parse(response.body).reason
|
62
|
+
# end
|
63
|
+
def self.post(uri, body, headers={}, options={})
|
64
|
+
REST::Request.perform(:post, URI.parse(uri), body, headers, options)
|
18
65
|
end
|
19
66
|
end
|
20
67
|
|
data/lib/rest/request.rb
CHANGED
@@ -1,17 +1,46 @@
|
|
1
1
|
require 'uri'
|
2
2
|
require 'net/http'
|
3
3
|
|
4
|
-
module REST
|
4
|
+
module REST #:nodoc:
|
5
|
+
# Request holds a HTTP request
|
5
6
|
class Request
|
6
|
-
attr_accessor :verb, :url, :body, :headers, :request
|
7
|
+
attr_accessor :verb, :url, :body, :headers, :options, :request
|
7
8
|
|
8
|
-
|
9
|
+
# * <tt>verb</tt>: The verb to use in the request, either :get, :head, :put, or :post
|
10
|
+
# * <tt>url</tt>: The URL to send the request to, must be a URI instance
|
11
|
+
# * <tt>body</tt>: The body to use in the request
|
12
|
+
# * <tt>headers</tt>: A hash of headers to add to the request
|
13
|
+
# * <tt>options</tt>: A hash of additional options
|
14
|
+
# * <tt>username</tt>: Username to use for basic authentication
|
15
|
+
# * <tt>password</tt>: Password to use for basic authentication
|
16
|
+
#
|
17
|
+
# Examples
|
18
|
+
#
|
19
|
+
# request = REST::Request.new(:get, URI.parse('http://example.com/pigeons/1'))
|
20
|
+
#
|
21
|
+
# request = REST::Request.new(:head, URI.parse('http://example.com/pigeons/1'))
|
22
|
+
#
|
23
|
+
# request = REST::Request.new(:post,
|
24
|
+
# URI.parse('http://example.com/pigeons'),
|
25
|
+
# {'name' => 'Homr'}.to_json,
|
26
|
+
# {'Accept' => 'application/json, */*', 'Content-Type' => 'application/json; charset=utf-8'}
|
27
|
+
# )
|
28
|
+
#
|
29
|
+
# request = REST::Request.new(:put,
|
30
|
+
# URI.parse('http://example.com/pigeons/1'),
|
31
|
+
# {'name' => 'Homer'}.to_json,
|
32
|
+
# {'Accept' => 'application/json, */*', 'Content-Type' => 'application/json; charset=utf-8'},
|
33
|
+
# {:username => 'Admin', :password => 'secret'}
|
34
|
+
# )
|
35
|
+
def initialize(verb, url, body=nil, headers={}, options={})
|
9
36
|
@verb = verb
|
10
37
|
@url = url
|
11
38
|
@body = body
|
12
39
|
@headers = headers
|
40
|
+
@options = options
|
13
41
|
end
|
14
42
|
|
43
|
+
# Performs the actual request and returns a REST::Response object with the response
|
15
44
|
def perform
|
16
45
|
case verb
|
17
46
|
when :get
|
@@ -24,11 +53,21 @@ module REST
|
|
24
53
|
when :post
|
25
54
|
self.request = Net::HTTP::Post.new(url.path, headers)
|
26
55
|
self.request.body = body
|
56
|
+
else
|
57
|
+
raise ArgumentError, "Unknown HTTP verb `#{verb}'"
|
27
58
|
end
|
59
|
+
|
60
|
+
if options[:username] and options[:password]
|
61
|
+
request.basic_auth(options[:username], options[:password])
|
62
|
+
end
|
63
|
+
|
28
64
|
response = Net::HTTP.new(url.host, url.port).start {|http| http.request(request) }
|
29
|
-
REST::Response.new(response.code, response.
|
65
|
+
REST::Response.new(response.code, response.instance_variable_get('@header'), response.body)
|
30
66
|
end
|
31
67
|
|
68
|
+
# Shortcut for REST::Request.new(*args).perform.
|
69
|
+
#
|
70
|
+
# See new for options.
|
32
71
|
def self.perform(*args)
|
33
72
|
request = new(*args)
|
34
73
|
request.perform
|
data/lib/rest/response.rb
CHANGED
@@ -1,7 +1,16 @@
|
|
1
|
-
module REST
|
1
|
+
module REST #:nodoc:
|
2
|
+
# Response holds a HTTP response
|
2
3
|
class Response
|
4
|
+
# These codes are used to define convenience boolean accessors on the response object.
|
5
|
+
#
|
6
|
+
# Examples
|
7
|
+
#
|
8
|
+
# REST::Response.new(200).ok? #=> true
|
9
|
+
# REST::Response.new(201).ok? #=> falses
|
10
|
+
# REST::Response.new(403).forbidden? #=> true
|
3
11
|
CODES = [
|
4
12
|
[200, :ok],
|
13
|
+
[201, :created],
|
5
14
|
[301, :moved_permanently],
|
6
15
|
[302, :found],
|
7
16
|
[400, :bad_request],
|
@@ -14,6 +23,9 @@ module REST
|
|
14
23
|
|
15
24
|
attr_accessor :body, :headers, :status_code
|
16
25
|
|
26
|
+
# * <tt>status_code</tt>: The status code of the response (ie. 200 or '404')
|
27
|
+
# * <tt>headers</tt>: The headers of the response
|
28
|
+
# * <tt>body</tt>: The body of the response
|
17
29
|
def initialize(status_code, headers={}, body='')
|
18
30
|
@status_code = status_code.to_i
|
19
31
|
@headers = headers
|
@@ -26,6 +38,7 @@ module REST
|
|
26
38
|
end
|
27
39
|
end
|
28
40
|
|
41
|
+
# Returns _true_ when the status code is in the 2XX range. Returns false otherwise.
|
29
42
|
def success?
|
30
43
|
(status_code.to_s =~ /2../) ? true : false
|
31
44
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: "0.
|
4
|
+
version: "0.2"
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Manfred Stienstra
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-
|
12
|
+
date: 2008-10-09 00:00:00 +02:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|