multiwoven-integrations 0.1.76 → 0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 489b7124c7814169b6c17fbd7de9cbde740e2f23f4ce0e0f0f74ddf6ba1b73c8
4
- data.tar.gz: 74fb01f7fa855194d7585df7ab7c79afd8a84d811be3989c30b53e3232174c9b
3
+ metadata.gz: febb4cb77450c3c979b96a081e455bd9bcc7e108cd2947f3fc234d967a4c6be5
4
+ data.tar.gz: e2c4cfec3ffb70f51ba93ba1ce5e0f65183af0473db3ac7530178249ad87cb4b
5
5
  SHA512:
6
- metadata.gz: 470ab95e9f07707468d2baa2f414436545ffa6f51d456ee2b498ae3b88e71df0fd3e73fadf8ca2d7429238a4b8676272bbd9cec81aa762745c571625b7be2791
7
- data.tar.gz: 30cf3c3609382f06a4d7509e2923902011dbe85f0ff23aecd8ae5ec392289de759388a438389ca3bc22aeb68ce507b0aa9ef0c8131a9d0fa5db47cde381dfff1
6
+ metadata.gz: 367011ca22c74f7792ffc576041c25527b5890f07e0cad6e49f64abfb444e06656f415fbb601a7743ad8f47f12eebc5382a301a237ec180db259d6bed8c72709
7
+ data.tar.gz: 056e9d7df88a2444e4d9cc500af8b87f0376c4bde9e1236848b7ee1d633bd243f1275d72f251c8354e0eb208308d29b5727717623f99d248b3e7596c25dd3ce0
@@ -13,6 +13,12 @@ module Multiwoven
13
13
 
14
14
  private
15
15
 
16
+ # This needs to be implemented as private method
17
+ # In every source connector. This will be used for model preview
18
+ def create_connection(connector_config)
19
+ # return a connection to the client's source
20
+ end
21
+
16
22
  # This needs to be implemented as private method
17
23
  # In every source connector. This will be used for model preview
18
24
  def query(connection, query)
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Multiwoven
4
4
  module Integrations
5
- VERSION = "0.1.76"
5
+ VERSION = "0.3.0"
6
6
 
7
7
  ENABLED_SOURCES = %w[
8
8
  Snowflake
@@ -13,6 +13,8 @@ module Multiwoven
13
13
  SalesforceConsumerGoodsCloud
14
14
  AwsAthena
15
15
  Clickhouse
16
+ AmazonS3
17
+ MariaDB
16
18
  ].freeze
17
19
 
