workato-connector-sdk 1.2.0 → 1.3.0

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 (55) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/VERSION +1 -0
  4. data/lib/workato/cli/edit_command.rb +3 -1
  5. data/lib/workato/cli/exec_command.rb +76 -10
  6. data/lib/workato/cli/generate_command.rb +2 -2
  7. data/lib/workato/cli/main.rb +17 -10
  8. data/lib/workato/cli/oauth2_command.rb +4 -4
  9. data/lib/workato/cli/push_command.rb +2 -2
  10. data/lib/workato/cli/schema_command.rb +2 -2
  11. data/lib/workato/connector/sdk/account_properties.rb +2 -2
  12. data/lib/workato/connector/sdk/action.rb +20 -70
  13. data/lib/workato/connector/sdk/block_invocation_refinements.rb +2 -10
  14. data/lib/workato/connector/sdk/connection.rb +36 -19
  15. data/lib/workato/connector/sdk/connector.rb +65 -77
  16. data/lib/workato/connector/sdk/core.rb +62 -0
  17. data/lib/workato/connector/sdk/dsl/aws.rb +3 -3
  18. data/lib/workato/connector/sdk/dsl/call.rb +1 -1
  19. data/lib/workato/connector/sdk/dsl/csv_package.rb +133 -0
  20. data/lib/workato/connector/sdk/dsl/execution_context.rb +1 -0
  21. data/lib/workato/connector/sdk/dsl/http.rb +1 -1
  22. data/lib/workato/connector/sdk/dsl/reinvoke_after.rb +84 -0
  23. data/lib/workato/connector/sdk/dsl/stream_package.rb +65 -0
  24. data/lib/workato/connector/sdk/dsl/time.rb +0 -14
  25. data/lib/workato/connector/sdk/dsl/workato_package.rb +146 -0
  26. data/lib/workato/connector/sdk/dsl.rb +63 -10
  27. data/lib/workato/connector/sdk/errors.rb +28 -11
  28. data/lib/workato/connector/sdk/operation.rb +9 -2
  29. data/lib/workato/connector/sdk/request.rb +63 -25
  30. data/lib/workato/connector/sdk/schema/field/convertors.rb +2 -2
  31. data/lib/workato/connector/sdk/schema/type/unicode_string.rb +1 -1
  32. data/lib/workato/connector/sdk/schema.rb +7 -5
  33. data/lib/workato/connector/sdk/settings.rb +10 -1
  34. data/lib/workato/connector/sdk/stream.rb +243 -0
  35. data/lib/workato/connector/sdk/streams.rb +71 -0
  36. data/lib/workato/connector/sdk/summarize.rb +2 -2
  37. data/lib/workato/connector/sdk/trigger.rb +14 -7
  38. data/lib/workato/connector/sdk/version.rb +1 -1
  39. data/lib/workato/connector/sdk.rb +19 -46
  40. data/lib/workato/extension/array.rb +2 -0
  41. data/lib/workato/extension/case_sensitive_headers.rb +0 -1
  42. data/lib/workato/extension/content_encoding_decoder.rb +2 -0
  43. data/lib/workato/extension/currency/countries.rb +79 -0
  44. data/lib/workato/extension/currency/countries.yml +18433 -0
  45. data/lib/workato/extension/currency/currencies.rb +55 -0
  46. data/lib/workato/extension/currency/currencies.yml +479 -0
  47. data/lib/workato/extension/currency.rb +73 -5
  48. data/lib/workato/extension/enumerable.rb +2 -2
  49. data/lib/workato/extension/metadata_fix_wrap_kw_args.rb +11 -0
  50. data/lib/workato/extension/string.rb +14 -111
  51. data/lib/workato/testing/vcr_encrypted_cassette_serializer.rb +2 -0
  52. data/lib/workato/types/binary.rb +55 -0
  53. metadata +46 -61
  54. data/lib/workato/connector/sdk/dsl/csv.rb +0 -125
  55. data/lib/workato/connector/sdk/dsl/workato_code_lib.rb +0 -167
