workato-connector-sdk 1.2.0 → 1.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +8 -0
  3. data/README.md +2 -6
  4. data/VERSION +1 -0
  5. data/lib/workato/cli/edit_command.rb +3 -1
  6. data/lib/workato/cli/exec_command.rb +76 -10
  7. data/lib/workato/cli/generate_command.rb +3 -2
  8. data/lib/workato/cli/main.rb +18 -10
  9. data/lib/workato/cli/oauth2_command.rb +4 -4
  10. data/lib/workato/cli/push_command.rb +23 -7
  11. data/lib/workato/cli/schema_command.rb +20 -6
  12. data/lib/workato/connector/sdk/account_properties.rb +3 -3
  13. data/lib/workato/connector/sdk/action.rb +20 -70
  14. data/lib/workato/connector/sdk/block_invocation_refinements.rb +4 -11
  15. data/lib/workato/connector/sdk/connection.rb +44 -21
  16. data/lib/workato/connector/sdk/connector.rb +73 -76
  17. data/lib/workato/connector/sdk/core.rb +62 -0
  18. data/lib/workato/connector/sdk/dsl/aws.rb +13 -3
  19. data/lib/workato/connector/sdk/dsl/call.rb +1 -1
  20. data/lib/workato/connector/sdk/dsl/csv_package.rb +133 -0
  21. data/lib/workato/connector/sdk/dsl/error.rb +2 -0
  22. data/lib/workato/connector/sdk/dsl/execution_context.rb +3 -0
  23. data/lib/workato/connector/sdk/dsl/http.rb +7 -2
  24. data/lib/workato/connector/sdk/dsl/reinvoke_after.rb +84 -0
  25. data/lib/workato/connector/sdk/dsl/stream_package.rb +59 -0
  26. data/lib/workato/connector/sdk/dsl/time.rb +0 -14
  27. data/lib/workato/connector/sdk/dsl/workato_package.rb +152 -0
  28. data/lib/workato/connector/sdk/dsl.rb +65 -10
  29. data/lib/workato/connector/sdk/errors.rb +28 -11
  30. data/lib/workato/connector/sdk/object_definitions.rb +59 -18
  31. data/lib/workato/connector/sdk/operation.rb +10 -3
  32. data/lib/workato/connector/sdk/request.rb +67 -26
  33. data/lib/workato/connector/sdk/schema/field/convertors.rb +2 -2
  34. data/lib/workato/connector/sdk/schema.rb +10 -7
  35. data/lib/workato/connector/sdk/settings.rb +13 -2
  36. data/lib/workato/connector/sdk/stream.rb +262 -0
  37. data/lib/workato/connector/sdk/streams.rb +72 -0
  38. data/lib/workato/connector/sdk/summarize.rb +4 -2
  39. data/lib/workato/connector/sdk/trigger.rb +14 -7
  40. data/lib/workato/connector/sdk/version.rb +1 -1
  41. data/lib/workato/connector/sdk.rb +20 -46
  42. data/lib/workato/extension/array.rb +2 -0
  43. data/lib/workato/extension/case_sensitive_headers.rb +0 -1
  44. data/lib/workato/extension/content_encoding_decoder.rb +2 -0
  45. data/lib/workato/extension/currency/countries.rb +79 -0
  46. data/lib/workato/extension/currency/countries.yml +18433 -0
  47. data/lib/workato/extension/currency/currencies.rb +55 -0
  48. data/lib/workato/extension/currency/currencies.yml +479 -0
  49. data/lib/workato/extension/currency.rb +73 -5
  50. data/lib/workato/extension/enumerable.rb +2 -2
  51. data/lib/workato/extension/metadata_fix_wrap_kw_args.rb +11 -0
  52. data/lib/workato/extension/string.rb +23 -111
  53. data/lib/workato/testing/vcr_encrypted_cassette_serializer.rb +2 -0
  54. data/lib/workato/testing/vcr_multipart_body_matcher.rb +1 -0
  55. data/lib/workato/types/binary.rb +99 -0
  56. data/lib/workato/types/unicode_string.rb +62 -0
  57. metadata +34 -62
  58. data/lib/workato/connector/sdk/dsl/csv.rb +0 -125
  59. data/lib/workato/connector/sdk/dsl/workato_code_lib.rb +0 -167
  60. data/lib/workato/connector/sdk/schema/type/unicode_string.rb +0 -23
