workato-connector-sdk 0.5.0 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +44 -24
  3. data/lib/workato/cli/edit_command.rb +4 -3
  4. data/lib/workato/cli/exec_command.rb +24 -35
  5. data/lib/workato/cli/generate_command.rb +4 -3
  6. data/lib/workato/cli/generators/connector_generator.rb +1 -0
  7. data/lib/workato/cli/generators/master_key_generator.rb +1 -0
  8. data/lib/workato/cli/main.rb +4 -2
  9. data/lib/workato/cli/oauth2_command.rb +6 -5
  10. data/lib/workato/cli/push_command.rb +5 -4
  11. data/lib/workato/cli/schema_command.rb +4 -3
  12. data/lib/workato/connector/sdk/account_properties.rb +1 -0
  13. data/lib/workato/connector/sdk/action.rb +78 -20
  14. data/lib/workato/connector/sdk/block_invocation_refinements.rb +1 -0
  15. data/lib/workato/connector/sdk/connection.rb +202 -44
  16. data/lib/workato/connector/sdk/connector.rb +200 -65
  17. data/lib/workato/connector/sdk/dsl/account_property.rb +1 -0
  18. data/lib/workato/connector/sdk/dsl/aws.rb +23 -27
  19. data/lib/workato/connector/sdk/dsl/call.rb +1 -0
  20. data/lib/workato/connector/sdk/dsl/error.rb +1 -0
  21. data/lib/workato/connector/sdk/dsl/http.rb +2 -7
  22. data/lib/workato/connector/sdk/dsl/lookup_table.rb +1 -0
  23. data/lib/workato/connector/sdk/dsl/time.rb +6 -0
  24. data/lib/workato/connector/sdk/dsl/workato_code_lib.rb +38 -0
  25. data/lib/workato/connector/sdk/dsl/workato_schema.rb +1 -0
  26. data/lib/workato/connector/sdk/dsl.rb +19 -4
  27. data/lib/workato/connector/sdk/errors.rb +4 -3
  28. data/lib/workato/connector/sdk/lookup_tables.rb +1 -0
  29. data/lib/workato/connector/sdk/object_definitions.rb +7 -8
  30. data/lib/workato/connector/sdk/operation.rb +127 -88
  31. data/lib/workato/connector/sdk/request.rb +45 -17
  32. data/lib/workato/connector/sdk/schema/field/array.rb +1 -0
  33. data/lib/workato/connector/sdk/schema/field/convertors.rb +1 -0
  34. data/lib/workato/connector/sdk/schema/field/date.rb +1 -0
  35. data/lib/workato/connector/sdk/schema/field/date_time.rb +1 -0
  36. data/lib/workato/connector/sdk/schema/field/integer.rb +1 -0
  37. data/lib/workato/connector/sdk/schema/field/number.rb +1 -0
  38. data/lib/workato/connector/sdk/schema/field/object.rb +1 -0
  39. data/lib/workato/connector/sdk/schema/field/string.rb +1 -0
  40. data/lib/workato/connector/sdk/schema/type/time.rb +1 -0
  41. data/lib/workato/connector/sdk/schema/type/unicode_string.rb +1 -0
  42. data/lib/workato/connector/sdk/schema.rb +1 -0
  43. data/lib/workato/connector/sdk/settings.rb +9 -4
  44. data/lib/workato/connector/sdk/summarize.rb +3 -2
  45. data/lib/workato/connector/sdk/trigger.rb +112 -18
  46. data/lib/workato/connector/sdk/version.rb +2 -1
  47. data/lib/workato/connector/sdk/workato_schemas.rb +1 -0
  48. data/lib/workato/connector/sdk/xml.rb +1 -0
  49. data/lib/workato/connector/sdk.rb +4 -0
  50. data/lib/workato/extension/array.rb +1 -0
  51. data/lib/workato/extension/case_sensitive_headers.rb +1 -0
  52. data/lib/workato/extension/currency.rb +1 -0
  53. data/lib/workato/extension/date.rb +1 -0
  54. data/lib/workato/extension/enumerable.rb +1 -0
  55. data/lib/workato/extension/extra_chain_cert.rb +1 -0
  56. data/lib/workato/extension/hash.rb +1 -0
  57. data/lib/workato/extension/integer.rb +1 -0
  58. data/lib/workato/extension/nil_class.rb +1 -0
  59. data/lib/workato/extension/object.rb +1 -0
  60. data/lib/workato/extension/phone.rb +1 -0
  61. data/lib/workato/extension/string.rb +9 -15
  62. data/lib/workato/extension/symbol.rb +1 -0
  63. data/lib/workato/extension/time.rb +1 -0
  64. data/lib/workato/testing/vcr_encrypted_cassette_serializer.rb +5 -0
  65. data/lib/workato/testing/vcr_multipart_body_matcher.rb +1 -0
  66. data/lib/workato/web/app.rb +1 -0
  67. data/lib/workato-connector-sdk.rb +1 -0
  68. metadata +64 -7
