recurly 2.17.0 → 3.14.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/.bumpversion.cfg +15 -0
- data/.github/ISSUE_TEMPLATE/bug-report.md +30 -0
- data/.github/ISSUE_TEMPLATE/question-or-other.md +10 -0
- data/.github/workflows/docs.yml +28 -0
- data/.github_changelog_generator +8 -0
- data/.gitignore +15 -0
- data/.rspec +2 -0
- data/.travis.yml +13 -0
- data/.yardopts +2 -0
- data/CHANGELOG.md +313 -0
- data/CODE_OF_CONDUCT.md +130 -0
- data/CONTRIBUTING.md +106 -0
- data/GETTING_STARTED.md +319 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +9 -153
- data/Rakefile +6 -0
- data/benchmark.rb +16 -0
- data/lib/data/ca-certificates.crt +3466 -0
- data/lib/recurly/client/operations.rb +3665 -0
- data/lib/recurly/client.rb +353 -0
- data/lib/recurly/connection_pool.rb +40 -0
- data/lib/recurly/errors/api_errors.rb +83 -0
- data/lib/recurly/errors/network_errors.rb +10 -0
- data/lib/recurly/errors.rb +68 -0
- data/lib/recurly/http.rb +50 -0
- data/lib/recurly/pager.rb +146 -0
- data/lib/recurly/request.rb +31 -0
- data/lib/recurly/requests/account_acquisition_cost.rb +18 -0
- data/lib/recurly/requests/account_acquisition_updatable.rb +26 -0
- data/lib/recurly/requests/account_create.rb +90 -0
- data/lib/recurly/requests/account_purchase.rb +90 -0
- data/lib/recurly/requests/account_update.rb +78 -0
- data/lib/recurly/requests/add_on_create.rb +94 -0
- data/lib/recurly/requests/add_on_pricing.rb +18 -0
- data/lib/recurly/requests/add_on_update.rb +74 -0
- data/lib/recurly/requests/address.rb +46 -0
- data/lib/recurly/requests/billing_info_create.rb +110 -0
- data/lib/recurly/requests/coupon_bulk_create.rb +14 -0
- data/lib/recurly/requests/coupon_create.rb +94 -0
- data/lib/recurly/requests/coupon_pricing.rb +18 -0
- data/lib/recurly/requests/coupon_redemption_create.rb +18 -0
- data/lib/recurly/requests/coupon_update.rb +34 -0
- data/lib/recurly/requests/custom_field.rb +18 -0
- data/lib/recurly/requests/external_refund.rb +22 -0
- data/lib/recurly/requests/external_transaction.rb +26 -0
- data/lib/recurly/requests/invoice_address.rb +54 -0
- data/lib/recurly/requests/invoice_collect.rb +18 -0
- data/lib/recurly/requests/invoice_create.rb +42 -0
- data/lib/recurly/requests/invoice_refund.rb +34 -0
- data/lib/recurly/requests/invoice_updatable.rb +34 -0
- data/lib/recurly/requests/item_create.rb +58 -0
- data/lib/recurly/requests/item_update.rb +58 -0
- data/lib/recurly/requests/line_item_create.rb +82 -0
- data/lib/recurly/requests/line_item_refund.rb +22 -0
- data/lib/recurly/requests/measured_unit_create.rb +22 -0
- data/lib/recurly/requests/measured_unit_update.rb +22 -0
- data/lib/recurly/requests/plan_create.rb +98 -0
- data/lib/recurly/requests/plan_hosted_pages.rb +26 -0
- data/lib/recurly/requests/plan_pricing.rb +22 -0
- data/lib/recurly/requests/plan_update.rb +94 -0
- data/lib/recurly/requests/pricing.rb +18 -0
- data/lib/recurly/requests/purchase_create.rb +74 -0
- data/lib/recurly/requests/shipping_address_create.rb +62 -0
- data/lib/recurly/requests/shipping_address_update.rb +66 -0
- data/lib/recurly/requests/shipping_fee_create.rb +22 -0
- data/lib/recurly/requests/shipping_method_create.rb +26 -0
- data/lib/recurly/requests/shipping_method_update.rb +26 -0
- data/lib/recurly/requests/shipping_purchase.rb +22 -0
- data/lib/recurly/requests/subscription_add_on_create.rb +38 -0
- data/lib/recurly/requests/subscription_add_on_tier.rb +18 -0
- data/lib/recurly/requests/subscription_add_on_update.rb +42 -0
- data/lib/recurly/requests/subscription_cancel.rb +14 -0
- data/lib/recurly/requests/subscription_change_create.rb +66 -0
- data/lib/recurly/requests/subscription_change_shipping_create.rb +22 -0
- data/lib/recurly/requests/subscription_create.rb +106 -0
- data/lib/recurly/requests/subscription_pause.rb +14 -0
- data/lib/recurly/requests/subscription_purchase.rb +66 -0
- data/lib/recurly/requests/subscription_shipping_create.rb +30 -0
- data/lib/recurly/requests/subscription_shipping_purchase.rb +22 -0
- data/lib/recurly/requests/subscription_shipping_update.rb +22 -0
- data/lib/recurly/requests/subscription_update.rb +58 -0
- data/lib/recurly/requests/tier.rb +18 -0
- data/lib/recurly/requests/usage_create.rb +26 -0
- data/lib/recurly/requests.rb +8 -0
- data/lib/recurly/resource.rb +23 -1082
- data/lib/recurly/resources/account.rb +130 -0
- data/lib/recurly/resources/account_acquisition.rb +46 -0
- data/lib/recurly/resources/account_acquisition_cost.rb +18 -0
- data/lib/recurly/resources/account_balance.rb +26 -0
- data/lib/recurly/resources/account_balance_amount.rb +18 -0
- data/lib/recurly/resources/account_mini.rb +46 -0
- data/lib/recurly/resources/account_note.rb +34 -0
- data/lib/recurly/resources/add_on.rb +114 -0
- data/lib/recurly/resources/add_on_mini.rb +54 -0
- data/lib/recurly/resources/add_on_pricing.rb +18 -0
- data/lib/recurly/resources/address.rb +46 -0
- data/lib/recurly/resources/billing_info.rb +66 -0
- data/lib/recurly/resources/billing_info_updated_by.rb +18 -0
- data/lib/recurly/resources/binary_file.rb +14 -0
- data/lib/recurly/resources/coupon.rb +130 -0
- data/lib/recurly/resources/coupon_discount.rb +26 -0
- data/lib/recurly/resources/coupon_discount_pricing.rb +18 -0
- data/lib/recurly/resources/coupon_discount_trial.rb +18 -0
- data/lib/recurly/resources/coupon_mini.rb +42 -0
- data/lib/recurly/resources/coupon_redemption.rb +50 -0
- data/lib/recurly/resources/coupon_redemption_mini.rb +34 -0
- data/lib/recurly/resources/credit_payment.rb +66 -0
- data/lib/recurly/resources/custom_field.rb +18 -0
- data/lib/recurly/resources/custom_field_definition.rb +50 -0
- data/lib/recurly/resources/error.rb +22 -0
- data/lib/recurly/resources/error_may_have_transaction.rb +26 -0
- data/lib/recurly/resources/export_dates.rb +18 -0
- data/lib/recurly/resources/export_file.rb +22 -0
- data/lib/recurly/resources/export_files.rb +18 -0
- data/lib/recurly/resources/fraud_info.rb +22 -0
- data/lib/recurly/resources/invoice.rb +146 -0
- data/lib/recurly/resources/invoice_address.rb +54 -0
- data/lib/recurly/resources/invoice_collection.rb +22 -0
- data/lib/recurly/resources/invoice_mini.rb +30 -0
- data/lib/recurly/resources/item.rb +82 -0
- data/lib/recurly/resources/item_mini.rb +34 -0
- data/lib/recurly/resources/line_item.rb +198 -0
- data/lib/recurly/resources/line_item_list.rb +26 -0
- data/lib/recurly/resources/measured_unit.rb +46 -0
- data/lib/recurly/resources/payment_method.rb +66 -0
- data/lib/recurly/resources/plan.rb +118 -0
- data/lib/recurly/resources/plan_hosted_pages.rb +26 -0
- data/lib/recurly/resources/plan_mini.rb +26 -0
- data/lib/recurly/resources/plan_pricing.rb +22 -0
- data/lib/recurly/resources/pricing.rb +18 -0
- data/lib/recurly/resources/settings.rb +22 -0
- data/lib/recurly/resources/shipping_address.rb +82 -0
- data/lib/recurly/resources/shipping_method.rb +46 -0
- data/lib/recurly/resources/shipping_method_mini.rb +26 -0
- data/lib/recurly/resources/site.rb +54 -0
- data/lib/recurly/resources/subscription.rb +174 -0
- data/lib/recurly/resources/subscription_add_on.rb +66 -0
- data/lib/recurly/resources/subscription_add_on_tier.rb +18 -0
- data/lib/recurly/resources/subscription_change.rb +78 -0
- data/lib/recurly/resources/subscription_change_preview.rb +78 -0
- data/lib/recurly/resources/subscription_shipping.rb +26 -0
- data/lib/recurly/resources/tax_info.rb +22 -0
- data/lib/recurly/resources/tier.rb +18 -0
- data/lib/recurly/resources/transaction.rb +158 -0
- data/lib/recurly/resources/transaction_error.rb +38 -0
- data/lib/recurly/resources/transaction_payment_gateway.rb +26 -0
- data/lib/recurly/resources/unique_coupon_code.rb +50 -0
- data/lib/recurly/resources/usage.rb +70 -0
- data/lib/recurly/resources/user.rb +42 -0
- data/lib/recurly/resources.rb +18 -0
- data/lib/recurly/schema/file_parser.rb +13 -0
- data/lib/recurly/schema/json_parser.rb +72 -0
- data/lib/recurly/schema/request_caster.rb +60 -0
- data/lib/recurly/schema/resource_caster.rb +46 -0
- data/lib/recurly/schema/schema_factory.rb +48 -0
- data/lib/recurly/schema/schema_validator.rb +144 -0
- data/lib/recurly/schema.rb +156 -0
- data/lib/recurly/version.rb +1 -15
- data/lib/recurly.rb +15 -137
- data/openapi/api.yaml +21024 -0
- data/recurly.gemspec +39 -0
- data/scripts/build +5 -0
- data/scripts/bump +11 -0
- data/scripts/changelog +14 -0
- data/scripts/clean +6 -0
- data/scripts/format +12 -0
- data/scripts/prepare-release +36 -0
- data/scripts/release +32 -0
- data/scripts/test +15 -0
- metadata +206 -168
- data/lib/recurly/account.rb +0 -169
- data/lib/recurly/account_balance.rb +0 -21
- data/lib/recurly/add_on.rb +0 -30
- data/lib/recurly/address.rb +0 -25
- data/lib/recurly/adjustment.rb +0 -76
- data/lib/recurly/api/errors.rb +0 -206
- data/lib/recurly/api/net_http_adapter.rb +0 -111
- data/lib/recurly/api.rb +0 -101
- data/lib/recurly/billing_info.rb +0 -80
- data/lib/recurly/coupon.rb +0 -134
- data/lib/recurly/credit_payment.rb +0 -28
- data/lib/recurly/custom_field.rb +0 -15
- data/lib/recurly/delivery.rb +0 -19
- data/lib/recurly/error.rb +0 -13
- data/lib/recurly/gift_card.rb +0 -79
- data/lib/recurly/helper.rb +0 -51
- data/lib/recurly/invoice.rb +0 -268
- data/lib/recurly/invoice_collection.rb +0 -14
- data/lib/recurly/js.rb +0 -14
- data/lib/recurly/juris_detail.rb +0 -14
- data/lib/recurly/measured_unit.rb +0 -16
- data/lib/recurly/money.rb +0 -120
- data/lib/recurly/plan.rb +0 -40
- data/lib/recurly/purchase.rb +0 -219
- data/lib/recurly/redemption.rb +0 -46
- data/lib/recurly/resource/association.rb +0 -16
- data/lib/recurly/resource/errors.rb +0 -20
- data/lib/recurly/resource/pager.rb +0 -314
- data/lib/recurly/shipping_address.rb +0 -22
- data/lib/recurly/subscription/add_ons.rb +0 -77
- data/lib/recurly/subscription.rb +0 -325
- data/lib/recurly/subscription_add_on.rb +0 -50
- data/lib/recurly/tax_detail.rb +0 -14
- data/lib/recurly/tax_type.rb +0 -12
- data/lib/recurly/transaction/errors.rb +0 -107
- data/lib/recurly/transaction.rb +0 -116
- data/lib/recurly/usage.rb +0 -24
- data/lib/recurly/webhook/account_notification.rb +0 -10
- data/lib/recurly/webhook/billing_info_updated_notification.rb +0 -6
- data/lib/recurly/webhook/canceled_account_notification.rb +0 -6
- data/lib/recurly/webhook/canceled_subscription_notification.rb +0 -6
- data/lib/recurly/webhook/closed_credit_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/closed_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/credit_payment_notification.rb +0 -12
- data/lib/recurly/webhook/dunning_notification.rb +0 -14
- data/lib/recurly/webhook/expired_subscription_notification.rb +0 -6
- data/lib/recurly/webhook/failed_charge_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/failed_payment_notification.rb +0 -6
- data/lib/recurly/webhook/gift_card_notification.rb +0 -8
- data/lib/recurly/webhook/invoice_notification.rb +0 -12
- data/lib/recurly/webhook/new_account_notification.rb +0 -6
- data/lib/recurly/webhook/new_charge_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/new_credit_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/new_credit_payment_notification.rb +0 -6
- data/lib/recurly/webhook/new_dunning_event_notification.rb +0 -6
- data/lib/recurly/webhook/new_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/new_subscription_notification.rb +0 -6
- data/lib/recurly/webhook/new_usage_notification.rb +0 -8
- data/lib/recurly/webhook/notification.rb +0 -18
- data/lib/recurly/webhook/paid_charge_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/past_due_charge_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/past_due_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/processing_charge_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/processing_credit_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/processing_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/processing_payment_notification.rb +0 -6
- data/lib/recurly/webhook/purchased_gift_card_notification.rb +0 -7
- data/lib/recurly/webhook/reactivated_account_notification.rb +0 -6
- data/lib/recurly/webhook/redeemed_gift_card_notification.rb +0 -7
- data/lib/recurly/webhook/renewed_subscription_notification.rb +0 -6
- data/lib/recurly/webhook/reopened_charge_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/reopened_credit_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/scheduled_payment_notification.rb +0 -6
- data/lib/recurly/webhook/subscription_notification.rb +0 -12
- data/lib/recurly/webhook/successful_payment_notification.rb +0 -6
- data/lib/recurly/webhook/successful_refund_notification.rb +0 -6
- data/lib/recurly/webhook/transaction_authorized_notification.rb +0 -6
- data/lib/recurly/webhook/transaction_notification.rb +0 -12
- data/lib/recurly/webhook/updated_account_notification.rb +0 -6
- data/lib/recurly/webhook/updated_balance_gift_card_notification.rb +0 -7
- data/lib/recurly/webhook/updated_subscription_notification.rb +0 -6
- data/lib/recurly/webhook/void_payment_notification.rb +0 -6
- data/lib/recurly/webhook/voided_credit_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/voided_credit_payment_notification.rb +0 -6
- data/lib/recurly/webhook.rb +0 -88
- data/lib/recurly/xml/nokogiri.rb +0 -58
- data/lib/recurly/xml/rexml.rb +0 -50
- data/lib/recurly/xml.rb +0 -120
data/lib/recurly/purchase.rb
DELETED
@@ -1,219 +0,0 @@
|
|
1
|
-
module Recurly
|
2
|
-
# The Purchase object works in a slightly different way than the rest of the models.
|
3
|
-
# You build up the purchase data into an object then pass to either:
|
4
|
-
# {Purchase.invoice!} or {Purchase.preview!} and it will
|
5
|
-
# return an {InvoiceCollection}.
|
6
|
-
#
|
7
|
-
# You can build your purchase object with a new account or an existing account.
|
8
|
-
# For an existing account, you just need an account_code:
|
9
|
-
# Recurly::Purchase.new({account: {account_code: 'myexistingaccount'}})
|
10
|
-
# or
|
11
|
-
# account = Recurly::Account.find('existing_account')
|
12
|
-
# Recurly::Purchase.new({account: account})
|
13
|
-
# or
|
14
|
-
# account = Recurly::Account.find('existing_account')
|
15
|
-
# purchase = Recurly::Purchase.new
|
16
|
-
# purchase.account = account
|
17
|
-
#
|
18
|
-
# For a new account, you can pass in {Account} data, {BillingInfo} data, etc
|
19
|
-
# in the same way you would when creating a {Subscription} with a new account.
|
20
|
-
#
|
21
|
-
# You can also pass in adjustments and invoicing data to be added to the invoice.
|
22
|
-
#
|
23
|
-
# There are multiple ways to set the shipping addresses:
|
24
|
-
# 1. Use {Purchase#shipping_address_id} If you want to apply an existing shipping
|
25
|
-
# address to all subscriptions and adjustments in this purchase.
|
26
|
-
# 2. Add multiple shipping addresses to {Account#shipping_addresses}. The last
|
27
|
-
# address in the list will apply to all subscriptions and adjustments
|
28
|
-
# in this purchase.
|
29
|
-
# 3. Use {Subscription#shipping_address_id} or {Subscription#shipping_address}
|
30
|
-
# to set a shipping address for only the subscription.
|
31
|
-
# 4. Use {Adjustment#shipping_address_id} or {Adjustment#shipping_address}
|
32
|
-
# to set a shipping address for only the adjustment.
|
33
|
-
#
|
34
|
-
# @example
|
35
|
-
# require 'securerandom'
|
36
|
-
#
|
37
|
-
# purchase = Recurly::Purchase.new(
|
38
|
-
# currency: 'USD',
|
39
|
-
# collection_method: :automatic,
|
40
|
-
# account: {
|
41
|
-
# account_code: SecureRandom.uuid,
|
42
|
-
# shipping_addresses: [
|
43
|
-
# {
|
44
|
-
# first_name: 'Benjamin',
|
45
|
-
# last_name: 'Du Monde',
|
46
|
-
# address1: '400 Dolores St.',
|
47
|
-
# city: 'San Francisco',
|
48
|
-
# state: 'CA',
|
49
|
-
# zip: '94110',
|
50
|
-
# country: 'US',
|
51
|
-
# nickname: 'Home'
|
52
|
-
# }
|
53
|
-
# ],
|
54
|
-
# billing_info: {
|
55
|
-
# first_name: 'Benjamin',
|
56
|
-
# last_name: 'Du Monde',
|
57
|
-
# address1: '400 Alabama St.',
|
58
|
-
# city: 'San Francisco',
|
59
|
-
# state: 'CA',
|
60
|
-
# zip: '94110',
|
61
|
-
# country: 'US',
|
62
|
-
# number: '4111-1111-1111-1111',
|
63
|
-
# month: 12,
|
64
|
-
# year: 2019,
|
65
|
-
# }
|
66
|
-
# },
|
67
|
-
# adjustments: [
|
68
|
-
# {
|
69
|
-
# product_code: 'product_1',
|
70
|
-
# unit_amount_in_cents: 1000,
|
71
|
-
# quantity: 1,
|
72
|
-
# revenue_schedule_type: :at_invoice
|
73
|
-
# },
|
74
|
-
# {
|
75
|
-
# product_code: 'product_2',
|
76
|
-
# unit_amount_in_cents: 3000,
|
77
|
-
# quantity: 5,
|
78
|
-
# revenue_schedule_type: :at_invoice
|
79
|
-
# }
|
80
|
-
# ]
|
81
|
-
# )
|
82
|
-
#
|
83
|
-
# begin
|
84
|
-
# preview_collection = Recurly::Purchase.preview!(purchase)
|
85
|
-
# puts preview_collection.inspect
|
86
|
-
# rescue Recurly::Resource::Invalid => e
|
87
|
-
# # Invalid data
|
88
|
-
# end
|
89
|
-
#
|
90
|
-
# begin
|
91
|
-
# invoice_collection = Recurly::Purchase.invoice!(purchase)
|
92
|
-
# puts invoice_collection.inspect
|
93
|
-
# rescue Recurly::Resource::Invalid => e
|
94
|
-
# # Invalid data
|
95
|
-
# rescue Recurly::Transaction::DeclinedError => e
|
96
|
-
# # Display e.message and/or subscription (and associated) errors...
|
97
|
-
# rescue Recurly::Transaction::RetryableError => e
|
98
|
-
# # You should be able to attempt to save this again later.
|
99
|
-
# rescue Recurly::Transaction::Error => e
|
100
|
-
# # Fallback transaction error
|
101
|
-
# # e.transaction
|
102
|
-
# # e.transaction_error_code
|
103
|
-
# end
|
104
|
-
class Purchase < Resource
|
105
|
-
# @return [[Adjustment], nil]
|
106
|
-
has_many :adjustments, class_name: :Adjustment, readonly: false
|
107
|
-
|
108
|
-
# @return [Account, nil]
|
109
|
-
has_one :account, class_name: :Account, readonly: false
|
110
|
-
|
111
|
-
# @return [GiftCard, nil]
|
112
|
-
has_one :gift_card, class_name: :GiftCard, readonly: false
|
113
|
-
|
114
|
-
# @return [[Subscription], nil]
|
115
|
-
has_many :subscriptions, class_name: :Subscription, readonly: false
|
116
|
-
|
117
|
-
define_attribute_methods %w(
|
118
|
-
currency
|
119
|
-
collection_method
|
120
|
-
po_number
|
121
|
-
net_terms
|
122
|
-
coupon_codes
|
123
|
-
terms_and_conditions
|
124
|
-
customer_notes
|
125
|
-
vat_reverse_charge_notes
|
126
|
-
shipping_address_id
|
127
|
-
gateway_code
|
128
|
-
)
|
129
|
-
|
130
|
-
class << self
|
131
|
-
|
132
|
-
# Generate an invoice for the purchase and run any needed transactions.
|
133
|
-
#
|
134
|
-
# @param purchase [Purchase] The purchase data for the request.
|
135
|
-
# @return [InvoiceCollection] The saved invoice(s) representing this purchase.
|
136
|
-
# @raise [Invalid] Raised if the purchase cannot be invoiced.
|
137
|
-
# @raise [Transaction::Error] Raised if the transaction failed.
|
138
|
-
def invoice!(purchase)
|
139
|
-
post(purchase, collection_path)
|
140
|
-
end
|
141
|
-
|
142
|
-
# Generate a preview invoice for the purchase. Runs validations
|
143
|
-
# but does not run any transactions.
|
144
|
-
#
|
145
|
-
# @param purchase [Purchase] The purchase data for the request.
|
146
|
-
# @return [InvoiceCollection] The preview invoice(s) representing this purchase.
|
147
|
-
# @raise [Invalid] Raised if the purchase cannot be invoiced.
|
148
|
-
def preview!(purchase)
|
149
|
-
post(purchase, "#{collection_path}/preview")
|
150
|
-
end
|
151
|
-
|
152
|
-
# Generate an authorized invoice for the purchase. Runs validations
|
153
|
-
# but does not run any transactions. This endpoint will create a
|
154
|
-
# pending purchase that can be activated at a later time once payment
|
155
|
-
# has been completed on an external source (e.g. Adyen's Hosted
|
156
|
-
# Payment Pages).
|
157
|
-
#
|
158
|
-
# @param purchase [Purchase] The purchase data for the request.
|
159
|
-
# @return [InvoiceCollection] The authorized invoice collection representing this purchase.
|
160
|
-
# @raise [Invalid] Raised if the purchase cannot be invoiced.
|
161
|
-
def authorize!(purchase)
|
162
|
-
post(purchase, "#{collection_path}/authorize")
|
163
|
-
end
|
164
|
-
|
165
|
-
# Use for Adyen HPP transaction requests. Runs validations
|
166
|
-
# but does not run any transactions.
|
167
|
-
#
|
168
|
-
# @param purchase [Purchase] The purchase data for the request.
|
169
|
-
# @return [InvoiceCollection] The authorized invoice collection representing this purchase.
|
170
|
-
# @raise [Invalid] Raised if the purchase cannot be invoiced.
|
171
|
-
def pending!(purchase)
|
172
|
-
post(purchase, "#{collection_path}/pending")
|
173
|
-
end
|
174
|
-
|
175
|
-
# Allows the merchant to cancel an authorization.
|
176
|
-
#
|
177
|
-
# @param transaction_uuid [String] The uuid for the transaction representing the authorization. Can typically be found at invoice_collection.charge_invoice.transactions.first.uuid.
|
178
|
-
# @return [InvoiceCollection] The canceled invoice collection.
|
179
|
-
# @raise [Invalid] Raised if the authorization cannot be canceled.
|
180
|
-
def cancel!(transaction_uuid)
|
181
|
-
post(nil, "#{collection_path}/transaction-uuid-#{transaction_uuid}/cancel")
|
182
|
-
end
|
183
|
-
|
184
|
-
# Allows the merchants to initiate a capture transaction tied to the original authorization.
|
185
|
-
#
|
186
|
-
# @param transaction_uuid [String] The uuid for the transaction representing the authorization. Can typically be found at invoice_collection.charge_invoice.transactions.first.uuid.
|
187
|
-
# @return [InvoiceCollection] The captured invoice collection.
|
188
|
-
# @raise [Invalid] Raised if the authorization cannot be captured.
|
189
|
-
def capture!(transaction_uuid)
|
190
|
-
post(nil, "#{collection_path}/transaction-uuid-#{transaction_uuid}/capture")
|
191
|
-
end
|
192
|
-
|
193
|
-
def post(purchase, path)
|
194
|
-
body = purchase.nil? ? nil : purchase.to_xml
|
195
|
-
response = API.send(:post, path, body)
|
196
|
-
InvoiceCollection.from_response(response)
|
197
|
-
rescue API::UnprocessableEntity => e
|
198
|
-
purchase.apply_errors(e) if purchase
|
199
|
-
Transaction::Error.validate!(e, nil)
|
200
|
-
raise Resource::Invalid.new(purchase)
|
201
|
-
end
|
202
|
-
end
|
203
|
-
|
204
|
-
# TODO
|
205
|
-
# This is a temporary solution which allows us to
|
206
|
-
# embed these resources in a purchase without changing their
|
207
|
-
# interface. It will be removed once we get rid of default_currency.
|
208
|
-
def to_xml(options = {})
|
209
|
-
subscriptions.each {|s| s.currency = nil}
|
210
|
-
adjustments.each {|a| a.currency = nil}
|
211
|
-
super(options)
|
212
|
-
end
|
213
|
-
|
214
|
-
# This object does not represent a model on the server side
|
215
|
-
# so we do not need to expose these methods.
|
216
|
-
protected(*%w(save save!))
|
217
|
-
private_class_method(*%w(all find_each first paginate scoped where post create! create))
|
218
|
-
end
|
219
|
-
end
|
data/lib/recurly/redemption.rb
DELETED
@@ -1,46 +0,0 @@
|
|
1
|
-
module Recurly
|
2
|
-
# Redemptions are not top-level resources, but they can be accessed (and
|
3
|
-
# created) through {Coupon} instances.
|
4
|
-
#
|
5
|
-
# @example
|
6
|
-
# coupon = Coupon.find("summer2011")
|
7
|
-
# coupon.redemptions.each { |r| p r }
|
8
|
-
# coupon.redeem Account.find("groupon_lover")
|
9
|
-
class Redemption < Resource
|
10
|
-
# @return [Coupon]
|
11
|
-
belongs_to :coupon
|
12
|
-
|
13
|
-
# @return [Account]
|
14
|
-
belongs_to :account, :readonly => false
|
15
|
-
|
16
|
-
# @return [Subscription]
|
17
|
-
belongs_to :subscription
|
18
|
-
|
19
|
-
# @return [Invoice]
|
20
|
-
belongs_to :invoice
|
21
|
-
|
22
|
-
define_attribute_methods %w(
|
23
|
-
uuid
|
24
|
-
single_use
|
25
|
-
total_discounted_in_cents
|
26
|
-
currency
|
27
|
-
state
|
28
|
-
coupon_code
|
29
|
-
subscription_uuid
|
30
|
-
created_at
|
31
|
-
updated_at
|
32
|
-
)
|
33
|
-
|
34
|
-
def save
|
35
|
-
return false if persisted?
|
36
|
-
copy_from coupon.redeem account, currency
|
37
|
-
true
|
38
|
-
rescue Recurly::API::UnprocessableEntity => e
|
39
|
-
apply_errors e
|
40
|
-
false
|
41
|
-
end
|
42
|
-
|
43
|
-
# Redemptions are only writeable through {Coupon} instances.
|
44
|
-
embedded!
|
45
|
-
end
|
46
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
module Recurly
|
2
|
-
class Resource
|
3
|
-
class Association
|
4
|
-
attr_reader :relation, :resource_class
|
5
|
-
|
6
|
-
def initialize relation, resource_class, options = {}
|
7
|
-
@relation, @resource_class, @options = relation, resource_class, options
|
8
|
-
end
|
9
|
-
|
10
|
-
def class_name
|
11
|
-
return @class_name if defined? @class_name
|
12
|
-
@class_name = @options[:class_name]
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
module Recurly
|
2
|
-
class Resource
|
3
|
-
class Errors < Hash
|
4
|
-
def [] key
|
5
|
-
super key.to_s
|
6
|
-
end
|
7
|
-
|
8
|
-
def []= key, value
|
9
|
-
super key.to_s, value
|
10
|
-
end
|
11
|
-
|
12
|
-
def full_messages
|
13
|
-
map { |attribute, messages|
|
14
|
-
attribute_name = attribute.capitalize.gsub('_', ' ')
|
15
|
-
messages.map { |message| "#{attribute_name} #{message}." }
|
16
|
-
}.flatten
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,314 +0,0 @@
|
|
1
|
-
require 'erb'
|
2
|
-
|
3
|
-
module Recurly
|
4
|
-
class Resource
|
5
|
-
# Pages through an index resource, yielding records as it goes. It's rare
|
6
|
-
# to instantiate one on its own: use {Resource.paginate},
|
7
|
-
# {Resource.find_each}, and <tt>Resource#{has_many_association}</tt>
|
8
|
-
# instead.
|
9
|
-
#
|
10
|
-
# Because pagers handle +has_many+ associations, pagers can also build and
|
11
|
-
# create child records.
|
12
|
-
#
|
13
|
-
# @example Through a resource class:
|
14
|
-
# Recurly::Account.paginate # => #<Recurly::Resource::Pager...>
|
15
|
-
#
|
16
|
-
# Recurly::Account.find_each { |a| p a }
|
17
|
-
# @example Through an resource instance:
|
18
|
-
# account.transactions
|
19
|
-
# # => #<Recurly::Resource::Pager...>
|
20
|
-
#
|
21
|
-
# account.transactions.new(attributes) # or #create, or #create!
|
22
|
-
# # => #<Recurly::Transaction ...>
|
23
|
-
#
|
24
|
-
# account.transactions.find_each do |transaction|
|
25
|
-
# puts transaction
|
26
|
-
# end
|
27
|
-
# @example Iterate through a page of invoices at a time
|
28
|
-
# opts = {
|
29
|
-
# order: :desc,
|
30
|
-
# state: :collected
|
31
|
-
# }
|
32
|
-
# invoices = Recurly::Invoice.paginate(opts)
|
33
|
-
# begin
|
34
|
-
# invoices.each do |invoice|
|
35
|
-
# puts invoice.invoice_number
|
36
|
-
# end
|
37
|
-
# puts "fetching next page..."
|
38
|
-
# end while invoices.next
|
39
|
-
# @example Passing sorting and filtering parameters
|
40
|
-
# opts = {
|
41
|
-
# begin_time: DateTime.new(2016,1,1),
|
42
|
-
# end_time: DateTime.new(2017,1,1),
|
43
|
-
# sort: :updated_at,
|
44
|
-
# order: :desc,
|
45
|
-
# state: :collected
|
46
|
-
# }
|
47
|
-
# Recurly::Invoice.find_each(opts) do |invoice|
|
48
|
-
# puts invoice
|
49
|
-
# end
|
50
|
-
#
|
51
|
-
class Pager
|
52
|
-
include Enumerable
|
53
|
-
|
54
|
-
# @return [Resource] The resource class of the pager.
|
55
|
-
attr_reader :resource_class
|
56
|
-
|
57
|
-
# @return [Hash, nil] A hash of links to which the pager can page.
|
58
|
-
attr_reader :links
|
59
|
-
|
60
|
-
# @return [String, nil] An ETag for the current page.
|
61
|
-
attr_reader :etag
|
62
|
-
|
63
|
-
# A pager for paginating through resource records.
|
64
|
-
#
|
65
|
-
# @param resource_class [Resource] The resource to be paginated.
|
66
|
-
# @param options [Hash] A hash of pagination options.
|
67
|
-
# @option options [Integer] :per_page The number of records returned per
|
68
|
-
# page.
|
69
|
-
# @option options [DateTime, Time, Integer] :cursor A timestamp that the
|
70
|
-
# pager will skim back to and return records created before it.
|
71
|
-
# @option options [String] :etag When set, will raise {API::NotModified}
|
72
|
-
# if the loaded page content has not changed.
|
73
|
-
# @option options [String] :uri The default location the pager will
|
74
|
-
# request.
|
75
|
-
# @option options [String, Symbol] :sort The attribute that will be used to order
|
76
|
-
# records: <tt>created_at</tt>, <tt>updated_at</tt>. Defaults to <tt>created_at</tt>.
|
77
|
-
# @option options [String, Symbol] :order The order in which records will be
|
78
|
-
# returned: <tt>asc</tt> for ascending order, <tt>desc</tt> for descending order.
|
79
|
-
# Defaults to <tt>desc</tt>.
|
80
|
-
# @option options [DateTime, String] :begin_time Operates on the attribute specified by the
|
81
|
-
# <tt>sort</tt> parameter. Filters records to only include those with datetimes
|
82
|
-
# greater than or equal to the supplied datetime. Accepts an ISO 8601
|
83
|
-
# date or date and time.
|
84
|
-
# @option options [DateTime, String] :end_time Operates on the attribute specified by
|
85
|
-
# the <tt>sort</tt> parameter. Filters records to only include those with
|
86
|
-
# datetimes less than or equal to the supplied datetime. Accepts an
|
87
|
-
# ISO 8601 date or date and time.
|
88
|
-
# @raise [API::NotModified] If the <tt>:etag</tt> option is set and
|
89
|
-
# matches the server's.
|
90
|
-
def initialize resource_class, options = {}
|
91
|
-
options[:cursor] &&= options[:cursor].to_i
|
92
|
-
@parent = options.delete :parent
|
93
|
-
@uri = options.delete :uri
|
94
|
-
@etag = options.delete :etag
|
95
|
-
@resource_class, @options = resource_class, options
|
96
|
-
@collection = nil
|
97
|
-
end
|
98
|
-
|
99
|
-
# This will tell you if there are any associated resources
|
100
|
-
# on the server by checking the presence of a link in the xml
|
101
|
-
#
|
102
|
-
# @example
|
103
|
-
# # if <invoices href="..." /> is present, will return true
|
104
|
-
# account.invoices.any?
|
105
|
-
# #=> true
|
106
|
-
# @return [Boolean] whether or not the xml element is present
|
107
|
-
def any?
|
108
|
-
!@uri.nil?
|
109
|
-
end
|
110
|
-
|
111
|
-
# @return [String] The URI of the paginated resource.
|
112
|
-
def uri
|
113
|
-
@uri ||= resource_class.collection_path
|
114
|
-
end
|
115
|
-
|
116
|
-
# Calls the server to get the count of server side resources.
|
117
|
-
#
|
118
|
-
# @example Count collected invoices in 2016
|
119
|
-
# opts = {
|
120
|
-
# begin_time: DateTime.new(2016,1,1),
|
121
|
-
# end_time: DateTime.new(2017,1,1),
|
122
|
-
# state: :collected
|
123
|
-
# }
|
124
|
-
# count = Recurly::Invoice.paginate(opts).count
|
125
|
-
# #=> 42
|
126
|
-
#
|
127
|
-
# @return [Integer] The total record count of the resource in question.
|
128
|
-
# @see Resource.count
|
129
|
-
def count
|
130
|
-
API.head(uri, @options)['X-Records'].to_i
|
131
|
-
end
|
132
|
-
|
133
|
-
# @return [Array] Iterates through the current page of records.
|
134
|
-
# @yield [record]
|
135
|
-
def each
|
136
|
-
return enum_for :each unless block_given?
|
137
|
-
load! unless @collection
|
138
|
-
@collection.each { |record| yield record }
|
139
|
-
end
|
140
|
-
|
141
|
-
# @return [nil]
|
142
|
-
# @see Resource.find_each
|
143
|
-
# @yield [record]
|
144
|
-
def find_each
|
145
|
-
return enum_for :find_each unless block_given?
|
146
|
-
begin
|
147
|
-
each { |record| yield record }
|
148
|
-
end while self.next
|
149
|
-
end
|
150
|
-
|
151
|
-
# @return [Array, nil] Refreshes the pager's collection of records with
|
152
|
-
# the next page.
|
153
|
-
def next
|
154
|
-
load_from links['next'], nil if links.key? 'next'
|
155
|
-
end
|
156
|
-
|
157
|
-
# @return [Array, nil] Refreshes the pager's collection of records with
|
158
|
-
# the previous page.
|
159
|
-
def prev
|
160
|
-
load_from links['prev'], nil if links.key? 'prev'
|
161
|
-
end
|
162
|
-
|
163
|
-
# @return [Array, nil] Refreshes the pager's collection of records with
|
164
|
-
# the first page.
|
165
|
-
def start
|
166
|
-
load_from links['start'], nil if links.key? 'start'
|
167
|
-
end
|
168
|
-
|
169
|
-
# @return [Array, nil] Load (or reload) the pager's collection from the
|
170
|
-
# original, supplied options.
|
171
|
-
def load!
|
172
|
-
load_from uri, @options
|
173
|
-
end
|
174
|
-
alias reload load!
|
175
|
-
|
176
|
-
|
177
|
-
# @return [Pager] Duplicates the pager, updating it with the options
|
178
|
-
# supplied. Useful for resource scopes.
|
179
|
-
# @option options [String, Symbol] :sort The attribute that will be used to order
|
180
|
-
# records: <tt>created_at</tt>, <tt>updated_at</tt>. Defaults to <tt>created_at</tt>.
|
181
|
-
# @option options [String, Symbol] :order The order in which records will be
|
182
|
-
# returned: <tt>asc</tt> for ascending order, <tt>desc</tt> for descending order.
|
183
|
-
# Defaults to <tt>desc</tt>.
|
184
|
-
# @option options [DateTime, String] :begin_time Operates on the attribute specified by the
|
185
|
-
# <tt>sort</tt> parameter. Filters records to only include those with datetimes
|
186
|
-
# greater than or equal to the supplied datetime. Accepts an ISO 8601
|
187
|
-
# date or date and time.
|
188
|
-
# @option options [DateTime, String] :end_time Operates on the attribute specified by
|
189
|
-
# the <tt>sort</tt> parameter. Filters records to only include those with
|
190
|
-
# datetimes less than or equal to the supplied datetime. Accepts an
|
191
|
-
# ISO 8601 date or date and time.
|
192
|
-
# @example
|
193
|
-
# Recurly::Account.paginate(sort: :updated_at, per_page: 20)
|
194
|
-
def paginate(options = {})
|
195
|
-
dup.instance_eval {
|
196
|
-
@collection = @etag = nil
|
197
|
-
@options = @options.merge options
|
198
|
-
self
|
199
|
-
}
|
200
|
-
end
|
201
|
-
alias scoped paginate
|
202
|
-
alias where paginate
|
203
|
-
|
204
|
-
def all options = {}
|
205
|
-
paginate(options).to_a
|
206
|
-
end
|
207
|
-
|
208
|
-
# Instantiates a new record in the scope of the pager.
|
209
|
-
#
|
210
|
-
# @return [Resource] A new record.
|
211
|
-
# @example
|
212
|
-
# account = Recurly::Account.find 'schrader'
|
213
|
-
# subscription = account.subscriptions.new attributes
|
214
|
-
# @see Resource.new
|
215
|
-
def new attributes = {}
|
216
|
-
record = resource_class.send(:new, attributes) { |r|
|
217
|
-
r.attributes[@parent.class.member_name] ||= @parent if @parent
|
218
|
-
r.uri = uri
|
219
|
-
}
|
220
|
-
yield record if block_given?
|
221
|
-
record
|
222
|
-
end
|
223
|
-
|
224
|
-
# Instantiates and saves a record in the scope of the pager.
|
225
|
-
#
|
226
|
-
# @return [Resource] The record.
|
227
|
-
# @raise [Transaction::Error] A monetary transaction failed.
|
228
|
-
# @example
|
229
|
-
# account = Recurly::Account.find 'schrader'
|
230
|
-
# subscription = account.subscriptions.create attributes
|
231
|
-
# @see Resource.create
|
232
|
-
def create attributes = {}
|
233
|
-
new(attributes) { |record| record.save }
|
234
|
-
end
|
235
|
-
|
236
|
-
# Instantiates a record in the scope of the pager.
|
237
|
-
#
|
238
|
-
# @return [Resource] The record.
|
239
|
-
# @example
|
240
|
-
# account = Recurly::Account.find 'schrader'
|
241
|
-
# subscription = account.subscriptions.build attributes
|
242
|
-
# @see Resource.new
|
243
|
-
def build attributes = {}
|
244
|
-
new(attributes)
|
245
|
-
end
|
246
|
-
|
247
|
-
# Instantiates and saves a record in the scope of the pager.
|
248
|
-
#
|
249
|
-
# @return [Resource] The saved record.
|
250
|
-
# @raise [Invalid] The record is invalid.
|
251
|
-
# @raise [Transaction::Error] A monetary transaction failed.
|
252
|
-
# @example
|
253
|
-
# account = Recurly::Account.find 'schrader'
|
254
|
-
# subscription = account.subscriptions.create! attributes
|
255
|
-
# @see Resource.create!
|
256
|
-
def create! attributes = {}
|
257
|
-
new(attributes) { |record| record.save! }
|
258
|
-
end
|
259
|
-
|
260
|
-
def find uuid
|
261
|
-
if resource_class.respond_to? :find
|
262
|
-
raise NoMethodError, "#find must be called on #{resource_class} directly"
|
263
|
-
end
|
264
|
-
|
265
|
-
resource_class.from_response API.get("#{uri}/#{ERB::Util.url_encode(uuid)}")
|
266
|
-
end
|
267
|
-
|
268
|
-
# @return [true, false]
|
269
|
-
# @see Object#respond_to?
|
270
|
-
def respond_to? method_name, include_private = false
|
271
|
-
super || [].respond_to?(method_name, include_private)
|
272
|
-
end
|
273
|
-
|
274
|
-
private
|
275
|
-
|
276
|
-
def load_from uri, params
|
277
|
-
options = {}
|
278
|
-
options[:head] = { 'If-None-Match' => etag } if etag
|
279
|
-
response = API.get uri, params, options
|
280
|
-
|
281
|
-
@etag = response['ETag']
|
282
|
-
@links = {}
|
283
|
-
if links = response['Link']
|
284
|
-
links.scan(/<([^>]+)>; rel="([^"]+)"/).each do |link, rel|
|
285
|
-
@links[rel] = link.freeze
|
286
|
-
end
|
287
|
-
end
|
288
|
-
@links.freeze
|
289
|
-
|
290
|
-
@collection = []
|
291
|
-
document = XML.new response.body
|
292
|
-
document.each_element(resource_class.member_name) do |el|
|
293
|
-
record = resource_class.from_xml el
|
294
|
-
record.attributes[@parent.class.member_name] = @parent if @parent
|
295
|
-
@collection << record
|
296
|
-
end
|
297
|
-
@collection.freeze
|
298
|
-
rescue API::NotModified
|
299
|
-
@collection and @collection or raise
|
300
|
-
end
|
301
|
-
|
302
|
-
def method_missing name, *args, &block
|
303
|
-
scope = resource_class.scopes[name] and return paginate scope
|
304
|
-
|
305
|
-
if [].respond_to? name
|
306
|
-
load! unless @collection
|
307
|
-
return @collection.send name, *args, &block
|
308
|
-
end
|
309
|
-
|
310
|
-
super
|
311
|
-
end
|
312
|
-
end
|
313
|
-
end
|
314
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
module Recurly
|
2
|
-
# Recurly Documentation: https://dev.recurly.com/docs/list-accounts-shipping-address
|
3
|
-
class ShippingAddress < Resource
|
4
|
-
define_attribute_methods %w(
|
5
|
-
id
|
6
|
-
address1
|
7
|
-
address2
|
8
|
-
first_name
|
9
|
-
last_name
|
10
|
-
city
|
11
|
-
state
|
12
|
-
zip
|
13
|
-
country
|
14
|
-
phone
|
15
|
-
nickname
|
16
|
-
company
|
17
|
-
email
|
18
|
-
geo_code
|
19
|
-
)
|
20
|
-
alias to_param address1
|
21
|
-
end
|
22
|
-
end
|