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.
- checksums.yaml +4 -4
- data/.gitignore +14 -0
- data/.rspec +2 -0
- data/.travis.yml +5 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +158 -110
- data/Rakefile +6 -0
- data/bin/bundle +105 -0
- data/bin/coderay +29 -0
- data/bin/console +14 -0
- data/bin/htmldiff +29 -0
- data/bin/ldiff +29 -0
- data/bin/pry +29 -0
- data/bin/rake +29 -0
- data/bin/rspec +29 -0
- data/bin/setup +8 -0
- data/bin/yard +29 -0
- data/bin/yardoc +29 -0
- data/bin/yri +29 -0
- data/lib/data/ca-certificates.crt +31 -0
- data/lib/recurly.rb +14 -145
- data/lib/recurly/client.rb +198 -0
- data/lib/recurly/client/operations.rb +935 -0
- data/lib/recurly/errors.rb +34 -0
- data/lib/recurly/errors/api_errors.rb +35 -0
- data/lib/recurly/errors/network_errors.rb +8 -0
- data/lib/recurly/pager.rb +119 -0
- data/lib/recurly/request.rb +30 -0
- data/lib/recurly/requests/account_acquisition_updatable.rb +22 -0
- data/lib/recurly/requests/account_create_only.rb +18 -0
- data/lib/recurly/requests/account_updatable.rb +50 -0
- data/lib/recurly/requests/add_on_create.rb +38 -0
- data/lib/recurly/requests/add_on_update.rb +38 -0
- data/lib/recurly/requests/address.rb +42 -0
- data/lib/recurly/requests/billing_info_create.rb +58 -0
- data/lib/recurly/requests/coupon_create_only.rb +66 -0
- data/lib/recurly/requests/coupon_updatable.rb +30 -0
- data/lib/recurly/requests/create_account.rb +62 -0
- data/lib/recurly/requests/create_coupon.rb +90 -0
- data/lib/recurly/requests/invoice_create.rb +42 -0
- data/lib/recurly/requests/invoice_refund.rb +30 -0
- data/lib/recurly/requests/line_item_create.rb +46 -0
- data/lib/recurly/requests/plan_create.rb +66 -0
- data/lib/recurly/requests/plan_update.rb +70 -0
- data/lib/recurly/requests/shipping_address_create.rb +58 -0
- data/lib/recurly/requests/shipping_address_update.rb +62 -0
- data/lib/recurly/requests/subscription_add_on_create.rb +22 -0
- data/lib/recurly/requests/subscription_change_create.rb +42 -0
- data/lib/recurly/requests/subscription_create.rb +86 -0
- data/lib/recurly/requests/subscription_update.rb +42 -0
- data/lib/recurly/requests/update_coupon.rb +30 -0
- data/lib/recurly/resource.rb +16 -1103
- data/lib/recurly/resources/account.rb +86 -0
- data/lib/recurly/resources/account_acquisition.rb +42 -0
- data/lib/recurly/resources/account_balance.rb +22 -0
- data/lib/recurly/resources/account_note.rb +30 -0
- data/lib/recurly/resources/add_on.rb +62 -0
- data/lib/recurly/resources/address.rb +42 -0
- data/lib/recurly/resources/billing_info.rb +62 -0
- data/lib/recurly/resources/coupon.rb +110 -0
- data/lib/recurly/resources/coupon_discount.rb +22 -0
- data/lib/recurly/resources/coupon_redemption.rb +46 -0
- data/lib/recurly/resources/credit_payment.rb +62 -0
- data/lib/recurly/resources/error.rb +18 -0
- data/lib/recurly/resources/error_may_have_transaction.rb +22 -0
- data/lib/recurly/resources/invoice.rb +138 -0
- data/lib/recurly/resources/invoice_collection.rb +18 -0
- data/lib/recurly/resources/line_item.rb +166 -0
- data/lib/recurly/resources/plan.rb +86 -0
- data/lib/recurly/resources/settings.rb +18 -0
- data/lib/recurly/resources/shipping_address.rb +74 -0
- data/lib/recurly/resources/site.rb +46 -0
- data/lib/recurly/resources/subscription.rb +134 -0
- data/lib/recurly/resources/subscription_add_on.rb +42 -0
- data/lib/recurly/resources/subscription_change.rb +54 -0
- data/lib/recurly/resources/tax_info.rb +18 -0
- data/lib/recurly/resources/transaction.rb +146 -0
- data/lib/recurly/resources/unique_coupon_code.rb +38 -0
- data/lib/recurly/resources/user.rb +38 -0
- data/lib/recurly/schema.rb +114 -0
- data/lib/recurly/schema/json_deserializer.rb +53 -0
- data/lib/recurly/schema/json_parser.rb +71 -0
- data/lib/recurly/schema/request_caster.rb +66 -0
- data/lib/recurly/schema/schema_factory.rb +50 -0
- data/lib/recurly/schema/schema_validator.rb +125 -0
- data/lib/recurly/version.rb +1 -10
- data/recurly.gemspec +32 -0
- data/scripts/build +4 -0
- data/scripts/clean +6 -0
- data/scripts/test +3 -0
- metadata +121 -245
- data/lib/recurly/account.rb +0 -190
- data/lib/recurly/account_acquisition.rb +0 -27
- data/lib/recurly/account_balance.rb +0 -21
- data/lib/recurly/add_on.rb +0 -44
- data/lib/recurly/address.rb +0 -25
- data/lib/recurly/adjustment.rb +0 -81
- data/lib/recurly/api.rb +0 -110
- data/lib/recurly/api/errors.rb +0 -208
- data/lib/recurly/api/net_http_adapter.rb +0 -111
- data/lib/recurly/billing_info.rb +0 -109
- data/lib/recurly/coupon.rb +0 -134
- data/lib/recurly/credit_payment.rb +0 -32
- data/lib/recurly/custom_field.rb +0 -15
- data/lib/recurly/delivery.rb +0 -19
- data/lib/recurly/error.rb +0 -13
- data/lib/recurly/gift_card.rb +0 -85
- data/lib/recurly/helper.rb +0 -51
- data/lib/recurly/invoice.rb +0 -297
- data/lib/recurly/invoice_collection.rb +0 -14
- data/lib/recurly/item.rb +0 -36
- data/lib/recurly/js.rb +0 -14
- data/lib/recurly/juris_detail.rb +0 -15
- data/lib/recurly/measured_unit.rb +0 -16
- data/lib/recurly/money.rb +0 -120
- data/lib/recurly/note.rb +0 -14
- data/lib/recurly/plan.rb +0 -43
- data/lib/recurly/purchase.rb +0 -234
- data/lib/recurly/redemption.rb +0 -46
- data/lib/recurly/resource/association.rb +0 -16
- data/lib/recurly/resource/errors.rb +0 -20
- data/lib/recurly/resource/pager.rb +0 -313
- data/lib/recurly/shipping_address.rb +0 -26
- data/lib/recurly/shipping_fee.rb +0 -17
- data/lib/recurly/shipping_method.rb +0 -13
- data/lib/recurly/subscription.rb +0 -365
- data/lib/recurly/subscription/add_ons.rb +0 -82
- data/lib/recurly/subscription_add_on.rb +0 -58
- data/lib/recurly/tax_detail.rb +0 -16
- data/lib/recurly/tax_type.rb +0 -13
- data/lib/recurly/tier.rb +0 -18
- data/lib/recurly/transaction.rb +0 -131
- data/lib/recurly/transaction/errors.rb +0 -115
- data/lib/recurly/usage.rb +0 -28
- data/lib/recurly/verify.rb +0 -12
- data/lib/recurly/webhook.rb +0 -111
- data/lib/recurly/webhook/account_notification.rb +0 -13
- data/lib/recurly/webhook/billing_info_update_failed_notification.rb +0 -6
- data/lib/recurly/webhook/billing_info_updated_notification.rb +0 -6
- data/lib/recurly/webhook/canceled_account_notification.rb +0 -6
- data/lib/recurly/webhook/canceled_gift_card_notification.rb +0 -6
- data/lib/recurly/webhook/canceled_subscription_notification.rb +0 -6
- data/lib/recurly/webhook/closed_credit_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/closed_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/credit_payment_notification.rb +0 -12
- data/lib/recurly/webhook/deactivated_item_notification.rb +0 -6
- data/lib/recurly/webhook/deleted_shipping_address_notification.rb +0 -6
- data/lib/recurly/webhook/dunning_notification.rb +0 -14
- data/lib/recurly/webhook/expired_subscription_notification.rb +0 -6
- data/lib/recurly/webhook/failed_charge_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/failed_payment_notification.rb +0 -6
- data/lib/recurly/webhook/fraud_info_updated_notification.rb +0 -6
- data/lib/recurly/webhook/gift_card_notification.rb +0 -8
- data/lib/recurly/webhook/invoice_notification.rb +0 -12
- data/lib/recurly/webhook/item_notification.rb +0 -7
- data/lib/recurly/webhook/low_balance_gift_card_notification.rb +0 -6
- data/lib/recurly/webhook/new_account_notification.rb +0 -6
- data/lib/recurly/webhook/new_charge_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/new_credit_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/new_credit_payment_notification.rb +0 -6
- data/lib/recurly/webhook/new_dunning_event_notification.rb +0 -6
- data/lib/recurly/webhook/new_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/new_item_notification.rb +0 -6
- data/lib/recurly/webhook/new_shipping_address_notification.rb +0 -6
- data/lib/recurly/webhook/new_subscription_notification.rb +0 -6
- data/lib/recurly/webhook/new_usage_notification.rb +0 -8
- data/lib/recurly/webhook/notification.rb +0 -18
- data/lib/recurly/webhook/paid_charge_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/past_due_charge_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/past_due_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/paused_subscription_renewal_notification.rb +0 -6
- data/lib/recurly/webhook/processing_charge_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/processing_credit_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/processing_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/processing_payment_notification.rb +0 -6
- data/lib/recurly/webhook/purchased_gift_card_notification.rb +0 -7
- data/lib/recurly/webhook/reactivated_account_notification.rb +0 -6
- data/lib/recurly/webhook/reactivated_item_notification.rb +0 -6
- data/lib/recurly/webhook/redeemed_gift_card_notification.rb +0 -7
- data/lib/recurly/webhook/regenerated_gift_card_notification.rb +0 -6
- data/lib/recurly/webhook/renewed_subscription_notification.rb +0 -6
- data/lib/recurly/webhook/reopened_charge_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/reopened_credit_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/scheduled_payment_notification.rb +0 -6
- data/lib/recurly/webhook/scheduled_subscription_pause_notification.rb +0 -6
- data/lib/recurly/webhook/subscription_notification.rb +0 -12
- data/lib/recurly/webhook/subscription_pause_canceled_notification.rb +0 -6
- data/lib/recurly/webhook/subscription_pause_modified_notification.rb +0 -6
- data/lib/recurly/webhook/subscription_paused_notification.rb +0 -6
- data/lib/recurly/webhook/subscription_resumed_notification.rb +0 -6
- data/lib/recurly/webhook/successful_payment_notification.rb +0 -6
- data/lib/recurly/webhook/successful_refund_notification.rb +0 -6
- data/lib/recurly/webhook/transaction_authorized_notification.rb +0 -6
- data/lib/recurly/webhook/transaction_notification.rb +0 -12
- data/lib/recurly/webhook/transaction_status_updated_notification.rb +0 -6
- data/lib/recurly/webhook/updated_account_notification.rb +0 -6
- data/lib/recurly/webhook/updated_balance_gift_card_notification.rb +0 -7
- data/lib/recurly/webhook/updated_gift_card_notification.rb +0 -6
- data/lib/recurly/webhook/updated_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/updated_item_notification.rb +0 -6
- data/lib/recurly/webhook/updated_shipping_address_notification.rb +0 -6
- data/lib/recurly/webhook/updated_subscription_notification.rb +0 -6
- data/lib/recurly/webhook/void_payment_notification.rb +0 -6
- data/lib/recurly/webhook/voided_credit_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/voided_credit_payment_notification.rb +0 -6
- data/lib/recurly/xml.rb +0 -122
- data/lib/recurly/xml/nokogiri.rb +0 -60
- 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
|