workato-connector-sdk 1.3.2 → 1.3.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3fe38da4979356285b7bd535a889ce87324c0c9e79af94ab64bbfbabff03f104
4
- data.tar.gz: 12ae318a25eaf1fddc7c31f22f9870d4af28e736781ef32ff766c32ae14876d2
3
+ metadata.gz: 9685f9ff505890441b060e537a1ecd932d1411eb340f88d467a099d86e0f2477
4
+ data.tar.gz: 04121dee1b0d2e9b64749e73269552631db9137e54cd6942438e4a1e039260c6
5
5
  SHA512:
6
- metadata.gz: 2737cef0c57c48dc215dba1f3077669935fceb940be5484469e3901f6d848bee8af5bc408595a14a330bc96e3e553f088c25323867dc8d43d1b95930275c79af
7
- data.tar.gz: 066b30f5e052e1dbd91c697b3e978ec548f0ffc76db9298168758e4b60f8ada8f1a13c1a603e0603d347e22fcca2e945fa3eeaedaa74139cef07b09b98b7c9ea
6
+ metadata.gz: 43c8e6dd0d6ccdbda9ddfa0c78dcd16923fe4700d6edda779a91d6b095158813caa491cc25585c3df6729864414b959009fe60d12489dbfbbf5c50e22a33c67a
7
+ data.tar.gz: 29bdd436e52361927397e37bdde770d244feee557c6038f426c73ba12b29aa231222655128acd3179c96c53cc327c9152bab019c38372b138cc485ef89835abc
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.3.2
1
+ 1.3.4
@@ -101,6 +101,7 @@ module Workato
101
101
  return unless @thread
102
102
 
103
103
  Rack::Handler::WEBrick.shutdown
104
+ @thread.join
104
105
  @thread.exit
105
106
  end
106
107
 
@@ -0,0 +1,4 @@
1
+ # typed: false
2
+ # frozen_string_literal: true
3
+ #
4
+ # This file is intentionally left blank. Do not remove
@@ -65,6 +65,13 @@ module Workato
65
65
  end
66
66
  def parse(str, headers:, col_sep: nil, row_sep: nil, quote_char: nil, skip_blanks: nil,
67
67
  skip_first_line: false)
68
+ if headers.is_a?(FalseClass)
69
+ raise Sdk::ArgumentError,
70
+ 'Headers are required. ' \
71
+ 'Pass headers: true to implicitly use the first line or array/string for explicit headers'
72
+
73
+ end
74
+
68
75
  if str.bytesize > MAX_FILE_SIZE_FOR_PARSE
69
76
  raise CsvFileTooBigError.new(str.bytesize, MAX_FILE_SIZE_FOR_PARSE)
70
77
  end
@@ -88,7 +95,7 @@ module Workato
88
95
  end.to_a
89
96
  rescue CSV::MalformedCSVError => e
90
97
  raise CsvFormatError, e
91
- rescue ArgumentError => e
98
+ rescue ::ArgumentError => e
92
99
  raise Sdk::ArgumentError, e.message
93
100
  end
94
101
 
@@ -111,7 +118,7 @@ module Workato
111
118
  options[:write_headers] = options[:headers].present?
112
119
 
113
120
  ::CSV.generate(str || String.new, **options, &blk)
114
- rescue ArgumentError => e
121
+ rescue ::ArgumentError => e
115
122
  raise Sdk::ArgumentError, e.message
116
123
  end
117
124
 
