workato-connector-sdk 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
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