square.rb 8.0.0.20201216 → 26.1.0.20230119

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 (59) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -1
  3. data/README.md +79 -221
  4. data/lib/square/api/apple_pay_api.rb +15 -8
  5. data/lib/square/api/bank_accounts_api.rb +5 -5
  6. data/lib/square/api/base_api.rb +27 -9
  7. data/lib/square/api/booking_custom_attributes_api.rb +555 -0
  8. data/lib/square/api/bookings_api.rb +107 -15
  9. data/lib/square/api/cards_api.rb +171 -0
  10. data/lib/square/api/cash_drawers_api.rb +2 -2
  11. data/lib/square/api/catalog_api.rb +167 -73
  12. data/lib/square/api/checkout_api.rb +205 -3
  13. data/lib/square/api/customer_custom_attributes_api.rb +561 -0
  14. data/lib/square/api/customer_groups_api.rb +17 -8
  15. data/lib/square/api/customer_segments_api.rb +15 -6
  16. data/lib/square/api/customers_api.rb +67 -33
  17. data/lib/square/api/devices_api.rb +3 -2
  18. data/lib/square/api/disputes_api.rb +109 -105
  19. data/lib/square/api/gift_card_activities_api.rb +132 -0
  20. data/lib/square/api/gift_cards_api.rb +298 -0
  21. data/lib/square/api/inventory_api.rb +263 -24
  22. data/lib/square/api/invoices_api.rb +21 -21
  23. data/lib/square/api/labor_api.rb +70 -68
  24. data/lib/square/api/location_custom_attributes_api.rb +584 -0
  25. data/lib/square/api/locations_api.rb +21 -14
  26. data/lib/square/api/loyalty_api.rb +333 -50
  27. data/lib/square/api/merchants_api.rb +11 -9
  28. data/lib/square/api/mobile_authorization_api.rb +4 -4
  29. data/lib/square/api/o_auth_api.rb +78 -25
  30. data/lib/square/api/order_custom_attributes_api.rb +601 -0
  31. data/lib/square/api/orders_api.rb +84 -45
  32. data/lib/square/api/payments_api.rb +72 -24
  33. data/lib/square/api/payouts_api.rb +173 -0
  34. data/lib/square/api/refunds_api.rb +18 -7
  35. data/lib/square/api/sites_api.rb +43 -0
  36. data/lib/square/api/snippets_api.rb +146 -0
  37. data/lib/square/api/subscriptions_api.rb +190 -15
  38. data/lib/square/api/team_api.rb +46 -46
  39. data/lib/square/api/terminal_api.rb +172 -22
  40. data/lib/square/api/transactions_api.rb +15 -191
  41. data/lib/square/api/v1_transactions_api.rb +52 -124
  42. data/lib/square/api/vendors_api.rb +257 -0
  43. data/lib/square/api/webhook_subscriptions_api.rb +327 -0
  44. data/lib/square/api_helper.rb +217 -57
  45. data/lib/square/client.rb +90 -18
  46. data/lib/square/configuration.rb +64 -20
  47. data/lib/square/exceptions/validation_exception.rb +13 -0
  48. data/lib/square/http/api_response.rb +7 -9
  49. data/lib/square/http/faraday_client.rb +40 -9
  50. data/lib/square/http/http_client.rb +31 -12
  51. data/lib/square/http/http_request.rb +6 -2
  52. data/lib/square/utilities/date_time_helper.rb +151 -0
  53. data/lib/square/utilities/file_wrapper.rb +1 -2
  54. data/lib/square.rb +56 -44
  55. data/test/api/test_locations_api.rb +2 -5
  56. data/test/test_helper.rb +2 -2
  57. metadata +83 -15
  58. data/lib/square/api/v1_employees_api.rb +0 -751
  59. data/lib/square/api/v1_items_api.rb +0 -1766
@@ -8,17 +8,16 @@ module Square
8
8
  def self.serialize_array(key, array, formatting: 'indexed')
9
9
  tuples = []
10
10
 
