recurly 2.17.0 → 3.23.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (273) hide show
  1. checksums.yaml +4 -4
  2. data/.bumpversion.cfg +15 -0
  3. data/.changelog_config.yaml +11 -0
  4. data/.github/ISSUE_TEMPLATE/bug-report.md +30 -0
  5. data/.github/ISSUE_TEMPLATE/question-or-other.md +10 -0
  6. data/.github/workflows/ci.yml +29 -0
  7. data/.github/workflows/docs.yml +28 -0
  8. data/.gitignore +15 -0
  9. data/.rspec +2 -0
  10. data/.yardopts +2 -0
  11. data/CHANGELOG.md +496 -0
  12. data/CODE_OF_CONDUCT.md +130 -0
  13. data/CONTRIBUTING.md +106 -0
  14. data/GETTING_STARTED.md +319 -0
  15. data/Gemfile +4 -0
  16. data/LICENSE.txt +21 -0
  17. data/README.md +9 -153
  18. data/Rakefile +6 -0
  19. data/benchmark.rb +16 -0
  20. data/lib/data/ca-certificates.crt +3466 -0
  21. data/lib/recurly/client/operations.rb +3868 -0
  22. data/lib/recurly/client.rb +355 -0
  23. data/lib/recurly/connection_pool.rb +40 -0
  24. data/lib/recurly/errors/api_errors.rb +87 -0
  25. data/lib/recurly/errors/network_errors.rb +10 -0
  26. data/lib/recurly/errors.rb +68 -0
  27. data/lib/recurly/http.rb +50 -0
  28. data/lib/recurly/pager.rb +146 -0
  29. data/lib/recurly/request.rb +31 -0
  30. data/lib/recurly/requests/account_acquisition_cost.rb +18 -0
  31. data/lib/recurly/requests/account_acquisition_updatable.rb +26 -0
  32. data/lib/recurly/requests/account_create.rb +94 -0
  33. data/lib/recurly/requests/account_purchase.rb +94 -0
  34. data/lib/recurly/requests/account_update.rb +82 -0
  35. data/lib/recurly/requests/add_on_create.rb +94 -0
  36. data/lib/recurly/requests/add_on_pricing.rb +22 -0
  37. data/lib/recurly/requests/add_on_update.rb +74 -0
  38. data/lib/recurly/requests/address.rb +46 -0
  39. data/lib/recurly/requests/billing_info_create.rb +126 -0
  40. data/lib/recurly/requests/billing_info_verify.rb +14 -0
  41. data/lib/recurly/requests/coupon_bulk_create.rb +14 -0
  42. data/lib/recurly/requests/coupon_create.rb +102 -0
  43. data/lib/recurly/requests/coupon_pricing.rb +18 -0
  44. data/lib/recurly/requests/coupon_redemption_create.rb +22 -0
  45. data/lib/recurly/requests/coupon_update.rb +34 -0
  46. data/lib/recurly/requests/custom_field.rb +18 -0
  47. data/lib/recurly/requests/dunning_campaigns_bulk_update.rb +18 -0
  48. data/lib/recurly/requests/external_refund.rb +22 -0
  49. data/lib/recurly/requests/external_transaction.rb +26 -0
  50. data/lib/recurly/requests/invoice_address.rb +54 -0
  51. data/lib/recurly/requests/invoice_collect.rb +22 -0
  52. data/lib/recurly/requests/invoice_create.rb +42 -0
  53. data/lib/recurly/requests/invoice_refund.rb +34 -0
  54. data/lib/recurly/requests/invoice_updatable.rb +34 -0
  55. data/lib/recurly/requests/item_create.rb +58 -0
  56. data/lib/recurly/requests/item_update.rb +58 -0
  57. data/lib/recurly/requests/line_item_create.rb +86 -0
  58. data/lib/recurly/requests/line_item_refund.rb +26 -0
  59. data/lib/recurly/requests/measured_unit_create.rb +22 -0
  60. data/lib/recurly/requests/measured_unit_update.rb +22 -0
  61. data/lib/recurly/requests/plan_create.rb +114 -0
  62. data/lib/recurly/requests/plan_hosted_pages.rb +26 -0
  63. data/lib/recurly/requests/plan_pricing.rb +26 -0
  64. data/lib/recurly/requests/plan_ramp_interval.rb +18 -0
  65. data/lib/recurly/requests/plan_ramp_pricing.rb +18 -0
  66. data/lib/recurly/requests/plan_update.rb +102 -0
  67. data/lib/recurly/requests/pricing.rb +22 -0
  68. data/lib/recurly/requests/purchase_create.rb +78 -0
  69. data/lib/recurly/requests/shipping_address_create.rb +62 -0
  70. data/lib/recurly/requests/shipping_address_update.rb +66 -0
  71. data/lib/recurly/requests/shipping_fee_create.rb +22 -0
  72. data/lib/recurly/requests/shipping_method_create.rb +26 -0
  73. data/lib/recurly/requests/shipping_method_update.rb +26 -0
  74. data/lib/recurly/requests/shipping_purchase.rb +22 -0
  75. data/lib/recurly/requests/subscription_add_on_create.rb +38 -0
  76. data/lib/recurly/requests/subscription_add_on_tier.rb +18 -0
  77. data/lib/recurly/requests/subscription_add_on_update.rb +42 -0
  78. data/lib/recurly/requests/subscription_cancel.rb +14 -0
  79. data/lib/recurly/requests/subscription_change_billing_info_create.rb +14 -0
  80. data/lib/recurly/requests/subscription_change_create.rb +78 -0
  81. data/lib/recurly/requests/subscription_change_shipping_create.rb +22 -0
  82. data/lib/recurly/requests/subscription_create.rb +118 -0
  83. data/lib/recurly/requests/subscription_pause.rb +14 -0
  84. data/lib/recurly/requests/subscription_purchase.rb +74 -0
  85. data/lib/recurly/requests/subscription_ramp_interval.rb +18 -0
  86. data/lib/recurly/requests/subscription_shipping_create.rb +30 -0
  87. data/lib/recurly/requests/subscription_shipping_purchase.rb +22 -0
  88. data/lib/recurly/requests/subscription_shipping_update.rb +22 -0
  89. data/lib/recurly/requests/subscription_update.rb +66 -0
  90. data/lib/recurly/requests/tier.rb +18 -0
  91. data/lib/recurly/requests/usage_create.rb +26 -0
  92. data/lib/recurly/requests.rb +8 -0
  93. data/lib/recurly/resource.rb +23 -1082
  94. data/lib/recurly/resources/account.rb +134 -0
  95. data/lib/recurly/resources/account_acquisition.rb +46 -0
  96. data/lib/recurly/resources/account_acquisition_cost.rb +18 -0
  97. data/lib/recurly/resources/account_balance.rb +26 -0
  98. data/lib/recurly/resources/account_balance_amount.rb +26 -0
  99. data/lib/recurly/resources/account_mini.rb +50 -0
  100. data/lib/recurly/resources/account_note.rb +34 -0
  101. data/lib/recurly/resources/add_on.rb +114 -0
  102. data/lib/recurly/resources/add_on_mini.rb +54 -0
  103. data/lib/recurly/resources/add_on_pricing.rb +22 -0
  104. data/lib/recurly/resources/address.rb +46 -0
  105. data/lib/recurly/resources/billing_info.rb +74 -0
  106. data/lib/recurly/resources/billing_info_updated_by.rb +18 -0
  107. data/lib/recurly/resources/binary_file.rb +14 -0
  108. data/lib/recurly/resources/coupon.rb +138 -0
  109. data/lib/recurly/resources/coupon_discount.rb +26 -0
  110. data/lib/recurly/resources/coupon_discount_pricing.rb +18 -0
  111. data/lib/recurly/resources/coupon_discount_trial.rb +18 -0
  112. data/lib/recurly/resources/coupon_mini.rb +42 -0
  113. data/lib/recurly/resources/coupon_redemption.rb +54 -0
  114. data/lib/recurly/resources/coupon_redemption_mini.rb +34 -0
  115. data/lib/recurly/resources/credit_payment.rb +66 -0
  116. data/lib/recurly/resources/custom_field.rb +18 -0
  117. data/lib/recurly/resources/custom_field_definition.rb +50 -0
  118. data/lib/recurly/resources/dunning_campaign.rb +50 -0
  119. data/lib/recurly/resources/dunning_campaigns_bulk_update_response.rb +18 -0
  120. data/lib/recurly/resources/dunning_cycle.rb +58 -0
  121. data/lib/recurly/resources/dunning_interval.rb +18 -0
  122. data/lib/recurly/resources/error.rb +22 -0
  123. data/lib/recurly/resources/error_may_have_transaction.rb +26 -0
  124. data/lib/recurly/resources/export_dates.rb +18 -0
  125. data/lib/recurly/resources/export_file.rb +22 -0
  126. data/lib/recurly/resources/export_files.rb +18 -0
  127. data/lib/recurly/resources/fraud_info.rb +22 -0
  128. data/lib/recurly/resources/invoice.rb +154 -0
  129. data/lib/recurly/resources/invoice_address.rb +54 -0
  130. data/lib/recurly/resources/invoice_collection.rb +22 -0
  131. data/lib/recurly/resources/invoice_mini.rb +30 -0
  132. data/lib/recurly/resources/item.rb +82 -0
  133. data/lib/recurly/resources/item_mini.rb +34 -0
  134. data/lib/recurly/resources/line_item.rb +214 -0
  135. data/lib/recurly/resources/line_item_list.rb +26 -0
  136. data/lib/recurly/resources/measured_unit.rb +46 -0
  137. data/lib/recurly/resources/payment_method.rb +70 -0
  138. data/lib/recurly/resources/plan.rb +134 -0
  139. data/lib/recurly/resources/plan_hosted_pages.rb +26 -0
  140. data/lib/recurly/resources/plan_mini.rb +26 -0
  141. data/lib/recurly/resources/plan_pricing.rb +26 -0
  142. data/lib/recurly/resources/plan_ramp_interval.rb +18 -0
  143. data/lib/recurly/resources/plan_ramp_pricing.rb +18 -0
  144. data/lib/recurly/resources/pricing.rb +22 -0
  145. data/lib/recurly/resources/settings.rb +22 -0
  146. data/lib/recurly/resources/shipping_address.rb +82 -0
  147. data/lib/recurly/resources/shipping_method.rb +46 -0
  148. data/lib/recurly/resources/shipping_method_mini.rb +26 -0
  149. data/lib/recurly/resources/site.rb +54 -0
  150. data/lib/recurly/resources/subscription.rb +190 -0
  151. data/lib/recurly/resources/subscription_add_on.rb +66 -0
  152. data/lib/recurly/resources/subscription_add_on_tier.rb +18 -0
  153. data/lib/recurly/resources/subscription_change.rb +90 -0
  154. data/lib/recurly/resources/subscription_change_billing_info.rb +14 -0
  155. data/lib/recurly/resources/subscription_change_preview.rb +90 -0
  156. data/lib/recurly/resources/subscription_ramp_interval_response.rb +22 -0
  157. data/lib/recurly/resources/subscription_shipping.rb +26 -0
  158. data/lib/recurly/resources/tax_detail.rb +26 -0
  159. data/lib/recurly/resources/tax_info.rb +26 -0
  160. data/lib/recurly/resources/tier.rb +18 -0
  161. data/lib/recurly/resources/transaction.rb +162 -0
  162. data/lib/recurly/resources/transaction_error.rb +38 -0
  163. data/lib/recurly/resources/transaction_payment_gateway.rb +26 -0
  164. data/lib/recurly/resources/unique_coupon_code.rb +50 -0
  165. data/lib/recurly/resources/usage.rb +70 -0
  166. data/lib/recurly/resources/user.rb +42 -0
  167. data/lib/recurly/resources.rb +18 -0
  168. data/lib/recurly/schema/file_parser.rb +13 -0
  169. data/lib/recurly/schema/json_parser.rb +72 -0
  170. data/lib/recurly/schema/request_caster.rb +60 -0
  171. data/lib/recurly/schema/resource_caster.rb +46 -0
  172. data/lib/recurly/schema/schema_factory.rb +48 -0
  173. data/lib/recurly/schema/schema_validator.rb +144 -0
  174. data/lib/recurly/schema.rb +156 -0
  175. data/lib/recurly/version.rb +1 -15
  176. data/lib/recurly.rb +15 -137
  177. data/openapi/api.yaml +22373 -0
  178. data/recurly.gemspec +39 -0
  179. data/scripts/build +5 -0
  180. data/scripts/clean +6 -0
  181. data/scripts/format +12 -0
  182. data/scripts/prepare-release +50 -0
  183. data/scripts/release +17 -0
  184. data/scripts/test +15 -0
  185. metadata +216 -165
  186. data/lib/recurly/account.rb +0 -169
  187. data/lib/recurly/account_balance.rb +0 -21
  188. data/lib/recurly/add_on.rb +0 -30
  189. data/lib/recurly/address.rb +0 -25
  190. data/lib/recurly/adjustment.rb +0 -76
  191. data/lib/recurly/api/errors.rb +0 -206
  192. data/lib/recurly/api/net_http_adapter.rb +0 -111
  193. data/lib/recurly/api.rb +0 -101
  194. data/lib/recurly/billing_info.rb +0 -80
  195. data/lib/recurly/coupon.rb +0 -134
  196. data/lib/recurly/credit_payment.rb +0 -28
  197. data/lib/recurly/custom_field.rb +0 -15
  198. data/lib/recurly/delivery.rb +0 -19
  199. data/lib/recurly/error.rb +0 -13
  200. data/lib/recurly/gift_card.rb +0 -79
  201. data/lib/recurly/helper.rb +0 -51
  202. data/lib/recurly/invoice.rb +0 -268
  203. data/lib/recurly/invoice_collection.rb +0 -14
  204. data/lib/recurly/js.rb +0 -14
  205. data/lib/recurly/juris_detail.rb +0 -14
  206. data/lib/recurly/measured_unit.rb +0 -16
  207. data/lib/recurly/money.rb +0 -120
  208. data/lib/recurly/plan.rb +0 -40
  209. data/lib/recurly/purchase.rb +0 -219
  210. data/lib/recurly/redemption.rb +0 -46
  211. data/lib/recurly/resource/association.rb +0 -16
  212. data/lib/recurly/resource/errors.rb +0 -20
  213. data/lib/recurly/resource/pager.rb +0 -314
  214. data/lib/recurly/shipping_address.rb +0 -22
  215. data/lib/recurly/subscription/add_ons.rb +0 -77
  216. data/lib/recurly/subscription.rb +0 -325
  217. data/lib/recurly/subscription_add_on.rb +0 -50
  218. data/lib/recurly/tax_detail.rb +0 -14
  219. data/lib/recurly/tax_type.rb +0 -12
  220. data/lib/recurly/transaction/errors.rb +0 -107
  221. data/lib/recurly/transaction.rb +0 -116
  222. data/lib/recurly/usage.rb +0 -24
  223. data/lib/recurly/webhook/account_notification.rb +0 -10
  224. data/lib/recurly/webhook/billing_info_updated_notification.rb +0 -6
  225. data/lib/recurly/webhook/canceled_account_notification.rb +0 -6
  226. data/lib/recurly/webhook/canceled_subscription_notification.rb +0 -6
  227. data/lib/recurly/webhook/closed_credit_invoice_notification.rb +0 -6
  228. data/lib/recurly/webhook/closed_invoice_notification.rb +0 -6
  229. data/lib/recurly/webhook/credit_payment_notification.rb +0 -12
  230. data/lib/recurly/webhook/dunning_notification.rb +0 -14
  231. data/lib/recurly/webhook/expired_subscription_notification.rb +0 -6
  232. data/lib/recurly/webhook/failed_charge_invoice_notification.rb +0 -6
  233. data/lib/recurly/webhook/failed_payment_notification.rb +0 -6
  234. data/lib/recurly/webhook/gift_card_notification.rb +0 -8
  235. data/lib/recurly/webhook/invoice_notification.rb +0 -12
  236. data/lib/recurly/webhook/new_account_notification.rb +0 -6
  237. data/lib/recurly/webhook/new_charge_invoice_notification.rb +0 -6
  238. data/lib/recurly/webhook/new_credit_invoice_notification.rb +0 -6
  239. data/lib/recurly/webhook/new_credit_payment_notification.rb +0 -6
  240. data/lib/recurly/webhook/new_dunning_event_notification.rb +0 -6
  241. data/lib/recurly/webhook/new_invoice_notification.rb +0 -6
  242. data/lib/recurly/webhook/new_subscription_notification.rb +0 -6
  243. data/lib/recurly/webhook/new_usage_notification.rb +0 -8
  244. data/lib/recurly/webhook/notification.rb +0 -18
  245. data/lib/recurly/webhook/paid_charge_invoice_notification.rb +0 -6
  246. data/lib/recurly/webhook/past_due_charge_invoice_notification.rb +0 -6
  247. data/lib/recurly/webhook/past_due_invoice_notification.rb +0 -6
  248. data/lib/recurly/webhook/processing_charge_invoice_notification.rb +0 -6
  249. data/lib/recurly/webhook/processing_credit_invoice_notification.rb +0 -6
  250. data/lib/recurly/webhook/processing_invoice_notification.rb +0 -6
  251. data/lib/recurly/webhook/processing_payment_notification.rb +0 -6
  252. data/lib/recurly/webhook/purchased_gift_card_notification.rb +0 -7
  253. data/lib/recurly/webhook/reactivated_account_notification.rb +0 -6
  254. data/lib/recurly/webhook/redeemed_gift_card_notification.rb +0 -7
  255. data/lib/recurly/webhook/renewed_subscription_notification.rb +0 -6
  256. data/lib/recurly/webhook/reopened_charge_invoice_notification.rb +0 -6
  257. data/lib/recurly/webhook/reopened_credit_invoice_notification.rb +0 -6
  258. data/lib/recurly/webhook/scheduled_payment_notification.rb +0 -6
  259. data/lib/recurly/webhook/subscription_notification.rb +0 -12
  260. data/lib/recurly/webhook/successful_payment_notification.rb +0 -6
  261. data/lib/recurly/webhook/successful_refund_notification.rb +0 -6
  262. data/lib/recurly/webhook/transaction_authorized_notification.rb +0 -6
  263. data/lib/recurly/webhook/transaction_notification.rb +0 -12
  264. data/lib/recurly/webhook/updated_account_notification.rb +0 -6
  265. data/lib/recurly/webhook/updated_balance_gift_card_notification.rb +0 -7
  266. data/lib/recurly/webhook/updated_subscription_notification.rb +0 -6
  267. data/lib/recurly/webhook/void_payment_notification.rb +0 -6
  268. data/lib/recurly/webhook/voided_credit_invoice_notification.rb +0 -6
  269. data/lib/recurly/webhook/voided_credit_payment_notification.rb +0 -6
  270. data/lib/recurly/webhook.rb +0 -88
  271. data/lib/recurly/xml/nokogiri.rb +0 -58
  272. data/lib/recurly/xml/rexml.rb +0 -50
  273. data/lib/recurly/xml.rb +0 -120
@@ -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
@@ -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