recurly 2.18.15 → 3.0.0.beta.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (209) 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.rb +14 -145
  23. data/lib/recurly/client.rb +198 -0
  24. data/lib/recurly/client/operations.rb +935 -0
  25. data/lib/recurly/errors.rb +34 -0
  26. data/lib/recurly/errors/api_errors.rb +35 -0
  27. data/lib/recurly/errors/network_errors.rb +8 -0
  28. data/lib/recurly/pager.rb +119 -0
  29. data/lib/recurly/request.rb +30 -0
  30. data/lib/recurly/requests/account_acquisition_updatable.rb +22 -0
  31. data/lib/recurly/requests/account_create_only.rb +18 -0
  32. data/lib/recurly/requests/account_updatable.rb +50 -0
  33. data/lib/recurly/requests/add_on_create.rb +38 -0
  34. data/lib/recurly/requests/add_on_update.rb +38 -0
  35. data/lib/recurly/requests/address.rb +42 -0
  36. data/lib/recurly/requests/billing_info_create.rb +58 -0
  37. data/lib/recurly/requests/coupon_create_only.rb +66 -0
  38. data/lib/recurly/requests/coupon_updatable.rb +30 -0
  39. data/lib/recurly/requests/create_account.rb +62 -0
  40. data/lib/recurly/requests/create_coupon.rb +90 -0
  41. data/lib/recurly/requests/invoice_create.rb +42 -0
  42. data/lib/recurly/requests/invoice_refund.rb +30 -0
  43. data/lib/recurly/requests/line_item_create.rb +46 -0
  44. data/lib/recurly/requests/plan_create.rb +66 -0
  45. data/lib/recurly/requests/plan_update.rb +70 -0
  46. data/lib/recurly/requests/shipping_address_create.rb +58 -0
  47. data/lib/recurly/requests/shipping_address_update.rb +62 -0
  48. data/lib/recurly/requests/subscription_add_on_create.rb +22 -0
  49. data/lib/recurly/requests/subscription_change_create.rb +42 -0
  50. data/lib/recurly/requests/subscription_create.rb +86 -0
  51. data/lib/recurly/requests/subscription_update.rb +42 -0
  52. data/lib/recurly/requests/update_coupon.rb +30 -0
  53. data/lib/recurly/resource.rb +16 -1103
  54. data/lib/recurly/resources/account.rb +86 -0
  55. data/lib/recurly/resources/account_acquisition.rb +42 -0
  56. data/lib/recurly/resources/account_balance.rb +22 -0
  57. data/lib/recurly/resources/account_note.rb +30 -0
  58. data/lib/recurly/resources/add_on.rb +62 -0
  59. data/lib/recurly/resources/address.rb +42 -0
  60. data/lib/recurly/resources/billing_info.rb +62 -0
  61. data/lib/recurly/resources/coupon.rb +110 -0
  62. data/lib/recurly/resources/coupon_discount.rb +22 -0
  63. data/lib/recurly/resources/coupon_redemption.rb +46 -0
  64. data/lib/recurly/resources/credit_payment.rb +62 -0
  65. data/lib/recurly/resources/error.rb +18 -0
  66. data/lib/recurly/resources/error_may_have_transaction.rb +22 -0
  67. data/lib/recurly/resources/invoice.rb +138 -0
  68. data/lib/recurly/resources/invoice_collection.rb +18 -0
  69. data/lib/recurly/resources/line_item.rb +166 -0
  70. data/lib/recurly/resources/plan.rb +86 -0
  71. data/lib/recurly/resources/settings.rb +18 -0
  72. data/lib/recurly/resources/shipping_address.rb +74 -0
  73. data/lib/recurly/resources/site.rb +46 -0
  74. data/lib/recurly/resources/subscription.rb +134 -0
  75. data/lib/recurly/resources/subscription_add_on.rb +42 -0
  76. data/lib/recurly/resources/subscription_change.rb +54 -0
  77. data/lib/recurly/resources/tax_info.rb +18 -0
  78. data/lib/recurly/resources/transaction.rb +146 -0
  79. data/lib/recurly/resources/unique_coupon_code.rb +38 -0
  80. data/lib/recurly/resources/user.rb +38 -0
  81. data/lib/recurly/schema.rb +114 -0
  82. data/lib/recurly/schema/json_deserializer.rb +53 -0
  83. data/lib/recurly/schema/json_parser.rb +71 -0
  84. data/lib/recurly/schema/request_caster.rb +66 -0
  85. data/lib/recurly/schema/schema_factory.rb +50 -0
  86. data/lib/recurly/schema/schema_validator.rb +125 -0
  87. data/lib/recurly/version.rb +1 -10
  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 +121 -245
  93. data/lib/recurly/account.rb +0 -190
  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 -44
  97. data/lib/recurly/address.rb +0 -25
  98. data/lib/recurly/adjustment.rb +0 -81
  99. data/lib/recurly/api.rb +0 -110
  100. data/lib/recurly/api/errors.rb +0 -208
  101. data/lib/recurly/api/net_http_adapter.rb +0 -111
  102. data/lib/recurly/billing_info.rb +0 -109
  103. data/lib/recurly/coupon.rb +0 -134
  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/error.rb +0 -13
  108. data/lib/recurly/gift_card.rb +0 -85
  109. data/lib/recurly/helper.rb +0 -51
  110. data/lib/recurly/invoice.rb +0 -297
  111. data/lib/recurly/invoice_collection.rb +0 -14
  112. data/lib/recurly/item.rb +0 -36
  113. data/lib/recurly/js.rb +0 -14
  114. data/lib/recurly/juris_detail.rb +0 -15
  115. data/lib/recurly/measured_unit.rb +0 -16
  116. data/lib/recurly/money.rb +0 -120
  117. data/lib/recurly/note.rb +0 -14
  118. data/lib/recurly/plan.rb +0 -43
  119. data/lib/recurly/purchase.rb +0 -234
  120. data/lib/recurly/redemption.rb +0 -46
  121. data/lib/recurly/resource/association.rb +0 -16
  122. data/lib/recurly/resource/errors.rb +0 -20
  123. data/lib/recurly/resource/pager.rb +0 -313
  124. data/lib/recurly/shipping_address.rb +0 -26
  125. data/lib/recurly/shipping_fee.rb +0 -17
  126. data/lib/recurly/shipping_method.rb +0 -13
  127. data/lib/recurly/subscription.rb +0 -365
  128. data/lib/recurly/subscription/add_ons.rb +0 -82
  129. data/lib/recurly/subscription_add_on.rb +0 -58
  130. data/lib/recurly/tax_detail.rb +0 -16
  131. data/lib/recurly/tax_type.rb +0 -13
  132. data/lib/recurly/tier.rb +0 -18
  133. data/lib/recurly/transaction.rb +0 -131
  134. data/lib/recurly/transaction/errors.rb +0 -115
  135. data/lib/recurly/usage.rb +0 -28
  136. data/lib/recurly/verify.rb +0 -12
  137. data/lib/recurly/webhook.rb +0 -111
  138. data/lib/recurly/webhook/account_notification.rb +0 -13
  139. data/lib/recurly/webhook/billing_info_update_failed_notification.rb +0 -6
  140. data/lib/recurly/webhook/billing_info_updated_notification.rb +0 -6
  141. data/lib/recurly/webhook/canceled_account_notification.rb +0 -6
  142. data/lib/recurly/webhook/canceled_gift_card_notification.rb +0 -6
  143. data/lib/recurly/webhook/canceled_subscription_notification.rb +0 -6
  144. data/lib/recurly/webhook/closed_credit_invoice_notification.rb +0 -6
  145. data/lib/recurly/webhook/closed_invoice_notification.rb +0 -6
  146. data/lib/recurly/webhook/credit_payment_notification.rb +0 -12
  147. data/lib/recurly/webhook/deactivated_item_notification.rb +0 -6
  148. data/lib/recurly/webhook/deleted_shipping_address_notification.rb +0 -6
  149. data/lib/recurly/webhook/dunning_notification.rb +0 -14
  150. data/lib/recurly/webhook/expired_subscription_notification.rb +0 -6
  151. data/lib/recurly/webhook/failed_charge_invoice_notification.rb +0 -6
  152. data/lib/recurly/webhook/failed_payment_notification.rb +0 -6
  153. data/lib/recurly/webhook/fraud_info_updated_notification.rb +0 -6
  154. data/lib/recurly/webhook/gift_card_notification.rb +0 -8
  155. data/lib/recurly/webhook/invoice_notification.rb +0 -12
  156. data/lib/recurly/webhook/item_notification.rb +0 -7
  157. data/lib/recurly/webhook/low_balance_gift_card_notification.rb +0 -6
  158. data/lib/recurly/webhook/new_account_notification.rb +0 -6
  159. data/lib/recurly/webhook/new_charge_invoice_notification.rb +0 -6
  160. data/lib/recurly/webhook/new_credit_invoice_notification.rb +0 -6
  161. data/lib/recurly/webhook/new_credit_payment_notification.rb +0 -6
  162. data/lib/recurly/webhook/new_dunning_event_notification.rb +0 -6
  163. data/lib/recurly/webhook/new_invoice_notification.rb +0 -6
  164. data/lib/recurly/webhook/new_item_notification.rb +0 -6
  165. data/lib/recurly/webhook/new_shipping_address_notification.rb +0 -6
  166. data/lib/recurly/webhook/new_subscription_notification.rb +0 -6
  167. data/lib/recurly/webhook/new_usage_notification.rb +0 -8
  168. data/lib/recurly/webhook/notification.rb +0 -18
  169. data/lib/recurly/webhook/paid_charge_invoice_notification.rb +0 -6
  170. data/lib/recurly/webhook/past_due_charge_invoice_notification.rb +0 -6
  171. data/lib/recurly/webhook/past_due_invoice_notification.rb +0 -6
  172. data/lib/recurly/webhook/paused_subscription_renewal_notification.rb +0 -6
  173. data/lib/recurly/webhook/processing_charge_invoice_notification.rb +0 -6
  174. data/lib/recurly/webhook/processing_credit_invoice_notification.rb +0 -6
  175. data/lib/recurly/webhook/processing_invoice_notification.rb +0 -6
  176. data/lib/recurly/webhook/processing_payment_notification.rb +0 -6
  177. data/lib/recurly/webhook/purchased_gift_card_notification.rb +0 -7
  178. data/lib/recurly/webhook/reactivated_account_notification.rb +0 -6
  179. data/lib/recurly/webhook/reactivated_item_notification.rb +0 -6
  180. data/lib/recurly/webhook/redeemed_gift_card_notification.rb +0 -7
  181. data/lib/recurly/webhook/regenerated_gift_card_notification.rb +0 -6
  182. data/lib/recurly/webhook/renewed_subscription_notification.rb +0 -6
  183. data/lib/recurly/webhook/reopened_charge_invoice_notification.rb +0 -6
  184. data/lib/recurly/webhook/reopened_credit_invoice_notification.rb +0 -6
  185. data/lib/recurly/webhook/scheduled_payment_notification.rb +0 -6
  186. data/lib/recurly/webhook/scheduled_subscription_pause_notification.rb +0 -6
  187. data/lib/recurly/webhook/subscription_notification.rb +0 -12
  188. data/lib/recurly/webhook/subscription_pause_canceled_notification.rb +0 -6
  189. data/lib/recurly/webhook/subscription_pause_modified_notification.rb +0 -6
  190. data/lib/recurly/webhook/subscription_paused_notification.rb +0 -6
  191. data/lib/recurly/webhook/subscription_resumed_notification.rb +0 -6
  192. data/lib/recurly/webhook/successful_payment_notification.rb +0 -6
  193. data/lib/recurly/webhook/successful_refund_notification.rb +0 -6
  194. data/lib/recurly/webhook/transaction_authorized_notification.rb +0 -6
  195. data/lib/recurly/webhook/transaction_notification.rb +0 -12
  196. data/lib/recurly/webhook/transaction_status_updated_notification.rb +0 -6
  197. data/lib/recurly/webhook/updated_account_notification.rb +0 -6
  198. data/lib/recurly/webhook/updated_balance_gift_card_notification.rb +0 -7
  199. data/lib/recurly/webhook/updated_gift_card_notification.rb +0 -6
  200. data/lib/recurly/webhook/updated_invoice_notification.rb +0 -6
  201. data/lib/recurly/webhook/updated_item_notification.rb +0 -6
  202. data/lib/recurly/webhook/updated_shipping_address_notification.rb +0 -6
  203. data/lib/recurly/webhook/updated_subscription_notification.rb +0 -6
  204. data/lib/recurly/webhook/void_payment_notification.rb +0 -6
  205. data/lib/recurly/webhook/voided_credit_invoice_notification.rb +0 -6
  206. data/lib/recurly/webhook/voided_credit_payment_notification.rb +0 -6
  207. data/lib/recurly/xml.rb +0 -122
  208. data/lib/recurly/xml/nokogiri.rb +0 -60
  209. data/lib/recurly/xml/rexml.rb +0 -52
