partigirb 0.2.7 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +26 -8
- data/VERSION +1 -1
- data/examples/last_reviews_summary.rb +6 -3
- data/examples/who_ignores_me.rb +4 -1
- data/lib/partigirb/client.rb +56 -63
- data/lib/partigirb/transport.rb +24 -18
- data/lib/partigirb.rb +3 -3
- data/partigirb.gemspec +4 -5
- data/test/client_test.rb +82 -73
- data/test/mocks/transport_mock.rb +2 -1
- data/test/test_helper.rb +2 -2
- data/test/transport_test.rb +21 -4
- metadata +2 -2
data/README.markdown
CHANGED
@@ -12,23 +12,35 @@ There is also a [complete documentation of the API](http://partigi.pbworks.com/)
|
|
12
12
|
|
13
13
|
## Install
|
14
14
|
|
15
|
+
gem install oauth
|
15
16
|
gem install partigirb -s http://gemcutter.org
|
16
17
|
|
17
18
|
## Usage
|
18
19
|
|
19
20
|
### Creating a client
|
20
21
|
|
21
|
-
|
22
|
+
Since Partigi started to require OAuth in all its API requests they support two authorization modes: the common OAuth specification ([http://oauth.net/core/1.0a/](http://oauth.net/core/1.0a/)) for read-write access and OAuth with a slightly modification for read-only access, which just consists of skiping the oauth_token when signing the requests.
|
22
23
|
|
23
|
-
|
24
|
+
Regardless of the access method used you will need to register your application and get a `consumer_key` and a `consumer_secret`, used in both access methods. ([http://www.partigi.com/applications](http://www.partigi.com/applications))
|
24
25
|
|
25
|
-
####
|
26
|
+
#### Read-only access
|
26
27
|
|
27
|
-
client = Partigirb::Client.new(
|
28
|
-
|
29
|
-
####
|
30
|
-
|
31
|
-
client = Partigirb::Client.new(
|
28
|
+
client = Partigirb::Client.new('consumer_key', 'consumer_secret')
|
29
|
+
|
30
|
+
#### Read-write access
|
31
|
+
|
32
|
+
client = Partigirb::Client.new('consumer_key', 'consumer_secret')
|
33
|
+
client.set_callback_url('http://myapplication.test/partigi')
|
34
|
+
request_token = client.request_token
|
35
|
+
|
36
|
+
# At this point we must redirect the user to Partigi so he can authorize our application to access
|
37
|
+
# his profile, we can get the authorization url with request_token.authorize_url
|
38
|
+
|
39
|
+
# Once we are back Partigi will give us the parameter oauth_verifier, which we will use
|
40
|
+
# to get the access token
|
41
|
+
client.authorize_from_request(request_token.token, request_token.secret, oauth_verifier)
|
42
|
+
|
43
|
+
# Now our client is fully authorized to call write methods for the user
|
32
44
|
|
33
45
|
### Request methods
|
34
46
|
|
@@ -100,6 +112,12 @@ There are two special cases to be aware of in regard to PartigiStruct:
|
|
100
112
|
|
101
113
|
In case Partigi returns an error response, this is turned into a PartigiError object which message attribute is set to the error string returned in the XML response.
|
102
114
|
|
115
|
+
### Verifying our credentials
|
116
|
+
|
117
|
+
A way to check if our client is correctly authorized for write access or to just get the current user's information is by using the verify_credentials method, which will return either the PartigiStruct object with user's information or a PartigiError object in case of authorization failure.
|
118
|
+
|
119
|
+
client.verify_credentials
|
120
|
+
|
103
121
|
## Requirements
|
104
122
|
|
105
123
|
- json
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
@@ -1,5 +1,8 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../lib/partigirb'
|
2
2
|
|
3
|
+
CONSUMER_KEY = "your_consumer_key"
|
4
|
+
CONSUMER_SECRET = "your_consumer_secret"
|
5
|
+
|
3
6
|
if ARGV.empty?
|
4
7
|
puts "\nUsage: ruby #{__FILE__} user_id_or_login\n\n"
|
5
8
|
exit
|
@@ -14,15 +17,15 @@ def show_reviews(client, reviews, title)
|
|
14
17
|
puts
|
15
18
|
|
16
19
|
reviews.each do |review|
|
17
|
-
|
18
|
-
puts "- #{
|
20
|
+
item = client.items.show? :id => review.ptItem_id, :item_type => review.ptItem_type
|
21
|
+
puts "- #{item.title}"
|
19
22
|
puts " Comment: #{review.content.text}"
|
20
23
|
puts
|
21
24
|
end
|
22
25
|
puts
|
23
26
|
end
|
24
27
|
|
25
|
-
client = Partigirb::Client.new
|
28
|
+
client = Partigirb::Client.new(CONSUMER_KEY, CONSUMER_SECRET)
|
26
29
|
|
27
30
|
reviews = client.reviews.index? :user_id => user_id, :per_page => 5, :status => 0, :order => 'desc'
|
28
31
|
show_reviews(client, reviews, "Latest 5 films you want to watch")
|
data/examples/who_ignores_me.rb
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../lib/partigirb'
|
2
2
|
|
3
|
+
CONSUMER_KEY = "your_consumer_key"
|
4
|
+
CONSUMER_SECRET = "your_consumer_secret"
|
5
|
+
|
3
6
|
if ARGV.empty?
|
4
7
|
puts "\nUsage: #{__FILE__} user_id_or_login\n\n"
|
5
8
|
exit
|
@@ -7,7 +10,7 @@ end
|
|
7
10
|
|
8
11
|
user_id = ARGV.first
|
9
12
|
|
10
|
-
client = Partigirb::Client.new
|
13
|
+
client = Partigirb::Client.new(CONSUMER_KEY, CONSUMER_SECRET)
|
11
14
|
|
12
15
|
traitors = []
|
13
16
|
|
data/lib/partigirb/client.rb
CHANGED
@@ -46,28 +46,22 @@ module Partigirb
|
|
46
46
|
PARTIGI_API_HOST = "www.partigi.com"
|
47
47
|
TIMESTAMP_FORMAT = '%Y-%m-%dT%H:%M:%SZ'
|
48
48
|
|
49
|
-
attr_accessor :default_format, :headers, :api_version, :transport, :request, :api_host, :auth, :handlers
|
50
|
-
|
51
|
-
def initialize(options={})
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
49
|
+
attr_accessor :consumer_key, :consumer_secret, :default_format, :headers, :api_version, :transport, :request, :api_host, :auth, :handlers, :access_token
|
50
|
+
|
51
|
+
def initialize(consumer_key, consumer_secret, options={})
|
52
|
+
@consumer = ::OAuth::Consumer.new(consumer_key, consumer_secret, {:site => "http://#{PARTIGI_API_HOST}"})
|
53
|
+
@transport = Transport.new(@consumer)
|
54
|
+
@api_host = PARTIGI_API_HOST.clone
|
55
|
+
@api_version = options[:api_version] || Partigirb::CURRENT_API_VERSION
|
56
|
+
@headers = {"User-Agent"=>"Partigirb/#{Partigirb::VERSION}"}.merge!(options[:headers]||{})
|
57
|
+
@default_format = options[:default_format] || :atom
|
58
|
+
@handlers = {
|
58
59
|
:json => Partigirb::Handlers::JSONHandler.new,
|
59
60
|
:xml => Partigirb::Handlers::XMLHandler.new,
|
60
61
|
:atom => Partigirb::Handlers::AtomHandler.new,
|
61
62
|
:unknown => Partigirb::Handlers::StringHandler.new
|
62
63
|
}
|
63
|
-
|
64
|
-
|
65
|
-
# Authentication param should be a hash with keys:
|
66
|
-
# login (required)
|
67
|
-
# api_secret (required)
|
68
|
-
# nonce (optional, would be automatically generated if missing)
|
69
|
-
# timestamp (optional, current timestamp will be automatically used if missing)
|
70
|
-
self.auth = options[:auth]
|
64
|
+
@handlers.merge!(options[:handlers]) if options[:handlers]
|
71
65
|
end
|
72
66
|
|
73
67
|
def method_missing(name,*args)
|
@@ -101,6 +95,43 @@ module Partigirb
|
|
101
95
|
@request ||= Request.new(self,api_version)
|
102
96
|
end
|
103
97
|
|
98
|
+
# OAuth related methods
|
99
|
+
|
100
|
+
# Note: If using oauth with a web app, be sure to provide :oauth_callback.
|
101
|
+
def request_token(options={})
|
102
|
+
@request_token ||= consumer.get_request_token(options)
|
103
|
+
end
|
104
|
+
|
105
|
+
def set_callback_url(url)
|
106
|
+
clear_request_token
|
107
|
+
request_token(:oauth_callback => url)
|
108
|
+
end
|
109
|
+
|
110
|
+
# For web apps use params[:oauth_verifier], for desktop apps,
|
111
|
+
# use the verifier is the pin that twitter gives users.
|
112
|
+
def authorize_from_request(request_token, request_secret, verifier_or_pin)
|
113
|
+
request_token = OAuth::RequestToken.new(consumer, request_token, request_secret)
|
114
|
+
@access_token = request_token.get_access_token(:oauth_verifier => verifier_or_pin)
|
115
|
+
end
|
116
|
+
|
117
|
+
def consumer
|
118
|
+
@consumer
|
119
|
+
end
|
120
|
+
|
121
|
+
def access_token
|
122
|
+
@access_token
|
123
|
+
end
|
124
|
+
|
125
|
+
def authorize_from_access(token, secret)
|
126
|
+
@access_token = OAuth::AccessToken.new(consumer, token, secret)
|
127
|
+
end
|
128
|
+
|
129
|
+
# Shortcut methods
|
130
|
+
|
131
|
+
def verify_credentials
|
132
|
+
account.verify_credentials?
|
133
|
+
end
|
134
|
+
|
104
135
|
protected
|
105
136
|
|
106
137
|
def call_with_format(format,params={})
|
@@ -113,11 +144,9 @@ module Partigirb
|
|
113
144
|
|
114
145
|
def send_request(params)
|
115
146
|
begin
|
116
|
-
|
117
|
-
|
118
|
-
transport.request(
|
119
|
-
request.method, request.url, :headers=>headers, :params=>params
|
120
|
-
)
|
147
|
+
options = {:headers=>headers, :params=>params}
|
148
|
+
options.merge!(:access_token => @access_token) unless @access_token.nil?
|
149
|
+
transport.request(request.method, request.url, options)
|
121
150
|
rescue => e
|
122
151
|
puts e
|
123
152
|
end
|
@@ -128,19 +157,15 @@ module Partigirb
|
|
128
157
|
|
129
158
|
begin
|
130
159
|
if res.code.to_i != 200
|
131
|
-
handle_error_response(res
|
160
|
+
handle_error_response(res)
|
132
161
|
else
|
133
162
|
fmt_handler.decode_response(res.body)
|
134
163
|
end
|
135
164
|
end
|
136
165
|
end
|
137
166
|
|
138
|
-
|
139
|
-
|
140
|
-
# Response for errors is an XML document containing an error tag as a root,
|
141
|
-
# having a text node with error name. As XMLHandler starts building the Struct
|
142
|
-
# on root node the returned value from the handler will always be the error name text.
|
143
|
-
raise PartigiError.new(handler.decode_response(res.body))
|
167
|
+
def handle_error_response(res)
|
168
|
+
raise PartigiError.new(res.body)
|
144
169
|
end
|
145
170
|
|
146
171
|
def format_invocation?(name)
|
@@ -151,40 +176,8 @@ module Partigirb
|
|
151
176
|
handlers[format] || handlers[:unknown]
|
152
177
|
end
|
153
178
|
|
154
|
-
|
155
|
-
|
156
|
-
unless self.auth.nil? || self.auth === Hash || self.auth.empty?
|
157
|
-
auths = self.auth.stringify_keys
|
158
|
-
|
159
|
-
if auths.has_key?('login') && auths.has_key?('api_secret')
|
160
|
-
if !auths['timestamp'].nil?
|
161
|
-
timestamp = case auths['timestamp']
|
162
|
-
when Time
|
163
|
-
auths['timestamp'].strftime(TIMESTAMP_FORMAT)
|
164
|
-
when String
|
165
|
-
auths['timestamp']
|
166
|
-
end
|
167
|
-
else
|
168
|
-
timestamp = Time.now.strftime(TIMESTAMP_FORMAT) if timestamp.nil?
|
169
|
-
end
|
170
|
-
|
171
|
-
nonce = auths['nonce'] || generate_nonce
|
172
|
-
password_digest = generate_password_digest(nonce, timestamp, auths['login'], auths['api_secret'])
|
173
|
-
headers.merge!({
|
174
|
-
'Authorization' => "WSSE realm=\"#{PARTIGI_API_HOST}\", profile=\"UsernameToken\"",
|
175
|
-
'X-WSSE' => "UsernameToken Username=\"#{auths['login']}\", PasswordDigest=\"#{password_digest}\", Nonce=\"#{nonce}\", Created=\"#{timestamp}\""
|
176
|
-
})
|
177
|
-
end
|
178
|
-
end
|
179
|
-
end
|
180
|
-
|
181
|
-
def generate_nonce
|
182
|
-
o = [('a'..'z'),('A'..'Z')].map{|i| i.to_a}.flatten
|
183
|
-
Digest::MD5.hexdigest((0..10).map{o[rand(o.length)]}.join)
|
184
|
-
end
|
185
|
-
|
186
|
-
def generate_password_digest(nonce, timestamp, login, secret)
|
187
|
-
Base64.encode64(Digest::SHA1.hexdigest("#{nonce}#{timestamp}#{login}#{secret}")).chomp
|
179
|
+
def clear_request_token
|
180
|
+
@request_token = nil
|
188
181
|
end
|
189
182
|
end
|
190
183
|
end
|
data/lib/partigirb/transport.rb
CHANGED
@@ -13,8 +13,12 @@ module Partigirb
|
|
13
13
|
|
14
14
|
class Transport
|
15
15
|
|
16
|
-
attr_accessor :debug
|
17
|
-
|
16
|
+
attr_accessor :debug, :consumer
|
17
|
+
|
18
|
+
def initialize(consumer)
|
19
|
+
@consumer = consumer
|
20
|
+
end
|
21
|
+
|
18
22
|
CRLF = "\r\n"
|
19
23
|
|
20
24
|
def req_class(method)
|
@@ -44,23 +48,25 @@ module Partigirb
|
|
44
48
|
end
|
45
49
|
|
46
50
|
def execute_request(method,url,options={})
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
else
|
56
|
-
add_form_data(req,options[:params])
|
57
|
-
end
|
58
|
-
|
59
|
-
dump_request(req) if debug
|
60
|
-
res = http.request(req)
|
61
|
-
dump_response(res) if debug
|
62
|
-
res
|
51
|
+
http = Net::HTTP.new(url.host, url.port)
|
52
|
+
|
53
|
+
req = req_class(method).new(url.request_uri)
|
54
|
+
add_headers(req,options[:headers])
|
55
|
+
if file_param?(options[:params])
|
56
|
+
add_multipart_data(req,options[:params])
|
57
|
+
else
|
58
|
+
add_form_data(req,options[:params])
|
63
59
|
end
|
60
|
+
|
61
|
+
# Sign the request with OAuth
|
62
|
+
# when there is no options[:access_token] the request is signed without oauth_token
|
63
|
+
# so it will be a Partigi OAuth Readonly request
|
64
|
+
req.oauth!(http, @consumer, options[:access_token])
|
65
|
+
|
66
|
+
dump_request(req) if debug
|
67
|
+
res = http.request(req)
|
68
|
+
dump_response(res) if debug
|
69
|
+
res
|
64
70
|
end
|
65
71
|
|
66
72
|
def query_string(params)
|
data/lib/partigirb.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
module Partigirb
|
2
|
-
VERSION='0.
|
2
|
+
VERSION='0.3.0'
|
3
3
|
CURRENT_API_VERSION=1
|
4
4
|
end
|
5
5
|
|
@@ -14,6 +14,7 @@ require 'digest'
|
|
14
14
|
require 'rexml/document'
|
15
15
|
require 'mime/types'
|
16
16
|
require 'ostruct'
|
17
|
+
require 'oauth'
|
17
18
|
|
18
19
|
require 'partigirb/core_ext'
|
19
20
|
|
@@ -23,5 +24,4 @@ require 'partigirb/handlers/json_handler'
|
|
23
24
|
require 'partigirb/handlers/string_handler'
|
24
25
|
|
25
26
|
require 'partigirb/transport'
|
26
|
-
require 'partigirb/client'
|
27
|
-
|
27
|
+
require 'partigirb/client'
|
data/partigirb.gemspec
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run
|
2
|
+
# DO NOT EDIT THIS FILE
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{partigirb}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.3.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Alvaro Bautista", "Fernando Blat"]
|
12
|
-
s.date = %q{
|
12
|
+
s.date = %q{2010-02-10}
|
13
13
|
s.email = ["alvarobp@gmail.com", "ferblape@gmail.com"]
|
14
14
|
s.extra_rdoc_files = [
|
15
15
|
"LICENSE",
|
@@ -73,4 +73,3 @@ Gem::Specification.new do |s|
|
|
73
73
|
else
|
74
74
|
end
|
75
75
|
end
|
76
|
-
|
data/test/client_test.rb
CHANGED
@@ -88,71 +88,6 @@ class ClientTest < Test::Unit::TestCase
|
|
88
88
|
assert_equal 'header', Net::HTTP.request['Fake']
|
89
89
|
end
|
90
90
|
|
91
|
-
should "add authentication headers when login and secret are provided" do
|
92
|
-
@client = new_client(200, '', :auth => {:login => 'auser', :api_secret => 'his_api_secret'})
|
93
|
-
|
94
|
-
@client.friendships.update! :id => 321
|
95
|
-
|
96
|
-
assert_not_nil Net::HTTP.request['Authorization']
|
97
|
-
assert_equal "WSSE realm=\"#{Partigirb::Client::PARTIGI_API_HOST}\", profile=\"UsernameToken\"", Net::HTTP.request['Authorization']
|
98
|
-
|
99
|
-
assert_not_nil Net::HTTP.request['X-WSSE']
|
100
|
-
assert_match /UsernameToken Username="auser", PasswordDigest="[^"]+", Nonce="[^"]+", Created="[^"]+"/, Net::HTTP.request['X-WSSE']
|
101
|
-
end
|
102
|
-
|
103
|
-
should "not add authentication headers if no auth params are provided" do
|
104
|
-
@client.friendships.update! :id => 321
|
105
|
-
|
106
|
-
assert_nil Net::HTTP.request['Authorization']
|
107
|
-
assert_nil Net::HTTP.request['X-WSSE']
|
108
|
-
end
|
109
|
-
|
110
|
-
should "use given nonce for authentication" do
|
111
|
-
@client = new_client(200, '', :auth => {:login => 'auser', :api_secret => 'his_api_secret', :nonce => '123456789101112'})
|
112
|
-
@client.friendships.update! :id => 321
|
113
|
-
|
114
|
-
assert_equal "WSSE realm=\"#{Partigirb::Client::PARTIGI_API_HOST}\", profile=\"UsernameToken\"", Net::HTTP.request['Authorization']
|
115
|
-
assert_match /UsernameToken Username="auser", PasswordDigest="[^"]+", Nonce="123456789101112", Created="[^"]+"/, Net::HTTP.request['X-WSSE']
|
116
|
-
end
|
117
|
-
|
118
|
-
should "use given timestamp string for authentication" do
|
119
|
-
@client = new_client(200, '', :auth => {:login => 'auser', :api_secret => 'his_api_secret', :timestamp => '2009-07-15T14:43:07Z'})
|
120
|
-
@client.friendships.update! :id => 321
|
121
|
-
|
122
|
-
assert_equal "WSSE realm=\"#{Partigirb::Client::PARTIGI_API_HOST}\", profile=\"UsernameToken\"", Net::HTTP.request['Authorization']
|
123
|
-
assert_match /UsernameToken Username="auser", PasswordDigest="[^"]+", Nonce="[^"]+", Created="2009-07-15T14:43:07Z"/, Net::HTTP.request['X-WSSE']
|
124
|
-
end
|
125
|
-
|
126
|
-
should "use given Time object as timestamp for authentication" do
|
127
|
-
timestamp = Time.now
|
128
|
-
@client = new_client(200, '', :auth => {:login => 'auser', :api_secret => 'his_api_secret', :timestamp => timestamp})
|
129
|
-
@client.friendships.update! :id => 321
|
130
|
-
|
131
|
-
assert_equal "WSSE realm=\"#{Partigirb::Client::PARTIGI_API_HOST}\", profile=\"UsernameToken\"", Net::HTTP.request['Authorization']
|
132
|
-
assert_match /UsernameToken Username="auser", PasswordDigest="[^"]+", Nonce="[^"]+", Created="#{timestamp.strftime(Partigirb::Client::TIMESTAMP_FORMAT)}"/, Net::HTTP.request['X-WSSE']
|
133
|
-
end
|
134
|
-
|
135
|
-
should "use the PasswordDigest from given parameters" do
|
136
|
-
@client = new_client(200, '', :auth => {:login => 'auser', :api_secret => 'his_api_secret', :nonce => '123456789101112', :timestamp => '2009-07-15T14:43:07Z'})
|
137
|
-
@client.friendships.update! :id => 321
|
138
|
-
|
139
|
-
pdigest = Base64.encode64(Digest::SHA1.hexdigest("1234567891011122009-07-15T14:43:07Zauserhis_api_secret")).chomp
|
140
|
-
|
141
|
-
assert_equal "WSSE realm=\"#{Partigirb::Client::PARTIGI_API_HOST}\", profile=\"UsernameToken\"", Net::HTTP.request['Authorization']
|
142
|
-
assert_match /UsernameToken Username="auser", PasswordDigest="#{pdigest}", Nonce="123456789101112", Created="2009-07-15T14:43:07Z"/, Net::HTTP.request['X-WSSE']
|
143
|
-
end
|
144
|
-
|
145
|
-
context "generate_nonce method" do
|
146
|
-
should "generate random strings" do
|
147
|
-
@client.instance_eval do
|
148
|
-
nonces = []
|
149
|
-
1.upto(25) do
|
150
|
-
assert !nonces.include?(generate_nonce)
|
151
|
-
end
|
152
|
-
end
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
91
|
should "process XML response by XML handler" do
|
157
92
|
Partigirb::Handlers::XMLHandler.any_instance.expects(:decode_response).once
|
158
93
|
Partigirb::Handlers::AtomHandler.any_instance.expects(:decode_response).never
|
@@ -175,14 +110,88 @@ class ClientTest < Test::Unit::TestCase
|
|
175
110
|
end
|
176
111
|
|
177
112
|
should "raise a PartigiError with response error text as the message when http response codes are other than 200" do
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
113
|
+
client = new_client(400, "Partigi::BadAPIRequestRequiredParams")
|
114
|
+
|
115
|
+
begin
|
116
|
+
client.items.show.xml :id => 'madeup'
|
117
|
+
rescue Exception => e
|
118
|
+
assert e.is_a?(Partigirb::PartigiError)
|
119
|
+
assert_equal 'Partigi::BadAPIRequestRequiredParams', e.message
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
should "initialize with OAuth consumer key and secret" do
|
124
|
+
client = Partigirb::Client.new('my_consumer_key', 'my_consumer_secret')
|
125
|
+
|
126
|
+
assert client.consumer.is_a?(OAuth::Consumer)
|
127
|
+
assert_equal 'my_consumer_key', client.consumer.key
|
128
|
+
assert_equal 'my_consumer_secret', client.consumer.secret
|
129
|
+
end
|
130
|
+
|
131
|
+
should "get a request token from the consumer" do
|
132
|
+
consumer = mock('oauth consumer')
|
133
|
+
request_token = mock('request token')
|
134
|
+
OAuth::Consumer.expects(:new).with('my_consumer_key', 'my_consumer_secret', {:site => 'http://www.partigi.com'}).returns(consumer)
|
135
|
+
client = Partigirb::Client.new('my_consumer_key', 'my_consumer_secret')
|
136
|
+
|
137
|
+
consumer.expects(:get_request_token).returns(request_token)
|
138
|
+
|
139
|
+
assert_equal request_token, client.request_token
|
140
|
+
end
|
141
|
+
|
142
|
+
should "clear request token and set the callback url" do
|
143
|
+
consumer = mock('oauth consumer')
|
144
|
+
request_token = mock('request token')
|
145
|
+
OAuth::Consumer.expects(:new).with('my_consumer_key', 'my_consumer_secret', {:site => 'http://www.partigi.com'}).returns(consumer)
|
146
|
+
client = Partigirb::Client.new('my_consumer_key', 'my_consumer_secret')
|
147
|
+
|
148
|
+
client.expects(:clear_request_token).once
|
149
|
+
consumer.expects(:get_request_token).with({:oauth_callback => 'http://testing.com/oauth_callback'}).returns(request_token)
|
150
|
+
|
151
|
+
client.set_callback_url('http://testing.com/oauth_callback')
|
152
|
+
end
|
153
|
+
|
154
|
+
should "create and set access token from request token, request secret and verifier" do
|
155
|
+
client = Partigirb::Client.new('my_consumer_key', 'my_consumer_secret')
|
156
|
+
consumer = OAuth::Consumer.new('my_consumer_key', 'my_consumer_secret', {:site => 'http://www.partigi.com'})
|
157
|
+
client.stubs(:consumer).returns(consumer)
|
158
|
+
|
159
|
+
access_token = mock('access token')
|
160
|
+
request_token = mock('request token')
|
161
|
+
request_token.expects(:get_access_token).with(:oauth_verifier => 'verify_me').returns(access_token)
|
162
|
+
|
163
|
+
OAuth::RequestToken.expects(:new).with(consumer, 'the_request_token', 'the_request_secret').returns(request_token)
|
164
|
+
|
165
|
+
client.authorize_from_request('the_request_token', 'the_request_secret', 'verify_me')
|
166
|
+
assert_equal access_token, client.access_token
|
167
|
+
end
|
168
|
+
|
169
|
+
should "create and set access token from access token and secret" do
|
170
|
+
client = Partigirb::Client.new('my_consumer_key', 'my_consumer_secret')
|
171
|
+
consumer = OAuth::Consumer.new('my_consumer_key', 'my_consumer_secret', {:site => 'http://www.partigi.com'})
|
172
|
+
client.stubs(:consumer).returns(consumer)
|
173
|
+
|
174
|
+
client.authorize_from_access('the_access_token', 'the_access_secret')
|
175
|
+
assert client.access_token.is_a?(OAuth::AccessToken)
|
176
|
+
assert_equal 'the_access_token', client.access_token.token
|
177
|
+
assert_equal 'the_access_secret', client.access_token.secret
|
178
|
+
end
|
179
|
+
|
180
|
+
should "pass access token on Transport requests when available" do
|
181
|
+
access_token = mock('access token')
|
182
|
+
OAuth::AccessToken.expects(:new).with(anything, 'the_access_token', 'the_access_secret').returns(access_token)
|
183
|
+
@client.transport.expects(:request).with(anything, anything, has_entries({:access_token => access_token})).returns(MockResponse.new(200,''))
|
184
|
+
@client.authorize_from_access('the_access_token', 'the_access_secret')
|
185
|
+
@client.user.show.xml
|
186
|
+
end
|
187
|
+
|
188
|
+
context "verify_credentials method" do
|
189
|
+
should "make a request to /account/verify_credentials" do
|
190
|
+
@client = new_client(200, '')
|
191
|
+
@client.verify_credentials
|
192
|
+
|
193
|
+
assert_equal '/api/v1/account/verify_credentials.atom', @client.transport.url.path
|
194
|
+
end
|
186
195
|
end
|
187
196
|
|
188
197
|
# Copied from Grackle
|
@@ -2,8 +2,9 @@
|
|
2
2
|
class MockTransport < Partigirb::Transport
|
3
3
|
attr_accessor :status, :body, :method, :url, :options
|
4
4
|
|
5
|
-
def initialize(status,body,headers={})
|
5
|
+
def initialize(consumer,status,body,headers={})
|
6
6
|
Net::HTTP.response = MockResponse.new(status,body,headers)
|
7
|
+
super(consumer)
|
7
8
|
end
|
8
9
|
|
9
10
|
def request(method, string_url, options)
|
data/test/test_helper.rb
CHANGED
@@ -13,8 +13,8 @@ Dir.glob('test/mocks/*_mock.rb').each { |e| require e }
|
|
13
13
|
|
14
14
|
class Test::Unit::TestCase
|
15
15
|
def new_client(status=200, response_body='', client_opts={})
|
16
|
-
client = Partigirb::Client.new(client_opts)
|
17
|
-
client.transport = MockTransport.new(status,response_body)
|
16
|
+
client = Partigirb::Client.new('prb_consumer_key', 'prb_consumer_secret', client_opts)
|
17
|
+
client.transport = MockTransport.new(client.consumer,status,response_body)
|
18
18
|
client
|
19
19
|
end
|
20
20
|
|
data/test/transport_test.rb
CHANGED
@@ -1,8 +1,25 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/test_helper'
|
2
2
|
require 'net/http'
|
3
3
|
|
4
|
-
class
|
5
|
-
|
6
|
-
|
4
|
+
class TransportTest < Test::Unit::TestCase
|
5
|
+
should "sign request using OAuth without access token by default" do
|
6
|
+
consumer = ::OAuth::Consumer.new('consumer_key', 'this_is_secret')
|
7
|
+
transport = Partigirb::Transport.new(consumer)
|
8
|
+
|
9
|
+
Net::HTTP::Get.any_instance.expects(:oauth!).with(anything, consumer, nil).once
|
10
|
+
Net::HTTP.any_instance.expects(:request).once
|
11
|
+
|
12
|
+
transport.request :get, "http://test.host"
|
7
13
|
end
|
8
|
-
|
14
|
+
|
15
|
+
should "sign request using OAuth with the given Access Token" do
|
16
|
+
consumer = ::OAuth::Consumer.new('consumer_key', 'this_is_secret')
|
17
|
+
access_token = ::OAuth::AccessToken.new('access_token', 'access_secret')
|
18
|
+
transport = Partigirb::Transport.new(consumer)
|
19
|
+
|
20
|
+
Net::HTTP::Get.any_instance.expects(:oauth!).with(anything, consumer, access_token).once
|
21
|
+
Net::HTTP.any_instance.expects(:request).once
|
22
|
+
|
23
|
+
transport.request :get, "http://test.host", :access_token => access_token
|
24
|
+
end
|
25
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: partigirb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alvaro Bautista
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date:
|
13
|
+
date: 2010-02-10 00:00:00 +01:00
|
14
14
|
default_executable:
|
15
15
|
dependencies: []
|
16
16
|
|