@@ -4,7 +4,13 @@
4
4
  module Workato
5
5
  module Connector
6
6
  module Sdk
7
- InvalidDefinitionError = Class.new(StandardError)
7
+ Error = Class.new(StandardError)
8
+
9
+ DetectOnUnauthorizedRequestError = Class.new(Error)
10
+
11
+ RuntimeError = Class.new(Error)
12
+
13
+ InvalidDefinitionError = Class.new(Error)
8
14
 
9
15
  class UnexpectedMethodDefinitionError < InvalidDefinitionError
10
16
  attr_reader :name
@@ -28,8 +34,6 @@ module Workato
28
34
 
29
35
  InvalidSchemaError = Class.new(InvalidDefinitionError)
30
36
 
31
- CustomRequestError = Class.new(StandardError)
32
-
33
37
  InvalidMultiAuthDefinition = Class.new(InvalidDefinitionError)
34
38
 
35
39
  class UnresolvedMultiAuthOptionError < InvalidMultiAuthDefinition
@@ -41,9 +45,7 @@ module Workato
41
45
  end
42
46
  end
43
47
 
44
- RuntimeError = Class.new(StandardError)
45
-
46
- class UnresolvedObjectDefinitionError < StandardError
48
+ class UnresolvedObjectDefinitionError < InvalidDefinitionError
47
49
  attr_reader :name
48
50
 
49
51
  def initialize(name)
@@ -52,7 +54,7 @@ module Workato
52
54
  end
53
55
  end
54
56
 
55
- class CircleReferenceObjectDefinitionError < StandardError
57
+ class CircleReferenceObjectDefinitionError < InvalidDefinitionError
56
58
  attr_reader :name
57
59
 
58
60
  def initialize(name, backtrace = [])
@@ -62,7 +64,11 @@ module Workato
62
64
  end
63
65
  end
64
66
 
65
- class RequestError < StandardError
67
+ RequestError = Class.new(RuntimeError)
68
+
69
+ RequestTimeoutError = Class.new(RequestError)
70
+
71
+ class RequestFailedError < RequestError
66
72
  attr_reader :method
67
73
  attr_reader :code
68
74
  attr_reader :response
@@ -81,7 +87,7 @@ module Workato
81
87
  end
82
88
  end
83
89
 
84
- class MissingRequiredInput < StandardError
90
+ class MissingRequiredInput < RuntimeError
85
91
  def initialize(label, toggle_label)
86
92
  message = if toggle_label && label != toggle_label
87
93
  "Either '#{label}' or '#{toggle_label}' must be present"
@@ -92,9 +98,9 @@ module Workato
92
98
  end
93
99
  end
94
100
 
95
- RequestTLSCertificateFormatError = Class.new(StandardError)
101
+ RequestTLSCertificateFormatError = Class.new(RequestError)
96
102
 
97
- RequestPayloadFormatError = Class.new(StandardError)
103
+ RequestPayloadFormatError = Class.new(RequestError)
98
104
 
99
105
  JSONRequestFormatError = Class.new(RequestPayloadFormatError)
100
106
 
@@ -109,6 +115,17 @@ module Workato
109
115
  MultipartFormRequestFormatError = Class.new(RequestPayloadFormatError)
110
116
 
111
117
  RAWResponseFormatError = Class.new(RequestPayloadFormatError)
118
+
119
+ class UndefinedStdLibMethodError < RuntimeError
120
+ attr_reader :name
121
+ attr_reader :package
122
+
123
+ def initialize(name, package)
124
+ @name = name
125
+ @package = package
126
+ super("Undefined method '#{name}' for \"#{package}\" namespace")
127
+ end
128
+ end
112
129
  end
113
130
  end
114
131
  end
