recurly 2.18.22 → 3.0.0.beta.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (213) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +14 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +5 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.md +158 -110
  8. data/Rakefile +6 -0
  9. data/bin/bundle +105 -0
  10. data/bin/coderay +29 -0
  11. data/bin/console +14 -0
  12. data/bin/htmldiff +29 -0
  13. data/bin/ldiff +29 -0
  14. data/bin/pry +29 -0
  15. data/bin/rake +29 -0
  16. data/bin/rspec +29 -0
  17. data/bin/setup +8 -0
  18. data/bin/yard +29 -0
  19. data/bin/yardoc +29 -0
  20. data/bin/yri +29 -0
  21. data/lib/data/ca-certificates.crt +31 -0
  22. data/lib/recurly/client/operations.rb +935 -0
  23. data/lib/recurly/client.rb +198 -0
  24. data/lib/recurly/errors/api_errors.rb +35 -0
  25. data/lib/recurly/errors/network_errors.rb +8 -0
  26. data/lib/recurly/errors.rb +34 -0
  27. data/lib/recurly/pager.rb +119 -0
  28. data/lib/recurly/request.rb +30 -0
  29. data/lib/recurly/requests/account_acquisition_updatable.rb +22 -0
  30. data/lib/recurly/requests/account_create_only.rb +18 -0
  31. data/lib/recurly/requests/account_updatable.rb +50 -0
  32. data/lib/recurly/requests/add_on_create.rb +38 -0
  33. data/lib/recurly/requests/add_on_update.rb +38 -0
  34. data/lib/recurly/requests/address.rb +42 -0
  35. data/lib/recurly/requests/billing_info_create.rb +58 -0
  36. data/lib/recurly/requests/coupon_create_only.rb +66 -0
  37. data/lib/recurly/requests/coupon_updatable.rb +30 -0
  38. data/lib/recurly/requests/create_account.rb +62 -0
  39. data/lib/recurly/requests/create_coupon.rb +90 -0
  40. data/lib/recurly/requests/invoice_create.rb +42 -0
  41. data/lib/recurly/requests/invoice_refund.rb +30 -0
  42. data/lib/recurly/requests/line_item_create.rb +46 -0
  43. data/lib/recurly/requests/plan_create.rb +66 -0
  44. data/lib/recurly/requests/plan_update.rb +70 -0
  45. data/lib/recurly/requests/shipping_address_create.rb +58 -0
  46. data/lib/recurly/requests/shipping_address_update.rb +62 -0
  47. data/lib/recurly/requests/subscription_add_on_create.rb +22 -0
  48. data/lib/recurly/requests/subscription_change_create.rb +42 -0
  49. data/lib/recurly/requests/subscription_create.rb +86 -0
  50. data/lib/recurly/requests/subscription_update.rb +42 -0
  51. data/lib/recurly/requests/update_coupon.rb +30 -0
  52. data/lib/recurly/resource.rb +16 -1103
  53. data/lib/recurly/resources/account.rb +86 -0
  54. data/lib/recurly/resources/account_acquisition.rb +42 -0
  55. data/lib/recurly/resources/account_balance.rb +22 -0
  56. data/lib/recurly/resources/account_note.rb +30 -0
  57. data/lib/recurly/resources/add_on.rb +62 -0
  58. data/lib/recurly/resources/address.rb +42 -0
  59. data/lib/recurly/resources/billing_info.rb +62 -0
  60. data/lib/recurly/resources/coupon.rb +110 -0
  61. data/lib/recurly/resources/coupon_discount.rb +22 -0
  62. data/lib/recurly/resources/coupon_redemption.rb +46 -0
  63. data/lib/recurly/resources/credit_payment.rb +62 -0
  64. data/lib/recurly/resources/error.rb +18 -0
  65. data/lib/recurly/resources/error_may_have_transaction.rb +22 -0
  66. data/lib/recurly/resources/invoice.rb +138 -0
  67. data/lib/recurly/resources/invoice_collection.rb +18 -0
  68. data/lib/recurly/resources/line_item.rb +166 -0
  69. data/lib/recurly/resources/plan.rb +86 -0
  70. data/lib/recurly/resources/settings.rb +18 -0
  71. data/lib/recurly/resources/shipping_address.rb +74 -0
  72. data/lib/recurly/resources/site.rb +46 -0
  73. data/lib/recurly/resources/subscription.rb +134 -0
  74. data/lib/recurly/resources/subscription_add_on.rb +42 -0
  75. data/lib/recurly/resources/subscription_change.rb +54 -0
  76. data/lib/recurly/resources/tax_info.rb +18 -0
  77. data/lib/recurly/resources/transaction.rb +146 -0
  78. data/lib/recurly/resources/unique_coupon_code.rb +38 -0
  79. data/lib/recurly/resources/user.rb +38 -0
  80. data/lib/recurly/schema/json_deserializer.rb +53 -0
  81. data/lib/recurly/schema/json_parser.rb +71 -0
  82. data/lib/recurly/schema/request_caster.rb +66 -0
  83. data/lib/recurly/schema/schema_factory.rb +50 -0
  84. data/lib/recurly/schema/schema_validator.rb +125 -0
  85. data/lib/recurly/schema.rb +114 -0
  86. data/lib/recurly/version.rb +1 -10
  87. data/lib/recurly.rb +14 -147
  88. data/recurly.gemspec +32 -0
  89. data/scripts/build +4 -0
  90. data/scripts/clean +6 -0
  91. data/scripts/test +3 -0
  92. metadata +129 -175
  93. data/lib/recurly/account.rb +0 -210
  94. data/lib/recurly/account_acquisition.rb +0 -27
  95. data/lib/recurly/account_balance.rb +0 -21
  96. data/lib/recurly/add_on.rb +0 -46
  97. data/lib/recurly/address.rb +0 -25
  98. data/lib/recurly/adjustment.rb +0 -83
  99. data/lib/recurly/api/errors.rb +0 -208
  100. data/lib/recurly/api/net_http_adapter.rb +0 -111
  101. data/lib/recurly/api.rb +0 -110
  102. data/lib/recurly/billing_info.rb +0 -113
  103. data/lib/recurly/coupon.rb +0 -136
  104. data/lib/recurly/credit_payment.rb +0 -32
  105. data/lib/recurly/custom_field.rb +0 -15
  106. data/lib/recurly/delivery.rb +0 -19
  107. data/lib/recurly/dunning_campaign.rb +0 -30
  108. data/lib/recurly/dunning_cycle.rb +0 -18
  109. data/lib/recurly/error.rb +0 -13
  110. data/lib/recurly/gift_card.rb +0 -85
  111. data/lib/recurly/helper.rb +0 -51
  112. data/lib/recurly/invoice.rb +0 -305
  113. data/lib/recurly/invoice_collection.rb +0 -14
  114. data/lib/recurly/item.rb +0 -36
  115. data/lib/recurly/js.rb +0 -14
  116. data/lib/recurly/juris_detail.rb +0 -15
  117. data/lib/recurly/measured_unit.rb +0 -16
  118. data/lib/recurly/money.rb +0 -120
  119. data/lib/recurly/note.rb +0 -14
  120. data/lib/recurly/plan.rb +0 -44
  121. data/lib/recurly/purchase.rb +0 -238
  122. data/lib/recurly/redemption.rb +0 -46
  123. data/lib/recurly/resource/association.rb +0 -16
  124. data/lib/recurly/resource/errors.rb +0 -20
  125. data/lib/recurly/resource/pager.rb +0 -313
  126. data/lib/recurly/shipping_address.rb +0 -26
  127. data/lib/recurly/shipping_fee.rb +0 -17
  128. data/lib/recurly/shipping_method.rb +0 -13
  129. data/lib/recurly/subscription/add_ons.rb +0 -82
  130. data/lib/recurly/subscription.rb +0 -366
  131. data/lib/recurly/subscription_add_on.rb +0 -58
  132. data/lib/recurly/tax_detail.rb +0 -18
  133. data/lib/recurly/tax_type.rb +0 -13
  134. data/lib/recurly/tier.rb +0 -18
  135. data/lib/recurly/transaction/errors.rb +0 -115
  136. data/lib/recurly/transaction.rb +0 -131
  137. data/lib/recurly/usage.rb +0 -28
  138. data/lib/recurly/verify.rb +0 -12
  139. data/lib/recurly/webhook/account_notification.rb +0 -13
  140. data/lib/recurly/webhook/billing_info_update_failed_notification.rb +0 -6
  141. data/lib/recurly/webhook/billing_info_updated_notification.rb +0 -6
  142. data/lib/recurly/webhook/canceled_account_notification.rb +0 -6
  143. data/lib/recurly/webhook/canceled_gift_card_notification.rb +0 -6
  144. data/lib/recurly/webhook/canceled_subscription_notification.rb +0 -6
  145. data/lib/recurly/webhook/closed_credit_invoice_notification.rb +0 -6
  146. data/lib/recurly/webhook/closed_invoice_notification.rb +0 -6
  147. data/lib/recurly/webhook/credit_payment_notification.rb +0 -12
  148. data/lib/recurly/webhook/deactivated_item_notification.rb +0 -6
  149. data/lib/recurly/webhook/deleted_shipping_address_notification.rb +0 -6
  150. data/lib/recurly/webhook/dunning_notification.rb +0 -14
  151. data/lib/recurly/webhook/expired_subscription_notification.rb +0 -6
  152. data/lib/recurly/webhook/failed_charge_invoice_notification.rb +0 -6
  153. data/lib/recurly/webhook/failed_payment_notification.rb +0 -6
  154. data/lib/recurly/webhook/fraud_info_updated_notification.rb +0 -6
  155. data/lib/recurly/webhook/gift_card_notification.rb +0 -8
  156. data/lib/recurly/webhook/invoice_notification.rb +0 -12
  157. data/lib/recurly/webhook/item_notification.rb +0 -7
  158. data/lib/recurly/webhook/low_balance_gift_card_notification.rb +0 -6
  159. data/lib/recurly/webhook/new_account_notification.rb +0 -6
  160. data/lib/recurly/webhook/new_charge_invoice_notification.rb +0 -6
  161. data/lib/recurly/webhook/new_credit_invoice_notification.rb +0 -6
  162. data/lib/recurly/webhook/new_credit_payment_notification.rb +0 -6
  163. data/lib/recurly/webhook/new_dunning_event_notification.rb +0 -6
  164. data/lib/recurly/webhook/new_invoice_notification.rb +0 -6
  165. data/lib/recurly/webhook/new_item_notification.rb +0 -6
  166. data/lib/recurly/webhook/new_shipping_address_notification.rb +0 -6
  167. data/lib/recurly/webhook/new_subscription_notification.rb +0 -6
  168. data/lib/recurly/webhook/new_usage_notification.rb +0 -8
  169. data/lib/recurly/webhook/notification.rb +0 -18
  170. data/lib/recurly/webhook/paid_charge_invoice_notification.rb +0 -6
  171. data/lib/recurly/webhook/past_due_charge_invoice_notification.rb +0 -6
  172. data/lib/recurly/webhook/past_due_invoice_notification.rb +0 -6
  173. data/lib/recurly/webhook/paused_subscription_renewal_notification.rb +0 -6
  174. data/lib/recurly/webhook/prerenewal_notification.rb +0 -6
  175. data/lib/recurly/webhook/processing_charge_invoice_notification.rb +0 -6
  176. data/lib/recurly/webhook/processing_credit_invoice_notification.rb +0 -6
  177. data/lib/recurly/webhook/processing_invoice_notification.rb +0 -6
  178. data/lib/recurly/webhook/processing_payment_notification.rb +0 -6
  179. data/lib/recurly/webhook/purchased_gift_card_notification.rb +0 -7
  180. data/lib/recurly/webhook/reactivated_account_notification.rb +0 -6
  181. data/lib/recurly/webhook/reactivated_item_notification.rb +0 -6
  182. data/lib/recurly/webhook/redeemed_gift_card_notification.rb +0 -7
  183. data/lib/recurly/webhook/regenerated_gift_card_notification.rb +0 -6
  184. data/lib/recurly/webhook/renewed_subscription_notification.rb +0 -6
  185. data/lib/recurly/webhook/reopened_charge_invoice_notification.rb +0 -6
  186. data/lib/recurly/webhook/reopened_credit_invoice_notification.rb +0 -6
  187. data/lib/recurly/webhook/scheduled_payment_notification.rb +0 -6
  188. data/lib/recurly/webhook/scheduled_subscription_pause_notification.rb +0 -6
  189. data/lib/recurly/webhook/scheduled_subscription_update_notification.rb +0 -6
  190. data/lib/recurly/webhook/subscription_notification.rb +0 -12
  191. data/lib/recurly/webhook/subscription_pause_canceled_notification.rb +0 -6
  192. data/lib/recurly/webhook/subscription_pause_modified_notification.rb +0 -6
  193. data/lib/recurly/webhook/subscription_paused_notification.rb +0 -6
  194. data/lib/recurly/webhook/subscription_resumed_notification.rb +0 -6
  195. data/lib/recurly/webhook/successful_payment_notification.rb +0 -6
  196. data/lib/recurly/webhook/successful_refund_notification.rb +0 -6
  197. data/lib/recurly/webhook/transaction_authorized_notification.rb +0 -6
  198. data/lib/recurly/webhook/transaction_notification.rb +0 -12
  199. data/lib/recurly/webhook/transaction_status_updated_notification.rb +0 -6
  200. data/lib/recurly/webhook/updated_account_notification.rb +0 -6
  201. data/lib/recurly/webhook/updated_balance_gift_card_notification.rb +0 -7
  202. data/lib/recurly/webhook/updated_gift_card_notification.rb +0 -6
  203. data/lib/recurly/webhook/updated_invoice_notification.rb +0 -6
  204. data/lib/recurly/webhook/updated_item_notification.rb +0 -6
  205. data/lib/recurly/webhook/updated_shipping_address_notification.rb +0 -6
  206. data/lib/recurly/webhook/updated_subscription_notification.rb +0 -6
  207. data/lib/recurly/webhook/void_payment_notification.rb +0 -6
  208. data/lib/recurly/webhook/voided_credit_invoice_notification.rb +0 -6
  209. data/lib/recurly/webhook/voided_credit_payment_notification.rb +0 -6
  210. data/lib/recurly/webhook.rb +0 -113
  211. data/lib/recurly/xml/nokogiri.rb +0 -60
  212. data/lib/recurly/xml/rexml.rb +0 -52
  213. data/lib/recurly/xml.rb +0 -122
