workato-connector-sdk 0.4.1 → 1.0.1

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: '0432805c30301cec341b2c9bbd3168064b5b47e772f8dfd5d49a46b220cf6984'
4
- data.tar.gz: d2161b5a4dd6211d0ef4cfc2a354235d6e4f6b4f6a8466021dcb367d52d493d6
3
+ metadata.gz: 70241ed06aeae85f14f775ff2366ec4edbc54322aa034f0931dd987e9fd1fb2c
4
+ data.tar.gz: 1a99f10c8c3c4dfe036e591cddb81504980586b0fb48cd319f7cfd5e510a1512
5
5
  SHA512:
6
- metadata.gz: aa8779a641225ed5553d59173c8b44df0b6f29c296028414af7cf124175c602f024e69a5ac7ebfdff7b48d54eee3646a9225217a1e77630247606cc13b72182a
7
- data.tar.gz: 30b6719d84588071e4afb8afca6fcd7edadb3e9f0d40a5127c46ecafe66262fded930f239031039bc1128de03ac07d441f16f58e1aba72c0b5ca82ef0b86ea28
6
+ metadata.gz: b74c573b4e5c00509b955a14477a132ce01cfa6824382f21e50646bc10ce5ee44f3f2bf9bbf06ad7e565ddedfd0cce8c5017ae31e28e3b470164600abbb29d6d
7
+ data.tar.gz: 1f1139718e2f18faa63087e3782c42a0bb0b3bae237086044873283bad8128f9ce42b26b3738d0a3a8ff22e529180a6d8df821f7c7eee9da68b85d3b97098340
data/README.md CHANGED
@@ -265,27 +265,28 @@ Usage:
265
265
  workato exec <PATH>
266
266
 
267
267
  Options:
268
- -c, [--connector=CONNECTOR] # Path to connector source code
269
- -s, [--settings=SETTINGS] # Path to plain or encrypted file with connection configs, passwords, tokens, secrets etc
270
- -n, [--connection=CONNECTION] # Connection name if settings file contains multiple settings
271
- -k, [--key=KEY] # Path to file with encrypt/decrypt key. NOTE: key from WORKATO_CONNECTOR_MASTER_KEY has higher priority
272
- -i, [--input=INPUT] # Path to file with input JSON
273
- [--closure=CLOSURE] # Path to file with next poll closure JSON
274
- [--continue=CONTINUE] # Path to file with next multistep action continue closure JSON
275
- -a, [--args=ARGS] # Path to file with method arguments JSON
276
- [--extended-input-schema=EXTENDED_INPUT_SCHEMA] # Path to file with extended input schema definition JSON
277
- [--extended-output-schema=EXTENDED_OUTPUT_SCHEMA] # Path to file with extended output schema definition JSON
278
- [--config-fields=CONFIG_FIELDS] # Path to file with config fields JSON
279
- -w, [--webhook-payload=WEBHOOK_PAYLOAD] # Path to file with webhook payload JSON
280
- [--webhook-params=WEBHOOK_PARAMS] # Path to file with webhook params JSON
281
- [--webhook-headers=WEBHOOK_HEADERS] # Path to file with webhook headers JSON
282
- [--webhook-url=WEBHOOK_URL] # Webhook URL for automatic webhook subscription
283
- -o, [--output=OUTPUT] # Write output to JSON file
284
- [--oauth2-code=OAUTH2_CODE] # OAuth2 code exchange to tokens pair
285
- [--redirect-url=REDIRECT_URL] # OAuth2 callback url
286
- [--refresh-token=REFRESH_TOKEN] # OAuth2 refresh token
287
- [--debug], [--no-debug]
288
- [--verbose], [--no-verbose]
268
+ -c, [--connector=CONNECTOR] # Path to connector source code
269
+ -s, [--settings=SETTINGS] # Path to plain or encrypted file with connection configs, passwords, tokens, secrets etc
270
+ -n, [--connection=CONNECTION] # Connection name if settings file contains multiple settings
271
+ -k, [--key=KEY] # Path to file with encrypt/decrypt key. NOTE: key from WORKATO_CONNECTOR_MASTER_KEY has higher priority
272
+ -i, [--input=INPUT] # Path to file with input JSON
273
+ [--closure=CLOSURE] # Path to file with next poll closure JSON
274
+ [--continue=CONTINUE] # Path to file with next multistep action continue closure JSON
275
+ -a, [--args=ARGS] # Path to file with method arguments JSON
276
+ [--extended-input-schema=EXTENDED_INPUT_SCHEMA] # Path to file with extended input schema definition JSON
277
+ [--extended-output-schema=EXTENDED_OUTPUT_SCHEMA] # Path to file with extended output schema definition JSON
278
+ [--config-fields=CONFIG_FIELDS] # Path to file with config fields JSON
279
+ -w, [--webhook-payload=WEBHOOK_PAYLOAD] # Path to file with webhook payload JSON
280
+ [--webhook-params=WEBHOOK_PARAMS] # Path to file with webhook params JSON
281
+ [--webhook-headers=WEBHOOK_HEADERS] # Path to file with webhook headers JSON
282
+ [--webhook-subscribe-output=WEBHOOK_SUBSCRIBE_OUTPUT] # Path to file with webhook subscribe output JSON
283
+ [--webhook-url=WEBHOOK_URL] # Webhook URL for automatic webhook subscription
284
+ -o, [--output=OUTPUT] # Write output to JSON file
285
+ [--oauth2-code=OAUTH2_CODE] # OAuth2 code exchange to tokens pair
286
+ [--redirect-url=REDIRECT_URL] # OAuth2 callback url
287
+ [--refresh-token=REFRESH_TOKEN] # OAuth2 refresh token
288
+ [--debug], [--no-debug]
289
+ [--verbose], [--no-verbose]
289
290
 
