square.rb 26.0.0.20221214 → 26.2.0.20230315

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 (71) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -1
  3. data/lib/square/api/apple_pay_api.rb +14 -30
  4. data/lib/square/api/bank_accounts_api.rb +40 -90
  5. data/lib/square/api/base_api.rb +42 -42
  6. data/lib/square/api/booking_custom_attributes_api.rb +164 -329
  7. data/lib/square/api/bookings_api.rb +135 -260
  8. data/lib/square/api/cards_api.rb +56 -118
  9. data/lib/square/api/cash_drawers_api.rb +47 -103
  10. data/lib/square/api/catalog_api.rb +197 -423
  11. data/lib/square/api/checkout_api.rb +85 -175
  12. data/lib/square/api/customer_custom_attributes_api.rb +150 -303
  13. data/lib/square/api/customer_groups_api.rb +69 -145
  14. data/lib/square/api/customer_segments_api.rb +26 -61
  15. data/lib/square/api/customers_api.rb +147 -294
  16. data/lib/square/api/devices_api.rb +42 -89
  17. data/lib/square/api/disputes_api.rb +130 -288
  18. data/lib/square/api/employees_api.rb +28 -63
  19. data/lib/square/api/gift_card_activities_api.rb +33 -65
  20. data/lib/square/api/gift_cards_api.rb +103 -202
  21. data/lib/square/api/inventory_api.rb +179 -366
  22. data/lib/square/api/invoices_api.rb +118 -237
  23. data/lib/square/api/labor_api.rb +223 -459
  24. data/lib/square/api/location_custom_attributes_api.rb +419 -0
  25. data/lib/square/api/locations_api.rb +54 -112
  26. data/lib/square/api/loyalty_api.rb +259 -512
  27. data/lib/square/api/merchants_api.rb +25 -60
  28. data/lib/square/api/mobile_authorization_api.rb +14 -30
  29. data/lib/square/api/o_auth_api.rb +54 -109
  30. data/lib/square/api/order_custom_attributes_api.rb +168 -333
  31. data/lib/square/api/orders_api.rb +115 -222
  32. data/lib/square/api/payments_api.rb +106 -208
  33. data/lib/square/api/payouts_api.rb +47 -100
  34. data/lib/square/api/refunds_api.rb +46 -93
  35. data/lib/square/api/sites_api.rb +11 -28
  36. data/lib/square/api/snippets_api.rb +42 -90
  37. data/lib/square/api/subscriptions_api.rb +150 -299
  38. data/lib/square/api/team_api.rb +114 -224
  39. data/lib/square/api/terminal_api.rb +162 -328
  40. data/lib/square/api/transactions_api.rb +62 -126
  41. data/lib/square/api/v1_transactions_api.rb +155 -296
  42. data/lib/square/api/vendors_api.rb +99 -192
  43. data/lib/square/api/webhook_subscriptions_api.rb +115 -235
  44. data/lib/square/api_helper.rb +1 -437
  45. data/lib/square/client.rb +82 -46
  46. data/lib/square/configuration.rb +28 -53
  47. data/lib/square/exceptions/api_exception.rb +1 -11
  48. data/lib/square/http/api_response.rb +13 -19
  49. data/lib/square/http/auth/o_auth2.rb +14 -7
  50. data/lib/square/http/http_call_back.rb +1 -15
  51. data/lib/square/http/http_method_enum.rb +1 -4
  52. data/lib/square/http/http_request.rb +1 -45
  53. data/lib/square/http/http_response.rb +1 -20
  54. data/lib/square/utilities/date_time_helper.rb +1 -146
  55. data/lib/square/utilities/file_wrapper.rb +5 -5
  56. data/lib/square.rb +7 -6
  57. data/spec/user_journey_spec.rb +2 -2
  58. data/test/api/api_test_base.rb +13 -5
  59. data/test/api/test_catalog_api.rb +5 -4
  60. data/test/api/test_customers_api.rb +3 -2
  61. data/test/api/test_employees_api.rb +4 -3
  62. data/test/api/test_labor_api.rb +6 -5
  63. data/test/api/test_locations_api.rb +3 -2
  64. data/test/api/test_merchants_api.rb +4 -3
  65. data/test/api/test_payments_api.rb +4 -3
  66. data/test/api/test_refunds_api.rb +4 -3
  67. metadata +12 -111
  68. data/lib/square/exceptions/validation_exception.rb +0 -13
  69. data/lib/square/http/faraday_client.rb +0 -93
  70. data/lib/square/http/http_client.rb +0 -118
  71. data/test/test_helper.rb +0 -89