@@ -0,0 +1,58 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require 'resolv'
5
+
6
+ module Workato
7
+ module Connector
8
+ module Sdk
9
+ NetLookupError = Class.new(Error)
10
+
11
+ module Dsl
12
+ class NetPackage
13
+ extend T::Sig
14
+
15
+ sig { params(name: String, record: String).returns(T::Array[T::Hash[Symbol, T.untyped]]) }
16
+ def lookup(name, record)
17
+ case record.upcase
18
+ when 'A'
19
+ records = dns_resolver.getresources(name, Resolv::DNS::Resource::IN::A)
20
+ records.map { |d| { address: d.address.to_s } }
21
+ when 'SRV'
22
+ records = dns_resolver.getresources(name, Resolv::DNS::Resource::IN::SRV)
23
+ records.map do |d|
24
+ {
25
+ port: d.port,
26
+ priority: d.priority,
27
+ target: d.target.to_s,
28
+ weight: d.weight
29
+ }
30
+ end
31
+ else
32
+ raise Sdk::ArgumentError, 'Record type not supported, Supported types: "A", "SRV"'
33
+ end
34
+ rescue Resolv::ResolvError, Resolv::ResolvTimeout => e
35
+ raise NetLookupError, e
36
+ end
37
+
38
+ private
39
+
40
+ sig { returns(Resolv::DNS) }
41
+ def dns_resolver
42
+ @dns_resolver ||= T.let(Resolv::DNS.new, T.nilable(Resolv::DNS))
43
+ end
44
+
45
+ T::Sig::WithoutRuntime.sig { params(symbol: T.any(String, Symbol), _args: T.untyped).void }
46
+ def method_missing(symbol, *_args)
47
+ raise UndefinedStdLibMethodError.new(symbol.to_s, 'workato.net')
48
+ end
49
+
50
+ T::Sig::WithoutRuntime.sig { params(_args: T.untyped).returns(T::Boolean) }
51
+ def respond_to_missing?(*_args)
52
+ false
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -3,6 +3,7 @@
3
3
 
4
4
  require 'jwt'
5
5
  require_relative './csv_package'
6
+ require_relative './net_package'
6
7
  require_relative './stream_package'
7
8
 
8
9
  using Workato::Extension::HashWithIndifferentAccess
@@ -20,7 +21,7 @@ module Workato
20
21
  JWT_RSA_KEY_MIN_LENGTH = 2048
21
22
  private_constant :JWT_RSA_KEY_MIN_LENGTH
22
23
 
23
- JWT_HMAC_ALGORITHMS = %w[HS256].freeze
24
+ JWT_HMAC_ALGORITHMS = %w[HS256 HS384 HS512].freeze
24
25
  private_constant :JWT_HMAC_ALGORITHMS
25
26
 
26
27
  JWT_ECDSA_ALGORITHMS = %w[ES256 ES384 ES512].freeze
@@ -71,7 +72,10 @@ module Workato
71
72
  end
72
73
  end
73
74
 
74
- header_fields = HashWithIndifferentAccess.wrap(header_fields).except(:typ, :alg)
75
+ header_fields = HashWithIndifferentAccess.wrap(header_fields)
76
+ .except(:typ, :alg)
77
+ .reverse_merge(typ: 'JWT', alg: algorithm)
78
+
75
79
  ::JWT.encode(payload, key, algorithm, header_fields)
76
80
  rescue JWT::IncorrectAlgorithm
77
81
  raise Sdk::ArgumentError, 'Mismatched algorithm and key'
@@ -79,6 +83,29 @@ module Workato
79
83
  raise Sdk::ArgumentError, 'Invalid key'
80
84
  end
81
85
 
86
+ def jwt_decode(jwt, key, algorithm)
87
+ algorithm = algorithm.to_s.upcase
88
+
89
+ unless JWT_ALGORITHMS.include?(algorithm)
90
+ raise Sdk::ArgumentError,
91
+ 'Unsupported verification algorithm. ' \
92
+ "Supports only #{JWT_ALGORITHMS.join(', ')}. Got: '#{algorithm}'"
93
+ end
94
+
95
+ if JWT_RSA_ALGORITHMS.include?(algorithm)
96
+ key = OpenSSL::PKey::RSA.new(key)
97
+ elsif JWT_ECDSA_ALGORITHMS.include?(algorithm)
98
+ key = OpenSSL::PKey::EC.new(key)
99
+ end
100
+
101
+ payload, header = ::JWT.decode(jwt, key, true, { algorithm: algorithm })
102
+ { payload: payload, header: header }.with_indifferent_access
103
+ rescue JWT::IncorrectAlgorithm
104
+ raise Sdk::ArgumentError, 'Mismatched algorithm and key'
105
+ rescue OpenSSL::PKey::PKeyError
106
+ raise Sdk::ArgumentError, 'Invalid key'
107
+ end
108
+
82
109
  def verify_rsa(payload, certificate, signature, algorithm = 'SHA256')