@@ -15,9 +15,6 @@ module Workato
15
15
  r[k] = v
16
16
  end
17
17
  end
18
- TO_COUNTRY_METHODS = %w[alpha2 alpha3 name number].freeze
19
- TO_CURRENCY_METHODS = %w[code name symbol].freeze
20
- TO_STATE_METHODS = %w[code name].freeze
21
18
 
22
19
  def is_int? # rubocop:disable Naming/PredicateName
23
20
  present? && (self !~ /\D/)
@@ -92,6 +89,10 @@ module Workato
92
89
  end.join(' ')
93
90
  end
94
91
 
92
+ def +(other)
93
+ super(other&.to_s)
94
+ end
95
+
95
96
  def to_hex
96
97
  unpack('H*')[0]
97
98
  end
@@ -103,7 +104,7 @@ module Workato
103
104
  alias encode_hex to_hex
104
105
 
105
106
  def decode_hex
106
- Extension::Binary.new([self].pack('H*'))
107
+ Types::Binary.new([self].pack('H*'))
107
108
  end
108
109
 
109
110
  def encode_base64
@@ -111,7 +112,7 @@ module Workato
111
112
  end
112
113
 
113
114
  def decode_base64
114
- Extension::Binary.new(Base64.decode64(self))
115
+ Types::Binary.new(Base64.decode64(self))
115
116
  end
116
117
 
117
118
  def encode_urlsafe_base64
@@ -127,27 +128,27 @@ module Workato
127
128
  end
128
129
 
129
130
  def decode_urlsafe_base64
130
- Extension::Binary.new(Base64.urlsafe_decode64(self))
131
+ Types::Binary.new(Base64.urlsafe_decode64(self))
131
132
  end
132
133
 
133
134
  def encode_sha256
134
- Extension::Binary.new(::Digest::SHA256.digest(self))
135
+ Types::Binary.new(::Digest::SHA256.digest(self))
135
136
  end
136
137
 
137
138
  def hmac_sha256(key)
138
139
  digest = ::OpenSSL::Digest.new('sha256')
139
- Extension::Binary.new(::OpenSSL::HMAC.digest(digest, key, self))
140
+ Types::Binary.new(::OpenSSL::HMAC.digest(digest, key, self))
140
141
  end
141
142
 
142
143
  def hmac_sha512(key)
143
144
  digest = ::OpenSSL::Digest.new('sha512')
144
- Extension::Binary.new(::OpenSSL::HMAC.digest(digest, key, self))
145
+ Types::Binary.new(::OpenSSL::HMAC.digest(digest, key, self))
145
146
  end
146
147
 
147
148
  def rsa_sha256(key)
148
149
  digest = ::OpenSSL::Digest.new('sha256')
149
150
  private_key = ::OpenSSL::PKey::RSA.new(key)
150
- Workato::Extension::Binary.new(private_key.sign(digest, self))
151
+ Types::Binary.new(private_key.sign(digest, self))
151
152
  end
152
153
 
153
154
  def md5_hexdigest
@@ -155,120 +156,22 @@ module Workato
155
156
  end
156
157
 
157
158
  def sha1
158
- Extension::Binary.new(::Digest::SHA1.digest(self))
159
+ Types::Binary.new(::Digest::SHA1.digest(self))
159
160
  end
160
161
 
161
162
  def hmac_sha1(key)
162
163
  digest = ::OpenSSL::Digest.new('sha1')
163
- Extension::Binary.new(::OpenSSL::HMAC.digest(digest, key, self))
164
+ Types::Binary.new(::OpenSSL::HMAC.digest(digest, key, self))
164
165
  end
165
166
 
166
167
  def hmac_md5(key)
167
168
  digest = ::OpenSSL::Digest.new('md5')
168
- Extension::Binary.new(::OpenSSL::HMAC.digest(digest, key, self))
169
+ Types::Binary.new(::OpenSSL::HMAC.digest(digest, key, self))
169
170
  end
