multiwoven-integrations 0.1.2 → 0.1.6

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: e21d943bffd7e4ad698ecfc778df04a421e79c9020808e61ef30ac90c622a8ac
4
- data.tar.gz: 7838b443c4aa37a523369d0b6f1bf919b0b7e110cb16fb3a5fa7f72e274776ff
3
+ metadata.gz: 2ca3845d4b648bffe8c785fdd1cc0c206099deb7d7414700d528a25ec2fb72f9
4
+ data.tar.gz: 319139931a5c9a723a379c3aa116d3d6a825235fc6b80359abf6c19104fcc815
5
5
  SHA512:
6
- metadata.gz: 83dc8ffa3e34b4ff1d73a0f0b09304ff57765af634b1356f85d8f374e9aaa7acb81accecbfbdbe74ea0e3c96b32cf91ae28adb8fb7885b2a0008b3f59432cd34
7
- data.tar.gz: 2cbe6766d9729ed2c3505403b0c197c8ae8dbb3d31a107fffcc3bb474032921295724b2446be80df9798d6776d901006a524929b4ae56593c92ae72816879cec
6
+ metadata.gz: f5a96c27ef09fb593a0f000bbefa835fb79ec2c7876a7d84635013f757d8a31a52f7f5f32b791a9539dc6494af0092faf28ca8c13cccc1b4465e94eeba49490a
7
+ data.tar.gz: a9ddefdc6259d2d160ea118e1571ed1facc8cb39d533f490692e085a12d160b2d8ec8138ab1801353c0e31eb172111ffa51d1c49af9b1b54c9a1645b7a9315f1
@@ -3,7 +3,7 @@
3
3
  {
4
4
  "name": "Facebook",
5
5
  "connector_type": "destination",
6
- "connector_subtype": "API",
6
+ "category": "Adtech",
7
7
  "documentation_url": "https://docs.mutliwoven.com",
8
8
  "github_issue_label": "destination-facebook",
9
9
  "icon": "facebook.svg",
@@ -3,7 +3,7 @@
3
3
  {
4
4
  "name": "Klaviyo",
5
5
  "connector_type": "destination",
6
- "connector_subtype": "API",
6
+ "category": "Marketing Automation",
7
7
  "documentation_url": "https://docs.mutliwoven.com",
8
8
  "github_issue_label": "destination-klaviyo",
9
9
  "icon": "klaviyo.svg",
@@ -3,7 +3,7 @@
3
3
  {
4
4
  "name": "Salesforce CRM",
5
5
  "connector_type": "destination",
6
- "connector_subtype": "API",
6
+ "category": "CRM",
7
7
  "documentation_url": "https://docs.mutliwoven.com",
8
8
  "github_issue_label": "destination-salesforce-crm",
9
9
  "icon": "salesforce.svg",
@@ -0,0 +1,125 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Multiwoven
4
+ module Integrations
5
+ module Destination
6
+ module Slack
7
+ include Multiwoven::Integrations::Core
8
+
9
+ class Client < DestinationConnector
10
+ attr_accessor :channel_id
11
+
12
+ def check_connection(connection_config)
13
+ configure_slack(connection_config[:api_token])
14
+ client = ::Slack::Web::Client.new
15
+ client.auth_test
16
+ success_status
17
+ rescue StandardError => e
18
+ failure_status(e)
19
+ end
20
+
21
+ def discover(_connection_config = nil)
22
+ catalog = build_catalog(load_catalog_streams)
23
+ catalog.to_multiwoven_message
24
+ rescue StandardError => e
25
+ handle_exception("SLACK:DISCOVER:EXCEPTION", "error", e)
26
+ end
27
+
28
+ def write(sync_config, records, action = "create")
29
+ # Currently as we only create a message for each record in slack, we are not using actions.
30
+ # This will be changed in future.
31
+
32
+ @action = sync_config.stream.action || action
33
+ connection_config = sync_config.destination.connection_specification.with_indifferent_access
34
+ configure_slack(connection_config[:api_token])
35
+ @client = ::Slack::Web::Client.new
36
+ @channel_id = connection_config[:channel_id]
37
+ process_records(records, sync_config.stream)
38
+ rescue StandardError => e
39
+ handle_exception("SLACK:WRITE:EXCEPTION", "error", e)
40
+ end
41
+
42
+ private
43
+
44
+ def configure_slack(api_token)
45
+ ::Slack.configure do |config|
46
+ config.token = api_token
47
+ end
48
+ end
49
+
50
+ def process_records(records, stream)
51
+ write_success = 0
52
+ write_failure = 0
53
+ records.each do |record_object|
54
+ process_record(stream, record_object.with_indifferent_access)
55
+ write_success += 1
56
+ rescue StandardError => e
57
+ write_failure += 1
58
+ handle_exception("SLACK:CRM:WRITE:EXCEPTION", "error", e)
59
+ end
60
+ tracking_message(write_success, write_failure)
61
+ end
62
+
63
+ def process_record(stream, record)
64
+ send_data_to_slack(stream[:name], record)
65
+ end
66
+
67
+ def send_data_to_slack(stream_name, record = {})
68
+ args = build_args(stream_name, record)
69
+ @client.send(stream_name, **args)
70
+ end
71
+
72
+ def build_args(stream_name, record)
73
+ case stream_name
74
+ when "chat_postMessage"
75
+ { channel: channel_id, text: slack_code_block(record[:data]) }
76
+ else
77
+ raise "Stream name not found: #{stream_name}"
78
+ end
79
+ end
80
+
81
+ def slack_code_block(data)
82
+ longest_key = data.keys.map(&:to_s).max_by(&:length).length
83
+ table_str = "```\n"
84
+ data.each do |key, value|
85
+ table_str += "#{key.to_s.ljust(longest_key)} : #{value}\n"
86
+ end
87
+ table_str += "```"
88
+
89
+ table_str
90
+ end
91
+
92
+ def success_status
93
+ ConnectionStatus.new(status: ConnectionStatusType["succeeded"]).to_multiwoven_message
94
+ end
95
+
96
+ def failure_status(error)
97
+ ConnectionStatus.new(status: ConnectionStatusType["failed"], message: error.message).to_multiwoven_message
98
+ end
99
+
100
+ def load_catalog_streams
101
+ catalog_json = read_json(CATALOG_SPEC_PATH)
102
+ catalog_json["streams"].map { |stream| build_stream(stream) }
103
+ end
104
+
105
+ def build_stream(stream)
106
+ Multiwoven::Integrations::Protocol::Stream.new(
107
+ name: stream["name"], json_schema: stream["json_schema"],
108
+ action: stream["action"]
109
+ )
110
+ end
111
+
112
+ def build_catalog(streams)
113
+ Multiwoven::Integrations::Protocol::Catalog.new(streams: streams)
114
+ end
115
+
116
+ def tracking_message(success, failure)
117
+ Multiwoven::Integrations::Protocol::TrackingMessage.new(
118
+ success: success, failed: failure
119
+ ).to_multiwoven_message
120
+ end
121
+ end
122
+ end
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,71 @@
1
+ {
2
+ "streams": [
3
+ {
4
+ "name": "chat_postMessage",
5
+ "action": "create",
6
+ "json_schema": {
7
+ "type": "object",
8
+ "additionalProperties": false,
9
+ "properties": {
10
+ "text": {
11
+ "type": ["string", "null"]
12
+ },
13
+ "attachments": {
14
+ "type": ["string", "null"]
15
+ },
16
+ "blocks": {
17
+ "type": ["array", "null"],
18
+ "items": {
19
+ "type": "string"
20
+ }
21
+ },
22
+ "as_user": {
23
+ "type": ["boolean", "null"]
24
+ },
25
+ "icon_emoji": {
26
+ "type": ["string", "null"]
27
+ },
28
+ "icon_url": {
29
+ "type": ["string", "null"]
30
+ },
31
+ "link_names": {
32
+ "type": ["boolean", "null"]
33
+ },
34
+ "metadata": {
35
+ "type": ["string", "null"]
36
+ },
37
+ "mrkdwn": {
38
+ "type": ["boolean", "null"]
39
+ },
40
+ "parse": {
41
+ "type": ["string", "null"]
42
+ },
43
+ "reply_broadcast": {
44
+ "type": ["boolean", "null"]
45
+ },
46
+ "thread_ts": {
47
+ "type": ["string", "null"]
48
+ },
49
+ "unfurl_links": {
50
+ "type": ["boolean", "null"]
51
+ },
52
+ "unfurl_media": {
53
+ "type": ["boolean", "null"]
54
+ },
55
+ "username": {
56
+ "type": ["string", "null"]
57
+ }
58
+ },
59
+ "oneOf": [
60
+ { "required": ["text"] },
61
+ { "required": ["attachments"] },
62
+ { "required": ["blocks"] }
63
+ ]
64
+ },
65
+ "supported_sync_modes": ["full_refresh", "incremental"],
66
+ "source_defined_cursor": true,
67
+ "default_cursor_field": ["updated"],
68
+ "source_defined_primary_key": [["Id"]]
69
+ }
70
+ ]
71
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "data": {
3
+ "name": "Slack",
4
+ "connector_type": "destination",
5
+ "category": "Team Collaboration",
6
+ "documentation_url": "https://docs.mutliwoven.com",
7
+ "github_issue_label": "destination-slack",
8
+ "icon": "slack.svg",
9
+ "license": "MIT",
10
+ "release_stage": "alpha",
11
+ "support_level": "community",
12
+ "tags": ["language:ruby", "multiwoven"]
13
+ }
14
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "documentation_url": "https://docs.multiwoven.com/integrations/destination/slack",
3
+ "stream_type": "static",
4
+ "connection_specification": {
5
+ "$schema": "http://json-schema.org/draft-07/schema#",
6
+ "title": "Slack Destination Spec",
7
+ "type": "object",
8
+ "required": ["api_token"],
9
+ "properties": {
10
+ "api_token": {
11
+ "type": "string",
12
+ "title": "API Token",
13
+ "order": 0
14
+ },
15
+ "channel_id": {
16
+ "type": "string",
17
+ "title": "Channel ID",
18
+ "order": 1
19
+ }
20
+ }
21
+ }
22
+ }
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Multiwoven
4
4
  module Integrations
5
- VERSION = "0.1.2"
5
+ VERSION = "0.1.6"
6
6
 
7
7
  ENABLED_SOURCES = %w[
8
8
  Snowflake
@@ -14,6 +14,7 @@ module Multiwoven
14
14
  Klaviyo
15
15
  SalesforceCrm
16
16
  FacebookCustomAudience
17
+ Slack
17
18
  ].freeze
18
19
  end
19
20
  end
@@ -3,7 +3,7 @@
3
3
  {
4
4
  "name": "BigQuery",
5
5
  "connector_type": "source",
6
- "connector_subtype": "database",
6
+ "category": "Data Warehouse",
7
7
  "documentation_url": "https://docs.mutliwoven.com",
8
8
  "github_issue_label": "source-bigquery",
9
9
  "icon": "bigquery.svg",
@@ -3,7 +3,7 @@
3
3
  {
4
4
  "name": "Redshift",
5
5
  "connector_type": "source",
6
- "connector_subtype": "database",
6
+ "category": "Data Warehouse",
7
7
  "documentation_url": "https://docs.mutliwoven.com",
8
8
  "github_issue_label": "source-redshift",
9
9
  "icon": "redshift.svg",
@@ -3,7 +3,7 @@
3
3
  {
4
4
  "name": "Snowflake",
5
5
  "connector_type": "source",
6
- "connector_subtype": "database",
6
+ "category": "Data Warehouse",
7
7
  "documentation_url": "https://docs.mutliwoven.com",
8
8
  "github_issue_label": "source-snowflake",
9
9
  "icon": "snowflake.svg",
@@ -12,6 +12,7 @@ require "uri"
12
12
  require "active_support/core_ext/hash/indifferent_access"
13
13
  require "restforce"
14
14
  require "logger"
15
+ require "slack-ruby-client"
15
16
 
16
17
  # Service
17
18
  require_relative "integrations/config"
@@ -36,6 +37,7 @@ require_relative "integrations/source/bigquery/client"
36
37
  require_relative "integrations/destination/klaviyo/client"
37
38
  require_relative "integrations/destination/salesforce_crm/client"
38
39
  require_relative "integrations/destination/facebook_custom_audience/client"
40
+ require_relative "integrations/destination/slack/client"
39
41
 
40
42
  module Multiwoven
41
43
  module Integrations
@@ -34,6 +34,7 @@ Gem::Specification.new do |spec|
34
34
  spec.require_paths = ["lib"]
35
35
 
36
36
  spec.add_runtime_dependency "activesupport"
37
+ spec.add_runtime_dependency "async-websocket"
37
38
  spec.add_runtime_dependency "dry-schema"
38
39
  spec.add_runtime_dependency "dry-struct"
39
40
  spec.add_runtime_dependency "dry-types"
@@ -43,6 +44,7 @@ Gem::Specification.new do |spec|
43
44
  spec.add_runtime_dependency "restforce"
44
45
  spec.add_runtime_dependency "ruby-odbc"
45
46
  spec.add_runtime_dependency "sequel"
47
+ spec.add_runtime_dependency "slack-ruby-client"
46
48
 
47
49
  spec.add_development_dependency "byebug"
48
50
  spec.add_development_dependency "rspec"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: multiwoven-integrations
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Subin T P
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-01-23 00:00:00.000000000 Z
11
+ date: 2024-01-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: async-websocket
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: dry-schema
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -150,6 +164,20 @@ dependencies:
150
164
  - - ">="
151
165
  - !ruby/object:Gem::Version
152
166
  version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: slack-ruby-client
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :runtime
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
153
181
  - !ruby/object:Gem::Dependency
154
182
  name: byebug
155
183
  requirement: !ruby/object:Gem::Requirement
@@ -271,6 +299,10 @@ files:
271
299
  - lib/multiwoven/integrations/destination/salesforce_crm/config/catalog.json
272
300
  - lib/multiwoven/integrations/destination/salesforce_crm/config/meta.json
273
301
  - lib/multiwoven/integrations/destination/salesforce_crm/config/spec.json
302
+ - lib/multiwoven/integrations/destination/slack/client.rb
303
+ - lib/multiwoven/integrations/destination/slack/config/catalog.json
304
+ - lib/multiwoven/integrations/destination/slack/config/meta.json
305
+ - lib/multiwoven/integrations/destination/slack/config/spec.json
274
306
  - lib/multiwoven/integrations/protocol/protocol.json
275
307
  - lib/multiwoven/integrations/protocol/protocol.rb
276
308
  - lib/multiwoven/integrations/rollout.rb
@@ -309,7 +341,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
309
341
  - !ruby/object:Gem::Version
310
342
  version: '0'
311
343
  requirements: []
312
- rubygems_version: 3.4.22
344
+ rubygems_version: 3.5.3
313
345
  signing_key:
314
346
  specification_version: 4
315
347
  summary: Integration suite for open source reverse ETL platform