recurly 2.18.21 → 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.
Files changed (211) 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 -145
  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 -173
  93. data/lib/recurly/account.rb +0 -209
  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 -81
  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/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 -304
  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 -238
  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/add_ons.rb +0 -82
  128. data/lib/recurly/subscription.rb +0 -366
  129. data/lib/recurly/subscription_add_on.rb +0 -58
  130. data/lib/recurly/tax_detail.rb +0 -18
  131. data/lib/recurly/tax_type.rb +0 -13
  132. data/lib/recurly/tier.rb +0 -18
  133. data/lib/recurly/transaction/errors.rb +0 -115
  134. data/lib/recurly/transaction.rb +0 -131
  135. data/lib/recurly/usage.rb +0 -28
  136. data/lib/recurly/verify.rb +0 -12
  137. data/lib/recurly/webhook/account_notification.rb +0 -13
  138. data/lib/recurly/webhook/billing_info_update_failed_notification.rb +0 -6
  139. data/lib/recurly/webhook/billing_info_updated_notification.rb +0 -6
  140. data/lib/recurly/webhook/canceled_account_notification.rb +0 -6
  141. data/lib/recurly/webhook/canceled_gift_card_notification.rb +0 -6
  142. data/lib/recurly/webhook/canceled_subscription_notification.rb +0 -6
  143. data/lib/recurly/webhook/closed_credit_invoice_notification.rb +0 -6
  144. data/lib/recurly/webhook/closed_invoice_notification.rb +0 -6
  145. data/lib/recurly/webhook/credit_payment_notification.rb +0 -12
  146. data/lib/recurly/webhook/deactivated_item_notification.rb +0 -6
  147. data/lib/recurly/webhook/deleted_shipping_address_notification.rb +0 -6
  148. data/lib/recurly/webhook/dunning_notification.rb +0 -14
  149. data/lib/recurly/webhook/expired_subscription_notification.rb +0 -6
  150. data/lib/recurly/webhook/failed_charge_invoice_notification.rb +0 -6
  151. data/lib/recurly/webhook/failed_payment_notification.rb +0 -6
  152. data/lib/recurly/webhook/fraud_info_updated_notification.rb +0 -6
  153. data/lib/recurly/webhook/gift_card_notification.rb +0 -8
  154. data/lib/recurly/webhook/invoice_notification.rb +0 -12
  155. data/lib/recurly/webhook/item_notification.rb +0 -7
  156. data/lib/recurly/webhook/low_balance_gift_card_notification.rb +0 -6
  157. data/lib/recurly/webhook/new_account_notification.rb +0 -6
  158. data/lib/recurly/webhook/new_charge_invoice_notification.rb +0 -6
  159. data/lib/recurly/webhook/new_credit_invoice_notification.rb +0 -6
  160. data/lib/recurly/webhook/new_credit_payment_notification.rb +0 -6
  161. data/lib/recurly/webhook/new_dunning_event_notification.rb +0 -6
  162. data/lib/recurly/webhook/new_invoice_notification.rb +0 -6
  163. data/lib/recurly/webhook/new_item_notification.rb +0 -6
  164. data/lib/recurly/webhook/new_shipping_address_notification.rb +0 -6
  165. data/lib/recurly/webhook/new_subscription_notification.rb +0 -6
  166. data/lib/recurly/webhook/new_usage_notification.rb +0 -8
  167. data/lib/recurly/webhook/notification.rb +0 -18
  168. data/lib/recurly/webhook/paid_charge_invoice_notification.rb +0 -6
  169. data/lib/recurly/webhook/past_due_charge_invoice_notification.rb +0 -6
  170. data/lib/recurly/webhook/past_due_invoice_notification.rb +0 -6
  171. data/lib/recurly/webhook/paused_subscription_renewal_notification.rb +0 -6
  172. data/lib/recurly/webhook/prerenewal_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/scheduled_subscription_update_notification.rb +0 -6
  188. data/lib/recurly/webhook/subscription_notification.rb +0 -12
  189. data/lib/recurly/webhook/subscription_pause_canceled_notification.rb +0 -6
  190. data/lib/recurly/webhook/subscription_pause_modified_notification.rb +0 -6
  191. data/lib/recurly/webhook/subscription_paused_notification.rb +0 -6
  192. data/lib/recurly/webhook/subscription_resumed_notification.rb +0 -6
  193. data/lib/recurly/webhook/successful_payment_notification.rb +0 -6
  194. data/lib/recurly/webhook/successful_refund_notification.rb +0 -6
  195. data/lib/recurly/webhook/transaction_authorized_notification.rb +0 -6
  196. data/lib/recurly/webhook/transaction_notification.rb +0 -12
  197. data/lib/recurly/webhook/transaction_status_updated_notification.rb +0 -6
  198. data/lib/recurly/webhook/updated_account_notification.rb +0 -6
  199. data/lib/recurly/webhook/updated_balance_gift_card_notification.rb +0 -7
  200. data/lib/recurly/webhook/updated_gift_card_notification.rb +0 -6
  201. data/lib/recurly/webhook/updated_invoice_notification.rb +0 -6
  202. data/lib/recurly/webhook/updated_item_notification.rb +0 -6
  203. data/lib/recurly/webhook/updated_shipping_address_notification.rb +0 -6
  204. data/lib/recurly/webhook/updated_subscription_notification.rb +0 -6
  205. data/lib/recurly/webhook/void_payment_notification.rb +0 -6
  206. data/lib/recurly/webhook/voided_credit_invoice_notification.rb +0 -6
  207. data/lib/recurly/webhook/voided_credit_payment_notification.rb +0 -6
  208. data/lib/recurly/webhook.rb +0 -113
  209. data/lib/recurly/xml/nokogiri.rb +0 -60
  210. data/lib/recurly/xml/rexml.rb +0 -52
  211. data/lib/recurly/xml.rb +0 -122
