workato-connector-sdk 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +57 -30
- data/exe/workato +12 -1
- data/lib/workato/cli/edit_command.rb +1 -3
- data/lib/workato/cli/exec_command.rb +21 -5
- data/lib/workato/cli/generate_command.rb +1 -2
- data/lib/workato/cli/generators/connector_generator.rb +4 -1
- data/lib/workato/cli/main.rb +50 -3
- data/lib/workato/cli/oauth2_command.rb +180 -0
- data/lib/workato/cli/push_command.rb +36 -24
- data/lib/workato/connector/sdk/action.rb +52 -4
- data/lib/workato/connector/sdk/connection.rb +144 -0
- data/lib/workato/connector/sdk/connector.rb +24 -9
- data/lib/workato/connector/sdk/dsl/time.rb +8 -1
- 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/object_definitions.rb +10 -10
- data/lib/workato/connector/sdk/operation.rb +37 -39
- data/lib/workato/connector/sdk/request.rb +11 -7
- 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/settings.rb +6 -3
- data/lib/workato/connector/sdk/trigger.rb +25 -0
- data/lib/workato/connector/sdk/version.rb +1 -1
- data/lib/workato/connector/sdk.rb +1 -0
- data/lib/workato/extension/string.rb +16 -10
- data/lib/workato/web/app.rb +23 -0
- data/templates/Gemfile.erb +1 -0
- data/templates/spec/action_spec.rb.erb +7 -1
- data/templates/spec/trigger_spec.rb.erb +6 -0
- metadata +95 -7
@@ -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
|
@@ -16,21 +17,23 @@ module Workato
|
|
16
17
|
|
17
18
|
cattr_accessor :on_settings_updated
|
18
19
|
|
19
|
-
def initialize(
|
20
|
-
@
|
20
|
+
def initialize(connection:, operation: {}, methods: {}, settings: {}, object_definitions: nil)
|
21
|
+
@connection = connection
|
22
|
+
@settings = settings
|
21
23
|
@operation = operation.with_indifferent_access
|
22
|
-
@connection = connection.with_indifferent_access
|
23
24
|
@_methods = methods.with_indifferent_access
|
24
25
|
@object_definitions = object_definitions
|
25
26
|
end
|
26
27
|
|
27
|
-
def execute(settings = nil, input = {}, extended_input_schema = [], extended_output_schema = [],
|
28
|
+
def execute(settings = nil, input = {}, extended_input_schema = [], extended_output_schema = [], continue = {},
|
29
|
+
&block)
|
28
30
|
@settings = settings.with_indifferent_access if settings # is being used in request for refresh tokens
|
29
31
|
request_or_result = instance_exec(
|
30
32
|
@settings.with_indifferent_access, # a copy of settings hash is being used in executable blocks
|
31
33
|
input.with_indifferent_access,
|
32
34
|
Array.wrap(extended_input_schema).map(&:with_indifferent_access),
|
33
35
|
Array.wrap(extended_output_schema).map(&:with_indifferent_access),
|
36
|
+
continue.with_indifferent_access,
|
34
37
|
&block
|
35
38
|
)
|
36
39
|
resolve_request(request_or_result)
|
@@ -69,9 +72,9 @@ module Workato
|
|
69
72
|
def refresh_authorization!(http_code, http_body, exception, settings = {})
|
70
73
|
return unless refresh_auth?(http_code, http_body, exception)
|
71
74
|
|
72
|
-
new_settings = if /oauth2/i =~ connection
|
75
|
+
new_settings = if /oauth2/i =~ connection.authorization.type
|
73
76
|
refresh_oauth2_token(settings)
|
74
|
-
elsif connection
|
77
|
+
elsif connection.authorization.acquire?
|
75
78
|
acquire_token(settings)
|
76
79
|
end
|
77
80
|
return unless new_settings
|
@@ -85,6 +88,23 @@ module Workato
|
|
85
88
|
|
86
89
|
private
|
87
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
|
+
|
88
108
|
def summarize(data, paths)
|
89
109
|
return data unless paths.present?
|
90
110
|
|
@@ -92,7 +112,7 @@ module Workato
|
|
92
112
|
end
|
93
113
|
|
94
114
|
def schema_fields(object_definitions_hash, settings, config_fields, &schema_proc)
|
95
|
-
return
|
115
|
+
return [] unless schema_proc
|
96
116
|
|
97
117
|
execute(settings, config_fields) do |connection, input|
|
98
118
|
instance_exec(
|
@@ -132,7 +152,7 @@ module Workato
|
|
132
152
|
end
|
133
153
|
|
134
154
|
def refresh_auth?(http_code, http_body, exception)
|
135
|
-
refresh_on =
|
155
|
+
refresh_on = connection.authorization.refresh_on
|
136
156
|
refresh_on.blank? || refresh_on.any? do |pattern|
|
137
157
|
pattern.is_a?(::Integer) && pattern == http_code ||
|
138
158
|
pattern === exception&.to_s ||
|
@@ -141,48 +161,26 @@ module Workato
|
|
141
161
|
end
|
142
162
|
|
143
163
|
def acquire_token(settings)
|
144
|
-
|
145
|
-
raise InvalidDefinitionError, "'acquire' block is required for authorization" unless acquire
|
146
|
-
|
147
|
-
Action.new(
|
148
|
-
action: {
|
149
|
-
execute: ->(connection) { instance_exec(connection, &acquire) }
|
150
|
-
},
|
151
|
-
connection: connection.merge(
|
152
|
-
authorization: connection[:authorization].merge(
|
153
|
-
apply: nil
|
154
|
-
)
|
155
|
-
),
|
156
|
-
methods: @_methods
|
157
|
-
).execute(settings)
|
164
|
+
connection.authorization.acquire(settings)
|
158
165
|
end
|
159
166
|
|
160
167
|
def refresh_oauth2_token_using_refresh(settings)
|
161
|
-
|
162
|
-
new_tokens, new_settings = Action.new(
|
163
|
-
action: {
|
164
|
-
execute: lambda do |connection|
|
165
|
-
instance_exec(connection, connection[:refresh_token], &refresh)
|
166
|
-
end
|
167
|
-
},
|
168
|
-
methods: @_methods
|
169
|
-
).execute(settings)
|
170
|
-
|
168
|
+
new_tokens, new_settings = connection.authorization.refresh(settings, settings[:refresh_token])
|
171
169
|
new_tokens.with_indifferent_access.merge(new_settings || {})
|
172
170
|
end
|
173
171
|
|
174
172
|
def refresh_oauth2_token_using_token_url(settings)
|
175
173
|
if settings[:refresh_token].blank?
|
176
|
-
raise NotImplementedError, '
|
177
|
-
'Use
|
174
|
+
raise NotImplementedError, 'refresh_token is empty. ' \
|
175
|
+
'Use workato oauth2 command to acquire access_token and refresh_token'
|
178
176
|
end
|
179
177
|
|
180
178
|
response = RestClient::Request.execute(
|
181
|
-
url: connection
|
179
|
+
url: connection.authorization.token_url(settings),
|
182
180
|
method: :post,
|
183
181
|
payload: {
|
184
|
-
client_id: connection
|
185
|
-
client_secret: connection
|
182
|
+
client_id: connection.authorization.client_id(settings),
|
183
|
+
client_secret: connection.authorization.client_secret(settings),
|
186
184
|
grant_type: :refresh_token,
|
187
185
|
refresh_token: settings[:refresh_token]
|
188
186
|
},
|
@@ -198,9 +196,9 @@ module Workato
|
|
198
196
|
end
|
199
197
|
|
200
198
|
def refresh_oauth2_token(settings)
|
201
|
-
if connection
|
199
|
+
if connection.authorization.refresh?
|
202
200
|
refresh_oauth2_token_using_refresh(settings)
|
203
|
-
elsif connection
|
201
|
+
elsif connection.authorization.token_url?
|
204
202
|
refresh_oauth2_token_using_token_url(settings)
|
205
203
|
else
|
206
204
|
raise InvalidDefinitionError, "'refresh' block or 'token_url' is required for refreshing the token"
|
@@ -15,13 +15,13 @@ module Workato
|
|
15
15
|
class Request < SimpleDelegator
|
16
16
|
using BlockInvocationRefinements
|
17
17
|
|
18
|
-
def initialize(uri, method: 'GET',
|
18
|
+
def initialize(uri, method: 'GET', settings: {}, connection: nil, action: nil)
|
19
19
|
super(nil)
|
20
20
|
@uri = uri
|
21
|
-
@authorization = (connection[:authorization] || {}).with_indifferent_access
|
22
|
-
@settings = settings
|
23
|
-
@base_uri = connection[:base_uri]&.call(settings.with_indifferent_access)
|
24
21
|
@method = method
|
22
|
+
@settings = settings
|
23
|
+
@authorization = connection&.authorization
|
24
|
+
@base_uri = connection&.base_uri(settings)
|
25
25
|
@action = action
|
26
26
|
@headers = {}
|
27
27
|
@case_sensitive_headers = {}
|
@@ -321,7 +321,9 @@ module Workato
|
|
321
321
|
end
|
322
322
|
|
323
323
|
def detect_error!(response)
|
324
|
-
|
324
|
+
return unless @authorization
|
325
|
+
|
326
|
+
error_patterns = @authorization.detect_on
|
325
327
|
return unless error_patterns.any? { |pattern| pattern === response rescue false }
|
326
328
|
|
327
329
|
Kernel.raise(CustomRequestError, response.to_s)
|
@@ -357,13 +359,15 @@ module Workato
|
|
357
359
|
end
|
358
360
|
|
359
361
|
def authorized
|
360
|
-
|
362
|
+
return yield unless @authorization
|
363
|
+
|
364
|
+
apply = @authorization.source[:apply] || @authorization.source[:credentials]
|
361
365
|
return yield unless apply
|
362
366
|
|
363
367
|
first = true
|
364
368
|
begin
|
365
369
|
settings = @settings.with_indifferent_access
|
366
|
-
if /oauth2/i =~ @authorization
|
370
|
+
if /oauth2/i =~ @authorization.type
|
367
371
|
instance_exec(settings, settings[:access_token], @auth_type, &apply)
|
368
372
|
else
|
369
373
|
instance_exec(settings, @auth_type, &apply)
|
@@ -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
|