@@ -1,441 +1,5 @@
1
1
  module Square
2
2
  # API utility class
3
- class APIHelper
4
- # Serializes an array parameter (creates key value pairs).
5
- # @param [String] The name of the parameter.
6
- # @param [Array] The value of the parameter.
7
- # @param [String] The format of the serialization.
8
- def self.serialize_array(key, array, formatting: 'indexed')
9
- tuples = []
10
-
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
21
- tuples
22
- end
23
-
24
- # Replaces template parameters in the given url.
25
- # @param [String] The query string builder to replace the template
26
- # parameters.
27
- # @param [Hash] The parameters to replace in the url.
28
- def self.append_url_with_template_parameters(query_builder, parameters)
29
- # perform parameter validation
30
- unless query_builder.instance_of? String
31
- raise ArgumentError, 'Given value for parameter \"query_builder\" is
32
- invalid.'
33
- end
34
-
35
- # Return if there are no parameters to replace.
36
- return query_builder if parameters.nil?
37
-
38
- parameters.each do |key, val|
39
- if val.nil?
40
- replace_value = ''
41
- elsif val['value'].instance_of? Array
42
- if val['encode'] == true
43
- val['value'].map! { |element| CGI.escape(element.to_s) }
44
- else
45
- val['value'].map!(&:to_s)
46
- end
47
- replace_value = val['value'].join('/')
48
- else
49
- replace_value = if val['encode'] == true
50
- CGI.escape(val['value'].to_s)
51
- else
52
- val['value'].to_s
53
- end
54
- end
55
-
56
- # Find the template parameter and replace it with its value.
57
- query_builder = query_builder.gsub("{#{key}}", replace_value)
58
- end
59
- query_builder
60
- end
61
-
62
- # Appends the given set of parameters to the given query string.
63
- # @param [String] The query string builder to add the query parameters to.
64
- # @param [Hash] The parameters to append.
65
- def self.append_url_with_query_parameters(query_builder, parameters)
66
- # Perform parameter validation.
67
- unless query_builder.instance_of? String
68
- raise ArgumentError, 'Given value for parameter \"query_builder\"
69
- is invalid.'
70
- end
71
-
72
- # Return if there are no parameters to replace.
73
- return query_builder if parameters.nil?
74
-
75
- array_serialization = 'indexed'
76
- parameters = process_complex_types_parameters(parameters, array_serialization)
77
-
78
- parameters.each do |key, value|
79
- seperator = query_builder.include?('?') ? '&' : '?'
80
- unless value.nil?
81
- if value.instance_of? Array
82
- value.compact!
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
89
- else
90
- query_builder += "#{seperator}#{key}=#{CGI.escape(value.to_s)}"
91
- end
92
- end
93
- end
94
- query_builder
95
- end
96
-
97
- # Validates and processes the given Url.
98
- # @param [String] The given Url to process.
99
- # @return [String] Pre-processed Url as string.
100
- def self.clean_url(url)
101
- # Perform parameter validation.
102
- raise ArgumentError, 'Invalid Url.' unless url.instance_of? String
103
-
104
- # Ensure that the urls are absolute.
105
- matches = url.match(%r{^(https?://[^/]+)})
106
- raise ArgumentError, 'Invalid Url format.' if matches.nil?
107
-
108
- # Get the http protocol match.
109
- protocol = matches[1]
110
-
111
- # Check if parameters exist.
112
- index = url.index('?')
113
-
114
- # Remove redundant forward slashes.
115
- query = url[protocol.length...(!index.nil? ? index : url.length)]
116
- query.gsub!(%r{//+}, '/')
117
-
118
- # Get the parameters.
119
- parameters = !index.nil? ? url[url.index('?')...url.length] : ''
120
-
121
- # Return processed url.
122
- protocol + query + parameters
123
- end
124
-
125
- # Parses JSON string.
126
- # @param [String] A JSON string.
127
- def self.json_deserialize(json)
128
- JSON.parse(json, symbolize_names: true)
129
- rescue StandardError
130
- raise TypeError, 'Server responded with invalid JSON.'
131
- end
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
-
139
- # Removes elements with empty values from a hash.
140
- # @param [Hash] The hash to clean.
141
- def self.clean_hash(hash)
142
- hash.delete_if { |_key, value| value.to_s.strip.empty? }
143
- end
144
-
145
- # Form encodes a hash of parameters.
146
- # @param [Hash] The hash of parameters to encode.
147
- # @return [Hash] A hash with the same parameters form encoded.
148
- def self.form_encode_parameters(form_parameters)
149
- array_serialization = 'indexed'
150
- encoded = {}
151
- form_parameters.each do |key, value|
152
- encoded.merge!(APIHelper.form_encode(value, key, formatting:
153
- array_serialization))
154
- end
155
- encoded
156
- end
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
-
170
- def self.custom_merge(a, b)
171
- x = {}
172
- a.each do |key, value_a|
173
- b.each do |k, value_b|
174
- next unless key == k
175
-
176
- x[k] = []
177
- if value_a.instance_of? Array
178
- value_a.each do |v|
179
- x[k].push(v)
180
- end
181
- else
182
- x[k].push(value_a)
183
- end
184
- if value_b.instance_of? Array
185
- value_b.each do |v|
186
- x[k].push(v)
187
- end
188
- else
189
- x[k].push(value_b)
190
- end
191
- a.delete(k)
192
- b.delete(k)
193
- end
194
- end
195
- x.merge!(a)
196
- x.merge!(b)
197
- x
198
- end
199
-
200
- # Form encodes an object.
201
- # @param [Dynamic] An object to form encode.
202
- # @param [String] The name of the object.
203
- # @return [Hash] A form encoded representation of the object in the form
204
- # of a hash.
205
- def self.form_encode(obj, instance_name, formatting: 'indexed')
206
- retval = {}
207
-
208
- # Create a form encoded hash for this object.
209
- if obj.nil?
210
- nil
211
- elsif obj.instance_of? Array
212
- if formatting == 'indexed'
213
- obj.each_with_index do |value, index|
214
- retval.merge!(APIHelper.form_encode(value, "#{instance_name}[#{index}]"))
215
- end
216
- elsif APIHelper.serializable_types.map { |x| obj[0].is_a? x }.any?
217
- obj.each do |value|
218
- abc = if formatting == 'unindexed'
219
- APIHelper.form_encode(value, "#{instance_name}[]",
220
- formatting: formatting)
221
- else
222
- APIHelper.form_encode(value, instance_name,
223
- formatting: formatting)
224
- end
225
- retval = APIHelper.custom_merge(retval, abc)
226
- end
227
- else
228
- obj.each_with_index do |value, index|
229
- retval.merge!(APIHelper.form_encode(value, "#{instance_name}[#{index}]",
230
- formatting: formatting))
231
- end
232
- end
233
- elsif obj.instance_of? Hash
234
- obj.each do |key, value|
235
- retval.merge!(APIHelper.form_encode(value, "#{instance_name}[#{key}]",
236
- formatting: formatting))
237
- end
238
- elsif obj.instance_of? File
239
- retval[instance_name] = UploadIO.new(
240
- obj, 'application/octet-stream', File.basename(obj.path)
241
- )
242
- else
243
- retval[instance_name] = obj
244
- end
245
- retval
246
- end
247
-
248
- # Retrieves a field from a Hash/Array based on an Array of keys/indexes
249
- # @param [Hash, Array] The hash to extract data from
250
- # @param [Array<String, Integer>] The keys/indexes to use
251
- # @return [Object] The extracted value
252
- def self.map_response(obj, keys)
253
- val = obj
254
- begin
255
- keys.each do |key|
256
- val = if val.is_a? Array
257
- if key.to_i.to_s == key
258
- val[key.to_i]
259
- else
260
- val = nil
261
- end
262
- else
263
- val.fetch(key.to_sym)
264
- end
265
- end
266
- rescue NoMethodError, TypeError, IndexError
267
- val = nil
268
- end
269
- val
270
- end
271
-
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'
423
- else
424
- 'application/json; charset=utf-8'
425
- end
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
3
+ class APIHelper < CoreLibrary::ApiHelper
440
4
  end
441
5
  end