170
171
 
171
172
  def from_xml
172
173
  Workato::Utilities::Xml.parse_xml_to_hash(self)
173
174
  end
174
-
175
- TO_COUNTRY_METHODS.each do |suffix|
176
- define_method("to_country_#{suffix}") do
177
- to_country.try(suffix)
178
- end
179
- end
180
-
181
- TO_CURRENCY_METHODS.each do |suffix|
182
- define_method("to_currency_#{suffix}") do
183
- to_currency_obj.try(suffix)
184
- end
185
- end
186
-
187
- TO_STATE_METHODS.each do |suffix|
188
- define_method("to_state_#{suffix}") do |country_name = 'US'|
189
- to_state(country_name).try(:[], suffix)
190
- end
191
- end
192
-
193
- protected
194
-
195
- def to_country
196
- TO_COUNTRY_METHODS.transform_find do |attr|
197
- ISO3166::Country.send("find_country_by_#{attr}", self)
198
- end
199
- end
200
-
201
- def to_currency_obj
202
- ISO4217::Currency.from_code(self) || to_country.try(:currency)
203
- end
204
-
205
- def to_state(country_name = 'US')
206
- country_name = country_name.presence || 'US'
207
- country = country_name.to_country
208
- return nil if country.blank?
209
-
210
- state = upcase
211
- country.states.transform_find do |code, data|
212
- name = data['name'].upcase
213
- other_names = Array(data['names']).map(&:upcase)
214
- if code == state || name == state || other_names.include?(state)
215
- {
216
- code: code,
217
- name: name
218
- }.with_indifferent_access
219
- end
220
- end
221
- end
222
- end
223
-
224
- class Binary < ::String
225
- TITLE_LENGTH = 16
226
- SUMMARY_LENGTH = 128
227
-
228
- def initialize(str)
229
- super(str)
230
- force_encoding(Encoding::ASCII_8BIT)
231
- end
232
-
233
- def to_s
234
- self
235
- end
236
-
237
- def to_json(_options = nil)
238
- summary
239
- end
240
-
241
- def binary?
242
- true
243
- end
244
-
245
- def base64
246
- Base64.strict_encode64(self)
247
- end
248
-
249
- def as_string(encoding)
250
- ::String.new(self, encoding: encoding).encode(encoding, invalid: :replace, undef: :replace)
251
- end
252
-
253
- def as_utf8
254
- as_string('utf-8')
255
- end
256
-
257
- def sha1
258
- Binary.new(::Digest::SHA1.digest(self))
259
- end
260
-
261
- private
262
-
263
- def summary
264
- if length.positive?
265
- left = "0x#{byteslice(0, SUMMARY_LENGTH).unpack1('H*')}"
266
- right = bytesize > SUMMARY_LENGTH ? "…(#{bytesize - SUMMARY_LENGTH} bytes more)" : ''
267
- "#{left}#{right}"
268
- else
269
- ''
270
- end
271
- end
272
175
  end
273
176
  end
274
177
  end
@@ -1,6 +1,8 @@
1
1
  # typed: true
2
2
  # frozen_string_literal: true
3
3
 
4
+ require_relative '../extension/metadata_fix_wrap_kw_args'
5
+
4
6
  module Workato
5
7
  module Testing
