rest-client 0.5.1 → 0.6
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 -1
- data/bin/restclient +65 -0
- data/lib/request_errors.rb +2 -10
- data/lib/rest_client.rb +10 -2
- data/spec/request_errors_spec.rb +10 -18
- data/spec/rest_client_spec.rb +11 -0
- metadata +4 -4
data/Rakefile
CHANGED
@@ -31,7 +31,7 @@ require 'rake/gempackagetask'
|
|
31
31
|
require 'rake/rdoctask'
|
32
32
|
require 'fileutils'
|
33
33
|
|
34
|
-
version = "0.
|
34
|
+
version = "0.6"
|
35
35
|
name = "rest-client"
|
36
36
|
|
37
37
|
spec = Gem::Specification.new do |s|
|
@@ -48,6 +48,7 @@ spec = Gem::Specification.new do |s|
|
|
48
48
|
s.has_rdoc = true
|
49
49
|
|
50
50
|
s.files = %w(Rakefile) + Dir.glob("{lib,spec}/**/*")
|
51
|
+
s.executables = ['restclient']
|
51
52
|
|
52
53
|
s.require_path = "lib"
|
53
54
|
end
|
data/bin/restclient
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$:.unshift File.dirname(__FILE__) + "/../lib"
|
4
|
+
require 'rest_client'
|
5
|
+
|
6
|
+
require "yaml"
|
7
|
+
|
8
|
+
def usage(why = nil)
|
9
|
+
puts "failed for reason: #{why}" if why
|
10
|
+
puts "usage: restclient url|name [username] [password]"
|
11
|
+
exit(1)
|
12
|
+
end
|
13
|
+
|
14
|
+
@url = ARGV.shift || 'http://localhost:4567'
|
15
|
+
|
16
|
+
config = YAML.load(File.read(ENV['HOME'] + "/.restclient")) rescue {}
|
17
|
+
|
18
|
+
@url, @username, @password = if c = config[@url]
|
19
|
+
[c[:url], c[:username], c[:password]]
|
20
|
+
else
|
21
|
+
[@url, *ARGV]
|
22
|
+
end
|
23
|
+
|
24
|
+
usage("invalid url '#{@url}") unless @url =~ /^https?/
|
25
|
+
usage("to few args") unless ARGV.size < 3
|
26
|
+
|
27
|
+
def r
|
28
|
+
@r ||= RestClient::Resource.new(@url, @username, @password)
|
29
|
+
end
|
30
|
+
|
31
|
+
r # force rc to load
|
32
|
+
|
33
|
+
%w(get post put delete).each do |m|
|
34
|
+
eval <<-end_eval
|
35
|
+
def #{m}(path, *args, &b)
|
36
|
+
r[path].#{m}(*args, &b)
|
37
|
+
end
|
38
|
+
end_eval
|
39
|
+
end
|
40
|
+
|
41
|
+
def method_missing(s, *args, &b)
|
42
|
+
super unless r.respond_to?(s)
|
43
|
+
begin
|
44
|
+
r.send(s, *args, &b)
|
45
|
+
rescue RestClient::RequestFailed => e
|
46
|
+
puts e.response.body
|
47
|
+
raise e
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
require 'irb'
|
52
|
+
require 'irb/completion'
|
53
|
+
|
54
|
+
if File.exists? ".irbrc"
|
55
|
+
ENV['IRBRC'] = ".irbrc"
|
56
|
+
end
|
57
|
+
|
58
|
+
if File.exists?(rcfile = "~/.restclientrc")
|
59
|
+
load(rcfile)
|
60
|
+
end
|
61
|
+
|
62
|
+
ARGV.clear
|
63
|
+
|
64
|
+
IRB.start
|
65
|
+
exit!
|
data/lib/request_errors.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'rexml/document'
|
2
|
-
|
3
1
|
module RestClient
|
4
2
|
# This is the base RestClient exception class. Rescue it if you want to
|
5
3
|
# catch any exception that your request might raise
|
@@ -59,14 +57,8 @@ module RestClient
|
|
59
57
|
@response.code.to_i if @response
|
60
58
|
end
|
61
59
|
|
62
|
-
def message
|
63
|
-
|
64
|
-
parse_error_xml rescue default
|
65
|
-
end
|
66
|
-
|
67
|
-
def parse_error_xml
|
68
|
-
xml_errors = REXML::Document.new(@response.body).elements.to_a("//errors/error")
|
69
|
-
xml_errors.empty? ? raise : xml_errors.map { |a| a.text }.join(" / ")
|
60
|
+
def message
|
61
|
+
"HTTP status code #{http_code}"
|
70
62
|
end
|
71
63
|
|
72
64
|
def to_s
|
data/lib/rest_client.rb
CHANGED
@@ -71,7 +71,7 @@ module RestClient
|
|
71
71
|
end
|
72
72
|
|
73
73
|
def net_http_class(method)
|
74
|
-
|
74
|
+
Net::HTTP.const_get(method.to_s.capitalize)
|
75
75
|
end
|
76
76
|
|
77
77
|
def parse_url(url)
|
@@ -121,7 +121,15 @@ module RestClient
|
|
121
121
|
if %w(200 201 202).include? res.code
|
122
122
|
res.body
|
123
123
|
elsif %w(301 302 303).include? res.code
|
124
|
-
|
124
|
+
url = res.header['Location']
|
125
|
+
|
126
|
+
if url !~ /^http/
|
127
|
+
uri = URI.parse(@url)
|
128
|
+
uri.path = "/#{url}".squeeze('/')
|
129
|
+
url = uri.to_s
|
130
|
+
end
|
131
|
+
|
132
|
+
raise Redirect, url
|
125
133
|
elsif res.code == "401"
|
126
134
|
raise Unauthorized
|
127
135
|
elsif res.code == "404"
|
data/spec/request_errors_spec.rb
CHANGED
@@ -12,28 +12,20 @@ describe RestClient::Exception do
|
|
12
12
|
end
|
13
13
|
|
14
14
|
describe RestClient::RequestFailed do
|
15
|
-
|
16
|
-
|
15
|
+
it "stores the http response on the exception" do
|
16
|
+
begin
|
17
|
+
raise RestClient::RequestFailed, :response
|
18
|
+
rescue RestClient::RequestFailed => e
|
19
|
+
e.response.should == :response
|
20
|
+
end
|
17
21
|
end
|
18
22
|
|
19
|
-
it "
|
20
|
-
|
21
|
-
@error.message.should == 'Error 1 / Error 2'
|
23
|
+
it "http_code convenience method for fetching the code as an integer" do
|
24
|
+
RestClient::RequestFailed.new(mock('res', :code => '502')).http_code.should == 502
|
22
25
|
end
|
23
26
|
|
24
|
-
it "
|
25
|
-
|
26
|
-
@error.message.should == 'Unknown error, HTTP status code 500'
|
27
|
-
end
|
28
|
-
|
29
|
-
it "accepts a default error message" do
|
30
|
-
@error.response = mock('response', :code => '500', :body => 'Internal Server Error')
|
31
|
-
@error.message('Custom default message').should == 'Custom default message'
|
32
|
-
end
|
33
|
-
|
34
|
-
it "doesn't show the default error message when there's something in the xml" do
|
35
|
-
@error.response = mock('response', :code => '422', :body => '<errors><error>Specific error message</error></errors>')
|
36
|
-
@error.message('Custom default message').should == 'Specific error message'
|
27
|
+
it "shows the status code in the message" do
|
28
|
+
RestClient::RequestFailed.new(mock('res', :code => '502')).to_s.should match(/502/)
|
37
29
|
end
|
38
30
|
end
|
39
31
|
|
data/spec/rest_client_spec.rb
CHANGED
@@ -184,6 +184,17 @@ describe RestClient do
|
|
184
184
|
lambda { @request.process_result(res) }.should raise_error(RestClient::Redirect) { |e| e.url.should == 'http://new/resource'}
|
185
185
|
end
|
186
186
|
|
187
|
+
it "handles redirects with relative paths" do
|
188
|
+
res = mock('response', :code => '301', :header => { 'Location' => 'index' })
|
189
|
+
lambda { @request.process_result(res) }.should raise_error(RestClient::Redirect) { |e| e.url.should == 'http://some/index' }
|
190
|
+
end
|
191
|
+
|
192
|
+
it "handles redirects with absolute paths" do
|
193
|
+
@request.instance_variable_set('@url', 'http://some/place/else')
|
194
|
+
res = mock('response', :code => '301', :header => { 'Location' => '/index' })
|
195
|
+
lambda { @request.process_result(res) }.should raise_error(RestClient::Redirect) { |e| e.url.should == 'http://some/index' }
|
196
|
+
end
|
197
|
+
|
187
198
|
it "raises Unauthorized when the response is 401" do
|
188
199
|
res = mock('response', :code => '401')
|
189
200
|
lambda { @request.process_result(res) }.should raise_error(RestClient::Unauthorized)
|
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.6"
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Wiggins
|
@@ -9,14 +9,14 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-07-
|
12
|
+
date: 2008-07-22 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
16
16
|
description: "A simple REST client for Ruby, inspired by the Sinatra microframework style of specifying actions: get, put, post, delete."
|
17
17
|
email: adam@heroku.com
|
18
|
-
executables:
|
19
|
-
|
18
|
+
executables:
|
19
|
+
- restclient
|
20
20
|
extensions: []
|
21
21
|
|
22
22
|
extra_rdoc_files: []
|