@@ -1,4 +1,4 @@
1
- # typed: true
1
+ # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require_relative './block_invocation_refinements'
@@ -6,31 +6,45 @@ require_relative './block_invocation_refinements'
6
6
  module Workato
7
7
  module Connector
8
8
  module Sdk
9
+ module SorbetTypes
10
+ ObjectDefinitionOutput = T.type_alias { T::Array[HashWithIndifferentAccess] }
11
+ end
12
+
9
13
  class ObjectDefinitions
14
+ extend T::Sig
15
+
10
16
  using BlockInvocationRefinements
11
17
 
18
+ sig do
19
+ params(
20
+ object_definitions: SorbetTypes::SourceHash,
21
+ connection: Connection,
22
+ methods: SorbetTypes::SourceHash
23
+ ).void
24
+ end
12
25
  def initialize(object_definitions:, connection:, methods:)
13
26
  @object_definitions_source = object_definitions
14
27
  @methods_source = methods
15
28
  @connection = connection
16
- define_object_definition_methods(object_definitions)
29
+ @object_definitions = T.let({}, T::Hash[T.any(String, Symbol), ObjectDefinition])
30
+ define_object_definition_methods
17
31
  end
18
32
 
33
+ sig do
34
+ params(
35
+ settings: T.nilable(SorbetTypes::SettingsHash),
36
+ config_fields: SorbetTypes::OperationInputHash
37
+ ).returns(HashWithIndifferentAccess)
38
+ end
19
39
  def lazy(settings = nil, config_fields = {})
20
40
  DupHashWithIndifferentAccess.new do |object_definitions, name|
21
41
  fields_proc = object_definitions_source.dig(name, :fields)
22
42
  raise Workato::Connector::Sdk::UnresolvedObjectDefinitionError, name unless fields_proc
23
43
 
24
44
  begin
25
- object_definitions[name] = Action.new(
26
- action: {
27
- execute: lambda do |connection, input|
28
- instance_exec(connection, input, object_definitions, &fields_proc)
29
- end
30
- },
31
- methods: methods_source,
32
- connection: connection
33
- ).execute(settings, config_fields)
45
+ object_definitions[name] = create_operation.execute(settings, config_fields) do |connection, input|
46
+ instance_exec(connection, input, object_definitions, &fields_proc)
47
+ end
34
48
  rescue SystemStackError => e
35
49
  raise Workato::Connector::Sdk::CircleReferenceObjectDefinitionError.new(name, e.backtrace)
36
50
  end
@@ -39,40 +53,67 @@ module Workato
39
53
 
40
54
  private
41
55
 
56
+ sig { returns(SorbetTypes::SourceHash) }
42
57
  attr_reader :methods_source
58
+
59
+ sig { returns(Connection) }
43
60
  attr_reader :connection
44
- attr_reader :settings
61
+
62
+ sig { returns(SorbetTypes::SourceHash) }
45
63
  attr_reader :object_definitions_source
46
64
 
47
- def define_object_definition_methods(object_definitions)
48
- object_definitions.each do |(object, _definition)|
65
+ sig { void }
66
+ def define_object_definition_methods
67
+ object_definitions_source.each do |(object, _definition)|
49
68
  define_singleton_method(object) do
50
- @object_definitions ||= {}
51
69
  @object_definitions[object] ||= ObjectDefinition.new(name: object, object_definitions: self)
52
70
  end
53
71
  end
54
72
  end
55
73
 
74
+ sig { returns(Operation) }
75
+ def create_operation
76
+ Operation.new(methods: methods_source, connection: connection)
77
+ end
78
+
56
79
  class ObjectDefinition
80
+ extend T::Sig
81
+
82
+ sig { params(name: T.any(String, Symbol), object_definitions: ObjectDefinitions).void }
57
83
  def initialize(name:, object_definitions:)
58
- @object_definitions = object_definitions
59
84
  @name = name
85
+ @object_definitions = object_definitions
60
86
  end
61
87
 
88
+ sig do
89
+ params(
90
+ settings: T.nilable(SorbetTypes::SettingsHash),
91
+ config_fields: SorbetTypes::OperationInputHash
92
+ ).returns(SorbetTypes::ObjectDefinitionOutput)
93
+ end
62
94
  def fields(settings = nil, config_fields = {})
