paddle_pay 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +21 -2
  3. data/lib/paddle_pay.rb +23 -23
  4. data/lib/paddle_pay/configuration.rb +19 -6
  5. data/lib/paddle_pay/connection.rb +11 -11
  6. data/lib/paddle_pay/errors/paddle_pay_error.rb +4 -1
  7. data/lib/paddle_pay/models/alert/webhook.rb +2 -2
  8. data/lib/paddle_pay/models/product/coupon.rb +12 -12
  9. data/lib/paddle_pay/models/product/license.rb +2 -2
  10. data/lib/paddle_pay/models/product/pay_link.rb +2 -2
  11. data/lib/paddle_pay/models/product/payment.rb +4 -4
  12. data/lib/paddle_pay/models/product/product.rb +2 -2
  13. data/lib/paddle_pay/models/subscription/charge.rb +1 -1
  14. data/lib/paddle_pay/models/subscription/modifier.rb +6 -6
  15. data/lib/paddle_pay/models/subscription/payment.rb +7 -7
  16. data/lib/paddle_pay/models/subscription/plan.rb +4 -4
  17. data/lib/paddle_pay/models/subscription/user.rb +10 -10
  18. data/lib/paddle_pay/util.rb +6 -6
  19. data/lib/paddle_pay/version.rb +1 -1
  20. data/test/spec/paddle_pay/configuration_spec.rb +35 -7
  21. data/test/spec/paddle_pay/connection_spec.rb +38 -38
  22. data/test/spec/paddle_pay/models/alert/webhook_spec.rb +9 -13
  23. data/test/spec/paddle_pay/models/product/coupon_spec.rb +29 -33
  24. data/test/spec/paddle_pay/models/product/license_spec.rb +8 -8
  25. data/test/spec/paddle_pay/models/product/pay_link_spec.rb +8 -8
  26. data/test/spec/paddle_pay/models/product/payment_spec.rb +7 -7
  27. data/test/spec/paddle_pay/models/product/product_spec.rb +9 -13
  28. data/test/spec/paddle_pay/models/subscription/charge_spec.rb +8 -8
  29. data/test/spec/paddle_pay/models/subscription/modifier_spec.rb +17 -21
  30. data/test/spec/paddle_pay/models/subscription/payment_spec.rb +17 -21
  31. data/test/spec/paddle_pay/models/subscription/plan_spec.rb +14 -18
  32. data/test/spec/paddle_pay/models/subscription/user_spec.rb +20 -24
  33. data/test/spec/paddle_pay/models/transaction/checkout_spec.rb +10 -14
  34. data/test/spec/paddle_pay/models/transaction/order_spec.rb +10 -14
  35. data/test/spec/paddle_pay/models/transaction/product_spec.rb +9 -13
  36. data/test/spec/paddle_pay/models/transaction/subscription_spec.rb +9 -13
  37. data/test/spec/paddle_pay/models/transaction/user_spec.rb +9 -13
  38. data/test/spec/paddle_pay/util_spec.rb +19 -19
  39. data/test/spec/paddle_pay/version_spec.rb +2 -2
  40. data/test/test_helper.rb +10 -10
  41. metadata +35 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d4b576ab1993da2a68d2157288909b5a32263c0e64fba65c8f590ade235e34e4
4
- data.tar.gz: 055e96a399e3b98a508ff638506bb44383fc05020258202447d314ffc7d1a402
3
+ metadata.gz: d2c11cc7eda43495df42fa84b9806cca833202178676463725f2b94c9c08f245
4
+ data.tar.gz: 61061e1fcc1db7c7515bf9a8efd66bd564767843ee82b7ce75568e4d9802269d
5
5
  SHA512:
