workato-connector-sdk 1.3.0 → 1.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.yardopts +8 -0
- data/README.md +0 -4
- data/VERSION +1 -1
- data/lib/workato/cli/generate_command.rb +1 -0
- data/lib/workato/cli/main.rb +1 -0
- data/lib/workato/cli/push_command.rb +21 -5
- data/lib/workato/cli/schema_command.rb +18 -4
- data/lib/workato/connector/sdk/account_properties.rb +1 -1
- data/lib/workato/connector/sdk/block_invocation_refinements.rb +2 -1
- data/lib/workato/connector/sdk/connection.rb +8 -2
- data/lib/workato/connector/sdk/connector.rb +9 -0
- data/lib/workato/connector/sdk/dsl/aws.rb +10 -0
- data/lib/workato/connector/sdk/dsl/error.rb +2 -0
- data/lib/workato/connector/sdk/dsl/execution_context.rb +2 -0
- data/lib/workato/connector/sdk/dsl/http.rb +6 -1
- data/lib/workato/connector/sdk/dsl/stream_package.rb +1 -7
- data/lib/workato/connector/sdk/dsl/workato_package.rb +10 -4
- data/lib/workato/connector/sdk/dsl.rb +2 -0
- data/lib/workato/connector/sdk/object_definitions.rb +59 -18
- data/lib/workato/connector/sdk/operation.rb +1 -1
- data/lib/workato/connector/sdk/request.rb +6 -3
- data/lib/workato/connector/sdk/schema.rb +4 -3
- data/lib/workato/connector/sdk/settings.rb +3 -1
- data/lib/workato/connector/sdk/stream.rb +21 -2
- data/lib/workato/connector/sdk/streams.rb +1 -0
- data/lib/workato/connector/sdk/summarize.rb +2 -0
- data/lib/workato/connector/sdk.rb +1 -0
- data/lib/workato/extension/string.rb +9 -0
- data/lib/workato/testing/vcr_multipart_body_matcher.rb +1 -0
- data/lib/workato/types/binary.rb +44 -0
- data/lib/workato/types/unicode_string.rb +62 -0
- metadata +4 -17
- data/lib/workato/connector/sdk/schema/type/unicode_string.rb +0 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2a456929ee155b6a048f547defcb4f3ccfcdd2172c1e0539ca601d8268bc0060
|
4
|
+
data.tar.gz: 588a1bae54828aa7fb750aaa53ca57336c14693478ac096b810b441008186fde
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5ab021777798644396d5d910c6d3c6f6ebf7ef23956ca7c3b5e79ec2d01d9f59776ea7afa4cbf8c9d501d18c4fc8142e1d4794e15bb3ade22692a3a95c94e4f4
|
7
|
+
data.tar.gz: e101977c93f1d878cd27c7170e143fbaf7f1221b52d80c489c5ca37915783662bd8571041bae0d4ad75094851ad74f00e6434c331da902d580e9e13098eb21a5
|
data/.yardopts
ADDED
data/README.md
CHANGED
@@ -339,7 +339,6 @@ Options:
|
|
339
339
|
[--col-sep=COL_SEP] # Use separator for CSV converter
|
340
340
|
# Default: comma
|
341
341
|
# Possible values: comma, space, tab, colon, semicolon, pipe
|
342
|
-
[--api-email=API_EMAIL] # Email for accessing Workato API or set WORKATO_API_EMAIL environment variable
|
343
342
|
[--api-token=API_TOKEN] # Token for accessing Workato API or set WORKATO_API_TOKEN environment variable
|
344
343
|
```
|
345
344
|
|
@@ -425,8 +424,6 @@ Options:
|
|
425
424
|
-l, [--logo=LOGO] # Path to connector logo: png or jpeg file
|
426
425
|
-n, [--notes=NOTES] # Release notes
|
427
426
|
-c, [--connector=CONNECTOR] # Path to connector source code
|
428
|
-
[--api-email=API_EMAIL] # Email for accessing Workato API.
|
429
|
-
# If present overrides value from WORKATO_API_EMAIL environment variable.
|
430
427
|
[--api-token=API_TOKEN] # Token for accessing Workato API.
|
431
428
|
# If present overrides value from WORKATO_API_TOKEN environment variable.
|
432
429
|
[--environment=ENVIRONMENT] # Data center specific URL to push connector code.
|
@@ -1139,7 +1136,6 @@ jobs:
|
|
1139
1136
|
run: bundle exec rspec
|
1140
1137
|
# - name: Push to DEV workspace # Use this to push to DEV. This can be enabled when a PR is merged.
|
1141
1138
|
# env:
|
1142
|
-
# WORKATO_API_EMAIL: ${{ secrets.WORKATO_DEV_ENVIRONMENT_API_EMAIL}}
|
1143
1139
|
# WORKATO_API_TOKEN: ${{ secrets.WORKATO_DEV_ENVIRONMENT_API_TOKEN}}
|
1144
1140
|
# run: workato push
|
1145
1141
|
```
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.3.
|
1
|
+
1.3.1
|
@@ -50,6 +50,7 @@ module Workato
|
|
50
50
|
enum: SchemaCommand::CSV_SEPARATORS,
|
51
51
|
default: 'comma'
|
52
52
|
method_option :api_email,
|
53
|
+
hide: true,
|
53
54
|
type: :string,
|
54
55
|
desc: 'Email for accessing Workato API or ' \
|
55
56
|
"set #{Workato::Connector::Sdk::WORKATO_API_EMAIL_ENV} environment variable"
|
data/lib/workato/cli/main.rb
CHANGED
@@ -128,6 +128,7 @@ module Workato
|
|
128
128
|
desc: 'Path to connector source code',
|
129
129
|
lazy_default: Workato::Connector::Sdk::DEFAULT_CONNECTOR_PATH
|
130
130
|
method_option :api_email,
|
131
|
+
hide: true,
|
131
132
|
type: :string,
|
132
133
|
desc: "Email for accessing Workato API.\n" \
|
133
134
|
"If present overrides value from #{Workato::Connector::Sdk::WORKATO_API_EMAIL_ENV} " \
|
@@ -5,6 +5,7 @@ require 'uri'
|
|
5
5
|
require 'ruby-progressbar'
|
6
6
|
require 'zip'
|
7
7
|
require 'fileutils'
|
8
|
+
require 'thor'
|
8
9
|
|
9
10
|
module Workato
|
10
11
|
module CLI
|
@@ -108,7 +109,7 @@ module Workato
|
|
108
109
|
url = "#{api_base_url}#{API_IMPORT_PATH}/#{folder_id}"
|
109
110
|
response = RestClient.post(
|
110
111
|
url,
|
111
|
-
File.open(zip_file_path),
|
112
|
+
File.open(zip_file_path, 'rb'),
|
112
113
|
auth_headers.merge(
|
113
114
|
'Content-Type' => 'application/zip'
|
114
115
|
)
|
@@ -185,10 +186,25 @@ module Workato
|
|
185
186
|
end
|
186
187
|
|
187
188
|
def auth_headers
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
189
|
+
@auth_headers ||=
|
190
|
+
if api_email.present?
|
191
|
+
warn <<~WARNING
|
192
|
+
You are using old authorization schema with --api-email and --api-token which is less secure and deprecated.
|
193
|
+
We strongly recommend migrating over to API Clients for authentication to Workato APIs.
|
194
|
+
|
195
|
+
Learn more: https://docs.workato.com/developing-connectors/sdk/cli/reference/cli-commands.html#workato-push
|
196
|
+
|
197
|
+
If you use API Client token but still see this message, ensure you do not pass --api-email param nor have #{Workato::Connector::Sdk::WORKATO_API_EMAIL_ENV} environment variable set.
|
198
|
+
WARNING
|
199
|
+
{
|
200
|
+
'x-user-email' => api_email,
|
201
|
+
'x-user-token' => api_token
|
202
|
+
}
|
203
|
+
else
|
204
|
+
{
|
205
|
+
'Authorization' => "Bearer #{api_token}"
|
206
|
+
}
|
207
|
+
end
|
192
208
|
end
|
193
209
|
|
194
210
|
def folder_id
|
@@ -68,10 +68,24 @@ module Workato
|
|
68
68
|
end
|
69
69
|
|
70
70
|
def auth_headers
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
71
|
+
if api_email.present?
|
72
|
+
warn <<~WARNING
|
73
|
+
You are using old authorization schema with --api-email and --api-token which is less secure and deprecated.
|
74
|
+
We strongly recommend migrating over to API Clients for authentication to Workato APIs.
|
75
|
+
|
76
|
+
Learn more: https://docs.workato.com/developing-connectors/sdk/cli/reference/cli-commands.html#workato-generate-schema
|
77
|
+
|
78
|
+
If you use API Client token but still see this message, ensure you do not pass --api-email param nor have #{Workato::Connector::Sdk::WORKATO_API_EMAIL_ENV} environment variable set.
|
79
|
+
WARNING
|
80
|
+
{
|
81
|
+
'x-user-email' => api_email,
|
82
|
+
'x-user-token' => api_token
|
83
|
+
}
|
84
|
+
else
|
85
|
+
{
|
86
|
+
'Authorization' => "Bearer #{api_token}"
|
87
|
+
}
|
88
|
+
end
|
75
89
|
end
|
76
90
|
|
77
91
|
private_constant :API_GENERATE_SCHEMA_PATH
|
@@ -13,7 +13,7 @@ module Workato
|
|
13
13
|
|
14
14
|
def self.from_yaml(path = DEFAULT_ACCOUNT_PROPERTIES_PATH)
|
15
15
|
File.open(path) do |f|
|
16
|
-
instance.load_data(YAML.safe_load(ERB.new(f.read).result, [::Symbol]).to_hash)
|
16
|
+
instance.load_data(YAML.safe_load(ERB.new(f.read).result, permitted_classes: [::Symbol]).to_hash)
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
@@ -36,6 +36,7 @@ module Workato
|
|
36
36
|
|
37
37
|
using BlockInvocationRefinements
|
38
38
|
|
39
|
+
# @api private
|
39
40
|
sig { returns(HashWithIndifferentAccess) }
|
40
41
|
attr_reader :source
|
41
42
|
|
@@ -56,11 +57,13 @@ module Workato
|
|
56
57
|
@settings = T.let(settings, SorbetTypes::SettingsHash)
|
57
58
|
end
|
58
59
|
|
60
|
+
# @api private
|
59
61
|
sig { returns(SorbetTypes::SettingsHash) }
|
60
62
|
def settings!
|
61
63
|
@settings
|
62
64
|
end
|
63
65
|
|
66
|
+
# @api private
|
64
67
|
sig { returns(HashWithIndifferentAccess) }
|
65
68
|
def settings
|
66
69
|
# we can't freeze or memoise because some developers modify it for storing something temporary in it.
|
@@ -70,11 +73,13 @@ module Workato
|
|
70
73
|
end
|
71
74
|
end
|
72
75
|
|
76
|
+
# @api private
|
73
77
|
sig { params(settings: SorbetTypes::SettingsHash).returns(SorbetTypes::SettingsHash) }
|
74
78
|
def merge_settings!(settings)
|
75
79
|
@settings.merge!(settings)
|
76
80
|
end
|
77
81
|
|
82
|
+
# @api private
|
78
83
|
sig { returns(T::Boolean) }
|
79
84
|
def authorization?
|
80
85
|
source[:authorization].present?
|
@@ -100,6 +105,7 @@ module Workato
|
|
100
105
|
global_dsl_context.execute(self.settings, &source['base_uri'])
|
101
106
|
end
|
102
107
|
|
108
|
+
# @api private
|
103
109
|
sig do
|
104
110
|
params(
|
105
111
|
message: String,
|
@@ -267,6 +273,7 @@ module Workato
|
|
267
273
|
end
|
268
274
|
end
|
269
275
|
|
276
|
+
# @api private
|
270
277
|
sig { params(settings: HashWithIndifferentAccess).returns(T.nilable(HashWithIndifferentAccess)) }
|
271
278
|
def refresh!(settings)
|
272
279
|
if oauth2?
|
@@ -300,6 +307,7 @@ module Workato
|
|
300
307
|
end
|
301
308
|
end
|
302
309
|
|
310
|
+
# @api private
|
303
311
|
sig { returns(HashWithIndifferentAccess) }
|
304
312
|
def source
|
305
313
|
return @source unless multi?
|
@@ -381,8 +389,6 @@ module Workato
|
|
381
389
|
Dsl::WithDsl.new(@connection)
|
382
390
|
end
|
383
391
|
end
|
384
|
-
|
385
|
-
private_constant :Authorization
|
386
392
|
end
|
387
393
|
end
|
388
394
|
end
|
@@ -13,6 +13,7 @@ module Workato
|
|
13
13
|
class Connector
|
14
14
|
extend T::Sig
|
15
15
|
|
16
|
+
# @api private
|
16
17
|
sig { returns(HashWithIndifferentAccess) }
|
17
18
|
attr_reader :source
|
18
19
|
|
@@ -208,6 +209,8 @@ module Workato
|
|
208
209
|
end
|
209
210
|
end
|
210
211
|
|
212
|
+
private_constant :ActionsProxy
|
213
|
+
|
211
214
|
class MethodsProxy
|
212
215
|
extend T::Sig
|
213
216
|
|
@@ -255,6 +258,8 @@ module Workato
|
|
255
258
|
end
|
256
259
|
end
|
257
260
|
|
261
|
+
private_constant :MethodsProxy
|
262
|
+
|
258
263
|
class PickListsProxy
|
259
264
|
extend T::Sig
|
260
265
|
|
@@ -306,6 +311,8 @@ module Workato
|
|
306
311
|
end
|
307
312
|
end
|
308
313
|
|
314
|
+
private_constant :PickListsProxy
|
315
|
+
|
309
316
|
class TriggersProxy
|
310
317
|
extend T::Sig
|
311
318
|
|
@@ -365,6 +372,8 @@ module Workato
|
|
365
372
|
end
|
366
373
|
end
|
367
374
|
end
|
375
|
+
|
376
|
+
private_constant :TriggersProxy
|
368
377
|
end
|
369
378
|
end
|
370
379
|
end
|
@@ -12,15 +12,25 @@ module Workato
|
|
12
12
|
module Dsl
|
13
13
|
module AWS
|
14
14
|
TEMP_CREDENTIALS_REFRESH_TIMEOUT = 60 # seconds
|
15
|
+
private_constant :TEMP_CREDENTIALS_REFRESH_TIMEOUT
|
15
16
|
|
16
17
|
DUMMY_AWS_IAM_EXTERNAL_ID = 'dummy-aws-iam-external-id'
|
18
|
+
private_constant :DUMMY_AWS_IAM_EXTERNAL_ID
|
19
|
+
|
17
20
|
DUMMY_AWS_WORKATO_ACCOUNT_ID = 'dummy-aws-workato-account-id'
|
21
|
+
private_constant :DUMMY_AWS_WORKATO_ACCOUNT_ID
|
18
22
|
|
19
23
|
AMAZON_ROLE_CLIENT_ID = ENV.fetch('AMAZON_ROLE_CLIENT_ID', nil)
|
24
|
+
private_constant :AMAZON_ROLE_CLIENT_ID
|
25
|
+
|
20
26
|
AMAZON_ROLE_CLIENT_KEY = ENV.fetch('AMAZON_ROLE_CLIENT_KEY', nil)
|
27
|
+
private_constant :AMAZON_ROLE_CLIENT_KEY
|
28
|
+
|
21
29
|
AMAZON_ROLE_CLIENT_SECRET = ENV.fetch('AMAZON_ROLE_CLIENT_SECRET', nil)
|
30
|
+
private_constant :AMAZON_ROLE_CLIENT_SECRET
|
22
31
|
|
23
32
|
WWW_FORM_CONTENT_TYPE = 'application/x-www-form-urlencoded; charset=utf-8'
|
33
|
+
private_constant :WWW_FORM_CONTENT_TYPE
|
24
34
|
|
25
35
|
def aws
|
26
36
|
@aws ||= Private.new(connection: connection)
|
@@ -8,8 +8,13 @@ module Workato
|
|
8
8
|
# https://docs.workato.com/developing-connectors/sdk/sdk-reference/http.html#http-methods
|
9
9
|
module HTTP
|
10
10
|
PARALLEL_SUCCESS_INDEX = 0
|
11
|
+
private_constant :PARALLEL_SUCCESS_INDEX
|
12
|
+
|
11
13
|
PARALLEL_RESULTS_INDEX = 1
|
14
|
+
private_constant :PARALLEL_RESULTS_INDEX
|
15
|
+
|
12
16
|
PARALLEL_ERRORS_INDEX = 2
|
17
|
+
private_constant :PARALLEL_ERRORS_INDEX
|
13
18
|
|
14
19
|
def get(url, params = {})
|
15
20
|
http_request(url, method: 'GET').params(params).response_format_json
|
@@ -52,7 +57,7 @@ module Workato
|
|
52
57
|
response = nil
|
53
58
|
exception = nil
|
54
59
|
begin
|
55
|
-
response = request.
|
60
|
+
response = request.response!
|
56
61
|
rescue StandardError => e
|
57
62
|
exception = e.to_s
|
58
63
|
end
|
@@ -27,13 +27,7 @@ module Workato
|
|
27
27
|
stream = out(stream[:name], stream[:input] || {})
|
28
28
|
end
|
29
29
|
|
30
|
-
Stream
|
31
|
-
stream: stream,
|
32
|
-
from: from,
|
33
|
-
frame_size: frame_size
|
34
|
-
).each_chunk do |chunk, byte_from, byte_to, eof, next_from|
|
35
|
-
blk.call(chunk, byte_from, byte_to, eof, next_from)
|
36
|
-
end
|
30
|
+
Stream.each_chunk(stream: stream, from: from, frame_size: frame_size, &blk)
|
37
31
|
end
|
38
32
|
|
39
33
|
sig { params(stream_name: String, input: SorbetTypes::StreamInputHash).returns(Stream::Proxy) }
|
@@ -13,9 +13,19 @@ module Workato
|
|
13
13
|
module Dsl
|
14
14
|
class WorkatoPackage
|
15
15
|
JWT_ALGORITHMS = %w[RS256 RS384 RS512].freeze
|
16
|
+
private_constant :JWT_ALGORITHMS
|
17
|
+
|
16
18
|
JWT_RSA_KEY_MIN_LENGTH = 2048
|
19
|
+
private_constant :JWT_RSA_KEY_MIN_LENGTH
|
17
20
|
|
18
21
|
VERIFY_RCA_ALGORITHMS = %w[SHA SHA1 SHA224 SHA256 SHA384 SHA512].freeze
|
22
|
+
private_constant :VERIFY_RCA_ALGORITHMS
|
23
|
+
|
24
|
+
RANDOM_SIZE = 32
|
25
|
+
private_constant :RANDOM_SIZE
|
26
|
+
|
27
|
+
ALLOWED_KEY_SIZES = [128, 192, 256].freeze
|
28
|
+
private_constant :ALLOWED_KEY_SIZES
|
19
29
|
|
20
30
|
def initialize(streams:, connection:)
|
21
31
|
@streams = streams
|
@@ -76,8 +86,6 @@ module Workato
|
|
76
86
|
SecureRandom.uuid
|
77
87
|
end
|
78
88
|
|
79
|
-
RANDOM_SIZE = 32
|
80
|
-
|
81
89
|
def random_bytes(len)
|
82
90
|
unless (len.is_a? ::Integer) && (len <= RANDOM_SIZE)
|
83
91
|
raise "The requested length or random bytes sequence should be <= #{RANDOM_SIZE}"
|
@@ -86,8 +94,6 @@ module Workato
|
|
86
94
|
Types::Binary.new(::OpenSSL::Random.random_bytes(len))
|
87
95
|
end
|
88
96
|
|
89
|
-
ALLOWED_KEY_SIZES = [128, 192, 256].freeze
|
90
|
-
|
91
97
|
def aes_cbc_encrypt(string, key, init_vector = nil)
|
92
98
|
key_size = key.bytesize * 8
|
93
99
|
unless ALLOWED_KEY_SIZES.include?(key_size)
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# typed:
|
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
|
-
|
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] =
|
26
|
-
|
27
|
-
|
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
|
-
|
61
|
+
|
62
|
+
sig { returns(SorbetTypes::SourceHash) }
|
45
63
|
attr_reader :object_definitions_source
|
46
64
|
|
47
|
-
|
48
|
-
|
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
|
75
|
-
private_constant 'DupHashWithIndifferentAccess'
|
116
|
+
private_constant :DupHashWithIndifferentAccess
|
76
117
|
end
|
77
118
|
end
|
78
119
|
end
|
@@ -225,7 +225,7 @@ module Workato
|
|
225
225
|
def resolve_request(request_or_result)
|
226
226
|
case request_or_result
|
227
227
|
when Request
|
228
|
-
resolve_request(request_or_result.
|
228
|
+
resolve_request(request_or_result.response!)
|
229
229
|
when ::Array
|
230
230
|
request_or_result.each_with_index.inject(request_or_result) do |acc, (item, index)|
|
231
231
|
response_item = resolve_request(item)
|
@@ -39,10 +39,10 @@ module Workato
|
|
39
39
|
end
|
40
40
|
|
41
41
|
def method_missing(...)
|
42
|
-
|
42
|
+
response!.send(...)
|
43
43
|
end
|
44
44
|
|
45
|
-
def
|
45
|
+
def response!
|
46
46
|
__getobj__ || __setobj__(response)
|
47
47
|
rescue RestClient::Exceptions::Timeout => e
|
48
48
|
Kernel.raise RequestTimeoutError, e
|
@@ -254,7 +254,7 @@ module Workato
|
|
254
254
|
end
|
255
255
|
|
256
256
|
def try(...)
|
257
|
-
|
257
|
+
response!.try(...)
|
258
258
|
end
|
259
259
|
|
260
260
|
private
|
@@ -513,6 +513,8 @@ module Workato
|
|
513
513
|
attr_reader :original_filename
|
514
514
|
end
|
515
515
|
|
516
|
+
private_constant :Part
|
517
|
+
|
516
518
|
class RestClientRequest < ::RestClient::Request
|
517
519
|
def initialize(args)
|
518
520
|
super
|
@@ -540,6 +542,7 @@ module Workato
|
|
540
542
|
net
|
541
543
|
end
|
542
544
|
end
|
545
|
+
|
543
546
|
private_constant :RestClientRequest
|
544
547
|
end
|
545
548
|
end
|
@@ -101,7 +101,7 @@ 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::Types::Binary,
|
104
|
+
when ::Numeric, ::TrueClass, ::FalseClass, Workato::Types::Binary, Workato::Types::UnicodeString,
|
105
105
|
::Array, ::Hash, Stream::Proxy
|
106
106
|
return value
|
107
107
|
when Extension::Array::ArrayWhere
|
@@ -111,7 +111,7 @@ module Workato
|
|
111
111
|
return Workato::Types::Binary.new(value)
|
112
112
|
end
|
113
113
|
|
114
|
-
return
|
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)
|
@@ -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|
|
@@ -232,4 +234,3 @@ require_relative './schema/field/object'
|
|
232
234
|
require_relative './schema/field/string'
|
233
235
|
|
234
236
|
require_relative './schema/type/time'
|
235
|
-
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) || {}
|
@@ -144,6 +144,8 @@ module Workato
|
|
144
144
|
raise MissingKeyError.new(key_path: key_path, env_key: env_key) if raise_if_missing_key
|
145
145
|
end
|
146
146
|
end
|
147
|
+
|
148
|
+
private_constant :FixedEncryptedConfiguration
|
147
149
|
end
|
148
150
|
end
|
149
151
|
end
|
@@ -79,6 +79,22 @@ module Workato
|
|
79
79
|
data
|
80
80
|
end
|
81
81
|
|
82
|
+
class << self
|
83
|
+
extend T::Sig
|
84
|
+
|
85
|
+
sig do
|
86
|
+
params(
|
87
|
+
stream: T.any(Proxy, T::Hash[T.untyped, T.untyped], String),
|
88
|
+
from: T.nilable(Integer),
|
89
|
+
frame_size: T.nilable(Integer),
|
90
|
+
blk: SorbetTypes::StreamInProc
|
91
|
+
).void
|
92
|
+
end
|
93
|
+
def each_chunk(stream:, from:, frame_size: nil, &blk)
|
94
|
+
Reader.new(stream: stream, from: from, frame_size: frame_size).each_chunk(&blk)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
82
98
|
class Reader
|
83
99
|
extend T::Sig
|
84
100
|
|
@@ -153,6 +169,9 @@ module Workato
|
|
153
169
|
end
|
154
170
|
end
|
155
171
|
|
172
|
+
private_constant :Reader
|
173
|
+
|
174
|
+
# @api private
|
156
175
|
class Proxy
|
157
176
|
extend T::Sig
|
158
177
|
|
@@ -212,9 +231,9 @@ module Workato
|
|
212
231
|
class Mock
|
213
232
|
extend T::Sig
|
214
233
|
|
215
|
-
sig { params(chunks: T.untyped).void }
|
234
|
+
sig { params(chunks: T::Hash[T.any(Integer, String), T.untyped]).void }
|
216
235
|
def initialize(chunks:)
|
217
|
-
@chunks = chunks
|
236
|
+
@chunks = T.let(chunks.transform_keys(&:to_i), T::Hash[Integer, T.untyped])
|
218
237
|
end
|
219
238
|
|
220
239
|
sig { params(from: Integer, frame_size: Integer, _blk: Reader::ProxyReadProc).void }
|
@@ -16,6 +16,15 @@ module Workato
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
+
def binary?
|
20
|
+
warn <<~WARNING
|
21
|
+
WARNING: Ambiguous use of `String#binary?' method.
|
22
|
+
For correct behavior of `binary?` method use explicit Workato::Types::UnicodeString for input strings and Workato::Types::Binary for input binaries
|
23
|
+
See: https://www.rubydoc.info/gems/workato-connector-sdk/Workato/Types
|
24
|
+
WARNING
|
25
|
+
encoding == Encoding::ASCII_8BIT
|
26
|
+
end
|
27
|
+
|
19
28
|
def is_int? # rubocop:disable Naming/PredicateName
|
20
29
|
present? && (self !~ /\D/)
|
21
30
|
end
|
data/lib/workato/types/binary.rb
CHANGED
@@ -2,6 +2,47 @@
|
|
2
2
|
|
3
3
|
module Workato
|
4
4
|
module Types
|
5
|
+
# Explicit wrapper for binary data
|
6
|
+
#
|
7
|
+
# Workato runtime always converts a String to {Workato::Types::UnicodeString} and
|
8
|
+
# binary data to {Workato::Types::Binary} before execute an action.
|
9
|
+
#
|
10
|
+
# == Call action or trigger by name
|
11
|
+
#
|
12
|
+
# SDK emulator applies trigger's or action's input/output schema and normalize string when invoke them by name.
|
13
|
+
# If you call an operation like this, then emulator passes input with
|
14
|
+
# {Workato::Types::UnicodeString} or {Workato::Types::Binary} to the operation
|
15
|
+
#
|
16
|
+
# CLI
|
17
|
+
# workato exec 'actions.test_action'
|
18
|
+
# workato exec 'triggers.test_poll_trigger'
|
19
|
+
#
|
20
|
+
# RSpec
|
21
|
+
# connector.actions.test_action.invoke(input)
|
22
|
+
# connector.triggers.test_poll_trigger.invoke(input)
|
23
|
+
#
|
24
|
+
# == Direct call to execute or poll block
|
25
|
+
#
|
26
|
+
# Schema is not applied when call an action's execute block directly. For example
|
27
|
+
#
|
28
|
+
# CLI
|
29
|
+
# workato exec 'actions.test_action.execute'
|
30
|
+
#
|
31
|
+
# RSpec
|
32
|
+
# connector.actions.test_action.execute(settings, input, input_schema, output_schema)
|
33
|
+
#
|
34
|
+
# In that case if action's code relies on methods of {Workato::Types::UnicodeString} or {Workato::Types::Binary}
|
35
|
+
# then this explicit wrapper should be used for correct behavior.
|
36
|
+
#
|
37
|
+
# @example
|
38
|
+
# input = {
|
39
|
+
# file_content: Workato::Types::Binary.new(File.read('/path/to/file.bin', 'wb')),
|
40
|
+
# file_name: Workato::Types::UnicodeString.new("Hello World!")
|
41
|
+
# }
|
42
|
+
#
|
43
|
+
# connector.actions.upload(settings, input)
|
44
|
+
#
|
45
|
+
# @see Workato::Types::UnicodeString
|
5
46
|
class Binary < ::String
|
6
47
|
TITLE_LENGTH = 16
|
7
48
|
SUMMARY_LENGTH = 128
|
@@ -19,6 +60,9 @@ module Workato
|
|
19
60
|
summary
|
20
61
|
end
|
21
62
|
|
63
|
+
# Returns true for binary data
|
64
|
+
#
|
65
|
+
# @return [Boolean]
|
22
66
|
def binary?
|
23
67
|
true
|
24
68
|
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# typed: true
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Workato
|
5
|
+
module Types
|
6
|
+
# Explicit wrapper for unicode strings.
|
7
|
+
#
|
8
|
+
# Workato runtime always converts a String to {Workato::Types::UnicodeString} and
|
9
|
+
# binary data to {Workato::Types::Binary} before execute an action.
|
10
|
+
#
|
11
|
+
# == Call action or trigger by name
|
12
|
+
#
|
13
|
+
# SDK emulator applies trigger's or action's input/output schema and normalize string when invoke them by name.
|
14
|
+
# If you call an operation like this, then emulator passes input with
|
15
|
+
# {Workato::Types::UnicodeString} or {Workato::Types::Binary} to the operation
|
16
|
+
#
|
17
|
+
# CLI
|
18
|
+
# workato exec 'actions.test_action'
|
19
|
+
# workato exec 'triggers.test_poll_trigger'
|
20
|
+
#
|
21
|
+
# RSpec
|
22
|
+
# connector.actions.test_action.invoke(input)
|
23
|
+
# connector.triggers.test_poll_trigger.invoke(input)
|
24
|
+
#
|
25
|
+
# == Direct call to execute or poll block
|
26
|
+
#
|
27
|
+
# Schema is not applied when call an action's execute block directly. For example
|
28
|
+
#
|
29
|
+
# CLI
|
30
|
+
# workato exec 'actions.test_action.execute'
|
31
|
+
#
|
32
|
+
# RSpec
|
33
|
+
# connector.actions.test_action.execute(settings, input, input_schema, output_schema)
|
34
|
+
#
|
35
|
+
# In that case if action's code relies on methods of {Workato::Types::UnicodeString} or {Workato::Types::Binary}
|
36
|
+
# then this explicit wrapper should be used for correct behavior.
|
37
|
+
#
|
38
|
+
# @example
|
39
|
+
# input = {
|
40
|
+
# file_content: Workato::Types::Binary.new(File.read('/path/to/file.bin', 'wb')),
|
41
|
+
# file_name: Workato::Types::UnicodeString.new("Hello World!")
|
42
|
+
# }
|
43
|
+
#
|
44
|
+
# connector.actions.upload(settings, input)
|
45
|
+
#
|
46
|
+
# @see Workato::Types::Binary
|
47
|
+
class UnicodeString < ::String
|
48
|
+
# @param str Ruby string
|
49
|
+
def initialize(str)
|
50
|
+
super(str, **{})
|
51
|
+
encode!('UTF-8')
|
52
|
+
end
|
53
|
+
|
54
|
+
# Returns false for unicode strings
|
55
|
+
#
|
56
|
+
# @return [Boolean]
|
57
|
+
def binary?
|
58
|
+
false
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
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.3.
|
4
|
+
version: 1.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pavel Abolmasov
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-02-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -178,20 +178,6 @@ dependencies:
|
|
178
178
|
- - "~>"
|
179
179
|
- !ruby/object:Gem::Version
|
180
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
181
|
- !ruby/object:Gem::Dependency
|
196
182
|
name: rack
|
197
183
|
requirement: !ruby/object:Gem::Requirement
|
@@ -410,6 +396,7 @@ executables:
|
|
410
396
|
extensions: []
|
411
397
|
extra_rdoc_files: []
|
412
398
|
files:
|
399
|
+
- ".yardopts"
|
413
400
|
- LICENSE.md
|
414
401
|
- README.md
|
415
402
|
- VERSION
|
@@ -461,7 +448,6 @@ files:
|
|
461
448
|
- lib/workato/connector/sdk/schema/field/object.rb
|
462
449
|
- lib/workato/connector/sdk/schema/field/string.rb
|
463
450
|
- lib/workato/connector/sdk/schema/type/time.rb
|
464
|
-
- lib/workato/connector/sdk/schema/type/unicode_string.rb
|
465
451
|
- lib/workato/connector/sdk/settings.rb
|
466
452
|
- lib/workato/connector/sdk/stream.rb
|
467
453
|
- lib/workato/connector/sdk/streams.rb
|
@@ -493,6 +479,7 @@ files:
|
|
493
479
|
- lib/workato/testing/vcr_encrypted_cassette_serializer.rb
|
494
480
|
- lib/workato/testing/vcr_multipart_body_matcher.rb
|
495
481
|
- lib/workato/types/binary.rb
|
482
|
+
- lib/workato/types/unicode_string.rb
|
496
483
|
- lib/workato/utilities/encoding.rb
|
497
484
|
- lib/workato/utilities/xml.rb
|
498
485
|
- lib/workato/web/app.rb
|
@@ -1,23 +0,0 @@
|
|
1
|
-
# typed: true
|
2
|
-
# frozen_string_literal: true
|
3
|
-
|
4
|
-
module Workato
|
5
|
-
module Connector
|
6
|
-
module Sdk
|
7
|
-
class Schema
|
8
|
-
module Type
|
9
|
-
class UnicodeString < ::String
|
10
|
-
def initialize(str)
|
11
|
-
super(str, **{})
|
12
|
-
encode!('UTF-8')
|
13
|
-
end
|
14
|
-
|
15
|
-
def binary?
|
16
|
-
false
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|