83
110
  algorithm = algorithm.to_s.upcase
84
111
  unless VERIFY_RCA_ALGORITHMS.include?(algorithm)
@@ -157,6 +184,10 @@ module Workato
157
184
  @csv ||= CsvPackage.new
158
185
  end
159
186
 
187
+ def net
188
+ @net ||= NetPackage.new
189
+ end
190
+
160
191
  def stream
161
192
  @stream ||= StreamPackage.new(streams: streams, connection: connection)
162
193
  end
@@ -79,7 +79,9 @@ module Workato
79
79
  end
80
80
  end
81
81
 
82
- def blank; end
82
+ def blank
83
+ ''
84
+ end
83
85
 
84
86
  def clear; end
85
87
 
@@ -156,8 +156,9 @@ module Workato
156
156
  self
157
157
  end
158
158
 
159
- def format_xml(root_element_name, namespaces = {}, **options)
160
- request_format_xml(root_element_name, namespaces).response_format_xml(**options)
159
+ def format_xml(root_element_name, namespaces = {}, strip_response_namespaces: false)
160
+ request_format_xml(root_element_name, namespaces)
161
+ .response_format_xml(strip_response_namespaces: strip_response_namespaces)
161
162
  end
162
163
 
163
164
  def request_format_xml(root_element_name, namespaces = {})
@@ -9,7 +9,14 @@ module Workato
9
9
  module Connector
10
10
  module Sdk
11
11
  module SorbetTypes
12
- WebhookSubscribeOutputHash = T.type_alias { T::Hash[T.any(String, Symbol), T.untyped] }
12
+ WebhookSubscribeClosureHash = T.type_alias { T::Hash[T.any(String, Symbol), T.untyped] }
13
+
14
+ WebhookSubscribeOutput = T.type_alias do
15
+ T.any(
16
+ WebhookSubscribeClosureHash,
17
+ [WebhookSubscribeClosureHash, T.nilable(T.any(Time, ActiveSupport::TimeWithZone))]
18
+ )
19
+ end
13
20
 
14
21
  WebhookNotificationPayload = T.type_alias { T.untyped }
15
22
 
@@ -121,7 +128,7 @@ module Workato
121
128
  headers: T::Hash[T.any(String, Symbol), T.untyped],
122
129
  params: T::Hash[T.any(String, Symbol), T.untyped],
123
130
  settings: T.nilable(SorbetTypes::SettingsHash),
124
- webhook_subscribe_output: T.nilable(SorbetTypes::WebhookSubscribeOutputHash)
131
+ webhook_subscribe_output: T.nilable(SorbetTypes::WebhookSubscribeClosureHash)
125
132
  ).returns(
126
133
  SorbetTypes::WebhookNotificationOutputHash
127
134
  )
@@ -161,9 +168,7 @@ module Workato
161
168
  settings: T.nilable(SorbetTypes::SettingsHash),
162
169
  input: SorbetTypes::OperationInputHash,
163
170
  recipe_id: String
164
- ).returns(
165
- SorbetTypes::WebhookSubscribeOutputHash
166
- )
171
+ ).returns(SorbetTypes::WebhookSubscribeOutput)
167
172
  end
168
173
  def webhook_subscribe(webhook_url = '', settings = nil, input = {}, recipe_id = recipe_id!)
169
174
  webhook_subscribe_proc = trigger[:webhook_subscribe]
@@ -178,7 +183,7 @@ module Workato
178
183
  end
179
184
  end
180
185
 