63
95
  object_definitions_lazy_hash = @object_definitions.lazy(settings, config_fields)
64
96
  object_definitions_lazy_hash[@name]
65
97
  end
66
98
  end
67
99
 
100
+ private_constant :ObjectDefinition
101
+
68
102
  class DupHashWithIndifferentAccess < HashWithIndifferentAccess
103
+ extend T::Sig
104
+ extend T::Generic
105
+
106
+ K = type_member { { fixed: T.any(String, Symbol) } }
107
+ V = type_member { { fixed: T.untyped } }
108
+ Elem = type_member { { fixed: T.untyped } }
109
+
110
+ sig { params(name: K).returns(V) }
69
111
  def [](name)
70
112
  super.deep_dup
71
113
  end
72
114
  end
73
115
 
74
- private_constant 'ObjectDefinition'
75
- private_constant 'DupHashWithIndifferentAccess'
116
+ private_constant :DupHashWithIndifferentAccess
76
117
  end
77
118
  end
78
119
  end
@@ -44,6 +44,7 @@ module Workato
44
44
  extend T::Sig
45
45
 
46
46
  include Dsl::Global
47
+ include Dsl::AWS
47
48
  include Dsl::HTTP
48
49
  include Dsl::Call
49
50
  include Dsl::Error
@@ -51,18 +52,24 @@ module Workato
51
52
 
52
53
  using BlockInvocationRefinements
53
54
 
55
+ sig { override.returns(Streams) }
56
+ attr_reader :streams
57
+
54
58
  sig do
55
59
  params(
56
60
  operation: SorbetTypes::SourceHash,
57
61
  methods: SorbetTypes::SourceHash,
58
62
  connection: Connection,
63
+ streams: Streams,
59
64
  object_definitions: T.nilable(ObjectDefinitions)
60
65
  ).void
61
66
  end
62
- def initialize(operation: {}, methods: {}, connection: Connection.new, object_definitions: nil)
67
+ def initialize(operation: {}, methods: {}, connection: Connection.new, streams: ProhibitedStreams.new,
68
+ object_definitions: nil)
63
69
  @operation = T.let(HashWithIndifferentAccess.wrap(operation), HashWithIndifferentAccess)
64
70
  @_methods = T.let(HashWithIndifferentAccess.wrap(methods), HashWithIndifferentAccess)
65
71
  @connection = T.let(connection, Connection)
72
+ @streams = T.let(streams, Streams)
66
73
  @object_definitions = T.let(object_definitions, T.nilable(ObjectDefinitions))
67
74
  end
68
75
 
@@ -218,7 +225,7 @@ module Workato
218
225
  def resolve_request(request_or_result)
219
226
  case request_or_result
220
227
  when Request
221
- resolve_request(request_or_result.execute!)
228
+ resolve_request(request_or_result.response!)
222
229
  when ::Array
223
230
  request_or_result.each_with_index.inject(request_or_result) do |acc, (item, index)|
224
231
  response_item = resolve_request(item)
@@ -262,7 +269,7 @@ module Workato
262
269
  sig { returns(HashWithIndifferentAccess) }
263
270
  attr_reader :operation
264
271
 
265
- sig { returns(Connection) }
272
+ sig { override.returns(Connection) }
266
273
  attr_reader :connection
267
274
  end
268
275
  end
@@ -7,6 +7,7 @@ require 'json'
7
7
  require 'gyoku'
8
8
  require 'net/http'
9
9
  require 'net/http/digest_auth'
10
+ require 'active_support/json'
10
11
 
11
12
  require 'workato/utilities/encoding'
12
13
  require 'workato/utilities/xml'
@@ -37,18 +38,20 @@ module Workato
37
38
  @callstack_before_request = Array.wrap(Kernel.caller)
38
39
  end
39
40
 
40
- def method_missing(*args, &block)
41
- execute!.send(*args, &block)
41
+ def method_missing(...)
42
+ response!.send(...)
42
43
  end
43
44
 