6
8
  class VCREncryptedCassetteSerializer < ActiveSupport::EncryptedFile
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Workato
4
+ module Types
5
+ class Binary < ::String
6
+ TITLE_LENGTH = 16
7
+ SUMMARY_LENGTH = 128
8
+
9
+ def initialize(str)
10
+ super(str)
11
+ force_encoding(Encoding::ASCII_8BIT)
12
+ end
13
+
14
+ def to_s
15
+ self
16
+ end
17
+
18
+ def to_json(_options = nil)
19
+ summary
20
+ end
21
+
22
+ def binary?
23
+ true
24
+ end
25
+
26
+ def base64
27
+ Base64.strict_encode64(self)
28
+ end
29
+
30
+ def as_string(encoding)
31
+ ::String.new(self, encoding: encoding).encode(encoding, invalid: :replace, undef: :replace)
32
+ end
33
+
34
+ def as_utf8
35
+ as_string('utf-8')
36
+ end
37
+
38
+ def sha1
39
+ Binary.new(::Digest::SHA1.digest(self))
40
+ end
41
+
42
+ private
43
+
44
+ def summary
45
+ if length.positive?
46
+ left = "0x#{byteslice(0, SUMMARY_LENGTH).unpack1('H*')}"
47
+ right = bytesize > SUMMARY_LENGTH ? "…(#{bytesize - SUMMARY_LENGTH} bytes more)" : ''
48
+ "#{left}#{right}"
49
+ else
50
+ ''
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: workato-connector-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pavel Abolmasov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-11-07 00:00:00.000000000 Z
11
+ date: 2023-01-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -39,47 +39,33 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: 1.2.4
41
41
  - !ruby/object:Gem::Dependency
42
- name: charlock_holmes
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - '='
46
- - !ruby/object:Gem::Version
47
- version: 0.7.7
48
- type: :runtime
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - '='
53
- - !ruby/object:Gem::Version
54
- version: 0.7.7
55
- - !ruby/object:Gem::Dependency
56
- name: countries
42
+ name: bundler
57
43
  requirement: !ruby/object:Gem::Requirement
58
44
  requirements:
59
- - - '='
45
+ - - "~>"
60
46
  - !ruby/object:Gem::Version
61
- version: 1.2.2
47
+ version: '2.0'
62
48
  type: :runtime
63
49
  prerelease: false
64
50
  version_requirements: !ruby/object:Gem::Requirement
65
51
  requirements:
66
- - - '='
52
+ - - "~>"
67
53
  - !ruby/object:Gem::Version
68
- version: 1.2.2
54
+ version: '2.0'
69
55
  - !ruby/object:Gem::Dependency
70
- name: currencies
56
+ name: charlock_holmes
71
57
  requirement: !ruby/object:Gem::Requirement
72
58
  requirements:
73
59
  - - '='
74
60
  - !ruby/object:Gem::Version
75
- version: 0.4.2
61
+ version: 0.7.7
76
62
  type: :runtime
77
63
  prerelease: false
78
64
  version_requirements: !ruby/object:Gem::Requirement
79
65
  requirements:
80
66
  - - '='
81
67
  - !ruby/object:Gem::Version
82
- version: 0.4.2
68
+ version: 0.7.7
83
69
  - !ruby/object:Gem::Dependency
84
70
  name: em-http-request
85
71
  requirement: !ruby/object:Gem::Requirement
@@ -170,14 +156,14 @@ dependencies:
170
156
  requirements:
171
157
  - - '='
172
158
  - !ruby/object:Gem::Version
173
- version: 1.10.10
159
+ version: 1.13.10
174
160
  type: :runtime
175
161
  prerelease: false
176
162
  version_requirements: !ruby/object:Gem::Requirement
177
163
  requirements:
178
164
  - - '='
179
165
  - !ruby/object:Gem::Version
180
- version: 1.10.10
166
+ version: 1.13.10
181
167
  - !ruby/object:Gem::Dependency
182
168
  name: oauth2
183
169
  requirement: !ruby/object:Gem::Requirement
@@ -192,6 +178,20 @@ dependencies:
192
178
  - - "~>"
193
179
  - !ruby/object:Gem::Version
194
180
  version: '1.0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: psych
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - "~>"
186
+ - !ruby/object:Gem::Version
187
+ version: '3.0'
188
+ type: :runtime
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - "~>"
193
+ - !ruby/object:Gem::Version
194
+ version: '3.0'
195
195
  - !ruby/object:Gem::Dependency
196
196
  name: rack
197
197
  requirement: !ruby/object:Gem::Requirement
