outhad-integrations 0.32.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 +7 -0
- data/.rspec +3 -0
- data/.rubocop.yml +43 -0
- data/.ruby-version +1 -0
- data/.vscode/settings.json +5 -0
- data/README.md +76 -0
- data/Rakefile +12 -0
- data/lib/outhad/integrations/config.rb +14 -0
- data/lib/outhad/integrations/core/base_connector.rb +79 -0
- data/lib/outhad/integrations/core/constants.rb +103 -0
- data/lib/outhad/integrations/core/destination_connector.rb +20 -0
- data/lib/outhad/integrations/core/fullrefresher.rb +19 -0
- data/lib/outhad/integrations/core/http_client.rb +17 -0
- data/lib/outhad/integrations/core/http_helper.rb +36 -0
- data/lib/outhad/integrations/core/query_builder.rb +33 -0
- data/lib/outhad/integrations/core/rate_limiter.rb +19 -0
- data/lib/outhad/integrations/core/source_connector.rb +66 -0
- data/lib/outhad/integrations/core/streaming_http_client.rb +21 -0
- data/lib/outhad/integrations/core/unstructured_source_connector.rb +52 -0
- data/lib/outhad/integrations/core/utils.rb +123 -0
- data/lib/outhad/integrations/core/vector_source_connector.rb +14 -0
- data/lib/outhad/integrations/destination/airtable/client.rb +157 -0
- data/lib/outhad/integrations/destination/airtable/config/catalog.json +6 -0
- data/lib/outhad/integrations/destination/airtable/config/meta.json +15 -0
- data/lib/outhad/integrations/destination/airtable/config/spec.json +23 -0
- data/lib/outhad/integrations/destination/airtable/icon.svg +6 -0
- data/lib/outhad/integrations/destination/airtable/schema_helper.rb +141 -0
- data/lib/outhad/integrations/destination/ais_data_store/client.rb +130 -0
- data/lib/outhad/integrations/destination/ais_data_store/config/meta.json +15 -0
- data/lib/outhad/integrations/destination/ais_data_store/config/spec.json +68 -0
- data/lib/outhad/integrations/destination/ais_data_store/icon.svg +4 -0
- data/lib/outhad/integrations/destination/amazon_s3/client.rb +92 -0
- data/lib/outhad/integrations/destination/amazon_s3/config/catalog.json +16 -0
- data/lib/outhad/integrations/destination/amazon_s3/config/meta.json +15 -0
- data/lib/outhad/integrations/destination/amazon_s3/config/spec.json +56 -0
- data/lib/outhad/integrations/destination/amazon_s3/icon.svg +34 -0
- data/lib/outhad/integrations/destination/databricks_lakehouse/client.rb +147 -0
- data/lib/outhad/integrations/destination/databricks_lakehouse/config/meta.json +15 -0
- data/lib/outhad/integrations/destination/databricks_lakehouse/config/spec.json +44 -0
- data/lib/outhad/integrations/destination/databricks_lakehouse/icon.svg +65 -0
- data/lib/outhad/integrations/destination/facebook_custom_audience/client.rb +125 -0
- data/lib/outhad/integrations/destination/facebook_custom_audience/config/catalog.json +42 -0
- data/lib/outhad/integrations/destination/facebook_custom_audience/config/meta.json +15 -0
- data/lib/outhad/integrations/destination/facebook_custom_audience/config/spec.json +28 -0
- data/lib/outhad/integrations/destination/facebook_custom_audience/icon.svg +23 -0
- data/lib/outhad/integrations/destination/google_sheets/client.rb +240 -0
- data/lib/outhad/integrations/destination/google_sheets/config/catalog.json +6 -0
- data/lib/outhad/integrations/destination/google_sheets/config/meta.json +15 -0
- data/lib/outhad/integrations/destination/google_sheets/config/spec.json +75 -0
- data/lib/outhad/integrations/destination/google_sheets/icon.svg +1 -0
- data/lib/outhad/integrations/destination/http/client.rb +106 -0
- data/lib/outhad/integrations/destination/http/config/catalog.json +16 -0
- data/lib/outhad/integrations/destination/http/config/meta.json +15 -0
- data/lib/outhad/integrations/destination/http/config/spec.json +24 -0
- data/lib/outhad/integrations/destination/http/icon.svg +9 -0
- data/lib/outhad/integrations/destination/hubspot/client.rb +122 -0
- data/lib/outhad/integrations/destination/hubspot/config/catalog.json +351 -0
- data/lib/outhad/integrations/destination/hubspot/config/meta.json +15 -0
- data/lib/outhad/integrations/destination/hubspot/config/spec.json +18 -0
- data/lib/outhad/integrations/destination/hubspot/icon.svg +5 -0
- data/lib/outhad/integrations/destination/iterable/client.rb +111 -0
- data/lib/outhad/integrations/destination/iterable/config/catalog.json +47 -0
- data/lib/outhad/integrations/destination/iterable/config/meta.json +15 -0
- data/lib/outhad/integrations/destination/iterable/config/spec.json +19 -0
- data/lib/outhad/integrations/destination/iterable/icon.svg +71 -0
- data/lib/outhad/integrations/destination/klaviyo/client.rb +119 -0
- data/lib/outhad/integrations/destination/klaviyo/config/catalog.json +103 -0
- data/lib/outhad/integrations/destination/klaviyo/config/meta.json +15 -0
- data/lib/outhad/integrations/destination/klaviyo/config/spec.json +24 -0
- data/lib/outhad/integrations/destination/klaviyo/icon.svg +6 -0
- data/lib/outhad/integrations/destination/mailchimp/client.rb +141 -0
- data/lib/outhad/integrations/destination/mailchimp/config/catalog.json +142 -0
- data/lib/outhad/integrations/destination/mailchimp/config/meta.json +15 -0
- data/lib/outhad/integrations/destination/mailchimp/config/spec.json +28 -0
- data/lib/outhad/integrations/destination/mailchimp/icon.svg +4 -0
- data/lib/outhad/integrations/destination/maria_db/client.rb +114 -0
- data/lib/outhad/integrations/destination/maria_db/config/meta.json +15 -0
- data/lib/outhad/integrations/destination/maria_db/config/spec.json +48 -0
- data/lib/outhad/integrations/destination/maria_db/icon.svg +15 -0
- data/lib/outhad/integrations/destination/microsoft_dynamics/client.rb +150 -0
- data/lib/outhad/integrations/destination/microsoft_dynamics/config/catalog.json +161 -0
- data/lib/outhad/integrations/destination/microsoft_dynamics/config/meta.json +15 -0
- data/lib/outhad/integrations/destination/microsoft_dynamics/config/spec.json +35 -0
- data/lib/outhad/integrations/destination/microsoft_dynamics/icon.svg +2 -0
- data/lib/outhad/integrations/destination/microsoft_excel/client.rb +198 -0
- data/lib/outhad/integrations/destination/microsoft_excel/config/catalog.json +7 -0
- data/lib/outhad/integrations/destination/microsoft_excel/config/meta.json +15 -0
- data/lib/outhad/integrations/destination/microsoft_excel/config/spec.json +19 -0
- data/lib/outhad/integrations/destination/microsoft_excel/icon.svg +18 -0
- data/lib/outhad/integrations/destination/microsoft_sql/client.rb +137 -0
- data/lib/outhad/integrations/destination/microsoft_sql/config/meta.json +15 -0
- data/lib/outhad/integrations/destination/microsoft_sql/config/spec.json +68 -0
- data/lib/outhad/integrations/destination/microsoft_sql/icon.svg +22 -0
- data/lib/outhad/integrations/destination/odoo/client.rb +109 -0
- data/lib/outhad/integrations/destination/odoo/config/meta.json +15 -0
- data/lib/outhad/integrations/destination/odoo/config/spec.json +39 -0
- data/lib/outhad/integrations/destination/odoo/icon.svg +21 -0
- data/lib/outhad/integrations/destination/oracle_db/client.rb +112 -0
- data/lib/outhad/integrations/destination/oracle_db/config/meta.json +15 -0
- data/lib/outhad/integrations/destination/oracle_db/config/spec.json +47 -0
- data/lib/outhad/integrations/destination/oracle_db/icon.svg +4 -0
- data/lib/outhad/integrations/destination/pinecone_db/client.rb +154 -0
- data/lib/outhad/integrations/destination/pinecone_db/config/meta.json +15 -0
- data/lib/outhad/integrations/destination/pinecone_db/config/spec.json +32 -0
- data/lib/outhad/integrations/destination/pinecone_db/icon.svg +1 -0
- data/lib/outhad/integrations/destination/postgresql/client.rb +130 -0
- data/lib/outhad/integrations/destination/postgresql/config/meta.json +15 -0
- data/lib/outhad/integrations/destination/postgresql/config/spec.json +68 -0
- data/lib/outhad/integrations/destination/postgresql/icon.svg +20 -0
- data/lib/outhad/integrations/destination/qdrant/client.rb +184 -0
- data/lib/outhad/integrations/destination/qdrant/config/meta.json +15 -0
- data/lib/outhad/integrations/destination/qdrant/config/spec.json +23 -0
- data/lib/outhad/integrations/destination/qdrant/icon.svg +1 -0
- data/lib/outhad/integrations/destination/salesforce_consumer_goods_cloud/client.rb +136 -0
- data/lib/outhad/integrations/destination/salesforce_consumer_goods_cloud/config/catalog.json +6 -0
- data/lib/outhad/integrations/destination/salesforce_consumer_goods_cloud/config/meta.json +16 -0
- data/lib/outhad/integrations/destination/salesforce_consumer_goods_cloud/config/spec.json +52 -0
- data/lib/outhad/integrations/destination/salesforce_consumer_goods_cloud/icon.svg +16 -0
- data/lib/outhad/integrations/destination/salesforce_consumer_goods_cloud/schema_helper.rb +132 -0
- data/lib/outhad/integrations/destination/salesforce_crm/client.rb +114 -0
- data/lib/outhad/integrations/destination/salesforce_crm/config/catalog.json +320 -0
- data/lib/outhad/integrations/destination/salesforce_crm/config/meta.json +15 -0
- data/lib/outhad/integrations/destination/salesforce_crm/config/spec.json +46 -0
- data/lib/outhad/integrations/destination/salesforce_crm/icon.svg +16 -0
- data/lib/outhad/integrations/destination/sftp/client.rb +186 -0
- data/lib/outhad/integrations/destination/sftp/config/catalog.json +16 -0
- data/lib/outhad/integrations/destination/sftp/config/meta.json +16 -0
- data/lib/outhad/integrations/destination/sftp/config/spec.json +73 -0
- data/lib/outhad/integrations/destination/sftp/icon.svg +1 -0
- data/lib/outhad/integrations/destination/slack/client.rb +125 -0
- data/lib/outhad/integrations/destination/slack/config/catalog.json +22 -0
- data/lib/outhad/integrations/destination/slack/config/meta.json +15 -0
- data/lib/outhad/integrations/destination/slack/config/spec.json +23 -0
- data/lib/outhad/integrations/destination/slack/icon.svg +26 -0
- data/lib/outhad/integrations/destination/stripe/client.rb +94 -0
- data/lib/outhad/integrations/destination/stripe/config/catalog.json +128 -0
- data/lib/outhad/integrations/destination/stripe/config/meta.json +15 -0
- data/lib/outhad/integrations/destination/stripe/config/spec.json +18 -0
- data/lib/outhad/integrations/destination/stripe/icon.svg +10 -0
- data/lib/outhad/integrations/destination/zendesk/client.rb +132 -0
- data/lib/outhad/integrations/destination/zendesk/config/catalog.json +110 -0
- data/lib/outhad/integrations/destination/zendesk/config/meta.json +18 -0
- data/lib/outhad/integrations/destination/zendesk/config/spec.json +32 -0
- data/lib/outhad/integrations/destination/zendesk/icon.svg +63 -0
- data/lib/outhad/integrations/protocol/protocol.json +189 -0
- data/lib/outhad/integrations/protocol/protocol.rb +228 -0
- data/lib/outhad/integrations/rollout.rb +66 -0
- data/lib/outhad/integrations/service.rb +55 -0
- data/lib/outhad/integrations/source/amazon_s3/client.rb +235 -0
- data/lib/outhad/integrations/source/amazon_s3/config/meta.json +16 -0
- data/lib/outhad/integrations/source/amazon_s3/config/spec.json +119 -0
- data/lib/outhad/integrations/source/amazon_s3/icon.svg +34 -0
- data/lib/outhad/integrations/source/anthropic/client.rb +135 -0
- data/lib/outhad/integrations/source/anthropic/config/catalog.json +6 -0
- data/lib/outhad/integrations/source/anthropic/config/meta.json +16 -0
- data/lib/outhad/integrations/source/anthropic/config/spec.json +56 -0
- data/lib/outhad/integrations/source/anthropic/icon.svg +1 -0
- data/lib/outhad/integrations/source/aws_athena/client.rb +109 -0
- data/lib/outhad/integrations/source/aws_athena/config/meta.json +16 -0
- data/lib/outhad/integrations/source/aws_athena/config/spec.json +63 -0
- data/lib/outhad/integrations/source/aws_athena/icon.svg +22 -0
- data/lib/outhad/integrations/source/aws_bedrock_model/client.rb +91 -0
- data/lib/outhad/integrations/source/aws_bedrock_model/config/catalog.json +6 -0
- data/lib/outhad/integrations/source/aws_bedrock_model/config/meta.json +16 -0
- data/lib/outhad/integrations/source/aws_bedrock_model/config/spec.json +58 -0
- data/lib/outhad/integrations/source/aws_bedrock_model/icon.svg +1 -0
- data/lib/outhad/integrations/source/aws_sagemaker_model/client.rb +79 -0
- data/lib/outhad/integrations/source/aws_sagemaker_model/config/catalog.json +6 -0
- data/lib/outhad/integrations/source/aws_sagemaker_model/config/meta.json +16 -0
- data/lib/outhad/integrations/source/aws_sagemaker_model/config/spec.json +52 -0
- data/lib/outhad/integrations/source/aws_sagemaker_model/icon.svg +7 -0
- data/lib/outhad/integrations/source/bigquery/client.rb +98 -0
- data/lib/outhad/integrations/source/bigquery/config/meta.json +16 -0
- data/lib/outhad/integrations/source/bigquery/config/spec.json +83 -0
- data/lib/outhad/integrations/source/bigquery/icon.svg +1 -0
- data/lib/outhad/integrations/source/clickhouse/client.rb +102 -0
- data/lib/outhad/integrations/source/clickhouse/config/meta.json +16 -0
- data/lib/outhad/integrations/source/clickhouse/config/spec.json +42 -0
- data/lib/outhad/integrations/source/clickhouse/icon.svg +25 -0
- data/lib/outhad/integrations/source/databricks/client.rb +98 -0
- data/lib/outhad/integrations/source/databricks/config/meta.json +17 -0
- data/lib/outhad/integrations/source/databricks/config/spec.json +56 -0
- data/lib/outhad/integrations/source/databricks/icon.svg +19 -0
- data/lib/outhad/integrations/source/databrics_model/client.rb +89 -0
- data/lib/outhad/integrations/source/databrics_model/config/catalog.json +6 -0
- data/lib/outhad/integrations/source/databrics_model/config/meta.json +17 -0
- data/lib/outhad/integrations/source/databrics_model/config/spec.json +63 -0
- data/lib/outhad/integrations/source/databrics_model/icon.svg +19 -0
- data/lib/outhad/integrations/source/firecrawl/client.rb +151 -0
- data/lib/outhad/integrations/source/firecrawl/config/catalog.json +29 -0
- data/lib/outhad/integrations/source/firecrawl/config/meta.json +17 -0
- data/lib/outhad/integrations/source/firecrawl/config/spec.json +31 -0
- data/lib/outhad/integrations/source/firecrawl/icon.svg +4 -0
- data/lib/outhad/integrations/source/generic_open_ai/client.rb +118 -0
- data/lib/outhad/integrations/source/generic_open_ai/config/catalog.json +6 -0
- data/lib/outhad/integrations/source/generic_open_ai/config/meta.json +16 -0
- data/lib/outhad/integrations/source/generic_open_ai/config/spec.json +63 -0
- data/lib/outhad/integrations/source/generic_open_ai/icon.svg +6 -0
- data/lib/outhad/integrations/source/google_vertex_model/client.rb +83 -0
- data/lib/outhad/integrations/source/google_vertex_model/config/catalog.json +6 -0
- data/lib/outhad/integrations/source/google_vertex_model/config/meta.json +17 -0
- data/lib/outhad/integrations/source/google_vertex_model/config/spec.json +105 -0
- data/lib/outhad/integrations/source/google_vertex_model/icon.svg +2 -0
- data/lib/outhad/integrations/source/http_model/client.rb +108 -0
- data/lib/outhad/integrations/source/http_model/config/catalog.json +6 -0
- data/lib/outhad/integrations/source/http_model/config/meta.json +16 -0
- data/lib/outhad/integrations/source/http_model/config/spec.json +70 -0
- data/lib/outhad/integrations/source/http_model/icon.svg +9 -0
- data/lib/outhad/integrations/source/intuit_quick_books/client.rb +213 -0
- data/lib/outhad/integrations/source/intuit_quick_books/config/catalog.json +6 -0
- data/lib/outhad/integrations/source/intuit_quick_books/config/meta.json +17 -0
- data/lib/outhad/integrations/source/intuit_quick_books/config/spec.json +44 -0
- data/lib/outhad/integrations/source/intuit_quick_books/icon.svg +1 -0
- data/lib/outhad/integrations/source/maria_db/client.rb +92 -0
- data/lib/outhad/integrations/source/maria_db/config/meta.json +16 -0
- data/lib/outhad/integrations/source/maria_db/config/spec.json +48 -0
- data/lib/outhad/integrations/source/maria_db/icon.svg +15 -0
- data/lib/outhad/integrations/source/odoo/client.rb +106 -0
- data/lib/outhad/integrations/source/odoo/config/meta.json +15 -0
- data/lib/outhad/integrations/source/odoo/config/spec.json +39 -0
- data/lib/outhad/integrations/source/odoo/icon.svg +21 -0
- data/lib/outhad/integrations/source/open_ai/client.rb +118 -0
- data/lib/outhad/integrations/source/open_ai/config/catalog.json +6 -0
- data/lib/outhad/integrations/source/open_ai/config/meta.json +16 -0
- data/lib/outhad/integrations/source/open_ai/config/spec.json +56 -0
- data/lib/outhad/integrations/source/open_ai/icon.svg +1 -0
- data/lib/outhad/integrations/source/oracle_db/client.rb +127 -0
- data/lib/outhad/integrations/source/oracle_db/config/meta.json +16 -0
- data/lib/outhad/integrations/source/oracle_db/config/spec.json +47 -0
- data/lib/outhad/integrations/source/oracle_db/icon.svg +4 -0
- data/lib/outhad/integrations/source/pinecone_db/client.rb +73 -0
- data/lib/outhad/integrations/source/pinecone_db/config/catalog.json +6 -0
- data/lib/outhad/integrations/source/pinecone_db/config/meta.json +16 -0
- data/lib/outhad/integrations/source/pinecone_db/config/spec.json +34 -0
- data/lib/outhad/integrations/source/pinecone_db/icon.svg +2 -0
- data/lib/outhad/integrations/source/postgresql/client.rb +112 -0
- data/lib/outhad/integrations/source/postgresql/config/meta.json +16 -0
- data/lib/outhad/integrations/source/postgresql/config/spec.json +86 -0
- data/lib/outhad/integrations/source/postgresql/icon.svg +20 -0
- data/lib/outhad/integrations/source/qdrant/client.rb +86 -0
- data/lib/outhad/integrations/source/qdrant/config/catalog.json +6 -0
- data/lib/outhad/integrations/source/qdrant/config/meta.json +16 -0
- data/lib/outhad/integrations/source/qdrant/config/spec.json +29 -0
- data/lib/outhad/integrations/source/qdrant/icon.svg +1 -0
- data/lib/outhad/integrations/source/redshift/client.rb +109 -0
- data/lib/outhad/integrations/source/redshift/config/meta.json +16 -0
- data/lib/outhad/integrations/source/redshift/config/spec.json +71 -0
- data/lib/outhad/integrations/source/redshift/icon.svg +15 -0
- data/lib/outhad/integrations/source/salesforce_consumer_goods_cloud/client.rb +133 -0
- data/lib/outhad/integrations/source/salesforce_consumer_goods_cloud/config/catalog.json +6 -0
- data/lib/outhad/integrations/source/salesforce_consumer_goods_cloud/config/meta.json +18 -0
- data/lib/outhad/integrations/source/salesforce_consumer_goods_cloud/config/spec.json +53 -0
- data/lib/outhad/integrations/source/salesforce_consumer_goods_cloud/icon.svg +16 -0
- data/lib/outhad/integrations/source/salesforce_consumer_goods_cloud/schema_helper.rb +130 -0
- data/lib/outhad/integrations/source/sftp/client.rb +133 -0
- data/lib/outhad/integrations/source/sftp/config/meta.json +16 -0
- data/lib/outhad/integrations/source/sftp/config/spec.json +59 -0
- data/lib/outhad/integrations/source/sftp/icon.svg +1 -0
- data/lib/outhad/integrations/source/snowflake/client.rb +92 -0
- data/lib/outhad/integrations/source/snowflake/config/meta.json +16 -0
- data/lib/outhad/integrations/source/snowflake/config/spec.json +82 -0
- data/lib/outhad/integrations/source/snowflake/icon.svg +10 -0
- data/lib/outhad/integrations/source/watsonx_ai/client.rb +194 -0
- data/lib/outhad/integrations/source/watsonx_ai/config/catalog.json +6 -0
- data/lib/outhad/integrations/source/watsonx_ai/config/meta.json +16 -0
- data/lib/outhad/integrations/source/watsonx_ai/config/spec.json +74 -0
- data/lib/outhad/integrations/source/watsonx_ai/icon.svg +1 -0
- data/lib/outhad/integrations/source/watsonx_data/client.rb +146 -0
- data/lib/outhad/integrations/source/watsonx_data/config/meta.json +17 -0
- data/lib/outhad/integrations/source/watsonx_data/config/spec.json +72 -0
- data/lib/outhad/integrations/source/watsonx_data/icon.svg +1 -0
- data/lib/outhad/integrations.rb +129 -0
- data/outhad-integrations.gemspec +79 -0
- data/sig/outhad/integrations.rbs +6 -0
- metadata +866 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 856eb97fb81feabc784eceb9abcbc826905dd7dc89f6bd6dfd3bf0cf5864835d
|
4
|
+
data.tar.gz: 6250c3405ae7422647f746879a4ed52371e85f802a4d7fe73454722d4526b1a1
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 37f12681f0f97a1d7a5380e1558e1d938148f4f5f07387e13f1649d0dcd07406f6e8f8d9e5099f0ca3cafc30dba424847b39788837a84f108dd7e91bc3f3089e
|
7
|
+
data.tar.gz: 99863a1fcfa79beb365e1cb09a153ea1455e0b0cc443da5a732e3f0eee19197e3aa79443ccf27f4776b2f441bdd5443ba2c777d6cc4e01106b0a4803f39924b0
|
data/.rspec
ADDED
data/.rubocop.yml
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
AllCops:
|
2
|
+
TargetRubyVersion: 2.6
|
3
|
+
|
4
|
+
Style/StringLiterals:
|
5
|
+
Enabled: true
|
6
|
+
EnforcedStyle: double_quotes
|
7
|
+
|
8
|
+
Style/StringLiteralsInInterpolation:
|
9
|
+
Enabled: true
|
10
|
+
EnforcedStyle: double_quotes
|
11
|
+
|
12
|
+
Layout/LineLength:
|
13
|
+
Max: 300
|
14
|
+
|
15
|
+
Style/ClassAndModuleChildren:
|
16
|
+
Enabled: false
|
17
|
+
|
18
|
+
Style/Documentation:
|
19
|
+
Enabled: false
|
20
|
+
|
21
|
+
Metrics/ModuleLength:
|
22
|
+
Max: 500
|
23
|
+
|
24
|
+
Metrics/BlockLength:
|
25
|
+
Max: 120
|
26
|
+
|
27
|
+
Metrics/AbcSize:
|
28
|
+
Max: 30
|
29
|
+
|
30
|
+
Metrics/MethodLength:
|
31
|
+
Max: 50
|
32
|
+
|
33
|
+
Metrics/CyclomaticComplexity:
|
34
|
+
Max: 50
|
35
|
+
|
36
|
+
Metrics/BlockLength:
|
37
|
+
Enabled: false
|
38
|
+
|
39
|
+
Metrics/ClassLength:
|
40
|
+
Enabled: false
|
41
|
+
|
42
|
+
Metrics/AbcSize:
|
43
|
+
Enabled: false
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
3.2.0
|
data/README.md
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
|
2
|
+
## Outhad Integrations
|
3
|
+
|
4
|
+
Outhad integrations is the collection of connectors built on top of [Outhad protocol](https://docs.outhad.com/guides/architecture/outhad-protocol).
|
5
|
+
|
6
|
+
Outhad protocol is an open source standard for moving data between data sources to any third-part destinations.
|
7
|
+
Anyone can build a connetor with basic ruby knowledge using the protocol.
|
8
|
+
|
9
|
+
## Prerequisites
|
10
|
+
|
11
|
+
Before you begin the installation, ensure you have the following dependencies installed:
|
12
|
+
|
13
|
+
- **MySQL Client**
|
14
|
+
- Command: `brew install mysql-client`
|
15
|
+
- Description: Required for database interactions.
|
16
|
+
|
17
|
+
- **Zstandard (zstd)**
|
18
|
+
- Command: `brew install zstd`
|
19
|
+
- Description: Needed for data compression and decompression.
|
20
|
+
|
21
|
+
- **OpenSSL 3**
|
22
|
+
- Command: `brew install openssl@3`
|
23
|
+
- Description: Essential for secure communication.
|
24
|
+
|
25
|
+
- **Oracle Instant Client**
|
26
|
+
- Download Link: https://www.oracle.com/database/technologies/instant-client/downloads.html
|
27
|
+
- Description: Required for database interactions.
|
28
|
+
|
29
|
+
|
30
|
+
### Installation
|
31
|
+
|
32
|
+
Install the gem and add to the application's Gemfile by executing:
|
33
|
+
|
34
|
+
$ bundle add outhad-integrations
|
35
|
+
|
36
|
+
|
37
|
+
### Usage
|
38
|
+
|
39
|
+
#### Source
|
40
|
+
```
|
41
|
+
source = Outhad::Integrations::Source::[CONNECTOR_NAME]::Client.new
|
42
|
+
source.read(sync_config)
|
43
|
+
```
|
44
|
+
#### Destination
|
45
|
+
|
46
|
+
```
|
47
|
+
destination = Outhad::Integrations::Destination::[CONNECTOR_NAME]::Client.new
|
48
|
+
destination.write(sync_config, records)
|
49
|
+
```
|
50
|
+
|
51
|
+
#### Supported methods
|
52
|
+
Please refer [Outhad Protocol](https://docs.outhad.com/guides/architecture/outhad-protocol) to understand more about the supported methods on source and destination
|
53
|
+
|
54
|
+
## Development
|
55
|
+
|
56
|
+
- **Install Dependencies**
|
57
|
+
- Command: `bin/setup`
|
58
|
+
- Description: After checking out the repo, run this command to install dependencies.
|
59
|
+
|
60
|
+
- **Run Tests**
|
61
|
+
- Command: `rake spec`
|
62
|
+
- Description: Run this command to execute the tests.
|
63
|
+
|
64
|
+
- **Interactive Prompt**
|
65
|
+
- Command: `bin/console`
|
66
|
+
- Description: For an interactive prompt that allows you to experiment, run this command.
|
67
|
+
|
68
|
+
- **Install Gem Locally**
|
69
|
+
- Command: `bundle exec rake install`
|
70
|
+
- Description: To install this gem onto your local machine, run this command.
|
71
|
+
|
72
|
+
- **Release New Version**
|
73
|
+
- Steps:
|
74
|
+
1. Update the version number in `rollout.rb`.
|
75
|
+
2. Command: `bundle exec rake release`
|
76
|
+
3. Description: This command will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
data/Rakefile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Outhad
|
4
|
+
module Integrations
|
5
|
+
class Config
|
6
|
+
attr_accessor :logger, :exception_reporter
|
7
|
+
|
8
|
+
def initialize(params = {})
|
9
|
+
@logger = params[:logger]
|
10
|
+
@exception_reporter = params[:exception_reporter]
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Outhad
|
4
|
+
module Integrations::Core
|
5
|
+
class BaseConnector
|
6
|
+
include Integrations::Protocol
|
7
|
+
include Utils
|
8
|
+
include Constants
|
9
|
+
|
10
|
+
def connector_spec
|
11
|
+
@connector_spec ||= begin
|
12
|
+
spec_json = keys_to_symbols(read_json(CONNECTOR_SPEC_PATH)).to_json
|
13
|
+
# returns Protocol::ConnectorSpecification
|
14
|
+
ConnectorSpecification.from_json(spec_json)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def meta_data
|
19
|
+
client_meta_data = read_json(META_DATA_PATH).deep_symbolize_keys
|
20
|
+
icon_name = client_meta_data[:data][:icon]
|
21
|
+
icon_url = "https://raw.githubusercontent.com/Outhad/outhad/main/integrations#{relative_path}/#{icon_name}"
|
22
|
+
client_meta_data[:data][:icon] = icon_url
|
23
|
+
# returns hash
|
24
|
+
@meta_data ||= client_meta_data
|
25
|
+
end
|
26
|
+
|
27
|
+
def relative_path
|
28
|
+
path = Object.const_source_location(self.class.to_s)[0]
|
29
|
+
connector_folder = File.dirname(path)
|
30
|
+
marker = "/lib/outhad/integrations/"
|
31
|
+
parts = connector_folder.split(marker)
|
32
|
+
|
33
|
+
marker + parts.last if parts.length > 1
|
34
|
+
end
|
35
|
+
|
36
|
+
# Connection config is a hash
|
37
|
+
def check_connection(_connection_config)
|
38
|
+
raise "Not implemented"
|
39
|
+
# returns Protocol.ConnectionStatus
|
40
|
+
end
|
41
|
+
|
42
|
+
# Connection config is a hash
|
43
|
+
def discover(_connection_config)
|
44
|
+
raise "Not implemented"
|
45
|
+
# returns Protocol::Catalog
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def read_json(file_path)
|
51
|
+
path = Object.const_source_location(self.class.to_s)[0]
|
52
|
+
connector_folder = File.dirname(path)
|
53
|
+
file_path = File.join(
|
54
|
+
"#{connector_folder}/",
|
55
|
+
file_path
|
56
|
+
)
|
57
|
+
file_contents = File.read(file_path)
|
58
|
+
JSON.parse(file_contents)
|
59
|
+
end
|
60
|
+
|
61
|
+
def success_status
|
62
|
+
ConnectionStatus.new(status: ConnectionStatusType["succeeded"]).to_outhad_message
|
63
|
+
end
|
64
|
+
|
65
|
+
def failure_status(error)
|
66
|
+
message = error&.message || "failed"
|
67
|
+
ConnectionStatus.new(status: ConnectionStatusType["failed"], message: message).to_outhad_message
|
68
|
+
end
|
69
|
+
|
70
|
+
def auth_headers(access_token)
|
71
|
+
{
|
72
|
+
"Accept" => "application/json",
|
73
|
+
"Authorization" => "Bearer #{access_token}",
|
74
|
+
"Content-Type" => "application/json"
|
75
|
+
}
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Outhad
|
4
|
+
module Integrations::Core
|
5
|
+
module Constants
|
6
|
+
# CONFIG
|
7
|
+
META_DATA_PATH = "config/meta.json"
|
8
|
+
CONNECTOR_SPEC_PATH = "config/spec.json"
|
9
|
+
CATALOG_SPEC_PATH = "config/catalog.json"
|
10
|
+
SNOWFLAKE_MAC_DRIVER_PATH = "/opt/snowflake/snowflakeodbc/lib/universal/libSnowflake.dylib"
|
11
|
+
DATABRICKS_MAC_DRIVER_PATH = "/Library/simba/spark/lib/libsparkodbc_sb64-universal.dylib"
|
12
|
+
|
13
|
+
SNOWFLAKE_DRIVER_PATH = ENV["SNOWFLAKE_DRIVER_PATH"] || SNOWFLAKE_MAC_DRIVER_PATH
|
14
|
+
DATABRICKS_DRIVER_PATH = ENV["DATABRICKS_DRIVER_PATH"] || DATABRICKS_MAC_DRIVER_PATH
|
15
|
+
|
16
|
+
JSON_SCHEMA_URL = "https://json-schema.org/draft-07/schema#"
|
17
|
+
|
18
|
+
# CONNECTORS
|
19
|
+
INSTALL_HTTPFS_QUERY = ENV["INSTALL_HTTPFS_QUERY"] || "INSTALL HTTPFS; LOAD HTTPFS;"
|
20
|
+
|
21
|
+
KLAVIYO_AUTH_ENDPOINT = "https://a.klaviyo.com/api/lists/"
|
22
|
+
KLAVIYO_AUTH_PAYLOAD = {
|
23
|
+
data: {
|
24
|
+
type: "list",
|
25
|
+
attributes: {
|
26
|
+
name: "THIS IS REQUIRED"
|
27
|
+
}
|
28
|
+
}
|
29
|
+
}.freeze
|
30
|
+
|
31
|
+
ZENDESK_URL_SUFFIX = "zendesk.com/api/v2/"
|
32
|
+
|
33
|
+
FACEBOOK_AUDIENCE_GET_ALL_ACCOUNTS = "https://graph.facebook.com/v18.0/me/adaccounts?fields=id,name"
|
34
|
+
|
35
|
+
AIRTABLE_URL_BASE = "https://api.airtable.com/v0/"
|
36
|
+
AIRTABLE_BASES_ENDPOINT = "https://api.airtable.com/v0/meta/bases"
|
37
|
+
AIRTABLE_GET_BASE_SCHEMA_ENDPOINT = "https://api.airtable.com/v0/meta/bases/{baseId}/tables"
|
38
|
+
|
39
|
+
MS_EXCEL_AUTH_ENDPOINT = "https://graph.microsoft.com/v1.0/me"
|
40
|
+
MS_EXCEL_TABLE_ROW_WRITE_API = "https://graph.microsoft.com/v1.0/drives/%<drive_id>s/items/%<item_id>s/"\
|
41
|
+
"workbook/worksheets/%<sheet_name>s/tables/%<table_name>s/rows"
|
42
|
+
MS_EXCEL_TABLE_API = "https://graph.microsoft.com/v1.0/drives/%<drive_id>s/items/%<item_id>s/workbook/"\
|
43
|
+
"worksheets/%<sheet_name>s/tables?$select=name"
|
44
|
+
MS_EXCEL_FILES_API = "https://graph.microsoft.com/v1.0/drives/%<drive_id>s/root/children"
|
45
|
+
MS_EXCEL_WORKSHEETS_API = "https://graph.microsoft.com/v1.0/drives/%<drive_id>s/items/%<item_id>s/"\
|
46
|
+
"workbook/worksheets"
|
47
|
+
MS_EXCEL_SHEET_RANGE_API = "https://graph.microsoft.com/v1.0/drives/%<drive_id>s/items/%<item_id>s/"\
|
48
|
+
"workbook/worksheets/%<sheet_name>s/range(address='A1:Z1')/usedRange?$select=values"
|
49
|
+
MS_DYNAMICS_WHOAMI_API = "https://%<instance_url>s.crm.dynamics.com/api/data/v%<api_version>s/WhoAmI"
|
50
|
+
MS_DYNAMICS_REST_API = "https://%<instance_url>s.crm.dynamics.com/api/data/v%<api_version>s/%<entity>s"
|
51
|
+
|
52
|
+
DATABRICKS_HEALTH_URL = "https://%<databricks_host>s/api/2.0/serving-endpoints/%<endpoint_name>s"
|
53
|
+
DATABRICKS_SERVING_URL = "https://%<databricks_host>s/serving-endpoints/%<endpoint_name>s/invocations"
|
54
|
+
|
55
|
+
GOOGLE_VERTEX_ENDPOINT_SERVICE_URL = "%<region>s-aiplatform.googleapis.com"
|
56
|
+
GOOGLE_VERTEX_MODEL_NAME = "projects/%<project_id>s/locations/%<region>s/endpoints/%<endpoint_id>s"
|
57
|
+
|
58
|
+
WATSONX_HEALTH_DEPLOYMENT_URL = "https://%<region>s.ml.cloud.ibm.com/ml/v4/deployments?version=%<version>s"
|
59
|
+
WATSONX_PREDICTION_DEPLOYMENT_URL = "https://%<region>s.ml.cloud.ibm.com/ml/v4/deployments/%<deployment_id>s/predictions?version=%<version>s"
|
60
|
+
WATSONX_GENERATION_DEPLOYMENT_URL = "https://%<region>s.ml.cloud.ibm.com/ml/v1/deployments/%<deployment_id>s/text/generation?version=%<version>s"
|
61
|
+
WATSONX_STREAM_DEPLOYMENT_URL = "https://%<region>s.ml.cloud.ibm.com/ml/v1/deployments/%<deployment_id>s/text/generation_stream?version=%<version>s"
|
62
|
+
|
63
|
+
WATSONX_DATA_QUERIES_URL = "https://%<region>s.lakehouse.cloud.ibm.com/lakehouse/api/v2/queries/execute/%<engine_id>s"
|
64
|
+
|
65
|
+
# HTTP
|
66
|
+
HTTP_GET = "GET"
|
67
|
+
HTTP_POST = "POST"
|
68
|
+
HTTP_PUT = "PUT"
|
69
|
+
HTTP_DELETE = "DELETE"
|
70
|
+
HTTP_PATCH = "PATCH"
|
71
|
+
|
72
|
+
# google sheets
|
73
|
+
GOOGLE_SHEETS_SCOPE = "https://www.googleapis.com/auth/drive"
|
74
|
+
GOOGLE_SPREADSHEET_ID_REGEX = %r{/d/([-\w]{20,})/}.freeze
|
75
|
+
|
76
|
+
OPEN_AI_URL = "https://api.openai.com/v1/chat/completions"
|
77
|
+
ANTHROPIC_URL = "https://api.anthropic.com/v1/messages"
|
78
|
+
|
79
|
+
# Bedrock Models
|
80
|
+
MISTRAL_AI_MODEL = %w[
|
81
|
+
mistral.mistral-large-2402-v1:0
|
82
|
+
mistral.mistral-7b-instruct-v0:2
|
83
|
+
mistral.mixtral-8x7b-instruct-v0:1
|
84
|
+
mistral.mistral-small-2402-v1:0
|
85
|
+
].freeze
|
86
|
+
|
87
|
+
# Intuit QuickBooks
|
88
|
+
QUICKBOOKS_SANDBOX_QUERY_URL = "https://sandbox-quickbooks.api.intuit.com/v3/company/%<realm_id>s/query?query=%<query>s"
|
89
|
+
QUICKBOOKS_PRODUCTION_QUERY_URL = "https://quickbooks.api.intuit.com/v3/company/%<realm_id>s/query?query=%<query>s"
|
90
|
+
QUICKBOOKS_REDIRECT_URL = "https://developer.intuit.com/v2/OAuth2Playground/RedirectUrl"
|
91
|
+
|
92
|
+
# Qdrant
|
93
|
+
QDRANT_SEARCH_URL = "%<host>s/collections/%<collection_name>s/points/search"
|
94
|
+
|
95
|
+
# Firecrawl
|
96
|
+
FIRECRAWL_CRAWL_URL = "https://api.firecrawl.dev/v1/crawl"
|
97
|
+
FIRECRAWL_SCRAPE_URL = "https://api.firecrawl.dev/v1/scrape"
|
98
|
+
FIRECRAWL_CRAWL_ACTIVE_URL = "https://api.firecrawl.dev/v1/crawl/active"
|
99
|
+
FIRECRAWL_GET_CRAWL_URL = "https://api.firecrawl.dev/v1/crawl/%<id>s"
|
100
|
+
FIRECRAWL_REQUEST_RATE_LIMIT = 5
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Outhad
|
4
|
+
module Integrations::Core
|
5
|
+
class DestinationConnector < BaseConnector
|
6
|
+
# Records are transformed json payload send it to the destination
|
7
|
+
# SyncConfig is the Protocol::SyncConfig object
|
8
|
+
def write(_sync_config, _records, _action = "destination_insert")
|
9
|
+
raise "Not implemented"
|
10
|
+
# return Protocol::TrackingMessage
|
11
|
+
end
|
12
|
+
|
13
|
+
def tracking_message(success, failure, log_message_array)
|
14
|
+
Outhad::Integrations::Protocol::TrackingMessage.new(
|
15
|
+
success: success, failed: failure, logs: log_message_array
|
16
|
+
).to_outhad_message
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Outhad
|
4
|
+
module Integrations::Core
|
5
|
+
module Fullrefresher
|
6
|
+
def write(sync_config, records, action = "destination_insert")
|
7
|
+
if sync_config && sync_config.sync_mode == "full_refresh" && !@full_refreshed
|
8
|
+
response = clear_all_records(sync_config)
|
9
|
+
return response unless response &&
|
10
|
+
response.control.status == Outhad::Integrations::Protocol::ConnectionStatusType["succeeded"]
|
11
|
+
|
12
|
+
@full_refreshed = true
|
13
|
+
end
|
14
|
+
|
15
|
+
super(sync_config, records, action)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Outhad
|
4
|
+
module Integrations::Core
|
5
|
+
class HttpClient
|
6
|
+
extend HttpHelper
|
7
|
+
class << self
|
8
|
+
def request(url, method, payload: nil, headers: {}, config: {})
|
9
|
+
uri = URI(url)
|
10
|
+
http = configure_http(uri, config)
|
11
|
+
request = build_request(method, uri, payload, headers)
|
12
|
+
http.request(request)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Outhad
|
4
|
+
module Integrations::Core
|
5
|
+
module HttpHelper
|
6
|
+
def build_request(method, uri, payload, headers)
|
7
|
+
request_class = case method.upcase
|
8
|
+
when Constants::HTTP_GET then Net::HTTP::Get
|
9
|
+
when Constants::HTTP_POST then Net::HTTP::Post
|
10
|
+
when Constants::HTTP_PUT then Net::HTTP::Put
|
11
|
+
when Constants::HTTP_PATCH then Net::HTTP::Patch
|
12
|
+
when Constants::HTTP_DELETE then Net::HTTP::Delete
|
13
|
+
else raise ArgumentError, "Unsupported HTTP method: #{method}"
|
14
|
+
end
|
15
|
+
|
16
|
+
request = request_class.new(uri)
|
17
|
+
headers.each { |key, value| request[key] = value }
|
18
|
+
request.body = payload.to_json if payload && %w[POST PUT PATCH].include?(method.upcase)
|
19
|
+
request
|
20
|
+
end
|
21
|
+
|
22
|
+
def configure_http(uri, config)
|
23
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
24
|
+
http.use_ssl = (uri.scheme == "https")
|
25
|
+
|
26
|
+
if config[:timeout]
|
27
|
+
timeout_value = config[:timeout].to_f
|
28
|
+
http.open_timeout = timeout_value
|
29
|
+
http.read_timeout = timeout_value
|
30
|
+
end
|
31
|
+
|
32
|
+
http
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Outhad
|
4
|
+
module Integrations::Core
|
5
|
+
class QueryBuilder
|
6
|
+
include Utils
|
7
|
+
|
8
|
+
def self.perform(action, table, record, primary_key = nil)
|
9
|
+
case action.downcase
|
10
|
+
when "destination_insert"
|
11
|
+
columns = record.keys.join(", ")
|
12
|
+
values = record.values.map { |value| "'#{value}'" }.join(", ")
|
13
|
+
# TODO: support bulk insert
|
14
|
+
"INSERT INTO #{table} (#{columns}) VALUES (#{values});"
|
15
|
+
when "destination_update"
|
16
|
+
# Ensure primary key is a string and exists within record for the WHERE clause
|
17
|
+
if record[primary_key].nil?
|
18
|
+
error_message = "Primary key '#{primary_key}' not found in record."
|
19
|
+
Integrations::Service.logger.error(error_message)
|
20
|
+
return error_message
|
21
|
+
end
|
22
|
+
|
23
|
+
primary_key_value = record.delete(primary_key) # Remove and return the primary key value
|
24
|
+
set_clause = record.map { |key, value| "#{key} = '#{value}'" }.join(", ")
|
25
|
+
where_clause = "#{primary_key} = '#{primary_key_value}'"
|
26
|
+
"UPDATE #{table} SET #{set_clause} WHERE #{where_clause};"
|
27
|
+
else
|
28
|
+
"Invalid action specified."
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Outhad
|
4
|
+
module Integrations::Core
|
5
|
+
module RateLimiter
|
6
|
+
def write(sync_config, records, action = "destination_insert")
|
7
|
+
stream = sync_config.stream
|
8
|
+
|
9
|
+
@queue ||= Limiter::RateQueue.new(stream.request_rate_limit, interval: stream.rate_limit_unit_seconds) do
|
10
|
+
Integrations::Service.logger.info("Hit the limit for stream: #{stream.name}, waiting")
|
11
|
+
end
|
12
|
+
|
13
|
+
@queue.shift
|
14
|
+
|
15
|
+
super(sync_config, records, action)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Outhad
|
4
|
+
module Integrations::Core
|
5
|
+
class SourceConnector < BaseConnector
|
6
|
+
# accepts Protocol::SyncConfig
|
7
|
+
def read(_sync_config)
|
8
|
+
raise "Not implemented"
|
9
|
+
# setup sync configs
|
10
|
+
# call query(connection, query)
|
11
|
+
# Returns list of RecordMessage
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
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
|
+
|
22
|
+
# This needs to be implemented as private method
|
23
|
+
# In every source connector. This will be used for model preview
|
24
|
+
def query(connection, query)
|
25
|
+
# return list of RecordMessage
|
26
|
+
end
|
27
|
+
|
28
|
+
def batched_query(sql_query, limit, offset)
|
29
|
+
offset = offset.to_i
|
30
|
+
limit = limit.to_i
|
31
|
+
raise ArgumentError, "Offset and limit must be non-negative" if offset.negative? || limit.negative?
|
32
|
+
|
33
|
+
# Removing any trailing semicolons
|
34
|
+
sql_query.chomp!(";")
|
35
|
+
|
36
|
+
# Checking if the query already has a LIMIT clause
|
37
|
+
raise ArgumentError, "Query already contains a LIMIT clause" if sql_query.match?(/LIMIT \d+/i)
|
38
|
+
|
39
|
+
# Appending the LIMIT and OFFSET clauses to the SQL query
|
40
|
+
"#{sql_query} LIMIT #{limit} OFFSET #{offset}"
|
41
|
+
end
|
42
|
+
|
43
|
+
def send_request(options = {})
|
44
|
+
Outhad::Integrations::Core::HttpClient.request(
|
45
|
+
options[:url],
|
46
|
+
options[:http_method],
|
47
|
+
payload: options[:payload],
|
48
|
+
headers: options[:headers],
|
49
|
+
config: options[:config]
|
50
|
+
)
|
51
|
+
end
|
52
|
+
|
53
|
+
def send_streaming_request(options = {})
|
54
|
+
Outhad::Integrations::Core::StreamingHttpClient.request(
|
55
|
+
options[:url],
|
56
|
+
options[:http_method],
|
57
|
+
payload: options[:payload],
|
58
|
+
headers: options[:headers],
|
59
|
+
config: options[:config]
|
60
|
+
) do |chunk|
|
61
|
+
yield chunk if block_given? # Pass each chunk for processing (streaming response)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Outhad
|
4
|
+
module Integrations::Core
|
5
|
+
class StreamingHttpClient
|
6
|
+
extend HttpHelper
|
7
|
+
class << self
|
8
|
+
def request(url, method, payload: nil, headers: {}, config: {})
|
9
|
+
uri = URI(url)
|
10
|
+
http = configure_http(uri, config)
|
11
|
+
request = build_request(method, uri, payload, headers)
|
12
|
+
http.request(request) do |response|
|
13
|
+
response.read_body do |chunk|
|
14
|
+
yield chunk if block_given? # Pass each response chunk
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Outhad
|
4
|
+
module Integrations::Core
|
5
|
+
class UnstructuredSourceConnector < SourceConnector
|
6
|
+
UNSTRUCTURED_SCHEMA = {
|
7
|
+
type: "object",
|
8
|
+
properties: {
|
9
|
+
element_id: { type: "string" },
|
10
|
+
text: { type: "string" },
|
11
|
+
created_date: { type: "string" },
|
12
|
+
modified_date: { type: "string" },
|
13
|
+
filename: { type: "string" },
|
14
|
+
filetype: { type: "string" }
|
15
|
+
},
|
16
|
+
required: %w[
|
17
|
+
element_id
|
18
|
+
text
|
19
|
+
created_date
|
20
|
+
modified_date
|
21
|
+
filename
|
22
|
+
filetype
|
23
|
+
]
|
24
|
+
}.freeze
|
25
|
+
|
26
|
+
UNSTRUCTURED_STREAM_CONFIG = {
|
27
|
+
supported_sync_modes: ["incremental"],
|
28
|
+
source_defined_cursor: true,
|
29
|
+
default_cursor_field: ["modified_date"],
|
30
|
+
source_defined_primary_key: [["element_id"]]
|
31
|
+
}.freeze
|
32
|
+
|
33
|
+
# Commands for unstructured data operations
|
34
|
+
UNSTRUCTURED = "unstructured"
|
35
|
+
LIST_FILES_CMD = "list_files"
|
36
|
+
DOWNLOAD_FILE_CMD = "download_file"
|
37
|
+
|
38
|
+
def unstructured_data?(connection_config)
|
39
|
+
connection_config["data_type"] == UNSTRUCTURED
|
40
|
+
end
|
41
|
+
|
42
|
+
def create_unstructured_stream
|
43
|
+
Outhad::Integrations::Protocol::Stream.new(
|
44
|
+
name: UNSTRUCTURED,
|
45
|
+
action: StreamAction["fetch"],
|
46
|
+
json_schema: UNSTRUCTURED_SCHEMA,
|
47
|
+
**UNSTRUCTURED_STREAM_CONFIG
|
48
|
+
)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|