@@ -1,3 +1,4 @@
1
+ # typed: strict
1
2
  # frozen_string_literal: true
2
3
 
3
4
  require 'securerandom'
@@ -5,19 +6,41 @@ require 'securerandom'
5
6
  module Workato
6
7
  module Connector
7
8
  module Sdk
9
+ module SorbetTypes
10
+ WebhookSubscribeOutputHash = T.type_alias { T::Hash[T.any(String, Symbol), T.untyped] }
11
+ end
12
+
8
13
  class Trigger < Operation
9
14
  using BlockInvocationRefinements
10
15
 
11
- def initialize(trigger:, connection: {}, methods: {}, settings: {}, object_definitions: nil)
16
+ sig do
17
+ params(
18
+ trigger: SorbetTypes::SourceHash,
19
+ methods: SorbetTypes::SourceHash,
20
+ connection: Connection,
21
+ object_definitions: T.nilable(ObjectDefinitions)
22
+ ).void
23
+ end
24
+ def initialize(trigger:, methods: {}, connection: Connection.new, object_definitions: nil)
12
25
  super(
13
26
  operation: trigger,
14
27
  connection: connection,
15
28
  methods: methods,
16
- settings: settings,
17
29
  object_definitions: object_definitions
18
30
  )
19
31
  end
20
32
 
33
+ sig do
34
+ params(
35
+ settings: T.nilable(SorbetTypes::SettingsHash),
36
+ input: SorbetTypes::OperationInputHash,
37
+ closure: T.untyped,
38
+ extended_input_schema: SorbetTypes::OperationSchema,
39
+ extended_output_schema: SorbetTypes::OperationSchema
40
+ ).returns(
41
+ HashWithIndifferentAccess
42
+ )
43
+ end
21
44
  def poll_page(settings = nil, input = {}, closure = nil, extended_input_schema = [],
22
45
  extended_output_schema = [])
23
46
  poll_proc = trigger[:poll]
@@ -34,8 +57,19 @@ module Workato
34
57
  output
35
58
  end
36
59
 
60
+ sig do
61
+ params(
62
+ settings: T.nilable(SorbetTypes::SettingsHash),
63
+ input: SorbetTypes::OperationInputHash,
64
+ closure: T.untyped,
65
+ extended_input_schema: SorbetTypes::OperationSchema,
66
+ extended_output_schema: SorbetTypes::OperationSchema
67
+ ).returns(
68
+ HashWithIndifferentAccess
69
+ )
70
+ end
37
71
  def poll(settings = nil, input = {}, closure = nil, extended_input_schema = [], extended_output_schema = [])
38
- events = []
72
+ events = T.let([], T::Array[T::Hash[T.any(String, Symbol), T.untyped]])
39
73
 
40
74
  loop do
41
75
  output = poll_page(settings, input, closure, extended_input_schema, extended_output_schema)
@@ -52,23 +86,60 @@ module Workato
52
86
  }.with_indifferent_access
53
87
  end
54
88
 
89
+ sig { params(input: SorbetTypes::OperationInputHash).returns(T.untyped) }
55
90
  def dedup(input = {})
56
91
  trigger[:dedup].call(input)
57
92
  end
58
93
 