@@ -0,0 +1,42 @@
1
+ module Recurly
2
+ module Resources
3
+ class SubscriptionAddOn < Resource
4
+
5
+ # @!attribute add_on
6
+ # @return [AddOnMini]
7
+ define_attribute :add_on, :AddOnMini
8
+
9
+ # @!attribute created_at
10
+ # @return [DateTime] Created at
11
+ define_attribute :created_at, DateTime
12
+
13
+ # @!attribute expired_at
14
+ # @return [DateTime] Expired at
15
+ define_attribute :expired_at, DateTime
16
+
17
+ # @!attribute id
18
+ # @return [String] Subscription Add-on ID
19
+ define_attribute :id, String
20
+
21
+ # @!attribute object
22
+ # @return [String] Object type
23
+ define_attribute :object, String
24
+
25
+ # @!attribute quantity
26
+ # @return [Integer] Add-on quantity
27
+ define_attribute :quantity, Integer
28
+
29
+ # @!attribute subscription_id
30
+ # @return [String] Subscription ID
31
+ define_attribute :subscription_id, String
32
+
33
+ # @!attribute unit_amount
34
+ # @return [Float] This is priced in the subscription's currency.
35
+ define_attribute :unit_amount, Float
36
+
37
+ # @!attribute updated_at
38
+ # @return [DateTime] Updated at
39
+ define_attribute :updated_at, DateTime
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,54 @@
1
+ module Recurly
2
+ module Resources
3
+ class SubscriptionChange < Resource
4
+
5
+ # @!attribute [r] activate_at
6
+ # @return [DateTime] Activated at
7
+ define_attribute :activate_at, DateTime, {:read_only => true}
8
+
9
+ # @!attribute activated
10
+ # @return [Boolean] Returns `true` if the subscription change is activated.
11
+ define_attribute :activated, :Boolean
12
+
13
+ # @!attribute add_ons
14
+ # @return [Array[SubscriptionAddOn]] These add-ons will be used when the subscription renews.
15
+ define_attribute :add_ons, Array, {:item_type => :SubscriptionAddOn}
16
+
17
+ # @!attribute [r] created_at
18
+ # @return [DateTime] Created at
19
+ define_attribute :created_at, DateTime, {:read_only => true}
20
+
21
+ # @!attribute [r] deleted_at
22
+ # @return [DateTime] Deleted at
23
+ define_attribute :deleted_at, DateTime, {:read_only => true}
24
+
25
+ # @!attribute id
26
+ # @return [String] The ID of the Subscription Change.
27
+ define_attribute :id, String
28
+
29
+ # @!attribute object
30
+ # @return [String] Object type
31
+ define_attribute :object, String
32
+
33
+ # @!attribute plan
34
+ # @return [PlanMini]
35
+ define_attribute :plan, :PlanMini
36
+
37
+ # @!attribute quantity
38
+ # @return [Integer] Subscription quantity
39
+ define_attribute :quantity, Integer
40
+
41
+ # @!attribute subscription_id
42
+ # @return [String] The ID of the subscription that is going to be changed.
43
+ define_attribute :subscription_id, String
44
+
45
+ # @!attribute unit_amount
46
+ # @return [Float] Unit amount
47
+ define_attribute :unit_amount, Float
48
+
49
+ # @!attribute [r] updated_at
50
+ # @return [DateTime] Updated at
51
+ define_attribute :updated_at, DateTime, {:read_only => true}
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,18 @@
1
+ module Recurly
2
+ module Resources
3
+ class TaxInfo < Resource
4
+
5
+ # @!attribute rate
6
+ # @return [Float] Rate
7
+ define_attribute :rate, Float
8
+
9
+ # @!attribute region
10
+ # @return [String] Provides the tax region applied on an invoice. For U.S. Sales Tax, this will be the 2 letter state code. For EU VAT this will be the 2 letter country code. For all country level tax types, this will display the regional tax, like VAT, GST, or PST.
11
+ define_attribute :region, String
12
+
13
+ # @!attribute type
14
+ # @return [String] Provides the tax type as "vat" for EU VAT, "usst" for U.S. Sales Tax, or the 2 letter country code for country level tax types like Canada, Australia, New Zealand, Israel, and all non-EU European countries.
15
+ define_attribute :type, String
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,146 @@
1
+ module Recurly
2
+ module Resources
3
+ class Transaction < Resource
4
+
5
+ # @!attribute account
6
+ # @return [AccountMini]
7
+ define_attribute :account, :AccountMini
8
+
9
+ # @!attribute amount
10
+ # @return [Float] Total transaction amount sent to the payment gateway.
11
+ define_attribute :amount, Float
12
+
13
+ # @!attribute avs_check
14
+ # @return [String] When processed, result from checking the overall AVS on the transaction.
15
+ define_attribute :avs_check, String, {:enum => ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]}
16
+
17
+ # @!attribute billing_address
18
+ # @return [Address]
19
+ define_attribute :billing_address, :Address
20
+
21
+ # @!attribute collected_at
22
+ # @return [DateTime] Collected at, or if not collected yet, the time the transaction was created.
23
+ define_attribute :collected_at, DateTime
24
+
25
+ # @!attribute created_at
26
+ # @return [DateTime] Created at
27
+ define_attribute :created_at, DateTime
28
+
29
+ # @!attribute currency
30
+ # @return [String] 3-letter ISO 4217 currency code.
31
+ define_attribute :currency, String
32
+
33
+ # @!attribute customer_message
34
+ # @return [String] For declined (`success=false`) transactions, the message displayed to the customer.
35
+ define_attribute :customer_message, String
36
+
37
+ # @!attribute customer_message_locale
38
+ # @return [String] Language code for the message
39
+ define_attribute :customer_message_locale, String
40
+
41
+ # @!attribute cvv_check
42
+ # @return [String] When processed, result from checking the CVV/CVC value on the transaction.
43
+ define_attribute :cvv_check, String, {:enum => ["D", "I", "M", "N", "P", "S", "U", "X"]}
44
+
45
+ # @!attribute gateway_approval_code
46
+ # @return [String] Transaction approval code from the payment gateway.
47
+ define_attribute :gateway_approval_code, String
48
+
49
+ # @!attribute gateway_message
50
+ # @return [String] Transaction message from the payment gateway.
51
+ define_attribute :gateway_message, String
52
+
53
+ # @!attribute gateway_reference
54
+ # @return [String] Transaction reference number from the payment gateway.
55
+ define_attribute :gateway_reference, String
56
+
57
+ # @!attribute gateway_response_code
58
+ # @return [String] For declined transactions (`success=false`), this field lists the gateway error code.
59
+ define_attribute :gateway_response_code, String
60
+
61
+ # @!attribute gateway_response_time
62
+ # @return [Integer] Time, in seconds, for gateway to process the transaction.
63
+ define_attribute :gateway_response_time, Integer
64
+
65
+ # @!attribute gateway_response_values
66
+ # @return [Hash] The values in this field will vary from gateway to gateway.
67
+ define_attribute :gateway_response_values, Hash
68
+
69
+ # @!attribute id
70
+ # @return [String] Transaction ID
71
+ define_attribute :id, String
72
+
73
+ # @!attribute invoice
74
+ # @return [InvoiceMini]
75
+ define_attribute :invoice, :InvoiceMini
76
+
77
+ # @!attribute ip_address_country
78
+ # @return [String] IP address's country
79
+ define_attribute :ip_address_country, String
80
+
81
+ # @!attribute ip_address_v4
82
+ # @return [String] IP address provided when the billing information was collected: - When the customer enters billing information into the Recurly.JS or Hosted Payment Pages, Recurly records the IP address. - When the merchant enters billing information using the API, the merchant may provide an IP address. - When the merchant enters billing information using the UI, no IP address is recorded.
83
+ define_attribute :ip_address_v4, String
84
+
85
+ # @!attribute object
86
+ # @return [String] Object type
87
+ define_attribute :object, String
88
+
89
+ # @!attribute origin
90
+ # @return [String] Describes how the transaction was triggered.
91
+ define_attribute :origin, String, {:enum => ["api", "hpp", "merchant", "recurly_admin", "recurlyjs", "recurring", "transparent", "force_collect", "refunded_externally", "chargeback"]}
92
+
93
+ # @!attribute original_transaction_id
94
+ # @return [String] If this transaction is a refund (`type=refund`), this will be the ID of the original transaction on the invoice being refunded.
95
+ define_attribute :original_transaction_id, String
96
+
97
+ # @!attribute payment_gateway
98
+ # @return [Hash]
99
+ define_attribute :payment_gateway, Hash
100
+
101
+ # @!attribute payment_method
102
+ # @return [Hash] Payment method (TODO: this overlaps with BillinInfo’s payment_method but only documents credit cards)
103
+ define_attribute :payment_method, Hash
104
+
105
+ # @!attribute refunded
106
+ # @return [Boolean] Indicates if part or all of this transaction was refunded.
107
+ define_attribute :refunded, :Boolean
108
+
109
+ # @!attribute status
110
+ # @return [String] The current transaction status. Note that the status may change, e.g. a `pending` transaction may become `declined` or `success` may later become `void`.
111
+ define_attribute :status, String, {:enum => ["pending", "scheduled", "processing", "success", "void", "declined", "error", "chargeback"]}
112
+
113
+ # @!attribute status_code
114
+ # @return [String] Status code
115
+ define_attribute :status_code, String
116
+
117
+ # @!attribute status_message
118
+ # @return [String] For declined (`success=false`) transactions, the message displayed to the merchant.
119
+ define_attribute :status_message, String
120
+
121
+ # @!attribute subscription_ids
122
+ # @return [Array[String]] If the transaction is charging or refunding for one or more subscriptions, these are their IDs.
123
+ define_attribute :subscription_ids, Array, {:item_type => String}
124
+
125
+ # @!attribute success
126
+ # @return [Boolean] Did this transaction complete successfully?
127
+ define_attribute :success, :Boolean
128
+
129
+ # @!attribute type
130
+ # @return [String] Transaction type
131
+ define_attribute :type, String, {:enum => ["authorization", "capture", "purchase", "refund", "verify"]}
132
+
133
+ # @!attribute uuid
134
+ # @return [String] The UUID is useful for matching data with the CSV exports and building URLs into Recurly's UI.
135
+ define_attribute :uuid, String
136
+
137
+ # @!attribute voided_at
138
+ # @return [DateTime] Voided at
139
+ define_attribute :voided_at, DateTime
140
+
141
+ # @!attribute voided_by_invoice
142
+ # @return [InvoiceMini]
143
+ define_attribute :voided_by_invoice, :InvoiceMini
144
+ end
145
+ end
146
+ end
@@ -0,0 +1,38 @@
1
+ module Recurly
2
+ module Resources
3
+ class UniqueCouponCode < Resource
4
+
5
+ # @!attribute code
6
+ # @return [String] The code the customer enters to redeem the coupon.
7
+ define_attribute :code, String
8
+
9
+ # @!attribute [r] created_at
10
+ # @return [DateTime] Created at
11
+ define_attribute :created_at, DateTime, {:read_only => true}
12
+
13
+ # @!attribute expired_at
14
+ # @return [DateTime] The date and time the coupon was expired early or reached its `max_redemptions`.
15
+ define_attribute :expired_at, DateTime
16
+
17
+ # @!attribute [r] id
18
+ # @return [String] Unique Coupon Code ID
19
+ define_attribute :id, String, {:read_only => true}
20
+
21
+ # @!attribute [r] object
22
+ # @return [String] Object type
23
+ define_attribute :object, String, {:read_only => true}
24
+
25
+ # @!attribute [r] redeemed_at
26
+ # @return [DateTime] The date and time the unique coupon code was redeemed.
27
+ define_attribute :redeemed_at, DateTime, {:read_only => true}
28
+
29
+ # @!attribute state
30
+ # @return [String] Indicates if the unique coupon code is redeemable or why not.
31
+ define_attribute :state, String, {:enum => ["redeemable", "maxed_out", "expired", "inactive"]}
32
+
33
+ # @!attribute [r] updated_at
34
+ # @return [DateTime] Updated at
35
+ define_attribute :updated_at, DateTime, {:read_only => true}
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,38 @@
1
+ module Recurly
2
+ module Resources
3
+ class User < Resource
4
+
5
+ # @!attribute [r] created_at
6
+ # @return [DateTime]
7
+ define_attribute :created_at, DateTime, {:read_only => true}
8
+
9
+ # @!attribute [r] deleted_at
10
+ # @return [DateTime]
11
+ define_attribute :deleted_at, DateTime, {:read_only => true}
12
+
13
+ # @!attribute email
14
+ # @return [String]
15
+ define_attribute :email, String
16
+
17
+ # @!attribute first_name
18
+ # @return [String]
19
+ define_attribute :first_name, String
20
+
21
+ # @!attribute [r] id
22
+ # @return [String]
23
+ define_attribute :id, String, {:read_only => true}
24
+
25
+ # @!attribute last_name
26
+ # @return [String]
27
+ define_attribute :last_name, String
28
+
29
+ # @!attribute [r] object
30
+ # @return [String] Object type
31
+ define_attribute :object, String, {:read_only => true}
32
+
33
+ # @!attribute time_zone
34
+ # @return [String]
35
+ define_attribute :time_zone, String
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,53 @@
1
+ require 'date'
2
+
3
+ module Recurly
4
+ class Schema
5
+ # The purpose of this class is to turn Recurly defined
6
+ # JSON data into Recurly ruby objects. It's to be used
7
+ # by the Resource as an extension.
8
+ module JsonDeserializer
9
+ # Gives the class the ability to initialize itself
10
+ # given some json data.
11
+ #
12
+ # @example
13
+ # Recurly::Resources::Account.from_json({"code" => "mycode"})
14
+ # #=> #<Recurly::Resources::Account @attributes={:code=>"mycode"}>
15
+ #
16
+ # @param attributes [Hash] A primitive Hash from JSON.parse of Recurly result.
17
+ # @return [Resource] the {Resource} (ruby object) representing the passed in JSON data.
18
+ def from_json(attributes = {})
19
+ resource = new()
20
+ attributes.each do |attr_name, val|
21
+ next if attr_name == 'object'
22
+
23
+ # if the Hash val is a recurly type, parse it into a Resource
24
+ if val.is_a?(Hash) && klazz = JSONParser.recurly_class(val['object'])
25
+ val = klazz.from_json(val)
26
+ elsif val.is_a?(Array)
27
+ val = val.map do |e|
28
+ if e.is_a?(Hash) && klazz = JSONParser.recurly_class(e['object'])
29
+ klazz.from_json(e)
30
+ else
31
+ e
32
+ end
33
+ end
34
+ elsif attr_name.end_with?("_at") && val && val.is_a?(String)
35
+ # TODO should use the schema to determine this probably
36
+ val = DateTime.parse(val)
37
+ end
38
+
39
+ writer = "#{attr_name}="
40
+
41
+ # TODO maybe check for protected writer first?
42
+ begin
43
+ resource.send(writer, val)
44
+ rescue => e
45
+ # TODO ignoring these missing fields for now
46
+ puts e
47
+ end
48
+ end
49
+ resource
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,71 @@
1
+ require 'json'
2
+
3
+ module Recurly
4
+ # This is a wrapper class to help parse responses into Recurly objects.
5
+ class JSONParser
6
+ # Parses the json body into a recurly object.
7
+ #
8
+ # @param client [Client] The Recurly client which made the request.
9
+ # @param body [String] The JSON string to parse.
10
+ # @return [Resource]
11
+ def self.parse(client, body)
12
+ data = JSON.parse(body)
13
+ from_json(data).tap do |object|
14
+ object.client = client if object.requires_client?
15
+ end
16
+ end
17
+
18
+ # Converts the parsed JSON into a Recurly object.
19
+ #
20
+ # @param data [Hash] The parsed JSON data
21
+ # @return [Error,Resource]
22
+ def self.from_json(data)
23
+ type = if data.has_key?("error")
24
+ "error"
25
+ else
26
+ data.delete('object')
27
+ end
28
+ klazz = self.recurly_class(type)
29
+
30
+ unless klazz
31
+ raise ArgumentError, "Unknown resource for json type #{type}"
32
+ end
33
+
34
+ data = data["error"] if klazz == Resources::Error
35
+
36
+ klazz.from_json(data)
37
+ end
38
+
39
+ # Returns the Recurly ruby class responsible for the Recurly json key.
40
+ # TODO figure out how we should handle nil types
41
+ #
42
+ # @example
43
+ # JSONParser.recurly_class('list')
44
+ # #=> Recurly::Pager
45
+ # @example
46
+ # JSONParser.recurly_class('shipping_address')
47
+ # #=> Recurly::Resources::ShippingAddress
48
+ #
49
+ # @param type [String] The JSON key.
50
+ # @return [Resource,Pager,nil]
51
+ def self.recurly_class(type)
52
+ case type
53
+ when nil
54
+ nil
55
+ when 'list'
56
+ Pager
57
+ else
58
+ type_camelized = type.split('_').map(&:capitalize).join
59
+ if Resources.const_defined?(type_camelized)
60
+ klazz = Resources.const_get(type_camelized)
61
+ if klazz.ancestors.include?(Resource)
62
+ klazz
63
+ else
64
+ # TODO might want to throw an error?
65
+ nil
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,66 @@
1
+ require 'date'
2
+
3
+ module Recurly
4
+ class Schema
5
+ # *Note*: This class is for internal use.
6
+ # The RequestCaster turns mixed data into a pure Hash
7
+ # so it can be serialized into JSON and used as the body of a request.
8
+ # This module is to be extended by the Request class.
9
+ module RequestCaster
10
+ # This method casts the data object (of mixed types) into a Hash ready for JSON
11
+ # serialization. The *schema* will default to the self's schema.
12
+ # You should pass in the schema where possible. This is because objects are serialized
13
+ # differently depending on the context in which they are being written.
14
+ #
15
+ # @example
16
+ # Recurly::Requests::AccountUpdatable.cast(account_code: 'benjamin')
17
+ # #=> {:account_code=>"benjamin"}
18
+ # @example
19
+ # # If you have some mixed data, like passing in an Address, it should cast that
20
+ # # address into a Hash based on the Schema defined in AccountUpdatable
21
+ # address = Recurly::Resources::Address.new(city: 'New Orleans')
22
+ # Recurly::Requests::AccountUpdatable.cast(account_code: 'benjamin', address: address)
23
+ # #=> {:account_code=>"benjamin", :address=>{:city=>"New Orleans"}}
24
+ #
25
+ # @param data [Hash,Resource,Request] The data to transform into a JSON Hash.
26
+ # @param schema [Schema] The schema to use to transform the data into a JSON Hash.
27
+ # @return [Hash] The pure Hash ready to be serialized into JSON.
28
+ def cast(data, schema=self.schema)
29
+ casted = {}
30
+ if data.is_a?(Resource) || data.is_a?(Request)
31
+ data = as_json(data, schema)
32
+ end
33
+
34
+ data.each do |k,v|
35
+ schema_attr = schema.get_attribute(k)
36
+ norm_val = if v.respond_to?(:attributes)
37
+ cast(v, schema_attr.recurly_class.schema)
38
+ elsif v.is_a?(Array)
39
+ v.map do |elem|
40
+ if elem.respond_to?(:attributes)
41
+ cast(elem, schema_attr.recurly_class.schema)
42
+ else
43
+ elem
44
+ end
45
+ end
46
+ elsif v.is_a?(Hash) && schema_attr.type.is_a?(Symbol)
47
+ cast(v, schema_attr.recurly_class.schema)
48
+ else
49
+ v
50
+ end
51
+
52
+ casted[k] = norm_val
53
+ end
54
+
55
+ casted
56
+ end
57
+
58
+ private
59
+
60
+ def as_json(resource, schema)
61
+ writeable_attributes = schema.attributes.reject(&:read_only?).map(&:name)
62
+ resource.attributes.select { |k,_| writeable_attributes.include?(k) }
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,50 @@
1
+ module Recurly
2
+ class Schema
3
+ # A mixin that allows a class to be treated like a recurly
4
+ # object. This gives the class the power to describe
5
+ # it's schema. It adds the *define_attribute* method
6
+ # and a *schema* reader.
7
+ module SchemaFactory
8
+
9
+ # Gets the schema for this class
10
+ # @return [Schema]
11
+ def schema
12
+ @schema ||= ::Recurly::Schema.new
13
+ end
14
+
15
+ protected
16
+
17
+ # Macro that allows this class to define it's schema and associated
18
+ # attribute getters and setters.
19
+ #
20
+ # @example
21
+ # class Account
22
+ # extend Schema::SchemaFactory
23
+ # define_attribute :code, String, {:read_only=>true}
24
+ # end
25
+ # account = Account.new(code: "mycode")
26
+ # account.schema
27
+ # #=> Recurly::Schema
28
+ # acount.code = "newcode" # this method protected since read_only = true
29
+ # account.code
30
+ # #=> "mycode"
31
+ def define_attribute(name, type, options={})
32
+ attribute = schema.add_attribute(name, type, options)
33
+
34
+ # Define the reader
35
+ define_method(name) do
36
+ self.attributes[name]
37
+ end
38
+
39
+ # Define the writer
40
+ define_method("#{name}=") do |val|
41
+ self.attributes[name] = val
42
+ end
43
+
44
+ protected "#{name}=" if attribute.read_only?
45
+
46
+ self
47
+ end
48
+ end
49
+ end
50
+ end