rest-client 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.
Potentially problematic release.
This version of rest-client might be problematic. Click here for more details.
- data/Rakefile +2 -2
- data/lib/resource.rb +58 -0
- data/lib/rest_client.rb +36 -12
- data/spec/resource_spec.rb +31 -0
- data/spec/rest_client_spec.rb +40 -13
- metadata +4 -2
data/Rakefile
CHANGED
@@ -30,7 +30,7 @@ require 'rake/gempackagetask'
|
|
30
30
|
require 'rake/rdoctask'
|
31
31
|
require 'fileutils'
|
32
32
|
|
33
|
-
version = "0.
|
33
|
+
version = "0.2"
|
34
34
|
name = "rest-client"
|
35
35
|
|
36
36
|
spec = Gem::Specification.new do |s|
|
@@ -75,7 +75,7 @@ Rake::RDocTask.new do |t|
|
|
75
75
|
t.options << '--line-numbers' << '--inline-source' << '-A cattr_accessor=object'
|
76
76
|
t.options << '--charset' << 'utf-8'
|
77
77
|
t.rdoc_files.include('README')
|
78
|
-
t.rdoc_files.include('lib
|
78
|
+
t.rdoc_files.include('lib/*.rb')
|
79
79
|
end
|
80
80
|
|
81
81
|
CLEAN.include [ 'pkg', '*.gem', '.config' ]
|
data/lib/resource.rb
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
module RestClient
|
2
|
+
# A class that can be instantiated for access to a RESTful resource,
|
3
|
+
# including authentication.
|
4
|
+
#
|
5
|
+
# Example:
|
6
|
+
#
|
7
|
+
# resource = RestClient::Resource.new('http://some/resource')
|
8
|
+
# jpg = resource.get(:accept => 'image/jpg')
|
9
|
+
#
|
10
|
+
# With HTTP basic authentication:
|
11
|
+
#
|
12
|
+
# resource = RestClient::Resource.new('http://protected/resource', 'user', 'pass')
|
13
|
+
# resource.delete
|
14
|
+
#
|
15
|
+
class Resource
|
16
|
+
attr_reader :url, :user, :password
|
17
|
+
|
18
|
+
def initialize(url, user=nil, password=nil)
|
19
|
+
@url = url
|
20
|
+
@user = user
|
21
|
+
@password = password
|
22
|
+
end
|
23
|
+
|
24
|
+
def get(headers={})
|
25
|
+
Request.execute(:method => :get,
|
26
|
+
:url => url,
|
27
|
+
:user => user,
|
28
|
+
:password => password,
|
29
|
+
:headers => headers)
|
30
|
+
end
|
31
|
+
|
32
|
+
def post(payload, headers={})
|
33
|
+
Request.execute(:method => :post,
|
34
|
+
:url => url,
|
35
|
+
:payload => payload,
|
36
|
+
:user => user,
|
37
|
+
:password => password,
|
38
|
+
:headers => headers)
|
39
|
+
end
|
40
|
+
|
41
|
+
def put(payload, headers={})
|
42
|
+
Request.execute(:method => :put,
|
43
|
+
:url => url,
|
44
|
+
:payload => payload,
|
45
|
+
:user => user,
|
46
|
+
:password => password,
|
47
|
+
:headers => headers)
|
48
|
+
end
|
49
|
+
|
50
|
+
def delete(headers={})
|
51
|
+
Request.execute(:method => :delete,
|
52
|
+
:url => url,
|
53
|
+
:user => user,
|
54
|
+
:password => password,
|
55
|
+
:headers => headers)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
data/lib/rest_client.rb
CHANGED
@@ -1,33 +1,51 @@
|
|
1
1
|
require 'uri'
|
2
2
|
require 'net/http'
|
3
3
|
|
4
|
+
require File.dirname(__FILE__) + '/resource'
|
5
|
+
|
4
6
|
# This module's static methods are the entry point for using the REST client.
|
5
7
|
module RestClient
|
6
8
|
def self.get(url, headers={})
|
7
|
-
Request.
|
9
|
+
Request.execute(:method => :get,
|
10
|
+
:url => url,
|
11
|
+
:headers => headers)
|
8
12
|
end
|
9
13
|
|
10
|
-
def self.post(url, payload
|
11
|
-
Request.
|
14
|
+
def self.post(url, payload, headers={})
|
15
|
+
Request.execute(:method => :post,
|
16
|
+
:url => url,
|
17
|
+
:payload => payload,
|
18
|
+
:headers => headers)
|
12
19
|
end
|
13
20
|
|
14
|
-
def self.put(url, payload
|
15
|
-
Request.
|
21
|
+
def self.put(url, payload, headers={})
|
22
|
+
Request.execute(:method => :put,
|
23
|
+
:url => url,
|
24
|
+
:payload => payload,
|
25
|
+
:headers => headers)
|
16
26
|
end
|
17
27
|
|
18
28
|
def self.delete(url, headers={})
|
19
|
-
Request.
|
29
|
+
Request.execute(:method => :delete,
|
30
|
+
:url => url,
|
31
|
+
:headers => headers)
|
20
32
|
end
|
21
33
|
|
22
34
|
# Internal class used to build and execute the request.
|
23
35
|
class Request
|
24
|
-
attr_reader :method, :url, :payload, :headers
|
36
|
+
attr_reader :method, :url, :payload, :headers, :user, :password
|
37
|
+
|
38
|
+
def self.execute(args)
|
39
|
+
new(args).execute
|
40
|
+
end
|
25
41
|
|
26
|
-
def initialize(
|
27
|
-
@method = method
|
28
|
-
@url = url
|
29
|
-
@payload = payload
|
30
|
-
@headers = headers
|
42
|
+
def initialize(args)
|
43
|
+
@method = args[:method] or raise ArgumentError, "must pass :method"
|
44
|
+
@url = args[:url] or raise ArgumentError, "must pass :url"
|
45
|
+
@payload = args[:payload]
|
46
|
+
@headers = args[:headers] || {}
|
47
|
+
@user = args[:user]
|
48
|
+
@password = args[:password]
|
31
49
|
end
|
32
50
|
|
33
51
|
def execute
|
@@ -70,11 +88,17 @@ module RestClient
|
|
70
88
|
class Unauthorized < Exception; end
|
71
89
|
|
72
90
|
def transmit(uri, req, payload)
|
91
|
+
setup_credentials(req)
|
92
|
+
|
73
93
|
Net::HTTP.start(uri.host, uri.port) do |http|
|
74
94
|
process_result http.request(req, payload || "")
|
75
95
|
end
|
76
96
|
end
|
77
97
|
|
98
|
+
def setup_credentials(req)
|
99
|
+
req.basic_auth(user, password) if user
|
100
|
+
end
|
101
|
+
|
78
102
|
def process_result(res)
|
79
103
|
if %w(200 201 202).include? res.code
|
80
104
|
res.body
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/base'
|
2
|
+
|
3
|
+
describe RestClient::Resource do
|
4
|
+
before do
|
5
|
+
@resource = RestClient::Resource.new('http://some/resource', 'jane', 'mypass')
|
6
|
+
end
|
7
|
+
|
8
|
+
it "GET" do
|
9
|
+
RestClient::Request.should_receive(:execute).with(:method => :get, :url => 'http://some/resource', :headers => {}, :user => 'jane', :password => 'mypass')
|
10
|
+
@resource.get
|
11
|
+
end
|
12
|
+
|
13
|
+
it "POST" do
|
14
|
+
RestClient::Request.should_receive(:execute).with(:method => :post, :url => 'http://some/resource', :payload => 'abc', :headers => { :content_type => 'image/jpg' }, :user => 'jane', :password => 'mypass')
|
15
|
+
@resource.post 'abc', :content_type => 'image/jpg'
|
16
|
+
end
|
17
|
+
|
18
|
+
it "PUT" do
|
19
|
+
RestClient::Request.should_receive(:execute).with(:method => :put, :url => 'http://some/resource', :payload => 'abc', :headers => { :content_type => 'image/jpg' }, :user => 'jane', :password => 'mypass')
|
20
|
+
@resource.put 'abc', :content_type => 'image/jpg'
|
21
|
+
end
|
22
|
+
|
23
|
+
it "DELETE" do
|
24
|
+
RestClient::Request.should_receive(:execute).with(:method => :delete, :url => 'http://some/resource', :headers => {}, :user => 'jane', :password => 'mypass')
|
25
|
+
@resource.delete
|
26
|
+
end
|
27
|
+
|
28
|
+
it "can instantiate with no user/password" do
|
29
|
+
@resource = RestClient::Resource.new('http://some/resource')
|
30
|
+
end
|
31
|
+
end
|
data/spec/rest_client_spec.rb
CHANGED
@@ -2,38 +2,30 @@ require File.dirname(__FILE__) + '/base'
|
|
2
2
|
|
3
3
|
describe RestClient do
|
4
4
|
context "public API" do
|
5
|
-
before do
|
6
|
-
@request = mock("restclient request")
|
7
|
-
end
|
8
|
-
|
9
5
|
it "GET" do
|
10
|
-
RestClient::Request.should_receive(:
|
11
|
-
@request.should_receive(:execute)
|
6
|
+
RestClient::Request.should_receive(:execute).with(:method => :get, :url => 'http://some/resource', :headers => {})
|
12
7
|
RestClient.get('http://some/resource')
|
13
8
|
end
|
14
9
|
|
15
10
|
it "POST" do
|
16
|
-
RestClient::Request.should_receive(:
|
17
|
-
@request.should_receive(:execute)
|
11
|
+
RestClient::Request.should_receive(:execute).with(:method => :post, :url => 'http://some/resource', :payload => 'payload', :headers => {})
|
18
12
|
RestClient.post('http://some/resource', 'payload')
|
19
13
|
end
|
20
14
|
|
21
15
|
it "PUT" do
|
22
|
-
RestClient::Request.should_receive(:
|
23
|
-
@request.should_receive(:execute)
|
16
|
+
RestClient::Request.should_receive(:execute).with(:method => :put, :url => 'http://some/resource', :payload => 'payload', :headers => {})
|
24
17
|
RestClient.put('http://some/resource', 'payload')
|
25
18
|
end
|
26
19
|
|
27
20
|
it "DELETE" do
|
28
|
-
RestClient::Request.should_receive(:
|
29
|
-
@request.should_receive(:execute)
|
21
|
+
RestClient::Request.should_receive(:execute).with(:method => :delete, :url => 'http://some/resource', :headers => {})
|
30
22
|
RestClient.delete('http://some/resource')
|
31
23
|
end
|
32
24
|
end
|
33
25
|
|
34
26
|
context RestClient::Request do
|
35
27
|
before do
|
36
|
-
@request = RestClient::Request.new(:put, 'http://some/resource', 'payload'
|
28
|
+
@request = RestClient::Request.new(:method => :put, :url => 'http://some/resource', :payload => 'payload')
|
37
29
|
|
38
30
|
@uri = mock("uri")
|
39
31
|
@uri.stub!(:path).and_return('/resource')
|
@@ -106,9 +98,44 @@ describe RestClient do
|
|
106
98
|
@request.transmit(@uri, 'req', nil)
|
107
99
|
end
|
108
100
|
|
101
|
+
it "sets up the credentials prior to the request" do
|
102
|
+
http = mock("net::http connection")
|
103
|
+
Net::HTTP.should_receive(:start).and_yield(http)
|
104
|
+
http.stub!(:request)
|
105
|
+
@request.stub!(:process_result)
|
106
|
+
|
107
|
+
@request.stub!(:user).and_return('joe')
|
108
|
+
@request.stub!(:password).and_return('mypass')
|
109
|
+
@request.should_receive(:setup_credentials).with('req')
|
110
|
+
|
111
|
+
@request.transmit(@uri, 'req', nil)
|
112
|
+
end
|
113
|
+
|
114
|
+
it "does not attempt to send any credentials if user is nil" do
|
115
|
+
@request.stub!(:user).and_return(nil)
|
116
|
+
req = mock("request")
|
117
|
+
req.should_not_receive(:basic_auth)
|
118
|
+
@request.setup_credentials(req)
|
119
|
+
end
|
120
|
+
|
121
|
+
it "does not attempt to send any credentials if user is nil" do
|
122
|
+
@request.stub!(:user).and_return('joe')
|
123
|
+
@request.stub!(:password).and_return('mypass')
|
124
|
+
req = mock("request")
|
125
|
+
req.should_receive(:basic_auth).with('joe', 'mypass')
|
126
|
+
@request.setup_credentials(req)
|
127
|
+
end
|
128
|
+
|
109
129
|
it "execute calls execute_inner" do
|
110
130
|
@request.should_receive(:execute_inner)
|
111
131
|
@request.execute
|
112
132
|
end
|
133
|
+
|
134
|
+
it "class method execute wraps constructor" do
|
135
|
+
req = mock("rest request")
|
136
|
+
RestClient::Request.should_receive(:new).with(1 => 2).and_return(req)
|
137
|
+
req.should_receive(:execute)
|
138
|
+
RestClient::Request.execute(1 => 2)
|
139
|
+
end
|
113
140
|
end
|
114
141
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rest-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: "0.
|
4
|
+
version: "0.2"
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Wiggins
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-03-
|
12
|
+
date: 2008-03-10 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -23,8 +23,10 @@ extra_rdoc_files: []
|
|
23
23
|
|
24
24
|
files:
|
25
25
|
- Rakefile
|
26
|
+
- lib/resource.rb
|
26
27
|
- lib/rest_client.rb
|
27
28
|
- spec/base.rb
|
29
|
+
- spec/resource_spec.rb
|
28
30
|
- spec/rest_client_spec.rb
|
29
31
|
has_rdoc: true
|
30
32
|
homepage: http://rest-client.heroku.com/
|