44
- def execute!
45
+ def response!
45
46
  __getobj__ || __setobj__(response)
47
+ rescue RestClient::Exceptions::Timeout => e
48
+ Kernel.raise RequestTimeoutError, e
46
49
  rescue RestClient::Exception => e
47
50
  if after_error_response_matches?(e)
48
51
  return apply_after_error_response(e)
49
52
  end
50
53
 
51
- Kernel.raise RequestError.new(
54
+ Kernel.raise RequestFailedError.new(
52
55
  response: e.response,
53
56
  message: e.message,
54
57
  method: current_verb,
@@ -250,8 +253,8 @@ module Workato
250
253
  ::Kernel.puts(*args)
251
254
  end
252
255
 
253
- def try(*args, &block)
254
- execute!.try(*args, &block)
256
+ def try(...)
257
+ response!.try(...)
255
258
  end
256
259
 
257
260
  private
@@ -275,9 +278,9 @@ module Workato
275
278
  request = RestClientRequest.new(rest_request_params)
276
279
  response = execute_request(request)
277
280
  end
278
- detect_error!(response.body)
281
+ detect_auth_error!(response.body)
279
282
  parsed_response = @parse_response.call(response)
280
- detect_error!(parsed_response)
283
+ detect_auth_error!(parsed_response)
281
284
  apply_after_response(response.code, parsed_response, response.headers)
282
285
  end
283
286
  end
@@ -322,7 +325,7 @@ module Workato
322
325
 
323
326
  def build_url
324
327
  uri = if @base_uri
325
- URI.parse(@base_uri).merge(@uri)
328
+ merge_uris(@base_uri, @uri)
326
329
  else
327
330
  URI.parse(@uri)
328
331
  end
@@ -347,9 +350,13 @@ module Workato
347
350
  uri.to_s
348
351
  end
349
352
 
353
+ def merge_uris(uri1, uri2)
354
+ (uri1.is_a?(::String) ? URI.parse(uri1) : uri1).merge(uri2)
355
+ end
356
+
350
357
  def build_headers
351
358
  headers = @headers
352
- if @content_type_header.present? && headers.keys.none? { |key| /^content[\-_]type$/i =~ key }
359
+ if @content_type_header.present? && headers.keys.none? { |key| /^content[-_]type$/i =~ key }
353
360
  headers[:content_type] = @content_type_header
354
361
  end
355
362
  if @accept_header && headers.keys.none? { |key| /^accept$/i =~ key }
@@ -358,13 +365,13 @@ module Workato
358
365
  headers.compact
359
366
  end
360
367
 
361
- def detect_error!(response)
368
+ def detect_auth_error!(response)
362
369
  return unless authorized?
363
370
 
364
371
  error_patterns = connection.authorization.detect_on
365
372
  return unless error_patterns.any? { |pattern| pattern === response rescue false }
366
373
 
367
- Kernel.raise(CustomRequestError, response.to_s)
374
+ Kernel.raise(DetectOnUnauthorizedRequestError, response.to_s)
368
375
  end
369
376
 
370
377
  def after_error_response_matches?(exception)
@@ -399,8 +406,8 @@ module Workato
399
406
  within_action_context(code, parsed_response, encoded_headers, &@after_response)
400
407
  end
401
408
 
402
- def within_action_context(*args, &block)
403
- (@action || self).instance_exec(*args, &block)
409
+ def within_action_context(...)
410
+ (@action || self).instance_exec(...)
404
411
  end
405
412
 
406
413
  sig { returns(T::Boolean) }
@@ -418,14 +425,14 @@ module Workato
418
425
  begin
419
426
  settings = connection.settings
420
427
  if connection.authorization.oauth2?
421
- instance_exec(settings, settings[:access_token], @auth_type, &apply)
428
+ apply_oauth2(settings, settings[:access_token], @auth_type, &apply)
422
429
  else
423
- instance_exec(settings, @auth_type, &apply)
430
+ apply_custom_auth(settings, @auth_type, &apply)
424
431
  end
425
432
  yield
426
- rescue RestClient::Exception, CustomRequestError => e
433
+ rescue RestClient::Exception, DetectOnUnauthorizedRequestError => e
427
434
  Kernel.raise e unless first
428
- Kernel.raise e unless refresh_authorization!(e.try(:http_code), e.try(:http_body), e.message)
435
+ Kernel.raise e unless refresh_authorization!(settings, e.try(:http_code), e.try(:http_body), e.message)
429
436
 
430
437
  first = false
431
438
  retry
@@ -434,16 +441,49 @@ module Workato
434
441
 
435
442
  sig do
436
443
  params(
444
+ settings: HashWithIndifferentAccess,
445
+ access_token: T.untyped,
446
+ auth_type: T.untyped,
447
+ apply_proc: T.proc.params(
448
+ settings: HashWithIndifferentAccess,
449
+ access_token: T.untyped,
450
+ auth_type: T.untyped
451
+ ).void
452
+ ).void
453
+ end
454
+ def apply_oauth2(settings, access_token, auth_type, &apply_proc)
455
+ instance_exec(settings, access_token, auth_type, &apply_proc)
456
+ end
457
+
458
+ sig do
459
+ params(
460
+ settings: HashWithIndifferentAccess,
461
+ auth_type: T.untyped,
462
+ apply_proc: T.proc.params(
463
+ settings: HashWithIndifferentAccess,
464
+ auth_type: T.untyped
465
+ ).void
466
+ ).void
467
+ end
468
+ def apply_custom_auth(settings, auth_type, &apply_proc)
469
+ instance_exec(settings, auth_type, &apply_proc)
470
+ end
471
+
472
+ sig do
473
+ params(
474
+ settings_before: HashWithIndifferentAccess,
437
475
  http_code: T.nilable(Integer),
438
476
  http_body: T.nilable(String),
439
477
  exception: T.nilable(String)
440
478
  ).returns(T::Boolean)
441
479
  end
442
- def refresh_authorization!(http_code, http_body, exception)
480
+ def refresh_authorization!(settings_before, http_code, http_body, exception)
443
481
  return false unless connection.authorization.refresh?(http_code, http_body, exception)
444
482
 
445
- connection.update_settings!("Refresh token triggered on response \"#{exception}\"") do
446
- connection.authorization.refresh!(connection.settings)
483
+ connection.update_settings!("Refresh token triggered on response \"#{exception}\"", settings_before) do
484
+ next connection.settings unless connection.settings == settings_before
485
+
486
+ connection.authorization.refresh!(settings_before)
447
487
  end
448
488
  end
449
489
 
@@ -454,11 +494,9 @@ module Workato
454
494
 
455
495
  def lambda_with_error_wrap(error_type, &block)
456
496
  Kernel.lambda do |payload|
457
- begin
458
- block.call(payload)
459
- rescue StandardError => e
460
- Kernel.raise error_type.new(e)
461
- end
497
+ block.call(payload)
498
+ rescue StandardError => e
499
+ Kernel.raise error_type.new(e)
462
500
  end
463
501
  end
464
502
 
@@ -475,6 +513,8 @@ module Workato
475
513
  attr_reader :original_filename
476
514
  end
477
515
 
516
+ private_constant :Part
517
+
478
518
  class RestClientRequest < ::RestClient::Request
479
519
  def initialize(args)
480
520
  super
@@ -502,6 +542,7 @@ module Workato
502
542
  net
503
543
  end
504
544
  end
545
+
505
546
  private_constant :RestClientRequest
506
547
  end
507
548
  end
@@ -26,7 +26,7 @@ module Workato
26
26
  end
27
27
 
28
28
  def integer_conversion(value)
29
- value.try(:is_number?) && value.to_i || value
29
+ (value.try(:is_number?) && value.to_i) || value
30
30
  end
31
31
 
32
32
  def boolean_conversion(value)
@@ -34,7 +34,7 @@ module Workato
34
34
  end
35
35
 
36
36
  def float_conversion(value)
37
- value.try(:is_number?) && value.to_f || value
37
+ (value.try(:is_number?) && value.to_f) || value
38
38
  end
39
39
 
40
40
  def item_array_wrap(items)
@@ -101,17 +101,17 @@ module Workato
101
101
  return Type::Time.from_date_time(value)
102
102
  when ::Date
103
103
  return value.to_date
104
- when ::Numeric, ::TrueClass, ::FalseClass, Workato::Extension::Binary, Type::UnicodeString,
105
- ::Array, ::Hash
104
+ when ::Numeric, ::TrueClass, ::FalseClass, Workato::Types::Binary, Workato::Types::UnicodeString,
105
+ ::Array, ::Hash, Stream::Proxy
106
106
  return value
107
107
  when Extension::Array::ArrayWhere
108
108
  return value.to_a
109
109
  when ::String
110
110
  if value.encoding == Encoding::ASCII_8BIT
111
- return Workato::Extension::Binary.new(value)
111
+ return Workato::Types::Binary.new(value)
112
112
  end
113
113
 
114
- return Type::UnicodeString.new(value)
114
+ return Workato::Types::UnicodeString.new(value)
115
115
  else
116
116
  if value.respond_to?(:to_time)
117
117
  return Type::Time.from_time(value.to_time)
@@ -119,7 +119,7 @@ module Workato
119
119
 
120
120
  if value.respond_to?(:read) && value.respond_to?(:rewind)
121
121
  value.rewind
122
- return Workato::Extension::Binary.new(value.read.force_encoding(Encoding::ASCII_8BIT))
122
+ return Workato::Types::Binary.new(value.read.force_encoding(Encoding::ASCII_8BIT))
123
123
  end
124
124
  end
125
125
 
@@ -127,6 +127,8 @@ module Workato
127
127
  end
128
128
  end
129
129
 
130
+ private_constant :Schema
131
+
130
132
  class Fields < ::Array
131
133
  def initialize(fields)
132
134
  ::Array.wrap(fields).each do |field|
@@ -178,7 +180,9 @@ module Workato
178
180
 
179
181
  def clean_values(field)
180
182
  field.transform_values! do |value|
181
- value.presence && (value.is_a?(::Symbol) && value.to_s || value)
183
+ next value if value.is_a?(FalseClass)
184
+
185
+ value.presence && ((value.is_a?(::Symbol) && value.to_s) || value)
182
186
  end
183
187
  field.compact!
184
188
  field
@@ -230,4 +234,3 @@ require_relative './schema/field/object'
230
234
  require_relative './schema/field/string'
231
235
 
232
236
  require_relative './schema/type/time'
233
- require_relative './schema/type/unicode_string'
@@ -82,7 +82,7 @@ module Workato
82
82
 
83
83
  def read_plain_file
84
84
  all_settings = File.open(path) do |f|
85
- YAML.safe_load(f.read, [::Symbol]).to_hash.with_indifferent_access
85
+ YAML.safe_load(f.read, permitted_classes: [::Symbol]).to_hash.with_indifferent_access
86
86
  end
87
87
 
88
88
  (name ? all_settings.fetch(name) : all_settings) || {}
@@ -123,7 +123,7 @@ module Workato
123
123
  end
124
124
 
125
125
  def encrypted_configuration
126
- @encrypted_configuration ||= ActiveSupport::EncryptedConfiguration.new(
126
+ @encrypted_configuration ||= FixedEncryptedConfiguration.new(
127
127
  config_path: path,
128
128
  key_path: key_path || DEFAULT_MASTER_KEY_PATH,
129
129
  env_key: DEFAULT_MASTER_KEY_ENV,
@@ -135,6 +135,17 @@ module Workato
135
135
  YAML.dump(settings.to_hash)
136
136
  end
137
137
  end
138
+
139
+ class FixedEncryptedConfiguration < ActiveSupport::EncryptedConfiguration
140
+ private
141
+
142
+ def handle_missing_key
143
+ # Original methods incorectly passes constructor params
144
+ raise MissingKeyError.new(key_path: key_path, env_key: env_key) if raise_if_missing_key
145
+ end
146
+ end
147
+
148
+ private_constant :FixedEncryptedConfiguration
138
149
  end
139
150
  end
140
151
  end