recurly 3.16.0 → 4.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/.bumpversion.cfg +1 -1
  3. data/.github_changelog_generator +2 -2
  4. data/.travis.yml +1 -0
  5. data/CHANGELOG.md +144 -6
  6. data/GETTING_STARTED.md +20 -17
  7. data/lib/recurly/client.rb +41 -18
  8. data/lib/recurly/client/operations.rb +770 -549
  9. data/lib/recurly/errors.rb +5 -23
  10. data/lib/recurly/errors/api_errors.rb +3 -0
  11. data/lib/recurly/pager.rb +5 -15
  12. data/lib/recurly/requests/{account_acquisition_updatable.rb → account_acquisition_update.rb} +1 -1
  13. data/lib/recurly/requests/account_create.rb +2 -2
  14. data/lib/recurly/requests/account_purchase.rb +2 -2
  15. data/lib/recurly/requests/add_on_create.rb +2 -2
  16. data/lib/recurly/requests/add_on_pricing.rb +5 -1
  17. data/lib/recurly/requests/add_on_update.rb +2 -2
  18. data/lib/recurly/requests/address.rb +0 -8
  19. data/lib/recurly/requests/billing_info_create.rb +1 -25
  20. data/lib/recurly/requests/coupon_create.rb +1 -1
  21. data/lib/recurly/requests/coupon_redemption_create.rb +4 -0
  22. data/lib/recurly/requests/external_transaction.rb +1 -1
  23. data/lib/recurly/requests/{invoice_updatable.rb → invoice_update.rb} +1 -1
  24. data/lib/recurly/requests/line_item_create.rb +1 -1
  25. data/lib/recurly/requests/purchase_create.rb +4 -0
  26. data/lib/recurly/requests/subscription_add_on_create.rb +6 -2
  27. data/lib/recurly/requests/subscription_add_on_tier.rb +5 -1
  28. data/lib/recurly/requests/subscription_add_on_update.rb +6 -2
  29. data/lib/recurly/requests/subscription_change_create.rb +1 -1
  30. data/lib/recurly/requests/subscription_create.rb +7 -3
  31. data/lib/recurly/requests/tier.rb +2 -2
  32. data/lib/recurly/requests/tier_pricing.rb +22 -0
  33. data/lib/recurly/resources/add_on.rb +1 -1
  34. data/lib/recurly/resources/add_on_pricing.rb +5 -1
  35. data/lib/recurly/resources/address.rb +0 -8
  36. data/lib/recurly/resources/address_with_name.rb +46 -0
  37. data/lib/recurly/resources/coupon.rb +5 -17
  38. data/lib/recurly/resources/coupon_redemption.rb +4 -0
  39. data/lib/recurly/resources/invoice.rb +6 -2
  40. data/lib/recurly/resources/line_item.rb +4 -0
  41. data/lib/recurly/resources/plan.rb +1 -1
  42. data/lib/recurly/resources/subscription_add_on.rb +6 -2
  43. data/lib/recurly/resources/subscription_add_on_tier.rb +5 -1
  44. data/lib/recurly/resources/subscription_change.rb +0 -4
  45. data/lib/recurly/resources/tier.rb +2 -2
  46. data/lib/recurly/resources/tier_pricing.rb +22 -0
  47. data/lib/recurly/resources/transaction.rb +2 -2
  48. data/lib/recurly/resources/unique_coupon_code_params.rb +26 -0
  49. data/lib/recurly/resources/usage.rb +5 -1
  50. data/lib/recurly/version.rb +1 -1
  51. data/openapi/api.yaml +1896 -1846
  52. data/scripts/build +2 -2
  53. data/scripts/changelog +1 -1
  54. data/scripts/format +2 -2
  55. metadata +9 -8
  56. data/lib/recurly/errors/network_errors.rb +0 -10
  57. data/lib/recurly/resources/line_item_list.rb +0 -26
  58. data/lib/recurly/resources/subscription_change_preview.rb +0 -78
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a7b4df1917c4b15c1d01a13889c926f0c262c2ca1d5ccea2d74dabd19f9a8744
4
- data.tar.gz: 33dbffde9c280aa495676f348a103a18d40c2627b7e98f7876cdca1704e49d45
3
+ metadata.gz: 363aee14af2df360e4440e215556f60535e2a5293c413b37204371e46dba7f30
4
+ data.tar.gz: 83bae016d349769eebe8206f4ba8e02d2cd072c6d1fccee519054fc433bbde62
5
5
  SHA512:
