paypal-permissions 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/Gemfile +15 -0
- data/Gemfile.lock +35 -0
- data/LICENSE.txt +21 -0
- data/README.rdoc +72 -0
- data/Rakefile +44 -0
- data/VERSION +1 -0
- data/lib/paypal-permissions.rb +9 -0
- data/lib/paypal-permissions/fault_message.rb +58 -0
- data/lib/paypal-permissions/paypal.rb +174 -0
- data/lib/paypal-permissions/version.rb +3 -0
- data/spec/paypal_spec.rb +63 -0
- data/spec/spec_helper.rb +34 -0
- data/spec/vcr/cancel_permission.yml +53 -0
- data/spec/vcr/cancel_permission_invalid.yml +55 -0
- data/spec/vcr/get_access_token_valid.yml +53 -0
- data/spec/vcr/lookup_permissions_multiple.yml +53 -0
- data/spec/vcr/request_permissions_multiple.yml +53 -0
- data/spec/vcr/request_permissions_single.yml +53 -0
- metadata +133 -0
data/.document
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
addressable (2.2.6)
|
5
|
+
crack (0.1.8)
|
6
|
+
diff-lcs (1.1.2)
|
7
|
+
git (1.2.5)
|
8
|
+
httpclient (2.2.1)
|
9
|
+
jeweler (1.6.4)
|
10
|
+
bundler (~> 1.0)
|
11
|
+
git (>= 1.2.5)
|
12
|
+
rake
|
13
|
+
rake (0.9.2)
|
14
|
+
rspec (2.6.0)
|
15
|
+
rspec-core (~> 2.6.0)
|
16
|
+
rspec-expectations (~> 2.6.0)
|
17
|
+
rspec-mocks (~> 2.6.0)
|
18
|
+
rspec-core (2.6.4)
|
19
|
+
rspec-expectations (2.6.0)
|
20
|
+
diff-lcs (~> 1.1.2)
|
21
|
+
rspec-mocks (2.6.0)
|
22
|
+
vcr (1.10.3)
|
23
|
+
webmock (1.6.4)
|
24
|
+
addressable (~> 2.2, > 2.2.5)
|
25
|
+
crack (>= 0.1.7)
|
26
|
+
|
27
|
+
PLATFORMS
|
28
|
+
ruby
|
29
|
+
|
30
|
+
DEPENDENCIES
|
31
|
+
httpclient
|
32
|
+
jeweler (~> 1.6.4)
|
33
|
+
rspec (>= 2.0.0)
|
34
|
+
vcr
|
35
|
+
webmock
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2011 Recurly, Inc.
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
# Paypal Permissions
|
2
|
+
|
3
|
+
Ruby implementation of the [PayPal Permissions API](https://www.x.com/community/ppx/permissions).
|
4
|
+
|
5
|
+
Please visit PayPal's [Permissions Service API developer forums](https://www.x.com/community/ppx/permissions?view=discussions) for questions about the Permissions API.
|
6
|
+
|
7
|
+
## Example
|
8
|
+
|
9
|
+
### Step 1: Direct the user to the "Grant Permissions" on PayPal
|
10
|
+
|
11
|
+
paypal = PaypalPermissions::Paypal.new( userid, password, signature, application_id, :production )
|
12
|
+
request_data = paypal.request_permissions(
|
13
|
+
[:express_checkout, :direct_payment, :auth_capture, :refund, :transaction_details],
|
14
|
+
'http://localhost/callback_url'
|
15
|
+
)
|
16
|
+
|
17
|
+
# Send the browser to :permissions_url to grant permission to your application
|
18
|
+
redirect_to request_data[:permissions_url]
|
19
|
+
|
20
|
+
### Step 2: Lookup result to get the final permission token
|
21
|
+
|
22
|
+
paypal = PaypalPermissions::Paypal.new( userid, password, signature, application_id, :production )
|
23
|
+
token_data = paypal.get_access_token( params['token'], params['verifier'] )
|
24
|
+
|
25
|
+
# Save token_data[:token] and token_data[:token_secret]
|
26
|
+
|
27
|
+
### Step 3: Make API calls with the `X-PP-AUTHORIZATION` header
|
28
|
+
|
29
|
+
Use the `:token` and `:token_secret`, along with your own API credentials, to create the `X-PP-AUTHORIZATION` header.
|
30
|
+
|
31
|
+
signature = paypal.generate_signature(api_key, secret, token, token_secret, 'POST', 'https://api.paypal.com/nvp')
|
32
|
+
header = { 'X-PP-AUTHORIZATION' => signature }
|
33
|
+
|
34
|
+
### Lookup granted permissions
|
35
|
+
|
36
|
+
scopes = paypal.lookup_permissions paypal_token
|
37
|
+
|
38
|
+
### Cancel granted permissions
|
39
|
+
|
40
|
+
paypal.cancel_permissions paypal_token
|
41
|
+
|
42
|
+
## Available Permissions
|
43
|
+
|
44
|
+
:express_checkout
|
45
|
+
:direct_payment
|
46
|
+
:settlement_consolidation
|
47
|
+
:settlement_reporting
|
48
|
+
:auth_capture
|
49
|
+
:mobile_checkout
|
50
|
+
:billing_agreement
|
51
|
+
:reference_transaction
|
52
|
+
:air_travel
|
53
|
+
:mass_pay
|
54
|
+
:transaction_details
|
55
|
+
:transaction_search
|
56
|
+
:recurring_payments
|
57
|
+
:account_balance
|
58
|
+
:encrypted_website_payments
|
59
|
+
:refund
|
60
|
+
:non_referenced_credit
|
61
|
+
:button_manager
|
62
|
+
:manage_pending_transaction_status
|
63
|
+
:recurring_payment_report
|
64
|
+
:extended_pro_processing_report
|
65
|
+
:exception_processing_report
|
66
|
+
:account_management_permission
|
67
|
+
|
68
|
+
## Copyright
|
69
|
+
|
70
|
+
Copyright (c) 2011 Recurly. MIT License
|
71
|
+
|
72
|
+
Original version by Isaac Hall.
|
data/Rakefile
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'bundler'
|
4
|
+
begin
|
5
|
+
Bundler.setup(:default, :test)
|
6
|
+
rescue Bundler::BundlerError => e
|
7
|
+
$stderr.puts e.message
|
8
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
9
|
+
exit e.status_code
|
10
|
+
end
|
11
|
+
require 'rake'
|
12
|
+
|
13
|
+
require 'jeweler'
|
14
|
+
Jeweler::Tasks.new do |gem|
|
15
|
+
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
16
|
+
gem.name = "paypal-permissions"
|
17
|
+
gem.homepage = "http://github.com/isaachall/paypal-permissions"
|
18
|
+
gem.license = "MIT"
|
19
|
+
gem.summary = %Q{Ruby implementation of the PayPal Permissions API.}
|
20
|
+
gem.description = %Q{Ruby implementation of the PayPal Permissions API.}
|
21
|
+
gem.email = "isaac@isaachall.com"
|
22
|
+
gem.authors = ["Isaac Hall"]
|
23
|
+
# Include your dependencies below. Runtime dependencies are required when using your gem,
|
24
|
+
# and development dependencies are only needed for development (ie running rake tasks, tests, etc)
|
25
|
+
gem.add_runtime_dependency 'httpclient'
|
26
|
+
gem.add_development_dependency 'rspec', '> 2.0.0'
|
27
|
+
gem.add_development_dependency 'vcr'
|
28
|
+
gem.add_development_dependency 'webmock'
|
29
|
+
end
|
30
|
+
Jeweler::RubygemsDotOrgTasks.new
|
31
|
+
|
32
|
+
require 'rspec/core/rake_task'
|
33
|
+
RSpec::Core::RakeTask.new(:spec)
|
34
|
+
task :default => :spec
|
35
|
+
|
36
|
+
require 'rdoc/task'
|
37
|
+
Rake::RDocTask.new do |rdoc|
|
38
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
39
|
+
|
40
|
+
rdoc.rdoc_dir = 'rdoc'
|
41
|
+
rdoc.title = "paypal-permissions #{version}"
|
42
|
+
rdoc.rdoc_files.include('README*')
|
43
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
44
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module PaypalPermissions
|
2
|
+
# Base error class
|
3
|
+
class Error < Exception; end
|
4
|
+
|
5
|
+
# PayPal returned a 500 Internal Server Error. Retry?
|
6
|
+
class InternalServerError < PaypalPermissions::Error; end
|
7
|
+
|
8
|
+
# PayPal returned an unexpected error message
|
9
|
+
class UnknownResponse < PaypalPermissions::Error
|
10
|
+
attr_accessor :response_code
|
11
|
+
|
12
|
+
def initialize(response_code, message)
|
13
|
+
@response_code = response_code
|
14
|
+
@message = message
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# PayPal returned a well formatted error message
|
19
|
+
class FaultMessage < Error
|
20
|
+
attr_accessor :timestamp, :ack, :correlation_id, :build, :errors
|
21
|
+
|
22
|
+
class ErrorInformation
|
23
|
+
attr_accessor :category, :domain, :subdomain, :error_id, :message, :parameter, :severity
|
24
|
+
|
25
|
+
def initialize(options = {}, error_number = 0)
|
26
|
+
@category = options["error(#{error_number}).category"]
|
27
|
+
@domain = options["error(#{error_number}).domain"]
|
28
|
+
@subdomain = options["error(#{error_number}).subdomain"]
|
29
|
+
@error_id = options["error(#{error_number}).errorId"]
|
30
|
+
@message = options["error(#{error_number}).message"]
|
31
|
+
@parameter = options["error(#{error_number}).parameter"]
|
32
|
+
@severity = options["error(#{error_number}).severity"]
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def initialize(options = {})
|
37
|
+
@timestamp = options['timestamp']
|
38
|
+
@ack = options['ack'].to_s.downcase.to_sym
|
39
|
+
@correlation_id = options['correlationId']
|
40
|
+
@build = options['build']
|
41
|
+
@errors = collect_errors(options)
|
42
|
+
|
43
|
+
@message = @ack
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
def collect_errors(options={})
|
48
|
+
errors = []
|
49
|
+
error_number = 0
|
50
|
+
|
51
|
+
while options["error(#{error_number}).errorId"]
|
52
|
+
errors << PaypalPermissions::FaultMessage::ErrorInformation.new(options, error_number)
|
53
|
+
error_number = error_number + 1
|
54
|
+
end
|
55
|
+
errors
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,174 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'net/https'
|
3
|
+
require 'uri'
|
4
|
+
require 'cgi'
|
5
|
+
|
6
|
+
module PaypalPermissions
|
7
|
+
class Paypal
|
8
|
+
include Oauth
|
9
|
+
|
10
|
+
attr_accessor :userid, :password, :signature, :application_id, :mode
|
11
|
+
|
12
|
+
SANDBOX_SERVER = 'https://svcs.sandbox.paypal.com/Permissions/'
|
13
|
+
PRODUCTION_SERVER = 'https://svcs.paypal.com/Permissions/'
|
14
|
+
API_VERSION = '74.0'
|
15
|
+
|
16
|
+
SANDBOX_GRANT_PERMISSION_URL = 'https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_grant-permission&request_token='
|
17
|
+
PRODUCTION_GRANT_PERMISSION_URL = 'https://www.paypal.com/cgi-bin/webscr?cmd=_grant-permission&request_token='
|
18
|
+
|
19
|
+
PERMISSIONS = {
|
20
|
+
:express_checkout => 'EXPRESS_CHECKOUT',
|
21
|
+
:direct_payment => 'DIRECT_PAYMENT',
|
22
|
+
:settlement_consolidation => 'SETTLEMENT_CONSOLIDATION',
|
23
|
+
:settlement_reporting => 'SETTLEMENT_REPORTING',
|
24
|
+
:auth_capture => 'AUTH_CAPTURE',
|
25
|
+
:mobile_checkout => 'MOBILE_CHECKOUT',
|
26
|
+
:billing_agreement => 'BILLING_AGREEMENT',
|
27
|
+
:reference_transaction => 'REFERENCE_TRANSACTION',
|
28
|
+
:air_travel => 'AIR_TRAVEL',
|
29
|
+
:mass_pay => 'MASS_PAY',
|
30
|
+
:transaction_details => 'TRANSACTION_DETAILS',
|
31
|
+
:transaction_search => 'TRANSACTION_SEARCH',
|
32
|
+
:recurring_payments => 'RECURRING_PAYMENTS',
|
33
|
+
:account_balance => 'ACCOUNT_BALANCE',
|
34
|
+
:encrypted_website_payments => 'ENCRYPTED_WEBSITE_PAYMENTS',
|
35
|
+
:refund => 'REFUND',
|
36
|
+
:non_referenced_credit => 'NON_REFERENCED_CREDIT',
|
37
|
+
:button_manager => 'BUTTON_MANAGER',
|
38
|
+
:manage_pending_transaction_status => 'MANAGE_PENDING_TRANSACTION_STATUS',
|
39
|
+
:recurring_payment_report => 'RECURRING_PAYMENT_REPORT',
|
40
|
+
:extended_pro_processing_report => 'EXTENDED_PRO_PROCESSING_REPORT',
|
41
|
+
:exception_processing_report => 'EXCEPTION_PROCESSING_REPORT',
|
42
|
+
:account_management_permission => 'ACCOUNT_MANAGEMENT_PERMISSION',
|
43
|
+
}
|
44
|
+
|
45
|
+
# Credentials: UserID, Password, Signature, Application ID
|
46
|
+
def initialize(userid, password, signature, application_id, mode = :production)
|
47
|
+
raise "Mode must be :sandbox or :production" unless [:sandbox, :production].include? mode
|
48
|
+
@userid = userid
|
49
|
+
@password = password
|
50
|
+
@signature = signature
|
51
|
+
@application_id = application_id
|
52
|
+
@mode = mode
|
53
|
+
end
|
54
|
+
|
55
|
+
# Create a "Request Permissions" URL. After requesting permissions, send the user to the URL
|
56
|
+
# so they can grant permissions. The user will be redirected back to the :callback_url.
|
57
|
+
def request_permissions(permissions_scopes, callback_url, language = 'en')
|
58
|
+
url = create_url('RequestPermissions')
|
59
|
+
|
60
|
+
request_data = {'callback' => callback_url, 'language' => language }
|
61
|
+
permissions_scopes.each_with_index { |ps,index| request_data["scope(#{index})"] = PERMISSIONS[ps] }
|
62
|
+
data = call(url, request_data)
|
63
|
+
|
64
|
+
raise PaypalPermissions::FaultMessage.new(data) unless data['token']
|
65
|
+
|
66
|
+
# Redirect URL:
|
67
|
+
# https://www.paypal.com/cgi-bin/webscr?cmd=_grant-permission&request_token= + token
|
68
|
+
{
|
69
|
+
permissions_url: (mode == :production ? PRODUCTION_GRANT_PERMISSION_URL : SANDBOX_GRANT_PERMISSION_URL) + data['token'],
|
70
|
+
token: data['token'],
|
71
|
+
}
|
72
|
+
end
|
73
|
+
|
74
|
+
# After a callback, lookup the access token and token secret using the :token and :verification from
|
75
|
+
# the callback URL.
|
76
|
+
def get_access_token(token, verifier)
|
77
|
+
url = create_url('GetAccessToken')
|
78
|
+
data = call(url, { 'token' => token, 'verifier' => verifier })
|
79
|
+
|
80
|
+
raise PaypalPermissions::FaultMessage.new(data) unless (data['token'] && data['tokenSecret'])
|
81
|
+
|
82
|
+
{
|
83
|
+
token: data['token'],
|
84
|
+
token_secret: data['tokenSecret'],
|
85
|
+
scopes: parse_scopes(data),
|
86
|
+
}
|
87
|
+
end
|
88
|
+
|
89
|
+
# Lookup the permissions granted to a given token.
|
90
|
+
def lookup_permissions(token)
|
91
|
+
url = create_url('GetPermissions')
|
92
|
+
data = call(url, { 'token' => token })
|
93
|
+
|
94
|
+
paypal_scopes = parse_scopes(data)
|
95
|
+
raise PaypalPermissions::FaultMessage.new(data) if paypal_scopes.empty?
|
96
|
+
|
97
|
+
{ scopes: paypal_scopes }
|
98
|
+
end
|
99
|
+
|
100
|
+
# Cancel the permissions granted to the given token
|
101
|
+
def cancel_permissions(token)
|
102
|
+
url = create_url('CancelPermissions')
|
103
|
+
data = call(url, { 'token' => token })
|
104
|
+
true
|
105
|
+
end
|
106
|
+
|
107
|
+
protected
|
108
|
+
|
109
|
+
def create_url(endpoint)
|
110
|
+
(mode == :production ? PRODUCTION_SERVER : SANDBOX_SERVER) + endpoint
|
111
|
+
end
|
112
|
+
|
113
|
+
def call(url, params={})
|
114
|
+
headers = {
|
115
|
+
'X-PAYPAL-SECURITY-USERID' => @userid,
|
116
|
+
'X-PAYPAL-SECURITY-PASSWORD' => @password,
|
117
|
+
'X-PAYPAL-SECURITY-SIGNATURE' => @signature,
|
118
|
+
'X-PAYPAL-REQUEST-DATA-FORMAT' => 'NV',
|
119
|
+
'X-PAYPAL-RESPONSE-DATA-FORMAT'=> 'NV',
|
120
|
+
'X-PAYPAL-APPLICATION-ID' => @application_id,
|
121
|
+
'Content-Type' => 'application/x-www-form-urlencoded',
|
122
|
+
}
|
123
|
+
params['requestEnvelope.errorLanguage'] = 'en_US'
|
124
|
+
data = params.map{ |k,v| "#{CGI.escape(k)}=#{CGI.escape(v)}" }.join('&')
|
125
|
+
data = URI.encode_www_form(params)
|
126
|
+
|
127
|
+
endpoint = URI(url)
|
128
|
+
timeout(30) do
|
129
|
+
http = Net::HTTP.new(endpoint.host, endpoint.port)
|
130
|
+
http.use_ssl = true
|
131
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE if mode == :sandbox
|
132
|
+
response = http.post(endpoint.request_uri, data, headers)
|
133
|
+
code = response.code
|
134
|
+
|
135
|
+
case code.to_i
|
136
|
+
when 200
|
137
|
+
data = get_hash(response.body)
|
138
|
+
raise PaypalPermissions::FaultMessage.new(data) if data['responseEnvelope.ack'] == 'Failure'
|
139
|
+
return data
|
140
|
+
when 500
|
141
|
+
raise PaypalPermissions::InternalServerError.new(response.body)
|
142
|
+
else
|
143
|
+
raise PaypalPermissions::UnknownResponse.new(code.to_i, response.body)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
private
|
149
|
+
|
150
|
+
# Gets a hash from a string, with a set of name value pairs joined by '='
|
151
|
+
# and concatenated with '&'
|
152
|
+
def get_hash(string)
|
153
|
+
hash = {}
|
154
|
+
string.split('&').collect { |pair| pair.split('=') }.each { |a|
|
155
|
+
hash[a[0]] = URI.unescape(a[1])
|
156
|
+
}
|
157
|
+
return hash
|
158
|
+
end
|
159
|
+
|
160
|
+
# Parse out the scopes from the PayPal response
|
161
|
+
def parse_scopes(data)
|
162
|
+
scopes = []
|
163
|
+
scopes << data['scope'] if data['scope'] # If there is only one scope
|
164
|
+
|
165
|
+
i = 0
|
166
|
+
while (data["scope(#{i})"]) do
|
167
|
+
scopes << data["scope(#{i})"]; i = i + 1
|
168
|
+
end # For multiple scopes
|
169
|
+
|
170
|
+
# Convert to symbols
|
171
|
+
scopes.collect { |paypal_scope| PERMISSIONS.select { |k,val| val == paypal_scope }.keys.first }
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
data/spec/paypal_spec.rb
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module PaypalPermissions
|
4
|
+
describe Paypal do
|
5
|
+
it "should request permissions with multiple scopes" do
|
6
|
+
VCR.use_cassette("request_permissions_multiple") do
|
7
|
+
permission_data = @paypal.request_permissions(
|
8
|
+
[:express_checkout, :direct_payment, :auth_capture, :refund, :transaction_details],
|
9
|
+
'http://localhost/')
|
10
|
+
|
11
|
+
permission_data[:token].should == 'AAAAAAATmjdbA3ADelJ6'
|
12
|
+
permission_data[:permissions_url].should == 'https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_grant-permission&request_token=' + permission_data[:token]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should request permissions with a single scopes" do
|
17
|
+
VCR.use_cassette("request_permissions_single") do
|
18
|
+
permission_data = @paypal.request_permissions(
|
19
|
+
[:express_checkout],
|
20
|
+
'http://localhost/')
|
21
|
+
|
22
|
+
permission_data[:token].should == 'AAAAAAATmnP2wcRCp7Mc'
|
23
|
+
permission_data[:permissions_url].should == 'https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_grant-permission&request_token=' + permission_data[:token]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should get an access token" do
|
28
|
+
VCR.use_cassette("get_access_token_valid") do
|
29
|
+
access_data = @paypal.get_access_token('AAAAAAATmjdbA3ADelJ6','KVTI4zbTe.QW07vOqPpqYg')
|
30
|
+
access_data[:token].should == 'M-RTGNyaZP5OMNIUxkH29I53eFvQhTJk3UfByH4pWfjSQHlj5csUVA'
|
31
|
+
access_data[:token_secret].should == 'l1.rjYM659iL92IwDmnPFeDWUnU'
|
32
|
+
access_data[:scopes].should == [:express_checkout, :refund, :direct_payment, :auth_capture, :transaction_details]
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "#lookup_permissions" do
|
37
|
+
it "should lookup permissions" do
|
38
|
+
VCR.use_cassette("lookup_permissions_multiple") do
|
39
|
+
lookup_data = @paypal.lookup_permissions('M-RTGNyaZP5OMNIUxkH29I53eFvQhTJk3UfByH4pWfjSQHlj5csUVA')
|
40
|
+
lookup_data[:scopes].should == [:express_checkout, :refund, :direct_payment, :auth_capture, :transaction_details]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe "#cancel_permission" do
|
46
|
+
it "should cancel permmission successfully" do
|
47
|
+
VCR.use_cassette("cancel_permission") do
|
48
|
+
cancel_data = @paypal.cancel_permissions('M-RTGNyaZP5OMNIUxkH29I53eFvQhTJk3UfByH4pWfjSQHlj5csUVA')
|
49
|
+
cancel_data.should be_true
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should raise a FaultMessage when canceling an invalid permmission" do
|
54
|
+
lambda {
|
55
|
+
VCR.use_cassette("cancel_permission_invalid") do
|
56
|
+
@paypal.cancel_permissions('M-RTGNyaZP5OMNIUxkH29I53eFvQhTJk3UfByH4pWfjSQHlj5csUVA')
|
57
|
+
end
|
58
|
+
}.should raise_error(PaypalPermissions::FaultMessage)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'rubygems'
|
3
|
+
require "bundler"
|
4
|
+
require 'yaml'
|
5
|
+
require 'vcr'
|
6
|
+
Bundler.setup
|
7
|
+
|
8
|
+
$LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib"
|
9
|
+
require 'paypal-permissions'
|
10
|
+
|
11
|
+
module SpecHelper
|
12
|
+
# add helper methods here
|
13
|
+
end
|
14
|
+
|
15
|
+
RSpec.configure do |config|
|
16
|
+
config.include SpecHelper
|
17
|
+
config.extend VCR::RSpec::Macros
|
18
|
+
config.mock_with :rspec
|
19
|
+
|
20
|
+
config.before(:all) do
|
21
|
+
credentials = YAML.load(File.read(File.join(File.dirname(__FILE__), 'sandbox_credentials.yml')))
|
22
|
+
@paypal = PaypalPermissions::Paypal.new(
|
23
|
+
credentials['userid'], credentials['password'],credentials['signature'],credentials['application_id'],credentials['mode']
|
24
|
+
)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
VCR.config do |c|
|
29
|
+
c.cassette_library_dir = 'spec/vcr'
|
30
|
+
c.stub_with :webmock
|
31
|
+
|
32
|
+
# Uncomment to allow VCR to record new cassettes
|
33
|
+
#c.default_cassette_options = { :record => :new_episodes }
|
34
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
---
|
2
|
+
- !ruby/struct:VCR::HTTPInteraction
|
3
|
+
request: !ruby/struct:VCR::Request
|
4
|
+
method: :post
|
5
|
+
uri: https://svcs.sandbox.paypal.com:443/Permissions/CancelPermissions
|
6
|
+
body: token=M-RTGNyaZP5OMNIUxkH29I53eFvQhTJk3UfByH4pWfjSQHlj5csUVA&requestEnvelope.errorLanguage=en_US
|
7
|
+
headers:
|
8
|
+
x-paypal-security-userid:
|
9
|
+
- test_user_api1.recurly.com
|
10
|
+
x-paypal-security-password:
|
11
|
+
- '1234567890'
|
12
|
+
x-paypal-security-signature:
|
13
|
+
- AW123412341234123412341234123412341234123412341234123412
|
14
|
+
x-paypal-request-data-format:
|
15
|
+
- NV
|
16
|
+
x-paypal-response-data-format:
|
17
|
+
- NV
|
18
|
+
x-paypal-application-id:
|
19
|
+
- APP-80W284485P519543T
|
20
|
+
content-type:
|
21
|
+
- application/x-www-form-urlencoded
|
22
|
+
response: !ruby/struct:VCR::Response
|
23
|
+
status: !ruby/struct:VCR::ResponseStatus
|
24
|
+
code: 200
|
25
|
+
message: OK
|
26
|
+
headers:
|
27
|
+
date:
|
28
|
+
- Thu, 28 Jul 2011 03:07:42 GMT
|
29
|
+
server:
|
30
|
+
- Apache-Coyote/1.1
|
31
|
+
x-paypal-message-protocol:
|
32
|
+
- NONE
|
33
|
+
x-paypal-response-data-format:
|
34
|
+
- NV
|
35
|
+
x-ebay-soa-request-id:
|
36
|
+
- 1316eb62-ec10-a486-d666-6636ffffffba!Permissions!10.72.109.102![]
|
37
|
+
x-paypal-operation-name:
|
38
|
+
- CancelPermissions
|
39
|
+
x-paypal-service-name:
|
40
|
+
- ! '{http://svcs.paypal.com/types/perm}Permissions'
|
41
|
+
x-paypal-service-version:
|
42
|
+
- 1.0.0
|
43
|
+
content-type:
|
44
|
+
- text/plain;charset=UTF-8
|
45
|
+
set-cookie:
|
46
|
+
- Apache=10.72.109.11.1311822458368813; path=/; expires=Sat, 20-Jul-41 03:07:38
|
47
|
+
GMT
|
48
|
+
vary:
|
49
|
+
- Accept-Encoding
|
50
|
+
transfer-encoding:
|
51
|
+
- chunked
|
52
|
+
body: responseEnvelope.timestamp=2011-07-27T20%3A07%3A42.513-07%3A00&responseEnvelope.ack=Success&responseEnvelope.correlationId=ca9bd9ab62f06&responseEnvelope.build=1860631
|
53
|
+
http_version: '1.1'
|
@@ -0,0 +1,55 @@
|
|
1
|
+
---
|
2
|
+
- !ruby/struct:VCR::HTTPInteraction
|
3
|
+
request: !ruby/struct:VCR::Request
|
4
|
+
method: :post
|
5
|
+
uri: https://svcs.sandbox.paypal.com:443/Permissions/CancelPermissions
|
6
|
+
body: token=M-RTGNyaZP5OMNIUxkH29I53eFvQhTJk3UfByH4pWfjSQHlj5csUVA&requestEnvelope.errorLanguage=en_US
|
7
|
+
headers:
|
8
|
+
x-paypal-security-userid:
|
9
|
+
- test_user_api1.recurly.com
|
10
|
+
x-paypal-security-password:
|
11
|
+
- '1234567890'
|
12
|
+
x-paypal-security-signature:
|
13
|
+
- AW123412341234123412341234123412341234123412341234123412
|
14
|
+
x-paypal-request-data-format:
|
15
|
+
- NV
|
16
|
+
x-paypal-response-data-format:
|
17
|
+
- NV
|
18
|
+
x-paypal-application-id:
|
19
|
+
- APP-80W284485P519543T
|
20
|
+
content-type:
|
21
|
+
- application/x-www-form-urlencoded
|
22
|
+
response: !ruby/struct:VCR::Response
|
23
|
+
status: !ruby/struct:VCR::ResponseStatus
|
24
|
+
code: 200
|
25
|
+
message: OK
|
26
|
+
headers:
|
27
|
+
date:
|
28
|
+
- Thu, 28 Jul 2011 03:08:17 GMT
|
29
|
+
server:
|
30
|
+
- Apache-Coyote/1.1
|
31
|
+
x-paypal-message-protocol:
|
32
|
+
- NONE
|
33
|
+
x-paypal-response-data-format:
|
34
|
+
- NV
|
35
|
+
x-ebay-soa-request-id:
|
36
|
+
- 1316eb6c-1390-a486-d647-d8d7ffffffb8!Permissions!10.72.109.100![]
|
37
|
+
x-paypal-operation-name:
|
38
|
+
- CancelPermissions
|
39
|
+
x-paypal-service-name:
|
40
|
+
- ! '{http://svcs.paypal.com/types/perm}Permissions'
|
41
|
+
x-paypal-service-version:
|
42
|
+
- 1.0.0
|
43
|
+
x-paypal-error-response:
|
44
|
+
- 'TRUE'
|
45
|
+
content-type:
|
46
|
+
- text/plain;charset=UTF-8
|
47
|
+
set-cookie:
|
48
|
+
- Apache=10.72.109.11.1311822495864392; path=/; expires=Sat, 20-Jul-41 03:08:15
|
49
|
+
GMT
|
50
|
+
vary:
|
51
|
+
- Accept-Encoding
|
52
|
+
transfer-encoding:
|
53
|
+
- chunked
|
54
|
+
body: responseEnvelope.timestamp=2011-07-27T20%3A08%3A17.026-07%3A00&responseEnvelope.ack=Failure&responseEnvelope.correlationId=c8981c666c180&responseEnvelope.build=1860631&error(0).errorId=520002&error(0).domain=PLATFORM&error(0).subdomain=Application&error(0).severity=Error&error(0).category=Application&error(0).message=Internal+Error
|
55
|
+
http_version: '1.1'
|
@@ -0,0 +1,53 @@
|
|
1
|
+
---
|
2
|
+
- !ruby/struct:VCR::HTTPInteraction
|
3
|
+
request: !ruby/struct:VCR::Request
|
4
|
+
method: :post
|
5
|
+
uri: https://svcs.sandbox.paypal.com:443/Permissions/GetAccessToken
|
6
|
+
body: token=AAAAAAATmjdbA3ADelJ6&verifier=KVTI4zbTe.QW07vOqPpqYg&requestEnvelope.errorLanguage=en_US
|
7
|
+
headers:
|
8
|
+
x-paypal-security-userid:
|
9
|
+
- test_user_api1.recurly.com
|
10
|
+
x-paypal-security-password:
|
11
|
+
- '1234567890'
|
12
|
+
x-paypal-security-signature:
|
13
|
+
- AW123412341234123412341234123412341234123412341234123412
|
14
|
+
x-paypal-request-data-format:
|
15
|
+
- NV
|
16
|
+
x-paypal-response-data-format:
|
17
|
+
- NV
|
18
|
+
x-paypal-application-id:
|
19
|
+
- APP-80W284485P519543T
|
20
|
+
content-type:
|
21
|
+
- application/x-www-form-urlencoded
|
22
|
+
response: !ruby/struct:VCR::Response
|
23
|
+
status: !ruby/struct:VCR::ResponseStatus
|
24
|
+
code: 200
|
25
|
+
message: OK
|
26
|
+
headers:
|
27
|
+
date:
|
28
|
+
- Thu, 28 Jul 2011 03:05:56 GMT
|
29
|
+
server:
|
30
|
+
- Apache-Coyote/1.1
|
31
|
+
x-paypal-message-protocol:
|
32
|
+
- NONE
|
33
|
+
x-paypal-response-data-format:
|
34
|
+
- NV
|
35
|
+
x-ebay-soa-request-id:
|
36
|
+
- 1316eb49-a450-a486-d637-e8f7fffffd10!Permissions!10.72.109.99![]
|
37
|
+
x-paypal-operation-name:
|
38
|
+
- GetAccessToken
|
39
|
+
x-paypal-service-name:
|
40
|
+
- ! '{http://svcs.paypal.com/types/perm}Permissions'
|
41
|
+
x-paypal-service-version:
|
42
|
+
- 1.0.0
|
43
|
+
content-type:
|
44
|
+
- text/plain;charset=UTF-8
|
45
|
+
set-cookie:
|
46
|
+
- Apache=10.72.109.11.1311822354823084; path=/; expires=Sat, 20-Jul-41 03:05:54
|
47
|
+
GMT
|
48
|
+
vary:
|
49
|
+
- Accept-Encoding
|
50
|
+
transfer-encoding:
|
51
|
+
- chunked
|
52
|
+
body: responseEnvelope.timestamp=2011-07-27T20%3A05%3A56.696-07%3A00&responseEnvelope.ack=Success&responseEnvelope.correlationId=35d2810849d35&responseEnvelope.build=1860631&scope(0)=EXPRESS_CHECKOUT&scope(1)=REFUND&scope(2)=DIRECT_PAYMENT&scope(3)=AUTH_CAPTURE&scope(4)=TRANSACTION_DETAILS&token=M-RTGNyaZP5OMNIUxkH29I53eFvQhTJk3UfByH4pWfjSQHlj5csUVA&tokenSecret=l1.rjYM659iL92IwDmnPFeDWUnU
|
53
|
+
http_version: '1.1'
|
@@ -0,0 +1,53 @@
|
|
1
|
+
---
|
2
|
+
- !ruby/struct:VCR::HTTPInteraction
|
3
|
+
request: !ruby/struct:VCR::Request
|
4
|
+
method: :post
|
5
|
+
uri: https://svcs.sandbox.paypal.com:443/Permissions/GetPermissions
|
6
|
+
body: token=M-RTGNyaZP5OMNIUxkH29I53eFvQhTJk3UfByH4pWfjSQHlj5csUVA&requestEnvelope.errorLanguage=en_US
|
7
|
+
headers:
|
8
|
+
x-paypal-security-userid:
|
9
|
+
- test_user_api1.recurly.com
|
10
|
+
x-paypal-security-password:
|
11
|
+
- '1234567890'
|
12
|
+
x-paypal-security-signature:
|
13
|
+
- AW123412341234123412341234123412341234123412341234123412
|
14
|
+
x-paypal-request-data-format:
|
15
|
+
- NV
|
16
|
+
x-paypal-response-data-format:
|
17
|
+
- NV
|
18
|
+
x-paypal-application-id:
|
19
|
+
- APP-80W284485P519543T
|
20
|
+
content-type:
|
21
|
+
- application/x-www-form-urlencoded
|
22
|
+
response: !ruby/struct:VCR::Response
|
23
|
+
status: !ruby/struct:VCR::ResponseStatus
|
24
|
+
code: 200
|
25
|
+
message: OK
|
26
|
+
headers:
|
27
|
+
date:
|
28
|
+
- Thu, 28 Jul 2011 03:06:49 GMT
|
29
|
+
server:
|
30
|
+
- Apache-Coyote/1.1
|
31
|
+
x-paypal-message-protocol:
|
32
|
+
- NONE
|
33
|
+
x-paypal-response-data-format:
|
34
|
+
- NV
|
35
|
+
x-ebay-soa-request-id:
|
36
|
+
- 1316eb56-55c0-a486-d647-d8d7ffffffb9!Permissions!10.72.109.100![]
|
37
|
+
x-paypal-operation-name:
|
38
|
+
- GetPermissions
|
39
|
+
x-paypal-service-name:
|
40
|
+
- ! '{http://svcs.paypal.com/types/perm}Permissions'
|
41
|
+
x-paypal-service-version:
|
42
|
+
- 1.0.0
|
43
|
+
content-type:
|
44
|
+
- text/plain;charset=UTF-8
|
45
|
+
set-cookie:
|
46
|
+
- Apache=10.72.109.11.1311822406811670; path=/; expires=Sat, 20-Jul-41 03:06:46
|
47
|
+
GMT
|
48
|
+
vary:
|
49
|
+
- Accept-Encoding
|
50
|
+
transfer-encoding:
|
51
|
+
- chunked
|
52
|
+
body: responseEnvelope.timestamp=2011-07-27T20%3A06%3A49.264-07%3A00&responseEnvelope.ack=Success&responseEnvelope.correlationId=783aab5a565a2&responseEnvelope.build=1860631&scope(0)=EXPRESS_CHECKOUT&scope(1)=REFUND&scope(2)=DIRECT_PAYMENT&scope(3)=AUTH_CAPTURE&scope(4)=TRANSACTION_DETAILS
|
53
|
+
http_version: '1.1'
|
@@ -0,0 +1,53 @@
|
|
1
|
+
---
|
2
|
+
- !ruby/struct:VCR::HTTPInteraction
|
3
|
+
request: !ruby/struct:VCR::Request
|
4
|
+
method: :post
|
5
|
+
uri: https://svcs.sandbox.paypal.com:443/Permissions/RequestPermissions
|
6
|
+
body: callback=http%3A%2F%2Flocalhost%2F&language=en&scope%280%29=EXPRESS_CHECKOUT&scope%281%29=DIRECT_PAYMENT&scope%282%29=AUTH_CAPTURE&scope%283%29=REFUND&scope%284%29=TRANSACTION_DETAILS&requestEnvelope.errorLanguage=en_US
|
7
|
+
headers:
|
8
|
+
x-paypal-security-userid:
|
9
|
+
- test_user_api1.recurly.com
|
10
|
+
x-paypal-security-password:
|
11
|
+
- '1234567890'
|
12
|
+
x-paypal-security-signature:
|
13
|
+
- AW123412341234123412341234123412341234123412341234123412
|
14
|
+
x-paypal-request-data-format:
|
15
|
+
- NV
|
16
|
+
x-paypal-response-data-format:
|
17
|
+
- NV
|
18
|
+
x-paypal-application-id:
|
19
|
+
- APP-80W284485P519543T
|
20
|
+
content-type:
|
21
|
+
- application/x-www-form-urlencoded
|
22
|
+
response: !ruby/struct:VCR::Response
|
23
|
+
status: !ruby/struct:VCR::ResponseStatus
|
24
|
+
code: 200
|
25
|
+
message: OK
|
26
|
+
headers:
|
27
|
+
date:
|
28
|
+
- Thu, 28 Jul 2011 02:56:56 GMT
|
29
|
+
server:
|
30
|
+
- Apache-Coyote/1.1
|
31
|
+
x-paypal-message-protocol:
|
32
|
+
- NONE
|
33
|
+
x-paypal-response-data-format:
|
34
|
+
- NV
|
35
|
+
x-ebay-soa-request-id:
|
36
|
+
- 1316eac5-f8b0-a486-d637-e8f7fffffd11!Permissions!10.72.109.99![]
|
37
|
+
x-paypal-operation-name:
|
38
|
+
- RequestPermissions
|
39
|
+
x-paypal-service-name:
|
40
|
+
- ! '{http://svcs.paypal.com/types/perm}Permissions'
|
41
|
+
x-paypal-service-version:
|
42
|
+
- 1.0.0
|
43
|
+
content-type:
|
44
|
+
- text/plain;charset=UTF-8
|
45
|
+
set-cookie:
|
46
|
+
- Apache=10.72.109.11.1311821815501667; path=/; expires=Sat, 20-Jul-41 02:56:55
|
47
|
+
GMT
|
48
|
+
vary:
|
49
|
+
- Accept-Encoding
|
50
|
+
transfer-encoding:
|
51
|
+
- chunked
|
52
|
+
body: responseEnvelope.timestamp=2011-07-27T19%3A56%3A56.696-07%3A00&responseEnvelope.ack=Success&responseEnvelope.correlationId=5ddfdbf7c627a&responseEnvelope.build=1860631&token=AAAAAAATmjdbA3ADelJ6
|
53
|
+
http_version: '1.1'
|
@@ -0,0 +1,53 @@
|
|
1
|
+
---
|
2
|
+
- !ruby/struct:VCR::HTTPInteraction
|
3
|
+
request: !ruby/struct:VCR::Request
|
4
|
+
method: :post
|
5
|
+
uri: https://svcs.sandbox.paypal.com:443/Permissions/RequestPermissions
|
6
|
+
body: callback=http%3A%2F%2Flocalhost%2F&language=en&scope%280%29=EXPRESS_CHECKOUT&requestEnvelope.errorLanguage=en_US
|
7
|
+
headers:
|
8
|
+
x-paypal-security-userid:
|
9
|
+
- test_user_api1.recurly.com
|
10
|
+
x-paypal-security-password:
|
11
|
+
- '1234567890'
|
12
|
+
x-paypal-security-signature:
|
13
|
+
- AW123412341234123412341234123412341234123412341234123412
|
14
|
+
x-paypal-request-data-format:
|
15
|
+
- NV
|
16
|
+
x-paypal-response-data-format:
|
17
|
+
- NV
|
18
|
+
x-paypal-application-id:
|
19
|
+
- APP-80W284485P519543T
|
20
|
+
content-type:
|
21
|
+
- application/x-www-form-urlencoded
|
22
|
+
response: !ruby/struct:VCR::Response
|
23
|
+
status: !ruby/struct:VCR::ResponseStatus
|
24
|
+
code: 200
|
25
|
+
message: OK
|
26
|
+
headers:
|
27
|
+
date:
|
28
|
+
- Thu, 28 Jul 2011 03:19:29 GMT
|
29
|
+
server:
|
30
|
+
- Apache-Coyote/1.1
|
31
|
+
x-paypal-message-protocol:
|
32
|
+
- NONE
|
33
|
+
x-paypal-response-data-format:
|
34
|
+
- NV
|
35
|
+
x-ebay-soa-request-id:
|
36
|
+
- 1316ec10-5a50-a486-d666-6636ffffffb9!Permissions!10.72.109.102![]
|
37
|
+
x-paypal-operation-name:
|
38
|
+
- RequestPermissions
|
39
|
+
x-paypal-service-name:
|
40
|
+
- ! '{http://svcs.paypal.com/types/perm}Permissions'
|
41
|
+
x-paypal-service-version:
|
42
|
+
- 1.0.0
|
43
|
+
content-type:
|
44
|
+
- text/plain;charset=UTF-8
|
45
|
+
set-cookie:
|
46
|
+
- Apache=10.72.109.11.1311823168735914; path=/; expires=Sat, 20-Jul-41 03:19:28
|
47
|
+
GMT
|
48
|
+
vary:
|
49
|
+
- Accept-Encoding
|
50
|
+
transfer-encoding:
|
51
|
+
- chunked
|
52
|
+
body: responseEnvelope.timestamp=2011-07-27T20%3A19%3A29.943-07%3A00&responseEnvelope.ack=Success&responseEnvelope.correlationId=eecf5f55105eb&responseEnvelope.build=1860631&token=AAAAAAATmnP2wcRCp7Mc
|
53
|
+
http_version: '1.1'
|
metadata
ADDED
@@ -0,0 +1,133 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: paypal-permissions
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Isaac Hall
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-07-30 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: httpclient
|
16
|
+
requirement: &70250705306740 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70250705306740
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: jeweler
|
27
|
+
requirement: &70250705305760 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ~>
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 1.6.4
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70250705305760
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: httpclient
|
38
|
+
requirement: &70250705304580 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :runtime
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70250705304580
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rspec
|
49
|
+
requirement: &70250705302480 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>'
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 2.0.0
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *70250705302480
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: vcr
|
60
|
+
requirement: &70250705300380 !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
type: :development
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *70250705300380
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: webmock
|
71
|
+
requirement: &70250705299180 !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: *70250705299180
|
80
|
+
description: Ruby implementation of the PayPal Permissions API.
|
81
|
+
email: isaac@isaachall.com
|
82
|
+
executables: []
|
83
|
+
extensions: []
|
84
|
+
extra_rdoc_files:
|
85
|
+
- LICENSE.txt
|
86
|
+
- README.rdoc
|
87
|
+
files:
|
88
|
+
- .document
|
89
|
+
- Gemfile
|
90
|
+
- Gemfile.lock
|
91
|
+
- LICENSE.txt
|
92
|
+
- README.rdoc
|
93
|
+
- Rakefile
|
94
|
+
- VERSION
|
95
|
+
- lib/paypal-permissions/fault_message.rb
|
96
|
+
- lib/paypal-permissions/paypal.rb
|
97
|
+
- lib/paypal-permissions/version.rb
|
98
|
+
- lib/paypal-permissions.rb
|
99
|
+
- spec/paypal_spec.rb
|
100
|
+
- spec/spec_helper.rb
|
101
|
+
- spec/vcr/cancel_permission.yml
|
102
|
+
- spec/vcr/cancel_permission_invalid.yml
|
103
|
+
- spec/vcr/get_access_token_valid.yml
|
104
|
+
- spec/vcr/lookup_permissions_multiple.yml
|
105
|
+
- spec/vcr/request_permissions_multiple.yml
|
106
|
+
- spec/vcr/request_permissions_single.yml
|
107
|
+
homepage: http://github.com/isaachall/paypal-permissions
|
108
|
+
licenses:
|
109
|
+
- MIT
|
110
|
+
post_install_message:
|
111
|
+
rdoc_options: []
|
112
|
+
require_paths:
|
113
|
+
- lib
|
114
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
115
|
+
none: false
|
116
|
+
requirements:
|
117
|
+
- - ! '>='
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '0'
|
120
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
requirements: []
|
127
|
+
rubyforge_project:
|
128
|
+
rubygems_version: 1.8.10
|
129
|
+
signing_key:
|
130
|
+
specification_version: 3
|
131
|
+
summary: Ruby implementation of the PayPal Permissions API.
|
132
|
+
test_files: []
|
133
|
+
has_rdoc:
|