181
- sig { params(webhook_subscribe_output: SorbetTypes::WebhookSubscribeOutputHash).returns(T.untyped) }
186
+ sig { params(webhook_subscribe_output: SorbetTypes::WebhookSubscribeClosureHash).returns(T.untyped) }
182
187
  def webhook_unsubscribe(webhook_subscribe_output = {})
183
188
  webhook_unsubscribe_proc = trigger[:webhook_unsubscribe]
184
189
  execute(nil, webhook_subscribe_output) do |_connection, input|
@@ -192,7 +197,7 @@ module Workato
192
197
  payload: T::Hash[T.any(String, Symbol), T.untyped],
193
198
  headers: T::Hash[T.any(String, Symbol), T.untyped],
194
199
  params: T::Hash[T.any(String, Symbol), T.untyped],
195
- webhook_subscribe_output: T.nilable(SorbetTypes::WebhookSubscribeOutputHash)
200
+ webhook_subscribe_output: T.nilable(SorbetTypes::WebhookSubscribeClosureHash)
196
201
  ).returns(
197
202
  T.any(SorbetTypes::WebhookNotificationOutputHash, SorbetTypes::PollOutputHash)
198
203
  )
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: workato-connector-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.2
4
+ version: 1.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pavel Abolmasov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-02-23 00:00:00.000000000 Z
11
+ date: 2023-05-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -112,16 +112,22 @@ dependencies:
112
112
  name: jwt
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - '='
115
+ - - ">="
116
116
  - !ruby/object:Gem::Version
117
117
  version: 1.5.6
118
+ - - "<"
119
+ - !ruby/object:Gem::Version
120
+ version: '3.0'
118
121
  type: :runtime
119
122
  prerelease: false
120
123
  version_requirements: !ruby/object:Gem::Requirement
121
124
  requirements:
122
- - - '='
125
+ - - ">="
123
126
  - !ruby/object:Gem::Version
124
127
  version: 1.5.6
128
+ - - "<"
129
+ - !ruby/object:Gem::Version
130
+ version: '3.0'
125
131
  - !ruby/object:Gem::Dependency
126
132
  name: launchy
127
133
  requirement: !ruby/object:Gem::Requirement
@@ -154,16 +160,22 @@ dependencies:
154
160
  name: nokogiri
155
161
  requirement: !ruby/object:Gem::Requirement
156
162
  requirements:
157
- - - '='
163
+ - - ">="
158
164
  - !ruby/object:Gem::Version
159
165
  version: 1.13.10
166
+ - - "<"
167
+ - !ruby/object:Gem::Version
168
+ version: '1.15'
160
169
  type: :runtime
161
170
  prerelease: false
162
171
  version_requirements: !ruby/object:Gem::Requirement
163
172
  requirements:
164
- - - '='
173
+ - - ">="
165
174
  - !ruby/object:Gem::Version
166
175
  version: 1.13.10
176
+ - - "<"
177
+ - !ruby/object:Gem::Version
178
+ version: '1.15'
167
179
  - !ruby/object:Gem::Dependency
168
180
  name: rack
169
181
  requirement: !ruby/object:Gem::Requirement
@@ -182,14 +194,14 @@ dependencies:
182
194
  name: rails-html-sanitizer
183
195
  requirement: !ruby/object:Gem::Requirement
184
196
  requirements:
185
- - - '='
197
+ - - "~>"
186
198
  - !ruby/object:Gem::Version
187
199
  version: 1.4.3
188
200
  type: :runtime
189
201
  prerelease: false
190
202
  version_requirements: !ruby/object:Gem::Requirement
191
203
  requirements:
192
- - - '='
204
+ - - "~>"
193
205
  - !ruby/object:Gem::Version
194
206
  version: 1.4.3
195
207
  - !ruby/object:Gem::Dependency
@@ -290,90 +302,6 @@ dependencies:
290
302
  - - "~>"
291
303
  - !ruby/object:Gem::Version
292
304
  version: '1.0'
