paypal-rest-api 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +51 -19
- data/VERSION +1 -1
- data/lib/paypal-api/api_collections/authentication.rb +1 -1
- data/lib/paypal-api/client.rb +42 -12
- data/lib/paypal-api/config.rb +7 -46
- data/lib/paypal-api/environment.rb +75 -0
- data/lib/paypal-api/request.rb +1 -1
- data/lib/paypal-api/request_executor.rb +8 -6
- data/lib/paypal-api.rb +1 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4e1ec764b9c93fe1fb6fe6f49e2fca6d5e0280a1182b0c4c4f54bee84c43b98d
|
4
|
+
data.tar.gz: c03728c11831a20270e38f111165747634298a3ca4d8bf97a26de9da9baa53b1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 26ca09bb472c049aa9a5cfa81485e11180dc5d1d19776e960beebb6f9db485b9d58ddda18f232943affb1b3d4c27e55ec3c82b4a55be92f16be6ea5c2f836b7e
|
7
|
+
data.tar.gz: f082f9263cffbc5a7a0561557284685eed6c2c2c67204d8c89271e82dedc007b63e3e616e49fc5a86925986df7c52b6afd5e053061785b2909d703c0017db4e7
|
data/README.md
CHANGED
@@ -8,7 +8,7 @@ bundle add paypal-rest-api
|
|
8
8
|
|
9
9
|
## Features
|
10
10
|
|
11
|
-
- Supported Ruby 2.6 -
|
11
|
+
- Supported Ruby Versions - *(2.6 .. 3.3), head, jruby-9.4, truffleruby-24*
|
12
12
|
- No dependencies;
|
13
13
|
- Automatic authorization & reauthorization;
|
14
14
|
- Auto-retries (configured);
|
@@ -35,7 +35,11 @@ PaypalAPI.client = PaypalAPI::Client.new(
|
|
35
35
|
)
|
36
36
|
|
37
37
|
# in your business logic
|
38
|
-
|
38
|
+
PaypalAPI.live? # => false
|
39
|
+
PaypalAPI.api_url # => "https://api-m.sandbox.paypal.com"
|
40
|
+
PaypalAPI.web_url # => "https://sandbox.paypal.com"
|
41
|
+
|
42
|
+
response = between redeploys::Orders.show(order_id)
|
39
43
|
response = PaypalAPI::Orders.create(body: body)
|
40
44
|
```
|
41
45
|
|
@@ -49,6 +53,10 @@ client = PaypalAPI::Client.new(
|
|
49
53
|
live: false
|
50
54
|
)
|
51
55
|
|
56
|
+
client.live? # => false
|
57
|
+
client.api_url # => "https://api-m.sandbox.paypal.com"
|
58
|
+
client.web_url # => "https://sandbox.paypal.com"
|
59
|
+
|
52
60
|
response = client.orders.show(order_id)
|
53
61
|
response = client.orders.create(body: body)
|
54
62
|
```
|
@@ -91,7 +99,7 @@ response.request # Request that generates this response
|
|
91
99
|
|
92
100
|
## Configuration options
|
93
101
|
|
94
|
-
PaypalAPI client accepts this additional options: `:live`, `:retries`, `:http_opts`
|
102
|
+
PaypalAPI client accepts this additional options: `:live`, `:retries`, `:http_opts`, `:cache`
|
95
103
|
|
96
104
|
### Option `:live`
|
97
105
|
|
@@ -108,8 +116,8 @@ client = PaypalAPI::Client.new(
|
|
108
116
|
### Option `:retries`
|
109
117
|
|
110
118
|
This is a Hash with retries configuration.
|
111
|
-
By default retries are enabled,
|
112
|
-
Default config: `{enabled: true, count:
|
119
|
+
By default retries are enabled, 4 retries with 0, 0.25, 0.75, 1.5 seconds delay.
|
120
|
+
Default config: `{enabled: true, count: 4, sleep: [0, 0.25, 0.75, 1.5]}`.
|
113
121
|
New options are merged with defaults.
|
114
122
|
Please keep `sleep` array same size as `count`.
|
115
123
|
|
@@ -139,17 +147,33 @@ client = PaypalAPI::Client.new(
|
|
139
147
|
)
|
140
148
|
```
|
141
149
|
|
150
|
+
### Option `:cache`
|
151
|
+
|
152
|
+
This option can be added to save certificates to between redeploys to validate
|
153
|
+
webhooks offline. By default this gem has only in-memory caching.
|
154
|
+
Cache object must response to standard caching `#fetch(key, &block)` method.
|
155
|
+
|
156
|
+
By default it is `nil`, so downloaded certificates will be downloaded again after
|
157
|
+
redeploys.
|
158
|
+
|
159
|
+
```ruby
|
160
|
+
client = PaypalAPI::Client.new(
|
161
|
+
cache: Rails.cache
|
162
|
+
# ...
|
163
|
+
)
|
164
|
+
```
|
165
|
+
|
142
166
|
## Webhoooks verification
|
143
167
|
|
144
168
|
Webhooks can be verified [offline](https://developer.paypal.com/api/rest/webhooks/rest/#link-selfverificationmethod)
|
145
169
|
or [online](https://developer.paypal.com/api/rest/webhooks/rest/#link-postbackmethod).
|
146
170
|
Method `PaypalAPI.verify_webhook(webhook_id:, headers:, raw_body:)`
|
147
|
-
verifies webhook. It
|
148
|
-
to ONLINE if
|
171
|
+
verifies webhook. It verifies webhook OFFLINE and fallbacks
|
172
|
+
to ONLINE if initial verification returns false to be sure you don't miss a
|
149
173
|
valid webhook.
|
150
174
|
|
151
|
-
When some required header is missing
|
152
|
-
`PaypalAPI::WebhooksVerifier::MissingHeader` error.
|
175
|
+
When some required header is missing the
|
176
|
+
`PaypalAPI::WebhooksVerifier::MissingHeader` error will be raised.
|
153
177
|
|
154
178
|
Example of Rails controller with webhook verification:
|
155
179
|
|
@@ -192,9 +216,17 @@ Callbacks are registered on `client` object.
|
|
192
216
|
Each callback receive `request` and `context` variables.
|
193
217
|
`context` can be modified manually to save state between callbacks.
|
194
218
|
|
195
|
-
|
219
|
+
Arguments:
|
220
|
+
|
221
|
+
- `:before` - (request, context)
|
222
|
+
- `:after_success` - (request, context, response)
|
223
|
+
- `:after_fail` - (request, context, response)
|
224
|
+
- `:after_network_error` - (request, context, error)
|
225
|
+
|
226
|
+
`Context` argument contains `retries_enabled` and `retries_count` and
|
227
|
+
`retry_number` keys by default.
|
196
228
|
|
197
|
-
|
229
|
+
Examples:
|
198
230
|
|
199
231
|
```ruby
|
200
232
|
PaypalAPI.client.add_callback(:before) do |request, context|
|
@@ -202,7 +234,7 @@ PaypalAPI.client.add_callback(:before) do |request, context|
|
|
202
234
|
context[:starts_at] = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
203
235
|
end
|
204
236
|
|
205
|
-
PaypalAPI.client.add_callback(:
|
237
|
+
PaypalAPI.client.add_callback(:after_success) do |request, context, response|
|
206
238
|
ends_at = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
207
239
|
duration = ends_at - context[:starts_at]
|
208
240
|
|
@@ -229,7 +261,7 @@ end
|
|
229
261
|
|
230
262
|
PaypalAPI.client.add_callback(:after_network_error) do |request, context, error|
|
231
263
|
SomeLogger.error(
|
232
|
-
'PaypalAPI network connection error'
|
264
|
+
'PaypalAPI network connection error',
|
233
265
|
method: request.method,
|
234
266
|
uri: request.uri.to_s,
|
235
267
|
error: error.message,
|
@@ -316,15 +348,15 @@ All API endpoints accept this parameters:
|
|
316
348
|
|
317
349
|
### Payments
|
318
350
|
|
319
|
-
- `PaypalAPI::
|
320
|
-
- `PaypalAPI::
|
321
|
-
- `PaypalAPI::
|
322
|
-
- `PaypalAPI::
|
351
|
+
- `PaypalAPI::AuthorizedPayments.show`
|
352
|
+
- `PaypalAPI::AuthorizedPayments.capture`
|
353
|
+
- `PaypalAPI::AuthorizedPayments.reauthorize`
|
354
|
+
- `PaypalAPI::AuthorizedPayments.void`
|
323
355
|
|
324
356
|
<!-- -->
|
325
357
|
|
326
|
-
- `PaypalAPI::
|
327
|
-
- `PaypalAPI::
|
358
|
+
- `PaypalAPI::CapturedPayments.show`
|
359
|
+
- `PaypalAPI::CapturedPayments.refund`
|
328
360
|
|
329
361
|
<!-- -->
|
330
362
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
@@ -43,7 +43,7 @@ module PaypalAPI
|
|
43
43
|
|
44
44
|
default_headers = {
|
45
45
|
"content-type" => "application/x-www-form-urlencoded",
|
46
|
-
"authorization" => "Basic #{["#{client.
|
46
|
+
"authorization" => "Basic #{["#{client.env.client_id}:#{client.env.client_secret}"].pack("m0")}"
|
47
47
|
}
|
48
48
|
|
49
49
|
client.post(PATH, query: query, body: body, headers: merge_headers!(default_headers, headers))
|
data/lib/paypal-api/client.rb
CHANGED
@@ -5,7 +5,18 @@ module PaypalAPI
|
|
5
5
|
# PaypalAPI Client
|
6
6
|
#
|
7
7
|
class Client
|
8
|
-
|
8
|
+
# Paypal environment
|
9
|
+
attr_reader :env
|
10
|
+
|
11
|
+
# Gem Configuration
|
12
|
+
#
|
13
|
+
# @return [Config] Gem Configuration
|
14
|
+
attr_reader :config
|
15
|
+
|
16
|
+
# Registered callbacks
|
17
|
+
#
|
18
|
+
# @return [Hash] Registered callbacks
|
19
|
+
attr_reader :callbacks
|
9
20
|
|
10
21
|
# Initializes Client
|
11
22
|
# @api public
|
@@ -18,15 +29,9 @@ module PaypalAPI
|
|
18
29
|
#
|
19
30
|
# @return [Client] Initialized client
|
20
31
|
#
|
21
|
-
def initialize(client_id:, client_secret:, live:
|
22
|
-
@
|
23
|
-
|
24
|
-
client_secret: client_secret,
|
25
|
-
live: live,
|
26
|
-
http_opts: http_opts,
|
27
|
-
retries: retries,
|
28
|
-
cache: cache
|
29
|
-
)
|
32
|
+
def initialize(client_id:, client_secret:, live: false, http_opts: nil, retries: nil, cache: nil)
|
33
|
+
@env = PaypalAPI::Environment.new(client_id: client_id, client_secret: client_secret, live: live)
|
34
|
+
@config = PaypalAPI::Config.new(http_opts: http_opts, retries: retries, cache: cache)
|
30
35
|
|
31
36
|
@callbacks = {
|
32
37
|
before: [],
|
@@ -38,10 +43,34 @@ module PaypalAPI
|
|
38
43
|
@access_token = nil
|
39
44
|
end
|
40
45
|
|
46
|
+
# Checks if PayPal LIVE environment enabled
|
47
|
+
# @return [Boolean] Checks if PayPal LIVE environment enabled
|
48
|
+
def live?
|
49
|
+
env.live?
|
50
|
+
end
|
51
|
+
|
52
|
+
# Checks if PayPal SANDBOX environment enabled
|
53
|
+
# @return [Boolean] Checks if PayPal SANDBOX environment enabled
|
54
|
+
def sandbox?
|
55
|
+
env.sandbox?
|
56
|
+
end
|
57
|
+
|
58
|
+
# Base API URL
|
59
|
+
# @return [String] Base API URL
|
60
|
+
def api_url
|
61
|
+
env.api_url
|
62
|
+
end
|
63
|
+
|
64
|
+
# Base WEB URL
|
65
|
+
# @return [String] Base WEB URL
|
66
|
+
def web_url
|
67
|
+
env.web_url
|
68
|
+
end
|
69
|
+
|
41
70
|
# Registers callback
|
42
71
|
#
|
43
72
|
# @param callback_name [Symbol] Callback name.
|
44
|
-
# Allowed values: :before, :after_success, :
|
73
|
+
# Allowed values: :before, :after_success, :after_fail, :after_network_error
|
45
74
|
#
|
46
75
|
# @param block [Proc] Block that must be call
|
47
76
|
# For `:before` callback proc should accept 2 params -
|
@@ -89,6 +118,7 @@ module PaypalAPI
|
|
89
118
|
|
90
119
|
#
|
91
120
|
# Verifies Webhook
|
121
|
+
#
|
92
122
|
# It requires one-time request to download and cache certificate.
|
93
123
|
# If local verification returns false it tries to verify webhook online.
|
94
124
|
#
|
@@ -98,7 +128,7 @@ module PaypalAPI
|
|
98
128
|
# class Webhooks::PaypalController < ApplicationController
|
99
129
|
# def create
|
100
130
|
# webhook_id = ENV['PAYPAL_WEBHOOK_ID'] # PayPal registered webhook ID for current URL
|
101
|
-
# headers = request.headers # must
|
131
|
+
# headers = request.headers # must respond to #[] to get headers
|
102
132
|
# body = request.raw_post # must be a raw String body
|
103
133
|
#
|
104
134
|
# webhook_is_valid = PaypalAPI.verify_webhook(webhook_id: webhook_id, headers: headers, body: body)
|
data/lib/paypal-api/config.rb
CHANGED
@@ -2,71 +2,32 @@
|
|
2
2
|
|
3
3
|
module PaypalAPI
|
4
4
|
#
|
5
|
-
# Stores
|
5
|
+
# Stores client requests configuration
|
6
6
|
#
|
7
7
|
class Config
|
8
|
-
# Live PayPal URL
|
9
|
-
LIVE_URL = "https://api-m.paypal.com"
|
10
|
-
|
11
|
-
# Sandbox PayPal URL
|
12
|
-
SANDBOX_URL = "https://api-m.sandbox.paypal.com"
|
13
|
-
|
14
8
|
# Default config options
|
15
9
|
DEFAULTS = {
|
16
|
-
live: false,
|
17
10
|
http_opts: {}.freeze,
|
18
|
-
retries: {enabled: true, count:
|
11
|
+
retries: {enabled: true, count: 4, sleep: [0, 0.25, 0.75, 1.5].freeze}.freeze
|
19
12
|
}.freeze
|
20
13
|
|
21
|
-
attr_reader :
|
14
|
+
attr_reader :http_opts, :retries, :certs_cache
|
22
15
|
|
23
16
|
# Initializes Config
|
24
17
|
#
|
25
|
-
# @param client_id [String] PayPal client id
|
26
|
-
# @param client_secret [String] PayPal client secret
|
27
|
-
# @param live [Boolean] PayPal live/sandbox mode
|
28
18
|
# @param http_opts [Hash] Net::Http opts for all requests
|
29
19
|
# @param retries [Hash] Retries configuration
|
30
20
|
# @param cache [#read, nil] Application cache to store certificates to validate webhook events locally.
|
31
|
-
# Must respond to #
|
21
|
+
# Must respond to #fetch(key, &block)
|
32
22
|
#
|
33
23
|
# @return [Client] Initialized config object
|
34
24
|
#
|
35
|
-
def initialize(
|
36
|
-
@
|
37
|
-
@
|
38
|
-
@live = with_default(:live, live)
|
39
|
-
@http_opts = with_default(:http_opts, http_opts)
|
40
|
-
@retries = with_default(:retries, retries)
|
25
|
+
def initialize(http_opts: nil, retries: {}, cache: nil)
|
26
|
+
@http_opts = http_opts || DEFAULTS[:http_opts]
|
27
|
+
@retries = DEFAULTS[:retries].merge(retries || {})
|
41
28
|
@certs_cache = WebhookVerifier::CertsCache.new(cache)
|
42
29
|
|
43
30
|
freeze
|
44
31
|
end
|
45
|
-
|
46
|
-
# @return [String] PayPal live or sandbox URL
|
47
|
-
def url
|
48
|
-
live ? LIVE_URL : SANDBOX_URL
|
49
|
-
end
|
50
|
-
|
51
|
-
#
|
52
|
-
# Instance representation string. Default was overwritten to hide secrets
|
53
|
-
#
|
54
|
-
def inspect
|
55
|
-
"#<#{self.class.name} live: #{live}>"
|
56
|
-
end
|
57
|
-
|
58
|
-
alias_method :to_s, :inspect
|
59
|
-
|
60
|
-
private
|
61
|
-
|
62
|
-
def with_default(option_name, value)
|
63
|
-
default = DEFAULTS.fetch(option_name)
|
64
|
-
|
65
|
-
case value
|
66
|
-
when NilClass then default
|
67
|
-
when Hash then default.merge(value)
|
68
|
-
else value
|
69
|
-
end
|
70
|
-
end
|
71
32
|
end
|
72
33
|
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PaypalAPI
|
4
|
+
# Sandbox API PayPal URL
|
5
|
+
SANDBOX_API_URL = "https://api-m.sandbox.paypal.com"
|
6
|
+
|
7
|
+
# Live API PayPal URL
|
8
|
+
LIVE_API_URL = "https://api-m.paypal.com"
|
9
|
+
|
10
|
+
# Sandbox PayPal Web URL
|
11
|
+
SANDBOX_WEB_URL = "https://sandbox.paypal.com"
|
12
|
+
|
13
|
+
# Live PayPal Web URL
|
14
|
+
LIVE_WEB_URL = "https://paypal.com"
|
15
|
+
|
16
|
+
#
|
17
|
+
# PayPal environment info
|
18
|
+
#
|
19
|
+
class Environment
|
20
|
+
# PayPal client_id
|
21
|
+
attr_accessor :client_id
|
22
|
+
|
23
|
+
# PayPal client_secret
|
24
|
+
attr_reader :client_secret
|
25
|
+
|
26
|
+
# PayPal API base URL
|
27
|
+
attr_reader :api_url
|
28
|
+
|
29
|
+
# PayPal web URL
|
30
|
+
attr_reader :web_url
|
31
|
+
|
32
|
+
# Initializes Environment
|
33
|
+
#
|
34
|
+
# @param client_id [String] PayPal client id
|
35
|
+
# @param client_secret [String] PayPal client secret
|
36
|
+
# @param live [Boolean] PayPal live/sandbox mode
|
37
|
+
#
|
38
|
+
# @return [Client] Initialized config object
|
39
|
+
#
|
40
|
+
def initialize(client_id:, client_secret:, live: false)
|
41
|
+
@live = live || false
|
42
|
+
@api_url = live ? LIVE_API_URL : SANDBOX_API_URL
|
43
|
+
@web_url = live ? LIVE_WEB_URL : SANDBOX_WEB_URL
|
44
|
+
@client_id = client_id
|
45
|
+
@client_secret = client_secret
|
46
|
+
freeze
|
47
|
+
end
|
48
|
+
|
49
|
+
#
|
50
|
+
# Instance representation string. Default was overwritten to hide secrets
|
51
|
+
# @return [String]
|
52
|
+
#
|
53
|
+
def inspect
|
54
|
+
"#<#{self.class.name} live: #{@live}>"
|
55
|
+
end
|
56
|
+
|
57
|
+
alias_method :to_s, :inspect
|
58
|
+
|
59
|
+
#
|
60
|
+
# Checks if live environment enabled
|
61
|
+
# @return [Boolean]
|
62
|
+
#
|
63
|
+
def live?
|
64
|
+
@live
|
65
|
+
end
|
66
|
+
|
67
|
+
#
|
68
|
+
# Checks if sandbox environment enabled
|
69
|
+
# @return [Boolean]
|
70
|
+
#
|
71
|
+
def sandbox?
|
72
|
+
!live?
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
data/lib/paypal-api/request.rb
CHANGED
@@ -5,7 +5,7 @@ module PaypalAPI
|
|
5
5
|
# Executes PaypalAPI::Request and returns PaypalAPI::Response or raises PaypalAPI::Error
|
6
6
|
#
|
7
7
|
class RequestExecutor
|
8
|
-
attr_reader :client, :request, :http_opts, :
|
8
|
+
attr_reader :client, :request, :http_opts, :retries, :callbacks, :callbacks_context
|
9
9
|
|
10
10
|
def initialize(client, request)
|
11
11
|
@client = client
|
@@ -13,7 +13,7 @@ module PaypalAPI
|
|
13
13
|
@http_opts = {use_ssl: request.uri.is_a?(URI::HTTPS), **client.config.http_opts}
|
14
14
|
@retries = client.config.retries
|
15
15
|
@callbacks = client.callbacks
|
16
|
-
@callbacks_context = {retries_count: retries[:count]}
|
16
|
+
@callbacks_context = {retries_enabled: retries[:enabled], retries_count: retries[:count]}
|
17
17
|
end
|
18
18
|
|
19
19
|
#
|
@@ -35,8 +35,10 @@ module PaypalAPI
|
|
35
35
|
|
36
36
|
run_callbacks(:before)
|
37
37
|
response = execute_net_http_request
|
38
|
-
rescue
|
39
|
-
|
38
|
+
rescue => error
|
39
|
+
raise error if NetworkErrorBuilder::ERRORS.none? { |network_error_class| error.is_a?(network_error_class) }
|
40
|
+
|
41
|
+
will_retry = retries[:enabled] && !retries_limit_reached?(retry_number)
|
40
42
|
callbacks_context[:will_retry] = will_retry
|
41
43
|
run_callbacks(:after_network_error, error)
|
42
44
|
raise NetworkErrorBuilder.call(request: request, error: error) unless will_retry
|
@@ -48,7 +50,7 @@ module PaypalAPI
|
|
48
50
|
run_callbacks(:after_success, response)
|
49
51
|
response
|
50
52
|
else
|
51
|
-
will_retry = retryable?(response, retry_number)
|
53
|
+
will_retry = retries[:enabled] && retryable?(response, retry_number)
|
52
54
|
callbacks_context[:will_retry] = will_retry
|
53
55
|
run_callbacks(:after_fail, response)
|
54
56
|
will_retry ? retry_request(retry_number) : response
|
@@ -104,7 +106,7 @@ module PaypalAPI
|
|
104
106
|
end
|
105
107
|
|
106
108
|
def run_callbacks(callback_name, resp = nil)
|
107
|
-
callbacks[callback_name].each { |callback| callback.call(request,
|
109
|
+
callbacks[callback_name].each { |callback| callback.call(request, callbacks_context, resp) }
|
108
110
|
end
|
109
111
|
end
|
110
112
|
end
|
data/lib/paypal-api.rb
CHANGED
@@ -210,6 +210,7 @@ end
|
|
210
210
|
|
211
211
|
require_relative "paypal-api/access_token"
|
212
212
|
require_relative "paypal-api/api_collection"
|
213
|
+
require_relative "paypal-api/environment"
|
213
214
|
require_relative "paypal-api/client"
|
214
215
|
require_relative "paypal-api/config"
|
215
216
|
require_relative "paypal-api/error"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: paypal-rest-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrey Glushkov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-09-02 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: PayPal REST API with no dependencies.
|
14
14
|
email:
|
@@ -45,6 +45,7 @@ files:
|
|
45
45
|
- lib/paypal-api/api_collections/webhooks.rb
|
46
46
|
- lib/paypal-api/client.rb
|
47
47
|
- lib/paypal-api/config.rb
|
48
|
+
- lib/paypal-api/environment.rb
|
48
49
|
- lib/paypal-api/error.rb
|
49
50
|
- lib/paypal-api/failed_request_error_builder.rb
|
50
51
|
- lib/paypal-api/network_error_builder.rb
|