recurly 2.17.5 → 4.18.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (280) 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 +295 -0
  12. data/CODE_OF_CONDUCT.md +130 -0
  13. data/CONTRIBUTING.md +106 -0
  14. data/GETTING_STARTED.md +330 -0
  15. data/Gemfile +4 -0
  16. data/LICENSE.txt +21 -0
  17. data/README.md +9 -148
  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 +4079 -0
  22. data/lib/recurly/client.rb +400 -0
  23. data/lib/recurly/connection_pool.rb +42 -0
  24. data/lib/recurly/errors/api_errors.rb +90 -0
  25. data/lib/recurly/errors/network_errors.rb +7 -0
  26. data/lib/recurly/errors.rb +51 -0
  27. data/lib/recurly/http.rb +50 -0
  28. data/lib/recurly/pager.rb +136 -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_update.rb +26 -0
  32. data/lib/recurly/requests/account_create.rb +98 -0
  33. data/lib/recurly/requests/account_purchase.rb +98 -0
  34. data/lib/recurly/requests/account_update.rb +86 -0
  35. data/lib/recurly/requests/add_on_create.rb +102 -0
  36. data/lib/recurly/requests/add_on_pricing.rb +26 -0
  37. data/lib/recurly/requests/add_on_update.rb +78 -0
  38. data/lib/recurly/requests/address.rb +38 -0
  39. data/lib/recurly/requests/billing_info_create.rb +134 -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_update.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 +22 -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/percentage_tier.rb +18 -0
  62. data/lib/recurly/requests/percentage_tiers_by_currency.rb +18 -0
  63. data/lib/recurly/requests/plan_create.rb +102 -0
  64. data/lib/recurly/requests/plan_hosted_pages.rb +26 -0
  65. data/lib/recurly/requests/plan_pricing.rb +26 -0
  66. data/lib/recurly/requests/plan_update.rb +94 -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 +46 -0
  76. data/lib/recurly/requests/subscription_add_on_percentage_tier.rb +18 -0
  77. data/lib/recurly/requests/subscription_add_on_tier.rb +26 -0
  78. data/lib/recurly/requests/subscription_add_on_update.rb +50 -0
  79. data/lib/recurly/requests/subscription_cancel.rb +14 -0
  80. data/lib/recurly/requests/subscription_change_billing_info_create.rb +14 -0
  81. data/lib/recurly/requests/subscription_change_create.rb +74 -0
  82. data/lib/recurly/requests/subscription_change_shipping_create.rb +30 -0
  83. data/lib/recurly/requests/subscription_create.rb +114 -0
  84. data/lib/recurly/requests/subscription_pause.rb +14 -0
  85. data/lib/recurly/requests/subscription_purchase.rb +70 -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 +70 -0
  90. data/lib/recurly/requests/tier.rb +22 -0
  91. data/lib/recurly/requests/tier_pricing.rb +22 -0
  92. data/lib/recurly/requests/usage_create.rb +26 -0
  93. data/lib/recurly/requests.rb +8 -0
  94. data/lib/recurly/resource.rb +23 -1092
  95. data/lib/recurly/resources/account.rb +138 -0
  96. data/lib/recurly/resources/account_acquisition.rb +46 -0
  97. data/lib/recurly/resources/account_acquisition_cost.rb +18 -0
  98. data/lib/recurly/resources/account_balance.rb +26 -0
  99. data/lib/recurly/resources/account_balance_amount.rb +22 -0
  100. data/lib/recurly/resources/account_mini.rb +50 -0
  101. data/lib/recurly/resources/account_note.rb +34 -0
  102. data/lib/recurly/resources/add_on.rb +122 -0
  103. data/lib/recurly/resources/add_on_mini.rb +54 -0
  104. data/lib/recurly/resources/add_on_pricing.rb +26 -0
  105. data/lib/recurly/resources/address.rb +38 -0
  106. data/lib/recurly/resources/address_with_name.rb +46 -0
  107. data/lib/recurly/resources/billing_info.rb +74 -0
  108. data/lib/recurly/resources/billing_info_updated_by.rb +18 -0
  109. data/lib/recurly/resources/binary_file.rb +14 -0
  110. data/lib/recurly/resources/coupon.rb +126 -0
  111. data/lib/recurly/resources/coupon_discount.rb +26 -0
  112. data/lib/recurly/resources/coupon_discount_pricing.rb +18 -0
  113. data/lib/recurly/resources/coupon_discount_trial.rb +18 -0
  114. data/lib/recurly/resources/coupon_mini.rb +42 -0
  115. data/lib/recurly/resources/coupon_redemption.rb +54 -0
  116. data/lib/recurly/resources/coupon_redemption_mini.rb +34 -0
  117. data/lib/recurly/resources/credit_payment.rb +66 -0
  118. data/lib/recurly/resources/custom_field.rb +18 -0
  119. data/lib/recurly/resources/custom_field_definition.rb +50 -0
  120. data/lib/recurly/resources/dunning_campaign.rb +50 -0
  121. data/lib/recurly/resources/dunning_campaigns_bulk_update_response.rb +18 -0
  122. data/lib/recurly/resources/dunning_cycle.rb +58 -0
  123. data/lib/recurly/resources/dunning_interval.rb +18 -0
  124. data/lib/recurly/resources/error.rb +22 -0
  125. data/lib/recurly/resources/error_may_have_transaction.rb +26 -0
  126. data/lib/recurly/resources/export_dates.rb +18 -0
  127. data/lib/recurly/resources/export_file.rb +22 -0
  128. data/lib/recurly/resources/export_files.rb +18 -0
  129. data/lib/recurly/resources/fraud_info.rb +22 -0
  130. data/lib/recurly/resources/invoice.rb +162 -0
  131. data/lib/recurly/resources/invoice_address.rb +54 -0
  132. data/lib/recurly/resources/invoice_collection.rb +22 -0
  133. data/lib/recurly/resources/invoice_mini.rb +30 -0
  134. data/lib/recurly/resources/invoice_template.rb +34 -0
  135. data/lib/recurly/resources/item.rb +82 -0
  136. data/lib/recurly/resources/item_mini.rb +34 -0
  137. data/lib/recurly/resources/line_item.rb +206 -0
  138. data/lib/recurly/resources/measured_unit.rb +46 -0
  139. data/lib/recurly/resources/payment_method.rb +70 -0
  140. data/lib/recurly/resources/percentage_tier.rb +18 -0
  141. data/lib/recurly/resources/percentage_tiers_by_currency.rb +18 -0
  142. data/lib/recurly/resources/plan.rb +122 -0
  143. data/lib/recurly/resources/plan_hosted_pages.rb +26 -0
  144. data/lib/recurly/resources/plan_mini.rb +26 -0
  145. data/lib/recurly/resources/plan_pricing.rb +26 -0
  146. data/lib/recurly/resources/pricing.rb +22 -0
  147. data/lib/recurly/resources/settings.rb +22 -0
  148. data/lib/recurly/resources/shipping_address.rb +82 -0
  149. data/lib/recurly/resources/shipping_method.rb +46 -0
  150. data/lib/recurly/resources/shipping_method_mini.rb +26 -0
  151. data/lib/recurly/resources/site.rb +54 -0
  152. data/lib/recurly/resources/subscription.rb +198 -0
  153. data/lib/recurly/resources/subscription_add_on.rb +78 -0
  154. data/lib/recurly/resources/subscription_add_on_percentage_tier.rb +18 -0
  155. data/lib/recurly/resources/subscription_add_on_tier.rb +26 -0
  156. data/lib/recurly/resources/subscription_change.rb +82 -0
  157. data/lib/recurly/resources/subscription_change_billing_info.rb +14 -0
  158. data/lib/recurly/resources/subscription_shipping.rb +26 -0
  159. data/lib/recurly/resources/tax_detail.rb +26 -0
  160. data/lib/recurly/resources/tax_info.rb +26 -0
  161. data/lib/recurly/resources/tier.rb +22 -0
  162. data/lib/recurly/resources/tier_pricing.rb +22 -0
  163. data/lib/recurly/resources/transaction.rb +162 -0
  164. data/lib/recurly/resources/transaction_error.rb +38 -0
  165. data/lib/recurly/resources/transaction_payment_gateway.rb +26 -0
  166. data/lib/recurly/resources/unique_coupon_code.rb +50 -0
  167. data/lib/recurly/resources/unique_coupon_code_params.rb +26 -0
  168. data/lib/recurly/resources/usage.rb +78 -0
  169. data/lib/recurly/resources/user.rb +42 -0
  170. data/lib/recurly/resources.rb +18 -0
  171. data/lib/recurly/schema/file_parser.rb +13 -0
  172. data/lib/recurly/schema/json_parser.rb +72 -0
  173. data/lib/recurly/schema/request_caster.rb +60 -0
  174. data/lib/recurly/schema/resource_caster.rb +46 -0
  175. data/lib/recurly/schema/schema_factory.rb +48 -0
  176. data/lib/recurly/schema/schema_validator.rb +144 -0
  177. data/lib/recurly/schema.rb +156 -0
  178. data/lib/recurly/version.rb +1 -15
  179. data/lib/recurly.rb +15 -138
  180. data/openapi/api.yaml +22879 -0
  181. data/recurly.gemspec +39 -0
  182. data/scripts/build +5 -0
  183. data/scripts/clean +6 -0
  184. data/scripts/format +12 -0
  185. data/scripts/prepare-release +50 -0
  186. data/scripts/release +17 -0
  187. data/scripts/test +15 -0
  188. metadata +217 -217
  189. data/lib/recurly/account.rb +0 -179
  190. data/lib/recurly/account_balance.rb +0 -21
  191. data/lib/recurly/add_on.rb +0 -30
  192. data/lib/recurly/address.rb +0 -25
  193. data/lib/recurly/adjustment.rb +0 -76
  194. data/lib/recurly/api/errors.rb +0 -208
  195. data/lib/recurly/api/net_http_adapter.rb +0 -111
  196. data/lib/recurly/api.rb +0 -101
  197. data/lib/recurly/billing_info.rb +0 -80
  198. data/lib/recurly/coupon.rb +0 -134
  199. data/lib/recurly/credit_payment.rb +0 -32
  200. data/lib/recurly/custom_field.rb +0 -15
  201. data/lib/recurly/delivery.rb +0 -19
  202. data/lib/recurly/error.rb +0 -13
  203. data/lib/recurly/gift_card.rb +0 -82
  204. data/lib/recurly/helper.rb +0 -51
  205. data/lib/recurly/invoice.rb +0 -273
  206. data/lib/recurly/invoice_collection.rb +0 -14
  207. data/lib/recurly/js.rb +0 -14
  208. data/lib/recurly/juris_detail.rb +0 -14
  209. data/lib/recurly/measured_unit.rb +0 -16
  210. data/lib/recurly/money.rb +0 -120
  211. data/lib/recurly/note.rb +0 -14
  212. data/lib/recurly/plan.rb +0 -40
  213. data/lib/recurly/purchase.rb +0 -219
  214. data/lib/recurly/redemption.rb +0 -46
  215. data/lib/recurly/resource/association.rb +0 -16
  216. data/lib/recurly/resource/errors.rb +0 -20
  217. data/lib/recurly/resource/pager.rb +0 -313
  218. data/lib/recurly/shipping_address.rb +0 -26
  219. data/lib/recurly/subscription/add_ons.rb +0 -77
  220. data/lib/recurly/subscription.rb +0 -328
  221. data/lib/recurly/subscription_add_on.rb +0 -50
  222. data/lib/recurly/tax_detail.rb +0 -14
  223. data/lib/recurly/tax_type.rb +0 -12
  224. data/lib/recurly/transaction/errors.rb +0 -107
  225. data/lib/recurly/transaction.rb +0 -129
  226. data/lib/recurly/usage.rb +0 -28
  227. data/lib/recurly/webhook/account_notification.rb +0 -10
  228. data/lib/recurly/webhook/billing_info_updated_notification.rb +0 -6
  229. data/lib/recurly/webhook/canceled_account_notification.rb +0 -6
  230. data/lib/recurly/webhook/canceled_subscription_notification.rb +0 -6
  231. data/lib/recurly/webhook/closed_credit_invoice_notification.rb +0 -6
  232. data/lib/recurly/webhook/closed_invoice_notification.rb +0 -6
  233. data/lib/recurly/webhook/credit_payment_notification.rb +0 -12
  234. data/lib/recurly/webhook/dunning_notification.rb +0 -14
  235. data/lib/recurly/webhook/expired_subscription_notification.rb +0 -6
  236. data/lib/recurly/webhook/failed_charge_invoice_notification.rb +0 -6
  237. data/lib/recurly/webhook/failed_payment_notification.rb +0 -6
  238. data/lib/recurly/webhook/gift_card_notification.rb +0 -8
  239. data/lib/recurly/webhook/invoice_notification.rb +0 -12
  240. data/lib/recurly/webhook/low_balance_gift_card_notification.rb +0 -6
  241. data/lib/recurly/webhook/new_account_notification.rb +0 -6
  242. data/lib/recurly/webhook/new_charge_invoice_notification.rb +0 -6
  243. data/lib/recurly/webhook/new_credit_invoice_notification.rb +0 -6
  244. data/lib/recurly/webhook/new_credit_payment_notification.rb +0 -6
  245. data/lib/recurly/webhook/new_dunning_event_notification.rb +0 -6
  246. data/lib/recurly/webhook/new_invoice_notification.rb +0 -6
  247. data/lib/recurly/webhook/new_subscription_notification.rb +0 -6
  248. data/lib/recurly/webhook/new_usage_notification.rb +0 -8
  249. data/lib/recurly/webhook/notification.rb +0 -18
  250. data/lib/recurly/webhook/paid_charge_invoice_notification.rb +0 -6
  251. data/lib/recurly/webhook/past_due_charge_invoice_notification.rb +0 -6
  252. data/lib/recurly/webhook/past_due_invoice_notification.rb +0 -6
  253. data/lib/recurly/webhook/processing_charge_invoice_notification.rb +0 -6
  254. data/lib/recurly/webhook/processing_credit_invoice_notification.rb +0 -6
  255. data/lib/recurly/webhook/processing_invoice_notification.rb +0 -6
  256. data/lib/recurly/webhook/processing_payment_notification.rb +0 -6
  257. data/lib/recurly/webhook/purchased_gift_card_notification.rb +0 -7
  258. data/lib/recurly/webhook/reactivated_account_notification.rb +0 -6
  259. data/lib/recurly/webhook/redeemed_gift_card_notification.rb +0 -7
  260. data/lib/recurly/webhook/renewed_subscription_notification.rb +0 -6
  261. data/lib/recurly/webhook/reopened_charge_invoice_notification.rb +0 -6
  262. data/lib/recurly/webhook/reopened_credit_invoice_notification.rb +0 -6
  263. data/lib/recurly/webhook/scheduled_payment_notification.rb +0 -6
  264. data/lib/recurly/webhook/subscription_notification.rb +0 -12
  265. data/lib/recurly/webhook/successful_payment_notification.rb +0 -6
  266. data/lib/recurly/webhook/successful_refund_notification.rb +0 -6
  267. data/lib/recurly/webhook/transaction_authorized_notification.rb +0 -6
  268. data/lib/recurly/webhook/transaction_notification.rb +0 -12
  269. data/lib/recurly/webhook/transaction_status_updated_notification.rb +0 -6
  270. data/lib/recurly/webhook/updated_account_notification.rb +0 -6
  271. data/lib/recurly/webhook/updated_balance_gift_card_notification.rb +0 -7
  272. data/lib/recurly/webhook/updated_invoice_notification.rb +0 -6
  273. data/lib/recurly/webhook/updated_subscription_notification.rb +0 -6
  274. data/lib/recurly/webhook/void_payment_notification.rb +0 -6
  275. data/lib/recurly/webhook/voided_credit_invoice_notification.rb +0 -6
  276. data/lib/recurly/webhook/voided_credit_payment_notification.rb +0 -6
  277. data/lib/recurly/webhook.rb +0 -91
  278. data/lib/recurly/xml/nokogiri.rb +0 -60
  279. data/lib/recurly/xml/rexml.rb +0 -52
  280. data/lib/recurly/xml.rb +0 -122
