recurly 2.20.3 → 3.0.0.beta.1
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.
- 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/client/operations.rb +935 -0
- data/lib/recurly/client.rb +198 -0
- data/lib/recurly/errors/api_errors.rb +35 -0
- data/lib/recurly/errors/network_errors.rb +8 -0
- data/lib/recurly/errors.rb +34 -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 -1114
- 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/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/schema.rb +114 -0
- data/lib/recurly/version.rb +1 -10
- data/lib/recurly.rb +14 -167
- data/recurly.gemspec +32 -0
- data/scripts/build +4 -0
- data/scripts/clean +6 -0
- data/scripts/test +3 -0
- metadata +129 -196
- data/lib/recurly/account.rb +0 -230
- data/lib/recurly/account_acquisition.rb +0 -27
- data/lib/recurly/account_balance.rb +0 -23
- data/lib/recurly/add_on.rb +0 -52
- data/lib/recurly/address.rb +0 -25
- data/lib/recurly/adjustment.rb +0 -100
- data/lib/recurly/api/errors.rb +0 -208
- data/lib/recurly/api/net_http_adapter.rb +0 -111
- data/lib/recurly/api.rb +0 -110
- data/lib/recurly/billing_info.rb +0 -134
- data/lib/recurly/business_entity.rb +0 -35
- data/lib/recurly/coupon.rb +0 -136
- data/lib/recurly/credit_payment.rb +0 -32
- data/lib/recurly/currency_percentage_tier.rb +0 -17
- data/lib/recurly/custom_field.rb +0 -15
- data/lib/recurly/custom_field_definition.rb +0 -14
- data/lib/recurly/customer_permission.rb +0 -10
- data/lib/recurly/delivery.rb +0 -19
- data/lib/recurly/dunning_campaign.rb +0 -30
- data/lib/recurly/dunning_cycle.rb +0 -18
- data/lib/recurly/entitlement.rb +0 -19
- data/lib/recurly/error.rb +0 -13
- data/lib/recurly/external_account.rb +0 -17
- data/lib/recurly/external_charge.rb +0 -20
- data/lib/recurly/external_invoice.rb +0 -27
- data/lib/recurly/external_payment_phase.rb +0 -27
- data/lib/recurly/external_product.rb +0 -34
- data/lib/recurly/external_product_reference.rb +0 -18
- data/lib/recurly/external_subscription.rb +0 -62
- data/lib/recurly/gateway_attribute.rb +0 -10
- data/lib/recurly/general_ledger_account.rb +0 -16
- data/lib/recurly/gift_card.rb +0 -85
- data/lib/recurly/helper.rb +0 -51
- data/lib/recurly/invoice.rb +0 -354
- data/lib/recurly/invoice_collection.rb +0 -14
- data/lib/recurly/invoice_template.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/percentage_tier.rb +0 -17
- data/lib/recurly/performance_obligation.rb +0 -15
- data/lib/recurly/plan.rb +0 -59
- data/lib/recurly/plan_ramp_interval.rb +0 -10
- data/lib/recurly/purchase.rb +0 -239
- 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/rev_rec.rb +0 -18
- 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/sub_add_on_percentage_tier.rb +0 -17
- data/lib/recurly/subscription/add_ons.rb +0 -82
- data/lib/recurly/subscription.rb +0 -374
- data/lib/recurly/subscription_add_on.rb +0 -64
- data/lib/recurly/subscription_ramp_interval.rb +0 -12
- data/lib/recurly/tax_detail.rb +0 -18
- data/lib/recurly/tax_type.rb +0 -13
- data/lib/recurly/tier.rb +0 -18
- data/lib/recurly/transaction/errors.rb +0 -119
- data/lib/recurly/transaction.rb +0 -132
- data/lib/recurly/usage.rb +0 -29
- data/lib/recurly/verify.rb +0 -12
- 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/prerenewal_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/scheduled_subscription_update_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/webhook.rb +0 -113
- data/lib/recurly/xml/nokogiri.rb +0 -60
- data/lib/recurly/xml/rexml.rb +0 -52
- data/lib/recurly/xml.rb +0 -122
@@ -1,23 +0,0 @@
|
|
1
|
-
module Recurly
|
2
|
-
# The AccountBalance object contains some information about the account's balance.
|
3
|
-
# It exists to give us parity with the v1 API which used to include this information with
|
4
|
-
# the {Account}. You can get an account's balance by calling {Account#account_balance} on an account instance.
|
5
|
-
#
|
6
|
-
# Recurly Documentation: https://dev.recurly.com/docs/lookup-account-balance
|
7
|
-
class AccountBalance < Resource
|
8
|
-
# @return [Account, nil]
|
9
|
-
has_one :account, readonly: true
|
10
|
-
|
11
|
-
define_attribute_methods %w(
|
12
|
-
past_due
|
13
|
-
balance_in_cents
|
14
|
-
processing_prepayment_balance_in_cents
|
15
|
-
available_credit_balance_in_cents
|
16
|
-
)
|
17
|
-
|
18
|
-
# This object does not represent a model on the server side
|
19
|
-
# so we do not need to expose these methods.
|
20
|
-
protected(*%w(save save!))
|
21
|
-
private_class_method(*%w(all find_each first paginate scoped where create! create))
|
22
|
-
end
|
23
|
-
end
|
data/lib/recurly/add_on.rb
DELETED
@@ -1,52 +0,0 @@
|
|
1
|
-
module Recurly
|
2
|
-
class AddOn < Resource
|
3
|
-
# @return [Plan]
|
4
|
-
belongs_to :plan
|
5
|
-
# @return [[Tier], []]
|
6
|
-
has_many :tiers, class_name: :Tier, readonly: false
|
7
|
-
# @return [[PercentageTier], []]
|
8
|
-
has_many :percentage_tiers, class_name: :CurrencyPercentageTier, readonly: false
|
9
|
-
|
10
|
-
define_attribute_methods %w(
|
11
|
-
add_on_code
|
12
|
-
item_code
|
13
|
-
name
|
14
|
-
item_state
|
15
|
-
accounting_code
|
16
|
-
default_quantity
|
17
|
-
unit_amount_in_cents
|
18
|
-
display_quantity_on_hosted_page
|
19
|
-
tax_code
|
20
|
-
add_on_type
|
21
|
-
measured_unit_id
|
22
|
-
optional
|
23
|
-
usage_type
|
24
|
-
usage_percentage
|
25
|
-
revenue_schedule_type
|
26
|
-
created_at
|
27
|
-
updated_at
|
28
|
-
tier_type
|
29
|
-
usage_timeframe
|
30
|
-
usage_calculation_type
|
31
|
-
external_sku
|
32
|
-
avalara_service_type
|
33
|
-
avalara_transaction_type
|
34
|
-
) + RevRec::PRODUCT_ATTRIBUTES
|
35
|
-
alias to_param add_on_code
|
36
|
-
alias quantity default_quantity
|
37
|
-
|
38
|
-
def changed_attributes
|
39
|
-
attrs = super
|
40
|
-
if tiers.any?(&:changed?)
|
41
|
-
attrs['tiers'] = tiers.select(&:changed?)
|
42
|
-
elsif percentage_tiers.any?(&:changed?)
|
43
|
-
attrs['percentage_tiers'] = percentage_tiers.select(&:changed?)
|
44
|
-
end
|
45
|
-
attrs
|
46
|
-
end
|
47
|
-
|
48
|
-
# Add-ons are only writeable and readable through {Plan} instances.
|
49
|
-
embedded!
|
50
|
-
private_class_method :find
|
51
|
-
end
|
52
|
-
end
|
data/lib/recurly/address.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
module Recurly
|
2
|
-
class Address < Resource
|
3
|
-
define_attribute_methods %w(
|
4
|
-
first_name
|
5
|
-
last_name
|
6
|
-
name_on_account
|
7
|
-
company
|
8
|
-
address1
|
9
|
-
address2
|
10
|
-
city
|
11
|
-
state
|
12
|
-
zip
|
13
|
-
country
|
14
|
-
phone
|
15
|
-
geo_code
|
16
|
-
)
|
17
|
-
|
18
|
-
# This ensures every attribute is rendered
|
19
|
-
# when updating. The Address object does not
|
20
|
-
# accept partial updates on the server
|
21
|
-
def xml_keys
|
22
|
-
attributes.keys
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
data/lib/recurly/adjustment.rb
DELETED
@@ -1,100 +0,0 @@
|
|
1
|
-
module Recurly
|
2
|
-
# The history of your customer's Recurly account can be tracked through adjustments, made up of credits and charges.
|
3
|
-
#
|
4
|
-
# Recurly Documentation: https://dev.recurly.com/docs/adjustment-object
|
5
|
-
class Adjustment < Resource
|
6
|
-
# @macro [attach] scope
|
7
|
-
# @scope class
|
8
|
-
# @return [Pager<Adjustment>] a pager that yields +$1+.
|
9
|
-
scope :charges, type: 'charge'
|
10
|
-
scope :credits, type: 'credit'
|
11
|
-
scope :pending, state: 'pending'
|
12
|
-
scope :invoiced, state: 'invoiced'
|
13
|
-
|
14
|
-
# @return [Account, nil]
|
15
|
-
belongs_to :account
|
16
|
-
# @return [Account, nil]
|
17
|
-
belongs_to :bill_for_account, class_name: :Account, readonly: true
|
18
|
-
# @return [Invoice, nil]
|
19
|
-
belongs_to :invoice
|
20
|
-
# @return [Subscription, nil]
|
21
|
-
belongs_to :subscription
|
22
|
-
|
23
|
-
# @return [Pager<Adjustment>, []]
|
24
|
-
has_many :credit_adjustments, class_name: :Adjustment, readonly: true
|
25
|
-
|
26
|
-
# @return [ShippingAddress, nil]
|
27
|
-
has_one :shipping_address, class_name: :ShippingAddress, readonly: false
|
28
|
-
|
29
|
-
# @return [[CustomField], []]
|
30
|
-
has_many :custom_fields, class_name: :CustomField, readonly: false
|
31
|
-
|
32
|
-
define_attribute_methods %w[
|
33
|
-
uuid
|
34
|
-
state
|
35
|
-
description
|
36
|
-
accounting_code
|
37
|
-
origin
|
38
|
-
unit_amount_in_cents
|
39
|
-
quantity
|
40
|
-
quantity_decimal
|
41
|
-
discount_in_cents
|
42
|
-
total_in_cents
|
43
|
-
currency
|
44
|
-
product_code
|
45
|
-
item_code
|
46
|
-
external_sku
|
47
|
-
start_date
|
48
|
-
end_date
|
49
|
-
created_at
|
50
|
-
updated_at
|
51
|
-
quantity_remaining
|
52
|
-
quantity_decimal_remaining
|
53
|
-
revenue_schedule_type
|
54
|
-
tax_in_cents
|
55
|
-
tax_type
|
56
|
-
tax_region
|
57
|
-
tax_rate
|
58
|
-
origin_tax_address_source
|
59
|
-
destination_tax_address_source
|
60
|
-
tax_exempt
|
61
|
-
tax_inclusive
|
62
|
-
tax_code
|
63
|
-
tax_details
|
64
|
-
tax_types
|
65
|
-
proration_rate
|
66
|
-
credit_reason_code
|
67
|
-
original_adjustment_uuid
|
68
|
-
shipping_address_id
|
69
|
-
surcharge_in_cents
|
70
|
-
avalara_transaction_type
|
71
|
-
avalara_service_type
|
72
|
-
refundable_total_in_cents
|
73
|
-
] + RevRec::ALL_ATTRIBUTES
|
74
|
-
alias to_param uuid
|
75
|
-
|
76
|
-
# @return ["charge", "credit", nil] The type of adjustment.
|
77
|
-
attr_reader :type
|
78
|
-
|
79
|
-
# Adjustments should be built through {Account} instances.
|
80
|
-
#
|
81
|
-
# @return [Adjustment] A new adjustment.
|
82
|
-
# @example
|
83
|
-
# account.adjustments.new attributes
|
84
|
-
# @see Resource#initialize
|
85
|
-
def initialize(attributes = {})
|
86
|
-
super({ :currency => Recurly.default_currency }.merge attributes)
|
87
|
-
end
|
88
|
-
|
89
|
-
def changed_attributes
|
90
|
-
attrs = super
|
91
|
-
if custom_fields.any?(&:changed?)
|
92
|
-
attrs['custom_fields'] = custom_fields.select(&:changed?)
|
93
|
-
end
|
94
|
-
attrs
|
95
|
-
end
|
96
|
-
|
97
|
-
# Adjustments are only writeable through an {Account} instance.
|
98
|
-
embedded! true
|
99
|
-
end
|
100
|
-
end
|
data/lib/recurly/api/errors.rb
DELETED
@@ -1,208 +0,0 @@
|
|
1
|
-
require 'cgi'
|
2
|
-
|
3
|
-
module Recurly
|
4
|
-
class API
|
5
|
-
# The superclass to all errors that occur when making an API request.
|
6
|
-
class ResponseError < Error
|
7
|
-
attr_reader :request
|
8
|
-
attr_reader :response
|
9
|
-
|
10
|
-
def initialize request, response
|
11
|
-
@request, @response = request, response
|
12
|
-
end
|
13
|
-
|
14
|
-
def code
|
15
|
-
response.code.to_i if response
|
16
|
-
end
|
17
|
-
|
18
|
-
def to_s
|
19
|
-
if description
|
20
|
-
return CGI.unescapeHTML [description, details].compact.join(' ')
|
21
|
-
end
|
22
|
-
|
23
|
-
return super unless code
|
24
|
-
"%d %s (%s %s)" % [
|
25
|
-
code, http_error, request.method, API.base_uri + request.path
|
26
|
-
]
|
27
|
-
end
|
28
|
-
|
29
|
-
def symbol
|
30
|
-
xml and xml.root and xml.text '/error/symbol'
|
31
|
-
end
|
32
|
-
|
33
|
-
def description
|
34
|
-
xml and xml.root and xml.text '/error/description'
|
35
|
-
end
|
36
|
-
|
37
|
-
def details
|
38
|
-
xml and xml.root and xml.text '/error/details'
|
39
|
-
end
|
40
|
-
|
41
|
-
private
|
42
|
-
|
43
|
-
def http_error
|
44
|
-
Helper.demodulize self.class.name.gsub(/([a-z])([A-Z])/, '\1 \2')
|
45
|
-
end
|
46
|
-
|
47
|
-
def xml
|
48
|
-
@xml ||= begin
|
49
|
-
XML.new(response.body) if response and response.body and not response.body.empty?
|
50
|
-
rescue Recurly::XML::ParseError
|
51
|
-
nil
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
# === 3xx Redirection
|
57
|
-
#
|
58
|
-
# Not an error, per se, but should result in one in the normal course of
|
59
|
-
# API interaction.
|
60
|
-
class Redirection < ResponseError
|
61
|
-
end
|
62
|
-
|
63
|
-
# === 304 Not Modified
|
64
|
-
#
|
65
|
-
# Catchably raised when a request is made with an ETag.
|
66
|
-
class NotModified < ResponseError
|
67
|
-
end
|
68
|
-
|
69
|
-
# === 4xx Client Error
|
70
|
-
#
|
71
|
-
# The superclass to all client errors (responses with status code 4xx).
|
72
|
-
class ClientError < ResponseError
|
73
|
-
end
|
74
|
-
|
75
|
-
# === 400 Bad Request
|
76
|
-
#
|
77
|
-
# The request was invalid or could not be understood by the server.
|
78
|
-
# Resubmitting the request will likely result in the same error.
|
79
|
-
class BadRequest < ClientError
|
80
|
-
end
|
81
|
-
|
82
|
-
# === 401 Unauthorized
|
83
|
-
#
|
84
|
-
# The API key is missing or invalid for the given request.
|
85
|
-
class Unauthorized < ClientError
|
86
|
-
def description
|
87
|
-
response.body.strip
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
# === 402 Payment Required
|
92
|
-
#
|
93
|
-
# Your Recurly account is in production mode but is not in good standing.
|
94
|
-
# Please pay any outstanding invoices.
|
95
|
-
class PaymentRequired < ClientError
|
96
|
-
end
|
97
|
-
|
98
|
-
# === 403 Forbidden
|
99
|
-
#
|
100
|
-
# The login is attempting to perform an action it does not have privileges
|
101
|
-
# to access. The login credentials are correct.
|
102
|
-
class Forbidden < ClientError
|
103
|
-
end
|
104
|
-
|
105
|
-
# === 404 Not Found
|
106
|
-
#
|
107
|
-
# The resource was not found. This may be returned if the given account
|
108
|
-
# code or subscription plan does not exist. The response body will explain
|
109
|
-
# which resource was not found.
|
110
|
-
class NotFound < ClientError
|
111
|
-
end
|
112
|
-
|
113
|
-
# === 405 Method Not Allowed
|
114
|
-
#
|
115
|
-
# A method was attempted where it is not allowed.
|
116
|
-
#
|
117
|
-
# If this is raised, there may be a bug with the client library or with
|
118
|
-
# the server. Please contact support@recurly.com or
|
119
|
-
# {file a bug}[https://github.com/recurly/recurly-client-ruby/issues].
|
120
|
-
class MethodNotAllowed < ClientError
|
121
|
-
end
|
122
|
-
|
123
|
-
# === 406 Not Acceptable
|
124
|
-
#
|
125
|
-
# The request content type was not acceptable.
|
126
|
-
#
|
127
|
-
# If this is raised, there may be a bug with the client library or with
|
128
|
-
# the server. Please contact support@recurly.com or
|
129
|
-
# {file a bug}[https://github.com/recurly/recurly-client-ruby/issues].
|
130
|
-
class NotAcceptable < ClientError
|
131
|
-
end
|
132
|
-
|
133
|
-
# === 412 Precondition Failed
|
134
|
-
#
|
135
|
-
# The request was unsuccessful because a condition was not met. For
|
136
|
-
# example, this message may be returned if you attempt to cancel a
|
137
|
-
# subscription for an account that has no subscription.
|
138
|
-
class PreconditionFailed < ClientError
|
139
|
-
end
|
140
|
-
|
141
|
-
# === 415 Unsupported Media Type
|
142
|
-
#
|
143
|
-
# The request body was not recognized as XML.
|
144
|
-
#
|
145
|
-
# If this is raised, there may be a bug with the client library or with
|
146
|
-
# the server. Please contact support@recurly.com or
|
147
|
-
# {file a bug}[https://github.com/recurly/recurly-client-ruby/issues].
|
148
|
-
class UnsupportedMediaType < ClientError
|
149
|
-
end
|
150
|
-
|
151
|
-
# === 422 Unprocessable Entity
|
152
|
-
#
|
153
|
-
# Could not process a POST or PUT request because the request is invalid.
|
154
|
-
# See the response body for more details.
|
155
|
-
class UnprocessableEntity < ClientError
|
156
|
-
end
|
157
|
-
|
158
|
-
# === 5xx Server Error
|
159
|
-
#
|
160
|
-
# The superclass to all server errors (responses with status code 5xx).
|
161
|
-
class ServerError < ResponseError
|
162
|
-
end
|
163
|
-
|
164
|
-
# === 500 Internal Server Error
|
165
|
-
#
|
166
|
-
# The server encountered an error while processing your request and failed.
|
167
|
-
class InternalServerError < ServerError
|
168
|
-
end
|
169
|
-
|
170
|
-
# === 502 Gateway Error
|
171
|
-
#
|
172
|
-
# The load balancer or web server had trouble connecting to the Recurly.
|
173
|
-
# Please try the request again.
|
174
|
-
class GatewayError < ServerError
|
175
|
-
end
|
176
|
-
|
177
|
-
# === 503 Service Unavailable
|
178
|
-
#
|
179
|
-
# The service is temporarily unavailable. Please try the request again.
|
180
|
-
class ServiceUnavailable < ServerError
|
181
|
-
end
|
182
|
-
|
183
|
-
# Error mapping by status code.
|
184
|
-
ERRORS = Hash.new { |hash, code|
|
185
|
-
unless hash.key? code
|
186
|
-
case code
|
187
|
-
when 400...500 then ClientError
|
188
|
-
when 500...600 then ServerError
|
189
|
-
else ResponseError
|
190
|
-
end
|
191
|
-
end
|
192
|
-
}.update(
|
193
|
-
304 => NotModified,
|
194
|
-
400 => BadRequest,
|
195
|
-
401 => Unauthorized,
|
196
|
-
402 => PaymentRequired,
|
197
|
-
403 => Forbidden,
|
198
|
-
404 => NotFound,
|
199
|
-
406 => NotAcceptable,
|
200
|
-
412 => PreconditionFailed,
|
201
|
-
415 => UnsupportedMediaType,
|
202
|
-
422 => UnprocessableEntity,
|
203
|
-
500 => InternalServerError,
|
204
|
-
502 => GatewayError,
|
205
|
-
503 => ServiceUnavailable
|
206
|
-
).freeze
|
207
|
-
end
|
208
|
-
end
|
@@ -1,111 +0,0 @@
|
|
1
|
-
require 'cgi'
|
2
|
-
require 'net/https'
|
3
|
-
|
4
|
-
module Recurly
|
5
|
-
class API
|
6
|
-
module Net
|
7
|
-
module HTTPAdapter
|
8
|
-
# A hash of Net::HTTP settings configured before the request.
|
9
|
-
#
|
10
|
-
# @return [Hash]
|
11
|
-
def net_http
|
12
|
-
@net_http ||= {}
|
13
|
-
end
|
14
|
-
|
15
|
-
# Used to store any Net::HTTP settings.
|
16
|
-
#
|
17
|
-
# @example
|
18
|
-
# Recurly::API.net_http = {
|
19
|
-
# :verify_mode => OpenSSL::SSL::VERIFY_PEER,
|
20
|
-
# :ca_path => "/etc/ssl/certs",
|
21
|
-
# :ca_file => "/opt/local/share/curl/curl-ca-bundle.crt"
|
22
|
-
# }
|
23
|
-
attr_writer :net_http
|
24
|
-
|
25
|
-
private
|
26
|
-
|
27
|
-
METHODS = {
|
28
|
-
:head => ::Net::HTTP::Head,
|
29
|
-
:get => ::Net::HTTP::Get,
|
30
|
-
:post => ::Net::HTTP::Post,
|
31
|
-
:put => ::Net::HTTP::Put,
|
32
|
-
:delete => ::Net::HTTP::Delete
|
33
|
-
}
|
34
|
-
|
35
|
-
def request method, uri, options = {}
|
36
|
-
head = headers.dup
|
37
|
-
head.update options[:head] if options[:head]
|
38
|
-
head.delete_if { |_, value| value.nil? }
|
39
|
-
uri = base_uri + uri
|
40
|
-
if options[:params] && !options[:params].empty?
|
41
|
-
pairs = options[:params].map { |key, value|
|
42
|
-
"#{CGI.escape key.to_s}=#{CGI.escape value.to_s}"
|
43
|
-
}
|
44
|
-
uri += "?#{pairs.join '&'}"
|
45
|
-
end
|
46
|
-
self.validate_uri!(uri)
|
47
|
-
request = METHODS[method].new uri.request_uri, head
|
48
|
-
request.basic_auth(*[Recurly.api_key, nil].flatten[0, 2])
|
49
|
-
if options[:body]
|
50
|
-
request['Content-Type'] = content_type
|
51
|
-
request.body = options[:body]
|
52
|
-
end
|
53
|
-
if options[:etag]
|
54
|
-
request['If-None-Match'] = options[:etag]
|
55
|
-
end
|
56
|
-
if options[:format]
|
57
|
-
request['Accept'] = FORMATS[options[:format]]
|
58
|
-
end
|
59
|
-
if options[:locale]
|
60
|
-
request['Accept-Language'] = options[:locale]
|
61
|
-
end
|
62
|
-
http = ::Net::HTTP.new uri.host, uri.port
|
63
|
-
http.use_ssl = uri.scheme == 'https'
|
64
|
-
net_http.each_pair { |key, value| http.send "#{key}=", value }
|
65
|
-
|
66
|
-
if Recurly.logger
|
67
|
-
Recurly.log :info, "===> %s %s" % [request.method, uri]
|
68
|
-
headers = request.to_hash
|
69
|
-
headers['authorization'] &&= ['Basic [FILTERED]']
|
70
|
-
Recurly.log :debug, headers.inspect
|
71
|
-
if request.body && !request.body.empty?
|
72
|
-
Recurly.log :debug, XML.filter(request.body)
|
73
|
-
end
|
74
|
-
start_time = Time.now
|
75
|
-
end
|
76
|
-
|
77
|
-
response = http.start { http.request request }
|
78
|
-
code = response.code.to_i
|
79
|
-
|
80
|
-
if Recurly.logger
|
81
|
-
latency = (Time.now - start_time) * 1_000
|
82
|
-
level = case code
|
83
|
-
when 200...300 then :info
|
84
|
-
when 300...400 then :warn
|
85
|
-
when 400...500 then :error
|
86
|
-
else :fatal
|
87
|
-
end
|
88
|
-
Recurly.log level, "<=== %d %s (%.1fms)" % [
|
89
|
-
code,
|
90
|
-
response.class.name[9, response.class.name.length].gsub(
|
91
|
-
/([a-z])([A-Z])/, '\1 \2'
|
92
|
-
),
|
93
|
-
latency
|
94
|
-
]
|
95
|
-
Recurly.log :debug, response.to_hash.inspect
|
96
|
-
Recurly.log :debug, response.body if response.body
|
97
|
-
end
|
98
|
-
|
99
|
-
case code
|
100
|
-
when 200...300 then response
|
101
|
-
else raise ERRORS[code].new request, response
|
102
|
-
end
|
103
|
-
rescue Errno::ECONNREFUSED => e
|
104
|
-
raise Error, e.message
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
extend Net::HTTPAdapter
|
110
|
-
end
|
111
|
-
end
|
data/lib/recurly/api.rb
DELETED
@@ -1,110 +0,0 @@
|
|
1
|
-
module Recurly
|
2
|
-
# The API class handles all requests to the Recurly API. While most of its
|
3
|
-
# functionality is leveraged by the Resource class, it can be used directly,
|
4
|
-
# as well.
|
5
|
-
#
|
6
|
-
# Requests are made with methods named after the four main HTTP verbs
|
7
|
-
# recognized by the Recurly API.
|
8
|
-
#
|
9
|
-
# @example
|
10
|
-
# Recurly::API.get 'accounts' # => #<Net::HTTPOK ...>
|
11
|
-
# Recurly::API.post 'accounts', xml_body # => #<Net::HTTPCreated ...>
|
12
|
-
# Recurly::API.put 'accounts/1', xml_body # => #<Net::HTTPOK ...>
|
13
|
-
# Recurly::API.delete 'accounts/1' # => #<Net::HTTPNoContent ...>
|
14
|
-
class API
|
15
|
-
require 'recurly/api/errors'
|
16
|
-
require 'openssl'
|
17
|
-
|
18
|
-
@@base_uri = "https://api.recurly.com/v2/"
|
19
|
-
@@valid_domains = [".recurly.com"]
|
20
|
-
|
21
|
-
RECURLY_API_VERSION = '2.29'
|
22
|
-
|
23
|
-
FORMATS = Helper.hash_with_indifferent_read_access(
|
24
|
-
'pdf' => 'application/pdf',
|
25
|
-
'xml' => 'application/xml'
|
26
|
-
)
|
27
|
-
|
28
|
-
class << self
|
29
|
-
# Additional HTTP headers sent with each API call
|
30
|
-
# @return [Hash{String => String}]
|
31
|
-
def headers
|
32
|
-
@headers ||= { 'Accept' => accept, 'User-Agent' => user_agent, 'X-Api-Version' => RECURLY_API_VERSION }
|
33
|
-
end
|
34
|
-
|
35
|
-
# @return [String, nil] Accept-Language header value
|
36
|
-
def accept_language
|
37
|
-
headers['Accept-Language']
|
38
|
-
end
|
39
|
-
|
40
|
-
# @param [String] language Accept-Language header value
|
41
|
-
def accept_language=(language)
|
42
|
-
headers['Accept-Language'] = language
|
43
|
-
end
|
44
|
-
|
45
|
-
# @return [Net::HTTPOK, Net::HTTPResponse]
|
46
|
-
# @raise [ResponseError] With a non-2xx status code.
|
47
|
-
def head uri, params = {}, options = {}
|
48
|
-
request :head, uri, { :params => params || {} }.merge(options)
|
49
|
-
end
|
50
|
-
|
51
|
-
# @return [Net::HTTPOK, Net::HTTPResponse]
|
52
|
-
# @raise [ResponseError] With a non-2xx status code.
|
53
|
-
def get uri, params = {}, options = {}
|
54
|
-
request :get, uri, { :params => params || {} }.merge(options)
|
55
|
-
end
|
56
|
-
|
57
|
-
# @return [Net::HTTPCreated, Net::HTTPResponse]
|
58
|
-
# @raise [ResponseError] With a non-2xx status code.
|
59
|
-
def post uri, body = nil, options = {}
|
60
|
-
request :post, uri, { :body => body.to_s }.merge(options)
|
61
|
-
end
|
62
|
-
|
63
|
-
# @return [Net::HTTPOK, Net::HTTPResponse]
|
64
|
-
# @raise [ResponseError] With a non-2xx status code.
|
65
|
-
def put uri, body = nil, options = {}
|
66
|
-
request :put, uri, { :body => body.to_s }.merge(options)
|
67
|
-
end
|
68
|
-
|
69
|
-
# @return [Net::HTTPNoContent, Net::HTTPResponse]
|
70
|
-
# @raise [ResponseError] With a non-2xx status code.
|
71
|
-
def delete uri, body = nil, options = {}
|
72
|
-
request :delete, uri, options
|
73
|
-
end
|
74
|
-
|
75
|
-
# @return [URI::Generic]
|
76
|
-
def base_uri
|
77
|
-
URI.parse @@base_uri.sub('api', Recurly.subdomain)
|
78
|
-
end
|
79
|
-
|
80
|
-
def validate_uri!(uri)
|
81
|
-
domain = @@valid_domains.detect { |d| uri.host.end_with?(d) }
|
82
|
-
unless domain
|
83
|
-
raise ArgumentError, "URI #{uri} is invalid. You may only make requests to a Recurly domain."
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
# @return [String]
|
88
|
-
def user_agent
|
89
|
-
agent_string = "Recurly/#{Version}; #{RUBY_DESCRIPTION};"
|
90
|
-
|
91
|
-
if OpenSSL.const_defined?(:OPENSSL_VERSION)
|
92
|
-
"#{agent_string} #{OpenSSL::OPENSSL_VERSION}"
|
93
|
-
elsif OpenSSL.const_defined?(:OPENSSL_LIBRARY_VERSION)
|
94
|
-
"#{agent_string} #{OpenSSL::OPENSSL_LIBRARY_VERSION}"
|
95
|
-
else
|
96
|
-
agent_string
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
private
|
101
|
-
|
102
|
-
def accept
|
103
|
-
FORMATS['xml']
|
104
|
-
end
|
105
|
-
alias content_type accept
|
106
|
-
end
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
require 'recurly/api/net_http_adapter'
|