smoodit 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +11 -0
- data/.rspec +3 -0
- data/.yardopts +9 -0
- data/Gemfile +3 -0
- data/HISTORY.mkd +3 -0
- data/LICENSE.mkd +20 -0
- data/README.mkd +155 -0
- data/Rakefile +22 -0
- data/lib/faraday/multipart.rb +30 -0
- data/lib/faraday/oauth.rb +22 -0
- data/lib/faraday/raise_http_4xx.rb +50 -0
- data/lib/faraday/raise_http_5xx.rb +31 -0
- data/lib/smoodit/api.rb +23 -0
- data/lib/smoodit/authentication.rb +25 -0
- data/lib/smoodit/client/proxy.rb +46 -0
- data/lib/smoodit/client.rb +55 -0
- data/lib/smoodit/configuration.rb +94 -0
- data/lib/smoodit/connection.rb +38 -0
- data/lib/smoodit/error.rb +28 -0
- data/lib/smoodit/request.rb +25 -0
- data/lib/smoodit/version.rb +4 -0
- data/lib/smoodit.rb +21 -0
- data/smoodit.gemspec +44 -0
- data/spec/faraday/response_spec.rb +31 -0
- data/spec/fixtures/user_john.js +7 -0
- data/spec/smoodit/api_spec.rb +68 -0
- data/spec/smoodit/client_spec.rb +10 -0
- data/spec/smoodit_spec.rb +228 -0
- data/spec/spec_helper.rb +54 -0
- metadata +355 -0
@@ -0,0 +1,25 @@
|
|
1
|
+
module Smoodit
|
2
|
+
# Defines HTTP request methods
|
3
|
+
module Request
|
4
|
+
# Perform an HTTP request
|
5
|
+
def request(method, path, options={}, raw=false)
|
6
|
+
response = connection(raw).send(method) do |request|
|
7
|
+
case method
|
8
|
+
when :get, :delete
|
9
|
+
request.url(formatted_path(path), options)
|
10
|
+
when :post, :put
|
11
|
+
request.path = formatted_path(path)
|
12
|
+
request.body = options unless options.empty?
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
return raw ? response : response.body, response.status
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def formatted_path(path)
|
22
|
+
path
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/smoodit.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require File.expand_path('../smoodit/error', __FILE__)
|
2
|
+
require File.expand_path('../smoodit/configuration', __FILE__)
|
3
|
+
require File.expand_path('../smoodit/api', __FILE__)
|
4
|
+
require File.expand_path('../smoodit/client', __FILE__)
|
5
|
+
|
6
|
+
module Smoodit
|
7
|
+
extend Configuration
|
8
|
+
|
9
|
+
# Alias for Smoodit::Client.new
|
10
|
+
#
|
11
|
+
# @return [Smoodit::Client]
|
12
|
+
def self.client(options={})
|
13
|
+
Smoodit::Client.new(options)
|
14
|
+
end
|
15
|
+
|
16
|
+
# Delegate to Smoodit::Client
|
17
|
+
def self.method_missing(method, *args, &block)
|
18
|
+
#return super unless client.respond_to?(method)
|
19
|
+
client.send(method, *args, &block)
|
20
|
+
end
|
21
|
+
end
|
data/smoodit.gemspec
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/smoodit/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.add_development_dependency('bundler', '~> 1.0')
|
6
|
+
s.add_development_dependency('json', '~> 1.4')
|
7
|
+
s.add_development_dependency('nokogiri', '~> 1.4')
|
8
|
+
s.add_development_dependency('maruku', '~> 0.6')
|
9
|
+
s.add_development_dependency('rake', '~> 0.8')
|
10
|
+
s.add_development_dependency('rspec', '~> 2.4')
|
11
|
+
s.add_development_dependency('simplecov', '~> 0.3')
|
12
|
+
s.add_development_dependency('webmock', '~> 1.6')
|
13
|
+
s.add_development_dependency('yard', '~> 0.6')
|
14
|
+
s.add_development_dependency('ZenTest', '~> 4.4')
|
15
|
+
s.add_runtime_dependency('hashie', '~> 1.0.0')
|
16
|
+
s.add_runtime_dependency('faraday', '~> 0.5.4')
|
17
|
+
s.add_runtime_dependency('faraday_middleware', '~> 0.3.1')
|
18
|
+
s.add_runtime_dependency('jruby-openssl', '~> 0.7.2') if RUBY_PLATFORM == 'java'
|
19
|
+
s.add_runtime_dependency('multi_json', '~> 0.0.5')
|
20
|
+
s.add_runtime_dependency('multi_xml', '~> 0.2.0')
|
21
|
+
s.add_runtime_dependency('simple_oauth', '~> 0.1.3')
|
22
|
+
s.authors = ["Giovanni Cappellotto"]
|
23
|
+
s.description = %q{A Ruby wrapper for the Smood it REST API}
|
24
|
+
s.post_install_message =<<eos
|
25
|
+
********************************************************************************
|
26
|
+
|
27
|
+
Follow @smoodit on Twitter for announcements, updates, and news.
|
28
|
+
http://twitter.com/smoodit
|
29
|
+
|
30
|
+
********************************************************************************
|
31
|
+
eos
|
32
|
+
s.email = ['gcappellotto@smood.it']
|
33
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
34
|
+
s.files = `git ls-files`.split("\n")
|
35
|
+
s.homepage = 'https://github.com/potomak/smoodit'
|
36
|
+
s.name = 'smoodit'
|
37
|
+
s.platform = Gem::Platform::RUBY
|
38
|
+
s.require_paths = ['lib']
|
39
|
+
s.required_rubygems_version = Gem::Requirement.new('>= 1.3.6') if s.respond_to? :required_rubygems_version=
|
40
|
+
s.rubyforge_project = s.name
|
41
|
+
s.summary = %q{Ruby wrapper for the Smood it API}
|
42
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
43
|
+
s.version = Smoodit::VERSION.dup
|
44
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require File.expand_path('../../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
describe Faraday::Response do
|
4
|
+
before do
|
5
|
+
@client = Smoodit::Client.new
|
6
|
+
end
|
7
|
+
|
8
|
+
{
|
9
|
+
400 => Smoodit::BadRequest,
|
10
|
+
401 => Smoodit::Unauthorized,
|
11
|
+
403 => Smoodit::Forbidden,
|
12
|
+
404 => Smoodit::NotFound,
|
13
|
+
406 => Smoodit::NotAcceptable,
|
14
|
+
500 => Smoodit::InternalServerError,
|
15
|
+
502 => Smoodit::BadGateway,
|
16
|
+
503 => Smoodit::ServiceUnavailable,
|
17
|
+
}.each do |status, exception|
|
18
|
+
context "when HTTP status is #{status}" do
|
19
|
+
|
20
|
+
before do
|
21
|
+
stub_get('users/171').to_return(:status => status)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should raise #{exception.name} error" do
|
25
|
+
lambda do
|
26
|
+
@client.users(171) {|user| user}
|
27
|
+
end.should raise_error(exception)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require File.expand_path('../../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
describe Smoodit::API do
|
4
|
+
before do
|
5
|
+
@keys = Smoodit::Configuration::VALID_OPTIONS_KEYS
|
6
|
+
end
|
7
|
+
|
8
|
+
context "with module configuration" do
|
9
|
+
|
10
|
+
before do
|
11
|
+
Smoodit.configure do |config|
|
12
|
+
@keys.each do |key|
|
13
|
+
config.send("#{key}=", key)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
after do
|
19
|
+
Smoodit.reset
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should inherit module configuration" do
|
23
|
+
api = Smoodit::API.new
|
24
|
+
@keys.each do |key|
|
25
|
+
api.send(key).should == key
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context "with class configuration" do
|
30
|
+
|
31
|
+
before do
|
32
|
+
@configuration = {
|
33
|
+
:consumer_key => 'CK',
|
34
|
+
:consumer_secret => 'CS',
|
35
|
+
:oauth_token => 'OT',
|
36
|
+
:oauth_token_secret => 'OS',
|
37
|
+
:adapter => :typhoeus,
|
38
|
+
:endpoint => 'http://tumblr.com/',
|
39
|
+
:format => :xml,
|
40
|
+
:proxy => 'http://giovanni:secret@proxy.example.com:8080',
|
41
|
+
:user_agent => 'Custom User Agent',
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
context "during initialization"
|
46
|
+
|
47
|
+
it "should override module configuration" do
|
48
|
+
api = Smoodit::API.new(@configuration)
|
49
|
+
@keys.each do |key|
|
50
|
+
api.send(key).should == @configuration[key]
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context "after initilization" do
|
55
|
+
|
56
|
+
it "should override module configuration after initialization" do
|
57
|
+
api = Smoodit::API.new
|
58
|
+
@configuration.each do |key, value|
|
59
|
+
api.send("#{key}=", value)
|
60
|
+
end
|
61
|
+
@keys.each do |key|
|
62
|
+
api.send(key).should == @configuration[key]
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require File.expand_path('../../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
describe Smoodit::Client do
|
4
|
+
it "should connect using the endpoint configuration" do
|
5
|
+
client = Smoodit::Client.new
|
6
|
+
endpoint = URI.parse(client.api_endpoint)
|
7
|
+
connection = client.send(:connection).build_url(nil).to_s
|
8
|
+
connection.should == endpoint.to_s
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,228 @@
|
|
1
|
+
require File.expand_path('../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
describe Smoodit do
|
4
|
+
after do
|
5
|
+
Smoodit.reset
|
6
|
+
end
|
7
|
+
|
8
|
+
context "when delegating to a client" do
|
9
|
+
before do
|
10
|
+
stub_get("john").
|
11
|
+
to_return(:body => fixture("user_john.js"), :headers => {:content_type => "application/json; charset=utf-8"})
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should get the correct resource" do
|
15
|
+
Smoodit.john {|user| user}
|
16
|
+
a_get("john").
|
17
|
+
should have_been_made
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should return the same results as a client" do
|
21
|
+
class_obj = nil
|
22
|
+
client_obj = nil
|
23
|
+
|
24
|
+
Smoodit.john {|user| class_obj = user}
|
25
|
+
Smoodit::Client.new.john {|user| client_obj = user}
|
26
|
+
|
27
|
+
class_obj.should == client_obj
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context "when making a request to" do
|
32
|
+
# https://github.com/smoodit/api/wiki/User-profile
|
33
|
+
# https://github.com/smoodit/api/wiki/Your-profile
|
34
|
+
["john", "profile"].each do |member|
|
35
|
+
describe "GET #{member}" do
|
36
|
+
before do
|
37
|
+
stub_get(member)
|
38
|
+
|
39
|
+
@request = Smoodit.send(member) {|r| r}
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should use '#{member}' request path" do
|
43
|
+
@request.proxy.path.should == member
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should use GET request verb" do
|
47
|
+
@request.proxy.verb.should == :get
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# https://github.com/smoodit/api/wiki/Followers
|
53
|
+
# https://github.com/smoodit/api/wiki/Following
|
54
|
+
# https://github.com/smoodit/api/wiki/User-smoods
|
55
|
+
["followers", "following", "smoods"].each do |member|
|
56
|
+
describe "GET john/#{member}" do
|
57
|
+
before do
|
58
|
+
stub_get("john/#{member}")
|
59
|
+
|
60
|
+
@request = Smoodit.john.send(member) {|r| r}
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should use 'john/#{member}' request path" do
|
64
|
+
@request.proxy.path.should == "john/#{member}"
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should use GET request verb" do
|
68
|
+
@request.proxy.verb.should == :get
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
# https://github.com/smoodit/api/wiki/Your-smoods
|
74
|
+
describe "GET profile/smoods" do
|
75
|
+
before do
|
76
|
+
stub_get("profile/smoods")
|
77
|
+
|
78
|
+
@request = Smoodit.profile.smoods {|r| r}
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should use 'profile/smoods' request path" do
|
82
|
+
@request.proxy.path.should == "profile/smoods"
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should use GET request verb" do
|
86
|
+
@request.proxy.verb.should == :get
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
# https://github.com/smoodit/api/wiki/Follow-user
|
91
|
+
# https://github.com/smoodit/api/wiki/Unfollow-user
|
92
|
+
["follow", "unfollow"].each do |member|
|
93
|
+
describe "POST users/123/#{member}" do
|
94
|
+
before do
|
95
|
+
stub_post("users/123/#{member}")
|
96
|
+
|
97
|
+
@request = Smoodit.users(123).send(member).post {|r| r}
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should use 'users/123/#{member}' request path" do
|
101
|
+
@request.proxy.path.should == "users/123/#{member}"
|
102
|
+
end
|
103
|
+
|
104
|
+
it "should use POST request verb" do
|
105
|
+
@request.proxy.verb.should == :post
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
# https://github.com/smoodit/api/wiki/Create-new-smood
|
111
|
+
describe "POST smoods" do
|
112
|
+
before do
|
113
|
+
stub_post("smoods")
|
114
|
+
|
115
|
+
Smoodit.configure do |config|
|
116
|
+
config.format = :test
|
117
|
+
end
|
118
|
+
|
119
|
+
@options = {
|
120
|
+
:smood => {
|
121
|
+
:mood => :anger
|
122
|
+
}
|
123
|
+
}
|
124
|
+
|
125
|
+
@request = Smoodit.smoods.post(@options) {|r| r}
|
126
|
+
end
|
127
|
+
|
128
|
+
it "should use 'smoods' request path" do
|
129
|
+
@request.proxy.path.should == "smoods"
|
130
|
+
end
|
131
|
+
|
132
|
+
it "should use POST request verb" do
|
133
|
+
@request.proxy.verb.should == :post
|
134
|
+
end
|
135
|
+
|
136
|
+
it "should include new smood parameters into request" do
|
137
|
+
@request.proxy.options.should == @options
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
# https://github.com/smoodit/api/wiki/Delete-smood
|
142
|
+
describe "DELETE smoods/123" do
|
143
|
+
before do
|
144
|
+
stub_delete("smoods/123")
|
145
|
+
|
146
|
+
@request = Smoodit.smoods(123).delete {|r| r}
|
147
|
+
end
|
148
|
+
|
149
|
+
it "should use 'smoods/123' request path" do
|
150
|
+
@request.proxy.path.should == "smoods/123"
|
151
|
+
end
|
152
|
+
|
153
|
+
it "should use DELETE request verb" do
|
154
|
+
@request.proxy.verb.should == :delete
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
describe ".client" do
|
160
|
+
it "should be a Smoodit::Client" do
|
161
|
+
Smoodit.client.should be_a Smoodit::Client
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
describe ".adapter" do
|
166
|
+
it "should return the default adapter" do
|
167
|
+
Smoodit.adapter.should == Smoodit::Configuration::DEFAULT_ADAPTER
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
describe ".adapter=" do
|
172
|
+
it "should set the adapter" do
|
173
|
+
Smoodit.adapter = :typhoeus
|
174
|
+
Smoodit.adapter.should == :typhoeus
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
describe ".endpoint" do
|
179
|
+
it "should return the default endpoint" do
|
180
|
+
Smoodit.endpoint.should == Smoodit::Configuration::DEFAULT_ENDPOINT
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
describe ".endpoint=" do
|
185
|
+
it "should set the endpoint" do
|
186
|
+
Smoodit.endpoint = 'http://tumblr.com/'
|
187
|
+
Smoodit.endpoint.should == 'http://tumblr.com/'
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
describe ".format" do
|
192
|
+
it "should return the default format" do
|
193
|
+
Smoodit.format.should == Smoodit::Configuration::DEFAULT_FORMAT
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
describe ".format=" do
|
198
|
+
it "should set the format" do
|
199
|
+
Smoodit.format = 'xml'
|
200
|
+
Smoodit.format.should == 'xml'
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
describe ".user_agent" do
|
205
|
+
it "should return the default user agent" do
|
206
|
+
Smoodit.user_agent.should == Smoodit::Configuration::DEFAULT_USER_AGENT
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
describe ".user_agent=" do
|
211
|
+
it "should set the user_agent" do
|
212
|
+
Smoodit.user_agent = 'Custom User Agent'
|
213
|
+
Smoodit.user_agent.should == 'Custom User Agent'
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
217
|
+
describe ".configure" do
|
218
|
+
Smoodit::Configuration::VALID_OPTIONS_KEYS.each do |key|
|
219
|
+
|
220
|
+
it "should set the #{key}" do
|
221
|
+
Smoodit.configure do |config|
|
222
|
+
config.send("#{key}=", key)
|
223
|
+
Smoodit.send(key).should == key
|
224
|
+
end
|
225
|
+
end
|
226
|
+
end
|
227
|
+
end
|
228
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'simplecov'
|
2
|
+
SimpleCov.start do
|
3
|
+
add_group 'Smoodit', 'lib/smoodit'
|
4
|
+
add_group 'Faraday Middleware', 'lib/faraday'
|
5
|
+
add_group 'Specs', 'spec'
|
6
|
+
end
|
7
|
+
|
8
|
+
require File.expand_path('../../lib/smoodit', __FILE__)
|
9
|
+
|
10
|
+
require 'rspec'
|
11
|
+
require 'webmock/rspec'
|
12
|
+
RSpec.configure do |config|
|
13
|
+
config.include WebMock::API
|
14
|
+
end
|
15
|
+
|
16
|
+
def a_delete(path)
|
17
|
+
a_request(:delete, Smoodit.endpoint + path)
|
18
|
+
end
|
19
|
+
|
20
|
+
def a_get(path)
|
21
|
+
a_request(:get, Smoodit.endpoint + path)
|
22
|
+
end
|
23
|
+
|
24
|
+
def a_post(path)
|
25
|
+
a_request(:post, Smoodit.endpoint + path)
|
26
|
+
end
|
27
|
+
|
28
|
+
def a_put(path)
|
29
|
+
a_request(:put, Smoodit.endpoint + path)
|
30
|
+
end
|
31
|
+
|
32
|
+
def stub_delete(path)
|
33
|
+
stub_request(:delete, Smoodit.endpoint + path)
|
34
|
+
end
|
35
|
+
|
36
|
+
def stub_get(path)
|
37
|
+
stub_request(:get, Smoodit.endpoint + path)
|
38
|
+
end
|
39
|
+
|
40
|
+
def stub_post(path)
|
41
|
+
stub_request(:post, Smoodit.endpoint + path)
|
42
|
+
end
|
43
|
+
|
44
|
+
def stub_put(path)
|
45
|
+
stub_request(:put, Smoodit.endpoint + path)
|
46
|
+
end
|
47
|
+
|
48
|
+
def fixture_path
|
49
|
+
File.expand_path("../fixtures", __FILE__)
|
50
|
+
end
|
51
|
+
|
52
|
+
def fixture(file)
|
53
|
+
File.new(fixture_path + '/' + file)
|
54
|
+
end
|