juliocesar-httparty 0.2.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.
- data/History +74 -0
- data/MIT-LICENSE +20 -0
- data/Manifest +32 -0
- data/README +36 -0
- data/Rakefile +43 -0
- data/bin/httparty +107 -0
- data/examples/aaws.rb +32 -0
- data/examples/basic.rb +6 -0
- data/examples/delicious.rb +36 -0
- data/examples/google.rb +16 -0
- data/examples/rubyurl.rb +14 -0
- data/examples/twitter.rb +31 -0
- data/examples/whoismyrep.rb +10 -0
- data/httparty.gemspec +40 -0
- data/lib/core_extensions.rb +349 -0
- data/lib/httparty.rb +120 -0
- data/lib/httparty/exceptions.rb +4 -0
- data/lib/httparty/request.rb +145 -0
- data/lib/httparty/version.rb +3 -0
- data/lib/module_level_inheritable_attributes.rb +25 -0
- data/setup.rb +1585 -0
- data/spec/fixtures/delicious.xml +23 -0
- data/spec/fixtures/google.html +3 -0
- data/spec/fixtures/twitter.json +1 -0
- data/spec/fixtures/twitter.xml +403 -0
- data/spec/httparty/request_spec.rb +202 -0
- data/spec/httparty_spec.rb +181 -0
- data/spec/spec.opts +3 -0
- data/spec/spec_helper.rb +24 -0
- data/website/css/common.css +47 -0
- data/website/index.html +74 -0
- metadata +113 -0
@@ -0,0 +1,181 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'spec_helper')
|
2
|
+
|
3
|
+
class Foo
|
4
|
+
include HTTParty
|
5
|
+
base_uri 'api.foo.com/v1'
|
6
|
+
end
|
7
|
+
|
8
|
+
class GRest
|
9
|
+
include HTTParty
|
10
|
+
base_uri "grest.com"
|
11
|
+
default_params :one => 'two'
|
12
|
+
end
|
13
|
+
|
14
|
+
class HRest
|
15
|
+
include HTTParty
|
16
|
+
base_uri "hrest.com"
|
17
|
+
default_params :two => 'three'
|
18
|
+
end
|
19
|
+
|
20
|
+
describe HTTParty do
|
21
|
+
|
22
|
+
describe "base uri" do
|
23
|
+
before do
|
24
|
+
Foo.base_uri('api.foo.com/v1')
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should have reader" do
|
28
|
+
Foo.base_uri.should == 'http://api.foo.com/v1'
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should have writer' do
|
32
|
+
Foo.base_uri('http://api.foobar.com')
|
33
|
+
Foo.base_uri.should == 'http://api.foobar.com'
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "#normalize_base_uri" do
|
38
|
+
it "should add http if not present for non ssl requests" do
|
39
|
+
uri = HTTParty.normalize_base_uri('api.foobar.com')
|
40
|
+
uri.should == 'http://api.foobar.com'
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should add https if not present for ssl requests" do
|
44
|
+
uri = HTTParty.normalize_base_uri('api.foo.com/v1:443')
|
45
|
+
uri.should == 'https://api.foo.com/v1:443'
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should not remove https for ssl requests" do
|
49
|
+
uri = HTTParty.normalize_base_uri('https://api.foo.com/v1:443')
|
50
|
+
uri.should == 'https://api.foo.com/v1:443'
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe "headers" do
|
55
|
+
it "should default to empty hash" do
|
56
|
+
Foo.headers.should == {}
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should be able to be updated" do
|
60
|
+
init_headers = {:foo => 'bar', :baz => 'spax'}
|
61
|
+
Foo.headers init_headers
|
62
|
+
Foo.headers.should == init_headers
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe "default params" do
|
67
|
+
it "should default to empty hash" do
|
68
|
+
Foo.default_params.should == {}
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should be able to be updated" do
|
72
|
+
new_defaults = {:foo => 'bar', :baz => 'spax'}
|
73
|
+
Foo.default_params new_defaults
|
74
|
+
Foo.default_params.should == new_defaults
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe "basic http authentication" do
|
79
|
+
it "should work" do
|
80
|
+
Foo.basic_auth 'foobar', 'secret'
|
81
|
+
Foo.default_options[:basic_auth].should == {:username => 'foobar', :password => 'secret'}
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
describe "format" do
|
86
|
+
it "should allow xml" do
|
87
|
+
Foo.format :xml
|
88
|
+
Foo.default_options[:format].should == :xml
|
89
|
+
end
|
90
|
+
|
91
|
+
it "should allow json" do
|
92
|
+
Foo.format :json
|
93
|
+
Foo.default_options[:format].should == :json
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'should not allow funky format' do
|
97
|
+
lambda do
|
98
|
+
Foo.format :foobar
|
99
|
+
end.should raise_error(HTTParty::UnsupportedFormat)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
describe "with explicit override of automatic redirect handling" do
|
104
|
+
|
105
|
+
it "should fail with redirected GET" do
|
106
|
+
lambda do
|
107
|
+
Foo.get('/foo', :no_follow => true)
|
108
|
+
end.should raise_error(HTTParty::RedirectionTooDeep)
|
109
|
+
end
|
110
|
+
|
111
|
+
it "should fail with redirected POST" do
|
112
|
+
lambda do
|
113
|
+
Foo.post('/foo', :no_follow => true)
|
114
|
+
end.should raise_error(HTTParty::RedirectionTooDeep)
|
115
|
+
end
|
116
|
+
|
117
|
+
it "should fail with redirected DELETE" do
|
118
|
+
lambda do
|
119
|
+
Foo.delete('/foo', :no_follow => true)
|
120
|
+
end.should raise_error(HTTParty::RedirectionTooDeep)
|
121
|
+
end
|
122
|
+
|
123
|
+
it "should fail with redirected PUT" do
|
124
|
+
lambda do
|
125
|
+
Foo.put('/foo', :no_follow => true)
|
126
|
+
end.should raise_error(HTTParty::RedirectionTooDeep)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
describe "with multiple class definitions" do
|
131
|
+
it "should not run over each others options" do
|
132
|
+
HRest.default_options.should == {:base_uri => 'http://hrest.com', :default_params => {:two => 'three'}}
|
133
|
+
GRest.default_options.should == {:base_uri => 'http://grest.com', :default_params => {:one => 'two'}}
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
describe "#get" do
|
138
|
+
it "should be able to get html" do
|
139
|
+
stub_http_response_with('google.html')
|
140
|
+
resp = HTTParty.get('http://www.google.com')
|
141
|
+
resp.should == file_fixture('google.html')
|
142
|
+
resp.original_body.should == file_fixture('google.html')
|
143
|
+
end
|
144
|
+
|
145
|
+
it "should be able parse response type json automatically" do
|
146
|
+
stub_http_response_with('twitter.json')
|
147
|
+
tweets = HTTParty.get('http://twitter.com/statuses/public_timeline.json')
|
148
|
+
tweets.size.should == 20
|
149
|
+
tweets.first['user'].should == {
|
150
|
+
"name" => "Pyk",
|
151
|
+
"url" => nil,
|
152
|
+
"id" => "7694602",
|
153
|
+
"description" => nil,
|
154
|
+
"protected" => false,
|
155
|
+
"screen_name" => "Pyk",
|
156
|
+
"followers_count" => 1,
|
157
|
+
"location" => "Opera Plaza, California",
|
158
|
+
"profile_image_url" => "http://static.twitter.com/images/default_profile_normal.png"
|
159
|
+
}
|
160
|
+
tweets.original_body.should == file_fixture('twitter.json')
|
161
|
+
end
|
162
|
+
|
163
|
+
it "should be able parse response type xml automatically" do
|
164
|
+
stub_http_response_with('twitter.xml')
|
165
|
+
tweets = HTTParty.get('http://twitter.com/statuses/public_timeline.xml')
|
166
|
+
tweets['statuses'].size.should == 20
|
167
|
+
tweets['statuses'].first['user'].should == {
|
168
|
+
"name" => "Magic 8 Bot",
|
169
|
+
"url" => nil,
|
170
|
+
"id" => "17656026",
|
171
|
+
"description" => "ask me a question",
|
172
|
+
"protected" => "false",
|
173
|
+
"screen_name" => "magic8bot",
|
174
|
+
"followers_count" => "90",
|
175
|
+
"profile_image_url" => "http://s3.amazonaws.com/twitter_production/profile_images/65565851/8ball_large_normal.jpg",
|
176
|
+
"location" => nil
|
177
|
+
}
|
178
|
+
tweets.original_body.should == file_fixture('twitter.xml')
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
data/spec/spec.opts
ADDED
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
gem 'rspec'
|
3
|
+
require 'spec'
|
4
|
+
require File.join(File.dirname(__FILE__), '..', 'lib', 'httparty')
|
5
|
+
|
6
|
+
def file_fixture(filename)
|
7
|
+
open(File.join(File.dirname(__FILE__), 'fixtures', "#{filename.to_s}")).read
|
8
|
+
end
|
9
|
+
|
10
|
+
def stub_http_response_with(filename)
|
11
|
+
format = filename.split('.').last.intern
|
12
|
+
data = file_fixture(filename)
|
13
|
+
http = Net::HTTP.new('localhost', 80)
|
14
|
+
|
15
|
+
response = Net::HTTPOK.new("1.1", 200, "Content for you")
|
16
|
+
response.stub!(:body).and_return(data)
|
17
|
+
http.stub!(:request).and_return(response)
|
18
|
+
|
19
|
+
http_request = HTTParty::Request.new(Net::HTTP::Get, '')
|
20
|
+
http_request.stub!(:get_response).and_return(response)
|
21
|
+
http_request.stub!(:format).and_return(format)
|
22
|
+
|
23
|
+
HTTParty::Request.should_receive(:new).and_return(http_request)
|
24
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
@media screen, projection {
|
2
|
+
/*
|
3
|
+
Copyright (c) 2007, Yahoo! Inc. All rights reserved.
|
4
|
+
Code licensed under the BSD License:
|
5
|
+
http://developer.yahoo.net/yui/license.txt
|
6
|
+
version: 2.2.0
|
7
|
+
*/
|
8
|
+
body {font:13px arial,helvetica,clean,sans-serif;*font-size:small;*font:x-small;}table {font-size:inherit;font:100%;}select, input, textarea {font:99% arial,helvetica,clean,sans-serif;}pre, code {font:115% monospace;*font-size:100%;}body * {line-height:1.22em;}
|
9
|
+
body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,blockquote,th,td{margin:0;padding:0;}table{border-collapse:collapse;border-spacing:0;}fieldset,img{border:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}/*ol,ul {list-style:none;}*/caption,th {text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}q:before,q:after{content:'';}abbr,acronym {border:0;}
|
10
|
+
/* end of yahoo reset and fonts */
|
11
|
+
|
12
|
+
body {color:#333; background:#4b1a1a; line-height:1.3;}
|
13
|
+
p {margin:0 0 20px;}
|
14
|
+
a {color:#4b1a1a;}
|
15
|
+
a:hover {text-decoration:none;}
|
16
|
+
strong {font-weight:bold;}
|
17
|
+
em {font-style:italics;}
|
18
|
+
h1,h2,h3,h4,h5,h6 {font-weight:bold;}
|
19
|
+
h1 {font-size:197%; margin:30px 0; color:#4b1a1a;}
|
20
|
+
h2 {font-size:174%; margin:20px 0; color:#b8111a;}
|
21
|
+
h3 {font-size:152%; margin:10px 0;}
|
22
|
+
h4 {font-size:129%; margin:10px 0;}
|
23
|
+
pre {background:#eee; margin:0 0 20px; padding:20px; border:1px solid #ccc; font-size:100%; overflow:auto;}
|
24
|
+
code {font-size:100%; margin:0; padding:0;}
|
25
|
+
ul, ol {margin:10px 0 10px 25px;}
|
26
|
+
ol li {margin:0 0 10px;}
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
|
31
|
+
|
32
|
+
div#wrapper {background:#fff; width:560px; margin:0 auto; padding:20px; border:10px solid #bc8c46; border-width:0 10px;}
|
33
|
+
div#header {position:relative; border-bottom:1px dotted; margin:0 0 10px; padding:0 0 10px;}
|
34
|
+
div#header p {margin:0; padding:0;}
|
35
|
+
div#header h1 {margin:0; padding:0;}
|
36
|
+
ul#nav {position:absolute; top:0; right:0; list-style:none; margin:0; padding:0;}
|
37
|
+
ul#nav li {display:inline; padding:0 0 0 5px;}
|
38
|
+
ul#nav li a {}
|
39
|
+
div#content {}
|
40
|
+
div#footer {margin:40px 0 0; border-top:1px dotted; padding:10px 0 0;}
|
41
|
+
|
42
|
+
|
43
|
+
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
}
|
data/website/index.html
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
2
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
3
|
+
<head>
|
4
|
+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
|
5
|
+
<title>HTTParty by John Nunemaker</title>
|
6
|
+
<link rel="stylesheet" href="css/common.css" type="text/css" />
|
7
|
+
</head>
|
8
|
+
<body>
|
9
|
+
|
10
|
+
<div id="wrapper">
|
11
|
+
<div id="header">
|
12
|
+
<h1>HTTParty</h1>
|
13
|
+
<p>Tonight we're gonna HTTParty like it's 1999!</p>
|
14
|
+
|
15
|
+
<ul id="nav">
|
16
|
+
<li><a href="rdoc/">Docs</a></li>
|
17
|
+
<li><a href="http://github.com/jnunemaker/httparty">Github</a></li>
|
18
|
+
<li><a href="http://jnunemaker.lighthouseapp.com/projects/14842-httparty/tickets">Lighthouse</a></li>
|
19
|
+
<li><a href="http://rubyforge.org/projects/httparty/">Rubyforge</a></li>
|
20
|
+
</ul>
|
21
|
+
</div>
|
22
|
+
|
23
|
+
<div id="content">
|
24
|
+
<h2>Install</h2>
|
25
|
+
<pre><code>$ sudo gem install httparty</code></pre>
|
26
|
+
|
27
|
+
<h2>Some Quick Examples</h2>
|
28
|
+
|
29
|
+
<p>The following is a simple example of wrapping Twitter's API for posting updates.</p>
|
30
|
+
|
31
|
+
<pre><code>class Twitter
|
32
|
+
include HTTParty
|
33
|
+
base_uri 'twitter.com'
|
34
|
+
basic_auth 'username', 'password'
|
35
|
+
end
|
36
|
+
|
37
|
+
Twitter.post('/statuses/update.json', :query => {:status => "It's an HTTParty and everyone is invited!"})</code></pre>
|
38
|
+
|
39
|
+
<p>That is really it! The object returned is a ruby hash that is decoded from Twitter's json response. JSON parsing is used because of the .json extension in the path of the request. You can also explicitly set a format (see the examples). </p>
|
40
|
+
|
41
|
+
<p>That works and all but what if you don't want to embed your username and password in the class? Below is an example to fix that:</p>
|
42
|
+
|
43
|
+
<pre><code>class Twitter
|
44
|
+
include HTTParty
|
45
|
+
base_uri 'twitter.com'
|
46
|
+
|
47
|
+
def initialize(u, p)
|
48
|
+
@auth = {:username => u, :password => p}
|
49
|
+
end
|
50
|
+
|
51
|
+
def post(text)
|
52
|
+
options = { :query => {:status => text}, :basic_auth => @auth }
|
53
|
+
self.class.post('/statuses/update.json', options)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
Twitter.new('username', 'password').post("It's an HTTParty and everyone is invited!")</code></pre>
|
58
|
+
|
59
|
+
<p><strong>More Examples:</strong> There are <a href="http://github.com/jnunemaker/httparty/tree/master/examples/">several examples in the gem itself</a>.</p>
|
60
|
+
|
61
|
+
<h2>Support</h2>
|
62
|
+
<p>Conversations welcome in the <a href="http://groups.google.com/group/httparty-gem">google group</a> and bugs/features over at <a href="http://jnunemaker.lighthouseapp.com/projects/14842-httparty/overview">Lightouse</a>.</p>
|
63
|
+
|
64
|
+
|
65
|
+
</div>
|
66
|
+
|
67
|
+
<div id="footer">
|
68
|
+
<p>Created by <a href="http://addictedtonew.com/about/">John Nunemaker</a> |
|
69
|
+
<a href="http://orderedlist.com/">Hire Me at Ordered List</a></p>
|
70
|
+
</div>
|
71
|
+
</div>
|
72
|
+
|
73
|
+
</body>
|
74
|
+
</html>
|
metadata
ADDED
@@ -0,0 +1,113 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: juliocesar-httparty
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.6
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- John Nunemaker
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-01-05 00:00:00 -08:00
|
13
|
+
default_executable: httparty
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: json
|
17
|
+
version_requirement:
|
18
|
+
version_requirements: !ruby/object:Gem::Requirement
|
19
|
+
requirements:
|
20
|
+
- - ~>
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: "1.1"
|
23
|
+
version:
|
24
|
+
- !ruby/object:Gem::Dependency
|
25
|
+
name: echoe
|
26
|
+
version_requirement:
|
27
|
+
version_requirements: !ruby/object:Gem::Requirement
|
28
|
+
requirements:
|
29
|
+
- - ">="
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
version: "0"
|
32
|
+
version:
|
33
|
+
description: Makes http fun! Also, makes consuming restful web services dead easy.
|
34
|
+
email: nunemaker@gmail.com
|
35
|
+
executables:
|
36
|
+
- httparty
|
37
|
+
extensions: []
|
38
|
+
|
39
|
+
extra_rdoc_files:
|
40
|
+
- bin/httparty
|
41
|
+
- lib/core_extensions.rb
|
42
|
+
- lib/httparty/exceptions.rb
|
43
|
+
- lib/httparty/request.rb
|
44
|
+
- lib/httparty/version.rb
|
45
|
+
- lib/httparty.rb
|
46
|
+
- lib/module_level_inheritable_attributes.rb
|
47
|
+
- README
|
48
|
+
files:
|
49
|
+
- bin/httparty
|
50
|
+
- examples/aaws.rb
|
51
|
+
- examples/basic.rb
|
52
|
+
- examples/delicious.rb
|
53
|
+
- examples/google.rb
|
54
|
+
- examples/rubyurl.rb
|
55
|
+
- examples/twitter.rb
|
56
|
+
- examples/whoismyrep.rb
|
57
|
+
- History
|
58
|
+
- httparty.gemspec
|
59
|
+
- lib/core_extensions.rb
|
60
|
+
- lib/httparty/exceptions.rb
|
61
|
+
- lib/httparty/request.rb
|
62
|
+
- lib/httparty/version.rb
|
63
|
+
- lib/httparty.rb
|
64
|
+
- lib/module_level_inheritable_attributes.rb
|
65
|
+
- Manifest
|
66
|
+
- MIT-LICENSE
|
67
|
+
- Rakefile
|
68
|
+
- README
|
69
|
+
- setup.rb
|
70
|
+
- spec/as_buggery_spec.rb
|
71
|
+
- spec/fixtures/delicious.xml
|
72
|
+
- spec/fixtures/google.html
|
73
|
+
- spec/fixtures/twitter.json
|
74
|
+
- spec/fixtures/twitter.xml
|
75
|
+
- spec/httparty/request_spec.rb
|
76
|
+
- spec/httparty_spec.rb
|
77
|
+
- spec/spec.opts
|
78
|
+
- spec/spec_helper.rb
|
79
|
+
- website/css/common.css
|
80
|
+
- website/index.html
|
81
|
+
has_rdoc: true
|
82
|
+
homepage: http://httparty.rubyforge.org
|
83
|
+
post_install_message: When you HTTParty, you must party hard!
|
84
|
+
rdoc_options:
|
85
|
+
- --line-numbers
|
86
|
+
- --inline-source
|
87
|
+
- --title
|
88
|
+
- Httparty
|
89
|
+
- --main
|
90
|
+
- README
|
91
|
+
require_paths:
|
92
|
+
- lib
|
93
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - ">="
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: "0"
|
98
|
+
version:
|
99
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: "1.2"
|
104
|
+
version:
|
105
|
+
requirements: []
|
106
|
+
|
107
|
+
rubyforge_project: httparty
|
108
|
+
rubygems_version: 1.2.0
|
109
|
+
signing_key:
|
110
|
+
specification_version: 2
|
111
|
+
summary: Makes http fun! Also, makes consuming restful web services dead easy.
|
112
|
+
test_files: []
|
113
|
+
|