workato-connector-sdk 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/exe/workato +12 -1
- data/lib/workato/cli/edit_command.rb +1 -3
- data/lib/workato/cli/exec_command.rb +15 -4
- data/lib/workato/cli/generate_command.rb +1 -2
- data/lib/workato/cli/oauth2_command.rb +3 -5
- data/lib/workato/cli/push_command.rb +7 -7
- data/lib/workato/connector/sdk/action.rb +11 -0
- data/lib/workato/connector/sdk/connector.rb +9 -2
- data/lib/workato/connector/sdk/dsl/workato_code_lib.rb +4 -4
- data/lib/workato/connector/sdk/errors.rb +13 -0
- data/lib/workato/connector/sdk/operation.rb +20 -2
- data/lib/workato/connector/sdk/schema/field/array.rb +25 -0
- data/lib/workato/connector/sdk/schema/field/convertors.rb +189 -0
- data/lib/workato/connector/sdk/schema/field/date.rb +28 -0
- data/lib/workato/connector/sdk/schema/field/date_time.rb +28 -0
- data/lib/workato/connector/sdk/schema/field/integer.rb +27 -0
- data/lib/workato/connector/sdk/schema/field/number.rb +27 -0
- data/lib/workato/connector/sdk/schema/field/object.rb +25 -0
- data/lib/workato/connector/sdk/schema/field/string.rb +26 -0
- data/lib/workato/connector/sdk/schema/type/time.rb +53 -0
- data/lib/workato/connector/sdk/schema/type/unicode_string.rb +22 -0
- data/lib/workato/connector/sdk/schema.rb +230 -0
- data/lib/workato/connector/sdk/trigger.rb +25 -0
- data/lib/workato/connector/sdk/version.rb +1 -1
- data/lib/workato/extension/string.rb +16 -10
- data/templates/spec/action_spec.rb.erb +6 -0
- data/templates/spec/trigger_spec.rb.erb +6 -0
- metadata +14 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: b958407bc907daf631e2bd91ecb5c002f911906e3bf8a88c00aedd612fe80bbe
|
4
|
+
data.tar.gz: 1445969d82d648667e1de62809722625d06e40a30bb4bec565f56f1b7ce113da
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4ad8b4ef4ed273ad65573acb5a4e45dd1e0772b24a4de82cc4c40a3fe0a926c8f93f067eab0df2a6f23b0f94317f2d4bcaad588d203f9323417d7a973084a1fe
|
7
|
+
data.tar.gz: 879463eea7f3e0b9ef01ce1a5019eafbc8af18610306541ff97f6b62520869e0db8d1de1c0a61b9bb3c233c0932dc780e1ec04fd61704350ece80e9fbf9c764d
|
data/exe/workato
CHANGED
@@ -2,4 +2,15 @@
|
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
require 'workato/cli/main'
|
5
|
-
|
5
|
+
|
6
|
+
begin
|
7
|
+
Workato::CLI::Main.start
|
8
|
+
rescue Workato::CLI::ExecCommand::DebugExceptionError => e
|
9
|
+
raise e.cause
|
10
|
+
rescue SystemExit, SignalException
|
11
|
+
raise
|
12
|
+
rescue Exception => e # rubocop:disable Lint/RescueException
|
13
|
+
puts ''
|
14
|
+
puts e.message
|
15
|
+
exit(false)
|
16
|
+
end
|
@@ -28,7 +28,7 @@ module Workato
|
|
28
28
|
|
29
29
|
puts 'File encrypted and saved.'
|
30
30
|
rescue ActiveSupport::MessageEncryptor::InvalidMessage
|
31
|
-
|
31
|
+
raise "Couldn't decrypt #{encrypted_file_path}. Perhaps you passed the wrong key?"
|
32
32
|
end
|
33
33
|
|
34
34
|
private
|
@@ -63,8 +63,6 @@ module Workato
|
|
63
63
|
yield
|
64
64
|
rescue Interrupt
|
65
65
|
puts 'Aborted changing file: nothing saved.'
|
66
|
-
rescue ActiveSupport::EncryptedFile::MissingKeyError => e
|
67
|
-
puts e.message
|
68
66
|
end
|
69
67
|
end
|
70
68
|
end
|
@@ -7,6 +7,8 @@ module Workato
|
|
7
7
|
class ExecCommand
|
8
8
|
include Thor::Shell
|
9
9
|
|
10
|
+
DebugExceptionError = Class.new(StandardError)
|
11
|
+
|
10
12
|
def initialize(path:, options:)
|
11
13
|
@path = path
|
12
14
|
@options = options
|
@@ -122,16 +124,25 @@ module Workato
|
|
122
124
|
methods = path.split('.')
|
123
125
|
method = methods.pop
|
124
126
|
object = methods.inject(params[:connector]) { |obj, m| obj.public_send(m) }
|
127
|
+
output = invoke_method(object, method)
|
128
|
+
if output.respond_to?(:invoke)
|
129
|
+
invoke_method(output, :invoke)
|
130
|
+
else
|
131
|
+
output
|
132
|
+
end
|
133
|
+
rescue Exception => e # rubocop:disable Lint/RescueException
|
134
|
+
raise DebugExceptionError, e if options[:debug]
|
135
|
+
|
136
|
+
raise
|
137
|
+
end
|
138
|
+
|
139
|
+
def invoke_method(object, method)
|
125
140
|
parameters = object.method(method).parameters.reject { |p| p[0] == :block }.map(&:second)
|
126
141
|
args = params.values_at(*parameters)
|
127
142
|
if parameters.last == :args
|
128
143
|
args = args.take(args.length - 1) + Array.wrap(args.last).flatten(1)
|
129
144
|
end
|
130
145
|
object.public_send(method, *args)
|
131
|
-
rescue Exception => e # rubocop:disable Lint/RescueException
|
132
|
-
raise e if options[:debug]
|
133
|
-
|
134
|
-
e.message
|
135
146
|
end
|
136
147
|
|
137
148
|
def show_output(output)
|
@@ -32,7 +32,7 @@ module Workato
|
|
32
32
|
|
33
33
|
say_status :success, "Open #{authorize_url} in browser"
|
34
34
|
Launchy.open(authorize_url) do |exception|
|
35
|
-
raise
|
35
|
+
raise "Attempted to open #{authorize_url} and failed because #{exception}"
|
36
36
|
end
|
37
37
|
|
38
38
|
code = await_code
|
@@ -45,11 +45,9 @@ module Workato
|
|
45
45
|
settings_store.update(tokens)
|
46
46
|
say_status :success, 'Update settings file'
|
47
47
|
rescue Timeout::Error
|
48
|
-
|
48
|
+
raise "Have not received callback from OAuth2 provider in #{AWAIT_CODE_TIMEOUT_INTERVAL} seconds. Aborting!"
|
49
49
|
rescue Errno::EADDRINUSE
|
50
|
-
|
51
|
-
rescue StandardError => e
|
52
|
-
say e.message
|
50
|
+
raise "Port #{port} already in use. Try to use different port with --port=#{rand(10_000..65_664)}"
|
53
51
|
ensure
|
54
52
|
stop_webrick
|
55
53
|
end
|
@@ -49,13 +49,9 @@ module Workato
|
|
49
49
|
say_status :waiting, 'Process package' if verbose?
|
50
50
|
|
51
51
|
result = await_import(import_id)
|
52
|
-
if result.fetch('status') == 'failed'
|
53
|
-
|
54
|
-
|
55
|
-
say "Connector was successfully uploaded to #{api_base_url}"
|
56
|
-
end
|
57
|
-
rescue StandardError => e
|
58
|
-
say e.message
|
52
|
+
raise human_friendly_error(result) if result.fetch('status') == 'failed'
|
53
|
+
|
54
|
+
say "Connector was successfully uploaded to #{api_base_url}"
|
59
55
|
ensure
|
60
56
|
FileUtils.rm_f(zip_file_path) if zip_file_path
|
61
57
|
end
|
@@ -208,6 +204,10 @@ module Workato
|
|
208
204
|
end
|
209
205
|
end
|
210
206
|
|
207
|
+
def human_friendly_error(result)
|
208
|
+
result.fetch('error').gsub("#{PACKAGE_ENTRY_NAME}.json: ", '')
|
209
|
+
end
|
210
|
+
|
211
211
|
private_constant :IMPORT_IN_PROGRESS,
|
212
212
|
:API_USER_PATH,
|
213
213
|
:API_IMPORT_PATH,
|
@@ -61,6 +61,17 @@ module Workato
|
|
61
61
|
sleep(RETRY_DELAY) && retry
|
62
62
|
end
|
63
63
|
|
64
|
+
def invoke(input = {})
|
65
|
+
extended_schema = extended_schema(nil, input)
|
66
|
+
config_schema = Schema.new(schema: config_fields_schema)
|
67
|
+
input_schema = Schema.new(schema: extended_schema[:input])
|
68
|
+
output_schema = Schema.new(schema: extended_schema[:output])
|
69
|
+
|
70
|
+
input = apply_input_schema(input, config_schema + input_schema)
|
71
|
+
output = execute(nil, input, input_schema, output_schema)
|
72
|
+
apply_output_schema(output, output_schema)
|
73
|
+
end
|
74
|
+
|
64
75
|
def checkpoint!(continue:, temp_output: nil)
|
65
76
|
# no-op
|
66
77
|
end
|
@@ -115,7 +115,7 @@ module Workato
|
|
115
115
|
|
116
116
|
def define_action_methods(actions)
|
117
117
|
actions.each do |action, definition|
|
118
|
-
define_singleton_method(action) do
|
118
|
+
define_singleton_method(action) do |input_ = nil|
|
119
119
|
@actions ||= {}
|
120
120
|
@actions[action] ||= Action.new(
|
121
121
|
action: definition,
|
@@ -124,6 +124,9 @@ module Workato
|
|
124
124
|
connection: connection,
|
125
125
|
settings: settings
|
126
126
|
)
|
127
|
+
return @actions[action] if input_.nil?
|
128
|
+
|
129
|
+
@actions[action].invoke(input_)
|
127
130
|
end
|
128
131
|
end
|
129
132
|
end
|
@@ -221,7 +224,7 @@ module Workato
|
|
221
224
|
|
222
225
|
def define_trigger_methods(triggers)
|
223
226
|
triggers.each do |trigger, definition|
|
224
|
-
define_singleton_method(trigger) do
|
227
|
+
define_singleton_method(trigger) do |input_ = nil, payload = {}, headers = {}, params = {}|
|
225
228
|
@triggers[trigger] ||= Trigger.new(
|
226
229
|
trigger: definition,
|
227
230
|
object_definitions: object_definitions,
|
@@ -229,6 +232,10 @@ module Workato
|
|
229
232
|
connection: connection,
|
230
233
|
settings: settings
|
231
234
|
)
|
235
|
+
|
236
|
+
return @triggers[trigger] if input_.nil?
|
237
|
+
|
238
|
+
@triggers[trigger].invoke(input_, payload, headers, params)
|
232
239
|
end
|
233
240
|
end
|
234
241
|
end
|
@@ -63,7 +63,7 @@ module Workato
|
|
63
63
|
raise "The requested length or random bytes sequence should be <= #{RANDOM_SIZE}"
|
64
64
|
end
|
65
65
|
|
66
|
-
|
66
|
+
Extension::Binary.new(::OpenSSL::Random.random_bytes(len))
|
67
67
|
end
|
68
68
|
|
69
69
|
ALLOWED_KEY_SIZES = [128, 192, 256].freeze
|
@@ -78,7 +78,7 @@ module Workato
|
|
78
78
|
cipher.encrypt
|
79
79
|
cipher.key = key
|
80
80
|
cipher.iv = init_vector if init_vector.present?
|
81
|
-
|
81
|
+
Extension::Binary.new(cipher.update(string) + cipher.final)
|
82
82
|
end
|
83
83
|
|
84
84
|
def aes_cbc_decrypt(string, key, init_vector = nil)
|
@@ -91,11 +91,11 @@ module Workato
|
|
91
91
|
cipher.decrypt
|
92
92
|
cipher.key = key
|
93
93
|
cipher.iv = init_vector if init_vector.present?
|
94
|
-
|
94
|
+
Extension::Binary.new(cipher.update(string) + cipher.final)
|
95
95
|
end
|
96
96
|
|
97
97
|
def pbkdf2_hmac_sha1(string, salt, iterations = 1000, key_len = 16)
|
98
|
-
|
98
|
+
Extension::Binary.new(::OpenSSL::PKCS5.pbkdf2_hmac_sha1(string, salt, iterations, key_len))
|
99
99
|
end
|
100
100
|
end
|
101
101
|
end
|
@@ -5,6 +5,8 @@ module Workato
|
|
5
5
|
module Sdk
|
6
6
|
InvalidDefinitionError = Class.new(StandardError)
|
7
7
|
|
8
|
+
InvalidSchemaError = Class.new(StandardError)
|
9
|
+
|
8
10
|
CustomRequestError = Class.new(StandardError)
|
9
11
|
|
10
12
|
class RequestError < StandardError
|
@@ -25,6 +27,17 @@ module Workato
|
|
25
27
|
super
|
26
28
|
end
|
27
29
|
end
|
30
|
+
|
31
|
+
class MissingRequiredInput < StandardError
|
32
|
+
def initialize(label, toggle_label)
|
33
|
+
message = if toggle_label && label != toggle_label
|
34
|
+
"Either '#{label}' or '#{toggle_label}' must be present"
|
35
|
+
else
|
36
|
+
"'#{label}' must be present"
|
37
|
+
end
|
38
|
+
super(message)
|
39
|
+
end
|
40
|
+
end
|
28
41
|
end
|
29
42
|
end
|
30
43
|
end
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require_relative './dsl'
|
4
4
|
require_relative './block_invocation_refinements'
|
5
|
+
require_relative './schema'
|
5
6
|
|
6
7
|
module Workato
|
7
8
|
module Connector
|
@@ -18,7 +19,7 @@ module Workato
|
|
18
19
|
|
19
20
|
def initialize(connection:, operation: {}, methods: {}, settings: {}, object_definitions: nil)
|
20
21
|
@connection = connection
|
21
|
-
@settings = settings
|
22
|
+
@settings = settings
|
22
23
|
@operation = operation.with_indifferent_access
|
23
24
|
@_methods = methods.with_indifferent_access
|
24
25
|
@object_definitions = object_definitions
|
@@ -87,6 +88,23 @@ module Workato
|
|
87
88
|
|
88
89
|
private
|
89
90
|
|
91
|
+
def apply_input_schema(input, schema)
|
92
|
+
input = schema.trim(input)
|
93
|
+
schema.apply(input, enforce_required: true) do |value, field|
|
94
|
+
field.render_input(value, @_methods[field[:render_input]])
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def apply_output_schema(output, schema)
|
99
|
+
schema.apply(output, enforce_required: false) do |value, field|
|
100
|
+
field.parse_output(value, @_methods[field[:parse_output]])
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def config_fields_schema
|
105
|
+
operation[:config_fields] || []
|
106
|
+
end
|
107
|
+
|
90
108
|
def summarize(data, paths)
|
91
109
|
return data unless paths.present?
|
92
110
|
|
@@ -94,7 +112,7 @@ module Workato
|
|
94
112
|
end
|
95
113
|
|
96
114
|
def schema_fields(object_definitions_hash, settings, config_fields, &schema_proc)
|
97
|
-
return
|
115
|
+
return [] unless schema_proc
|
98
116
|
|
99
117
|
execute(settings, config_fields) do |connection, input|
|
100
118
|
instance_exec(
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative './convertors'
|
4
|
+
|
5
|
+
module Workato
|
6
|
+
module Connector
|
7
|
+
module Sdk
|
8
|
+
class Schema
|
9
|
+
module Field
|
10
|
+
class Array < SimpleDelegator
|
11
|
+
include Convertors
|
12
|
+
|
13
|
+
DEFAULT_ATTRIBUTES = {
|
14
|
+
type: 'array'
|
15
|
+
}.with_indifferent_access.freeze
|
16
|
+
|
17
|
+
def initialize(field)
|
18
|
+
super(DEFAULT_ATTRIBUTES.merge(field))
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,189 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Workato
|
4
|
+
module Connector
|
5
|
+
module Sdk
|
6
|
+
class Schema
|
7
|
+
module Field
|
8
|
+
module Convertors
|
9
|
+
def render_input(value, custom_convertor = nil)
|
10
|
+
apply_convertor(value, self[:render_input], custom_convertor)
|
11
|
+
end
|
12
|
+
|
13
|
+
def parse_output(value, custom_convertor = nil)
|
14
|
+
apply_convertor(value, self[:parse_output], custom_convertor)
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def apply_convertor(value, builtin_convertor, custom_convertor)
|
20
|
+
return value unless builtin_convertor || custom_convertor
|
21
|
+
return send(builtin_convertor, value) if builtin_convertor && respond_to?(builtin_convertor, true)
|
22
|
+
return custom_convertor.call(value) if custom_convertor.is_a?(Proc)
|
23
|
+
|
24
|
+
raise ArgumentError, "Cannot find converter '#{builtin_convertor}'."
|
25
|
+
end
|
26
|
+
|
27
|
+
def integer_conversion(value)
|
28
|
+
value.try(:is_number?) && value.to_i || value
|
29
|
+
end
|
30
|
+
|
31
|
+
def boolean_conversion(value)
|
32
|
+
value.try(:is_true?)
|
33
|
+
end
|
34
|
+
|
35
|
+
def float_conversion(value)
|
36
|
+
value.try(:is_number?) && value.to_f || value
|
37
|
+
end
|
38
|
+
|
39
|
+
def item_array_wrap(items)
|
40
|
+
::Array.wrap(items).presence&.flatten(1)
|
41
|
+
end
|
42
|
+
|
43
|
+
def date_conversion(value)
|
44
|
+
parse_date(value)
|
45
|
+
end
|
46
|
+
|
47
|
+
def date_iso8601_conversion(value)
|
48
|
+
parse_date(value)&.iso8601
|
49
|
+
end
|
50
|
+
|
51
|
+
def date_time_conversion(value)
|
52
|
+
parse_date_time(value)
|
53
|
+
end
|
54
|
+
|
55
|
+
def date_time_iso8601_conversion(value)
|
56
|
+
parse_date_time(value)&.iso8601
|
57
|
+
end
|
58
|
+
|
59
|
+
def convert_to_datetime(value)
|
60
|
+
value.try(:to_datetime) || value
|
61
|
+
end
|
62
|
+
|
63
|
+
def convert_to_datetime_wo_tz(value)
|
64
|
+
value.try(:to_datetime).strftime('%Y-%m-%d %H:%M:%S') || value
|
65
|
+
end
|
66
|
+
|
67
|
+
def parse_date_output(value)
|
68
|
+
value.try(:to_date) || value
|
69
|
+
end
|
70
|
+
|
71
|
+
def render_date_input(value)
|
72
|
+
try_in_time_zone(value).try(:to_date)
|
73
|
+
end
|
74
|
+
|
75
|
+
def convert_date_time(value)
|
76
|
+
try_in_time_zone(value)
|
77
|
+
end
|
78
|
+
|
79
|
+
def parse_date_time_epoch_millis(value)
|
80
|
+
if value.is_a?(::Time)
|
81
|
+
value
|
82
|
+
else
|
83
|
+
value.is_a?(Numeric) && ::Time.at(value.to_f / 1000)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def render_date_time_epoch_millis(value)
|
88
|
+
value.try(:to_f).try(:*, 1000).try(:to_i)
|
89
|
+
end
|
90
|
+
|
91
|
+
def parse_iso8601_timestamp(value)
|
92
|
+
if value.is_a?(::Time)
|
93
|
+
value
|
94
|
+
else
|
95
|
+
value.try(:to_time)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def render_iso8601_timestamp(value)
|
100
|
+
value.try(:to_time).try(:iso8601)
|
101
|
+
end
|
102
|
+
|
103
|
+
def parse_iso8601_date(value)
|
104
|
+
if value.is_a?(::Date)
|
105
|
+
value
|
106
|
+
else
|
107
|
+
value.try(:to_date)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def render_iso8601_date(value)
|
112
|
+
value.try(:to_date).try(:iso8601)
|
113
|
+
end
|
114
|
+
|
115
|
+
def parse_epoch_time(value)
|
116
|
+
if value.is_a?(::Time)
|
117
|
+
value
|
118
|
+
else
|
119
|
+
(value.is_a?(Numeric).presence || value.try(:is_number?).presence) && ::Time.zone.at(value.to_i)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def render_epoch_time(value)
|
124
|
+
value.try(:to_time).try(:to_i)
|
125
|
+
end
|
126
|
+
|
127
|
+
def parse_float_epoch_time(value)
|
128
|
+
if value.is_a?(::Time)
|
129
|
+
value
|
130
|
+
else
|
131
|
+
(value.is_a?(Numeric) || value.try(:is_number?)) && ::Time.zone.at(value.to_f)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def render_float_epoch_time(value)
|
136
|
+
value.try(:to_time).try(:to_f)
|
137
|
+
end
|
138
|
+
|
139
|
+
def implicit_utc_time(value)
|
140
|
+
value&.in_time_zone('UTC')
|
141
|
+
end
|
142
|
+
|
143
|
+
def implicit_utc_iso8601_time(value)
|
144
|
+
value&.in_time_zone('UTC')&.iso8601
|
145
|
+
end
|
146
|
+
|
147
|
+
# Helpers
|
148
|
+
#
|
149
|
+
def try_in_time_zone(value)
|
150
|
+
value.try(:in_time_zone, local_time_zone || ::Time.zone) || value
|
151
|
+
end
|
152
|
+
|
153
|
+
def local_time_zone
|
154
|
+
ENV['WORKATO_TIME_ZONE'] || Workato::Connector::Sdk::DEFAULT_TIME_ZONE
|
155
|
+
end
|
156
|
+
|
157
|
+
def parse_date(value)
|
158
|
+
if value.blank? || value.is_a?(::Date)
|
159
|
+
value.presence
|
160
|
+
elsif value.is_a?(::Time)
|
161
|
+
value.to_date
|
162
|
+
else
|
163
|
+
parse_time_string(value).to_date
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
def parse_date_time(value)
|
168
|
+
if value.blank? || value.is_a?(::Time)
|
169
|
+
value.presence
|
170
|
+
elsif value.is_a?(::Date)
|
171
|
+
value.in_time_zone(local_time_zone)
|
172
|
+
else
|
173
|
+
parse_time_string(value)
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
def parse_time_string(value)
|
178
|
+
value_time = ::Time.parse(value)
|
179
|
+
user_time = ActiveSupport::TimeZone[local_time_zone].parse(value)
|
180
|
+
|
181
|
+
# equal means value had its own offset/TZ or defaulted to system TZ with same offset as user's.
|
182
|
+
value_time == user_time ? value_time : user_time
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative './convertors'
|
4
|
+
|
5
|
+
module Workato
|
6
|
+
module Connector
|
7
|
+
module Sdk
|
8
|
+
class Schema
|
9
|
+
module Field
|
10
|
+
class Date < SimpleDelegator
|
11
|
+
include Convertors
|
12
|
+
|
13
|
+
DEFAULT_ATTRIBUTES = {
|
14
|
+
type: 'date_time',
|
15
|
+
control_type: 'date',
|
16
|
+
render_input: 'date_conversion',
|
17
|
+
parse_output: 'date_conversion'
|
18
|
+
}.with_indifferent_access.freeze
|
19
|
+
|
20
|
+
def initialize(field)
|
21
|
+
super(DEFAULT_ATTRIBUTES.merge(field))
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative './convertors'
|
4
|
+
|
5
|
+
module Workato
|
6
|
+
module Connector
|
7
|
+
module Sdk
|
8
|
+
class Schema
|
9
|
+
module Field
|
10
|
+
class DateTime < SimpleDelegator
|
11
|
+
include Convertors
|
12
|
+
|
13
|
+
DEFAULT_ATTRIBUTES = {
|
14
|
+
type: 'date_time',
|
15
|
+
control_type: 'date_time',
|
16
|
+
render_input: 'date_time_conversion',
|
17
|
+
parse_output: 'date_time_conversion'
|
18
|
+
}.with_indifferent_access.freeze
|
19
|
+
|
20
|
+
def initialize(field)
|
21
|
+
super(DEFAULT_ATTRIBUTES.merge(field))
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative './convertors'
|
4
|
+
|
5
|
+
module Workato
|
6
|
+
module Connector
|
7
|
+
module Sdk
|
8
|
+
class Schema
|
9
|
+
module Field
|
10
|
+
class Integer < SimpleDelegator
|
11
|
+
include Convertors
|
12
|
+
|
13
|
+
DEFAULT_ATTRIBUTES = {
|
14
|
+
type: 'integer',
|
15
|
+
control_type: 'number',
|
16
|
+
parse_output: 'integer_conversion'
|
17
|
+
}.with_indifferent_access.freeze
|
18
|
+
|
19
|
+
def initialize(field)
|
20
|
+
super(DEFAULT_ATTRIBUTES.merge(field))
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative './convertors'
|
4
|
+
|
5
|
+
module Workato
|
6
|
+
module Connector
|
7
|
+
module Sdk
|
8
|
+
class Schema
|
9
|
+
module Field
|
10
|
+
class Number < SimpleDelegator
|
11
|
+
include Convertors
|
12
|
+
|
13
|
+
DEFAULT_ATTRIBUTES = {
|
14
|
+
type: 'number',
|
15
|
+
control_type: 'number',
|
16
|
+
parse_output: 'float_conversion'
|
17
|
+
}.with_indifferent_access.freeze
|
18
|
+
|
19
|
+
def initialize(field)
|
20
|
+
super(DEFAULT_ATTRIBUTES.merge(field))
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative './convertors'
|
4
|
+
|
5
|
+
module Workato
|
6
|
+
module Connector
|
7
|
+
module Sdk
|
8
|
+
class Schema
|
9
|
+
module Field
|
10
|
+
class Object < SimpleDelegator
|
11
|
+
include Convertors
|
12
|
+
|
13
|
+
DEFAULT_ATTRIBUTES = {
|
14
|
+
type: 'object'
|
15
|
+
}.with_indifferent_access.freeze
|
16
|
+
|
17
|
+
def initialize(field)
|
18
|
+
super(DEFAULT_ATTRIBUTES.merge(field))
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative './convertors'
|
4
|
+
|
5
|
+
module Workato
|
6
|
+
module Connector
|
7
|
+
module Sdk
|
8
|
+
class Schema
|
9
|
+
module Field
|
10
|
+
class String < SimpleDelegator
|
11
|
+
include Convertors
|
12
|
+
|
13
|
+
DEFAULT_ATTRIBUTES = {
|
14
|
+
type: 'string',
|
15
|
+
control_type: 'text'
|
16
|
+
}.with_indifferent_access.freeze
|
17
|
+
|
18
|
+
def initialize(field)
|
19
|
+
super(DEFAULT_ATTRIBUTES.merge(field))
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'time'
|
4
|
+
|
5
|
+
module Workato
|
6
|
+
module Connector
|
7
|
+
module Sdk
|
8
|
+
class Schema
|
9
|
+
module Type
|
10
|
+
class Time < ::Time
|
11
|
+
PRECISION = 6
|
12
|
+
|
13
|
+
def to_s(*args)
|
14
|
+
if args.present?
|
15
|
+
super
|
16
|
+
else
|
17
|
+
xmlschema(PRECISION)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.from_time(value)
|
22
|
+
new(
|
23
|
+
value.year,
|
24
|
+
value.month,
|
25
|
+
value.day,
|
26
|
+
value.hour,
|
27
|
+
value.min,
|
28
|
+
value.sec + Rational(value.nsec, 1_000_000_000),
|
29
|
+
value.utc_offset
|
30
|
+
)
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.from_date_time(value)
|
34
|
+
new(
|
35
|
+
value.year,
|
36
|
+
value.month,
|
37
|
+
value.day,
|
38
|
+
value.hour,
|
39
|
+
value.min,
|
40
|
+
value.sec + Rational(value.nsec, 1_000_000_000),
|
41
|
+
value.zone
|
42
|
+
)
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.xmlschema(str)
|
46
|
+
from_time(super(str))
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Workato
|
4
|
+
module Connector
|
5
|
+
module Sdk
|
6
|
+
class Schema
|
7
|
+
module Type
|
8
|
+
class UnicodeString < ::String
|
9
|
+
def initialize(str)
|
10
|
+
super(str, {})
|
11
|
+
encode!('UTF-8')
|
12
|
+
end
|
13
|
+
|
14
|
+
def binary?
|
15
|
+
false
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,230 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Workato
|
4
|
+
module Connector
|
5
|
+
module Sdk
|
6
|
+
class Schema < SimpleDelegator
|
7
|
+
def initialize(schema: [])
|
8
|
+
super(Fields.new(::Array.wrap(schema).map(&:with_indifferent_access)))
|
9
|
+
end
|
10
|
+
|
11
|
+
def trim(input)
|
12
|
+
input.with_indifferent_access.keep_if { |property_name| includes_property?(property_name) }
|
13
|
+
end
|
14
|
+
|
15
|
+
def apply(input, enforce_required:, &block)
|
16
|
+
input.with_indifferent_access.tap do |input_with_indifferent_access|
|
17
|
+
apply_to_hash(self, input_with_indifferent_access, enforce_required: enforce_required, &block)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def +(other)
|
22
|
+
if other.is_a?(Schema)
|
23
|
+
Schema.new.tap do |schema|
|
24
|
+
schema.__setobj__(__getobj__ + other.__getobj__)
|
25
|
+
end
|
26
|
+
else
|
27
|
+
Schema.new(schema: __getobj__ + other)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def includes_property?(name)
|
34
|
+
find_property_by_name(name).present?
|
35
|
+
end
|
36
|
+
|
37
|
+
def find_property_by_name(name)
|
38
|
+
find do |property|
|
39
|
+
(property[:name].to_s == name.to_s) || (property.dig(:toggle_field, :name).to_s == name.to_s)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def apply_to_hash(properties, object, enforce_required: false, &block)
|
44
|
+
return if properties.blank? || object.nil?
|
45
|
+
|
46
|
+
properties.each do |property|
|
47
|
+
apply_to_value(property, object, property[:name], object[property[:name]], &block)
|
48
|
+
if (toggle_property = property[:toggle_field])
|
49
|
+
apply_to_value(toggle_property, object, toggle_property[:name], object[toggle_property[:name]], &block)
|
50
|
+
end
|
51
|
+
|
52
|
+
next unless enforce_required
|
53
|
+
next if optional_or_present?(property, object) || optional_or_present?(property[:toggle_field], object)
|
54
|
+
|
55
|
+
raise MissingRequiredInput.new(property[:label], property.dig(:toggle_field, :label))
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def optional_or_present?(property, object)
|
60
|
+
property.present? && (
|
61
|
+
property[:optional] ||
|
62
|
+
property[:runtime_optional] ||
|
63
|
+
(value = object[property[:name]]).present? ||
|
64
|
+
value.is_a?(FalseClass) ||
|
65
|
+
(value.is_a?(::String) && !value.empty?)
|
66
|
+
)
|
67
|
+
end
|
68
|
+
|
69
|
+
def apply_to_array(property, array, &block)
|
70
|
+
array.each_with_index do |item, index|
|
71
|
+
apply_to_value(property, array, index, item, &block)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def apply_to_value(property, container, index, value, &block)
|
76
|
+
return unless property.present? && value.present?
|
77
|
+
|
78
|
+
if value.respond_to?(:each_key)
|
79
|
+
apply_to_hash(property[:properties], value, &block)
|
80
|
+
elsif value.respond_to?(:each_with_index)
|
81
|
+
apply_to_array(property, value, &block)
|
82
|
+
end
|
83
|
+
|
84
|
+
container[index] = if !value.nil? && block
|
85
|
+
normalize_value(yield(value, property))
|
86
|
+
else
|
87
|
+
normalize_value(value)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def normalize_value(value)
|
92
|
+
return value if value.blank?
|
93
|
+
|
94
|
+
case value
|
95
|
+
when ::Time
|
96
|
+
return Type::Time.from_time(value)
|
97
|
+
when ::DateTime
|
98
|
+
return Type::Time.from_date_time(value)
|
99
|
+
when ::Date
|
100
|
+
return value.to_date
|
101
|
+
when ::Numeric, ::TrueClass, ::FalseClass, Workato::Extension::Binary, Type::UnicodeString,
|
102
|
+
::Array, ::Hash
|
103
|
+
return value
|
104
|
+
when Extension::Array::ArrayWhere
|
105
|
+
return value.to_a
|
106
|
+
when ::String
|
107
|
+
if value.encoding == Encoding::ASCII_8BIT
|
108
|
+
return Workato::Extension::Binary.new(value)
|
109
|
+
end
|
110
|
+
|
111
|
+
return Type::UnicodeString.new(value)
|
112
|
+
else
|
113
|
+
if value.respond_to?(:to_time)
|
114
|
+
return Type::Time.from_time(value.to_time)
|
115
|
+
end
|
116
|
+
|
117
|
+
if value.respond_to?(:read) && value.respond_to?(:rewind)
|
118
|
+
value.rewind
|
119
|
+
return Workato::Extension::Binary.new(value.read.force_encoding(Encoding::ASCII_8BIT))
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
raise ArgumentError, "Unsupported data type: #{value.class}"
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
class Fields < ::Array
|
128
|
+
def initialize(fields)
|
129
|
+
::Array.wrap(fields).each do |field|
|
130
|
+
field = prepare_attributes(field)
|
131
|
+
self << field_with_defaults(field)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
private
|
136
|
+
|
137
|
+
def prepare_attributes(field)
|
138
|
+
if (render_input = field.delete(:convert_input) || field[:render_input])
|
139
|
+
field[:render_input] = render_input.is_a?(Proc) ? nil : render_input
|
140
|
+
end
|
141
|
+
if (parse_output = field.delete(:convert_output) || field[:parse_output])
|
142
|
+
field[:parse_output] = parse_output.is_a?(Proc) ? nil : parse_output
|
143
|
+
end
|
144
|
+
field[:optional] = true unless field.key?(:optional)
|
145
|
+
field[:label] ||= field[:name].labelize
|
146
|
+
|
147
|
+
clean_values(field)
|
148
|
+
|
149
|
+
if (toggle_field = field[:toggle_field]).present?
|
150
|
+
raise InvalidSchemaError, 'toggle_hint not present' if field[:toggle_hint].blank?
|
151
|
+
|
152
|
+
unless toggle_field[:name].present? && toggle_field[:type].present?
|
153
|
+
raise InvalidSchemaError, 'toggle_field not complete'
|
154
|
+
end
|
155
|
+
|
156
|
+
if toggle_field[:optional].present? && (toggle_field[:optional] != field[:optional])
|
157
|
+
raise InvalidSchemaError, 'toggle field cannot change optional attribute'
|
158
|
+
end
|
159
|
+
|
160
|
+
field[:toggle_field] = field_with_defaults(field[:toggle_field]).tap do |tg_field|
|
161
|
+
tg_field.except!(:render_input, :parse_output, :control_type)
|
162
|
+
tg_field[:control_type] = toggle_field[:control_type]
|
163
|
+
clean_values(tg_field)
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
if field[:control_type].try(:start_with?, 'small-')
|
168
|
+
field[:control_type].remove!(/^small-/)
|
169
|
+
elsif field[:control_type].try(:start_with?, 'medium-')
|
170
|
+
field[:control_type].remove!(/^medium-/)
|
171
|
+
end
|
172
|
+
|
173
|
+
field
|
174
|
+
end
|
175
|
+
|
176
|
+
def clean_values(field)
|
177
|
+
field.transform_values! do |value|
|
178
|
+
value.presence && (value.is_a?(::Symbol) && value.to_s || value)
|
179
|
+
end
|
180
|
+
field.compact!
|
181
|
+
field
|
182
|
+
end
|
183
|
+
|
184
|
+
def field_with_defaults(field)
|
185
|
+
type = field.delete(:type).to_s
|
186
|
+
|
187
|
+
case type
|
188
|
+
when 'integer'
|
189
|
+
Schema::Field::Integer.new(field)
|
190
|
+
when 'number', 'boolean'
|
191
|
+
Schema::Field::Number.new(field)
|
192
|
+
when 'date_time', 'timestamp'
|
193
|
+
Schema::Field::DateTime.new(field)
|
194
|
+
when 'date'
|
195
|
+
Schema::Field::Date.new(field)
|
196
|
+
when 'object'
|
197
|
+
field[:properties] = Fields.new(field[:properties])
|
198
|
+
field.delete(:control_type)
|
199
|
+
Schema::Field::Object.new(field)
|
200
|
+
when 'array'
|
201
|
+
of = field[:of] = (field[:of] || 'object').to_s
|
202
|
+
if of == 'object'
|
203
|
+
field[:properties] = Fields.new(field[:properties])
|
204
|
+
else
|
205
|
+
field.merge(
|
206
|
+
field_with_defaults(field.merge(type: of)).except(:render_input, :parse_output)
|
207
|
+
)
|
208
|
+
end
|
209
|
+
Schema::Field::Array.new(field)
|
210
|
+
else
|
211
|
+
Schema::Field::String.new(field)
|
212
|
+
end
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
private_constant :Fields
|
217
|
+
end
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
require_relative './schema/field/array'
|
222
|
+
require_relative './schema/field/date'
|
223
|
+
require_relative './schema/field/date_time'
|
224
|
+
require_relative './schema/field/integer'
|
225
|
+
require_relative './schema/field/number'
|
226
|
+
require_relative './schema/field/object'
|
227
|
+
require_relative './schema/field/string'
|
228
|
+
|
229
|
+
require_relative './schema/type/time'
|
230
|
+
require_relative './schema/type/unicode_string'
|
@@ -89,7 +89,32 @@ module Workato
|
|
89
89
|
end
|
90
90
|
end
|
91
91
|
|
92
|
+
def invoke(input = {}, payload = {}, headers = {}, params = {})
|
93
|
+
extended_schema = extended_schema(nil, input)
|
94
|
+
config_schema = Schema.new(schema: config_fields_schema)
|
95
|
+
input_schema = Schema.new(schema: extended_schema[:input])
|
96
|
+
output_schema = Schema.new(schema: extended_schema[:output])
|
97
|
+
|
98
|
+
input = apply_input_schema(input, config_schema + input_schema)
|
99
|
+
output = if webhook_notification?
|
100
|
+
webhook_notification(input, payload, input_schema, output_schema, headers, params)
|
101
|
+
else
|
102
|
+
poll(nil, input, nil, input_schema, output_schema)
|
103
|
+
end
|
104
|
+
output[:events].each do |event|
|
105
|
+
apply_output_schema(event, output_schema)
|
106
|
+
end
|
107
|
+
|
108
|
+
output
|
109
|
+
end
|
110
|
+
|
111
|
+
private
|
112
|
+
|
92
113
|
alias trigger operation
|
114
|
+
|
115
|
+
def webhook_notification?
|
116
|
+
trigger[:webhook_notification].present?
|
117
|
+
end
|
93
118
|
end
|
94
119
|
end
|
95
120
|
end
|
@@ -98,7 +98,7 @@ module Workato
|
|
98
98
|
alias encode_hex to_hex
|
99
99
|
|
100
100
|
def decode_hex
|
101
|
-
Binary.new([self].pack('H*'))
|
101
|
+
Extension::Binary.new([self].pack('H*'))
|
102
102
|
end
|
103
103
|
|
104
104
|
def encode_base64
|
@@ -106,7 +106,7 @@ module Workato
|
|
106
106
|
end
|
107
107
|
|
108
108
|
def decode_base64
|
109
|
-
Binary.new(Base64.decode64(self))
|
109
|
+
Extension::Binary.new(Base64.decode64(self))
|
110
110
|
end
|
111
111
|
|
112
112
|
def encode_urlsafe_base64
|
@@ -118,21 +118,27 @@ module Workato
|
|
118
118
|
end
|
119
119
|
|
120
120
|
def decode_urlsafe_base64
|
121
|
-
Binary.new(Base64.urlsafe_decode64(self))
|
121
|
+
Extension::Binary.new(Base64.urlsafe_decode64(self))
|
122
122
|
end
|
123
123
|
|
124
124
|
def encode_sha256
|
125
|
-
Binary.new(::Digest::SHA256.digest(self))
|
125
|
+
Extension::Binary.new(::Digest::SHA256.digest(self))
|
126
126
|
end
|
127
127
|
|
128
128
|
def hmac_sha256(key)
|
129
129
|
digest = ::OpenSSL::Digest.new('sha256')
|
130
|
-
Binary.new(::OpenSSL::HMAC.digest(digest, key, self))
|
130
|
+
Extension::Binary.new(::OpenSSL::HMAC.digest(digest, key, self))
|
131
131
|
end
|
132
132
|
|
133
133
|
def hmac_sha512(key)
|
134
134
|
digest = ::OpenSSL::Digest.new('sha512')
|
135
|
-
Binary.new(::OpenSSL::HMAC.digest(digest, key, self))
|
135
|
+
Extension::Binary.new(::OpenSSL::HMAC.digest(digest, key, self))
|
136
|
+
end
|
137
|
+
|
138
|
+
def rsa_sha256(key)
|
139
|
+
digest = ::OpenSSL::Digest.new('sha256')
|
140
|
+
private_key = ::OpenSSL::PKey::RSA.new(key)
|
141
|
+
Workato::Extension::Binary.new(private_key.sign(digest, self))
|
136
142
|
end
|
137
143
|
|
138
144
|
def md5_hexdigest
|
@@ -140,17 +146,17 @@ module Workato
|
|
140
146
|
end
|
141
147
|
|
142
148
|
def sha1
|
143
|
-
Binary.new(::Digest::SHA1.digest(self))
|
149
|
+
Extension::Binary.new(::Digest::SHA1.digest(self))
|
144
150
|
end
|
145
151
|
|
146
152
|
def hmac_sha1(key)
|
147
153
|
digest = ::OpenSSL::Digest.new('sha1')
|
148
|
-
Binary.new(::OpenSSL::HMAC.digest(digest, key, self))
|
154
|
+
Extension::Binary.new(::OpenSSL::HMAC.digest(digest, key, self))
|
149
155
|
end
|
150
156
|
|
151
157
|
def hmac_md5(key)
|
152
158
|
digest = ::OpenSSL::Digest.new('md5')
|
153
|
-
Binary.new(::OpenSSL::HMAC.digest(digest, key, self))
|
159
|
+
Extension::Binary.new(::OpenSSL::HMAC.digest(digest, key, self))
|
154
160
|
end
|
155
161
|
|
156
162
|
def from_xml
|
@@ -228,7 +234,7 @@ module Workato
|
|
228
234
|
end
|
229
235
|
|
230
236
|
def as_string(encoding)
|
231
|
-
String.new(self, encoding: encoding).encode(encoding, invalid: :replace, undef: :replace)
|
237
|
+
::String.new(self, encoding: encoding).encode(encoding, invalid: :replace, undef: :replace)
|
232
238
|
end
|
233
239
|
|
234
240
|
def as_utf8
|
@@ -5,9 +5,15 @@ RSpec.describe 'actions/<%= name %>', :vcr do
|
|
5
5
|
# Spec describes the most commons blocks of an action. Remove describes that you don't need.
|
6
6
|
# Learn more: https://docs.workato.com/developing-connectors/sdk/cli/reference/rspec-commands.html
|
7
7
|
|
8
|
+
subject(:output) { connector.actions.<%= name %>(input) }
|
9
|
+
|
8
10
|
let(:connector) { Workato::Connector::Sdk::Connector.from_file('connector.rb', settings) }
|
9
11
|
let(:settings) { Workato::Connector::Sdk::Settings.from_default_file }
|
12
|
+
let(:input) { {} }
|
13
|
+
|
14
|
+
pending 'add some examples for action output'
|
10
15
|
|
16
|
+
# Or add more fine grained tests for each action definition block
|
11
17
|
let(:action) { connector.actions.<%= name %> }
|
12
18
|
|
13
19
|
describe 'execute' do
|
@@ -6,9 +6,15 @@ RSpec.describe 'triggers/<%= name %>', :vcr do
|
|
6
6
|
# Depending on the type of your trigger remove describes that you don't need.
|
7
7
|
# Learn more: https://docs.workato.com/developing-connectors/sdk/cli/reference/rspec-commands.html
|
8
8
|
|
9
|
+
subject(:output) { connector.triggers.<%= name %>(input) }
|
10
|
+
|
9
11
|
let(:connector) { Workato::Connector::Sdk::Connector.from_file('connector.rb', settings) }
|
10
12
|
let(:settings) { Workato::Connector::Sdk::Settings.from_default_file }
|
13
|
+
let(:input) { {} }
|
14
|
+
|
15
|
+
pending 'add some examples for trigger output'
|
11
16
|
|
17
|
+
# Or add more fine grained tests for each trigger definition block
|
12
18
|
let(:trigger) { connector.triggers.<%= name %> }
|
13
19
|
|
14
20
|
describe 'webhook_subscribe' do
|
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: 0.
|
4
|
+
version: 0.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: 2021-
|
11
|
+
date: 2021-12-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -386,6 +386,17 @@ files:
|
|
386
386
|
- lib/workato/connector/sdk/object_definitions.rb
|
387
387
|
- lib/workato/connector/sdk/operation.rb
|
388
388
|
- lib/workato/connector/sdk/request.rb
|
389
|
+
- lib/workato/connector/sdk/schema.rb
|
390
|
+
- lib/workato/connector/sdk/schema/field/array.rb
|
391
|
+
- lib/workato/connector/sdk/schema/field/convertors.rb
|
392
|
+
- lib/workato/connector/sdk/schema/field/date.rb
|
393
|
+
- lib/workato/connector/sdk/schema/field/date_time.rb
|
394
|
+
- lib/workato/connector/sdk/schema/field/integer.rb
|
395
|
+
- lib/workato/connector/sdk/schema/field/number.rb
|
396
|
+
- lib/workato/connector/sdk/schema/field/object.rb
|
397
|
+
- lib/workato/connector/sdk/schema/field/string.rb
|
398
|
+
- lib/workato/connector/sdk/schema/type/time.rb
|
399
|
+
- lib/workato/connector/sdk/schema/type/unicode_string.rb
|
389
400
|
- lib/workato/connector/sdk/settings.rb
|
390
401
|
- lib/workato/connector/sdk/summarize.rb
|
391
402
|
- lib/workato/connector/sdk/trigger.rb
|
@@ -442,8 +453,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
442
453
|
- !ruby/object:Gem::Version
|
443
454
|
version: '0'
|
444
455
|
requirements: []
|
445
|
-
|
446
|
-
rubygems_version: 2.6.14.4
|
456
|
+
rubygems_version: 3.2.3
|
447
457
|
signing_key:
|
448
458
|
specification_version: 4
|
449
459
|
summary: Gem for running adapter's code outside Workato infrastructure
|