@@ -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,313 +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
- @parent = options.delete :parent
92
- @uri = options.delete :uri
93
- @etag = options.delete :etag
94
- @resource_class, @options = resource_class, options
95
- @collection = nil
96
- end
97
-
98
- # This will tell you if there are any associated resources
99
- # on the server by checking the presence of a link in the xml
100
- #
101
- # @example
102
- # # if <invoices href="..." /> is present, will return true
103
- # account.invoices.any?
104
- # #=> true
105
- # @return [Boolean] whether or not the xml element is present
106
- def any?
107
- !@uri.nil?
108
- end
109
-
110
- # @return [String] The URI of the paginated resource.
111
- def uri
112
- @uri ||= resource_class.collection_path
113
- end
114
-
115
- # Calls the server to get the count of server side resources.
116
- #
117
- # @example Count collected invoices in 2016
118
- # opts = {
119
- # begin_time: DateTime.new(2016,1,1),
120
- # end_time: DateTime.new(2017,1,1),
121
- # state: :collected
122
- # }
123
- # count = Recurly::Invoice.paginate(opts).count
124
- # #=> 42
125
- #
126
- # @return [Integer] The total record count of the resource in question.
127
- # @see Resource.count
128
- def count
129
- API.head(uri, @options)['X-Records'].to_i
130
- end
131
-
132
- # @return [Array] Iterates through the current page of records.
133
- # @yield [record]
134
- def each
135
- return enum_for :each unless block_given?
136
- load! unless @collection
137
- @collection.each { |record| yield record }
138
- end
139
-
140
- # @return [nil]
141
- # @see Resource.find_each
142
- # @yield [record]
143
- def find_each
144
- return enum_for :find_each unless block_given?
145
- begin
146
- each { |record| yield record }
147
- end while self.next
148
- end
149
-
150
- # @return [Array, nil] Refreshes the pager's collection of records with
151
- # the next page.
152
- def next
153
- load_from links['next'], nil if links.key? 'next'
154
- end
155
-
156
- # @return [Array, nil] Refreshes the pager's collection of records with
157
- # the previous page.
158
- def prev
159
- load_from links['prev'], nil if links.key? 'prev'
160
- end
161
-
162
- # @return [Array, nil] Refreshes the pager's collection of records with
163
- # the first page.
164
- def start
165
- load_from links['start'], nil if links.key? 'start'
166
- end
167
-
168
- # @return [Array, nil] Load (or reload) the pager's collection from the
169
- # original, supplied options.
170
- def load!
171
- load_from uri, @options
172
- end
173
- alias reload load!
174
-
175
-
176
- # @return [Pager] Duplicates the pager, updating it with the options
177
- # supplied. Useful for resource scopes.
178
- # @option options [String, Symbol] :sort The attribute that will be used to order
179
- # records: <tt>created_at</tt>, <tt>updated_at</tt>. Defaults to <tt>created_at</tt>.
180
- # @option options [String, Symbol] :order The order in which records will be
181
- # returned: <tt>asc</tt> for ascending order, <tt>desc</tt> for descending order.
182
- # Defaults to <tt>desc</tt>.
183
- # @option options [DateTime, String] :begin_time Operates on the attribute specified by the
184
- # <tt>sort</tt> parameter. Filters records to only include those with datetimes
185
- # greater than or equal to the supplied datetime. Accepts an ISO 8601
186
- # date or date and time.
187
- # @option options [DateTime, String] :end_time Operates on the attribute specified by
188
- # the <tt>sort</tt> parameter. Filters records to only include those with
189
- # datetimes less than or equal to the supplied datetime. Accepts an
190
- # ISO 8601 date or date and time.
191
- # @example
192
- # Recurly::Account.paginate(sort: :updated_at, per_page: 20)
193
- def paginate(options = {})
194
- dup.instance_eval {
195
- @collection = @etag = nil
196
- @options = @options.merge options
197
- self
198
- }
199
- end
200
- alias scoped paginate
201
- alias where paginate
202
-
203
- def all options = {}
204
- paginate(options).to_a
205
- end
206
-
207
- # Instantiates a new record in the scope of the pager.
208
- #
209
- # @return [Resource] A new record.
210
- # @example
211
- # account = Recurly::Account.find 'schrader'
212
- # subscription = account.subscriptions.new attributes
213
- # @see Resource.new
214
- def new attributes = {}
215
- record = resource_class.send(:new, attributes) { |r|
216
- r.attributes[@parent.class.member_name] ||= @parent if @parent
217
- r.uri = uri
218
- }
219
- yield record if block_given?
220
- record
221
- end
222
-
223
- # Instantiates and saves a record in the scope of the pager.
224
- #
225
- # @return [Resource] The record.
226
- # @raise [Transaction::Error] A monetary transaction failed.
227
- # @example
228
- # account = Recurly::Account.find 'schrader'
229
- # subscription = account.subscriptions.create attributes
230
- # @see Resource.create
231
- def create attributes = {}
232
- new(attributes) { |record| record.save }
233
- end
234
-
235
- # Instantiates a record in the scope of the pager.
236
- #
237
- # @return [Resource] The record.
238
- # @example
239
- # account = Recurly::Account.find 'schrader'
240
- # subscription = account.subscriptions.build attributes
241
- # @see Resource.new
242
- def build attributes = {}
243
- new(attributes)
244
- end
245
-
246
- # Instantiates and saves a record in the scope of the pager.
247
- #
248
- # @return [Resource] The saved record.
249
- # @raise [Invalid] The record is invalid.
250
- # @raise [Transaction::Error] A monetary transaction failed.
251
- # @example
252
- # account = Recurly::Account.find 'schrader'
253
- # subscription = account.subscriptions.create! attributes
254
- # @see Resource.create!
255
- def create! attributes = {}
256
- new(attributes) { |record| record.save! }
257
- end
258
-
259
- def find uuid
260
- if resource_class.respond_to? :find
261
- raise NoMethodError, "#find must be called on #{resource_class} directly"
262
- end
263
-
264
- resource_class.from_response API.get("#{uri}/#{ERB::Util.url_encode(uuid)}")
265
- end
266
-
267
- # @return [true, false]
268
- # @see Object#respond_to?
269
- def respond_to? method_name, include_private = false
270
- super || [].respond_to?(method_name, include_private)
271
- end
272
-
273
- private
274
-
275
- def load_from uri, params
276
- options = {}
277
- options[:head] = { 'If-None-Match' => etag } if etag
278
- response = API.get uri, params, options
279
-
280
- @etag = response['ETag']
281
- @links = {}
282
- if links = response['Link']
283
- links.scan(/<([^>]+)>; rel="([^"]+)"/).each do |link, rel|
284
- @links[rel] = link.freeze
285
- end
286
- end
287
- @links.freeze
288
-
289
- @collection = []
290
- document = XML.new response.body
291
- document.each_element(resource_class.member_name) do |el|
292
- record = resource_class.from_xml el
293
- record.attributes[@parent.class.member_name] = @parent if @parent
294
- @collection << record
295
- end
296
- @collection.freeze
297
- rescue API::NotModified
298
- @collection and @collection or raise
299
- end
300
-
301
- def method_missing name, *args, &block
302
- scope = resource_class.scopes[name] and return paginate scope
303
-
304
- if [].respond_to? name
305
- load! unless @collection
306
- return @collection.send name, *args, &block
307
- end
308
-
309
- super
310
- end
311
- end
312
- end
313
- end
@@ -1,26 +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
- company_name
18
- email
19
- geo_code
20
- vat_number
21
- street1
22
- street2
23
- )
24
- alias to_param address1
25
- end
26
- end