pp-adaptive 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,17 +1,7 @@
1
1
  # A Ruby API for PayPal Adaptive Payments
2
2
 
3
- - Current Status: Work-in-progress (don't use, API subject to major change)
4
- - Working:
5
- - setting up an explicit preapproval
6
- - processing payments (for an explicit preapproval)
7
- - Not working:
8
- - executing pre-created payments
9
- - changing options on a created payment
10
- - refunds/cancellations
11
- - minor things like currency conversion requests
12
-
13
3
  This gem provides access to PayPal's Adaptive Payments API using easy-to-use
14
- ruby classes. The internals are largely backed by
4
+ ruby classes. The internals are largely backed by
15
5
  [Virtus](https://github.com/solnic/virtus) and
16
6
  [RestClient](https://github.com/archiloque/rest-client), and so are easy to
17
7
  work with.
@@ -22,33 +12,243 @@ Via rubygems:
22
12
 
23
13
  gem install pp-adaptive
24
14
 
25
- ## Setting up a Preapproval Agreement
15
+ All API calls are made by calling `#execute` on the client, with the relevant
16
+ request type. Naming conventions have been ruby-ized, but you should just
17
+ follow along with the PayPal documentation to understand the inputs and outputs.
18
+
19
+ Some aliases have been added, to make things simpler. Some example scenarios
20
+ are outlined below, but due to the size of the API, this README does not aim
21
+ in any way to be an exhaustive reproduction of the official Adaptive Payments
22
+ documentation. Given the declarative, model-style, nature of the classes in
23
+ this gem, it probably makes sense to just browse the source to know what
24
+ fields are available.
25
+
26
+ ## Example API calls
27
+
28
+ The following example should give you enough of an idea to be able to
29
+ follow your senses and use this gem in your own applications.
30
+
31
+ ### Taking a regular payment
32
+
33
+ A typical checkout payment request starts like this.
26
34
 
27
35
  ``` ruby
28
- require 'pp-adaptive'
29
-
30
- client = AdaptivePayments::Client.new(
31
- :user_id => "your-api-user-id",
32
- :password => "your-api-password",
33
- :signature => "your-api-signature",
34
- :app_id => "your-app-id",
35
- :sandbox => false
36
- )
37
-
38
- response = client.execute(AdaptivePayments::PreapprovalRequest.new(
39
- :ending_date => DateTime.now.next_year,
40
- :starting_date => DateTime.now,
41
- :max_total_amount => BigDecimal("950.00"),
42
- :currency_code => "USD",
43
- :cancel_url => "http://site.com/cancelled",
44
- :return_url => "http://site.com/completed"
45
- ))
46
-
47
- if response.success?
48
- puts "Preapproval key: #{response.preapproval_key}"
49
- else
50
- puts "#{response.ack_code}: #{response.error_message}"
51
- end
36
+ require "pp-adaptive"
37
+
38
+ client = AdaptivePayments::Client.new(
39
+ :user_id => "your-api-user-id",
40
+ :password => "your-api-password",
41
+ :signature => "your-api-signature",
42
+ :app_id => "your-app-id",
43
+ :sandbox => true
44
+ )
45
+
46
+ client.execute(:Pay,
47
+ :action_type => "PAY",
48
+ :receiver_email => "your@email.com",
49
+ :receiver_amount => 50,
50
+ :currency_code => "USD",
51
+ :cancel_url => "https://your-site.com/cancel",
52
+ :return_url => "https://your-site.com/return"
53
+ ) do |response|
54
+
55
+ if response.success?
56
+ puts "Pay key: #{response.pay_key}"
57
+
58
+ # send the user to PayPal to make the payment
59
+ # e.g. https://www.sandbox.paypal.com/webscr?cmd=_ap-payment&paykey=abc
60
+ redirect_to client.payment_url(response)
61
+ else
62
+ puts "#{response.ack_code}: #{response.error_message}"
63
+ end
64
+
65
+ end
52
66
  ```
53
67
 
54
- (Work in progress...)
68
+ ### Checking the payment status on return
69
+
70
+ When the customer is sent back from PayPal to your `return_url`, you need to
71
+ check if the payment was successful or not.
72
+
73
+ ``` ruby
74
+ require "pp-adaptive"
75
+
76
+ client = AdaptivePayments::Client.new(
77
+ :user_id => "your-api-user-id",
78
+ :password => "your-api-password",
79
+ :signature => "your-api-signature",
80
+ :app_id => "your-app-id",
81
+ :sandbox => true
82
+ )
83
+
84
+ client.execute(:PaymentDetails, :pay_key => "pay-key-from-pay-request") do |response|
85
+ if response.success?
86
+ puts "Payment status: #{response.payment_exec_status}"
87
+ else
88
+ puts "#{response.ack_code}: #{response.error_message}"
89
+ end
90
+ end
91
+ ```
92
+
93
+ ### Initiating a chained payment
94
+
95
+ If you need to take a cut of a payment and forward the remainder onto one
96
+ or more other recipients, you use a chained payment. This is just a regular
97
+ PayRequest, except it includes multiple receivers, one of which is marked as
98
+ 'primary'.
99
+
100
+ ``` ruby
101
+ require "pp-adaptive"
102
+
103
+ client = AdaptivePayments::Client.new(
104
+ :user_id => "your-api-user-id",
105
+ :password => "your-api-password",
106
+ :signature => "your-api-signature",
107
+ :app_id => "your-app-id",
108
+ :sandbox => true
109
+ )
110
+
111
+ client.execute(:Pay,
112
+ :action_type => "PAY",
113
+ :currency_code => "USD",
114
+ :cancel_url => "https://your-site.com/cancel",
115
+ :return_url => "https://your-site.com/return",
116
+ :receivers => [
117
+ { :email => "your@email.com", :amount => 50, :primary => true },
118
+ { :email => "other@site.tld", :amount => 45 }
119
+ ]
120
+ ) do |response|
121
+
122
+ if response.success?
123
+ puts "Pay key: #{response.pay_key}"
124
+
125
+ # send the user to PayPal to make the payment
126
+ # e.g. https://www.sandbox.paypal.com/webscr?cmd=_ap-payment&paykey=abc
127
+ redirect_to client.payment_url(response)
128
+ else
129
+ puts "#{response.ack_code}: #{response.error_message}"
130
+ end
131
+
132
+ end
133
+ ```
134
+
135
+ In the above example, you get $5 from the $50 payment, with the remaining $45
136
+ going to other@site.tld.
137
+
138
+ ### Setting up a Preapproval Agreement
139
+
140
+ If you need to be able to take payments from a user's account on-demand, you
141
+ get the user to authorize you for preapproved payments.
142
+
143
+ ``` ruby
144
+ require "pp-adaptive"
145
+
146
+ client = AdaptivePayments::Client.new(
147
+ :user_id => "your-api-user-id",
148
+ :password => "your-api-password",
149
+ :signature => "your-api-signature",
150
+ :app_id => "your-app-id",
151
+ :sandbox => false
152
+ )
153
+
154
+ client.execute(:Preapproval,
155
+ :ending_date => DateTime.now.next_year,
156
+ :starting_date => DateTime.now,
157
+ :max_total_amount => BigDecimal("950.00"),
158
+ :currency_code => "USD",
159
+ :cancel_url => "http://site.com/cancelled",
160
+ :return_url => "http://site.com/completed"
161
+ ) do |response|
162
+ # you may alternatively pass a PreapprovalRequest instance
163
+
164
+ if response.success?
165
+ puts "Preapproval key: #{response.preapproval_key}"
166
+
167
+ # send the user to PayPal to give their approval
168
+ # e.g. https://www.paypal.com/webscr?cmd=_ap-preapproval&preapprovalkey=abc
169
+ redirect_to client.preapproval_url(response)
170
+ else
171
+ puts "#{response.ack_code}: #{response.error_message}"
172
+ end
173
+
174
+ end
175
+ ```
176
+
177
+ ### Taking a payment using an existing Preapproval
178
+
179
+ To take a payment from a user who has previously authorized you for preapproved
180
+ payments, just pass the `pay_key` in the usual PayRequest.
181
+
182
+ ``` ruby
183
+ require "pp-adaptive"
184
+
185
+ client = AdaptivePayments::Client.new(
186
+ :user_id => "your-api-user-id",
187
+ :password => "your-api-password",
188
+ :signature => "your-api-signature",
189
+ :app_id => "your-app-id",
190
+ :sandbox => false
191
+ )
192
+
193
+ client.execute(:Pay,
194
+ :preapproval_key => "existing-preapproval-key",
195
+ :action_type => "PAY",
196
+ :receiver_email => "your@email.com",
197
+ :receiver_amount => 50,
198
+ :currency_code => "USD",
199
+ :cancel_url => "https://your-site.com/cancel",
200
+ :return_url => "https://your-site.com/return"
201
+ ) do |response|
202
+
203
+ if response.success?
204
+ puts "Pay key: #{response.pay_key}"
205
+ puts "Status: #{response.payment_exec_status}"
206
+ else
207
+ puts "#{response.ack_code}: #{response.error_message}"
208
+ end
209
+
210
+ end
211
+ ```
212
+
213
+ ### Issuing a refund
214
+
215
+ If you have the pay_key from a previously made payment (up to 60 days), you
216
+ can send a RefundRequest.
217
+
218
+ ``` ruby
219
+ require "pp-adaptive"
220
+
221
+ client = AdaptivePayments::Client.new(
222
+ :user_id => "your-api-user-id",
223
+ :password => "your-api-password",
224
+ :signature => "your-api-signature",
225
+ :app_id => "your-app-id",
226
+ :sandbox => false
227
+ )
228
+
229
+ client.execute(:Refund, :pay_key => "the-pay-key") do |response|
230
+ if response.success?
231
+ puts "Refund sent"
232
+ else
233
+ puts "#{response.ack_code}: #{response.error_message}"
234
+ end
235
+ end
236
+ ```
237
+
238
+ You can also do partial refunds by passing an `amount` field in the request.
239
+
240
+ ### Other API calls
241
+
242
+ Adaptive Payments is a very extensive API with a lot of endpoints and a lot
243
+ of fields within each request. It wouldn't be wise to attempt to document them
244
+ all here, but the official API documentation covers everything in detail.
245
+
246
+ https://cms.paypal.com/cms_content/US/en_US/files/developer/PP_AdaptivePayments.pdf
247
+
248
+ Just ruby-ize the fields (i.e. underscores, not camel case) and open up the
249
+ request/response classes in this repository to get a feel for how this all works.
250
+
251
+ ## License & Copyright
252
+
253
+ Copyright © Flippa.com Pty Ltd. Licensed under the MIT license. See the
254
+ LICENSE file for details.
@@ -28,6 +28,17 @@ module AdaptivePayments
28
28
  @operation
29
29
  end
30
30
 
31
+ # Get the request class for the given operation.
32
+ #
33
+ # @param [Symbol] operation
34
+ # the name of the operation
35
+ #
36
+ # @return [AbstractRequest]
37
+ # the request subclass
38
+ def for_operation(name)
39
+ AdaptivePayments.const_get(name.to_s + "Request")
40
+ end
41
+
31
42
  # Given a JSON string, return the corresponding response.
32
43
  #
33
44
  # @param [String] json
@@ -2,6 +2,7 @@ require "rest-client"
2
2
  require "virtus"
3
3
 
4
4
  module AdaptivePayments
5
+ # The principle hub through which all requests and responses are passed.
5
6
  class Client
6
7
  include Virtus
7
8
 
@@ -11,45 +12,135 @@ module AdaptivePayments
11
12
  attribute :app_id, String, :header => "X-PAYPAL-APPLICATION-ID"
12
13
  attribute :device_ip, String, :header => "X-PAYPAL-DEVICE-IPADDRESS"
13
14
 
15
+ # Initialize the client with the given options.
16
+ #
17
+ # Options can also be passed via the accessors, if prefered.
18
+ #
19
+ # @option [String] user_id
20
+ # the adaptive payments API user id
21
+ #
22
+ # @option [String] password
23
+ # the adaptive payments API password
24
+ #
25
+ # @option [String] signature
26
+ # the adaptive payments API signature
27
+ #
28
+ # @option [String] app_id
29
+ # the app ID given to use adaptive payments
30
+ #
31
+ # @option [String] device_ip
32
+ # the IP address of the user, optional
33
+ #
34
+ # @option [Boolean] sandbox
35
+ # true if using the sandbox, not production
14
36
  def initialize(options = {})
15
37
  super
16
38
  self.sandbox = options[:sandbox]
17
39
  end
18
40
 
41
+ # Turn on/off sandbox mode.
19
42
  def sandbox=(flag)
20
43
  @sandbox = !!flag
21
44
  end
22
45
 
46
+ # Test if the client is using the sandbox.
47
+ #
48
+ # @return [Boolean]
49
+ # true if using the sandbox
23
50
  def sandbox?
24
51
  !!@sandbox
25
52
  end
26
53
 
27
- def execute(request)
28
- base_url = if sandbox?
29
- "https://svcs.sandbox.paypal.com/AdaptivePayments"
30
- else
31
- "https://svcs.paypal.com/AdaptivePayments"
32
- end
54
+ # Execute a Request.
55
+ #
56
+ # @example
57
+ # response = client.execute(:Refund, pay_key: "abc", amount: 42)
58
+ # puts response.ack_code
59
+ #
60
+ # @params [Symbol] operation_name
61
+ # The name of the operation to perform.
62
+ # This maps with the name of the Request class.
63
+ #
64
+ # @params [Hash] attributes
65
+ # attributes used to build the request
66
+ #
67
+ # @return [AbstractResponse]
68
+ # a response object for the given operation
69
+ #
70
+ # @yield [AbstractResponse]
71
+ # optional way to receive the return value
72
+ def execute(*args)
73
+ request =
74
+ case args.size
75
+ when 1 then args[0]
76
+ when 2 then AbstractRequest.for_operation(args[0]).new(args[1])
77
+ else
78
+ raise ArgumentError, "Invalid arguments: #{args.size} for (1..2)"
79
+ end
33
80
 
34
- resource = RestClient::Resource.new(base_url, :headers => headers)
81
+ resource = RestClient::Resource.new(api_url, :headers => headers)
35
82
  response = resource[request.class.operation.to_s].post(
36
83
  request.to_json,
37
84
  :content_type => :json,
38
85
  :accept => :json
39
86
  )
40
- request.class.build_response(response)
87
+ request.class.build_response(response).tap do |res|
88
+ yield res if block_given?
89
+ end
90
+ rescue RestClient::Exception => e
91
+ raise AdaptivePayments::Exception, e
92
+ end
93
+
94
+ # When initiating a preapproval, get the URL on paypal.com to send the user to.
95
+ #
96
+ # @param [PreapprovalResponse] response
97
+ # the response when setting up the preapproval
98
+ #
99
+ # @return [String]
100
+ # the URL on paypal.com to send the user to
101
+ def preapproval_url(response)
102
+ [
103
+ "https://www.",
104
+ ("sandbox." if sandbox?),
105
+ "paypal.com/webscr?cmd=_ap-preapproval&preapprovalkey=",
106
+ response.preapproval_key
107
+ ].join
108
+ end
109
+
110
+ # When initiating a payment, get the URL on paypal.com to send the user to.
111
+ #
112
+ # @param [PayResponse] response
113
+ # the response when setting up the payment
114
+ #
115
+ # @return [String]
116
+ # the URL on paypal.com to send the user to
117
+ def payment_url(response)
118
+ [
119
+ "https://www.",
120
+ ("sandbox." if sandbox?),
121
+ "paypal.com/webscr?cmd=_ap-payment&paykey=",
122
+ response.preapproval_key
123
+ ].join
41
124
  end
42
125
 
43
126
  private
44
127
 
128
+ def api_url
129
+ [
130
+ "https://svcs.",
131
+ ("sandbox." if sandbox?),
132
+ "paypal.com/AdaptivePayments"
133
+ ].join
134
+ end
135
+
45
136
  def headers
46
137
  base_headers = {
47
138
  "X-PAYPAL-RESPONSE-DATA-FORMAT" => "JSON",
48
139
  "X-PAYPAL-REQUEST-DATA-FORMAT" => "JSON"
49
140
  }
50
- attributes.inject(base_headers) do |hash, (attr, value)|
51
- next hash if value.nil?
52
- hash.merge(self.class.attributes[attr].options[:header] => value)
141
+ attribute_set.inject(base_headers) do |hash, attr|
142
+ next hash if self[attr.name].nil?
143
+ hash.merge(attr.options[:header] => self[attr.name])
53
144
  end
54
145
  end
55
146
  end
@@ -0,0 +1,4 @@
1
+ module AdaptivePayments
2
+ class Exception < RuntimeError
3
+ end
4
+ end
@@ -74,11 +74,11 @@ module AdaptivePayments
74
74
  private
75
75
 
76
76
  def attribute_key(key)
77
- Hash[attributes.map { |attr| [attr.options.fetch(:param, attr.name).to_s, attr.name.to_sym] }][key] || key.to_sym
77
+ Hash[attribute_set.map { |attr| [attr.options.fetch(:param, attr.name).to_s, attr.name.to_sym] }][key] || key.to_sym
78
78
  end
79
79
 
80
80
  def attribute_value(key, value)
81
- return unless attribute = attributes[attribute_key(key)]
81
+ return unless attribute = attribute_set[attribute_key(key)]
82
82
 
83
83
  case attribute
84
84
  when Node
@@ -98,8 +98,9 @@ module AdaptivePayments
98
98
  # @return [Hash]
99
99
  # the JSON representation in ruby Hash form
100
100
  def to_hash
101
- attributes.inject({}) { |hash, (key, value)| value.nil? ? hash : hash.merge(json_key(key) => json_value(value)) } \
102
- .reject { |key, value| value.kind_of?(Enumerable) && value.none? }
101
+ Hash[attribute_set.map{ |a| [a.name, self[a.name]] }].
102
+ inject({}) { |hash, (key, value)| value.nil? ? hash : hash.merge(json_key(key) => json_value(value)) }.
103
+ reject { |key, value| value.kind_of?(Enumerable) && value.none? }
103
104
  end
104
105
 
105
106
  # Convert this JsonModel into a JSON string for transport to the PayPal API
@@ -113,8 +114,8 @@ module AdaptivePayments
113
114
  private
114
115
 
115
116
  def json_key(key)
116
- if self.class.attributes[key]
117
- self.class.attributes[key].options.fetch(:param, key).to_s
117
+ if self.class.attribute_set[key]
118
+ self.class.attribute_set[key].options.fetch(:param, key).to_s
118
119
  else
119
120
  key.to_s
120
121
  end
@@ -1,3 +1,3 @@
1
1
  module AdaptivePayments
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
data/lib/pp-adaptive.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  require "pp-adaptive/version"
2
2
 
3
+ require "pp-adaptive/exception"
4
+
3
5
  require "pp-adaptive/support/aliases"
4
6
  require "pp-adaptive/support/json_model"
5
7
  require "pp-adaptive/support/coerced_array"
data/pp-adaptive.gemspec CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |s|
9
9
  s.email = ["chris@w3style.co.uk"]
10
10
  s.homepage = "https://github.com/"
11
11
  s.summary = %q{Rubygem for working with PayPal's Adaptive Payments API}
12
- s.description = %q{Currently provides just a subset of PayPal's API, for setting up preapproval agreements and taking payments}
12
+ s.description = %q{Provides complete access to PayPal's Adaptive Payments API}
13
13
 
14
14
  s.rubyforge_project = "pp-adaptive"
15
15
 
@@ -19,7 +19,7 @@ Gem::Specification.new do |s|
19
19
  s.require_paths = ["lib"]
20
20
 
21
21
  s.add_runtime_dependency "rest-client"
22
- s.add_runtime_dependency "virtus", ">= 0.0.9"
22
+ s.add_runtime_dependency "virtus", ">= 0.5.1"
23
23
  s.add_runtime_dependency "json"
24
- s.add_development_dependency "rspec", ">= 2.6"
24
+ s.add_development_dependency "rspec", ">= 2.10"
25
25
  end
@@ -1,8 +1,8 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe AdaptivePayments::Client do
4
- let(:rest_client) { double(:post => nil).tap { |d| d.stub(:[] => d) } }
5
- let(:request_class) { stub(:operation => :Test, :build_response => nil) }
4
+ let(:rest_client) { double(:post => '{}').tap { |d| d.stub(:[] => d) } }
5
+ let(:request_class) { stub(:operation => :Refund, :build_response => nil) }
6
6
  let(:request) { stub(:class => request_class, :to_json => '{}') }
7
7
  let(:client) { AdaptivePayments::Client.new }
8
8
 
@@ -82,4 +82,16 @@ describe AdaptivePayments::Client do
82
82
  request_class.should_receive(:build_response).and_return(response)
83
83
  client.execute(request).should == response
84
84
  end
85
+
86
+ it "allows passing a Symbol + Hash instead of a full request object" do
87
+ client.execute(:Refund, {}).should be_a_kind_of(AdaptivePayments::RefundResponse)
88
+ end
89
+
90
+ it "yields the response object" do
91
+ response = stub(:response)
92
+ request_class.should_receive(:build_response).and_return(response)
93
+ ret_val = nil
94
+ client.execute(request) { |r| ret_val = r }
95
+ ret_val.should == response
96
+ end
85
97
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pp-adaptive
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-03-21 00:00:00.000000000 Z
12
+ date: 2012-09-18 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rest-client
16
- requirement: &70143741610300 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,21 +21,31 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70143741610300
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: virtus
27
- requirement: &70143741609800 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
35
  - - ! '>='
31
36
  - !ruby/object:Gem::Version
32
- version: 0.0.9
37
+ version: 0.5.1
33
38
  type: :runtime
34
39
  prerelease: false
35
- version_requirements: *70143741609800
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: 0.5.1
36
46
  - !ruby/object:Gem::Dependency
37
47
  name: json
38
- requirement: &70143741609380 !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
39
49
  none: false
40
50
  requirements:
41
51
  - - ! '>='
@@ -43,20 +53,29 @@ dependencies:
43
53
  version: '0'
44
54
  type: :runtime
45
55
  prerelease: false
46
- version_requirements: *70143741609380
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
47
62
  - !ruby/object:Gem::Dependency
48
63
  name: rspec
49
- requirement: &70143741608840 !ruby/object:Gem::Requirement
64
+ requirement: !ruby/object:Gem::Requirement
50
65
  none: false
51
66
  requirements:
52
67
  - - ! '>='
53
68
  - !ruby/object:Gem::Version
54
- version: '2.6'
69
+ version: '2.10'
55
70
  type: :development
56
71
  prerelease: false
57
- version_requirements: *70143741608840
58
- description: Currently provides just a subset of PayPal's API, for setting up preapproval
59
- agreements and taking payments
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '2.10'
78
+ description: Provides complete access to PayPal's Adaptive Payments API
60
79
  email:
61
80
  - chris@w3style.co.uk
62
81
  executables: []
@@ -76,6 +95,7 @@ files:
76
95
  - lib/pp-adaptive/client.rb
77
96
  - lib/pp-adaptive/convert_currency_request.rb
78
97
  - lib/pp-adaptive/convert_currency_response.rb
98
+ - lib/pp-adaptive/exception.rb
79
99
  - lib/pp-adaptive/execute_payment_request.rb
80
100
  - lib/pp-adaptive/execute_payment_response.rb
81
101
  - lib/pp-adaptive/get_payment_options_request.rb
@@ -189,7 +209,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
189
209
  version: '0'
190
210
  requirements: []
191
211
  rubyforge_project: pp-adaptive
192
- rubygems_version: 1.8.11
212
+ rubygems_version: 1.8.23
193
213
  signing_key:
194
214
  specification_version: 3
195
215
  summary: Rubygem for working with PayPal's Adaptive Payments API