11
- if formatting == 'unindexed'
12
- tuples += array.map { |element| ["#{key}[]", element] }
13
- elsif formatting == 'indexed'
14
- tuples += array.map.with_index do |element, index|
15
- ["#{key}[#{index}]", element]
16
- end
17
- elsif formatting == 'plain'
18
- tuples += array.map { |element| [key, element] }
19
- else
20
- raise ArgumentError, 'Invalid format provided.'
21
- end
11
+ tuples += case formatting
12
+ when 'csv'
13
+ [[key, array.map { |element| CGI.escape(element.to_s) }.join(',')]]
14
+ when 'psv'
15
+ [[key, array.map { |element| CGI.escape(element.to_s) }.join('|')]]
16
+ when 'tsv'
17
+ [[key, array.map { |element| CGI.escape(element.to_s) }.join("\t")]]
18
+ else
19
+ array.map { |element| [key, element] }
20
+ end
22
21
  tuples
23
22
  end
24
23
 
@@ -55,7 +54,7 @@ module Square
55
54
  end
56
55
 
57
56
  # Find the template parameter and replace it with its value.
58
- query_builder = query_builder.gsub('{' + key.to_s + '}', replace_value)
57
+ query_builder = query_builder.gsub("{#{key}}", replace_value)
59
58
  end
60
59
  query_builder
61
60
  end
@@ -63,9 +62,7 @@ module Square
63
62
  # Appends the given set of parameters to the given query string.
64
63
  # @param [String] The query string builder to add the query parameters to.
65
64
  # @param [Hash] The parameters to append.
66
- # @param [String] The format of array parameter serialization.
67
- def self.append_url_with_query_parameters(query_builder, parameters,
68
- array_serialization: 'indexed')
65
+ def self.append_url_with_query_parameters(query_builder, parameters)
69
66
  # Perform parameter validation.
70
67
  unless query_builder.instance_of? String
71
68
  raise ArgumentError, 'Given value for parameter \"query_builder\"
@@ -75,29 +72,20 @@ module Square
75
72
  # Return if there are no parameters to replace.
76
73
  return query_builder if parameters.nil?
77
74
 
75
+ array_serialization = 'indexed'
76
+ parameters = process_complex_types_parameters(parameters, array_serialization)
77
+
78
78
  parameters.each do |key, value|
79
79
  seperator = query_builder.include?('?') ? '&' : '?'
80
80
  unless value.nil?
81
81
  if value.instance_of? Array
82
82
  value.compact!
83
- query_builder += if array_serialization == 'csv'
84
- "#{seperator}#{key}=#{value.map do |element|
85
- CGI.escape(element.to_s)
86
- end.join(',')}"
87
- elsif array_serialization == 'psv'
88
- "#{seperator}#{key}=#{value.map do |element|
89
- CGI.escape(element.to_s)
90
- end.join('|')}"
91
- elsif array_serialization == 'tsv'
92
- "#{seperator}#{key}=#{value.map do |element|
93
- CGI.escape(element.to_s)
94
- end.join("\t")}"
95
- else
96
- "#{seperator}#{APIHelper.serialize_array(
97
- key, value, formatting: array_serialization
98
- ).map { |k, v| "#{k}=#{CGI.escape(v.to_s)}" }
99
- .join('&')}"
100
- end
83
+ APIHelper.serialize_array(
84
+ key, value, formatting: array_serialization
85
+ ).each do |element|
86
+ seperator = query_builder.include?('?') ? '&' : '?'
87
+ query_builder += "#{seperator}#{element[0]}=#{element[1]}"
88
+ end
101
89
  else
102
90
  query_builder += "#{seperator}#{key}=#{CGI.escape(value.to_s)}"
103
91
  end
@@ -114,7 +102,7 @@ module Square
114
102
  raise ArgumentError, 'Invalid Url.' unless url.instance_of? String
115
103
 
116
104
  # Ensure that the urls are absolute.