6
- metadata.gz: 549b263ed42946ab85c5efa475a66c11c35d4a0ea4098f814a8096ffb6cf4ad2bb413d1ee7ae5603fea4027cbe3fcc9c7d5bd4d358203f142fa47964a3a21b99
7
- data.tar.gz: ec7d592254799f676bdc0ca6c95e4b173c35a3535200d5f76fbeb4609600ac6639d194b8705d942e6e184b6b68fce400ce697bc0398cbfbe40bfe2ea7b4a2b15
6
+ metadata.gz: 99d4ee6a951df8b4714c56c31c35b0c6ae27f29c7dc77e22a6ddd57dd743174980a280d65013350fa89c18b14523a885c56e3214ea05bdf6388c5876b3d28ec1
7
+ data.tar.gz: 96584a101083b1d7b3678bed505fd1e91bf9c1747bc9a7834467c9e7d6fb2c4f1f18ce17af4f4ff366fe5f0c32f39996f87566f7ea6c15f7c62172fe2b6d3047
data/.bumpversion.cfg CHANGED
@@ -1,5 +1,5 @@
1
1
  [bumpversion]
2
- current_version = 3.16.0
2
+ current_version = 4.0.1
3
3
  parse = (?P<major>\d+)
4
4
  \.(?P<minor>\d+)
5
5
  \.(?P<patch>\d+)
@@ -1,8 +1,8 @@
1
1
  user=recurly
2
2
  project=recurly-client-ruby
3
3
  unreleased=false
4
- exclude-labels=question,bug?,duplicate,V2
5
- exclude-tags-regex=^[^3]+\..*
4
+ exclude-labels=internal,question,bug?,duplicate,V2
5
+ exclude-tags-regex=^[^34]+\..*
6
6
  issues-wo-labels=false
7
7
  verbose=false
8
8
  since-tag=3.0.0.beta.1
data/.travis.yml CHANGED
@@ -5,6 +5,7 @@ rvm:
5
5
  - 2.5
6
6
  - 2.6
7
7
  - 2.7
8
+ - 3.0
8
9
  bundler_args: --binstubs
9
10
  before_install:
10
11
  - gem update --system
data/CHANGELOG.md CHANGED
@@ -1,17 +1,147 @@
1
1
  # Changelog
2
2
 
3
- ## [3.16.0](https://github.com/recurly/recurly-client-ruby/tree/HEAD)
3
+ ## [4.0.1](https://github.com/recurly/recurly-client-ruby/tree/4.0.1) (2021-03-19)
4
4
 
