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