partigirb 0.2.7 → 0.3.0
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/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
|
|