117
- matches = url.match(%r{^(https?:\/\/[^\/]+)})
105
+ matches = url.match(%r{^(https?://[^/]+)})
118
106
  raise ArgumentError, 'Invalid Url format.' if matches.nil?
119
107
 
120
108
  # Get the http protocol match.
@@ -125,7 +113,7 @@ module Square
125
113
 
126
114
  # Remove redundant forward slashes.
127
115
  query = url[protocol.length...(!index.nil? ? index : url.length)]
128
- query.gsub!(%r{\/\/+}, '/')
116
+ query.gsub!(%r{//+}, '/')
129
117
 
130
118
  # Get the parameters.
131
119
  parameters = !index.nil? ? url[url.index('?')...url.length] : ''
@@ -137,11 +125,17 @@ module Square
137
125
  # Parses JSON string.
138
126
  # @param [String] A JSON string.
139
127
  def self.json_deserialize(json)
140
- return JSON.parse(json, symbolize_names: true)
128
+ JSON.parse(json, symbolize_names: true)
141
129
  rescue StandardError
142
130
  raise TypeError, 'Server responded with invalid JSON.'
143
131
  end
144
132
 
133
+ # Parses JSON string.
134
+ # @param [object] The object to serialize.
135
+ def self.json_serialize(obj)
136
+ serializable_types.map { |x| obj.is_a? x }.any? ? obj.to_s : obj.to_json
137
+ end
138
+
145
139
  # Removes elements with empty values from a hash.
146
140
  # @param [Hash] The hash to clean.
147
141
  def self.clean_hash(hash)
@@ -151,8 +145,8 @@ module Square
151
145
  # Form encodes a hash of parameters.
152
146
  # @param [Hash] The hash of parameters to encode.
153
147
  # @return [Hash] A hash with the same parameters form encoded.
154
- def self.form_encode_parameters(form_parameters,
155
- array_serialization: 'indexed')
148
+ def self.form_encode_parameters(form_parameters)
149
+ array_serialization = 'indexed'
156
150
  encoded = {}
157
151
  form_parameters.each do |key, value|
158
152
  encoded.merge!(APIHelper.form_encode(value, key, formatting:
@@ -161,11 +155,24 @@ module Square
161
155
  encoded
162
156
  end
163
157
 
158
+ # Process complex types in query_params.
159
+ # @param [Hash] The hash of query parameters.
160
+ # @return [Hash] A hash with the processed query parameters.
161
+ def self.process_complex_types_parameters(query_parameters, array_serialization)
162
+ processed_params = {}
163
+ query_parameters.each do |key, value|
164
+ processed_params.merge!(APIHelper.form_encode(value, key, formatting:
165
+ array_serialization))
166
+ end
167
+ processed_params
168
+ end
169
+
164
170
  def self.custom_merge(a, b)
165
171
  x = {}
166
172
  a.each do |key, value_a|
167
173
  b.each do |k, value_b|
168
174
  next unless key == k
175
+
169
176
  x[k] = []
170
177
  if value_a.instance_of? Array
171
178
  value_a.each do |v|
@@ -198,22 +205,18 @@ module Square
198
205
  def self.form_encode(obj, instance_name, formatting: 'indexed')
199
206
  retval = {}
200
207
 
201
- serializable_types = [String, Numeric, TrueClass,
202
- FalseClass, Date, DateTime]
203
-
204
208
  # Create a form encoded hash for this object.
205
209
  if obj.nil?
206
210
  nil
207
211
  elsif obj.instance_of? Array
208
212
  if formatting == 'indexed'
209
213
  obj.each_with_index do |value, index|
210
- retval.merge!(APIHelper.form_encode(value, instance_name + '[' +
211
- index.to_s + ']'))
214
+ retval.merge!(APIHelper.form_encode(value, "#{instance_name}[#{index}]"))
212
215
  end
213
- elsif serializable_types.map { |x| obj[0].is_a? x }.any?
216
+ elsif APIHelper.serializable_types.map { |x| obj[0].is_a? x }.any?
214
217
  obj.each do |value|
215
218
  abc = if formatting == 'unindexed'
216
- APIHelper.form_encode(value, instance_name + '[]',
219
+ APIHelper.form_encode(value, "#{instance_name}[]",
217
220
  formatting: formatting)
218
221
  else
219
222
  APIHelper.form_encode(value, instance_name,
@@ -223,14 +226,14 @@ module Square
223
226
  end
224
227
  else
225
228
  obj.each_with_index do |value, index|
226
- retval.merge!(APIHelper.form_encode(value, instance_name + '[' +
227
- index.to_s + ']', formatting: formatting))
229
+ retval.merge!(APIHelper.form_encode(value, "#{instance_name}[#{index}]",
230
+ formatting: formatting))
228
231
  end
229
232
  end
230
233
  elsif obj.instance_of? Hash
231
234
  obj.each do |key, value|
232
- retval.merge!(APIHelper.form_encode(value, instance_name + '[' +
233
- key.to_s + ']', formatting: formatting))
235
+ retval.merge!(APIHelper.form_encode(value, "#{instance_name}[#{key}]",
236
+ formatting: formatting))
234
237
  end
235
238
  elsif obj.instance_of? File
236
239
  retval[instance_name] = UploadIO.new(
@@ -266,16 +269,173 @@ module Square
266
269
  val
267
270
  end
268
271
 
269
- # Safely converts a string into an rfc3339 DateTime object
270
- # @param [String] The datetime string
271
- # @return [DateTime] A DateTime object of rfc3339 format
272
- def self.rfc3339(date_time)
273
- # missing timezone information
274
- if date_time.end_with?('Z') || date_time.index('+')
275
- DateTime.rfc3339(date_time)
272
+ # Deserialize the value against the template (group of types).
273
+ # @param [String] The value to be deserialized.
274
+ # @param [String] The parameter indicates the type-combination
275
+ # against which the value will be mapped (oneOf(Integer, String)).
276
+ def self.deserialize(template, value)
277
+ decoded = APIHelper.json_deserialize(value)
278
+ map_types(decoded, template)
279
+ end
280
+
281
+ # Validates and processes the value against the template(group of types).
282
+ # @param [String] The value to be mapped against the template.
283
+ # @param [String] The parameter indicates the group of types (oneOf(Integer, String)).
284
+ # @param [String] The parameter indicates the group (oneOf|anyOf).
285
+ def self.map_types(value, template, group_name: nil)
286
+ result_value = nil
287
+ matches = 0
288
+ types = []
289
+ group_name = template.partition('(').first if group_name.nil? && template.match?(/anyOf|oneOf/)
290
+
291
+ return if value.nil?
292
+
293
+ if template.end_with?('{}') || template.end_with?('[]')
294
+ types = template.split(group_name, 2).last.gsub(/\s+/, '').split
295
+ else
296
+ template = template.split(group_name, 2).last.delete_prefix('(').delete_suffix(')')
297
+ types = template.scan(/(anyOf|oneOf)[(]([^[)]]*)[)]/).flatten.combination(2).map { |a, b| "#{a}(#{b})" }
298
+ types.each { |t| template = template.gsub(", #{t}", '') }
299
+ types = template.gsub(/\s+/, '').split(',').push(*types)
300
+ end
301
+ types.each do |element|
302
+ if element.match?(/^(oneOf|anyOf)[(].*$/)
303
+ begin
304
+ result_value = map_types(value, element, matches)
305
+ matches += 1
306
+ rescue ValidationException
307
+ next
308
+ end
309
+ elsif element.end_with?('{}')
310
+ result_value, matches = map_hash_type(value, element, group_name, matches)
311
+ elsif element.end_with?('[]')
312
+ result_value, matches = map_array_type(value, element, group_name, matches)
313
+ else
314
+ begin
315
+ result_value, matches = map_type(value, element, group_name, matches)
316
+ rescue StandardError
317
+ next
318
+ end
319
+ end
320
+ break if group_name == 'anyOf' && matches == 1
321
+ end
322
+ raise ValidationException.new(value, template) unless matches == 1
323
+
324
+ value = result_value unless result_value.nil?
325
+ value
326
+ end
327
+
328
+ # Validates and processes the value against the [Hash] type.
329
+ # @param [String] The value to be mapped against the type.
330
+ # @param [String] The possible type of the value.
331
+ # @param [String] The parameter indicates the group (oneOf|anyOf).
332
+ # @param [Integer] The parameter indicates the number of matches of value against types.
333
+ def self.map_hash_type(value, type, group_name, matches)
334
+ if value.instance_of? Hash
335
+ decoded = {}
336
+ value.each do |key, val|
337
+ type = type.chomp('{}').to_s
338
+ val = map_types(val, type, group_name: group_name)
339
+ decoded[key] = val unless type.empty?
340
+ rescue ValidationException
341
+ next
342
+ end
343
+ matches += 1 if decoded.length == value.length
344
+ value = decoded unless decoded.empty?
345
+ end
346
+ [value, matches]
347
+ end
348
+
349
+ # Validates and processes the value against the [Array] type.
350
+ # @param [String] The value to be mapped against the type.
351
+ # @param [String] The possible type of the value.
352
+ # @param [String] The parameter indicates the group (oneOf|anyOf).
353
+ # @param [Integer] The parameter indicates the number of matches of value against types.
354
+ def self.map_array_type(value, type, group_name, matches)
355
+ if value.instance_of? Array
356
+ decoded = []
357
+ value.each do |val|
358
+ type = type.chomp('[]').to_s
359
+ val = map_types(val, type, group_name: group_name)
360
+ decoded.append(val) unless type.empty?
361
+ rescue ValidationException
362
+ next
363
+ end
364
+ matches += 1 if decoded.length == value.length
365
+ value = decoded unless decoded.empty?
366
+ end
367
+ [value, matches]
368
+ end
369
+
370
+ # Validates and processes the value against the type.
371
+ # @param [String] The value to be mapped against the type.
372
+ # @param [String] The possible type of the value.
373
+ # @param [String] The parameter indicates the group (oneOf|anyOf).
374
+ # @param [Integer] The parameter indicates the number of matches of value against types.
375
+ def self.map_type(value, type, _group_name, matches)
376
+ if Square.constants.select do |c|
377
+ Square.const_get(c).to_s == "Square::#{type}"
378
+ end.empty?
379
+ value, matches = map_data_type(value, type, matches)
380
+ else
381
+ value, matches = map_complex_type(value, type, matches)
382
+ end
383
+ [value, matches]
384
+ end
385
+
386
+ # Validates and processes the value against the complex types.
387
+ # @param [String] The value to be mapped against the type.
388
+ # @param [String] The possible type of the value.
389
+ # @param [Integer] The parameter indicates the number of matches of value against types.
390
+ def self.map_complex_type(value, type, matches)
391
+ obj = Square.const_get(type)
392
+ value = if obj.respond_to? 'from_hash'
393
+ obj.send('from_hash', value)
394
+ else
395
+ obj.constants.find { |k| obj.const_get(k) == value }
396
+ end
397
+ matches += 1 unless value.nil?
398
+ [value, matches]
399
+ end
400
+
401
+ # Validates and processes the value against the data types.
402
+ # @param [String] The value to be mapped against the type.
403
+ # @param [String] The possible type of the value.
404
+ # @param [Integer] The parameter indicates the number of matches of value against types.
405
+ def self.map_data_type(value, element, matches)
406
+ element = element.split('|').map { |x| Object.const_get x }
407
+ matches += 1 if element.all? { |x| APIHelper.data_types.include?(x) } &&
408
+ element.any? { |x| (value.instance_of? x) || (value.class.ancestors.include? x) }
409
+ [value, matches]
410
+ end
411
+
412
+ # Validates the value against the template(group of types).
413
+ # @param [String] The value to be mapped against the type.
414
+ # @param [String] The parameter indicates the group of types (oneOf(Integer, String)).
415
+ def self.validate_types(value, template)
416
+ map_types(APIHelper.json_deserialize(value.to_json), template)
417
+ end
418
+
419
+ # Get content-type depending on the value
420
+ def self.get_content_type(value)
421
+ if serializable_types.map { |x| value.is_a? x }.any?
422
+ 'text/plain; charset=utf-8'
276
423
  else
277
- DateTime.rfc3339(date_time + 'Z')
424
+ 'application/json; charset=utf-8'
278
425
  end
279
426
  end
427
+
428
+ # Array of serializable types
429
+ def self.serializable_types
430
+ [String, Numeric, TrueClass,
431
+ FalseClass, Date, DateTime]
432
+ end
433
+
434
+ # Array of supported data types
435
+ def self.data_types
436
+ [String, Float, Integer,
437
+ TrueClass, FalseClass, Date,
438
+ DateTime, Array, Hash, Object]
439
+ end
280
440
  end
281
441
  end
data/lib/square/client.rb CHANGED
@@ -4,13 +4,17 @@ module Square
4
4
  attr_reader :config
5
5
 
6
6
  def sdk_version
7
- '8.0.0.20201216'
7
+ '26.1.0.20230119'
8
8
  end
9
9
 
10
10
  def square_version
11
11
  config.square_version
12
12
  end
13
13
 
14
+ def user_agent_detail
15
+ config.user_agent_detail
16
+ end
17
+
14
18
  # Access to mobile_authorization controller.
15
19
  # @return [MobileAuthorizationApi] Returns the controller instance.
16
20
  def mobile_authorization
@@ -23,24 +27,12 @@ module Square
23
27
  @o_auth ||= OAuthApi.new config
24
28
  end
25
29
 
26
- # Access to v1_employees controller.
27
- # @return [V1EmployeesApi] Returns the controller instance.
28
- def v1_employees
29
- @v1_employees ||= V1EmployeesApi.new config
30
- end
31
-
32
30
  # Access to v1_transactions controller.
33
31
  # @return [V1TransactionsApi] Returns the controller instance.
34
32
  def v1_transactions
35
33
  @v1_transactions ||= V1TransactionsApi.new config
36
34
  end
37
35
 
38
- # Access to v1_items controller.
39
- # @return [V1ItemsApi] Returns the controller instance.
40
- def v1_items
41
- @v1_items ||= V1ItemsApi.new config
42
- end
43
-
44
36
  # Access to apple_pay controller.
45
37
  # @return [ApplePayApi] Returns the controller instance.
46
38
  def apple_pay
@@ -59,6 +51,18 @@ module Square
59
51
  @bookings ||= BookingsApi.new config
60
52
  end
61
53
 
54
+ # Access to booking_custom_attributes controller.
55
+ # @return [BookingCustomAttributesApi] Returns the controller instance.
56
+ def booking_custom_attributes
57
+ @booking_custom_attributes ||= BookingCustomAttributesApi.new config
58
+ end
59
+
60
+ # Access to cards controller.
61
+ # @return [CardsApi] Returns the controller instance.
62
+ def cards
63
+ @cards ||= CardsApi.new config
64
+ end
65
+
62
66
  # Access to cash_drawers controller.
63
67
  # @return [CashDrawersApi] Returns the controller instance.
64
68
  def cash_drawers
@@ -77,6 +81,12 @@ module Square
77
81
  @customers ||= CustomersApi.new config
78
82
  end
79
83
 
84
+ # Access to customer_custom_attributes controller.
85
+ # @return [CustomerCustomAttributesApi] Returns the controller instance.
86
+ def customer_custom_attributes
87
+ @customer_custom_attributes ||= CustomerCustomAttributesApi.new config
88
+ end
89
+
80
90
  # Access to customer_groups controller.
81
91
  # @return [CustomerGroupsApi] Returns the controller instance.
82
92
  def customer_groups
@@ -107,6 +117,18 @@ module Square
107
117
  @employees ||= EmployeesApi.new config
108
118
  end
109
119
 
120
+ # Access to gift_cards controller.
121
+ # @return [GiftCardsApi] Returns the controller instance.
122
+ def gift_cards
123
+ @gift_cards ||= GiftCardsApi.new config
124
+ end
125
+
126
+ # Access to gift_card_activities controller.
127
+ # @return [GiftCardActivitiesApi] Returns the controller instance.
128
+ def gift_card_activities
129
+ @gift_card_activities ||= GiftCardActivitiesApi.new config
130
+ end
131
+
110
132
  # Access to inventory controller.
111
133
  # @return [InventoryApi] Returns the controller instance.
112
134
  def inventory
@@ -131,6 +153,12 @@ module Square
131
153
  @locations ||= LocationsApi.new config
132
154
  end
133
155
 
156
+ # Access to location_custom_attributes controller.
157
+ # @return [LocationCustomAttributesApi] Returns the controller instance.
158
+ def location_custom_attributes
159
+ @location_custom_attributes ||= LocationCustomAttributesApi.new config
160
+ end
161
+
134
162
  # Access to checkout controller.
135
163
  # @return [CheckoutApi] Returns the controller instance.
136
164
  def checkout
@@ -161,18 +189,42 @@ module Square
161
189
  @orders ||= OrdersApi.new config
162
190
  end
163
191
 
192
+ # Access to order_custom_attributes controller.
193
+ # @return [OrderCustomAttributesApi] Returns the controller instance.
194
+ def order_custom_attributes
195
+ @order_custom_attributes ||= OrderCustomAttributesApi.new config
196
+ end
197
+
164
198
  # Access to payments controller.
165
199
  # @return [PaymentsApi] Returns the controller instance.
166
200
  def payments
167
201
  @payments ||= PaymentsApi.new config
168
202
  end
169
203
 
204
+ # Access to payouts controller.
205
+ # @return [PayoutsApi] Returns the controller instance.
206
+ def payouts
207
+ @payouts ||= PayoutsApi.new config
208
+ end
209
+
170
210
  # Access to refunds controller.
171
211
  # @return [RefundsApi] Returns the controller instance.
172
212
  def refunds
173
213
  @refunds ||= RefundsApi.new config
174
214
  end
175
215
 
216
+ # Access to sites controller.
217
+ # @return [SitesApi] Returns the controller instance.
218
+ def sites
219
+ @sites ||= SitesApi.new config
220
+ end
221
+
222
+ # Access to snippets controller.
223
+ # @return [SnippetsApi] Returns the controller instance.
224
+ def snippets
225
+ @snippets ||= SnippetsApi.new config
226
+ end
227
+
176
228
  # Access to subscriptions controller.
177
229
  # @return [SubscriptionsApi] Returns the controller instance.
178
230
  def subscriptions
@@ -191,17 +243,37 @@ module Square
191
243
  @terminal ||= TerminalApi.new config
192
244
  end
193
245
 
194
- def initialize(timeout: 60, max_retries: 0, retry_interval: 1,
195
- backoff_factor: 1, environment: 'production',
196
- square_version: '2020-12-16', access_token: 'TODO: Replace',
197
- additional_headers: {}, config: nil)
246
+ # Access to vendors controller.
247
+ # @return [VendorsApi] Returns the controller instance.
248
+ def vendors
249
+ @vendors ||= VendorsApi.new config
250
+ end
251
+
252
+ # Access to webhook_subscriptions controller.
253
+ # @return [WebhookSubscriptionsApi] Returns the controller instance.
254
+ def webhook_subscriptions
255
+ @webhook_subscriptions ||= WebhookSubscriptionsApi.new config
256
+ end
257
+
258
+ def initialize(connection: nil, adapter: :net_http_persistent, timeout: 60,
259
+ max_retries: 0, retry_interval: 1, backoff_factor: 2,
260
+ retry_statuses: [408, 413, 429, 500, 502, 503, 504, 521, 522, 524],
261
+ retry_methods: %i[get put], environment: 'production',
262
+ custom_url: 'https://connect.squareup.com',
263
+ square_version: '2023-01-19', access_token: '',
264
+ user_agent_detail: '', additional_headers: {}, config: nil)
198
265
  @config = if config.nil?
199
- Configuration.new(timeout: timeout, max_retries: max_retries,
266
+ Configuration.new(connection: connection, adapter: adapter,
267
+ timeout: timeout, max_retries: max_retries,
200
268
  retry_interval: retry_interval,
201
269
  backoff_factor: backoff_factor,
270
+ retry_statuses: retry_statuses,
271
+ retry_methods: retry_methods,
202
272
  environment: environment,
273
+ custom_url: custom_url,
203
274
  square_version: square_version,
204
275
  access_token: access_token,
276
+ user_agent_detail: user_agent_detail,
205
277
  additional_headers: additional_headers)
206
278
  else
207
279
  config