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 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
@@ -35,7 +35,6 @@ MIT-LICENSE
35
35
  Rakefile
36
36
  README
37
37
  setup.rb
38
- spec/core_extensions_spec.rb
39
38
  spec/fixtures/delicious.xml
40
39
  spec/fixtures/empty.xml
41
40
  spec/fixtures/google.html
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.0"
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-01-31}
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/core_extensions_spec.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_spec.rb", "spec/spec.opts", "spec/spec_helper.rb", "spec/string_spec.rb", "website/css/common.css", "website/index.html"]
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
 
@@ -110,6 +110,8 @@ module HTTParty
110
110
  HTTParty::Parsers::XML.parse(body)
111
111
  when :json
112
112
  HTTParty::Parsers::JSON.decode(body)
113
+ when :yaml
114
+ YAML::load(body)
113
115
  else
114
116
  body
115
117
  end
@@ -1,3 +1,3 @@
1
1
  module HTTParty #:nodoc:
2
- Version = '0.3.0'
2
+ Version = '0.3.1'
3
3
  end
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}}) => {"returnTo" => {"/categories" => 1}},
9
- %({"returnTo":[1,"a"]}) => {"returnTo" => [1, "a"]},
10
- %({"returnTo":[1,"\\"a\\",", "b"]}) => {"returnTo" => [1, "\"a\",", "b"]},
11
- %({a: "'", "b": "5,000"}) => {"a" => "'", "b" => "5,000"},
12
- %({a: "a's, b's and c's", "b": "5,000"}) => {"a" => "a's, b's and c's", "b" => "5,000"},
13
- %({a: "2007-01-01"}) => {'a' => Date.new(2007, 1, 1)},
14
- %({a: "2007-01-01 01:12:34 Z"}) => {'a' => Time.utc(2007, 1, 1, 1, 12, 34)},
15
- # no time zone
16
- %({a: "2007-01-01 01:12:34"}) => {'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
@@ -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.0
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-01-31 00:00:00 -08:00
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