workato-connector-sdk 1.1.0 → 1.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.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -2
  3. data/VERSION +1 -0
  4. data/lib/workato/cli/edit_command.rb +3 -1
  5. data/lib/workato/cli/exec_command.rb +103 -17
  6. data/lib/workato/cli/generate_command.rb +2 -2
  7. data/lib/workato/cli/main.rb +17 -10
  8. data/lib/workato/cli/multi_auth_selected_fallback.rb +33 -0
  9. data/lib/workato/cli/oauth2_command.rb +50 -12
  10. data/lib/workato/cli/push_command.rb +2 -2
  11. data/lib/workato/cli/schema_command.rb +2 -2
  12. data/lib/workato/connector/sdk/account_properties.rb +2 -2
  13. data/lib/workato/connector/sdk/action.rb +20 -70
  14. data/lib/workato/connector/sdk/block_invocation_refinements.rb +2 -10
  15. data/lib/workato/connector/sdk/connection.rb +115 -30
  16. data/lib/workato/connector/sdk/connector.rb +71 -81
  17. data/lib/workato/connector/sdk/core.rb +62 -0
  18. data/lib/workato/connector/sdk/dsl/aws.rb +8 -5
  19. data/lib/workato/connector/sdk/dsl/call.rb +1 -1
  20. data/lib/workato/connector/sdk/dsl/csv_package.rb +133 -0
  21. data/lib/workato/connector/sdk/dsl/execution_context.rb +45 -0
  22. data/lib/workato/connector/sdk/dsl/http.rb +1 -1
  23. data/lib/workato/connector/sdk/dsl/reinvoke_after.rb +84 -0
  24. data/lib/workato/connector/sdk/dsl/stream_package.rb +65 -0
  25. data/lib/workato/connector/sdk/dsl/time.rb +0 -14
  26. data/lib/workato/connector/sdk/dsl/workato_package.rb +146 -0
  27. data/lib/workato/connector/sdk/dsl.rb +64 -10
  28. data/lib/workato/connector/sdk/errors.rb +37 -9
  29. data/lib/workato/connector/sdk/lookup_tables.rb +3 -1
  30. data/lib/workato/connector/sdk/operation.rb +33 -10
  31. data/lib/workato/connector/sdk/request.rb +149 -69
  32. data/lib/workato/connector/sdk/schema/field/convertors.rb +2 -2
  33. data/lib/workato/connector/sdk/schema/type/unicode_string.rb +1 -1
  34. data/lib/workato/connector/sdk/schema.rb +12 -8
  35. data/lib/workato/connector/sdk/settings.rb +14 -3
  36. data/lib/workato/connector/sdk/stream.rb +243 -0
  37. data/lib/workato/connector/sdk/streams.rb +71 -0
  38. data/lib/workato/connector/sdk/summarize.rb +2 -2
  39. data/lib/workato/connector/sdk/trigger.rb +23 -15
  40. data/lib/workato/connector/sdk/version.rb +1 -1
  41. data/lib/workato/connector/sdk.rb +21 -47
  42. data/lib/workato/extension/array.rb +2 -0
  43. data/lib/workato/extension/case_sensitive_headers.rb +0 -26
  44. data/lib/workato/extension/content_encoding_decoder.rb +69 -0
  45. data/lib/workato/extension/currency/countries.rb +79 -0
  46. data/lib/workato/extension/currency/countries.yml +18433 -0
  47. data/lib/workato/extension/currency/currencies.rb +55 -0
  48. data/lib/workato/extension/currency/currencies.yml +479 -0
  49. data/lib/workato/extension/currency.rb +73 -5
  50. data/lib/workato/extension/enumerable.rb +2 -2
  51. data/lib/workato/extension/extra_chain_cert.rb +0 -14
  52. data/lib/workato/extension/hash_with_indifferent_access.rb +19 -0
  53. data/lib/workato/extension/metadata_fix_wrap_kw_args.rb +11 -0
  54. data/lib/workato/extension/string.rb +16 -112
  55. data/lib/workato/testing/vcr_encrypted_cassette_serializer.rb +2 -0
  56. data/lib/workato/types/binary.rb +55 -0
  57. data/lib/workato/{connector/sdk → utilities}/xml.rb +4 -4
  58. metadata +61 -64
  59. data/lib/workato/connector/sdk/dsl/workato_code_lib.rb +0 -160
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 053e48199f2b1406ef47a84fb43d7b7d0cc74d74ce0f1f1b650c01fc422bc683
4
- data.tar.gz: e2155ca61c45230234b105ff0f4ab033205c86b49b35838d88e8a8e473a957b3
3
+ metadata.gz: 0e0a739fc6bc5fe15228d209dc24ac4858c3815b4252b5f6d9abd9ae0644b15d
4
+ data.tar.gz: d4089c8dc7f6c8f9bd171730797a7b82eeb3192883d4b5883a5998985a20001a
5
5
  SHA512:
6
- metadata.gz: 4d34393bda1fc5eef5e138c7e742a2a05a7c1ced8fb5a4a8969a1770473c4534cf015c7096cf17a18eb69c669301ca8761ff51a88b3ee8a04ad4550467a23588
7
- data.tar.gz: b293f65e21f45ef2bab573d687cd12cd77981a7375bec619ce45561ead9e96f895f633e65910dad7226213daacb38b95453c890b96e7b7a957b5085e5055ff94
6
+ metadata.gz: f6a00086288382c03c024f351e69ca79749d6ef41a833141140274926bec885a7382ce505e9b4981c05a465efa2f1c97cb30697906b8ba6c63d02709dedc9de7
7
+ data.tar.gz: b5b289bf86ac5970420e20762609256a6280f00a76ae604fcff206f65f40abb517f22c2207f93f1d439b250e4d725e4a5a91865904bf32c93459c52c932e70b3
data/README.md CHANGED
@@ -13,9 +13,10 @@ This guide below showcases how you can do the following things:
13
13
 
14
14
  ## Prerequisites
15
15
  1. Install [RVM ("Ruby Version Manager")](http://rvm.io/) or a Ruby manager of your choice. You can find more at [here](https://www.ruby-lang.org/en/documentation/installation/)
16
- 2. Choose between Ruby versions `2.4.10` `2.5.X` or `2.7.X`. Our preferred version is `2.7.X`.
16
+ 2. Choose between Ruby versions `2.7.X`, `3.0.X`, `3.1.X`. Our preferred version is `2.7.6`.
17
17
  3. Verify you're running a valid ruby version. Do this by running either `ruby -v` or the commands within your version manager. i.e., `rvm current` if you have installed RVM.
18
18
  4. For Windows you need tzinfo-data gem installed as well. `gem install tzinfo-data`
19
+ 5. SDK depends on `charlock_holmes` gem. Check [gem's documentation](https://github.com/brianmario/charlock_holmes#installing) if you have troubles when install this dependency. Additional [details for Windows](https://github.com/brianmario/charlock_holmes/issues/84#issuecomment-652877605)
19
20
 
20
21
  ```bash
21
22
  ruby -v
@@ -1123,7 +1124,7 @@ jobs:
1123
1124
  runs-on: ubuntu-latest
1124
1125
  strategy:
1125
1126
  matrix:
1126
- ruby-version: ['2.4.10', '2.5', '2.7']
1127
+ ruby-version: ['2.7', '3.0', '3.1']
1127
1128
 
1128
1129
  steps:
1129
1130
  - uses: actions/checkout@v2
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.3.0
@@ -3,6 +3,8 @@
3
3
 
4
4
  require 'active_support/encrypted_configuration'
5
5
 
6
+ require_relative '../extension/metadata_fix_wrap_kw_args'
7
+
6
8
  module Workato
7
9
  module CLI
8
10
  class EditCommand
@@ -23,7 +25,7 @@ module Workato
23
25
 
24
26
  catch_editing_exceptions do
25
27
  encrypted_config.change do |tmp_path|
26
- system("#{ENV['EDITOR']} #{tmp_path}")
28
+ system("#{ENV.fetch('EDITOR', nil)} #{tmp_path}")
27
29
  end
28
30
  end
29
31
 
@@ -1,12 +1,17 @@
1
- # typed: false
1
+ # typed: true
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'thor'
5
+ require 'active_support/json'
6
+ require_relative './multi_auth_selected_fallback'
7
+
8
+ Method.prepend(T::CompatibilityPatches::MethodExtensions)
5
9
 
6
10
  module Workato
7
11
  module CLI
8
12
  class ExecCommand
9
13
  include Thor::Shell
14
+ include MultiAuthSelectedFallback
10
15
 
11
16
  DebugExceptionError = Class.new(StandardError)
12
17
 
@@ -19,7 +24,7 @@ module Workato
19
24
  load_from_default_files
20
25
  inspect_params(params)
21
26
  output = with_progress { execute_path }
22
- show_output(output)
27
+ show_output(output.as_json)
23
28
  output
24
29
  end
25
30
 
@@ -63,8 +68,12 @@ module Workato
63
68
  oauth2_code: options[:oauth2_code],
64
69
  redirect_url: options[:redirect_url],
65
70
  refresh_token: options[:refresh_token],
66
- recipe_id: SecureRandom.uuid
67
- }
71
+ from: options[:from].to_i,
72
+ frame_size: options[:frame_size]&.to_i || Workato::Connector::Sdk::Stream::DEFAULT_FRAME_SIZE,
73
+ recipe_id: Workato::Connector::Sdk::Operation.recipe_id!
74
+ }.tap do |h|
75
+ h[:to] = h[:from] + h[:frame_size] - 1
76
+ end
68
77
  end
69
78
 
70
79
  def connector
@@ -84,25 +93,30 @@ module Workato
84
93
  )
85
94
  @settings = settings_store.read
86
95
 
87
- Workato::Connector::Sdk::Connection.on_settings_update = lambda do |message, &refresher|
88
- begin
89
- $stdout.pause if verbose?
90
- say('')
91
- say(message)
96
+ Workato::Connector::Sdk::Connection.multi_auth_selected_fallback = lambda do |options|
97
+ next @selected_auth_type if @selected_auth_type
98
+
99
+ with_user_interaction do
100
+ @selected_auth_type = multi_auth_selected_fallback(options)
101
+ end
102
+ end
92
103
 
93
- new_settings = refresher.call
94
- break unless new_settings
104
+ Workato::Connector::Sdk::Connection.on_settings_update = lambda do |message, _settings_before, refresher|
105
+ new_settings = refresher.call
106
+ break unless new_settings
107
+ break new_settings if @settings == new_settings
95
108
 
109
+ with_user_interaction do
96
110
  loop do
111
+ say(message)
97
112
  answer = ask('Updated settings file with new connection attributes? (Yes or No)').to_s.downcase
98
113
  break new_settings if %w[n no].include?(answer)
99
114
  next unless %w[y yes].include?(answer)
100
115
 
116
+ @settings.merge!(new_settings)
101
117
  settings_store.update(new_settings)
102
118
  break new_settings
103
119
  end
104
- ensure
105
- $stdout.resume if verbose?
106
120
  end
107
121
  end
108
122
 
@@ -130,7 +144,12 @@ module Workato
130
144
  end
131
145
 
132
146
  def execute_path
133
- connector.invoke(path, params)
147
+ InvokePath.new(path: path, connector: connector, params: params).call
148
+ rescue Workato::Connector::Sdk::InvalidMultiAuthDefinition => e
149
+ raise "#{e.message}. Please ensure:\n" \
150
+ "- 'selected' block is defined and returns value from 'options' list\n" \
151
+ "- settings file contains value expected by 'selected' block\n\n" \
152
+ 'See more: https://docs.workato.com/developing-connectors/sdk/guides/authentication/multi_auth.html'
134
153
  rescue Exception => e # rubocop:disable Lint/RescueException
135
154
  raise DebugExceptionError, e if options[:debug]
136
155
 
@@ -139,9 +158,7 @@ module Workato
139
158
 
140
159
  def show_output(output)
141
160
  if options[:output].present?
142
- File.open(options[:output], 'w') do |f|
143
- f.write(JSON.dump(output))
144
- end
161
+ File.write(options[:output], JSON.dump(output))
145
162
  elsif options[:output].nil?
146
163
  say('OUTPUT') if verbose?
147
164
  jj output
@@ -181,6 +198,16 @@ module Workato
181
198
  output
182
199
  end
183
200
 
201
+ def with_user_interaction
202
+ $stdout.pause if verbose?
203
+ say('')
204
+
205
+ yield
206
+ ensure
207
+ say('')
208
+ $stdout.resume if verbose?
209
+ end
210
+
184
211
  class ProgressLogger < SimpleDelegator
185
212
  def initialize(progress)
186
213
  super($stdout)
@@ -194,6 +221,65 @@ module Workato
194
221
  alias puts log
195
222
  alias print log
196
223
  end
224
+
225
+ class InvokePath
226
+ extend T::Sig
227
+
228
+ sig do
229
+ params(
230
+ path: String,
231
+ connector: Workato::Connector::Sdk::Connector,
232
+ params: T::Hash[Symbol, T.untyped]
233
+ ).void
234
+ end
235
+ def initialize(path:, connector:, params:)
236
+ @path = T.let(path, String)
237
+ @connector = T.let(connector, Workato::Connector::Sdk::Connector)
238
+ @params = T.let(params, T::Hash[Symbol, T.untyped])
239
+ end
240
+
241
+ sig { returns(T.untyped) }
242
+ def call
243
+ invoke_path
244
+ end
245
+
246
+ private
247
+
248
+ sig { returns(String) }
249
+ attr_reader :path
250
+
251
+ sig { returns(Workato::Connector::Sdk::Connector) }
252
+ attr_reader :connector
253
+
254
+ sig { returns(T::Hash[Symbol, T.untyped]) }
255
+ attr_reader :params
256
+
257
+ sig { returns(T.untyped) }
258
+ def invoke_path
259
+ methods = path.split('.')
260
+ method = methods.pop
261
+ raise ArgumentError, 'path is not found' unless method
262
+
263
+ object = methods.inject(connector) { |obj, m| obj.public_send(m) }
264
+ output = invoke_method(object, method)
265
+ if output.respond_to?(:invoke)
266
+ invoke_method(output, :invoke)
267
+ else
268
+ output
269
+ end
270
+ end
271
+
272
+ sig { params(object: T.untyped, method: T.any(Symbol, String)).returns(T.untyped) }
273
+ def invoke_method(object, method)
274
+ parameters = object.method(method).parameters.reject { |p| p[0] == :block }.map(&:second)
275
+ args = params.values_at(*parameters)
276
+ if parameters.last == :args
277
+ args = args.take(args.length - 1) + Array.wrap(args.last).flatten(1)
278
+ end
279
+ object.public_send(method, *args)
280
+ end
281
+ end
282
+ private_constant :InvokePath
197
283
  end
198
284
  end
199
285
  end
@@ -51,7 +51,7 @@ module Workato
51
51
  default: 'comma'
52
52
  method_option :api_email,
53
53
  type: :string,
54
- desc: 'Email for accessing Workato API or '\
54
+ desc: 'Email for accessing Workato API or ' \
55
55
  "set #{Workato::Connector::Sdk::WORKATO_API_EMAIL_ENV} environment variable"
56
56
  method_option :api_token,
57
57
  type: :string,
@@ -125,7 +125,7 @@ module Workato
125
125
  end
126
126
 
127
127
  def sanitized_filename(name)
128
- name.downcase.gsub(/[^0-9A-z.\-]/, '_')
128
+ name.downcase.gsub(/[^0-9A-z.-]/, '_')
129
129
  end
130
130
  end
131
131
  end
@@ -34,14 +34,14 @@ module Workato
34
34
  method_option :connector, type: :string, aliases: '-c', desc: 'Path to connector source code',
35
35
  lazy_default: Workato::Connector::Sdk::DEFAULT_CONNECTOR_PATH
36
36
  method_option :settings, type: :string, aliases: '-s',
37
- desc: 'Path to plain or encrypted file with connection configs, '\
37
+ desc: 'Path to plain or encrypted file with connection configs, ' \
38
38
  'passwords, tokens, secrets etc',
39
39
  lazy_default: Workato::Connector::Sdk::DEFAULT_ENCRYPTED_SETTINGS_PATH
40
40
  method_option :connection, type: :string, aliases: '-n',
41
41
  desc: 'Connection name if settings file contains multiple settings'
42
42
  method_option :key, type: :string, aliases: '-k',
43
43
  lazy_default: Workato::Connector::Sdk::DEFAULT_MASTER_KEY_PATH,
44
- desc: "Path to file with encrypt/decrypt key.\n"\
44
+ desc: "Path to file with encrypt/decrypt key.\n" \
45
45
  "NOTE: key from #{Workato::Connector::Sdk::DEFAULT_MASTER_KEY_ENV} has higher priority"
46
46
  method_option :input, type: :string, aliases: '-i', desc: 'Path to file with input JSON'
47
47
  method_option :closure, type: :string, desc: 'Path to file with next poll closure JSON'
@@ -61,6 +61,8 @@ module Workato
61
61
  method_option :oauth2_code, type: :string, desc: 'OAuth2 code exchange to tokens pair'
62
62
  method_option :redirect_url, type: :string, desc: 'OAuth2 callback url'
63
63
  method_option :refresh_token, type: :string, desc: 'OAuth2 refresh token'
64
+ method_option :from, type: :numeric, desc: 'Stream byte offset to read from'
65
+ method_option :frame_size, type: :numeric, desc: 'Stream chunk read size in bytes. Should be positive'
64
66
 
65
67
  method_option :debug, type: :boolean
66
68
 
@@ -75,7 +77,7 @@ module Workato
75
77
 
76
78
  method_option :key, type: :string, aliases: '-k',
77
79
  lazy_default: Workato::Connector::Sdk::DEFAULT_MASTER_KEY_PATH,
78
- desc: "Path to file with encrypt/decrypt key.\n"\
80
+ desc: "Path to file with encrypt/decrypt key.\n" \
79
81
  "NOTE: key from #{Workato::Connector::Sdk::DEFAULT_MASTER_KEY_ENV} has higher priority"
80
82
 
81
83
  def edit(path)
@@ -127,19 +129,19 @@ module Workato
127
129
  lazy_default: Workato::Connector::Sdk::DEFAULT_CONNECTOR_PATH
128
130
  method_option :api_email,
129
131
  type: :string,
130
- desc: "Email for accessing Workato API.\n"\
131
- "If present overrides value from #{Workato::Connector::Sdk::WORKATO_API_EMAIL_ENV} "\
132
+ desc: "Email for accessing Workato API.\n" \
133
+ "If present overrides value from #{Workato::Connector::Sdk::WORKATO_API_EMAIL_ENV} " \
132
134
  'environment variable.'
133
135
  method_option :api_token,
134
136
  type: :string,
135
137
  desc: "Token for accessing Workato API.\n" \
136
- "If present overrides value from #{Workato::Connector::Sdk::WORKATO_API_TOKEN_ENV} "\
138
+ "If present overrides value from #{Workato::Connector::Sdk::WORKATO_API_TOKEN_ENV} " \
137
139
  'environment variable.'
138
140
  method_option :environment,
139
141
  type: :string,
140
- desc: "Data center specific URL to push connector code.\n"\
141
- "If present overrides value from #{Workato::Connector::Sdk::WORKATO_BASE_URL_ENV} "\
142
- "environment variable.\n"\
142
+ desc: "Data center specific URL to push connector code.\n" \
143
+ "If present overrides value from #{Workato::Connector::Sdk::WORKATO_BASE_URL_ENV} " \
144
+ "environment variable.\n" \
143
145
  "Examples: 'https://app.workato.com', 'https://app.eu.workato.com'"
144
146
  method_option :folder,
145
147
  type: :string,
@@ -171,7 +173,7 @@ module Workato
171
173
  type: :string,
172
174
  aliases: '-k',
173
175
  lazy_default: Workato::Connector::Sdk::DEFAULT_MASTER_KEY_PATH,
174
- desc: "Path to file with encrypt/decrypt key.\n"\
176
+ desc: "Path to file with encrypt/decrypt key.\n" \
175
177
  "NOTE: key from #{Workato::Connector::Sdk::DEFAULT_MASTER_KEY_ENV} has higher priority"
176
178
  method_option :port,
177
179
  type: :string,
@@ -191,6 +193,11 @@ module Workato
191
193
  ).call
192
194
  end
193
195
 
196
+ desc 'version', 'Shows gem version'
197
+ def version
198
+ puts Workato::Connector::Sdk::VERSION
199
+ end
200
+
194
201
  class << self
195
202
  def print_options(shell, options, group_name = nil)
196
203
  return if options.empty?
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Workato
4
+ module CLI
5
+ module MultiAuthSelectedFallback
6
+ private
7
+
8
+ def multi_auth_selected_fallback(options)
9
+ say('Please select current auth type for multi-auth connector:')
10
+ options = options.keys
11
+ options.each_with_index do |option, idx|
12
+ say "[#{idx + 1}] #{option}"
13
+ end
14
+ say '[q] <exit>'
15
+ say('')
16
+
17
+ multi_auth_selected_fallback = loop do
18
+ answer = ask('Your choice:').to_s.downcase
19
+ break if answer == 'q'
20
+ next unless /\d+/ =~ answer && options[answer.to_i - 1]
21
+
22
+ break options[answer.to_i - 1]
23
+ end
24
+ return unless multi_auth_selected_fallback
25
+
26
+ say('')
27
+ say('Put selected auth type in your settings file to avoid this message in future')
28
+
29
+ multi_auth_selected_fallback
30
+ end
31
+ end
32
+ end
33
+ end
@@ -3,11 +3,13 @@
3
3
 
4
4
  require 'securerandom'
5
5
  require 'workato/web/app'
6
+ require_relative './multi_auth_selected_fallback'
6
7
 
7
8
  module Workato
8
9
  module CLI
9
10
  class OAuth2Command
10
11
  include Thor::Shell
12
+ include MultiAuthSelectedFallback
11
13
 
12
14
  AWAIT_CODE_TIMEOUT_INTERVAL = 180 # seconds
13
15
  AWAIT_CODE_SLEEP_INTERVAL = 5 # seconds
@@ -24,6 +26,7 @@ module Workato
24
26
  end
25
27
 
26
28
  def call
29
+ ensure_oauth2_type
27
30
  require_gems
28
31
  start_webrick
29
32
 
@@ -94,16 +97,31 @@ module Workato
94
97
  end
95
98
 
96
99
  def stop_webrick
100
+ return unless @thread
101
+
97
102
  Rack::Handler::WEBrick.shutdown
98
103
  @thread.exit
99
104
  end
100
105
 
106
+ def ensure_oauth2_type
107
+ unless connector.connection.authorization.oauth2?
108
+ raise 'Authorization type is not OAuth2. ' \
109
+ 'For multi-auth connector ensure correct auth type was used. ' \
110
+ "Expected: 'oauth2', got: '#{connector.connection.authorization.type}''"
111
+ end
112
+ rescue Workato::Connector::Sdk::InvalidMultiAuthDefinition => e
113
+ raise "#{e.message}. Please ensure:\n" \
114
+ "- 'selected' block is defined and returns value from 'options' list\n" \
115
+ "- settings file contains value expected by 'selected' block\n\n" \
116
+ 'See more: https://docs.workato.com/developing-connectors/sdk/guides/authentication/multi_auth.html'
117
+ end
118
+
101
119
  def client
102
120
  @client ||= OAuth2::Client.new(
103
- connector.connection.authorization.client_id(settings),
104
- connector.connection.authorization.client_secret(settings),
105
- site: connector.connection.base_uri(settings),
106
- token_url: connector.connection.authorization.token_url(settings),
121
+ connector.connection.authorization.client_id,
122
+ connector.connection.authorization.client_secret,
123
+ site: connector.connection.base_uri,
124
+ token_url: connector.connection.authorization.token_url,
107
125
  redirect_uri: redirect_url
108
126
  )
109
127
  end
@@ -112,14 +130,14 @@ module Workato
112
130
  return @authorize_url if defined?(@authorize_url)
113
131
 
114
132
  @authorize_url =
115
- if (authorization_url = connector.connection.authorization.authorization_url(settings))
133
+ if (authorization_url = connector.connection.authorization.authorization_url)
116
134
  params = {
117
135
  state: SecureRandom.hex(8),
118
- client_id: connector.connection.authorization.client_id(settings),
136
+ client_id: connector.connection.authorization.client_id,
119
137
  redirect_uri: redirect_url
120
- }
138
+ }.with_indifferent_access
121
139
  uri = URI(authorization_url)
122
- uri.query = params.with_indifferent_access.merge(Rack::Utils.parse_nested_query(uri.query || '')).to_param
140
+ uri.query = params.merge(Rack::Utils.parse_nested_query(uri.query || '')).to_param
123
141
  uri.to_s
124
142
  end
125
143
  end
@@ -133,12 +151,25 @@ module Workato
133
151
  end
134
152
 
135
153
  def settings
136
- @settings ||= settings_store.read
154
+ return @settings if defined?(@settings)
155
+
156
+ @settings = settings_store.read
157
+
158
+ Workato::Connector::Sdk::Connection.multi_auth_selected_fallback = lambda do |options|
159
+ next @selected_auth_type if @selected_auth_type
160
+
161
+ with_user_interaction do
162
+ @selected_auth_type = multi_auth_selected_fallback(options)
163
+ end
164
+ end
165
+
166
+ @settings
137
167
  end
138
168
 
139
169
  def connector
140
170
  @connector ||= Workato::Connector::Sdk::Connector.from_file(
141
- options[:connector] || Workato::Connector::Sdk::DEFAULT_CONNECTOR_PATH
171
+ options[:connector] || Workato::Connector::Sdk::DEFAULT_CONNECTOR_PATH,
172
+ settings
142
173
  )
143
174
  end
144
175
 
@@ -156,8 +187,8 @@ module Workato
156
187
  end
157
188
 
158
189
  def acquire_token(code)
159
- if connector.source.dig(:connection, :authorization, :acquire)
160
- tokens, _, extra_settings = connector.connection.authorization.acquire(settings, await_code, redirect_url)
190
+ if connector.connection.authorization.source[:acquire]
191
+ tokens, _, extra_settings = connector.connection.authorization.acquire(nil, code, redirect_url)
161
192
  tokens ||= {}
162
193
  extra_settings ||= {}
163
194
  extra_settings.merge(tokens)
@@ -178,6 +209,13 @@ module Workato
178
209
  response = http.request(request)
179
210
  response.body
180
211
  end
212
+
213
+ def with_user_interaction
214
+ say('')
215
+ yield
216
+ ensure
217
+ say('')
218
+ end
181
219
  end
182
220
  end
183
221
  end
@@ -35,8 +35,8 @@ module Workato
35
35
  @api_base_url = ENVIRONMENTS.fetch(options[:environment]) do
36
36
  options[:environment].presence || Workato::Connector::Sdk::WORKATO_BASE_URL
37
37
  end
38
- @api_email = options[:api_email] || ENV[Workato::Connector::Sdk::WORKATO_API_EMAIL_ENV]
39
- @api_token = options[:api_token] || ENV[Workato::Connector::Sdk::WORKATO_API_TOKEN_ENV]
38
+ @api_email = options[:api_email] || ENV.fetch(Workato::Connector::Sdk::WORKATO_API_EMAIL_ENV, nil)
39
+ @api_token = options[:api_token] || ENV.fetch(Workato::Connector::Sdk::WORKATO_API_TOKEN_ENV, nil)
40
40
  @folder_id = options[:folder]
41
41
  end
42
42
 
@@ -12,8 +12,8 @@ module Workato
12
12
  API_GENERATE_SCHEMA_PATH = '/api/sdk/generate_schema'
13
13
 
14
14
  def initialize(options:)
15
- @api_email = options[:api_email] || ENV[Workato::Connector::Sdk::WORKATO_API_EMAIL_ENV]
16
- @api_token = options[:api_token] || ENV[Workato::Connector::Sdk::WORKATO_API_TOKEN_ENV]
15
+ @api_email = options[:api_email] || ENV.fetch(Workato::Connector::Sdk::WORKATO_API_EMAIL_ENV, nil)
16
+ @api_token = options[:api_token] || ENV.fetch(Workato::Connector::Sdk::WORKATO_API_TOKEN_ENV, nil)
17
17
  @options = options
18
18
  end
19
19
 
@@ -29,9 +29,9 @@ module Workato
29
29
  end
30
30
 
31
31
  def self.from_csv(path = './account_properties.csv')
32
- props = CSV.foreach(path, headers: true, return_headers: false).map do |row|
32
+ props = CSV.foreach(path, headers: true, return_headers: false).to_h do |row|
33
33
  [row[0], row[1]]
34
- end.to_h
34
+ end
35
35
  instance.load_data(props)
36
36
  end
37
37