5
- [Full Changelog](https://github.com/recurly/recurly-client-ruby/compare/3.15.0...HEAD)
5
+ [Full Changelog](https://github.com/recurly/recurly-client-ruby/compare/4.0.0...4.0.1)
6
+
7
+ **Merged pull requests:**
8
+
9
+ - Release 4.0.1 [\#682](https://github.com/recurly/recurly-client-ruby/pull/682) ([douglasmiller](https://github.com/douglasmiller))
10
+ - More ruby 3.0 [\#680](https://github.com/recurly/recurly-client-ruby/pull/680) ([douglasmiller](https://github.com/douglasmiller))
11
+ - Additional fix for ruby 3.x [\#679](https://github.com/recurly/recurly-client-ruby/pull/679) ([douglasmiller](https://github.com/douglasmiller))
12
+ - Generated Latest Changes for v2021-02-25 [\#678](https://github.com/recurly/recurly-client-ruby/pull/678) ([recurly-integrations](https://github.com/recurly-integrations))
13
+ - Sync updates not ported from 3.x client [\#671](https://github.com/recurly/recurly-client-ruby/pull/671) ([douglasmiller](https://github.com/douglasmiller))
14
+
15
+ ## [4.0.0](https://github.com/recurly/recurly-client-ruby/tree/4.0.0) (2021-03-01)
16
+
17
+ [Full Changelog](https://github.com/recurly/recurly-client-ruby/compare/3.18.1...4.0.0)
18
+
19
+ # Major Version Release
20
+
21
+ The 4.x major version of the client pairs with the `v2021-02-25` API version. This version of the client and the API contain breaking changes that should be considered before upgrading your integration.
22
+
23
+ ## Breaking Changes in the API
24
+ All changes to the core API are documented in the [Developer Portal changelog](https://developers.recurly.com/api/changelog.html#v2021-02-25---current-ga-version)
25
+
26
+ ## Breaking Changes in Client
27
+
28
+ - Remove `site_id` and `subdomain` from client initializer. [#624]
29
+ - Remove `set_site_id` method from client. [#627]
30
+ - Classify unexpected error responses from Recurly API via an HTTP status code mapping provided in `Recurly::Errors::ERROR_MAP`. [#616]
31
+ - Remove `NetworkError` class. All error classes now extend the `APIError`. This means that the order of multiple rescue blocks will need to be re-considered. [#616]
32
+
33
+ ### 3.x
34
+
35
+ ```ruby
36
+ rescue Recurly::Errors::ValidationError => ex
37
+ # catch a validation error
38
+ rescue Recurly::Errors::APIError => ex
39
+ # catch a generic api error
40
+ rescue Recurly::Errors::TimeoutError => ex
41
+ # catch a specific network error
42
+ ```
43
+
44
+ ### 4.x
45
+
46
+ ```ruby
47
+ rescue Recurly::Errors::ValidationError => ex
48
+ # catch a validation error
49
+ rescue Recurly::Errors::TimeoutError => ex
50
+ # catch a specific network error
51
+ rescue Recurly::Errors::APIError => ex
52
+ # catch a generic api error
53
+ ```
54
+
55
+ - Rename `InvalidResponseError` to `InvalidContentTypeError`. [#616]
56
+ - Rename `UnavailableError` to `ServiceUnavailableError`. [#616]
57
+ - Reorganize top-level keys of the optional parameters hash to improve clarity and create space for additional options. [#619]
58
+
59
+ ### 3.x
60
+
61
+ ```ruby
62
+ options = {
63
+ limit: 200,
64
+ headers: {
65
+ 'Accept-Language' => 'fr'
66
+ }
67
+ }
68
+ accounts = @client.list_accounts(options)
69
+ ```
70
+
71
+ ### 4.x
72
+
73
+ ```ruby
74
+ options = {
75
+ params: {
76
+ limit: 200
77
+ }
78
+ headers: {
79
+ 'Accept-Language' => 'fr'
80
+ }
81
+ }
82
+ accounts = @client.list_accounts(options)
83
+ ```
6
84
 
7
85
  **Implemented enhancements:**
8
86
 
9
- - Latest Changes for 2019-10-10 \(tax\_identifier / tax\_identifier\_type\) [\#654](https://github.com/recurly/recurly-client-ruby/pull/654) ([douglasmiller](https://github.com/douglasmiller))
10
- - Latest Changes for 2019-10-10 [\#651](https://github.com/recurly/recurly-client-ruby/pull/651) ([douglasmiller](https://github.com/douglasmiller))
87
+ - Remove site\_id and subdomain from client initializer [\#624](https://github.com/recurly/recurly-client-ruby/pull/624) ([joannasese](https://github.com/joannasese))
88
+
89
+ **Fixed bugs:**
90
+
91
+ - Every method is returning wrong number of arguments [\#664](https://github.com/recurly/recurly-client-ruby/issues/664)
92
+
93
+ **Merged pull requests:**
94
+
95
+ - Release 4.0.0 [\#669](https://github.com/recurly/recurly-client-ruby/pull/669) ([douglasmiller](https://github.com/douglasmiller))
96
+ - Updating changelog script and changelog generator config for 4.x release [\#663](https://github.com/recurly/recurly-client-ruby/pull/663) ([douglasmiller](https://github.com/douglasmiller))
97
+ - Removing unused method 'set\_site\_id' [\#627](https://github.com/recurly/recurly-client-ruby/pull/627) ([douglasmiller](https://github.com/douglasmiller))
98
+ - Updating 4.x client to expect query string params as \['params'\] [\#619](https://github.com/recurly/recurly-client-ruby/pull/619) ([douglasmiller](https://github.com/douglasmiller))
99
+ - Updating error mapping based on status code [\#616](https://github.com/recurly/recurly-client-ruby/pull/616) ([douglasmiller](https://github.com/douglasmiller))
100
+
101
+ ## [3.18.1](https://github.com/recurly/recurly-client-ruby/tree/3.18.1) (2021-02-22)
102
+
103
+ [Full Changelog](https://github.com/recurly/recurly-client-ruby/compare/3.18.0...3.18.1)
11
104
 
12
105
  **Fixed bugs:**
13
106
 
14
- - Refund API V2 Error Details [\#652](https://github.com/recurly/recurly-client-ruby/issues/652)
107
+ - Fixing issues with ruby 3.0 [\#665](https://github.com/recurly/recurly-client-ruby/pull/665) ([douglasmiller](https://github.com/douglasmiller))
108
+
109
+ **Merged pull requests:**
110
+
111
+ - Release 3.18.1 [\#666](https://github.com/recurly/recurly-client-ruby/pull/666) ([douglasmiller](https://github.com/douglasmiller))
112
+
113
+ ## [3.18.0](https://github.com/recurly/recurly-client-ruby/tree/3.18.0) (2021-01-22)
114
+
115
+ [Full Changelog](https://github.com/recurly/recurly-client-ruby/compare/3.17.0...3.18.0)
116
+
117
+ **Implemented enhancements:**
118
+
119
+ - Latest Changes for 2019-10-10 [\#660](https://github.com/recurly/recurly-client-ruby/pull/660) ([douglasmiller](https://github.com/douglasmiller))
120
+
121
+ **Merged pull requests:**
122
+
123
+ - Release 3.18.0 [\#661](https://github.com/recurly/recurly-client-ruby/pull/661) ([douglasmiller](https://github.com/douglasmiller))
124
+
125
+ ## [3.17.0](https://github.com/recurly/recurly-client-ruby/tree/3.17.0) (2020-12-08)
126
+
127
+ [Full Changelog](https://github.com/recurly/recurly-client-ruby/compare/3.16.0...3.17.0)
128
+
129
+ **Implemented enhancements:**
130
+
131
+ - Latest Changes for 2019-10-10 [\#657](https://github.com/recurly/recurly-client-ruby/pull/657) ([douglasmiller](https://github.com/douglasmiller))
132
+
133
+ **Merged pull requests:**
134
+
135
+ - Release 3.17.0 [\#658](https://github.com/recurly/recurly-client-ruby/pull/658) ([douglasmiller](https://github.com/douglasmiller))
136
+
137
+ ## [3.16.0](https://github.com/recurly/recurly-client-ruby/tree/3.16.0) (2020-11-24)
138
+
139
+ [Full Changelog](https://github.com/recurly/recurly-client-ruby/compare/3.15.0...3.16.0)
140
+
141
+ **Implemented enhancements:**
142
+
143
+ - Latest Changes for 2019-10-10 \(tax\_identifier / tax\_identifier\_type\) [\#654](https://github.com/recurly/recurly-client-ruby/pull/654) ([douglasmiller](https://github.com/douglasmiller))
144
+ - Latest Changes for 2019-10-10 [\#651](https://github.com/recurly/recurly-client-ruby/pull/651) ([douglasmiller](https://github.com/douglasmiller))
15
145
 
16
146
  **Merged pull requests:**
17
147
 
@@ -324,7 +454,7 @@
324
454
 
325
455
  ## [3.0.0.beta.4](https://github.com/recurly/recurly-client-ruby/tree/3.0.0.beta.4) (2019-04-04)
326
456
 
327
- [Full Changelog](https://github.com/recurly/recurly-client-ruby/compare/3.0.0.beta.1...3.0.0.beta.4)
457
+ [Full Changelog](https://github.com/recurly/recurly-client-ruby/compare/3.0.0.beta.3...3.0.0.beta.4)
328
458
 
329
459
  **Merged pull requests:**
330
460
 
@@ -337,6 +467,14 @@
337
467
  - \[V3\] Test more versions of ruby [\#397](https://github.com/recurly/recurly-client-ruby/pull/397) ([drewish](https://github.com/drewish))
338
468
  - Allow faraday 0.12 for compatibility with oauth2 gem [\#396](https://github.com/recurly/recurly-client-ruby/pull/396) ([drewish](https://github.com/drewish))
339
469
 
470
+ ## [3.0.0.beta.3](https://github.com/recurly/recurly-client-ruby/tree/3.0.0.beta.3) (2018-08-27)
471
+
472
+ [Full Changelog](https://github.com/recurly/recurly-client-ruby/compare/3.0.0.beta.2...3.0.0.beta.3)
473
+
474
+ ## [3.0.0.beta.2](https://github.com/recurly/recurly-client-ruby/tree/3.0.0.beta.2) (2018-07-17)
475
+
476
+ [Full Changelog](https://github.com/recurly/recurly-client-ruby/compare/3.0.0.beta.1...3.0.0.beta.2)
477
+
340
478
 
341
479
 
342
480
  \* *This Changelog was automatically generated by [github_changelog_generator](https://github.com/github-changelog-generator/github-changelog-generator)*
data/GETTING_STARTED.md CHANGED
@@ -5,7 +5,7 @@ This repository houses the official ruby client for Recurly's V3 API.
5
5
  In your Gemfile, add `recurly` as a dependency.
6
6
 
7
7
  ```ruby
8
- gem 'recurly', '~> 3.16'
8
+ gem 'recurly', '~> 4.0'
9
9
  ```
10
10
 
11
11
  > *Note*: We try to follow [semantic versioning](https://semver.org/) and will only apply breaking changes to major versions.
@@ -106,17 +106,19 @@ plans.each_page.each_with_index do |data, page_num|
106
106
  end
107
107
  ```
108
108
 
109
- Pagination endpoints take a number of options to sort and filter the results. They can be passed in as keyword arguments.
109
+ Pagination endpoints take a number of options to sort and filter the results. They can be passed in as a hash provided by the `:params` keyword argument.
110
110
  The names, types, and descriptions of these arguments are listed in the rubydocs for each method:
111
111
 
112
112
  ```ruby
113
113
  options = {
114
- limit: 200, # number of items per page
115
- state: :active, # only active plans
116
- sort: :updated_at,
117
- order: :asc,
118
- begin_time: DateTime.new(2017,1,1), # January 1st 2017,
119
- end_time: DateTime.now
114
+ params: {
115
+ limit: 200, # number of items per page
116
+ state: :active, # only active plans
117
+ sort: :updated_at,
118
+ order: :asc,
119
+ begin_time: DateTime.new(2017,1,1), # January 1st 2017,
120
+ end_time: DateTime.now
121
+ }
120
122
  }
121
123
 
122
124
  plans = client.list_plans(**options)
@@ -200,12 +202,11 @@ plan = client.create_plan(body: plan_data)
200
202
 
201
203
  # Error Handling
202
204
 
203
- This library currently throws 2 types of exceptions. {Recurly::Errors::APIError} and {Recurly::Errors::NetworkError}. See these 2 files for the types of exceptions you can catch:
205
+ All errors thrown by this library are based off of the `Recurly::Errors::APIError`. There
204
206
 
205
- 1. [API Errors](./lib/recurly/errors/api_errors.rb)
206
- 2. [Network Errors](./lib/recurly/errors/network_errors.rb)
207
+ This library throws one main type of exception, `Recurly::Errors::APIError`. There exists an additional hierarchy of errors to facilitate the process of rescuing various classes of errors. More detail can be found in the [Api Errors Module](./lib/recurly/errors/api_errors.rb).
207
208
 
208
- You will normally be working with {Recurly::Errors::APIError}. You can catch specific or generic versions of these exceptions. Example:
209
+ You can catch specific or generic versions of these exceptions. Example:
209
210
 
210
211
  ```ruby
211
212
  begin
@@ -233,15 +234,17 @@ rescue Recurly::Errors::ValidationError => ex
233
234
  #=> #<Recurly::Error:0x007fbbdf8a32c8 @attributes={:type=>"validation", :message=>"Code 'iexistalready' already exists", :params=>[{"param"=>"code", "message"=>"'iexistalready' already exists"}]}>
234
235
  puts ex.status_code
235
236
  #=> 422
237
+ rescue Recurly::Errors::TimeoutError => ex
238
+ # catch a specific server error
239
+ rescue Recurly::Errors::ServerError => ex
240
+ # catch a generic server error
236
241
  rescue Recurly::Errors::APIError => ex
237
242
  # catch a generic api error
238
- rescue Recurly::Errors::TimeoutError => ex
239
- # catch a specific network error
240
- rescue Recurly::Errors::NetworkError => ex
241
- # catch a generic network error
242
243
  end
243
244
  ```
244
245
 
246
+ `Recurly::Errors::APIError` instances provide access to the response via the `#get_response` method.
247
+
245
248
  # HTTP Metadata
246
249
 
247
250
  Sometimes you might want to get some additional information about the underlying HTTP request and response. Instead of
@@ -266,7 +269,7 @@ response = @client.remove_line_item(
266
269
  line_item_id: "a959576b2b10b012"
267
270
  ).get_response
268
271
  ```
269
- And it can be captured on exceptions through the {Recurly::ApiError} object:
272
+ And it can be captured on exceptions through the {Recurly::APIError} object:
270
273
 
271
274
  ```ruby
272
275
  begin
@@ -20,7 +20,14 @@ module Recurly
20
20
  MAX_RETRIES = 3
21
21
  LOG_LEVELS = %i(debug info warn error fatal).freeze
22
22
  BASE36_ALPHABET = (("0".."9").to_a + ("a".."z").to_a).freeze
23
- REQUEST_OPTIONS = [:headers].freeze
23
+ ALLOWED_OPTIONS = [
24
+ :site_id,
25
+ :open_timeout,
26
+ :read_timeout,
27
+ :body,
28
+ :params,
29
+ :headers,
30
+ ].freeze
24
31
 
25
32
  # Initialize a client. It requires an API key.
26
33
  #
@@ -47,8 +54,7 @@ module Recurly
47
54
  #
48
55
  # @param api_key [String] The private API key
49
56
  # @param logger [Logger] A logger to use. Defaults to creating a new STDOUT logger with level WARN.
50
- def initialize(api_key:, site_id: nil, subdomain: nil, logger: nil)
51
- set_site_id(site_id, subdomain)
57
+ def initialize(api_key:, logger: nil)
52
58
  set_api_key(api_key)
53
59
 
54
60
  if logger.nil?
@@ -90,6 +96,7 @@ module Recurly
90
96
  end
91
97
 
92
98
  def head(path, **options)
99
+ validate_options!(**options)
93
100
  request = Net::HTTP::Head.new build_url(path, options)
94
101
  set_headers(request, options[:headers])
95
102
  http_response = run_request(request, options)
@@ -97,6 +104,7 @@ module Recurly
97
104
  end
98
105
 
99
106
  def get(path, **options)
107
+ validate_options!(**options)
100
108
  request = Net::HTTP::Get.new build_url(path, options)
101
109
  set_headers(request, options[:headers])
102
110
  http_response = run_request(request, options)
@@ -104,6 +112,7 @@ module Recurly
104
112
  end
105
113
 
106
114
  def post(path, request_data, request_class, **options)
115
+ validate_options!(**options)
107
116
  request_class.new(request_data).validate!
108
117
  request = Net::HTTP::Post.new build_url(path, options)
109
118
  request.set_content_type(JSON_CONTENT_TYPE)
@@ -114,6 +123,7 @@ module Recurly
114
123
  end
115
124
 
116
125
  def put(path, request_data = nil, request_class = nil, **options)
126
+ validate_options!(**options)
117
127
  request = Net::HTTP::Put.new build_url(path, options)
118
128
  request.set_content_type(JSON_CONTENT_TYPE)
119
129
  set_headers(request, options[:headers])
@@ -127,6 +137,7 @@ module Recurly
127
137
  end
128
138
 
129
139
  def delete(path, **options)
140
+ validate_options!(**options)
130
141
  request = Net::HTTP::Delete.new build_url(path, options)
131
142
  set_headers(request, options[:headers])
132
143
  http_response = run_request(request, options)
@@ -240,7 +251,7 @@ module Recurly
240
251
  elsif BINARY_TYPES.include?(http_response.content_type)
241
252
  FileParser.parse(response.body)
242
253
  else
243
- raise Recurly::Errors::InvalidResponseError, "Unexpected content type: #{http_response.content_type}"
254
+ raise Recurly::Errors::InvalidContentTypeError, "Unexpected content type: #{http_response.content_type}"
244
255
  end
245
256
  else
246
257
  Resources::Empty.new
@@ -255,10 +266,10 @@ module Recurly
255
266
  error = JSONParser.parse(self, response.body)
256
267
  begin
257
268
  error_class = Errors::APIError.error_class(error.type)
258
- raise error_class.new(response, error)
269
+ raise error_class.new(error.message, response, error)
259
270
  rescue NameError
260
271
  error_class = Errors::APIError.from_response(http_response)
261
- raise error_class.new(response, error)
272
+ raise error_class.new("Unknown Error", response, error)
262
273
  end
263
274
  end
264
275
 
@@ -266,7 +277,7 @@ module Recurly
266
277
 
267
278
  if error_class <= Recurly::Errors::APIError
268
279
  error = Recurly::Resources::Error.new(message: "#{http_response.code}: #{http_response.message}")
269
- raise error_class.new(response, error)
280
+ raise error_class.new(error.message, response, error)
270
281
  else
271
282
  raise error_class, "#{http_response.code}: #{http_response.message}"
272
283
  end
@@ -279,6 +290,17 @@ module Recurly
279
290
  response
280
291
  end
281
292
 
293
+ def validate_options!(**options)
294
+ invalid_options = options.keys.reject do |k|
295
+ ALLOWED_OPTIONS.include?(k)
296
+ end
297
+ if invalid_options.any?
298
+ joinedKeys = invalid_options.join(", ")
299
+ joinedOptions = ALLOWED_OPTIONS.join(", ")
300
+ raise ArgumentError, "Invalid options: '#{joinedKeys}'. Allowed options: '#{joinedOptions}'"
301
+ end
302
+ end
303
+
282
304
  def validate_path_parameters!(**options)
283
305
  # Check to see that we are passing the correct data types
284
306
  # This prevents a confusing error if the user passes in a non-primitive by mistake
@@ -299,7 +321,7 @@ module Recurly
299
321
  end
300
322
 
301
323
  def interpolate_path(path, **options)
302
- validate_path_parameters!(options)
324
+ validate_path_parameters!(**options)
303
325
  options.each do |k, v|
304
326
  # We need to encode the values for the url
305
327
  options[k] = ERB::Util.url_encode(v.to_s)
@@ -308,21 +330,13 @@ module Recurly
308
330
  path % options
309
331
  end
310
332
 
311
- def set_site_id(site_id, subdomain)
312
- if site_id
313
- @site_id = site_id
314
- elsif subdomain
315
- @site_id = "subdomain-#{subdomain}"
316
- end
317
- end
318
-
319
333
  def set_api_key(api_key)
320
334
  @api_key = api_key
321
335
  end
322
336
 
323
337
  def build_url(path, options)
324
338
  path = scope_by_site(path, options)
325
- query_params = options.reject { |k, _| REQUEST_OPTIONS.include?(k.to_sym) }
339
+ query_params = map_array_params(options.fetch(:params, {}))
326
340
  if query_params.any?
327
341
  "#{path}?#{URI.encode_www_form(query_params)}"
328
342
  else
@@ -330,7 +344,16 @@ module Recurly
330
344
  end
331
345
  end
332
346
 
333
- def scope_by_site(path, **options)
347
+ # Converts array parameters to CSV strings to maintain consistency with
348
+ # how the server expects the request to be formatted while providing the
349
+ # developer with an array type to maintain developer happiness!
350
+ def map_array_params(params)
351
+ params.map do |key, param|
352
+ [key, param.is_a?(Array) ? param.join(",") : param]
353
+ end.to_h
354
+ end
355
+
356
+ def scope_by_site(path, options)
334
357
  if site = site_id || options[:site_id]
335
358
  # Ensure that we are only including the site_id once because the Pager operations
336
359
  # will use the cursor returned from the API which may already have these components