59
- def webhook_notification(input = {}, payload = {}, extended_input_schema = [],
60
- extended_output_schema = [], headers = {}, params = {})
94
+ sig do
95
+ params(
96
+ input: SorbetTypes::OperationInputHash,
97
+ payload: T::Hash[T.any(String, Symbol), T.untyped],
98
+ extended_input_schema: SorbetTypes::OperationSchema,
99
+ extended_output_schema: SorbetTypes::OperationSchema,
100
+ headers: T::Hash[T.any(String, Symbol), T.untyped],
101
+ params: T::Hash[T.any(String, Symbol), T.untyped],
102
+ settings: T.nilable(SorbetTypes::SettingsHash),
103
+ webhook_subscribe_output: SorbetTypes::WebhookSubscribeOutputHash
104
+ ).returns(
105
+ HashWithIndifferentAccess
106
+ )
107
+ end
108
+ def webhook_notification(
109
+ input = {},
110
+ payload = {},
111
+ extended_input_schema = [],
112
+ extended_output_schema = [],
113
+ headers = {},
114
+ params = {},
115
+ settings = nil,
116
+ webhook_subscribe_output = {}
117
+ )
118
+ connection.merge_settings!(settings) if settings
61
119
  Dsl::WithDsl.execute(
120
+ connection,
62
121
  input.with_indifferent_access,
63
122
  payload.with_indifferent_access,
64
- extended_input_schema.map(&:with_indifferent_access),
65
- extended_output_schema.map(&:with_indifferent_access),
123
+ Array.wrap(extended_input_schema).map(&:with_indifferent_access),
124
+ Array.wrap(extended_output_schema).map(&:with_indifferent_access),
66
125
  headers.with_indifferent_access,
67
126
  params.with_indifferent_access,
127
+ connection.settings,
128
+ webhook_subscribe_output.with_indifferent_access,
68
129
  &trigger[:webhook_notification]
69
- )
130
+ ).with_indifferent_access
70
131
  end
71
132
 
133
+ sig do
134
+ params(
135
+ webhook_url: String,
136
+ settings: T.nilable(SorbetTypes::SettingsHash),
137
+ input: SorbetTypes::OperationInputHash,
138
+ recipe_id: String
139
+ ).returns(
140
+ SorbetTypes::WebhookSubscribeOutputHash
141
+ )
142
+ end
72
143
  def webhook_subscribe(webhook_url = '', settings = nil, input = {}, recipe_id = SecureRandom.uuid)
73
144
  webhook_subscribe_proc = trigger[:webhook_subscribe]
74
145
  execute(settings, { input: input, webhook_url: webhook_url, recipe_id: recipe_id }) do |connection, payload|
@@ -82,6 +153,7 @@ module Workato
82
153
  end
83
154
  end
84
155
 
156
+ sig { params(webhook_subscribe_output: SorbetTypes::WebhookSubscribeOutputHash).returns(T.untyped) }
85
157
  def webhook_unsubscribe(webhook_subscribe_output = {})
86
158
  webhook_unsubscribe_proc = trigger[:webhook_unsubscribe]
87
159
  execute(nil, webhook_subscribe_output) do |_connection, input|
@@ -89,29 +161,51 @@ module Workato
89
161
  end
90
162
  end
91
163
 
92
- def invoke(input = {}, payload = {}, headers = {}, params = {})
164
+ sig do
165
+ params(
166
+ input: SorbetTypes::OperationInputHash,
167
+ payload: T::Hash[T.any(String, Symbol), T.untyped],
168
+ headers: T::Hash[T.any(String, Symbol), T.untyped],
169
+ params: T::Hash[T.any(String, Symbol), T.untyped],
170
+ webhook_subscribe_output: SorbetTypes::WebhookSubscribeOutputHash
171
+ ).returns(
172
+ T::Hash[T.any(String, Symbol), T.untyped]
173
+ )
174
+ end
175
+ def invoke(input = {}, payload = {}, headers = {}, params = {}, webhook_subscribe_output = {})
93
176
  extended_schema = extended_schema(nil, input)
94
177
  config_schema = Schema.new(schema: config_fields_schema)
95
178
  input_schema = Schema.new(schema: extended_schema[:input])
96
179
  output_schema = Schema.new(schema: extended_schema[:output])
97
180
 
98
181
  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)
182
+ if webhook_notification?
183
+ webhook_notification(
184
+ input,
185
+ payload,
186
+ input_schema,
187
+ output_schema,
188
+ headers,
189
+ params,
190
+ nil,
191
+ webhook_subscribe_output
192
+ ).tap do |event|
193
+ apply_output_schema(event, output_schema)
194
+ end
195
+ else
196
+ output = poll(nil, input, nil, input_schema, output_schema)
197
+ output[:events].each do |event|
198
+ apply_output_schema(event, output_schema)
199
+ end
200
+ output
106
201
  end
107
-
108
- output
109
202
  end
110
203
 
111
204
  private
112
205
 
113
206
  alias trigger operation
114
207
 
208
+ sig { returns(T::Boolean) }
115
209
  def webhook_notification?
116
210
  trigger[:webhook_notification].present?
117
211
  end
@@ -1,9 +1,10 @@
1
+ # typed: strict
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Workato
4
5
  module Connector
5
6
  module Sdk
