yookassa 0.1.0 → 0.2.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/.github/workflows/main.yml +31 -0
- data/.rubocop.yml +16 -9
- data/Gemfile +10 -3
- data/Gemfile.lock +108 -69
- data/README.md +43 -14
- data/Rakefile +7 -1
- data/bin/console +13 -0
- data/bin/rake +29 -0
- data/bin/rspec +29 -0
- data/bin/rubocop +29 -0
- data/bin/setup +8 -0
- data/lib/yookassa/client.rb +44 -0
- data/lib/yookassa/config.rb +7 -0
- data/lib/yookassa/entity/amount.rb +5 -7
- data/lib/yookassa/entity/authorization_details.rb +28 -0
- data/lib/yookassa/entity/cancellation_details.rb +18 -0
- data/lib/yookassa/entity/card.rb +38 -11
- data/lib/yookassa/entity/confirmation.rb +7 -9
- data/lib/yookassa/entity/error.rb +19 -0
- data/lib/yookassa/entity/payment.rb +110 -14
- data/lib/yookassa/entity/payment_methods.rb +107 -0
- data/lib/yookassa/entity/recipient.rb +12 -0
- data/lib/yookassa/entity/refund.rb +11 -7
- data/lib/yookassa/entity/transfer.rb +33 -0
- data/lib/yookassa/entity/types.rb +9 -0
- data/lib/yookassa/payments.rb +35 -0
- data/lib/yookassa/refunds.rb +25 -0
- data/lib/yookassa/version.rb +1 -1
- data/lib/yookassa.rb +29 -11
- data/spec/fixtures/refund.json +4 -4
- data/spec/spec_helper.rb +3 -8
- data/spec/yookassa/config_spec.rb +7 -0
- data/spec/yookassa/payments_spec.rb +101 -0
- data/spec/yookassa/refunds_spec.rb +54 -0
- data/spec/yookassa_spec.rb +38 -1
- data/yookassa.gemspec +13 -18
- metadata +36 -82
- data/.circleci/config.yml +0 -28
- data/lib/yookassa/callable.rb +0 -10
- data/lib/yookassa/entity/payment_method.rb +0 -19
- data/lib/yookassa/error.rb +0 -30
- data/lib/yookassa/optional.rb +0 -23
- data/lib/yookassa/payment.rb +0 -65
- data/lib/yookassa/refund.rb +0 -35
- data/lib/yookassa/response.rb +0 -20
- data/spec/yookassa/payment_spec.rb +0 -104
- data/spec/yookassa/refund_spec.rb +0 -54
data/lib/yookassa/entity/card.rb
CHANGED
@@ -1,18 +1,45 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative "./types"
|
4
|
+
|
3
5
|
module Yookassa
|
4
6
|
module Entity
|
5
|
-
class Card
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
7
|
+
class Card < Dry::Struct
|
8
|
+
# first6 [string, optional]
|
9
|
+
# First 6 digits of the card’s number (BIN). For payments with bank cards saved in YooMoney
|
10
|
+
# and other services, the specified BIN might not correspond with the last4, expiry_year, expiry_month values.
|
11
|
+
# For payments with bank cards saved in Apple Pay or Google Pay, the parameter contains Device Account Number.
|
12
|
+
attribute? :first6, Types::String
|
13
|
+
|
14
|
+
# last4 [string, required]
|
15
|
+
# Last 4 digits of the card's number.
|
16
|
+
attribute :last4, Types::String
|
17
|
+
|
18
|
+
# expiry_month [string, required]
|
19
|
+
# Expiration date, month, MM.
|
20
|
+
attribute :expiry_month, Types::Coercible::Integer
|
21
|
+
|
22
|
+
# expiry_year [string, required]
|
23
|
+
# Expiration date, year, YYYY.
|
24
|
+
attribute :expiry_year, Types::Coercible::Integer
|
25
|
+
|
26
|
+
# card_type [string, required]
|
27
|
+
# Type of bank card. Possible values: MasterCard (for Mastercard and Maestro cards), Visa (for Visa and Visa Electron cards),
|
28
|
+
# Mir, UnionPay, JCB, AmericanExpress, DinersClub, and Unknown.
|
29
|
+
attribute :card_type, Types::String.enum("MasterCard", "Visa", "Mir", "UnionPay", "JCB", "AmericanExpress", "DinersClub", "Unknown")
|
30
|
+
|
31
|
+
# issuer_country [string, optional]
|
32
|
+
# Code of the country where the bank card was issued according to ISO-3166 alpha-2. Example: RU.
|
33
|
+
attribute? :issuer_country, Types::String
|
34
|
+
|
35
|
+
# issuer_name [string, optional]
|
36
|
+
# Name of the issuing bank.
|
37
|
+
attribute? :issuer_name, Types::String
|
38
|
+
|
39
|
+
# source [string, optional]
|
40
|
+
# Source of bank card details. Possible values: apple_pay, google_pay.
|
41
|
+
# For payments where the user selects a card saved in Apple Pay or Google Pay.
|
42
|
+
attribute? :source, Types::String.enum("apple_pay", "google_pay")
|
16
43
|
end
|
17
44
|
end
|
18
45
|
end
|
@@ -1,16 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative "./types"
|
4
|
+
|
3
5
|
module Yookassa
|
4
6
|
module Entity
|
5
|
-
class Confirmation
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
option :type, proc(&:to_s), optional: true
|
11
|
-
option :confirmation_url, proc(&:to_s), optional: true
|
12
|
-
option :enforce, optional: true
|
13
|
-
option :return_url, proc(&:to_s), optional: true
|
7
|
+
class Confirmation < Dry::Struct
|
8
|
+
attribute :type, Types::String
|
9
|
+
attribute :confirmation_url, Types::String
|
10
|
+
attribute? :enforce, Types::Bool
|
11
|
+
attribute? :return_url, Types::String
|
14
12
|
end
|
15
13
|
end
|
16
14
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "./types"
|
4
|
+
|
5
|
+
module Yookassa
|
6
|
+
module Entity
|
7
|
+
class Error < Dry::Struct
|
8
|
+
attribute :type, Types::String
|
9
|
+
attribute? :id, Types::String
|
10
|
+
attribute? :code, Types::String
|
11
|
+
attribute? :description, Types::String
|
12
|
+
attribute? :parameter, Types::String
|
13
|
+
|
14
|
+
def error?
|
15
|
+
type == "error"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -1,22 +1,118 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative
|
4
|
-
require_relative
|
5
|
-
require_relative
|
3
|
+
require_relative "./types"
|
4
|
+
require_relative "./amount"
|
5
|
+
require_relative "./payment_methods"
|
6
|
+
require_relative "./confirmation"
|
7
|
+
require_relative "./recipient"
|
8
|
+
require_relative "./cancellation_details"
|
9
|
+
require_relative "./authorization_details"
|
10
|
+
require_relative "./transfer"
|
6
11
|
|
7
12
|
module Yookassa
|
8
13
|
module Entity
|
9
|
-
class Payment <
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
14
|
+
class Payment < Dry::Struct
|
15
|
+
# id [string, required]
|
16
|
+
# Payment ID in YooMoney.
|
17
|
+
attribute :id, Types::String
|
18
|
+
|
19
|
+
attribute? :idempotency_key, Types::String
|
20
|
+
|
21
|
+
# status [string, required]
|
22
|
+
# Payment status. Possible values: pending, waiting_for_capture, succeeded, and canceled.
|
23
|
+
# More about the life cycle of a payment https://yookassa.ru/en/developers/api#:~:text=life%20cycle%20of%20a%20payment%C2%A0
|
24
|
+
attribute :status, Types::String.enum("pending", "waiting_for_capture", "succeeded", "canceled")
|
25
|
+
|
26
|
+
# amount [object, required]
|
27
|
+
# Payment amount. Sometimes YooMoney's partners charge additional commission from the users that is not included in this amount.
|
28
|
+
attribute :amount, Entity::Amount
|
29
|
+
|
30
|
+
# income_amount [object, optional]
|
31
|
+
# Amount of payment to be received by the store: the amount value minus the YooMoney commission.
|
32
|
+
# If you're a partner using an OAuth token for request authentication, make a request to the store for a right
|
33
|
+
# to get information about commissions on payments.
|
34
|
+
attribute? :income_amount, Entity::Amount
|
35
|
+
|
36
|
+
# description [string, optional]
|
37
|
+
# Description of the transaction (maximum 128 characters) displayed in your YooMoney Merchant Profile,
|
38
|
+
# and shown to the user during checkout. For example, "Payment for order No. 72 for user@yoomoney.ru".
|
39
|
+
attribute? :description, Types::String.constrained(max_size: 128)
|
40
|
+
|
41
|
+
# recipient [object, required]
|
42
|
+
# Payment recipient.
|
43
|
+
attribute :recipient, Entity::Recipient
|
44
|
+
|
45
|
+
# payment_method [object, optional]
|
46
|
+
# Payment method used for this payment.
|
47
|
+
attribute? :payment_method, Entity::PaymentMethods
|
48
|
+
|
49
|
+
# captured_at [datetime, optional]
|
50
|
+
# Time of payment capture, based on UTC and specified in the ISO 8601 format. "2018-07-18T10:51:18.139Z"
|
51
|
+
attribute? :captured_at, Types::JSON::DateTime
|
52
|
+
|
53
|
+
# created_at [datetime, required]
|
54
|
+
# Time of order creation, based on UTC and specified in the ISO 8601 format. Example: 2017-11-03T11:52:31.827Z
|
55
|
+
attribute :created_at, Types::JSON::DateTime
|
56
|
+
|
57
|
+
# expires_at [string, optional]
|
58
|
+
# The period during which you can cancel or capture a payment for free. The payment with the waiting_for_capture status
|
59
|
+
# will be automatically canceled at the specified time. Based on UTC and specified in the ISO 8601 format.
|
60
|
+
attribute? :expires_at, Types::JSON::DateTime
|
61
|
+
|
62
|
+
# confirmation [object, optional]
|
63
|
+
# Selected payment confirmation scenario. For payments requiring confirmation from the user.
|
64
|
+
# More about confirmation scenarios https://yookassa.ru/en/developers/api#:~:text=confirmation,from%20the%20user.%20More%20about%20confirmation%20scenarios%C2%A0
|
65
|
+
attribute? :confirmation, Entity::Confirmation
|
66
|
+
|
67
|
+
# test [boolean, required]
|
68
|
+
# The attribute of a test transaction.
|
69
|
+
attribute :test, Types::Bool
|
70
|
+
|
71
|
+
# refunded_amount [object, optional]
|
72
|
+
# The amount refunded to the user. Specified if the payment has successful refunds.
|
73
|
+
attribute? :refunded_amount, Entity::Amount
|
74
|
+
|
75
|
+
# paid [boolean, required]
|
76
|
+
# The attribute of a paid order.
|
77
|
+
attribute :paid, Types::Bool
|
78
|
+
|
79
|
+
# refundable [boolean, required]
|
80
|
+
# Availability of the option to make a refund via API.
|
81
|
+
attribute :refundable, Types::Bool
|
82
|
+
|
83
|
+
# receipt_registration [string, optional]
|
84
|
+
# Delivery status of receipt data to online sales register (pending, succeeded, or canceled). For those who use the solution for 54-FZ .
|
85
|
+
attribute? :receipt_registration, Types::String.enum("pending", "succeeded", "canceled")
|
86
|
+
|
87
|
+
# metadata [object, optional]
|
88
|
+
# Any additional data you might require for processing payments (for example, order number), specified as a “key-value” pair
|
89
|
+
# and returned in response from YooMoney.
|
90
|
+
# Limitations:
|
91
|
+
# - no more than 16 keys,
|
92
|
+
# - no more than 32 characters in the key’s title,
|
93
|
+
# - no more than 512 characters in the key’s value,
|
94
|
+
# - data type is a string in the UTF-8 format.
|
95
|
+
attribute? :metadata, Types::Hash
|
96
|
+
|
97
|
+
# cancellation_details [object, optional]
|
98
|
+
# Commentary to the canceled status: who and why canceled the payment.
|
99
|
+
# More about canceled payments https://yookassa.ru/en/developers/api#:~:text=cancellation_details,about%20canceled%20payments%C2%A0
|
100
|
+
attribute? :cancellation_details, Entity::CancellationDetails
|
101
|
+
|
102
|
+
# authorization_details [object, optional]
|
103
|
+
# Payment authorization details.
|
104
|
+
attribute? :authorization_details, Entity::AuthorizationDetails
|
105
|
+
|
106
|
+
# transfers [array, optional]
|
107
|
+
# Information about money distribution: the amounts of transfers and the stores to be transferred to.
|
108
|
+
# Specified if you use the YooMoney solution for marketplaces https://yookassa.ru/en/developers/special-solutions/checkout-for-platforms/basics
|
109
|
+
attribute? :transfers, Types::Array.of(Entity::Transfer)
|
110
|
+
|
111
|
+
# merchant_customer_id [string, optional]
|
112
|
+
# The identifier of the customer in your system, such as email address or phone number. No more than 200 characters.
|
113
|
+
# Specified if you want to save a bank card and offer it for a recurring payment
|
114
|
+
# in the YooMoney payment widget https://yookassa.ru/en/developers/payment-forms/widget/basics.
|
115
|
+
attribute? :merchant_customer_id, Types::String
|
20
116
|
end
|
21
117
|
end
|
22
118
|
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "./types"
|
4
|
+
require_relative "./card"
|
5
|
+
|
6
|
+
module Yookassa
|
7
|
+
module Entity
|
8
|
+
module PaymentMethod
|
9
|
+
class Base < Dry::Struct
|
10
|
+
# id [string, required]
|
11
|
+
# Payment method ID.
|
12
|
+
attribute :id, Types::String
|
13
|
+
|
14
|
+
# saved [boolean, required]
|
15
|
+
# Saving payment methods allows conducting automatic recurring payments .
|
16
|
+
attribute :saved, Types::Bool
|
17
|
+
|
18
|
+
# title [string, optional]
|
19
|
+
# Payment method name.
|
20
|
+
attribute? :title, Types::String
|
21
|
+
end
|
22
|
+
|
23
|
+
class BankCard < Base
|
24
|
+
attribute :type, Types.Value("bank_card")
|
25
|
+
|
26
|
+
# login [string, optional]
|
27
|
+
# User's login in Alfa-Click (linked phone number or the additional login).
|
28
|
+
attribute? :card, Entity::Card
|
29
|
+
end
|
30
|
+
|
31
|
+
class Alfabank < Base
|
32
|
+
attribute :type, Types.Value("alfabank")
|
33
|
+
|
34
|
+
# login [string, optional]
|
35
|
+
# User's login in Alfa-Click (linked phone number or the additional login).
|
36
|
+
attribute? :login, Types::String
|
37
|
+
end
|
38
|
+
|
39
|
+
class YooMoney < Base
|
40
|
+
attribute :type, Types.Value("yoo_money")
|
41
|
+
|
42
|
+
# account_number [string, optional]
|
43
|
+
# The number of the YooMoney wallet used for making the payment.
|
44
|
+
attribute? :account_number, Types::String
|
45
|
+
end
|
46
|
+
|
47
|
+
class Sberbank < Base
|
48
|
+
attribute :type, Types.Value("sberbank")
|
49
|
+
|
50
|
+
# phone [string, optional]
|
51
|
+
# TThe phone number specified during the registration process of the SberBank Online/SberPay account,
|
52
|
+
# specified in the ITU-T E.164 format, for example, 79000000000.
|
53
|
+
attribute? :phone, Types::String
|
54
|
+
end
|
55
|
+
|
56
|
+
class ApplePay < Base
|
57
|
+
attribute :type, Types.Value("apple_pay")
|
58
|
+
end
|
59
|
+
|
60
|
+
class Cash < Base
|
61
|
+
attribute :type, Types.Value("cash")
|
62
|
+
end
|
63
|
+
|
64
|
+
class DirectCarrierBilling < Base
|
65
|
+
attribute :type, Types.Value("mobile_balance")
|
66
|
+
end
|
67
|
+
|
68
|
+
class GooglePay < Base
|
69
|
+
attribute :type, Types.Value("google_pay")
|
70
|
+
end
|
71
|
+
|
72
|
+
class Installments < Base
|
73
|
+
attribute :type, Types.Value("installments")
|
74
|
+
end
|
75
|
+
|
76
|
+
class Qiwi < Base
|
77
|
+
attribute :type, Types.Value("qiwi")
|
78
|
+
end
|
79
|
+
|
80
|
+
class Tinkoff < Base
|
81
|
+
attribute :type, Types.Value("tinkoff_bank")
|
82
|
+
end
|
83
|
+
|
84
|
+
class Wechat < Base
|
85
|
+
attribute :type, Types.Value("wechat")
|
86
|
+
end
|
87
|
+
|
88
|
+
class Webmoney < Base
|
89
|
+
attribute :type, Types.Value("webmoney")
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
PaymentMethods = PaymentMethod::BankCard |
|
94
|
+
PaymentMethod::Alfabank |
|
95
|
+
PaymentMethod::YooMoney |
|
96
|
+
PaymentMethod::Sberbank |
|
97
|
+
PaymentMethod::ApplePay |
|
98
|
+
PaymentMethod::Cash |
|
99
|
+
PaymentMethod::DirectCarrierBilling |
|
100
|
+
PaymentMethod::GooglePay |
|
101
|
+
PaymentMethod::Installments |
|
102
|
+
PaymentMethod::Qiwi |
|
103
|
+
PaymentMethod::Tinkoff |
|
104
|
+
PaymentMethod::Wechat |
|
105
|
+
PaymentMethod::Webmoney
|
106
|
+
end
|
107
|
+
end
|
@@ -1,15 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative
|
3
|
+
require_relative "./types"
|
4
|
+
require_relative "./amount"
|
4
5
|
|
5
6
|
module Yookassa
|
6
7
|
module Entity
|
7
|
-
class Refund <
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
8
|
+
class Refund < Dry::Struct
|
9
|
+
attribute :id, Types::String
|
10
|
+
attribute? :idempotency_key, Types::String
|
11
|
+
attribute :status, Types::String
|
12
|
+
attribute :payment_id, Types::String
|
13
|
+
attribute :created_at, Types::String
|
14
|
+
attribute :amount, Entity::Amount
|
15
|
+
attribute? :receipt_registration, Types::String
|
16
|
+
attribute :description, Types::String
|
13
17
|
end
|
14
18
|
end
|
15
19
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "./types"
|
4
|
+
require_relative "./amount"
|
5
|
+
|
6
|
+
module Yookassa
|
7
|
+
module Entity
|
8
|
+
class Transfer < Dry::Struct
|
9
|
+
# account_id [string, required]
|
10
|
+
# ID of the store in favor of which you're accepting the receipt. Provided by YooMoney, displayed in the Sellers section
|
11
|
+
# of your Merchant Profile (shopId column).
|
12
|
+
attribute :account_id, Types::String
|
13
|
+
|
14
|
+
# amount [object, required]
|
15
|
+
# Amount to be transferred to the store.
|
16
|
+
attribute :amount, Entity::Amount
|
17
|
+
|
18
|
+
# status [string, required]
|
19
|
+
# Status of the money distribution between stores. Possible values: pending, waiting_for_capture, succeeded, canceled.
|
20
|
+
attribute :status, Types::String.enum("pending", "waiting_for_capture", "succeeded", "canceled")
|
21
|
+
|
22
|
+
# platform_fee_amount [object, optional]
|
23
|
+
# Commission for sold products or services charged in your favor.
|
24
|
+
attribute? :platform_fee_amount, Entity::Amount
|
25
|
+
|
26
|
+
# metadata [object, optional]
|
27
|
+
# Any additional data you might require for processing payments (for example, order number), specified as a “key-value” pair
|
28
|
+
# and returned in response from YooMoney. Limitations: no more than 16 keys, no more than 32 characters in the key’s title,
|
29
|
+
# no more than 512 characters in the key’s value, data type is a string in the UTF-8 format.
|
30
|
+
attribute? :metadata, Types::Hash
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "./entity/payment"
|
4
|
+
|
5
|
+
module Yookassa
|
6
|
+
class Payments
|
7
|
+
def initialize(api)
|
8
|
+
@api = api
|
9
|
+
end
|
10
|
+
|
11
|
+
def find(payment_id:)
|
12
|
+
data = api.get("payments/#{payment_id}")
|
13
|
+
Entity::Payment.new(**data)
|
14
|
+
end
|
15
|
+
|
16
|
+
def create(payment:, idempotency_key: SecureRandom.hex(10))
|
17
|
+
data = api.post("payments", payload: payment, idempotency_key: idempotency_key)
|
18
|
+
Entity::Payment.new(**data.merge(idempotency_key: idempotency_key))
|
19
|
+
end
|
20
|
+
|
21
|
+
def capture(payment_id:, idempotency_key: SecureRandom.hex(10))
|
22
|
+
data = api.post("payments/#{payment_id}/capture", idempotency_key: idempotency_key)
|
23
|
+
Entity::Payment.new(**data.merge(idempotency_key: idempotency_key))
|
24
|
+
end
|
25
|
+
|
26
|
+
def cancel(payment_id:, idempotency_key: SecureRandom.hex(10))
|
27
|
+
data = api.post("payments/#{payment_id}/cancel", idempotency_key: idempotency_key)
|
28
|
+
Entity::Payment.new(**data.merge(idempotency_key: idempotency_key))
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
attr_reader :api
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "./entity/refund"
|
4
|
+
|
5
|
+
module Yookassa
|
6
|
+
class Refunds
|
7
|
+
def initialize(api)
|
8
|
+
@api = api
|
9
|
+
end
|
10
|
+
|
11
|
+
def find(payment_id:)
|
12
|
+
data = api.get("refunds/#{payment_id}")
|
13
|
+
Entity::Refund.new(**data)
|
14
|
+
end
|
15
|
+
|
16
|
+
def create(payload:, idempotency_key: SecureRandom.hex(10))
|
17
|
+
data = api.post("refunds", payload: payload, idempotency_key: idempotency_key)
|
18
|
+
Entity::Refund.new(**data.merge(idempotency_key: idempotency_key))
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
attr_reader :api
|
24
|
+
end
|
25
|
+
end
|
data/lib/yookassa/version.rb
CHANGED
data/lib/yookassa.rb
CHANGED
@@ -1,13 +1,31 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
3
|
+
require "dry-struct"
|
4
|
+
require "forwardable"
|
5
|
+
require "yookassa/version"
|
6
|
+
require "yookassa/config"
|
7
|
+
require "yookassa/client"
|
8
|
+
|
9
|
+
module Yookassa
|
10
|
+
ConfigError = Class.new(StandardError)
|
11
|
+
|
12
|
+
class << self
|
13
|
+
extend Forwardable
|
14
|
+
|
15
|
+
def configure
|
16
|
+
yield(config)
|
17
|
+
end
|
18
|
+
|
19
|
+
def config
|
20
|
+
@config ||= Config.new
|
21
|
+
end
|
22
|
+
|
23
|
+
def client
|
24
|
+
raise ConfigError, "Specify `shop_id` and `api_key` settins in a `.configure` block" if @config.nil?
|
25
|
+
|
26
|
+
@client ||= Client.new(shop_id: @config.shop_id, api_key: @config.api_key)
|
27
|
+
end
|
28
|
+
|
29
|
+
def_delegators :client, :payments, :refunds
|
30
|
+
end
|
31
|
+
end
|
data/spec/fixtures/refund.json
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
{
|
2
2
|
"amount": {
|
3
|
-
|
4
|
-
|
5
|
-
},
|
6
|
-
"payment_id": "40484c25-1095-4d36-8b17-92672d1e127d",
|
3
|
+
"value": "8.00",
|
4
|
+
"currency": "RUB"
|
5
|
+
},
|
6
|
+
"payment_id": "40484c25-1095-4d36-8b17-92672d1e127d",
|
7
7
|
"description": "test refund, idem-key 40484c25-1095-4d36-8b17-92672d1e127d"
|
8
8
|
}
|
data/spec/spec_helper.rb
CHANGED
@@ -1,21 +1,16 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
begin
|
4
|
-
require
|
4
|
+
require "pry"
|
5
5
|
rescue LoadError
|
6
6
|
nil
|
7
7
|
end
|
8
8
|
|
9
|
-
require
|
10
|
-
require
|
9
|
+
require "yookassa"
|
10
|
+
require "webmock/rspec"
|
11
11
|
|
12
12
|
RSpec.configure do |config|
|
13
13
|
config.order = :random
|
14
14
|
config.filter_run focus: true
|
15
15
|
config.run_all_when_everything_filtered = true
|
16
|
-
|
17
|
-
config.around(:each) do |example|
|
18
|
-
stub_request(:any, //)
|
19
|
-
example.run
|
20
|
-
end
|
21
16
|
end
|