@@ -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,114 @@
1
+ module Recurly
2
+ # The class responsible for describing a schema.
3
+ # This is used for requests and resources.
4
+ class Schema
5
+ # The attributes in the schema
6
+ # @return [Array<Attribute>]
7
+ attr_reader :attributes
8
+
9
+ def initialize
10
+ @attributes = []
11
+ end
12
+
13
+ # Adds an attribute to the schema definition
14
+ #
15
+ # @param name [Symbol] The name of the attribute
16
+ # @param type [Class,Symbol] The type of the attribute. Use capitalized symbol for Recurly class. Example: :Account.
17
+ # @param options [Hash] The attribute options. See {Attribute#options}
18
+ def add_attribute(name, type, options)
19
+ attribute = Attribute.new(name, type, options)
20
+ @attributes.push(attribute)
21
+ attribute
22
+ end
23
+
24
+ # Gets an attribute from this schema given a name
25
+ #
26
+ # @param name [String,Symbol] The name/key of the attribute
27
+ # @return [Attribute,nil] The found Attribute. nil if not found.
28
+ def get_attribute(name)
29
+ name = name.to_s
30
+ @attributes.find { |a| a.name.to_s == name }
31
+ end
32
+
33
+ # Gets a recurly class given a symbol name.
34
+ #
35
+ # @example
36
+ # Schema.get_recurly_class(:Account)
37
+ # #=> Recurly::Resources::Account
38
+ #
39
+ # @param type [Symbol] The name of the class you wish to find
40
+ # @return [Request,Resource]
41
+ # @raise ArgumentError If class can't be found.
42
+ def self.get_recurly_class(type)
43
+ raise ArgumentError, "#{type.inspect} must be a symbol but is a #{type.class}" unless type.is_a?(Symbol)
44
+
45
+ if Requests.const_defined?(type)
46
+ Requests.const_get(type)
47
+ elsif Resources.const_defined?(type)
48
+ Resources.const_get(type)
49
+ else
50
+ raise ArgumentError, "Recurly type '#{type}' is unknown"
51
+ end
52
+ end
53
+
54
+ # Describes a list attribute type
55
+ class List
56
+ # The type of the elements of the list
57
+ # @return [Symbol]
58
+ attr_accessor :item_type
59
+
60
+ def initialize(item_type)
61
+ @item_type = item_type
62
+ end
63
+
64
+ def to_s
65
+ "List<#{item_type}>"
66
+ end
67
+ end
68
+
69
+ # Describes and attribute for a schema.
70
+ class Attribute
71
+ # The name of the attribute.
72
+ # @return [Symbol]
73
+ attr_accessor :name
74
+
75
+ # The type of the attribute. Might be a class like `DateTime`
76
+ # or could be a Recurly object. In this case a symbol should be used.
77
+ # Example: :Account
78
+ # @return [Class,Symbol]
79
+ attr_accessor :type
80
+
81
+ # Options for the attribute.
82
+ # @return [Hash]
83
+ attr_accessor :options
84
+
85
+ # The description of the attribute for documentation.
86
+ # @return [String]
87
+ attr_accessor :description
88
+
89
+ def initialize(name, type, options={}, description=nil)
90
+ @name = name
91
+ @type = type
92
+ @options = options
93
+ @description = description
94
+ end
95
+
96
+ def read_only?
97
+ @options.fetch(:read_only, false)
98
+ end
99
+
100
+ def recurly_class
101
+ Schema.get_recurly_class(type == Array ? options[:item_type] : type)
102
+ end
103
+ end
104
+
105
+ private_constant :List
106
+ private_constant :Attribute
107
+ end
108
+
109
+
110
+ require_relative './schema/schema_factory'
111
+ require_relative './schema/schema_validator'
112
+ require_relative './schema/json_deserializer'
113
+ require_relative './schema/request_caster'
114
+ 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