@@ -318,34 +318,6 @@ dependencies:
318
318
  - - "~>"
319
319
  - !ruby/object:Gem::Version
320
320
  version: '1.0'
321
- - !ruby/object:Gem::Dependency
322
- name: bundler
323
- requirement: !ruby/object:Gem::Requirement
324
- requirements:
325
- - - "~>"
326
- - !ruby/object:Gem::Version
327
- version: '1.17'
328
- type: :development
329
- prerelease: false
330
- version_requirements: !ruby/object:Gem::Requirement
331
- requirements:
332
- - - "~>"
333
- - !ruby/object:Gem::Version
334
- version: '1.17'
335
- - !ruby/object:Gem::Dependency
336
- name: rake
337
- requirement: !ruby/object:Gem::Requirement
338
- requirements:
339
- - - "~>"
340
- - !ruby/object:Gem::Version
341
- version: '13.0'
342
- type: :development
343
- prerelease: false
344
- version_requirements: !ruby/object:Gem::Requirement
345
- requirements:
346
- - - "~>"
347
- - !ruby/object:Gem::Version
348
- version: '13.0'
349
321
  - !ruby/object:Gem::Dependency
350
322
  name: rspec
351
323
  requirement: !ruby/object:Gem::Requirement
@@ -380,14 +352,14 @@ dependencies:
380
352
  requirements:
381
353
  - - "~>"
382
354
  - !ruby/object:Gem::Version
383
- version: '0.4'
355
+ version: '0.6'
384
356
  type: :development
385
357
  prerelease: false
386
358
  version_requirements: !ruby/object:Gem::Requirement
387
359
  requirements:
388
360
  - - "~>"
389
361
  - !ruby/object:Gem::Version
390
- version: '0.4'
362
+ version: '0.6'
391
363
  - !ruby/object:Gem::Dependency
392
364
  name: timecop
393
365
  requirement: !ruby/object:Gem::Requirement
@@ -408,14 +380,14 @@ dependencies:
408
380
  requirements:
409
381
  - - "~>"
410
382
  - !ruby/object:Gem::Version
411
- version: '3.0'
383
+ version: '6.0'
412
384
  type: :development
413
385
  prerelease: false
414
386
  version_requirements: !ruby/object:Gem::Requirement
415
387
  requirements:
416
388
  - - "~>"
417
389
  - !ruby/object:Gem::Version
418
- version: '3.0'
390
+ version: '6.0'
419
391
  - !ruby/object:Gem::Dependency
420
392
  name: webmock
421
393
  requirement: !ruby/object:Gem::Requirement
@@ -440,6 +412,7 @@ extra_rdoc_files: []
440
412
  files:
441
413
  - LICENSE.md
442
414
  - README.md
415
+ - VERSION
443
416
  - exe/workato
444
417
  - lib/workato-connector-sdk.rb
445
418
  - lib/workato/cli/edit_command.rb
@@ -458,17 +431,20 @@ files:
458
431
  - lib/workato/connector/sdk/block_invocation_refinements.rb
459
432
  - lib/workato/connector/sdk/connection.rb
460
433
  - lib/workato/connector/sdk/connector.rb
434
+ - lib/workato/connector/sdk/core.rb
461
435
  - lib/workato/connector/sdk/dsl.rb
462
436
  - lib/workato/connector/sdk/dsl/account_property.rb
463
437
  - lib/workato/connector/sdk/dsl/aws.rb
464
438
  - lib/workato/connector/sdk/dsl/call.rb
465
- - lib/workato/connector/sdk/dsl/csv.rb
439
+ - lib/workato/connector/sdk/dsl/csv_package.rb
466
440
  - lib/workato/connector/sdk/dsl/error.rb
467
441
  - lib/workato/connector/sdk/dsl/execution_context.rb
468
442
  - lib/workato/connector/sdk/dsl/http.rb
469
443
  - lib/workato/connector/sdk/dsl/lookup_table.rb