6
- VERSION = '0.5.0'
7
+ VERSION = '1.0.2'
7
8
  end
8
9
  end
9
10
  end
@@ -1,3 +1,4 @@
1
+ # typed: true
1
2
  # frozen_string_literal: true
2
3
 
3
4
  require 'json'
@@ -1,3 +1,4 @@
1
+ # typed: true
1
2
  # frozen_string_literal: true
2
3
 
3
4
  require 'nokogiri'
@@ -1,5 +1,9 @@
1
+ # typed: strict
1
2
  # frozen_string_literal: true
2
3
 
4
+ require 'sorbet-runtime'
5
+ ::Method.prepend(T::CompatibilityPatches::MethodExtensions)
6
+
3
7
  module Workato
4
8
  module Connector
5
9
  module Sdk
@@ -1,3 +1,4 @@
1
+ # typed: false
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Workato
@@ -1,3 +1,4 @@
1
+ # typed: false
1
2
  # frozen_string_literal: true
2
3
 
3
4
  require 'rest-client'
@@ -1,3 +1,4 @@
1
+ # typed: false
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Workato
@@ -1,3 +1,4 @@
1
+ # typed: false
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Workato
@@ -1,3 +1,4 @@
1
+ # typed: false
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Enumerable
@@ -1,3 +1,4 @@
1
+ # typed: true
1
2
  # frozen_string_literal: true
2
3
 
3
4
  require 'rest-client'
@@ -1,3 +1,4 @@
1
+ # typed: false
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Workato
@@ -1,3 +1,4 @@
1
+ # typed: true
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Workato
@@ -1,3 +1,4 @@
1
+ # typed: true
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Workato
@@ -1,3 +1,4 @@
1
+ # typed: false
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Workato
@@ -1,3 +1,4 @@
1
+ # typed: false
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Workato
@@ -1,3 +1,4 @@
1
+ # typed: false
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Workato
@@ -164,7 +165,7 @@ module Workato
164
165
  end
165
166
 
166
167
  def from_xml
167
- XML.parse_xml_to_hash self
168
+ Connector::Sdk::Xml.parse_xml_to_hash self
168
169
  end
169
170
 
170
171
  TO_COUNTRY_METHODS.each do |suffix|
@@ -229,6 +230,10 @@ module Workato
229
230
  self
230
231
  end
231
232
 
233
+ def to_json(_options = nil)
234
+ summary
235
+ end
236
+
232
237
  def binary?
233
238
  true
234
239
  end
@@ -245,19 +250,12 @@ module Workato
245
250
  as_string('utf-8')
246
251
  end
247
252
 
248
- # representation in event title
249
- def title
250
- if length.positive?
251
- "0x#{byteslice(0, TITLE_LENGTH).unpack1('H*')}#{bytesize > TITLE_LENGTH ? '…' : ''}"
252
- else
253
- ''
254
- end
255
- end
256
-
257
253
  def sha1
258
254
  Binary.new(::Digest::SHA1.digest(self))
259
255
  end
260
256
 
257
+ private
258
+
261
259
  def summary
262
260
  if length.positive?
263
261
  left = "0x#{byteslice(0, SUMMARY_LENGTH).unpack1('H*')}"
@@ -267,12 +265,8 @@ module Workato
267
265
  ''
268
266
  end
269
267
  end
270
-
271
- def self.from_base64(base64str)
272
- new(Base64.strict_decode64(base64str))
273
- end
274
268
  end
275
269
  end
276
270
  end
277
271
 
278
- String.include(Workato::Extension::String)
272
+ String.prepend(Workato::Extension::String)
@@ -1,3 +1,4 @@
1
+ # typed: false
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Workato
@@ -1,3 +1,4 @@
1
+ # typed: false
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Workato
@@ -1,3 +1,4 @@
1
+ # typed: true
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Workato
@@ -24,6 +25,7 @@ module Workato
24
25
  File.binread(content_path)
25
26
  ensure
26
27
  File.unlink(content_path) if content_path.exist?
28
+ @content_path = ''
27
29
  end
28
30
 
29
31
  def deserialize(string)
@@ -32,6 +34,9 @@ module Workato
32
34
  end
33
35
  File.write(@content_path, string)
34
36
  ::YAML.safe_load(read).presence || {}
37
+ ensure
38
+ File.unlink(content_path) if content_path.exist?
39
+ @content_path = ''
35
40
  end
36
41
  end
37
42
  end
