jnunemaker-httparty 0.3.0 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- data/History +5 -0
- data/Manifest +0 -1
- data/httparty.gemspec +3 -3
- data/lib/httparty/parsers/json.rb +8 -1
- data/lib/httparty/request.rb +2 -0
- data/lib/httparty/version.rb +1 -1
- data/lib/httparty.rb +3 -1
- data/spec/hash_spec.rb +5 -0
- data/spec/httparty/parsers/json_spec.rb +10 -9
- data/spec/httparty/request_spec.rb +6 -0
- data/spec/httparty/response_spec.rb +53 -0
- data/spec/httparty_spec.rb +5 -0
- metadata +3 -3
- data/spec/core_extensions_spec.rb +0 -30
data/History
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
== 0.3.1 2009-02-10
|
2
|
+
* 1 minor fix, 1 minor enhancement
|
3
|
+
* Fixed unescaping umlauts (siebertm)
|
4
|
+
* Added yaml response parsing (Miha Filej)
|
5
|
+
|
1
6
|
== 0.3.0 2009-01-31
|
2
7
|
* 1 major enhancement, 1 bug fix
|
3
8
|
* JSON gem no longer a requirement. It was conflicting with rails json stuff so I just stole ActiveSupport's json decoding and bundled it with HTTParty.
|
data/Manifest
CHANGED
data/httparty.gemspec
CHANGED
@@ -2,17 +2,17 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{httparty}
|
5
|
-
s.version = "0.3.
|
5
|
+
s.version = "0.3.1"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["John Nunemaker"]
|
9
|
-
s.date = %q{2009-
|
9
|
+
s.date = %q{2009-02-10}
|
10
10
|
s.default_executable = %q{httparty}
|
11
11
|
s.description = %q{Makes http fun! Also, makes consuming restful web services dead easy.}
|
12
12
|
s.email = %q{nunemaker@gmail.com}
|
13
13
|
s.executables = ["httparty"]
|
14
14
|
s.extra_rdoc_files = ["bin/httparty", "lib/core_extensions.rb", "lib/httparty/cookie_hash.rb", "lib/httparty/exceptions.rb", "lib/httparty/module_inheritable_attributes.rb", "lib/httparty/parsers/json.rb", "lib/httparty/parsers/xml.rb", "lib/httparty/parsers.rb", "lib/httparty/request.rb", "lib/httparty/response.rb", "lib/httparty/version.rb", "lib/httparty.rb", "README"]
|
15
|
-
s.files = ["bin/httparty", "cucumber.yml", "examples/aaws.rb", "examples/basic.rb", "examples/delicious.rb", "examples/google.rb", "examples/rubyurl.rb", "examples/twitter.rb", "examples/whoismyrep.rb", "features/basic_authentication.feature", "features/command_line.feature", "features/deals_with_http_error_codes.feature", "features/handles_multiple_formats.feature", "features/steps/env.rb", "features/steps/httparty_response_steps.rb", "features/steps/httparty_steps.rb", "features/steps/mongrel_helper.rb", "features/steps/remote_service_steps.rb", "features/supports_redirection.feature", "History", "httparty.gemspec", "lib/core_extensions.rb", "lib/httparty/cookie_hash.rb", "lib/httparty/exceptions.rb", "lib/httparty/module_inheritable_attributes.rb", "lib/httparty/parsers/json.rb", "lib/httparty/parsers/xml.rb", "lib/httparty/parsers.rb", "lib/httparty/request.rb", "lib/httparty/response.rb", "lib/httparty/version.rb", "lib/httparty.rb", "Manifest", "MIT-LICENSE", "Rakefile", "README", "setup.rb", "spec/
|
15
|
+
s.files = ["bin/httparty", "cucumber.yml", "examples/aaws.rb", "examples/basic.rb", "examples/delicious.rb", "examples/google.rb", "examples/rubyurl.rb", "examples/twitter.rb", "examples/whoismyrep.rb", "features/basic_authentication.feature", "features/command_line.feature", "features/deals_with_http_error_codes.feature", "features/handles_multiple_formats.feature", "features/steps/env.rb", "features/steps/httparty_response_steps.rb", "features/steps/httparty_steps.rb", "features/steps/mongrel_helper.rb", "features/steps/remote_service_steps.rb", "features/supports_redirection.feature", "History", "httparty.gemspec", "lib/core_extensions.rb", "lib/httparty/cookie_hash.rb", "lib/httparty/exceptions.rb", "lib/httparty/module_inheritable_attributes.rb", "lib/httparty/parsers/json.rb", "lib/httparty/parsers/xml.rb", "lib/httparty/parsers.rb", "lib/httparty/request.rb", "lib/httparty/response.rb", "lib/httparty/version.rb", "lib/httparty.rb", "Manifest", "MIT-LICENSE", "Rakefile", "README", "setup.rb", "spec/fixtures/delicious.xml", "spec/fixtures/empty.xml", "spec/fixtures/google.html", "spec/fixtures/twitter.json", "spec/fixtures/twitter.xml", "spec/fixtures/undefined_method_add_node_for_nil.xml", "spec/hash_spec.rb", "spec/httparty/cookie_hash_spec.rb", "spec/httparty/parsers/json_spec.rb", "spec/httparty/parsers/xml_spec.rb", "spec/httparty/request_spec.rb", "spec/httparty/response_spec.rb", "spec/httparty_spec.rb", "spec/spec.opts", "spec/spec_helper.rb", "spec/string_spec.rb", "website/css/common.css", "website/index.html"]
|
16
16
|
s.has_rdoc = true
|
17
17
|
s.homepage = %q{http://httparty.rubyforge.org}
|
18
18
|
s.post_install_message = %q{When you HTTParty, you must party hard!}
|
@@ -13,12 +13,19 @@ module HTTParty
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def self.decode(json)
|
16
|
-
YAML.load(convert_json_to_yaml(json))
|
16
|
+
YAML.load(unescape(convert_json_to_yaml(json)))
|
17
17
|
rescue ArgumentError => e
|
18
18
|
raise ParseError, "Invalid JSON string"
|
19
19
|
end
|
20
20
|
|
21
21
|
protected
|
22
|
+
|
23
|
+
def self.unescape(str)
|
24
|
+
str.gsub(/\\u([0-9a-f]{4})/) {
|
25
|
+
[$1.hex].pack("U")
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
22
29
|
# matches YAML-formatted dates
|
23
30
|
DATE_REGEX = /^\d{4}-\d{2}-\d{2}|\d{4}-\d{1,2}-\d{1,2}[ \t]+\d{1,2}:\d{2}:\d{2}(\.[0-9]*)?(([ \t]*)Z|[-+]\d{2}?(:\d{2})?)?$/
|
24
31
|
|
data/lib/httparty/request.rb
CHANGED
data/lib/httparty/version.rb
CHANGED
data/lib/httparty.rb
CHANGED
@@ -14,7 +14,9 @@ module HTTParty
|
|
14
14
|
'text/json' => :json,
|
15
15
|
'application/javascript' => :json,
|
16
16
|
'text/javascript' => :json,
|
17
|
-
'text/html' => :html
|
17
|
+
'text/html' => :html,
|
18
|
+
'application/x-yaml' => :yaml,
|
19
|
+
'text/yaml' => :yaml
|
18
20
|
} unless defined?(AllowedFormats)
|
19
21
|
|
20
22
|
def self.included(base)
|
data/spec/hash_spec.rb
CHANGED
@@ -41,4 +41,9 @@ describe Hash, 'to_params' do
|
|
41
41
|
it 'should not leave a trailing &' do
|
42
42
|
{ :name => 'Bob', :address => { :street => '111 Ruby Ave.', :city => 'Ruby Central', :phones => ['111-111-1111', '222-222-2222'] } }.to_params.should_not match(/&$/)
|
43
43
|
end
|
44
|
+
|
45
|
+
it 'should URL encode unsafe characters' do
|
46
|
+
{:q => "?&\" +"}.to_params.should == "q=%3F%26%22%20%2B"
|
47
|
+
end
|
48
|
+
|
44
49
|
end
|
@@ -2,18 +2,19 @@ require File.join(File.dirname(__FILE__), '..', '..', 'spec_helper')
|
|
2
2
|
|
3
3
|
describe HTTParty::Parsers::JSON do
|
4
4
|
TESTS = {
|
5
|
+
%q({"data": "G\u00fcnter"}) => {"data" => "Günter"},
|
5
6
|
%q({"returnTo":{"\/categories":"\/"}}) => {"returnTo" => {"/categories" => "/"}},
|
6
7
|
%q({returnTo:{"\/categories":"\/"}}) => {"returnTo" => {"/categories" => "/"}},
|
7
8
|
%q({"return\\"To\\":":{"\/categories":"\/"}}) => {"return\"To\":" => {"/categories" => "/"}},
|
8
|
-
%q({"returnTo":{"\/categories":1}})
|
9
|
-
%({"returnTo":[1,"a"]})
|
10
|
-
%({"returnTo":[1,"\\"a\\",", "b"]})
|
11
|
-
%({a: "'", "b": "5,000"})
|
12
|
-
%({a: "a's, b's and c's", "b": "5,000"})
|
13
|
-
%({a: "2007-01-01"})
|
14
|
-
%({a: "2007-01-01 01:12:34 Z"})
|
15
|
-
# no time zone
|
16
|
-
%({a: "2007-01-01 01:12:34"})
|
9
|
+
%q({"returnTo":{"\/categories":1}}) => {"returnTo" => {"/categories" => 1}},
|
10
|
+
%({"returnTo":[1,"a"]}) => {"returnTo" => [1, "a"]},
|
11
|
+
%({"returnTo":[1,"\\"a\\",", "b"]}) => {"returnTo" => [1, "\"a\",", "b"]},
|
12
|
+
%({a: "'", "b": "5,000"}) => {"a" => "'", "b" => "5,000"},
|
13
|
+
%({a: "a's, b's and c's", "b": "5,000"}) => {"a" => "a's, b's and c's", "b" => "5,000"},
|
14
|
+
%({a: "2007-01-01"}) => {'a' => Date.new(2007, 1, 1)},
|
15
|
+
%({a: "2007-01-01 01:12:34 Z"}) => {'a' => Time.utc(2007, 1, 1, 1, 12, 34)},
|
16
|
+
# no time zone
|
17
|
+
%({a: "2007-01-01 01:12:34"}) => {'a' => "2007-01-01 01:12:34"},
|
17
18
|
%([]) => [],
|
18
19
|
%({}) => {},
|
19
20
|
%(1) => 1,
|
@@ -94,6 +94,12 @@ describe HTTParty::Request do
|
|
94
94
|
@request.send(:parse_response, json).should == {'books' => {'book' => {'id' => '1234', 'name' => 'Foo Bar!'}}}
|
95
95
|
end
|
96
96
|
|
97
|
+
it 'should handle yaml automatically' do
|
98
|
+
yaml = "books: \n book: \n name: Foo Bar!\n id: \"1234\"\n"
|
99
|
+
@request.options[:format] = :yaml
|
100
|
+
@request.send(:parse_response, yaml).should == {'books' => {'book' => {'id' => '1234', 'name' => 'Foo Bar!'}}}
|
101
|
+
end
|
102
|
+
|
97
103
|
it "should include any HTTP headers in the returned response" do
|
98
104
|
@request.options[:format] = :html
|
99
105
|
response = stub_response "Content"
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'spec_helper')
|
2
|
+
|
3
|
+
describe HTTParty::Response do
|
4
|
+
describe "initialization" do
|
5
|
+
before do
|
6
|
+
@response_object = {'foo' => 'bar'}
|
7
|
+
@body = "{foo:'bar'}"
|
8
|
+
@code = 200
|
9
|
+
@response = HTTParty::Response.new(@response_object, @body, @code)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should set delegate" do
|
13
|
+
@response.delegate.should == @response_object
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should set body" do
|
17
|
+
@response.body.should == @body
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should set code" do
|
21
|
+
@response.code.should == @code
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should be able to set headers during initialization" do
|
26
|
+
response = HTTParty::Response.new({'foo' => 'bar'}, "{foo:'bar'}", 200, {'foo' => 'bar'})
|
27
|
+
response.headers.should == {'foo' => 'bar'}
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should send missing methods to delegate" do
|
31
|
+
response = HTTParty::Response.new({'foo' => 'bar'}, "{foo:'bar'}", 200)
|
32
|
+
response['foo'].should == 'bar'
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should be able to iterate delegate if it is array" do
|
36
|
+
response = HTTParty::Response.new([{'foo' => 'bar'}, {'foo' => 'baz'}], "[{foo:'bar'}, {foo:'baz'}]", 200)
|
37
|
+
response.size.should == 2
|
38
|
+
lambda {
|
39
|
+
response.each { |item| }
|
40
|
+
}.should_not raise_error
|
41
|
+
end
|
42
|
+
|
43
|
+
xit "should allow hashes to be accessed with dot notation" do
|
44
|
+
response = HTTParty::Response.new({'foo' => 'bar'}, "{foo:'bar'}", 200)
|
45
|
+
response.foo.should == 'bar'
|
46
|
+
end
|
47
|
+
|
48
|
+
xit "should allow nested hashes to be accessed with dot notation" do
|
49
|
+
response = HTTParty::Response.new({'foo' => {'bar' => 'baz'}}, "{foo: {bar:'baz'}}", 200)
|
50
|
+
response.foo.should == {'bar' => 'baz'}
|
51
|
+
response.foo.bar.should == 'baz'
|
52
|
+
end
|
53
|
+
end
|
data/spec/httparty_spec.rb
CHANGED
@@ -144,6 +144,11 @@ describe HTTParty do
|
|
144
144
|
@klass.default_options[:format].should == :json
|
145
145
|
end
|
146
146
|
|
147
|
+
it "should allow yaml" do
|
148
|
+
@klass.format :yaml
|
149
|
+
@klass.default_options[:format].should == :yaml
|
150
|
+
end
|
151
|
+
|
147
152
|
it 'should not allow funky format' do
|
148
153
|
lambda do
|
149
154
|
@klass.format :foobar
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jnunemaker-httparty
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Nunemaker
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-02-10 00:00:00 -08:00
|
13
13
|
default_executable: httparty
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -79,7 +79,6 @@ files:
|
|
79
79
|
- Rakefile
|
80
80
|
- README
|
81
81
|
- setup.rb
|
82
|
-
- spec/core_extensions_spec.rb
|
83
82
|
- spec/fixtures/delicious.xml
|
84
83
|
- spec/fixtures/empty.xml
|
85
84
|
- spec/fixtures/google.html
|
@@ -91,6 +90,7 @@ files:
|
|
91
90
|
- spec/httparty/parsers/json_spec.rb
|
92
91
|
- spec/httparty/parsers/xml_spec.rb
|
93
92
|
- spec/httparty/request_spec.rb
|
93
|
+
- spec/httparty/response_spec.rb
|
94
94
|
- spec/httparty_spec.rb
|
95
95
|
- spec/spec.opts
|
96
96
|
- spec/spec_helper.rb
|
@@ -1,30 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), 'spec_helper')
|
2
|
-
|
3
|
-
describe "Core Extensions" do
|
4
|
-
describe Hash do
|
5
|
-
describe "#to_params" do
|
6
|
-
def should_be_same_params(query_string, expected)
|
7
|
-
query_string.split(/&/).sort.should == expected.split(/&/).sort
|
8
|
-
end
|
9
|
-
|
10
|
-
it "should encode characters in URL parameters" do
|
11
|
-
{:q => "?&\" +"}.to_params.should == "q=%3F%26%22%20%2B"
|
12
|
-
end
|
13
|
-
|
14
|
-
it "should handle multiple parameters" do
|
15
|
-
should_be_same_params({:q1 => "p1", :q2 => "p2"}.to_params, "q1=p1&q2=p2")
|
16
|
-
end
|
17
|
-
|
18
|
-
it "should handle nested hashes like rails does" do
|
19
|
-
should_be_same_params({
|
20
|
-
:name => "Bob",
|
21
|
-
:address => {
|
22
|
-
:street => '111 Ruby Ave.',
|
23
|
-
:city => 'Ruby Central',
|
24
|
-
:phones => ['111-111-1111', '222-222-2222']
|
25
|
-
}
|
26
|
-
}.to_params, "name=Bob&address[city]=Ruby%20Central&address[phones][]=111-111-1111&address[phones][]=222-222-2222&address[street]=111%20Ruby%20Ave.")
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|