6
- metadata.gz: 4d4abed1bfa549c2fc8c50522c462d65ed0a82a92b046e9b72663556e90d5f16f07a17d61f8dc127b9a6b963a03bcc098a12c233f488372d16b4666b40ae120f
7
- data.tar.gz: 5f82a368c69a8231840ecf002702ab0e44ec9e8e38f3ff8cf25135dd4e1a6da8bb41ba1215bf8147799afc442f85f63f83455116edfd7cad6e6bc88348beeeee
6
+ metadata.gz: fc6e6db5f4c96a9731f324c85c5c088013dccd213ccc115eb6ce165d8d9719b929cfd9059dd1222e8b085497091464154c815a13905adc320a114ca94ab7c2c4
7
+ data.tar.gz: 789a614eeb26dc9ae04420316a9e75e6c396de296aed42b2841f4487d908cea3f72eec5f3c3fc4e5d5fcc2aacc0480be22b47ff1456b6608b253d96fa7275210
data/README.md CHANGED
@@ -1,5 +1,8 @@
1
1
  # PaddlePay
2
2
 
3
+ ![Tests](https://github.com/devmindo/paddle_pay/workflows/Tests/badge.svg?branch=master)
4
+ [![Gem Version](https://img.shields.io/gem/v/paddle_pay.svg?style=flat)](https://rubygems.org/gems/paddle_pay)
5
+
3
6
  A Ruby wrapper for the paddle.com API.
4
7
 
5
8
  ## Installation
@@ -18,12 +21,24 @@ And then execute:
18
21
 
19
22
  Configure the gem with the credentials obtained from the Paddle Dashboard
20
23
 
24
+ ### Development
21
25
  ```ruby
22
26
  PaddlePay.configure do |config|
23
- config.vendor_id = 'YOUR VENDOR ID'
24
- config.vendor_auth_code = 'YOUR VENDOR AUTH CODE'
27
+ config.environment = :development # or :sandbox
28
+ config.vendor_id = 'YOUR SANDBOX VENDOR ID'
29
+ config.vendor_auth_code = 'YOUR SANDBOX VENDOR AUTH CODE'
25
30
  end
26
31
  ```
32
+
33
+ ### Production
34
+ ```ruby
35
+ PaddlePay.configure do |config|
36
+ config.environment = :production
37
+ config.vendor_id = 'YOUR PRODUCTION VENDOR ID'
38
+ config.vendor_auth_code = 'YOUR PRODUCTION VENDOR AUTH CODE'
39
+ end
40
+ ```
41
+
27
42
  ## Usage
28
43
 
29
44
  ### Product
@@ -198,6 +213,10 @@ id = '123456'
198
213
  PaddlePay::Transaction::User.list(id, options = {})
199
214
  ```
200
215
 
216
+ ## Webhooks
217
+
218
+ With this gem it is possible to communicate with the Paddle API, but no webhooks are handled. If you want to handle Paddle webhooks in a Ruby on Rails application, please have a look at the [pay gem](https://github.com/pay-rails/pay) where this gem is integrated.
219
+
201
220
  ## Development
202
221
 
203
222
  Check out the repository and run `bin/setup` to install dependencies. For configuration run `mv .env.template .env` and set your credentials in the required fields. After that, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt.
data/lib/paddle_pay.rb CHANGED
@@ -1,29 +1,29 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'faraday'
4
- require 'json'
3
+ require "faraday"
4
+ require "json"
5
5
 
6
- require_relative 'paddle_pay/configuration'
7
- require_relative 'paddle_pay/connection'
8
- require_relative 'paddle_pay/util'
9
- require_relative 'paddle_pay/version'
10
- require_relative 'paddle_pay/errors/paddle_pay_error'
11
- require_relative 'paddle_pay/models/alert/webhook'
12
- require_relative 'paddle_pay/models/product/coupon'
13
- require_relative 'paddle_pay/models/product/license'
14
- require_relative 'paddle_pay/models/product/pay_link'
15
- require_relative 'paddle_pay/models/product/payment'
16
- require_relative 'paddle_pay/models/product/product'
17
- require_relative 'paddle_pay/models/subscription/charge'
18
- require_relative 'paddle_pay/models/subscription/modifier'
19
- require_relative 'paddle_pay/models/subscription/payment'
20
- require_relative 'paddle_pay/models/subscription/plan'
21
- require_relative 'paddle_pay/models/subscription/user'
22
- require_relative 'paddle_pay/models/transaction/checkout'
23
- require_relative 'paddle_pay/models/transaction/order'
24
- require_relative 'paddle_pay/models/transaction/product'
25
- require_relative 'paddle_pay/models/transaction/subscription'
26
- require_relative 'paddle_pay/models/transaction/user'
6
+ require_relative "paddle_pay/configuration"
7
+ require_relative "paddle_pay/connection"
8
+ require_relative "paddle_pay/util"
9
+ require_relative "paddle_pay/version"
10
+ require_relative "paddle_pay/errors/paddle_pay_error"
11
+ require_relative "paddle_pay/models/alert/webhook"
12
+ require_relative "paddle_pay/models/product/coupon"
13
+ require_relative "paddle_pay/models/product/license"
14
+ require_relative "paddle_pay/models/product/pay_link"
15
+ require_relative "paddle_pay/models/product/payment"
16
+ require_relative "paddle_pay/models/product/product"
17
+ require_relative "paddle_pay/models/subscription/charge"
18
+ require_relative "paddle_pay/models/subscription/modifier"
19
+ require_relative "paddle_pay/models/subscription/payment"
20
+ require_relative "paddle_pay/models/subscription/plan"
21
+ require_relative "paddle_pay/models/subscription/user"
22
+ require_relative "paddle_pay/models/transaction/checkout"
23
+ require_relative "paddle_pay/models/transaction/order"
24
+ require_relative "paddle_pay/models/transaction/product"
25
+ require_relative "paddle_pay/models/transaction/subscription"
26
+ require_relative "paddle_pay/models/transaction/user"
27
27
 
28
28
  module PaddlePay
29
29
  class << self
@@ -2,16 +2,29 @@
2
2
 
3
3
  module PaddlePay
4
4
  class Configuration
5
- attr_reader :vendors_url
6
- attr_reader :vendor_auth_code
7
- attr_reader :vendor_id
5
+ attr_reader :environment
6
+ attr_accessor :vendor_auth_code
7
+ attr_accessor :vendor_id
8
8
 
9
9
  def initialize
10
- @vendors_url = 'https://vendors.paddle.com/api'
10
+ @environment ||= :production
11
11
  end
12
12
 
13
- attr_writer :vendor_auth_code
13
+ def environment=(env)
14
+ env = env.to_sym
15
+ unless [:development, :sandbox, :production].include?(env)
16
+ raise ArgumentError, "#{env.inspect} is not a valid environment"
17
+ end
18
+ @environment = env
19
+ end
14
20
 
15
- attr_writer :vendor_id
21
+ def vendors_url
22
+ case @environment
23
+ when :production
24
+ "https://vendors.paddle.com/api"
25
+ when :development, :sandbox
26
+ "https://sandbox-vendors.paddle.com/api"
27
+ end
28
+ end
16
29
  end
17
30
  end
@@ -9,23 +9,23 @@ module PaddlePay
9
9
  headers = options.delete(:headers) || {}
10
10
  body = options.delete(:body) || {}
11
11
 
12
- conn = Faraday.new(url: request_url) do |faraday|
12
+ conn = Faraday.new(url: request_url) { |faraday|
13
13
  faraday.request :url_encoded
14
14
  faraday.response :raise_error
15
15
  faraday.adapter :net_http
16
- end
16
+ }
17
17
 
18
18
  begin
19
- response = conn.post(url, config.merge(body)) do |req|
19
+ response = conn.post(url, config.merge(body)) { |req|
20
20
  req.params.merge!(params)
21
21
  req.headers.merge!(headers)
22
- end
22
+ }
23
23
  result = parse(response)
24
- unless result['success']
25
- raise PaddlePayError.new(result['error']['message'], result['error']['code'])
24
+ unless result["success"]
25
+ raise PaddlePayError.new(result["error"]["message"], result["error"]["code"])
26
26
  end
27
27
 
28
- PaddlePay::Util.convert_hash_keys(result['response'])
28
+ PaddlePay::Util.convert_hash_keys(result["response"])
29
29
  rescue Faraday::BadRequestError => e
30
30
  raise BadRequestError.new(e.response[:body], e.response[:status])
31
31
  rescue Faraday::UnauthorizedError => e
@@ -40,10 +40,10 @@ module PaddlePay
40
40
  raise ConflictError.new(e.response[:body], e.response[:status])
41
41
  rescue Faraday::UnprocessableEntityError => e
42
42
  raise UnprocessableEntityError.new(e.response[:body], e.response[:status])
43
- rescue Faraday::TimeoutError => e
44
- raise TimeoutError, 'The connection has timed out'
45
- rescue Faraday::ConnectionFailed => e
46
- raise ConnectionError, 'The connection failed'
43
+ rescue Faraday::TimeoutError
44
+ raise TimeoutError, "The connection has timed out"
45
+ rescue Faraday::ConnectionFailed
46
+ raise ConnectionError, "The connection failed"
47
47
  rescue Faraday::ServerError => e
48
48
  raise ServerError.new(e.response[:body], e.response[:status])
49
49
  end
@@ -7,7 +7,7 @@ module PaddlePay
7
7
  attr_reader :message
8
8
 
9
9
  def initialize(message, code = nil)
10
- super("#{message} #{'(Code ' + code.to_s + ')' if code}")
10
+ super("#{message} #{"(Code " + code.to_s + ")" if code}")
11
11
  @code = code
12
12
  @message = message
13
13
  end
@@ -37,6 +37,9 @@ module PaddlePay
37
37
  class UnprocessableEntityError < ClientError
38
38
  end
39
39
 
40
+ class ArgumentError < ClientError
41
+ end
42
+
40
43
  class ServerError < PaddlePayError
41
44
  end
42
45
 
@@ -5,8 +5,8 @@ module PaddlePay
5
5
  module Webhook
6
6
  class << self
7
7
  def history(filters = {}, options = {})
8
- options.merge!({ body: filters }) if filters.is_a?(::Hash)
9
- Connection.request('2.0/alert/webhooks', options)
8
+ options[:body] = filters if filters.is_a?(::Hash)
9
+ Connection.request("2.0/alert/webhooks", options)
10
10
  end
11
11
  end
12
12
  end
@@ -5,30 +5,30 @@ module PaddlePay
5
5
  module Coupon
6
6
  class << self
7
7
  def list(product_id, options = {})
8
- options.merge!({ body: { product_id: product_id } })
9
- Connection.request('2.0/product/list_coupons', options)
8
+ options[:body] = {product_id: product_id}
9
+ Connection.request("2.0/product/list_coupons", options)
10
10
  end
11
11
 
12
12
  def create(attributes, options = {})
13
- options.merge!({ body: attributes }) if attributes.is_a?(::Hash)
14
- Connection.request('2.1/product/create_coupon', options)
13
+ options[:body] = attributes if attributes.is_a?(::Hash)
14
+ Connection.request("2.1/product/create_coupon", options)
15
15
  end
16
16
 
17
17
  def delete(coupon_code, product_id, options = {})
18
- options.merge!({ body: { coupon_code: coupon_code, product_id: product_id } })
19
- Connection.request('2.0/product/delete_coupon', options)
18
+ options[:body] = {coupon_code: coupon_code, product_id: product_id}
19
+ Connection.request("2.0/product/delete_coupon", options)
20
20
  end
21
21
 
22
22
  def update_code(coupon_code, attributes = {}, options = {})
23
- attributes.merge!(coupon_code: coupon_code)
24
- options.merge!({ body: attributes })
25
- Connection.request('2.1/product/update_coupon', options)
23
+ attributes[:coupon_code] = coupon_code
24
+ options[:body] = attributes
25
+ Connection.request("2.1/product/update_coupon", options)
26
26
  end
27
27
 
28
28
  def update_group(group, attributes = {}, options = {})
29
- attributes.merge!(group: group)
30
- options.merge!({ body: attributes })
31
- Connection.request('2.1/product/update_coupon', options)
29
+ attributes[:group] = group
30
+ options[:body] = attributes
31
+ Connection.request("2.1/product/update_coupon", options)
32
32
  end
33
33
  end
34
34
  end
@@ -5,8 +5,8 @@ module PaddlePay
5
5
  module License
6
6
  class << self
7
7
  def generate(attributes, options = {})
8
- options.merge!({ body: attributes }) if attributes.is_a?(::Hash)
9
- Connection.request('2.0/product/generate_license', options)
8
+ options[:body] = attributes if attributes.is_a?(::Hash)
9
+ Connection.request("2.0/product/generate_license", options)
10
10
  end
11
11
  end
12
12
  end
@@ -5,8 +5,8 @@ module PaddlePay
5
5
  module PayLink
6
6
  class << self
7
7
  def generate(attributes, options = {})
8
- options.merge!({ body: attributes }) if attributes.is_a?(::Hash)
9
- Connection.request('2.0/product/generate_pay_link', options)
8
+ options[:body] = attributes if attributes.is_a?(::Hash)
9
+ Connection.request("2.0/product/generate_pay_link", options)
10
10
  end
11
11
  end
12
12
  end
@@ -5,11 +5,11 @@ module PaddlePay
5
5
  module Payment
6
6
  class << self
7
7
  def refund(order_id, attributes = {}, options = {})
8
- attributes.merge!(order_id: order_id)
9
- options.merge!({ body: attributes })
10
- Connection.request('2.0/payment/refund', options)
8
+ attributes[:order_id] = order_id
9
+ options[:body] = attributes
10
+ Connection.request("2.0/payment/refund", options)
11
11
  end
12
12
  end
13
13
  end
14
14
  end
15
- end
15
+ end
@@ -4,8 +4,8 @@ module PaddlePay
4
4
  module Product
5
5
  class << self
6
6
  def list(filters = {}, options = {})
7
- options.merge!({ body: filters }) if filters.is_a?(::Hash)
8
- Connection.request('2.0/product/get_products', options)
7
+ options[:body] = filters if filters.is_a?(::Hash)
8
+ Connection.request("2.0/product/get_products", options)
9
9
  end
10
10
  end
11
11
  end
@@ -5,7 +5,7 @@ module PaddlePay
5
5
  module Charge
6
6
  class << self
7
7
  def create(subscription_id, amount, charge_name, options = {})
8
- options.merge!({ body: { amount: amount, charge_name: charge_name } })
8
+ options[:body] = {amount: amount, charge_name: charge_name}
9
9
  Connection.request("2.0/subscription/#{subscription_id}/charge", options)
10
10
  end
11
11
  end
@@ -5,18 +5,18 @@ module PaddlePay
5
5
  module Modifier
6
6
  class << self
7
7
  def list(filters = {}, options = {})
8
- options.merge!({ body: filters }) if filters.is_a?(::Hash)
9
- Connection.request('2.0/subscription/modifiers', options)
8
+ options[:body] = filters if filters.is_a?(::Hash)
9
+ Connection.request("2.0/subscription/modifiers", options)
10
10
  end
11
11
 
12
12
  def create(attributes, options = {})
13
- options.merge!({ body: attributes }) if attributes.is_a?(::Hash)
14
- Connection.request('2.0/subscription/modifiers/create', options)
13
+ options[:body] = attributes if attributes.is_a?(::Hash)
14
+ Connection.request("2.0/subscription/modifiers/create", options)
15
15
  end
16
16
 
17
17
  def delete(modifier_id, options = {})
18
- options.merge!({ body: { modifier_id: modifier_id } })
19
- Connection.request('2.0/subscription/modifiers/delete', options)
18
+ options[:body] = {modifier_id: modifier_id}
19
+ Connection.request("2.0/subscription/modifiers/delete", options)
20
20
  end
21
21
  end
22
22
  end
@@ -5,19 +5,19 @@ module PaddlePay
5
5
  module Payment
6
6
  class << self
7
7
  def list(filters = {}, options = {})
8
- options.merge!({ body: filters }) if filters.is_a?(::Hash)
9
- Connection.request('2.0/subscription/payments', options)
8
+ options[:body] = filters if filters.is_a?(::Hash)
9
+ Connection.request("2.0/subscription/payments", options)
10
10
  end
11
11
 
12
12
  def reschedule(payment_id, date, options = {})
13
- options.merge!({ body: { payment_id: payment_id, date: date } })
14
- Connection.request('2.0/subscription/payments_reschedule', options)
13
+ options[:body] = {payment_id: payment_id, date: date}
14
+ Connection.request("2.0/subscription/payments_reschedule", options)
15
15
  end
16
16
 
17
17
  def refund(order_id, attributes = {}, options = {})
18
- attributes.merge!(order_id: order_id)
19
- options.merge!({ body: attributes })
20
- Connection.request('2.0/payment/refund', options)
18
+ attributes[:order_id] = order_id
19
+ options[:body] = attributes
20
+ Connection.request("2.0/payment/refund", options)
21
21
  end
22
22
  end
23
23
  end
@@ -5,13 +5,13 @@ module PaddlePay
5
5
  module Plan
6
6
  class << self
7
7
  def list(filters = {}, options = {})
8
- options.merge!({ body: filters }) if filters.is_a?(::Hash)
9
- Connection.request('2.0/subscription/plans', options)
8
+ options[:body] = filters if filters.is_a?(::Hash)
9
+ Connection.request("2.0/subscription/plans", options)
10
10
  end
11
11
 
12
12
  def create(attributes, options = {})
13
- options.merge!({ body: attributes }) if attributes.is_a?(::Hash)
14
- Connection.request('2.0/subscription/plans_create', options)
13
+ options[:body] = attributes if attributes.is_a?(::Hash)
14
+ Connection.request("2.0/subscription/plans_create", options)
15
15
  end
16
16
  end
17
17
  end
@@ -5,25 +5,25 @@ module PaddlePay
5
5
  module User
6
6
  class << self
7
7
  def list(filters = {}, options = {})
8
- options.merge!({ body: filters }) if filters.is_a?(::Hash)
9
- Connection.request('2.0/subscription/users', options)
8
+ options[:body] = filters if filters.is_a?(::Hash)
9
+ Connection.request("2.0/subscription/users", options)
10
10
  end
11
11
 
12
12
  def cancel(subscription_id, options = {})
13
- options.merge!({ body: { subscription_id: subscription_id } })
14
- Connection.request('2.0/subscription/users_cancel', options)
13
+ options[:body] = {subscription_id: subscription_id}
14
+ Connection.request("2.0/subscription/users_cancel", options)
15
15
  end
16
16
 
17
17
  def update(subscription_id, attributes = {}, options = {})
18
- attributes.merge!(subscription_id: subscription_id)
19
- options.merge!({ body: attributes })
20
- Connection.request('2.0/subscription/users_update', options)
18
+ attributes[:subscription_id] = subscription_id
19
+ options[:body] = attributes
20
+ Connection.request("2.0/subscription/users_update", options)
21
21
  end
22
22
 
23
23
  def preview_update(subscription_id, attributes = {}, options = {})
24
- attributes.merge!(subscription_id: subscription_id)
25
- options.merge!({ body: attributes })
26
- Connection.request('2.0/subscription/preview_update', options)
24
+ attributes[:subscription_id] = subscription_id
25
+ options[:body] = attributes
26
+ Connection.request("2.0/subscription/preview_update", options)
27
27
  end
28
28
  end
29
29
  end
@@ -15,7 +15,7 @@ module PaddlePay
15
15
  end
16
16
 
17
17
  def convert_class_to_path(class_name)
18
- class_name.split('::').map { |v| to_snake_case(v) }.join('/')
18
+ class_name.split("::").map { |v| to_snake_case(v) }.join("/")
19
19
  end
20
20
 
21
21
  private
@@ -25,11 +25,11 @@ module PaddlePay
25
25
  end
26
26
 
27
27
  def to_snake_case(string)
28
- string.gsub(/::/, '/')
29
- .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
30
- .gsub(/([a-z\d])([A-Z])/, '\1_\2')
31
- .tr('-', '_')
32
- .downcase
28
+ string.gsub(/::/, "/")
29
+ .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
30
+ .gsub(/([a-z\d])([A-Z])/, '\1_\2')
31
+ .tr("-", "_")
32
+ .downcase
33
33
  end
34
34
  end
35
35
  end