444
+ - lib/workato/connector/sdk/dsl/reinvoke_after.rb
445
+ - lib/workato/connector/sdk/dsl/stream_package.rb
470
446
  - lib/workato/connector/sdk/dsl/time.rb
471
- - lib/workato/connector/sdk/dsl/workato_code_lib.rb
447
+ - lib/workato/connector/sdk/dsl/workato_package.rb
472
448
  - lib/workato/connector/sdk/dsl/workato_schema.rb
473
449
  - lib/workato/connector/sdk/errors.rb
474
450
  - lib/workato/connector/sdk/lookup_tables.rb
@@ -487,6 +463,8 @@ files:
487
463
  - lib/workato/connector/sdk/schema/type/time.rb
488
464
  - lib/workato/connector/sdk/schema/type/unicode_string.rb
489
465
  - lib/workato/connector/sdk/settings.rb
466
+ - lib/workato/connector/sdk/stream.rb
467
+ - lib/workato/connector/sdk/streams.rb
490
468
  - lib/workato/connector/sdk/summarize.rb
491
469
  - lib/workato/connector/sdk/trigger.rb
492
470
  - lib/workato/connector/sdk/version.rb
@@ -495,12 +473,17 @@ files:
495
473
  - lib/workato/extension/case_sensitive_headers.rb
496
474
  - lib/workato/extension/content_encoding_decoder.rb
497
475
  - lib/workato/extension/currency.rb
476
+ - lib/workato/extension/currency/countries.rb
477
+ - lib/workato/extension/currency/countries.yml
478
+ - lib/workato/extension/currency/currencies.rb
479
+ - lib/workato/extension/currency/currencies.yml
498
480
  - lib/workato/extension/date.rb
499
481
  - lib/workato/extension/enumerable.rb
500
482
  - lib/workato/extension/extra_chain_cert.rb
501
483
  - lib/workato/extension/hash.rb
502
484
  - lib/workato/extension/hash_with_indifferent_access.rb
503
485
  - lib/workato/extension/integer.rb
486
+ - lib/workato/extension/metadata_fix_wrap_kw_args.rb
504
487
  - lib/workato/extension/nil_class.rb
505
488
  - lib/workato/extension/object.rb
506
489
  - lib/workato/extension/phone.rb
@@ -509,6 +492,7 @@ files:
509
492
  - lib/workato/extension/time.rb
510
493
  - lib/workato/testing/vcr_encrypted_cassette_serializer.rb
511
494
  - lib/workato/testing/vcr_multipart_body_matcher.rb
495
+ - lib/workato/types/binary.rb
512
496
  - lib/workato/utilities/encoding.rb
513
497
  - lib/workato/utilities/xml.rb
514
498
  - lib/workato/web/app.rb
@@ -530,6 +514,7 @@ metadata:
530
514
  documentation_uri: https://docs.workato.com/developing-connectors/sdk/cli.html
531
515
  homepage_uri: https://www.workato.com/
532
516
  source_code_uri: https://github.com/workato/workato-connector-sdk
517
+ rubygems_mfa_required: 'true'
533
518
  post_install_message: |2+
534
519
 
535
520
  If you updated from workato-connector-sdk prior 1.2.0 your tests could be broken.
@@ -544,7 +529,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
544
529
  requirements:
545
530
  - - ">="
546
531
  - !ruby/object:Gem::Version
547
- version: '2.4'
532
+ version: 2.7.6
548
533
  required_rubygems_version: !ruby/object:Gem::Requirement
549
534
  requirements:
550
535
  - - ">="