290
291
  Description:
291
292
  The 'workato exec' executes connector's lambda block at <PATH>. Lambda's parameters can be provided if needed, see options part.
@@ -319,7 +320,26 @@ Commands:
319
320
  workato generate test # Generate empty test for connector
320
321
  ```
321
322
 
322
- **NOTE: `workato generate schema` is currently not implemented.**
323
+ ### 3.4.1 workato generate schema
324
+ Use command to generate Workato Schema from a sample file. Supported inputs csv, json
325
+
326
+ ```
327
+ workato generate help schema
328
+
329
+ Usage:
330
+ workato generate schema
331
+
332
+ Options:
333
+ [--json=JSON] # Path to JSON sample file
334
+ [--csv=CSV] # Path to CSV sample file
335
+ [--col-sep=COL_SEP] # Use separator for CSV converter
336
+ # Default: comma
337
+ # Possible values: comma, space, tab, colon, semicolon, pipe
338
+ [--api-email=API_EMAIL] # Email for accessing Workato API or set WORKATO_API_EMAIL environment variable
339
+ [--api-token=API_TOKEN] # Token for accessing Workato API or set WORKATO_API_TOKEN environment variable
340
+ ```
341
+
342
+ ### 3.4.2 workato generate test
323
343
 
324
344
  - Use `workato generate test` to generate tests based on your connector.rb file.
325
345
 
@@ -400,8 +420,8 @@ Options:
400
420
  -l, [--logo=LOGO] # Path to connector logo: png or jpeg file
401
421
  -n, [--notes=NOTES] # Release notes
402
422
  -c, [--connector=CONNECTOR] # Path to connector source code
403
- [--api-email=API_EMAIL] # Email for accessing Workato API or set WORKATO_API_EMAIL env
404
- [--api-token=API_TOKEN] # Token for accessing Workato API or set WORKATO_API_TOKEN env
423
+ [--api-email=API_EMAIL] # Email for accessing Workato API or set WORKATO_API_EMAIL environment variable
424
+ [--api-token=API_TOKEN] # Token for accessing Workato API or set WORKATO_API_TOKEN environment variable
405
425
  [--environment=ENVIRONMENT] # Server to push connector code to
406
426
  # Default: live
407
427
  # Possible values: preview, preview-eu, live, live-eu
@@ -50,7 +50,7 @@ module Workato
50
50
  settings: settings,
51
51
  input: from_json(options[:input]),
52
52
  output: from_json(options[:input]),
53
- webhook_subscribe_output: from_json(options[:input]),
53
+ webhook_subscribe_output: from_json(options[:webhook_subscribe_output]).presence,
54
54
  args: from_json(options[:args]).presence || [],
55
55
  extended_input_schema: from_json(options[:extended_input_schema]).presence || [],
56
56
  extended_output_schema: from_json(options[:extended_output_schema]).presence || [],
@@ -39,12 +39,39 @@ module Workato
39
39
  create_spec_files
40
40
  end
41
41
 
42
- desc 'schema', 'Generate schema by JSON example'
42
+ desc 'schema', 'Generate schema from example'
43
+
44
+ method_option :json, type: :string, desc: 'Path to JSON sample file'
45
+ method_option :csv, type: :string, desc: 'Path to CSV sample file'
46
+ method_option :col_sep,
47
+ type: :string,
48
+ desc: 'Use separator for CSV converter',
49
+ enum: SchemaCommand::CSV_SEPARATORS,
50
+ default: 'comma'
51
+ method_option :api_email,
52
+ type: :string,
53
+ desc: 'Email for accessing Workato API or '\
54
+ "set #{Workato::Connector::Sdk::WORKATO_API_EMAIL_ENV} environment variable"
55
+ method_option :api_token,
56
+ type: :string,
57
+ desc: 'Token for accessing Workato API or ' \
58
+ "set #{Workato::Connector::Sdk::WORKATO_API_TOKEN_ENV} environment variable"
59
+
60
+ long_desc <<~HELP
61
+ The 'workato generate schema' command generates Workato Schema from a sample file.
62
+ Supported inputs #{SchemaCommand::SAMPLE_TO_SCHEMA_SUPPORT_TYPES.join(', ')}
63
+
64
+ Example:
65
+
66
+ workato generate schema --csv=input.csv --col-sep=semicolon # This generates a schema from CSV file.
67
+
68
+ workato generate schema --json=input.json
69
+ HELP
70
+
43
71
  def schema
44
- say <<~HELP
45
- Generate schema is not implemented yet.
46
- Use Workato UI "JSON to Schema" converter for now.
47
- HELP
72
+ SchemaCommand.new(
73
+ options: options
74
+ ).call
48
75
  end
49
76
 
50
77
  private
@@ -4,6 +4,7 @@ require 'thor'
4
4
  require 'workato/connector/sdk'
5
5
  require_relative './exec_command'
6
6
  require_relative './edit_command'
7
+ require_relative './schema_command'
7
8
  require_relative './generate_command'
8
9
  require_relative './push_command'
9
10
  require_relative './oauth2_command'
@@ -53,6 +54,7 @@ module Workato
53
54
  method_option :webhook_payload, type: :string, aliases: '-w', desc: 'Path to file with webhook payload JSON'
54
55
  method_option :webhook_params, type: :string, desc: 'Path to file with webhook params JSON'
55
56
  method_option :webhook_headers, type: :string, desc: 'Path to file with webhook headers JSON'
57
+ method_option :webhook_subscribe_output, type: :string, desc: 'Path to file with webhook subscribe output JSON'
56
58
  method_option :webhook_url, type: :string, desc: 'Webhook URL for automatic webhook subscription'
57
59
  method_option :output, type: :string, aliases: '-o', desc: 'Write output to JSON file'
58
60
  method_option :oauth2_code, type: :string, desc: 'OAuth2 code exchange to tokens pair'
@@ -125,11 +127,11 @@ module Workato
125
127
  method_option :api_email,
126
128
  type: :string,
127
129
  desc: 'Email for accessing Workato API or '\
128
- "set #{Workato::CLI::PushCommand::WORKATO_API_EMAIL_ENV} env"
130
+ "set #{Workato::Connector::Sdk::WORKATO_API_EMAIL_ENV} environment variable"
129
131
  method_option :api_token,
130
132
  type: :string,
131
133
  desc: 'Token for accessing Workato API or ' \
132
- "set #{Workato::CLI::PushCommand::WORKATO_API_TOKEN_ENV} env"
134
+ "set #{Workato::Connector::Sdk::WORKATO_API_TOKEN_ENV} environment variable"
133
135
  method_option :environment,
134
136
  type: :string,
135
137
  enum: Workato::CLI::PushCommand::ENVIRONMENTS.keys,
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'securerandom'
3
4
  require 'workato/web/app'
4
5
 
5
6
  module Workato
@@ -112,6 +113,7 @@ module Workato
112
113
  @authorize_url =
113
114
  if (authorization_url = connector.connection.authorization.authorization_url(settings))
114
115
  params = {
116
+ state: SecureRandom.hex(8),
115
117
  client_id: connector.connection.authorization.client_id(settings),
116
118
  redirect_uri: redirect_url
117
119
  }
@@ -10,9 +10,6 @@ module Workato
10
10
  class PushCommand
11
11
  include Thor::Shell
12
12
 
13
- WORKATO_API_TOKEN_ENV = 'WORKATO_API_TOKEN'
14
- WORKATO_API_EMAIL_ENV = 'WORKATO_API_EMAIL'
15
-
16
13
  ENVIRONMENTS = {
17
14
  'preview' => 'https://app.preview.workato.com',
18
15
  'preview-eu' => 'https://app.preview.eu.workato.com',
@@ -35,8 +32,8 @@ module Workato
35
32
  def initialize(options:)
36
33
  @options = options
37
34
  @api_base_url = ENVIRONMENTS.fetch(options[:environment])
38
- @api_email = options[:api_email] || ENV[WORKATO_API_EMAIL_ENV]
39
- @api_token = options[:api_token] || ENV[WORKATO_API_TOKEN_ENV]
35
+ @api_email = options[:api_email] || ENV[Workato::Connector::Sdk::WORKATO_API_EMAIL_ENV]
36
+ @api_token = options[:api_token] || ENV[Workato::Connector::Sdk::WORKATO_API_TOKEN_ENV]
40
37
  @folder_id = options[:folder]
41
38
  end
42
39
 
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Workato
4
+ module CLI
5
+ class SchemaCommand
6
+ include Thor::Shell
7
+
8
+ SAMPLE_TO_SCHEMA_SUPPORT_TYPES = %w[csv json].freeze
9
+ CSV_SEPARATORS = %w[comma space tab colon semicolon pipe].freeze
10
+
11
+ WORKATO_BASE_URL = ENV['WORKATO_BASE_URL'] || 'https://app.workato.com'
12
+ API_GENERATE_SCHEMA_PATH = '/api/sdk/generate_schema'
13
+
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]
17
+ @options = options
18
+ end
19
+
20
+ def call
21
+ if verbose?
22
+ say('INPUT')
23
+ say sample[:sample]
24
+ end
25
+
26
+ schema = sample_to_schema(sample)
27
+
28
+ say('SCHEMA') if verbose?
29
+ jj schema
30
+ end
31
+
32
+ private
33
+
34
+ attr_reader :options,
35
+ :api_token,
36
+ :api_email
37
+
38
+ def verbose?
39
+ @options[:verbose]
40
+ end
41
+
42
+ def sample
43
+ return @sample if @sample
44
+
45
+ @sample = if options[:json]
46
+ { sample: File.read(options[:json]), type: :json }
47
+ elsif options[:csv]
48
+ { sample: File.read(options[:csv]), type: :csv, col_sep: options[:col_sep] }
49
+ else
50
+ { sample: {}, type: :json }
51
+ end
52
+ end
53
+
54
+ def sample_to_schema(sample)
55
+ url = "#{WORKATO_BASE_URL}#{API_GENERATE_SCHEMA_PATH}/#{sample.delete(:type)}"
56
+ response = RestClient.post(
57
+ url,
58
+ sample.to_json,
59
+ {
60
+ content_type: :json,
61
+ accept: :json
62
+ }.merge(auth_headers)
63
+ )
64
+ JSON.parse(response.body)
65
+ rescue RestClient::ExceptionWithResponse => e
66
+ message = JSON.parse(e.response.body).fetch('message') rescue e.message
67
+ raise "Failed to generate schema: #{message}"
68
+ end
69
+
70
+ def auth_headers
71
+ {
72
+ 'x-user-email' => api_email,
73
+ 'x-user-token' => api_token
74
+ }
75
+ end
76
+
77
+ private_constant :API_GENERATE_SCHEMA_PATH,
78
+ :WORKATO_BASE_URL
79
+ end
80
+ end
81
+ end
@@ -56,8 +56,16 @@ module Workato
56
56
  trigger[:dedup].call(input)
57
57
  end
58
58
 
59
- def webhook_notification(input = {}, payload = {}, extended_input_schema = [],
60
- extended_output_schema = [], headers = {}, params = {})
59
+ def webhook_notification(
60
+ input = {},
61
+ payload = {},
62
+ extended_input_schema = [],
63
+ extended_output_schema = [],
64
+ headers = {},
65
+ params = {},
66
+ settings = nil,
67
+ webhook_subscribe_output = {}
68
+ )
61
69
  Dsl::WithDsl.execute(
62
70
  input.with_indifferent_access,
63
71
  payload.with_indifferent_access,
@@ -65,6 +73,8 @@ module Workato
65
73
  extended_output_schema.map(&:with_indifferent_access),
66
74
  headers.with_indifferent_access,
67
75
  params.with_indifferent_access,
76
+ (settings || @settings).with_indifferent_access,
77
+ webhook_subscribe_output.with_indifferent_access,
68
78
  &trigger[:webhook_notification]
69
79
  )
70
80
  end
@@ -89,23 +99,33 @@ module Workato
89
99
  end
90
100
  end
91
101
 
92
- def invoke(input = {}, payload = {}, headers = {}, params = {})
102
+ def invoke(input = {}, payload = {}, headers = {}, params = {}, webhook_subscribe_output = {})
93
103
  extended_schema = extended_schema(nil, input)
94
104
  config_schema = Schema.new(schema: config_fields_schema)
95
105
  input_schema = Schema.new(schema: extended_schema[:input])
96
106
  output_schema = Schema.new(schema: extended_schema[:output])
97
107
 
98
108
  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)
109
+ if webhook_notification?
110
+ webhook_notification(
111
+ input,
112
+ payload,
113
+ input_schema,
114
+ output_schema,
115
+ headers,
116
+ params,
117
+ nil,
118
+ webhook_subscribe_output
119
+ ).tap do |event|
120
+ apply_output_schema(event, output_schema)
121
+ end
122
+ else
123
+ output = poll(nil, input, nil, input_schema, output_schema)
124
+ output[:events].each do |event|
125
+ apply_output_schema(event, output_schema)
126
+ end
127
+ output
106
128
  end
107
-
108
- output
109
129
  end
110
130
 
111
131
  private
@@ -3,7 +3,7 @@
3
3
  module Workato
4
4
  module Connector
5
5
  module Sdk
6
- VERSION = '0.4.1'
6
+ VERSION = '1.0.1'
7
7
  end
8
8
  end
9
9
  end
@@ -19,6 +19,9 @@ module Workato
19
19
  DEFAULT_TIME_ZONE = 'Pacific Time (US & Canada)'
20
20
 
21
21
  DEFAULT_SCHEMAS_PATH = 'workato_schemas.json'
22
+
23
+ WORKATO_API_EMAIL_ENV = 'WORKATO_API_EMAIL'
24
+ WORKATO_API_TOKEN_ENV = 'WORKATO_API_TOKEN'
22
25
  end
23
26
  end
24
27
  end
@@ -229,6 +229,10 @@ module Workato
229
229
  self
230
230
  end
231
231
 
232
+ def to_json(_options = nil)
233
+ summary
234
+ end
235
+
232
236
  def binary?
233
237
  true
234
238
  end
@@ -245,19 +249,12 @@ module Workato
245
249
  as_string('utf-8')
246
250
  end
247
251
 
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
252
  def sha1
258
253
  Binary.new(::Digest::SHA1.digest(self))
259
254
  end
260
255
 
256
+ private
257
+
261
258
  def summary
262
259
  if length.positive?
263
260
  left = "0x#{byteslice(0, SUMMARY_LENGTH).unpack1('H*')}"
@@ -267,12 +264,8 @@ module Workato
267
264
  ''
268
265
  end
269
266
  end
270
-
271
- def self.from_base64(base64str)
272
- new(Base64.strict_decode64(base64str))
273
- end
274
267
  end
275
268
  end
276
269
  end
277
270
 
278
- String.include(Workato::Extension::String)
271
+ String.prepend(Workato::Extension::String)
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.4.1
4
+ version: 1.0.1
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-03-16 00:00:00.000000000 Z
11
+ date: 2022-05-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -380,6 +380,7 @@ files:
380
380
  - lib/workato/cli/main.rb
381
381
  - lib/workato/cli/oauth2_command.rb
382
382
  - lib/workato/cli/push_command.rb
383
+ - lib/workato/cli/schema_command.rb
383
384
  - lib/workato/connector/sdk.rb
384
385
  - lib/workato/connector/sdk/account_properties.rb
385
386
  - lib/workato/connector/sdk/action.rb
@@ -468,7 +469,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
468
469
  - !ruby/object:Gem::Version
469
470
  version: '0'
470
471
  requirements: []
471
- rubygems_version: 3.1.6
472
+ rubygems_version: 3.2.3
472
473
  signing_key:
473
474
  specification_version: 4
474
475
  summary: Gem for running adapter's code outside Workato infrastructure