@@ -1,3 +1,4 @@
1
+ # typed: true
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Workato
@@ -1,3 +1,4 @@
1
+ # typed: true
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Workato
@@ -1,3 +1,4 @@
1
+ # typed: strict
1
2
  # frozen_string_literal: true
2
3
 
3
4
  require_relative 'workato/connector/sdk'
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.5.0
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pavel Abolmasov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-04-11 00:00:00.000000000 Z
11
+ date: 2022-08-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - '='
95
95
  - !ruby/object:Gem::Version
96
96
  version: 1.3.1
97
+ - !ruby/object:Gem::Dependency
98
+ name: i18n
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '='
102
+ - !ruby/object:Gem::Version
103
+ version: 0.9.5
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '='
109
+ - !ruby/object:Gem::Version
110
+ version: 0.9.5
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: jwt
99
113
  requirement: !ruby/object:Gem::Requirement
@@ -128,14 +142,14 @@ dependencies:
128
142
  requirements:
129
143
  - - '='
130
144
  - !ruby/object:Gem::Version
131
- version: 2.14.0
145
+ version: 2.16.0
132
146
  type: :runtime
133
147
  prerelease: false
134
148
  version_requirements: !ruby/object:Gem::Requirement
135
149
  requirements:
136
150
  - - '='
137
151
  - !ruby/object:Gem::Version
138
- version: 2.14.0
152
+ version: 2.16.0
139
153
  - !ruby/object:Gem::Dependency
140
154
  name: net-http-digest_auth
141
155
  requirement: !ruby/object:Gem::Requirement
@@ -220,20 +234,48 @@ dependencies:
220
234
  - - "~>"
221
235
  - !ruby/object:Gem::Version
222
236
  version: '1.0'
237
+ - !ruby/object:Gem::Dependency
238
+ name: ruby_rncryptor
239
+ requirement: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - "~>"
242
+ - !ruby/object:Gem::Version
243
+ version: '3.0'
244
+ type: :runtime
245
+ prerelease: false
246
+ version_requirements: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - "~>"
249
+ - !ruby/object:Gem::Version
250
+ version: '3.0'
223
251
  - !ruby/object:Gem::Dependency
224
252
  name: rubyzip
225
253
  requirement: !ruby/object:Gem::Requirement
226
254
  requirements:
227
255
  - - "~>"
228
256
  - !ruby/object:Gem::Version
229
- version: '1.3'
257
+ version: '2.3'
258
+ type: :runtime
259
+ prerelease: false
260
+ version_requirements: !ruby/object:Gem::Requirement
261
+ requirements:
262
+ - - "~>"
263
+ - !ruby/object:Gem::Version
264
+ version: '2.3'
265
+ - !ruby/object:Gem::Dependency
266
+ name: sorbet-runtime
267
+ requirement: !ruby/object:Gem::Requirement
268
+ requirements:
269
+ - - "~>"
270
+ - !ruby/object:Gem::Version
271
+ version: '0.5'
230
272
  type: :runtime
231
273
  prerelease: false
232
274
  version_requirements: !ruby/object:Gem::Requirement
233
275
  requirements:
234
276
  - - "~>"
235
277
  - !ruby/object:Gem::Version
236
- version: '1.3'
278
+ version: '0.5'
237
279
  - !ruby/object:Gem::Dependency
238
280
  name: thor
239
281
  requirement: !ruby/object:Gem::Requirement
@@ -304,6 +346,20 @@ dependencies:
304
346
  - - "~>"
305
347
  - !ruby/object:Gem::Version
306
348
  version: '3.0'
349
+ - !ruby/object:Gem::Dependency
350
+ name: sorbet
351
+ requirement: !ruby/object:Gem::Requirement
352
+ requirements:
353
+ - - "~>"
354
+ - !ruby/object:Gem::Version
355
+ version: '0.5'
356
+ type: :development
357
+ prerelease: false
358
+ version_requirements: !ruby/object:Gem::Requirement
359
+ requirements:
360
+ - - "~>"
361
+ - !ruby/object:Gem::Version
362
+ version: '0.5'
307
363
  - !ruby/object:Gem::Dependency
308
364
  name: stub_server
309
365
  requirement: !ruby/object:Gem::Requirement
@@ -469,7 +525,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
469
525
  - !ruby/object:Gem::Version
470
526
  version: '0'
471
527
  requirements: []
472
- rubygems_version: 3.2.3
528
+ rubyforge_project:
529
+ rubygems_version: 2.6.14.4
473
530
  signing_key:
474
531
  specification_version: 4
475
532
  summary: Gem for running adapter's code outside Workato infrastructure