paddle 2.3.0 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fd93d2c8220b972ffa99dc9134c9ae6a1dd4da4051d63d363f825f4130be5965
4
- data.tar.gz: 4e6f0566db66650772cef15c976d229221cf3292b8a60f044ac22cfe91f81d70
3
+ metadata.gz: 8f5aba3cef837ddde090eb1759279427dcf213115c5950b18c167cbea59f4de3
4
+ data.tar.gz: 8bd53cd25b7d29113a5f5e942bac4457afd976cca2995ba232ce888051dc5367
5
5
  SHA512:
6
- metadata.gz: 51904dcd27cdc1272ffffe94397ab53756a07cf0de48071d8e4b4830efd51533965296dd7f0b74667e6a0be0f9f6dd3ec2fbba6dda6f2b512983ab01be0e4096
7
- data.tar.gz: aedd0b4538ed33115788157c00e18b06c83da69ac0491fa1f62f69ecf5c77cebc9e27c9f8e9aa51bfd23bf13a94f67a97f8657bd7a29d3b42bc4a2c9bb41d311
6
+ metadata.gz: e844d8f2c15d7c7d0ad0de2d6dadc566fee298b5a1e1930529b709f9532cf673efc7258e02fe9b636338ed9e7730f90a1a293e71faa7d71293e1c1996c479ac5
7
+ data.tar.gz: 895d3532f3a0ddf935427e186d5a06e28fd7e5af610594d88540b009887023683c0ae0ad4cf06bacbef7c7c7ab9f09e29d3931e65f898b779ccd0ee888623a1c
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- paddle (2.3.0)
4
+ paddle (2.4.0)
5
5
  faraday (~> 2.0)
6
6
 
7
7
  GEM
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.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",
@@ -0,0 +1,6 @@
1
+ module Paddle
2
+ module Classic
3
+ class Error < StandardError
4
+ end
5
+ end
6
+ end
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Paddle
4
- VERSION = "2.3.0"
4
+ VERSION = "2.4.0"
5
5
  end
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 :ErrorFactory, "paddle/error"
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.3.0
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-07-16 00:00:00.000000000 Z
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.15
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