@@ -1,27 +0,0 @@
1
- module Recurly
2
- # Recurly Documentation: https://dev.recurly.com/docs/create-account-acquisition
3
- class AccountAcquisition < Resource
4
- # @return [Account]
5
- belongs_to :account
6
-
7
- define_attribute_methods %w(
8
- cost_in_cents
9
- currency
10
- channel
11
- subchannel
12
- campaign
13
- )
14
-
15
- def self.member_name
16
- "acquisition"
17
- end
18
-
19
- def self.xml_root_key
20
- "account_acquisition"
21
- end
22
-
23
- # Acquisitions are only writeable and readable through {Account} instances.
24
- embedded!
25
- private_class_method :find
26
- end
27
- end
@@ -1,21 +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
- )
15
-
16
- # This object does not represent a model on the server side
17
- # so we do not need to expose these methods.
18
- protected(*%w(save save!))
19
- private_class_method(*%w(all find_each first paginate scoped where create! create))
20
- end
21
- end
@@ -1,46 +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
-
8
- define_attribute_methods %w(
9
- add_on_code
10
- item_code
11
- name
12
- item_state
13
- accounting_code
14
- default_quantity
15
- unit_amount_in_cents
16
- display_quantity_on_hosted_page
17
- tax_code
18
- add_on_type
19
- measured_unit_id
20
- optional
21
- usage_type
22
- usage_percentage
23
- revenue_schedule_type
24
- created_at
25
- updated_at
26
- tier_type
27
- external_sku
28
- avalara_service_type
29
- avalara_transaction_type
30
- )
31
- alias to_param add_on_code
32
- alias quantity default_quantity
33
-
34
- def changed_attributes
35
- attrs = super
36
- if tiers.any?(&:changed?)
37
- attrs['tiers'] = tiers.select(&:changed?)
38
- end
39
- attrs
40
- end
41
-
42
- # Add-ons are only writeable and readable through {Plan} instances.
43
- embedded!
44
- private_class_method :find
45
- end
46
- end
@@ -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
@@ -1,81 +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 [Invoice, nil]
17
- belongs_to :invoice
18
- # @return [Subscription, nil]
19
- belongs_to :subscription
20
-
21
- # @return [Pager<Adjustment>, []]
22
- has_many :credit_adjustments, class_name: :Adjustment, readonly: true
23
-
24
- # @return [ShippingAddress, nil]
25
- has_one :shipping_address, class_name: :ShippingAddress, readonly: false
26
-
27
- define_attribute_methods %w(
28
- uuid
29
- state
30
- description
31
- accounting_code
32
- origin
33
- unit_amount_in_cents
34
- quantity
35
- discount_in_cents
36
- total_in_cents
37
- currency
38
- product_code
39
- item_code
40
- external_sku
41
- start_date
42
- end_date
43
- created_at
44
- updated_at
45
- quantity_remaining
46
- revenue_schedule_type
47
- tax_in_cents
48
- tax_type
49
- tax_region
50
- tax_rate
51
- tax_exempt
52
- tax_code
53
- tax_details
54
- tax_types
55
- proration_rate
56
- credit_reason_code
57
- original_adjustment_uuid
58
- shipping_address_id
59
- surcharge_in_cents
60
- avalara_transaction_type
61
- avalara_service_type
62
- )
63
- alias to_param uuid
64
-
65
- # @return ["charge", "credit", nil] The type of adjustment.
66
- attr_reader :type
67
-
68
- # Adjustments should be built through {Account} instances.
69
- #
70
- # @return [Adjustment] A new adjustment.
71
- # @example
72
- # account.adjustments.new attributes
73
- # @see Resource#initialize
74
- def initialize(attributes = {})
75
- super({ :currency => Recurly.default_currency }.merge attributes)
76
- end
77
-
78
- # Adjustments are only writeable through an {Account} instance.
79
- embedded! true
80
- end
81
- end
@@ -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