workato-connector-sdk 0.1.1 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- 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 +23 -7
- 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/aws.rb +225 -0
- data/lib/workato/connector/sdk/dsl/error.rb +1 -1
- data/lib/workato/connector/sdk/dsl/http.rb +19 -0
- data/lib/workato/connector/sdk/dsl/time.rb +8 -1
- data/lib/workato/connector/sdk/dsl/workato_code_lib.rb +21 -4
- data/lib/workato/connector/sdk/dsl.rb +2 -0
- data/lib/workato/connector/sdk/errors.rb +16 -1
- data/lib/workato/connector/sdk/object_definitions.rb +10 -10
- data/lib/workato/connector/sdk/operation.rb +38 -40
- 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 +20 -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 +102 -4
@@ -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'
|
@@ -45,6 +45,8 @@ module Workato
|
|
45
45
|
begin
|
46
46
|
@encrypted = false
|
47
47
|
read_plain_file
|
48
|
+
rescue KeyError
|
49
|
+
raise
|
48
50
|
rescue StandardError
|
49
51
|
@encrypted = true
|
50
52
|
read_encrypted_file
|
@@ -76,7 +78,7 @@ module Workato
|
|
76
78
|
YAML.safe_load(f.read, [::Symbol]).to_hash.with_indifferent_access
|
77
79
|
end
|
78
80
|
|
79
|
-
name ? all_settings.fetch(name) : all_settings
|
81
|
+
(name ? all_settings.fetch(name) : all_settings) || {}
|
80
82
|
end
|
81
83
|
|
82
84
|
def update_plain_file(new_settings)
|
@@ -93,7 +95,7 @@ module Workato
|
|
93
95
|
def read_encrypted_file
|
94
96
|
all_settings = encrypted_configuration.config.with_indifferent_access
|
95
97
|
|
96
|
-
name ? all_settings.fetch(name) : all_settings
|
98
|
+
(name ? all_settings.fetch(name) : all_settings) || {}
|
97
99
|
end
|
98
100
|
|
99
101
|
def update_encrypted_file(new_settings)
|
@@ -106,7 +108,8 @@ module Workato
|
|
106
108
|
|
107
109
|
def merge_settings(all_settings, new_settings)
|
108
110
|
if name
|
109
|
-
all_settings[name]
|
111
|
+
all_settings[name] ||= {}
|
112
|
+
all_settings[name].merge!(new_settings)
|
110
113
|
else
|
111
114
|
all_settings.merge!(new_settings)
|
112
115
|
end
|
@@ -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
|
@@ -43,6 +43,7 @@ require_relative '../extension/time'
|
|
43
43
|
|
44
44
|
require_relative './sdk/account_properties'
|
45
45
|
require_relative './sdk/action'
|
46
|
+
require_relative './sdk/connection'
|
46
47
|
require_relative './sdk/connector'
|
47
48
|
require_relative './sdk/dsl'
|
48
49
|
require_relative './sdk/errors'
|
@@ -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
|
@@ -117,22 +117,32 @@ module Workato
|
|
117
117
|
::ERB::Util.url_encode(self)
|
118
118
|
end
|
119
119
|
|
120
|
+
def decode_url
|
121
|
+
CGI.unescape(self)
|
122
|
+
end
|
123
|
+
|
120
124
|
def decode_urlsafe_base64
|
121
|
-
Binary.new(Base64.urlsafe_decode64(self))
|
125
|
+
Extension::Binary.new(Base64.urlsafe_decode64(self))
|
122
126
|
end
|
123
127
|
|
124
128
|
def encode_sha256
|
125
|
-
Binary.new(::Digest::SHA256.digest(self))
|
129
|
+
Extension::Binary.new(::Digest::SHA256.digest(self))
|
126
130
|
end
|
127
131
|
|
128
132
|
def hmac_sha256(key)
|
129
133
|
digest = ::OpenSSL::Digest.new('sha256')
|
130
|
-
Binary.new(::OpenSSL::HMAC.digest(digest, key, self))
|
134
|
+
Extension::Binary.new(::OpenSSL::HMAC.digest(digest, key, self))
|
131
135
|
end
|
132
136
|
|
133
137
|
def hmac_sha512(key)
|
134
138
|
digest = ::OpenSSL::Digest.new('sha512')
|
135
|
-
Binary.new(::OpenSSL::HMAC.digest(digest, key, self))
|
139
|
+
Extension::Binary.new(::OpenSSL::HMAC.digest(digest, key, self))
|
140
|
+
end
|
141
|
+
|
142
|
+
def rsa_sha256(key)
|
143
|
+
digest = ::OpenSSL::Digest.new('sha256')
|
144
|
+
private_key = ::OpenSSL::PKey::RSA.new(key)
|
145
|
+
Workato::Extension::Binary.new(private_key.sign(digest, self))
|
136
146
|
end
|
137
147
|
|
138
148
|
def md5_hexdigest
|
@@ -140,17 +150,17 @@ module Workato
|
|
140
150
|
end
|
141
151
|
|
142
152
|
def sha1
|
143
|
-
Binary.new(::Digest::SHA1.digest(self))
|
153
|
+
Extension::Binary.new(::Digest::SHA1.digest(self))
|
144
154
|
end
|
145
155
|
|
146
156
|
def hmac_sha1(key)
|
147
157
|
digest = ::OpenSSL::Digest.new('sha1')
|
148
|
-
Binary.new(::OpenSSL::HMAC.digest(digest, key, self))
|
158
|
+
Extension::Binary.new(::OpenSSL::HMAC.digest(digest, key, self))
|
149
159
|
end
|
150
160
|
|
151
161
|
def hmac_md5(key)
|
152
162
|
digest = ::OpenSSL::Digest.new('md5')
|
153
|
-
Binary.new(::OpenSSL::HMAC.digest(digest, key, self))
|
163
|
+
Extension::Binary.new(::OpenSSL::HMAC.digest(digest, key, self))
|
154
164
|
end
|
155
165
|
|
156
166
|
def from_xml
|
@@ -228,7 +238,7 @@ module Workato
|
|
228
238
|
end
|
229
239
|
|
230
240
|
def as_string(encoding)
|
231
|
-
String.new(self, encoding: encoding).encode(encoding, invalid: :replace, undef: :replace)
|
241
|
+
::String.new(self, encoding: encoding).encode(encoding, invalid: :replace, undef: :replace)
|
232
242
|
end
|
233
243
|
|
234
244
|
def as_utf8
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Workato
|
4
|
+
module Web
|
5
|
+
class App
|
6
|
+
CODE_PATH = '/code'
|
7
|
+
CALLBACK_PATH = '/oauth/callback'
|
8
|
+
|
9
|
+
def call(env)
|
10
|
+
req = Rack::Request.new(env)
|
11
|
+
case req.path_info
|
12
|
+
when /#{CODE_PATH}/
|
13
|
+
[200, { 'Content-Type' => 'text/plain' }, [@code.to_s]]
|
14
|
+
when /#{CALLBACK_PATH}/
|
15
|
+
@code = req.params['code']
|
16
|
+
[200, { 'Content-Type' => 'text/plain' }, ['We stored response code. Now you can close the browser window']]
|
17
|
+
else
|
18
|
+
[404, { 'Content-Type' => 'text/plain' }, ['404: Not Found']]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/templates/Gemfile.erb
CHANGED
@@ -5,13 +5,19 @@ 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
|
14
|
-
subject(:output) { action.execute(settings, input, extended_input_schema, extended_output_schema) }
|
20
|
+
subject(:output) { action.execute(settings, input, extended_input_schema, extended_output_schema, continue) }
|
15
21
|
|
16
22
|
pending 'add some examples'
|
17
23
|
end
|
@@ -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
|