18
20
  ENABLED_DESTINATIONS = %w[
@@ -0,0 +1,151 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Multiwoven::Integrations::Source
4
+ module AmazonS3
5
+ include Multiwoven::Integrations::Core
6
+ class Client < SourceConnector
7
+ DISCOVER_QUERY = "SELECT * FROM S3Object LIMIT 1;"
8
+
9
+ def check_connection(connection_config)
10
+ connection_config = connection_config.with_indifferent_access
11
+ client = config_aws(connection_config)
12
+ client.get_bucket_policy_status({ bucket: connection_config[:bucket] })
13
+ ConnectionStatus.new(status: ConnectionStatusType["succeeded"]).to_multiwoven_message
14
+ rescue StandardError => e
15
+ ConnectionStatus.new(status: ConnectionStatusType["failed"], message: e.message).to_multiwoven_message
16
+ end
17
+
18
+ def discover(connection_config)
19
+ connection_config = connection_config.with_indifferent_access
20
+ conn = create_connection(connection_config)
21
+ # If pulling from multiple files, all files must have the same schema
22
+ path = build_path(connection_config[:path])
23
+ full_path = "s3://#{connection_config[:bucket]}/#{path}*.#{connection_config[:file_type]}"
24
+ records = get_results(conn, "DESCRIBE SELECT * FROM '#{full_path}';")
25
+ columns = build_discover_columns(records)
26
+ streams = [Multiwoven::Integrations::Protocol::Stream.new(name: full_path, action: StreamAction["fetch"], json_schema: convert_to_json_schema(columns))]
27
+ catalog = Catalog.new(streams: streams)
28
+ catalog.to_multiwoven_message
29
+ rescue StandardError => e
30
+ handle_exception(e, { context: "AMAZONS3:DISCOVER:EXCEPTION", type: "error" })
31
+ end
32
+
33
+ def read(sync_config)
34
+ connection_config = sync_config.source.connection_specification.with_indifferent_access
35
+ conn = create_connection(connection_config)
36
+ query = sync_config.model.query
37
+ query = batched_query(query, sync_config.limit, sync_config.offset) unless sync_config.limit.nil? && sync_config.offset.nil?
38
+ query(conn, query)
39
+ rescue StandardError => e
40
+ handle_exception(e, {
41
+ context: "AMAZONS3:READ:EXCEPTION",
42
+ type: "error",
43
+ sync_id: sync_config.sync_id,
44
+ sync_run_id: sync_config.sync_run_id
45
+ })
46
+ end
47
+
48
+ private
49
+
50
+ # DuckDB
51
+ def create_connection(connection_config)
52
+ conn = DuckDB::Database.open.connect
53
+ # Set up S3 configuration
54
+ secret_query = "
55
+ CREATE SECRET amazons3_source (
56
+ TYPE S3,
57
+ KEY_ID '#{connection_config[:access_id]}',
58
+ SECRET '#{connection_config[:secret_access]}',
59
+ REGION '#{connection_config[:region]}'
60
+ );
61
+ "
62
+ get_results(conn, secret_query)
63
+ conn
64
+ end
65
+
66
+ def build_path(path)
67
+ path = "#{path}/" if !path.to_s.strip.empty? && path[-1] != "/"
68
+ path
69
+ end
70
+
71
+ def get_results(conn, query)
72
+ results = conn.query(query)
73
+ hash_array_values(results)
74
+ end
75
+
76
+ def query(conn, query)
77
+ records = get_results(conn, query)
78
+ records.map do |row|
79
+ RecordMessage.new(data: row, emitted_at: Time.now.to_i).to_multiwoven_message
80
+ end
81
+ end
82
+
83
+ def hash_array_values(describe)
84
+ keys = describe.columns.map(&:name)
85
+ describe.map do |row|
86
+ Hash[keys.zip(row)]
87
+ end
88
+ end
89
+
90
+ def build_discover_columns(describe_results)
91
+ describe_results.map do |row|
92
+ type = column_schema_helper(row["column_type"])
93
+ {
94
+ column_name: row["column_name"],
95
+ type: type
96
+ }
97
+ end
98
+ end
99
+
100
+ def column_schema_helper(column_type)
101
+ case column_type
102
+ when "VARCHAR", "BIT", "DATE", "TIME", "TIMESTAMP", "UUID"
103
+ "string"
104
+ when "DOUBLE"
105
+ "number"
106
+ when "BIGINT", "HUGEINT", "INTEGER", "SMALLINT"
107
+ "integer"
108
+ when "BOOLEAN"
109
+ "boolean"
110
+ end
111
+ end
112
+
113
+ # AWS SDK
114
+ def config_aws(config)
115
+ config = config.with_indifferent_access
116
+ Aws.config.update({
117
+ region: config[:region],
118
+ credentials: Aws::Credentials.new(config[:access_id], config[:secret_access])
119
+ })
120
+ config.with_indifferent_access
121
+ Aws::S3::Client.new
122
+ end
123
+
124
+ def build_select_content_options(config, query)
125
+ config = config.with_indifferent_access
126
+ bucket_name = config[:bucket]
127
+ file_key = config[:file_key]
128
+ file_type = config[:file_type]
129
+ options = {
130
+ bucket: bucket_name,
131
+ key: file_key,
132
+ expression_type: "SQL",
133
+ expression: query,
134
+ output_serialization: {
135
+ json: {}
136
+ }
137
+ }
138
+ if file_type == "parquet"
139
+ options[:input_serialization] = {
140
+ parquet: {}
141
+ }
142
+ elsif file_type == "csv"
143
+ options[:input_serialization] = {
144
+ csv: { file_header_info: "USE" }
145
+ }
146
+ end
147
+ options
148
+ end
149
+ end
150
+ end
151
+ end
@@ -0,0 +1,15 @@
1
+ {
2
+ "data": {
3
+ "name": "AmazonS3",
4
+ "title": "Amazon S3",
5
+ "connector_type": "source",
6
+ "category": "Data Lake",
7
+ "documentation_url": "https://docs.mutliwoven.com",
8
+ "github_issue_label": "source-amazons3",
9
+ "icon": "icon.svg",
10
+ "license": "MIT",
11
+ "release_stage": "alpha",
12
+ "support_level": "community",
13
+ "tags": ["language:ruby", "multiwoven"]
14
+ }
15
+ }
@@ -0,0 +1,51 @@
1
+ {
2
+ "documentation_url": "https://docs.multiwoven.com/integrations/sources/amazons3",
3
+ "stream_type": "dynamic",
4
+ "connector_query_type": "raw_sql",
5
+ "connection_specification": {
6
+ "$schema": "http://json-schema.org/draft-07/schema#",
7
+ "title": "AmazonS3",
8
+ "type": "object",
9
+ "required": ["region", "bucket", "access_id", "secret_access", "file_type"],
10
+ "properties": {
11
+ "region": {
12
+ "description": "AWS region",
13
+ "examples": ["us-east-2"],
14
+ "type": "string",
15
+ "title": "Region",
16
+ "order": 1
17
+ },
18
+ "access_id": {
19
+ "type": "string",
20
+ "title": "Access Id",
21
+ "order": 2
22
+ },
23
+ "secret_access": {
24
+ "type": "string",
25
+ "title": "Secret Access",
26
+ "multiwoven_secret": true,
27
+ "order": 3
28
+ },
29
+ "bucket": {
30
+ "description": "Bucket Name",
31
+ "type": "string",
32
+ "title": "Bucket",
33
+ "order": 4
34
+ },
35
+ "path": {
36
+ "description": "Path to csv or parquet files",
37
+ "examples": ["/path/to/files"],
38
+ "type": "string",
39
+ "title": "Path",
40
+ "order": 5
41
+ },
42
+ "file_type": {
43
+ "description": "The type of file to read",
44
+ "type": "string",
45
+ "title": "File Type",
46
+ "enum": ["csv", "parquet"],
47
+ "order": 6
48
+ }
49
+ }
50
+ }
51
+ }
@@ -0,0 +1,34 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="428" height="512" viewBox="0 0 428 512">
2
+ <defs>
3
+ <style>
4
+ .cls-1 {
5
+ fill: #e25444;
6
+ }
7
+
8
+ .cls-1, .cls-2, .cls-3 {
9
+ fill-rule: evenodd;
10
+ }
11
+
12
+ .cls-2 {
13
+ fill: #7b1d13;
14
+ }
15
+
16
+ .cls-3 {
17
+ fill: #58150d;
18
+ }
19
+ </style>
20
+ </defs>
21
+ <path class="cls-1" d="M378,99L295,257l83,158,34-19V118Z"/>
22
+ <path class="cls-2" d="M378,99L212,118,127.5,257,212,396l166,19V99Z"/>
23
+ <path class="cls-3" d="M43,99L16,111V403l27,12L212,257Z"/>
24
+ <path class="cls-1" d="M42.637,98.667l169.587,47.111V372.444L42.637,415.111V98.667Z"/>
25
+ <path class="cls-3" d="M212.313,170.667l-72.008-11.556,72.008-81.778,71.83,81.778Z"/>
26
+ <path class="cls-3" d="M284.143,159.111l-71.919,11.733-71.919-11.733V77.333"/>
27
+ <path class="cls-3" d="M212.313,342.222l-72.008,13.334,72.008,70.222,71.83-70.222Z"/>
28
+ <path class="cls-2" d="M212,16L140,54V159l72.224-20.333Z"/>
29
+ <path class="cls-2" d="M212.224,196.444l-71.919,7.823V309.105l71.919,8.228V196.444Z"/>
30
+ <path class="cls-2" d="M212.224,373.333L140.305,355.3V458.363L212.224,496V373.333Z"/>
31
+ <path class="cls-1" d="M284.143,355.3l-71.919,18.038V496l71.919-37.637V355.3Z"/>
32
+ <path class="cls-1" d="M212.224,196.444l71.919,7.823V309.105l-71.919,8.228V196.444Z"/>
33
+ <path class="cls-1" d="M212,16l72,38V159l-72-20V16Z"/>
34
+ </svg>
@@ -0,0 +1,92 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Multiwoven::Integrations::Source
4
+ module MariaDB
5
+ include Multiwoven::Integrations::Core
6
+ class Client < SourceConnector
7
+ def check_connection(connection_config)
8
+ connection_config = connection_config.with_indifferent_access
9
+ create_connection(connection_config)
10
+ ConnectionStatus.new(status: ConnectionStatusType["succeeded"]).to_multiwoven_message
11
+ rescue StandardError => e
12
+ ConnectionStatus.new(status: ConnectionStatusType["failed"], message: e.message).to_multiwoven_message
13
+ end
14
+
15
+ def discover(connection_config)
16
+ connection_config = connection_config.with_indifferent_access
17
+ query = "SELECT table_name, column_name, data_type, is_nullable FROM information_schema.columns WHERE table_schema = '#{connection_config[:database]}' ORDER BY table_name, ordinal_position;"
18
+ db = create_connection(connection_config)
19
+ results = query_execution(db, query)
20
+ catalog = Catalog.new(streams: create_streams(results))
21
+ catalog.to_multiwoven_message
22
+ rescue StandardError => e
23
+ handle_exception(e, {
24
+ context: "MARIA:DB:DISCOVER:EXCEPTION",
25
+ type: "error"
26
+ })
27
+ end
28
+
29
+ def read(sync_config)
30
+ connection_config = sync_config.source.connection_specification.with_indifferent_access
31
+ query = sync_config.model.query
32
+ query = batched_query(query, sync_config.limit, sync_config.offset) unless sync_config.limit.nil? && sync_config.offset.nil?
33
+ db = create_connection(connection_config)
34
+ query(db, query)
35
+ rescue StandardError => e
36
+ handle_exception(e, {
37
+ context: "MARIA:DB:READ:EXCEPTION",
38
+ type: "error",
39
+ sync_id: sync_config.sync_id,
40
+ sync_run_id: sync_config.sync_run_id
41
+ })
42
+ end
43
+
44
+ private
45
+
46
+ def create_connection(connection_config)
47
+ Sequel.connect(
48
+ adapter: "mysql2",
49
+ host: connection_config[:host],
50
+ port: connection_config[:port],
51
+ user: connection_config[:username],
52
+ password: connection_config[:password],
53
+ database: connection_config[:database]
54
+ )
55
+ end
56
+
57
+ def query_execution(db, query)
58
+ db.fetch(query).all
59
+ end
60
+
61
+ def create_streams(records)
62
+ group_by_table(records).map do |_, r|
63
+ Multiwoven::Integrations::Protocol::Stream.new(name: r[:tablename], action: StreamAction["fetch"], json_schema: convert_to_json_schema(r[:columns]))
64
+ end
65
+ end
66
+
67
+ def query(db, query)
68
+ records = []
69
+ query_execution(db, query).map do |row|
70
+ records << RecordMessage.new(data: row, emitted_at: Time.now.to_i).to_multiwoven_message
71
+ end
72
+ records
73
+ end
74
+
75
+ def group_by_table(records)
76
+ result = {}
77
+ records.each_with_index do |entry, index|
78
+ table_name = entry[:table_name]
79
+ column_data = {
80
+ column_name: entry[:column_name],
81
+ data_type: entry[:data_type],
82
+ is_nullable: entry[:is_nullable] == "YES"
83
+ }
84
+ result[index] ||= {}
85
+ result[index][:tablename] = table_name
86
+ result[index][:columns] = [column_data]
87
+ end
88
+ result
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,15 @@
1
+ {
2
+ "data": {
3
+ "name": "MariaDB",
4
+ "title": "Maria DB",
5
+ "connector_type": "source",
6
+ "category": "Data Warehouse",
7
+ "documentation_url": "https://docs.squared.ai/guides/data-integration/sources/mariadb",
8
+ "github_issue_label": "source-maria-db",
9
+ "icon": "icon.svg",
10
+ "license": "MIT",
11
+ "release_stage": "alpha",
12
+ "support_level": "community",
13
+ "tags": ["language:ruby", "multiwoven"]
14
+ }
15
+ }
@@ -0,0 +1,48 @@
1
+ {
2
+ "documentation_url": "https://docs.squared.ai/guides/data-integration/sources/mariadb",
3
+ "stream_type": "dynamic",
4
+ "connector_query_type": "raw_sql",
5
+ "connection_specification": {
6
+ "$schema": "http://json-schema.org/draft-07/schema#",
7
+ "title": "Maria DB",
8
+ "type": "object",
9
+ "required": ["host", "port", "username", "password", "database"],
10
+ "properties": {
11
+ "host": {
12
+ "description": "The hostname or IP address of the server where the MariaDB database is hosted.",
13
+ "examples": ["localhost"],
14
+ "type": "string",
15
+ "title": "Host",
16
+ "order": 0
17
+ },
18
+ "port": {
19
+ "description": "The port number on which the MariaDB server is listening for connections.",
20
+ "examples": ["3306"],
21
+ "type": "string",
22
+ "title": "Port",
23
+ "order": 1
24
+ },
25
+ "username": {
26
+ "description": "The username used to authenticate and connect to the MariaDB database.",
27
+ "examples": ["root"],
28
+ "type": "string",
29
+ "title": "Username",
30
+ "order": 2
31
+ },
32
+ "password": {
33
+ "description": "The password corresponding to the username used for authentication.",
34
+ "type": "string",
35
+ "multiwoven_secret": true,
36
+ "title": "Password",
37
+ "order": 3
38
+ },
39
+ "database": {
40
+ "description": "The name of the specific database within the MariaDB server to connect to.",
41
+ "examples": ["mydatabase"],
42
+ "type": "string",
43
+ "title": "Database",
44
+ "order": 4
45
+ }
46
+ }
47
+ }
48
+ }
@@ -0,0 +1,15 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" id="Layer_1" data-name="Layer 1" viewBox="0 0 309.88 252.72">
3
+ <defs>
4
+ <style>.cls-1{fill:#003545;}</style>
5
+ </defs>
6
+ <title>MDB-VLogo_RGB</title>
7
+ <path class="cls-1" d="M61.74,214.91,73,258.46h-8.5L57,227.09,42.86,258.46H35.68L21.62,227.27,13.9,258.46H5.58l11.16-43.55H24.1l15.2,33.72,15.14-33.72Z" transform="translate(-5.58 -6.4)"></path>
8
+ <path class="cls-1" d="M105.11,231.74v-5.07h8.21v31.79h-8.21v-5.12c-2.17,3.68-6.63,5.79-12.06,5.79-11.35,0-17.68-8-17.68-17.2,0-8.87,6-16,16.47-16C97.81,226,102.76,228,105.11,231.74Zm-21,10.62c0,5.85,3.68,10.86,10.8,10.86,6.87,0,10.61-4.89,10.61-10.68s-3.86-10.74-11-10.74C87.68,231.8,84.12,236.74,84.12,242.36Z" transform="translate(-5.58 -6.4)"></path>
9
+ <path class="cls-1" d="M131.83,258.46h-8.2V226.67h8.2v7.12A12.58,12.58,0,0,1,143.29,226a14.84,14.84,0,0,1,5.13.84l-1.75,6a18,18,0,0,0-4.34-.6c-5.92,0-10.5,4.46-10.5,11Z" transform="translate(-5.58 -6.4)"></path>
10
+ <path class="cls-1" d="M152.52,218.28a4.17,4.17,0,0,1,4.4-4.28,4.33,4.33,0,0,1,4.47,4.41,4.15,4.15,0,0,1-4.47,4.22A4.22,4.22,0,0,1,152.52,218.28Zm.36,8.39h8.21V249.9c0,1.44.3,2.47,1.5,2.47a8.85,8.85,0,0,0,1.57-.18l1.27,6a14.36,14.36,0,0,1-5.43,1c-3.44,0-7.12-1-7.12-8.81Z" transform="translate(-5.58 -6.4)"></path>
11
+ <path class="cls-1" d="M197.76,231.74v-5.07H206v31.79h-8.21v-5.12c-2.17,3.68-6.63,5.79-12.06,5.79-11.34,0-17.68-8-17.68-17.2,0-8.87,6-16,16.47-16C190.46,226,195.41,228,197.76,231.74Zm-21,10.62c0,5.85,3.68,10.86,10.8,10.86,6.88,0,10.62-4.89,10.62-10.68s-3.87-10.74-11-10.74C180.33,231.8,176.77,236.74,176.77,242.36Z" transform="translate(-5.58 -6.4)"></path>
12
+ <path class="cls-1" d="M218.57,214.91h19.67c16.53,0,24.79,9.11,24.67,21.77.12,13.16-9,21.78-23.22,21.78H218.57Zm5.43,3.86v35.89h15c13.15,0,18.16-8.87,18.16-18.1,0-10.43-6.27-17.79-18.16-17.79Z" transform="translate(-5.58 -6.4)"></path>
13
+ <path class="cls-1" d="M296.45,258.46h-25V214.91H294c8.62,0,16.83,1.62,16.71,11.28,0,6.81-4.23,8.69-8.69,9.41,6.33.54,10.14,4.58,10.14,11.1C312.2,256.47,303.63,258.46,296.45,258.46Zm-1.87-24.55c8.63,0,10.56-3.32,10.56-7.54,0-6.34-3.86-7.78-10.56-7.78H276.66v15.32Zm.24,3.68H276.66v17.19H295.6c5.31,0,10.92-1.75,10.92-8.44C306.52,238.62,300.07,237.59,294.82,237.59Z" transform="translate(-5.58 -6.4)"></path>
14
+ <path class="cls-1" d="M314.08,7.35a4.18,4.18,0,0,0-2.84-.95c-2.83,0-6.49,1.92-8.46,2.95l-.78.4a26.86,26.86,0,0,1-10.57,2.66c-3.76.12-7,.34-11.22.78-25,2.57-36.15,21.73-46.89,40.26C227.47,63.53,221.43,74,213.15,82a54.4,54.4,0,0,1-5.45,4.63C199.13,93,188.37,97.55,180,100.77c-8.06,3.08-16.86,5.85-25.36,8.53-7.79,2.45-15.14,4.77-21.9,7.28-3.05,1.13-5.64,2-7.93,2.76-6.16,2-10.6,3.53-17.09,8-2.53,1.73-5.07,3.6-6.79,5a71.62,71.62,0,0,0-13.55,14.27A84.25,84.25,0,0,1,76,160.27c-1.37,1.34-3.8,2-7.44,2-4.26,0-9.43-.88-14.9-1.81-5.64-1-11.47-1.95-16.47-1.95-4.06,0-7.17.66-9.49,2,0,0-3.91,2.28-5.56,5.23l1.62.73a33.21,33.21,0,0,1,6.92,5,34.72,34.72,0,0,0,7.2,5.12A6.18,6.18,0,0,1,40.1,178c-.68,1-1.68,2.29-2.73,3.67-5.77,7.55-9.14,12.32-7.21,14.92a6.07,6.07,0,0,0,3,.68c12.58,0,19.34-3.27,27.89-7.41,2.48-1.2,5-2.43,8-3.7,5-2.17,10.38-5.63,16.09-9.29C92.61,172,100.42,167,108,164.59a62.3,62.3,0,0,1,19.23-2.7c8,0,16.42,1.07,24.54,2.11,6.05.78,12.32,1.58,18.47,1.95,2.39.14,4.6.21,6.75.21a78.21,78.21,0,0,0,8.61-.45l.69-.24c4.31-2.65,6.33-8.34,8.29-13.84,1.26-3.54,2.32-6.72,4-8.74a2.55,2.55,0,0,1,.32-.27.4.4,0,0,1,.49.08s0,.05,0,.16c-1,21.51-9.66,35.17-18.42,47.31l-5.85,6.27s8.19,0,12.85-1.8c17-5.08,29.83-16.28,39.17-34.14a145.7,145.7,0,0,0,6.17-14.09c.16-.4,1.63-1.14,1.49.93-.05.61-.09,1.29-.14,2h0c0,.42,0,.85-.08,1.28-.24,3-.95,9.34-.95,9.34l5.25-2.81c12.66-8,22.42-24.14,29.82-49.25,3.08-10.46,5.34-20.85,7.33-30,2.38-11,4.43-20.43,6.78-24.09,3.69-5.74,9.32-9.62,14.77-13.39.74-.51,1.49-1,2.22-1.54,6.85-4.81,13.66-10.36,15.16-20.71l0-.23C316.05,10.22,315.13,8.25,314.08,7.35Z" transform="translate(-5.58 -6.4)"></path>
15
+ </svg>
@@ -27,6 +27,8 @@ require "zip"
27
27
  require "zendesk_api"
28
28
  require "faraday"
29
29
  require "base64"
30
+ require "aws-sdk-s3"
31
+ require "duckdb"
30
32
  require "iterable-api-client"
31
33
 
32
34
  # Service
@@ -55,6 +57,8 @@ require_relative "integrations/source/databricks/client"
55
57
  require_relative "integrations/source/salesforce_consumer_goods_cloud/client"
56
58
  require_relative "integrations/source/aws_athena/client"
57
59
  require_relative "integrations/source/clickhouse/client"
60
+ require_relative "integrations/source/amazon_s3/client"
61
+ require_relative "integrations/source/maria_db/client"
58
62
 
59
63
  # Destination
60
64
  require_relative "integrations/destination/klaviyo/client"
@@ -36,10 +36,12 @@ Gem::Specification.new do |spec|
36
36
  spec.add_runtime_dependency "activesupport"
37
37
  spec.add_runtime_dependency "async-websocket"
38
38
  spec.add_runtime_dependency "aws-sdk-athena"
39
+ spec.add_runtime_dependency "aws-sdk-s3"
39
40
  spec.add_runtime_dependency "csv"
40
41
  spec.add_runtime_dependency "dry-schema"
41
42
  spec.add_runtime_dependency "dry-struct"
42
43
  spec.add_runtime_dependency "dry-types"
44
+ spec.add_runtime_dependency "duckdb"
43
45
  spec.add_runtime_dependency "git"
44
46
  spec.add_runtime_dependency "google-apis-sheets_v4"
45
47
  spec.add_runtime_dependency "google-cloud-bigquery"
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.76
4
+ version: 0.3.0
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-06-13 00:00:00.000000000 Z
11
+ date: 2024-06-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: aws-sdk-s3
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: csv
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -108,6 +122,20 @@ dependencies:
108
122
  - - ">="
109
123
  - !ruby/object:Gem::Version
110
124
  version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: duckdb
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
111
139
  - !ruby/object:Gem::Dependency
112
140
  name: git
113
141
  requirement: !ruby/object:Gem::Requirement
@@ -519,6 +547,10 @@ files:
519
547
  - lib/multiwoven/integrations/protocol/protocol.rb
520
548
  - lib/multiwoven/integrations/rollout.rb
521
549
  - lib/multiwoven/integrations/service.rb
550
+ - lib/multiwoven/integrations/source/amazon_s3/client.rb
551
+ - lib/multiwoven/integrations/source/amazon_s3/config/meta.json
552
+ - lib/multiwoven/integrations/source/amazon_s3/config/spec.json
553
+ - lib/multiwoven/integrations/source/amazon_s3/icon.svg
522
554
  - lib/multiwoven/integrations/source/aws_athena/client.rb
523
555
  - lib/multiwoven/integrations/source/aws_athena/config/meta.json
524
556
  - lib/multiwoven/integrations/source/aws_athena/config/spec.json
@@ -535,6 +567,10 @@ files:
535
567
  - lib/multiwoven/integrations/source/databricks/config/meta.json
536
568
  - lib/multiwoven/integrations/source/databricks/config/spec.json
537
569
  - lib/multiwoven/integrations/source/databricks/icon.svg
570
+ - lib/multiwoven/integrations/source/maria_db/client.rb
571
+ - lib/multiwoven/integrations/source/maria_db/config/meta.json
572
+ - lib/multiwoven/integrations/source/maria_db/config/spec.json
573
+ - lib/multiwoven/integrations/source/maria_db/icon.svg
538
574
  - lib/multiwoven/integrations/source/postgresql/client.rb
539
575
  - lib/multiwoven/integrations/source/postgresql/config/meta.json
540
576
  - lib/multiwoven/integrations/source/postgresql/config/spec.json