293
- - !ruby/object:Gem::Dependency
294
- name: rspec
295
- requirement: !ruby/object:Gem::Requirement
296
- requirements:
297
- - - "~>"
298
- - !ruby/object:Gem::Version
299
- version: '3.0'
300
- type: :development
301
- prerelease: false
302
- version_requirements: !ruby/object:Gem::Requirement
303
- requirements:
304
- - - "~>"
305
- - !ruby/object:Gem::Version
306
- version: '3.0'
307
- - !ruby/object:Gem::Dependency
308
- name: sorbet
309
- requirement: !ruby/object:Gem::Requirement
310
- requirements:
311
- - - "~>"
312
- - !ruby/object:Gem::Version
313
- version: '0.5'
314
- type: :development
315
- prerelease: false
316
- version_requirements: !ruby/object:Gem::Requirement
317
- requirements:
318
- - - "~>"
319
- - !ruby/object:Gem::Version
320
- version: '0.5'
321
- - !ruby/object:Gem::Dependency
322
- name: stub_server
323
- requirement: !ruby/object:Gem::Requirement
324
- requirements:
325
- - - "~>"
326
- - !ruby/object:Gem::Version
327
- version: '0.6'
328
- type: :development
329
- prerelease: false
330
- version_requirements: !ruby/object:Gem::Requirement
331
- requirements:
332
- - - "~>"
333
- - !ruby/object:Gem::Version
334
- version: '0.6'
335
- - !ruby/object:Gem::Dependency
336
- name: timecop
337
- requirement: !ruby/object:Gem::Requirement
338
- requirements:
339
- - - "~>"
340
- - !ruby/object:Gem::Version
341
- version: '0.9'
342
- type: :development
343
- prerelease: false
344
- version_requirements: !ruby/object:Gem::Requirement
345
- requirements:
346
- - - "~>"
347
- - !ruby/object:Gem::Version
348
- version: '0.9'
349
- - !ruby/object:Gem::Dependency
350
- name: vcr
351
- requirement: !ruby/object:Gem::Requirement
352
- requirements:
353
- - - "~>"
354
- - !ruby/object:Gem::Version
355
- version: '6.0'
356
- type: :development
357
- prerelease: false
358
- version_requirements: !ruby/object:Gem::Requirement
359
- requirements:
360
- - - "~>"
361
- - !ruby/object:Gem::Version
362
- version: '6.0'
363
- - !ruby/object:Gem::Dependency
364
- name: webmock
365
- requirement: !ruby/object:Gem::Requirement
366
- requirements:
367
- - - "~>"
368
- - !ruby/object:Gem::Version
369
- version: '3.0'
370
- type: :development
371
- prerelease: false
372
- version_requirements: !ruby/object:Gem::Requirement
373
- requirements:
374
- - - "~>"
375
- - !ruby/object:Gem::Version
376
- version: '3.0'
377
305
  description: Reproduce key concepts of Workato SDK, DSL, behavior and constraints.
378
306
  email:
379
307
  - pavel.abolmasov@workato.com
@@ -401,6 +329,7 @@ files:
401
329
  - lib/workato/connector/sdk.rb
402
330
  - lib/workato/connector/sdk/account_properties.rb
403
331
  - lib/workato/connector/sdk/action.rb
332
+ - lib/workato/connector/sdk/blank.rb
404
333
  - lib/workato/connector/sdk/block_invocation_refinements.rb
405
334
  - lib/workato/connector/sdk/connection.rb
406
335
  - lib/workato/connector/sdk/connector.rb
@@ -414,6 +343,7 @@ files:
414
343
  - lib/workato/connector/sdk/dsl/execution_context.rb
415
344
  - lib/workato/connector/sdk/dsl/http.rb
416
345
  - lib/workato/connector/sdk/dsl/lookup_table.rb
346
+ - lib/workato/connector/sdk/dsl/net_package.rb
417
347
  - lib/workato/connector/sdk/dsl/reinvoke_after.rb
418
348
  - lib/workato/connector/sdk/dsl/stream_package.rb
419
349
  - lib/workato/connector/sdk/dsl/time.rb