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.
Files changed (275) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +3 -0
  3. data/.rubocop.yml +43 -0
  4. data/.ruby-version +1 -0
  5. data/.vscode/settings.json +5 -0
  6. data/README.md +76 -0
  7. data/Rakefile +12 -0
  8. data/lib/outhad/integrations/config.rb +14 -0
  9. data/lib/outhad/integrations/core/base_connector.rb +79 -0
  10. data/lib/outhad/integrations/core/constants.rb +103 -0
  11. data/lib/outhad/integrations/core/destination_connector.rb +20 -0
  12. data/lib/outhad/integrations/core/fullrefresher.rb +19 -0
  13. data/lib/outhad/integrations/core/http_client.rb +17 -0
  14. data/lib/outhad/integrations/core/http_helper.rb +36 -0
  15. data/lib/outhad/integrations/core/query_builder.rb +33 -0
  16. data/lib/outhad/integrations/core/rate_limiter.rb +19 -0
  17. data/lib/outhad/integrations/core/source_connector.rb +66 -0
  18. data/lib/outhad/integrations/core/streaming_http_client.rb +21 -0
  19. data/lib/outhad/integrations/core/unstructured_source_connector.rb +52 -0
  20. data/lib/outhad/integrations/core/utils.rb +123 -0
  21. data/lib/outhad/integrations/core/vector_source_connector.rb +14 -0
  22. data/lib/outhad/integrations/destination/airtable/client.rb +157 -0
  23. data/lib/outhad/integrations/destination/airtable/config/catalog.json +6 -0
  24. data/lib/outhad/integrations/destination/airtable/config/meta.json +15 -0
  25. data/lib/outhad/integrations/destination/airtable/config/spec.json +23 -0
  26. data/lib/outhad/integrations/destination/airtable/icon.svg +6 -0
  27. data/lib/outhad/integrations/destination/airtable/schema_helper.rb +141 -0
  28. data/lib/outhad/integrations/destination/ais_data_store/client.rb +130 -0
  29. data/lib/outhad/integrations/destination/ais_data_store/config/meta.json +15 -0
  30. data/lib/outhad/integrations/destination/ais_data_store/config/spec.json +68 -0
  31. data/lib/outhad/integrations/destination/ais_data_store/icon.svg +4 -0
  32. data/lib/outhad/integrations/destination/amazon_s3/client.rb +92 -0
  33. data/lib/outhad/integrations/destination/amazon_s3/config/catalog.json +16 -0
  34. data/lib/outhad/integrations/destination/amazon_s3/config/meta.json +15 -0
  35. data/lib/outhad/integrations/destination/amazon_s3/config/spec.json +56 -0
  36. data/lib/outhad/integrations/destination/amazon_s3/icon.svg +34 -0
  37. data/lib/outhad/integrations/destination/databricks_lakehouse/client.rb +147 -0
  38. data/lib/outhad/integrations/destination/databricks_lakehouse/config/meta.json +15 -0
  39. data/lib/outhad/integrations/destination/databricks_lakehouse/config/spec.json +44 -0
  40. data/lib/outhad/integrations/destination/databricks_lakehouse/icon.svg +65 -0
  41. data/lib/outhad/integrations/destination/facebook_custom_audience/client.rb +125 -0
  42. data/lib/outhad/integrations/destination/facebook_custom_audience/config/catalog.json +42 -0
  43. data/lib/outhad/integrations/destination/facebook_custom_audience/config/meta.json +15 -0
  44. data/lib/outhad/integrations/destination/facebook_custom_audience/config/spec.json +28 -0
  45. data/lib/outhad/integrations/destination/facebook_custom_audience/icon.svg +23 -0
  46. data/lib/outhad/integrations/destination/google_sheets/client.rb +240 -0
  47. data/lib/outhad/integrations/destination/google_sheets/config/catalog.json +6 -0
  48. data/lib/outhad/integrations/destination/google_sheets/config/meta.json +15 -0
  49. data/lib/outhad/integrations/destination/google_sheets/config/spec.json +75 -0
  50. data/lib/outhad/integrations/destination/google_sheets/icon.svg +1 -0
  51. data/lib/outhad/integrations/destination/http/client.rb +106 -0
  52. data/lib/outhad/integrations/destination/http/config/catalog.json +16 -0
  53. data/lib/outhad/integrations/destination/http/config/meta.json +15 -0
  54. data/lib/outhad/integrations/destination/http/config/spec.json +24 -0
  55. data/lib/outhad/integrations/destination/http/icon.svg +9 -0
  56. data/lib/outhad/integrations/destination/hubspot/client.rb +122 -0
  57. data/lib/outhad/integrations/destination/hubspot/config/catalog.json +351 -0
  58. data/lib/outhad/integrations/destination/hubspot/config/meta.json +15 -0
  59. data/lib/outhad/integrations/destination/hubspot/config/spec.json +18 -0
  60. data/lib/outhad/integrations/destination/hubspot/icon.svg +5 -0
  61. data/lib/outhad/integrations/destination/iterable/client.rb +111 -0
  62. data/lib/outhad/integrations/destination/iterable/config/catalog.json +47 -0
  63. data/lib/outhad/integrations/destination/iterable/config/meta.json +15 -0
  64. data/lib/outhad/integrations/destination/iterable/config/spec.json +19 -0
  65. data/lib/outhad/integrations/destination/iterable/icon.svg +71 -0
  66. data/lib/outhad/integrations/destination/klaviyo/client.rb +119 -0
  67. data/lib/outhad/integrations/destination/klaviyo/config/catalog.json +103 -0
  68. data/lib/outhad/integrations/destination/klaviyo/config/meta.json +15 -0
  69. data/lib/outhad/integrations/destination/klaviyo/config/spec.json +24 -0
  70. data/lib/outhad/integrations/destination/klaviyo/icon.svg +6 -0
  71. data/lib/outhad/integrations/destination/mailchimp/client.rb +141 -0
  72. data/lib/outhad/integrations/destination/mailchimp/config/catalog.json +142 -0
  73. data/lib/outhad/integrations/destination/mailchimp/config/meta.json +15 -0
  74. data/lib/outhad/integrations/destination/mailchimp/config/spec.json +28 -0
  75. data/lib/outhad/integrations/destination/mailchimp/icon.svg +4 -0
  76. data/lib/outhad/integrations/destination/maria_db/client.rb +114 -0
  77. data/lib/outhad/integrations/destination/maria_db/config/meta.json +15 -0
  78. data/lib/outhad/integrations/destination/maria_db/config/spec.json +48 -0
  79. data/lib/outhad/integrations/destination/maria_db/icon.svg +15 -0
  80. data/lib/outhad/integrations/destination/microsoft_dynamics/client.rb +150 -0
  81. data/lib/outhad/integrations/destination/microsoft_dynamics/config/catalog.json +161 -0
  82. data/lib/outhad/integrations/destination/microsoft_dynamics/config/meta.json +15 -0
  83. data/lib/outhad/integrations/destination/microsoft_dynamics/config/spec.json +35 -0
  84. data/lib/outhad/integrations/destination/microsoft_dynamics/icon.svg +2 -0
  85. data/lib/outhad/integrations/destination/microsoft_excel/client.rb +198 -0
  86. data/lib/outhad/integrations/destination/microsoft_excel/config/catalog.json +7 -0
  87. data/lib/outhad/integrations/destination/microsoft_excel/config/meta.json +15 -0
  88. data/lib/outhad/integrations/destination/microsoft_excel/config/spec.json +19 -0
  89. data/lib/outhad/integrations/destination/microsoft_excel/icon.svg +18 -0
  90. data/lib/outhad/integrations/destination/microsoft_sql/client.rb +137 -0
  91. data/lib/outhad/integrations/destination/microsoft_sql/config/meta.json +15 -0
  92. data/lib/outhad/integrations/destination/microsoft_sql/config/spec.json +68 -0
  93. data/lib/outhad/integrations/destination/microsoft_sql/icon.svg +22 -0
  94. data/lib/outhad/integrations/destination/odoo/client.rb +109 -0
  95. data/lib/outhad/integrations/destination/odoo/config/meta.json +15 -0
  96. data/lib/outhad/integrations/destination/odoo/config/spec.json +39 -0
  97. data/lib/outhad/integrations/destination/odoo/icon.svg +21 -0
  98. data/lib/outhad/integrations/destination/oracle_db/client.rb +112 -0
  99. data/lib/outhad/integrations/destination/oracle_db/config/meta.json +15 -0
  100. data/lib/outhad/integrations/destination/oracle_db/config/spec.json +47 -0
  101. data/lib/outhad/integrations/destination/oracle_db/icon.svg +4 -0
  102. data/lib/outhad/integrations/destination/pinecone_db/client.rb +154 -0
  103. data/lib/outhad/integrations/destination/pinecone_db/config/meta.json +15 -0
  104. data/lib/outhad/integrations/destination/pinecone_db/config/spec.json +32 -0
  105. data/lib/outhad/integrations/destination/pinecone_db/icon.svg +1 -0
  106. data/lib/outhad/integrations/destination/postgresql/client.rb +130 -0
  107. data/lib/outhad/integrations/destination/postgresql/config/meta.json +15 -0
  108. data/lib/outhad/integrations/destination/postgresql/config/spec.json +68 -0
  109. data/lib/outhad/integrations/destination/postgresql/icon.svg +20 -0
  110. data/lib/outhad/integrations/destination/qdrant/client.rb +184 -0
  111. data/lib/outhad/integrations/destination/qdrant/config/meta.json +15 -0
  112. data/lib/outhad/integrations/destination/qdrant/config/spec.json +23 -0
  113. data/lib/outhad/integrations/destination/qdrant/icon.svg +1 -0
  114. data/lib/outhad/integrations/destination/salesforce_consumer_goods_cloud/client.rb +136 -0
  115. data/lib/outhad/integrations/destination/salesforce_consumer_goods_cloud/config/catalog.json +6 -0
  116. data/lib/outhad/integrations/destination/salesforce_consumer_goods_cloud/config/meta.json +16 -0
  117. data/lib/outhad/integrations/destination/salesforce_consumer_goods_cloud/config/spec.json +52 -0
  118. data/lib/outhad/integrations/destination/salesforce_consumer_goods_cloud/icon.svg +16 -0
  119. data/lib/outhad/integrations/destination/salesforce_consumer_goods_cloud/schema_helper.rb +132 -0
  120. data/lib/outhad/integrations/destination/salesforce_crm/client.rb +114 -0
  121. data/lib/outhad/integrations/destination/salesforce_crm/config/catalog.json +320 -0
  122. data/lib/outhad/integrations/destination/salesforce_crm/config/meta.json +15 -0
  123. data/lib/outhad/integrations/destination/salesforce_crm/config/spec.json +46 -0
  124. data/lib/outhad/integrations/destination/salesforce_crm/icon.svg +16 -0
  125. data/lib/outhad/integrations/destination/sftp/client.rb +186 -0
  126. data/lib/outhad/integrations/destination/sftp/config/catalog.json +16 -0
  127. data/lib/outhad/integrations/destination/sftp/config/meta.json +16 -0
  128. data/lib/outhad/integrations/destination/sftp/config/spec.json +73 -0
  129. data/lib/outhad/integrations/destination/sftp/icon.svg +1 -0
  130. data/lib/outhad/integrations/destination/slack/client.rb +125 -0
  131. data/lib/outhad/integrations/destination/slack/config/catalog.json +22 -0
  132. data/lib/outhad/integrations/destination/slack/config/meta.json +15 -0
  133. data/lib/outhad/integrations/destination/slack/config/spec.json +23 -0
  134. data/lib/outhad/integrations/destination/slack/icon.svg +26 -0
  135. data/lib/outhad/integrations/destination/stripe/client.rb +94 -0
  136. data/lib/outhad/integrations/destination/stripe/config/catalog.json +128 -0
  137. data/lib/outhad/integrations/destination/stripe/config/meta.json +15 -0
  138. data/lib/outhad/integrations/destination/stripe/config/spec.json +18 -0
  139. data/lib/outhad/integrations/destination/stripe/icon.svg +10 -0
  140. data/lib/outhad/integrations/destination/zendesk/client.rb +132 -0
  141. data/lib/outhad/integrations/destination/zendesk/config/catalog.json +110 -0
  142. data/lib/outhad/integrations/destination/zendesk/config/meta.json +18 -0
  143. data/lib/outhad/integrations/destination/zendesk/config/spec.json +32 -0
  144. data/lib/outhad/integrations/destination/zendesk/icon.svg +63 -0
  145. data/lib/outhad/integrations/protocol/protocol.json +189 -0
  146. data/lib/outhad/integrations/protocol/protocol.rb +228 -0
  147. data/lib/outhad/integrations/rollout.rb +66 -0
  148. data/lib/outhad/integrations/service.rb +55 -0
  149. data/lib/outhad/integrations/source/amazon_s3/client.rb +235 -0
  150. data/lib/outhad/integrations/source/amazon_s3/config/meta.json +16 -0
  151. data/lib/outhad/integrations/source/amazon_s3/config/spec.json +119 -0
  152. data/lib/outhad/integrations/source/amazon_s3/icon.svg +34 -0
  153. data/lib/outhad/integrations/source/anthropic/client.rb +135 -0
  154. data/lib/outhad/integrations/source/anthropic/config/catalog.json +6 -0
  155. data/lib/outhad/integrations/source/anthropic/config/meta.json +16 -0
  156. data/lib/outhad/integrations/source/anthropic/config/spec.json +56 -0
  157. data/lib/outhad/integrations/source/anthropic/icon.svg +1 -0
  158. data/lib/outhad/integrations/source/aws_athena/client.rb +109 -0
  159. data/lib/outhad/integrations/source/aws_athena/config/meta.json +16 -0
  160. data/lib/outhad/integrations/source/aws_athena/config/spec.json +63 -0
  161. data/lib/outhad/integrations/source/aws_athena/icon.svg +22 -0
  162. data/lib/outhad/integrations/source/aws_bedrock_model/client.rb +91 -0
  163. data/lib/outhad/integrations/source/aws_bedrock_model/config/catalog.json +6 -0
  164. data/lib/outhad/integrations/source/aws_bedrock_model/config/meta.json +16 -0
  165. data/lib/outhad/integrations/source/aws_bedrock_model/config/spec.json +58 -0
  166. data/lib/outhad/integrations/source/aws_bedrock_model/icon.svg +1 -0
  167. data/lib/outhad/integrations/source/aws_sagemaker_model/client.rb +79 -0
  168. data/lib/outhad/integrations/source/aws_sagemaker_model/config/catalog.json +6 -0
  169. data/lib/outhad/integrations/source/aws_sagemaker_model/config/meta.json +16 -0
  170. data/lib/outhad/integrations/source/aws_sagemaker_model/config/spec.json +52 -0
  171. data/lib/outhad/integrations/source/aws_sagemaker_model/icon.svg +7 -0
  172. data/lib/outhad/integrations/source/bigquery/client.rb +98 -0
  173. data/lib/outhad/integrations/source/bigquery/config/meta.json +16 -0
  174. data/lib/outhad/integrations/source/bigquery/config/spec.json +83 -0
  175. data/lib/outhad/integrations/source/bigquery/icon.svg +1 -0
  176. data/lib/outhad/integrations/source/clickhouse/client.rb +102 -0
  177. data/lib/outhad/integrations/source/clickhouse/config/meta.json +16 -0
  178. data/lib/outhad/integrations/source/clickhouse/config/spec.json +42 -0
  179. data/lib/outhad/integrations/source/clickhouse/icon.svg +25 -0
  180. data/lib/outhad/integrations/source/databricks/client.rb +98 -0
  181. data/lib/outhad/integrations/source/databricks/config/meta.json +17 -0
  182. data/lib/outhad/integrations/source/databricks/config/spec.json +56 -0
  183. data/lib/outhad/integrations/source/databricks/icon.svg +19 -0
  184. data/lib/outhad/integrations/source/databrics_model/client.rb +89 -0
  185. data/lib/outhad/integrations/source/databrics_model/config/catalog.json +6 -0
  186. data/lib/outhad/integrations/source/databrics_model/config/meta.json +17 -0
  187. data/lib/outhad/integrations/source/databrics_model/config/spec.json +63 -0
  188. data/lib/outhad/integrations/source/databrics_model/icon.svg +19 -0
  189. data/lib/outhad/integrations/source/firecrawl/client.rb +151 -0
  190. data/lib/outhad/integrations/source/firecrawl/config/catalog.json +29 -0
  191. data/lib/outhad/integrations/source/firecrawl/config/meta.json +17 -0
  192. data/lib/outhad/integrations/source/firecrawl/config/spec.json +31 -0
  193. data/lib/outhad/integrations/source/firecrawl/icon.svg +4 -0
  194. data/lib/outhad/integrations/source/generic_open_ai/client.rb +118 -0
  195. data/lib/outhad/integrations/source/generic_open_ai/config/catalog.json +6 -0
  196. data/lib/outhad/integrations/source/generic_open_ai/config/meta.json +16 -0
  197. data/lib/outhad/integrations/source/generic_open_ai/config/spec.json +63 -0
  198. data/lib/outhad/integrations/source/generic_open_ai/icon.svg +6 -0
  199. data/lib/outhad/integrations/source/google_vertex_model/client.rb +83 -0
  200. data/lib/outhad/integrations/source/google_vertex_model/config/catalog.json +6 -0
  201. data/lib/outhad/integrations/source/google_vertex_model/config/meta.json +17 -0
  202. data/lib/outhad/integrations/source/google_vertex_model/config/spec.json +105 -0
  203. data/lib/outhad/integrations/source/google_vertex_model/icon.svg +2 -0
  204. data/lib/outhad/integrations/source/http_model/client.rb +108 -0
  205. data/lib/outhad/integrations/source/http_model/config/catalog.json +6 -0
  206. data/lib/outhad/integrations/source/http_model/config/meta.json +16 -0
  207. data/lib/outhad/integrations/source/http_model/config/spec.json +70 -0
  208. data/lib/outhad/integrations/source/http_model/icon.svg +9 -0
  209. data/lib/outhad/integrations/source/intuit_quick_books/client.rb +213 -0
  210. data/lib/outhad/integrations/source/intuit_quick_books/config/catalog.json +6 -0
  211. data/lib/outhad/integrations/source/intuit_quick_books/config/meta.json +17 -0
  212. data/lib/outhad/integrations/source/intuit_quick_books/config/spec.json +44 -0
  213. data/lib/outhad/integrations/source/intuit_quick_books/icon.svg +1 -0
  214. data/lib/outhad/integrations/source/maria_db/client.rb +92 -0
  215. data/lib/outhad/integrations/source/maria_db/config/meta.json +16 -0
  216. data/lib/outhad/integrations/source/maria_db/config/spec.json +48 -0
  217. data/lib/outhad/integrations/source/maria_db/icon.svg +15 -0
  218. data/lib/outhad/integrations/source/odoo/client.rb +106 -0
  219. data/lib/outhad/integrations/source/odoo/config/meta.json +15 -0
  220. data/lib/outhad/integrations/source/odoo/config/spec.json +39 -0
  221. data/lib/outhad/integrations/source/odoo/icon.svg +21 -0
  222. data/lib/outhad/integrations/source/open_ai/client.rb +118 -0
  223. data/lib/outhad/integrations/source/open_ai/config/catalog.json +6 -0
  224. data/lib/outhad/integrations/source/open_ai/config/meta.json +16 -0
  225. data/lib/outhad/integrations/source/open_ai/config/spec.json +56 -0
  226. data/lib/outhad/integrations/source/open_ai/icon.svg +1 -0
  227. data/lib/outhad/integrations/source/oracle_db/client.rb +127 -0
  228. data/lib/outhad/integrations/source/oracle_db/config/meta.json +16 -0
  229. data/lib/outhad/integrations/source/oracle_db/config/spec.json +47 -0
  230. data/lib/outhad/integrations/source/oracle_db/icon.svg +4 -0
  231. data/lib/outhad/integrations/source/pinecone_db/client.rb +73 -0
  232. data/lib/outhad/integrations/source/pinecone_db/config/catalog.json +6 -0
  233. data/lib/outhad/integrations/source/pinecone_db/config/meta.json +16 -0
  234. data/lib/outhad/integrations/source/pinecone_db/config/spec.json +34 -0
  235. data/lib/outhad/integrations/source/pinecone_db/icon.svg +2 -0
  236. data/lib/outhad/integrations/source/postgresql/client.rb +112 -0
  237. data/lib/outhad/integrations/source/postgresql/config/meta.json +16 -0
  238. data/lib/outhad/integrations/source/postgresql/config/spec.json +86 -0
  239. data/lib/outhad/integrations/source/postgresql/icon.svg +20 -0
  240. data/lib/outhad/integrations/source/qdrant/client.rb +86 -0
  241. data/lib/outhad/integrations/source/qdrant/config/catalog.json +6 -0
  242. data/lib/outhad/integrations/source/qdrant/config/meta.json +16 -0
  243. data/lib/outhad/integrations/source/qdrant/config/spec.json +29 -0
  244. data/lib/outhad/integrations/source/qdrant/icon.svg +1 -0
  245. data/lib/outhad/integrations/source/redshift/client.rb +109 -0
  246. data/lib/outhad/integrations/source/redshift/config/meta.json +16 -0
  247. data/lib/outhad/integrations/source/redshift/config/spec.json +71 -0
  248. data/lib/outhad/integrations/source/redshift/icon.svg +15 -0
  249. data/lib/outhad/integrations/source/salesforce_consumer_goods_cloud/client.rb +133 -0
  250. data/lib/outhad/integrations/source/salesforce_consumer_goods_cloud/config/catalog.json +6 -0
  251. data/lib/outhad/integrations/source/salesforce_consumer_goods_cloud/config/meta.json +18 -0
  252. data/lib/outhad/integrations/source/salesforce_consumer_goods_cloud/config/spec.json +53 -0
  253. data/lib/outhad/integrations/source/salesforce_consumer_goods_cloud/icon.svg +16 -0
  254. data/lib/outhad/integrations/source/salesforce_consumer_goods_cloud/schema_helper.rb +130 -0
  255. data/lib/outhad/integrations/source/sftp/client.rb +133 -0
  256. data/lib/outhad/integrations/source/sftp/config/meta.json +16 -0
  257. data/lib/outhad/integrations/source/sftp/config/spec.json +59 -0
  258. data/lib/outhad/integrations/source/sftp/icon.svg +1 -0
  259. data/lib/outhad/integrations/source/snowflake/client.rb +92 -0
  260. data/lib/outhad/integrations/source/snowflake/config/meta.json +16 -0
  261. data/lib/outhad/integrations/source/snowflake/config/spec.json +82 -0
  262. data/lib/outhad/integrations/source/snowflake/icon.svg +10 -0
  263. data/lib/outhad/integrations/source/watsonx_ai/client.rb +194 -0
  264. data/lib/outhad/integrations/source/watsonx_ai/config/catalog.json +6 -0
  265. data/lib/outhad/integrations/source/watsonx_ai/config/meta.json +16 -0
  266. data/lib/outhad/integrations/source/watsonx_ai/config/spec.json +74 -0
  267. data/lib/outhad/integrations/source/watsonx_ai/icon.svg +1 -0
  268. data/lib/outhad/integrations/source/watsonx_data/client.rb +146 -0
  269. data/lib/outhad/integrations/source/watsonx_data/config/meta.json +17 -0
  270. data/lib/outhad/integrations/source/watsonx_data/config/spec.json +72 -0
  271. data/lib/outhad/integrations/source/watsonx_data/icon.svg +1 -0
  272. data/lib/outhad/integrations.rb +129 -0
  273. data/outhad-integrations.gemspec +79 -0
  274. data/sig/outhad/integrations.rbs +6 -0
  275. 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
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
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
@@ -0,0 +1,5 @@
1
+ {
2
+ "cSpell.words": [
3
+ "multiwoven"
4
+ ]
5
+ }
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,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "rspec/core/rake_task"
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ require "rubocop/rake_task"
9
+
10
+ RuboCop::RakeTask.new
11
+
12
+ task default: %i[spec rubocop]
@@ -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