workato-connector-sdk 1.3.2 → 1.3.4

Sign up to get free protection for your applications and to get access to all the features.
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