@@ -1,125 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- require 'csv'
5
-
6
- module Workato
7
- module Connector
8
- module Sdk
9
- CsvError = Class.new(Sdk::RuntimeError)
10
-
11
- CsvFormatError = Class.new(CsvError)
12
-
13
- class CsvFileTooBigError < CsvError
14
- extend T::Sig
15
-
16
- sig { returns(Integer) }
17
- attr_reader :size
18
-
19
- sig { returns(Integer) }
20
- attr_reader :max
21
-
22
- sig { params(size: Integer, max: Integer).void }
23
- def initialize(size, max)
24
- super("CSV file is too big. Max allowed: #{max.to_s(:human_size)}, got: #{size.to_s(:human_size)}")
25
- @size = T.let(size, Integer)
26
- @max = T.let(max, Integer)
27
- end
28
- end
29
-
30
- class CsvFileTooManyLinesError < CsvError
31
- extend T::Sig
32
-
33
- sig { returns(Integer) }
34
- attr_reader :max
35
-
36
- sig { params(max: Integer).void }
37
- def initialize(max)
38
- super("CSV file has too many lines. Max allowed: #{max}")
39
- @max = T.let(max, Integer)
40
- end
41
- end
42
-
43
- module Dsl
44
- module Csv
45
- extend T::Sig
46
-
47
- MAX_FILE_SIZE_FOR_PARSE = T.let(30.megabytes, Integer)
48
- private_constant :MAX_FILE_SIZE_FOR_PARSE
49
-
50
- MAX_LINES_FOR_PARSE = 65_000
51
- private_constant :MAX_LINES_FOR_PARSE
52
-
53
- class << self
54
- extend T::Sig
55
-
56
- sig do
57
- params(
58
- str: String,
59
- headers: T.any(T::Boolean, T::Array[String], String),
60
- col_sep: T.nilable(String),
61
- row_sep: T.nilable(String),
62
- quote_char: T.nilable(String),
63
- skip_blanks: T.nilable(T::Boolean),
64
- skip_first_line: T::Boolean
65
- ).returns(
66
- T::Array[T::Hash[String, T.untyped]]
67
- )
68
- end
69
- def parse(str, headers:, col_sep: nil, row_sep: nil, quote_char: nil, skip_blanks: nil,
70
- skip_first_line: false)
71
- if str.bytesize > MAX_FILE_SIZE_FOR_PARSE
72
- raise CsvFileTooBigError.new(str.bytesize, MAX_FILE_SIZE_FOR_PARSE)
73
- end
74
-
75
- index = 0
76
- options = { col_sep: col_sep, row_sep: row_sep, quote_char: quote_char, headers: headers,
77
- skip_blanks: skip_blanks }.compact
78
- Enumerator.new do |consumer|
79
- CSV.parse(str, options) do |row|
80
- if index.zero? && skip_first_line
81
- index += 1
82
- next
83
- end
84
- if index == MAX_LINES_FOR_PARSE
85
- raise CsvFileTooManyLinesError, MAX_LINES_FOR_PARSE
86
- end
87
-
88
- index += 1
89
- consumer.yield(T.cast(row, CSV::Row).to_hash)
90
- end
91
- end.to_a
92
- rescue CSV::MalformedCSVError => e
93
- raise CsvFormatError, e
94
- rescue ArgumentError => e
95
- raise Sdk::RuntimeError, e.message
96
- end
97
-
98
- sig do
99
- params(
100
- str: T.nilable(String),
101
- headers: T.nilable(T::Array[String]),
102
- col_sep: T.nilable(String),
103
- row_sep: T.nilable(String),
104
- quote_char: T.nilable(String),
105
- force_quotes: T.nilable(T::Boolean),
106
- blk: T.proc.params(csv: CSV).void
107
- ).returns(
108
- String
109
- )
110
- end
111
- def generate(str = nil, headers: nil, col_sep: nil, row_sep: nil, quote_char: nil, force_quotes: nil, &blk)
112
- options = { col_sep: col_sep, row_sep: row_sep, quote_char: quote_char, headers: headers,
113
- force_quotes: force_quotes }.compact
114
- options[:write_headers] = options[:headers].present?
115
-
116
- ::CSV.generate(str || String.new, options, &blk)
117
- rescue ArgumentError => e
118
- raise Sdk::RuntimeError, e.message
119
- end
120
- end
121
- end
122
- end
123
- end
124
- end
125
- end