paddle 2.3.0 → 2.4.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.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +29 -11
- data/lib/paddle/classic/error.rb +6 -0
- data/lib/paddle/error.rb +0 -123
- data/lib/paddle/error_generator.rb +128 -0
- data/lib/paddle/version.rb +1 -1
- data/lib/paddle.rb +3 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8f5aba3cef837ddde090eb1759279427dcf213115c5950b18c167cbea59f4de3
|
4
|
+
data.tar.gz: 8bd53cd25b7d29113a5f5e942bac4457afd976cca2995ba232ce888051dc5367
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e844d8f2c15d7c7d0ad0de2d6dadc566fee298b5a1e1930529b709f9532cf673efc7258e02fe9b636338ed9e7730f90a1a293e71faa7d71293e1c1996c479ac5
|
7
|
+
data.tar.gz: 895d3532f3a0ddf935427e186d5a06e28fd7e5af610594d88540b009887023683c0ae0ad4cf06bacbef7c7c7ab9f09e29d3931e65f898b779ccd0ee888623a1c
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -7,7 +7,7 @@ The easiest and most complete Ruby library for the Paddle APIs, both Classic and
|
|
7
7
|
Add this line to your application's Gemfile:
|
8
8
|
|
9
9
|
```ruby
|
10
|
-
gem "paddle", "~> 2.
|
10
|
+
gem "paddle", "~> 2.3"
|
11
11
|
```
|
12
12
|
|
13
13
|
## Billing API
|
@@ -101,10 +101,12 @@ Paddle::Product.create(name: "My SAAS Plan", tax_category: "saas")
|
|
101
101
|
Paddle::Product.create(name: "My Standard Product", tax_category: "standard")
|
102
102
|
|
103
103
|
# Retrieve a product
|
104
|
-
Paddle::Product.retrieve(id: "pro_abc123")
|
104
|
+
product = Paddle::Product.retrieve(id: "pro_abc123")
|
105
105
|
|
106
106
|
# Update a product
|
107
107
|
# https://developer.paddle.com/api-reference/products/update-product
|
108
|
+
product.update(description: "This is a plan")
|
109
|
+
# or
|
108
110
|
Paddle::Product.update(id: "pro_abc123", description: "This is a plan")
|
109
111
|
```
|
110
112
|
|
@@ -124,10 +126,12 @@ Paddle::Price.list(product_id: "pro_abc123")
|
|
124
126
|
Paddle::Price.create(product_id: "pro_abc123", description: "A one off price", amount: "1000", currency: "GBP")
|
125
127
|
|
126
128
|
# Retrieve a price
|
127
|
-
Paddle::Price.retrieve(id: "pri_123abc")
|
129
|
+
price = Paddle::Price.retrieve(id: "pri_123abc")
|
128
130
|
|
129
131
|
# Update a price
|
130
132
|
# https://developer.paddle.com/api-reference/prices/update-price
|
133
|
+
price.update(description: "An updated description")
|
134
|
+
# or
|
131
135
|
Paddle::Price.update(id: "pri_123abc", description: "An updated description")
|
132
136
|
```
|
133
137
|
|
@@ -157,10 +161,12 @@ Paddle::Discount.create(description: "$5 off", type: "flat", amount: "500", curr
|
|
157
161
|
Paddle::Discount.create(description: "10% Off", type: "percentage", amount: "10", code: "10OFF")
|
158
162
|
|
159
163
|
# Retrieve a discount
|
160
|
-
Paddle::Discount.retrieve(id: "dsc_abc123")
|
164
|
+
discount = Paddle::Discount.retrieve(id: "dsc_abc123")
|
161
165
|
|
162
166
|
# Update a discount
|
163
167
|
# https://developer.paddle.com/api-reference/discounts/update-discount
|
168
|
+
discount.update(description: "An updated description")
|
169
|
+
# or
|
164
170
|
Paddle::Discount.update(id: "dsc_abc123", description: "An updated description")
|
165
171
|
```
|
166
172
|
|
@@ -175,14 +181,16 @@ Paddle::Customer.list(email: "me@mydomain.com")
|
|
175
181
|
|
176
182
|
# Create a customer
|
177
183
|
# https://developer.paddle.com/api-reference/customers/create-customer
|
178
|
-
# Returns a Paddle::ConflictError if the email is already used on Paddle
|
184
|
+
# Returns a Paddle::Errors::ConflictError if the email is already used on Paddle
|
179
185
|
Paddle::Customer.create(email: "myemail@mydomain.com", name: "Customer Name")
|
180
186
|
|
181
187
|
# Retrieve a customer
|
182
|
-
Paddle::Customer.retrieve(id: "ctm_abc123")
|
188
|
+
customer = Paddle::Customer.retrieve(id: "ctm_abc123")
|
183
189
|
|
184
190
|
# Update a customer
|
185
191
|
# https://developer.paddle.com/api-reference/customers/update-customer
|
192
|
+
customer.update(status: "archived")
|
193
|
+
# or
|
186
194
|
Paddle::Customer.update(id: "ctm_abc123", status: "archived")
|
187
195
|
|
188
196
|
# Retrieve credit balance for a customer
|
@@ -202,10 +210,12 @@ Paddle::Address.list(customer: "ctm_abc123")
|
|
202
210
|
Paddle::Address.create(customer: "ctm_abc123", country_code: "GB", postal_code: "SW1A 2AA")
|
203
211
|
|
204
212
|
# Retrieve an address
|
205
|
-
Paddle::Address.retrieve(customer: "ctm_abc123", id: "add_abc123")
|
213
|
+
address = Paddle::Address.retrieve(customer: "ctm_abc123", id: "add_abc123")
|
206
214
|
|
207
215
|
# Update an address
|
208
216
|
# https://developer.paddle.com/api-reference/addresses/update-address
|
217
|
+
address.update(status: "archived")
|
218
|
+
# or
|
209
219
|
Paddle::Address.update(customer: "ctm_abc123", id: "add_abc123", status: "archived")
|
210
220
|
```
|
211
221
|
|
@@ -221,10 +231,12 @@ Paddle::Business.list(customer: "ctm_abc123")
|
|
221
231
|
Paddle::Business.create(customer: "ctm_abc123", name: "My Ltd Company")
|
222
232
|
|
223
233
|
# Retrieve a business
|
224
|
-
Paddle::Business.retrieve(customer: "ctm_abc123", id: "biz_abc123")
|
234
|
+
business = Paddle::Business.retrieve(customer: "ctm_abc123", id: "biz_abc123")
|
225
235
|
|
226
236
|
# Update a business
|
227
237
|
# https://developer.paddle.com/api-reference/businesses/update-business
|
238
|
+
business.update(status: "archived")
|
239
|
+
# or
|
228
240
|
Paddle::Business.update(customer: "ctm_abc123", id: "biz_abc123", status: "archived")
|
229
241
|
```
|
230
242
|
|
@@ -246,10 +258,12 @@ Paddle::Transaction.retrieve(id: "txn_abc123")
|
|
246
258
|
|
247
259
|
# Retrieve a transaction with extra information
|
248
260
|
# extra can be either "address", "adjustment", "adjustments_totals", "business", "customer", "discount"
|
249
|
-
Paddle::Transaction.retrieve(id: "txn_abc123", extra: "customer")
|
261
|
+
transaction = Paddle::Transaction.retrieve(id: "txn_abc123", extra: "customer")
|
250
262
|
|
251
263
|
# Update a transaction
|
252
264
|
# https://developer.paddle.com/api-reference/transaction/update-transaction
|
265
|
+
transaction.update(items: [ { price_id: "pri_abc123", quantity: 2 } ])
|
266
|
+
# or
|
253
267
|
Paddle::Transaction.update(id: "txn_abc123", items: [ { price_id: "pri_abc123", quantity: 2 } ])
|
254
268
|
|
255
269
|
# Preview a transaction
|
@@ -280,7 +294,7 @@ Paddle::Subscription.retrieve(id: "sub_abc123")
|
|
280
294
|
|
281
295
|
# Retrieve a subscription with extra information
|
282
296
|
# extra can be either "next_transaction" or "recurring_transaction_details"
|
283
|
-
Paddle::Subscription.retrieve(id: "sub_abc123", extra: "next_transaction")
|
297
|
+
subscription = Paddle::Subscription.retrieve(id: "sub_abc123", extra: "next_transaction")
|
284
298
|
|
285
299
|
# Preview an update to a subscription
|
286
300
|
# https://developer.paddle.com/api-reference/subscriptions/preview-subscription
|
@@ -288,6 +302,8 @@ Paddle::Subscription.preview(id: "sub_abc123", items: [ { price_id: "pri_123abc"
|
|
288
302
|
|
289
303
|
# Update a subscription
|
290
304
|
# https://developer.paddle.com/api-reference/subscriptions/update-subscription
|
305
|
+
subscription.update(billing_details: {purchase_order_number: "PO-1234"})
|
306
|
+
# or
|
291
307
|
Paddle::Subscription.update(id: "sub_abc123", billing_details: {purchase_order_number: "PO-1234"})
|
292
308
|
|
293
309
|
# Get a transaction to update payment method
|
@@ -367,7 +383,7 @@ Used for creating webhook and email notifications
|
|
367
383
|
Paddle::NotificationSetting.list
|
368
384
|
|
369
385
|
# Retrieve a notification setting
|
370
|
-
Paddle::NotificationSetting.retrieve(id: "ntfset_abc123")
|
386
|
+
setting = Paddle::NotificationSetting.retrieve(id: "ntfset_abc123")
|
371
387
|
|
372
388
|
# Create a notification setting
|
373
389
|
# https://developer.paddle.com/api-reference/notification-settings/create-notification-setting
|
@@ -383,6 +399,8 @@ Paddle::NotificationSetting.create(
|
|
383
399
|
|
384
400
|
# Update a notification setting
|
385
401
|
# https://developer.paddle.com/api-reference/notification-settings/update-notification-setting
|
402
|
+
setting.update(subscribed_events: %w[subscription.activated transaction.completed transaction.billed])
|
403
|
+
# or
|
386
404
|
Paddle::NotificationSetting.update(id: "ntfset_abc123",
|
387
405
|
subscribed_events: [
|
388
406
|
"subscription.activated",
|
data/lib/paddle/error.rb
CHANGED
@@ -1,127 +1,4 @@
|
|
1
1
|
module Paddle
|
2
2
|
class Error < StandardError
|
3
|
-
attr_reader :http_status_code
|
4
|
-
attr_reader :paddle_error_code
|
5
|
-
attr_reader :paddle_error_message
|
6
|
-
|
7
|
-
def initialize(response_body, http_status_code)
|
8
|
-
@response_body = response_body
|
9
|
-
@http_status_code = http_status_code
|
10
|
-
set_paddle_error_values
|
11
|
-
super(build_message)
|
12
|
-
end
|
13
|
-
|
14
|
-
private
|
15
|
-
|
16
|
-
def set_paddle_error_values
|
17
|
-
@paddle_error_code = @response_body.dig("error", "code")
|
18
|
-
@paddle_error_message = @response_body.dig("error", "detail")
|
19
|
-
end
|
20
|
-
|
21
|
-
def error_message
|
22
|
-
@paddle_error_message || @response_body.dig("error", "code")
|
23
|
-
rescue NoMethodError
|
24
|
-
"An unknown error occurred."
|
25
|
-
end
|
26
|
-
|
27
|
-
def build_message
|
28
|
-
if paddle_error_code.nil?
|
29
|
-
return "Error #{@http_status_code}: #{error_message}"
|
30
|
-
end
|
31
|
-
"Error #{@http_status_code}: #{error_message} '#{paddle_error_code}'"
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
class BadRequestError < Error
|
36
|
-
private
|
37
|
-
|
38
|
-
def error_message
|
39
|
-
"Your request was malformed."
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
class AuthenticationMissingError < Error
|
44
|
-
private
|
45
|
-
|
46
|
-
def error_message
|
47
|
-
"You did not supply valid authentication credentials."
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
class ForbiddenError < Error
|
52
|
-
private
|
53
|
-
|
54
|
-
def error_message
|
55
|
-
"You are not allowed to perform that action."
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
class EntityNotFoundError < Error
|
60
|
-
private
|
61
|
-
|
62
|
-
def error_message
|
63
|
-
"No results were found for your request."
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
class ConflictError < Error
|
68
|
-
private
|
69
|
-
|
70
|
-
def error_message
|
71
|
-
"Your request was a conflict."
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
class TooManyRequestsError < Error
|
76
|
-
private
|
77
|
-
|
78
|
-
def error_message
|
79
|
-
"Your request exceeded the API rate limit."
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
class InternalError < Error
|
84
|
-
private
|
85
|
-
|
86
|
-
def error_message
|
87
|
-
"We were unable to perform the request due to server-side problems."
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
class ServiceUnavailableError < Error
|
92
|
-
private
|
93
|
-
|
94
|
-
def error_message
|
95
|
-
"You have been rate limited for sending more than 20 requests per second."
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
class NotImplementedError < Error
|
100
|
-
private
|
101
|
-
|
102
|
-
def error_message
|
103
|
-
"This resource has not been implemented."
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
|
108
|
-
class ErrorFactory
|
109
|
-
HTTP_ERROR_MAP = {
|
110
|
-
400 => BadRequestError,
|
111
|
-
401 => AuthenticationMissingError,
|
112
|
-
403 => ForbiddenError,
|
113
|
-
404 => EntityNotFoundError,
|
114
|
-
409 => ConflictError,
|
115
|
-
429 => TooManyRequestsError,
|
116
|
-
500 => InternalError,
|
117
|
-
503 => ServiceUnavailableError,
|
118
|
-
501 => NotImplementedError
|
119
|
-
}.freeze
|
120
|
-
|
121
|
-
def self.create(response_body, http_status_code)
|
122
|
-
status = http_status_code
|
123
|
-
error_class = HTTP_ERROR_MAP[status] || Error
|
124
|
-
error_class.new(response_body, http_status_code) if error_class
|
125
|
-
end
|
126
3
|
end
|
127
4
|
end
|
@@ -0,0 +1,128 @@
|
|
1
|
+
module Paddle
|
2
|
+
class ErrorGenerator < StandardError
|
3
|
+
attr_reader :http_status_code
|
4
|
+
attr_reader :paddle_error_code
|
5
|
+
attr_reader :paddle_error_message
|
6
|
+
|
7
|
+
def initialize(response_body, http_status_code)
|
8
|
+
@response_body = response_body
|
9
|
+
@http_status_code = http_status_code
|
10
|
+
set_paddle_error_values
|
11
|
+
super(build_message)
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def set_paddle_error_values
|
17
|
+
@paddle_error_code = @response_body.dig("error", "code")
|
18
|
+
@paddle_error_message = @response_body.dig("error", "detail")
|
19
|
+
end
|
20
|
+
|
21
|
+
def error_message
|
22
|
+
@paddle_error_message || @response_body.dig("error", "code")
|
23
|
+
rescue NoMethodError
|
24
|
+
"An unknown error occurred."
|
25
|
+
end
|
26
|
+
|
27
|
+
def build_message
|
28
|
+
if paddle_error_code.nil?
|
29
|
+
return "Error #{@http_status_code}: #{error_message}"
|
30
|
+
end
|
31
|
+
"Error #{@http_status_code}: #{error_message} '#{paddle_error_code}'"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
module Errors
|
36
|
+
class BadRequestError < ErrorGenerator
|
37
|
+
private
|
38
|
+
|
39
|
+
def error_message
|
40
|
+
"Your request was malformed."
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
class AuthenticationMissingError < ErrorGenerator
|
45
|
+
private
|
46
|
+
|
47
|
+
def error_message
|
48
|
+
"You did not supply valid authentication credentials."
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
class ForbiddenError < ErrorGenerator
|
53
|
+
private
|
54
|
+
|
55
|
+
def error_message
|
56
|
+
"You are not allowed to perform that action."
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
class EntityNotFoundError < ErrorGenerator
|
61
|
+
private
|
62
|
+
|
63
|
+
def error_message
|
64
|
+
"No results were found for your request."
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
class ConflictError < ErrorGenerator
|
69
|
+
private
|
70
|
+
|
71
|
+
def error_message
|
72
|
+
"Your request was a conflict."
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
class TooManyRequestsError < ErrorGenerator
|
77
|
+
private
|
78
|
+
|
79
|
+
def error_message
|
80
|
+
"Your request exceeded the API rate limit."
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
class InternalError < ErrorGenerator
|
85
|
+
private
|
86
|
+
|
87
|
+
def error_message
|
88
|
+
"We were unable to perform the request due to server-side problems."
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
class ServiceUnavailableError < ErrorGenerator
|
93
|
+
private
|
94
|
+
|
95
|
+
def error_message
|
96
|
+
"You have been rate limited for sending more than 20 requests per second."
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
class NotImplementedError < ErrorGenerator
|
101
|
+
private
|
102
|
+
|
103
|
+
def error_message
|
104
|
+
"This resource has not been implemented."
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
class ErrorFactory
|
110
|
+
HTTP_ERROR_MAP = {
|
111
|
+
400 => Errors::BadRequestError,
|
112
|
+
401 => Errors::AuthenticationMissingError,
|
113
|
+
403 => Errors::ForbiddenError,
|
114
|
+
404 => Errors::EntityNotFoundError,
|
115
|
+
409 => Errors::ConflictError,
|
116
|
+
429 => Errors::TooManyRequestsError,
|
117
|
+
500 => Errors::InternalError,
|
118
|
+
503 => Errors::ServiceUnavailableError,
|
119
|
+
501 => Errors::NotImplementedError
|
120
|
+
}.freeze
|
121
|
+
|
122
|
+
def self.create(response_body, http_status_code)
|
123
|
+
status = http_status_code
|
124
|
+
error_class = HTTP_ERROR_MAP[status] || ErrorGenerator
|
125
|
+
error_class.new(response_body, http_status_code) if error_class
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
data/lib/paddle/version.rb
CHANGED
data/lib/paddle.rb
CHANGED
@@ -9,7 +9,8 @@ module Paddle
|
|
9
9
|
autoload :Client, "paddle/client"
|
10
10
|
autoload :Collection, "paddle/collection"
|
11
11
|
autoload :Error, "paddle/error"
|
12
|
-
autoload :
|
12
|
+
autoload :ErrorGenerator, "paddle/error_generator"
|
13
|
+
autoload :ErrorFactory, "paddle/error_generator"
|
13
14
|
|
14
15
|
autoload :Object, "paddle/object"
|
15
16
|
|
@@ -50,6 +51,7 @@ module Paddle
|
|
50
51
|
autoload :Client, "paddle/classic/client"
|
51
52
|
autoload :Collection, "paddle/classic/collection"
|
52
53
|
autoload :Resource, "paddle/classic/resource"
|
54
|
+
autoload :Error, "paddle/classic/error"
|
53
55
|
|
54
56
|
autoload :PlansResource, "paddle/classic/resources/plans"
|
55
57
|
autoload :CouponsResource, "paddle/classic/resources/coupons"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: paddle
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dean Perry
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-08-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -42,6 +42,7 @@ files:
|
|
42
42
|
- lib/paddle.rb
|
43
43
|
- lib/paddle/classic/client.rb
|
44
44
|
- lib/paddle/classic/collection.rb
|
45
|
+
- lib/paddle/classic/error.rb
|
45
46
|
- lib/paddle/classic/objects/charge.rb
|
46
47
|
- lib/paddle/classic/objects/coupon.rb
|
47
48
|
- lib/paddle/classic/objects/license.rb
|
@@ -70,6 +71,7 @@ files:
|
|
70
71
|
- lib/paddle/collection.rb
|
71
72
|
- lib/paddle/configuration.rb
|
72
73
|
- lib/paddle/error.rb
|
74
|
+
- lib/paddle/error_generator.rb
|
73
75
|
- lib/paddle/models/address.rb
|
74
76
|
- lib/paddle/models/adjustment.rb
|
75
77
|
- lib/paddle/models/business.rb
|
@@ -110,7 +112,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
110
112
|
- !ruby/object:Gem::Version
|
111
113
|
version: '0'
|
112
114
|
requirements: []
|
113
|
-
rubygems_version: 3.5.
|
115
|
+
rubygems_version: 3.5.11
|
114
116
|
signing_key:
|
115
117
|
specification_version: 4
|
116
118
|
summary: Ruby library for the Paddle Billing & Classic APIs
|