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
@@ -0,0 +1,146 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Outhad::Integrations::Source
4
+ module WatsonxData
5
+ include Outhad::Integrations::Core
6
+ API_VERSION = "2021-05-01"
7
+ class Client < SourceConnector
8
+ def check_connection(connection_config)
9
+ create_connection(connection_config)
10
+ response = execute_query(connection_config, "show catalogs")
11
+ success?(response) ? success_status : failure_status(nil)
12
+ rescue StandardError => e
13
+ handle_exception(e, { context: "WATSONX DATA:CHECK_CONNECTION:EXCEPTION", type: "error" })
14
+ failure_status(e)
15
+ end
16
+
17
+ def discover(connection_config)
18
+ connection_config = connection_config.with_indifferent_access
19
+ query = "SELECT table_name, column_name,
20
+ data_type,
21
+ is_nullable
22
+ FROM information_schema.columns
23
+ WHERE table_schema = '#{connection_config[:schema]}' AND table_catalog = '#{connection_config[:database]}'
24
+ ORDER BY table_name, ordinal_position"
25
+ response = execute_query(connection_config, query)
26
+ records = JSON.parse(response.body)["response"]["result"]
27
+ catalog = Catalog.new(streams: create_streams(records))
28
+ catalog.to_outhad_message
29
+ rescue StandardError => e
30
+ handle_exception(e, { context: "WATSONX DATA:DISCOVER:EXCEPTION", type: "error" })
31
+ end
32
+
33
+ def read(sync_config)
34
+ connection_config = sync_config.source.connection_specification
35
+ connection_config = connection_config.with_indifferent_access
36
+ query = sync_config.model.query
37
+ if connection_config[:engine] == "presto"
38
+ query = batched_query_for_presto(query, sync_config.limit, sync_config.offset) unless sync_config.limit.nil? && sync_config.offset.nil?
39
+ else
40
+ query = batched_query(query, sync_config.limit, sync_config.offset) unless sync_config.limit.nil? && sync_config.offset.nil?
41
+ end
42
+ query(connection_config, query)
43
+ rescue StandardError => e
44
+ handle_exception(e, { context: "WATSONX DATA:READ:EXCEPTION", type: "error" })
45
+ end
46
+
47
+ private
48
+
49
+ def batched_query_for_presto(query, limit, offset)
50
+ <<~SQL
51
+ SELECT * FROM (
52
+ SELECT *, ROW_NUMBER() OVER () as rownum FROM ( #{query} ) subquery
53
+ ) t
54
+ WHERE rownum > #{offset}
55
+ LIMIT #{limit}
56
+ SQL
57
+ end
58
+
59
+ def execute_query(connection_config, query)
60
+ connection_config.with_indifferent_access
61
+ get_access_token(connection_config[:api_key])
62
+ url = format(
63
+ WATSONX_DATA_QUERIES_URL,
64
+ region: connection_config[:region],
65
+ engine_id: connection_config[:engine_id]
66
+ )
67
+ headers = auth_headers(@access_token)
68
+ headers["AuthInstanceId"] = connection_config[:auth_instance_id]
69
+ send_request(
70
+ url: url,
71
+ http_method: HTTP_POST,
72
+ payload: {
73
+ sql_string: query,
74
+ catalog_name: connection_config[:database],
75
+ schema_name: connection_config[:schema]
76
+ },
77
+ headers: headers,
78
+ config: connection_config[:config]
79
+ )
80
+ end
81
+
82
+ def query(connection, query)
83
+ response = execute_query(connection, query)
84
+ response = JSON.parse(response.body).with_indifferent_access
85
+ records = response[:response][:result]
86
+ records.map do |row|
87
+ RecordMessage.new(data: row, emitted_at: Time.now.to_i).to_outhad_message
88
+ end
89
+ end
90
+
91
+ def create_connection(connection_config)
92
+ connection_config
93
+ end
94
+
95
+ def create_streams(records)
96
+ group_by_table(records).map do |r|
97
+ Outhad::Integrations::Protocol::Stream.new(name: r[:tablename], action: StreamAction["fetch"], json_schema: convert_to_json_schema(r[:columns]))
98
+ end
99
+ end
100
+
101
+ def group_by_table(records)
102
+ records.group_by { |entry| entry["table_name"] }.map do |table_name, columns|
103
+ {
104
+ tablename: table_name,
105
+ columns: columns.map do |column|
106
+ {
107
+ column_name: column["column_name"],
108
+ type: column["data_type"],
109
+ optional: column["is_nullable"] == "YES"
110
+ }
111
+ end
112
+ }
113
+ end
114
+ end
115
+
116
+ def get_access_token(api_key)
117
+ cache = defined?(Rails) && Rails.respond_to?(:cache) ? Rails.cache : ActiveSupport::Cache::MemoryStore.new
118
+ cache_key = "watsonx_data_#{api_key}"
119
+ cached_token = cache.read(cache_key)
120
+ if cached_token
121
+ @access_token = cached_token
122
+ else
123
+ new_token = get_iam_token(api_key)
124
+ # puts new_token
125
+ # max expiration is 3 minutes. No way to make it higher
126
+ cache.write(cache_key, new_token, expires_in: 180)
127
+ @access_token = new_token
128
+ end
129
+ end
130
+
131
+ def get_iam_token(api_key)
132
+ uri = URI("https://iam.cloud.ibm.com/identity/token")
133
+ request = Net::HTTP::Post.new(uri)
134
+ request["Content-Type"] = "application/x-www-form-urlencoded"
135
+ request.body = "grant_type=urn:ibm:params:oauth:grant-type:apikey&apikey=#{api_key}"
136
+ response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
137
+ http.request(request)
138
+ end
139
+
140
+ raise "Failed to get IAM token: #{response.body}" unless response.is_a?(Net::HTTPSuccess)
141
+
142
+ JSON.parse(response.body)["access_token"]
143
+ end
144
+ end
145
+ end
146
+ end
@@ -0,0 +1,17 @@
1
+ {
2
+ "data": {
3
+ "name": "WatsonxData",
4
+ "title": "WatsonX Data Endpoint",
5
+ "connector_type": "source",
6
+ "category": "Data Warehouse",
7
+ "sub_category": "Relational Database",
8
+ "documentation_url": "https://docs.squared.ai/guides/sources/data-sources/watsonx_data",
9
+ "github_issue_label": "source-watsonx-data-endpoint",
10
+ "icon": "icon.svg",
11
+ "license": "MIT",
12
+ "release_stage": "alpha",
13
+ "support_level": "community",
14
+ "tags": ["language:ruby", "outhad"]
15
+ }
16
+ }
17
+
@@ -0,0 +1,72 @@
1
+ {
2
+ "documentation_url": "https://docs.squared.ai/guides/sources/data-sources/watsonx_data",
3
+ "stream_type": "dynamic",
4
+ "connector_query_type": "raw_sql",
5
+ "connection_specification": {
6
+ "$schema": "http://json-schema.org/draft-07/schema#",
7
+ "title": "WatsonX Data Endpoint",
8
+ "type": "object",
9
+ "required": ["api_key","region","engine","engine_id","auth_instance_id","database","schema"],
10
+ "properties": {
11
+ "api_key": {
12
+ "type": "string",
13
+ "outhad_secret": true,
14
+ "title": "API Key",
15
+ "order": 0
16
+ },
17
+ "region": {
18
+ "description": "WatsonX Data region",
19
+ "type": "string",
20
+ "title": "Region",
21
+ "order": 1
22
+ },
23
+ "engine": {
24
+ "description": "Which engine is being used? (Presto/Spark)",
25
+ "type": "string",
26
+ "title": "Engine",
27
+ "enum": ["presto"],
28
+ "default": "presto",
29
+ "order": 2
30
+ },
31
+ "engine_id": {
32
+ "description": "Engine id",
33
+ "type": "string",
34
+ "title": "Engine Id",
35
+ "order": 3
36
+ },
37
+ "auth_instance_id": {
38
+ "description": "WatsonX Data Instance CRN",
39
+ "type": "string",
40
+ "title": "Instance CRN",
41
+ "order": 4
42
+ },
43
+ "database": {
44
+ "description": "The specific database to connect to.",
45
+ "type": "string",
46
+ "title": "Database",
47
+ "order": 5
48
+ },
49
+ "schema": {
50
+ "description": "The schema within the database.",
51
+ "type": "string",
52
+ "title": "Schema",
53
+ "order": 6
54
+ },
55
+ "config": {
56
+ "title": "",
57
+ "type": "object",
58
+ "properties": {
59
+ "timeout": {
60
+ "type": "string",
61
+ "default": "30",
62
+ "title": "HTTP Timeout",
63
+ "description": "The maximum time, in seconds, to wait for a response from the server before the request is canceled.",
64
+ "order": 0
65
+ }
66
+ },
67
+ "order": 7
68
+ }
69
+ }
70
+ }
71
+ }
72
+
@@ -0,0 +1 @@
1
+ <svg id="Watsonx-Data--Streamline-Carbon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" height="16" width="16"><desc>Watsonx Data Streamline Icon: https://streamlinehq.com</desc><defs></defs><path d="M26 24c-1.1046 0-2 .8954-2 2 0 .0764.0142.1488.0225.2229C21.7417 28.0192 18.9433 29 16 29c-2.7746 0-5.3432-.881-7.4566-2.3676.2576.0261.517.0444.7798.0444C13.5561 26.6768 17 23.233 17 19h-2c0 3.1304-2.5464 5.6768-5.6768 5.6768-2.2111 0-4.1977-1.2816-5.1318-3.2725-.1365-.2972-.2595-.6007-.3738-.9094C4.4778 20.8169 5.2174 21 6 21c2.7568 0 5-2.2432 5-5v-2H9v2c0 1.6543-1.3457 3-3 3s-3-1.3457-3-3c0-2.1152.4917-4.1328 1.4619-5.9956l-1.7744-.9238C1.5835 11.2017 1 13.5943 1 16c0 8.271 6.729 15 15 15 3.3744 0 6.5818-1.1193 9.2048-3.1662.244.106.5123.1662.7952.1662 1.1046 0 2-.8954 2-2s-.8954-2-2-2Z" fill="#000000"></path><path transform="rotate(90 22 22)" d="M21 21h2v2h-2Z" fill="#000000"></path><path transform="rotate(90 16 16)" d="M15 15h2v2h-2Z" fill="#000000"></path><path transform="rotate(-90 10 10)" d="M9 9h2v2H9Z" fill="#000000"></path><path d="M16 1c-3.3744 0-6.5818 1.1193-9.2048 3.1662C6.5512 4.0602 6.2829 4 6 4c-1.1046 0-2 .8954-2 2s.8954 2 2 2 2-.8954 2-2c0-.0764-.0142-.1488-.0225-.2229C10.2583 3.9808 13.0567 3 16 3c2.7708 0 5.3363.8784 7.4481 2.3613-.249-.0242-.5005-.038-.7547-.038-4.2329 0-7.6768 3.4438-7.6768 7.6768h2c0-3.1304 2.5464-5.6768 5.6768-5.6768 2.0554 0 3.9068 1.0953 4.9186 2.8651.2153.4283.4053.8701.5729 1.3237C27.5234 11.1887 26.7844 11 26 11c-2.7568 0-5 2.2432-5 5v2h2v-2c0-1.6543 1.3457-3 3-3s3 1.3457 3 3c0 2.1152-.4917 4.1328-1.4619 5.9956l1.7744.9238C30.4165 20.7983 31 18.4057 31 16c0-8.271-6.729-15-15-15Z" fill="#000000"></path><path id="_Transparent_Rectangle_" d="M0 0h32v32H0Z" fill="none"></path></svg>
@@ -0,0 +1,129 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+ require "dry-struct"
5
+ require "dry-schema"
6
+ require "dry-types"
7
+ require "odbc"
8
+ require "sequel"
9
+ require "byebug"
10
+ require "net/http"
11
+ require "uri"
12
+ require "active_support/core_ext/hash/indifferent_access"
13
+ require "restforce"
14
+ require "logger"
15
+ require "slack-ruby-client"
16
+ require "git"
17
+ require "ruby-limiter"
18
+ require "hubspot-api-client"
19
+ require "google/apis/sheets_v4"
20
+ require "stringio"
21
+ require "stripe"
22
+ require "net/sftp"
23
+ require "csv"
24
+ require "securerandom"
25
+ require "aws-sdk-athena"
26
+ require "zip"
27
+ require "zendesk_api"
28
+ require "faraday"
29
+ require "base64"
30
+ require "aws-sdk-s3"
31
+ require "duckdb"
32
+ require "iterable-api-client"
33
+ require "aws-sdk-sts"
34
+ require "ruby-oci8"
35
+ require "aws-sdk-sagemaker"
36
+ require "aws-sdk-sagemakerruntime"
37
+ require "google/cloud/ai_platform/v1"
38
+ require "grpc"
39
+ require "MailchimpMarketing"
40
+ require "aws-sdk-bedrockruntime"
41
+ require "pinecone"
42
+ require "intuit-oauth"
43
+ require "nokogiri"
44
+ require "xmlrpc/client"
45
+
46
+ # Service
47
+ require_relative "integrations/config"
48
+ require_relative "integrations/rollout"
49
+ require_relative "integrations/service"
50
+
51
+ # Core
52
+ require_relative "integrations/core/constants"
53
+ require_relative "integrations/core/utils"
54
+ require_relative "integrations/core/rate_limiter"
55
+ require_relative "integrations/core/fullrefresher"
56
+ require_relative "integrations/protocol/protocol"
57
+ require_relative "integrations/core/base_connector"
58
+ require_relative "integrations/core/source_connector"
59
+ require_relative "integrations/core/destination_connector"
60
+ require_relative "integrations/core/http_helper"
61
+ require_relative "integrations/core/http_client"
62
+ require_relative "integrations/core/streaming_http_client"
63
+ require_relative "integrations/core/query_builder"
64
+ require_relative "integrations/core/unstructured_source_connector"
65
+ require_relative "integrations/core/vector_source_connector"
66
+
67
+ # Source
68
+ require_relative "integrations/source/snowflake/client"
69
+ require_relative "integrations/source/redshift/client"
70
+ require_relative "integrations/source/bigquery/client"
71
+ require_relative "integrations/source/postgresql/client"
72
+ require_relative "integrations/source/databricks/client"
73
+ require_relative "integrations/source/salesforce_consumer_goods_cloud/client"
74
+ require_relative "integrations/source/aws_athena/client"
75
+ require_relative "integrations/source/clickhouse/client"
76
+ require_relative "integrations/source/amazon_s3/client"
77
+ require_relative "integrations/source/maria_db/client"
78
+ require_relative "integrations/source/oracle_db/client"
79
+ require_relative "integrations/source/databrics_model/client"
80
+ require_relative "integrations/source/aws_sagemaker_model/client"
81
+ require_relative "integrations/source/google_vertex_model/client"
82
+ require_relative "integrations/source/http_model/client"
83
+ require_relative "integrations/source/open_ai/client"
84
+ require_relative "integrations/source/sftp/client"
85
+ require_relative "integrations/source/watsonx_ai/client"
86
+ require_relative "integrations/source/watsonx_data/client"
87
+ require_relative "integrations/source/anthropic/client"
88
+ require_relative "integrations/source/aws_bedrock_model/client"
89
+ require_relative "integrations/source/generic_open_ai/client"
90
+ require_relative "integrations/source/intuit_quick_books/client"
91
+ require_relative "integrations/source/pinecone_db/client"
92
+ require_relative "integrations/source/qdrant/client"
93
+ require_relative "integrations/source/firecrawl/client"
94
+ require_relative "integrations/source/odoo/client"
95
+
96
+ # Destination
97
+ require_relative "integrations/destination/klaviyo/client"
98
+ require_relative "integrations/destination/salesforce_crm/client"
99
+ require_relative "integrations/destination/facebook_custom_audience/client"
100
+ require_relative "integrations/destination/slack/client"
101
+ require_relative "integrations/destination/hubspot/client"
102
+ require_relative "integrations/destination/google_sheets/client"
103
+ require_relative "integrations/destination/airtable/client"
104
+ require_relative "integrations/destination/stripe/client"
105
+ require_relative "integrations/destination/salesforce_consumer_goods_cloud/client"
106
+ require_relative "integrations/destination/sftp/client"
107
+ require_relative "integrations/destination/postgresql/client"
108
+ require_relative "integrations/destination/zendesk/client"
109
+ require_relative "integrations/destination/http/client"
110
+ require_relative "integrations/destination/iterable/client"
111
+ require_relative "integrations/destination/maria_db/client"
112
+ require_relative "integrations/destination/databricks_lakehouse/client"
113
+ require_relative "integrations/destination/oracle_db/client"
114
+ require_relative "integrations/destination/microsoft_excel/client"
115
+ require_relative "integrations/destination/microsoft_sql/client"
116
+ require_relative "integrations/destination/mailchimp/client"
117
+ require_relative "integrations/destination/ais_data_store/client"
118
+ require_relative "integrations/destination/amazon_s3/client"
119
+ require_relative "integrations/destination/microsoft_dynamics/client"
120
+ require_relative "integrations/destination/qdrant/client"
121
+ require_relative "integrations/destination/pinecone_db/client"
122
+ require_relative "integrations/destination/odoo/client"
123
+
124
+ module Outhad
125
+ module Integrations
126
+ class Error < StandardError; end
127
+ # Your code goes here...
128
+ end
129
+ end
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/outhad/integrations/rollout"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "outhad-integrations"
7
+ spec.version = Outhad::Integrations::VERSION
8
+ spec.authors = ["Tanzi"]
9
+ spec.email = ["tanzi@outhad.com"]
10
+
11
+ spec.summary = "Integration suite for open source reverse ETL platform"
12
+ spec.description = "Outhad Integrations is a comprehensive Ruby gem designed to facilitate seamless connectivity between various data sources and SaaS platforms."
13
+
14
+ spec.homepage = "https://www.outhad.com/"
15
+ spec.license = "MIT"
16
+ spec.required_ruby_version = ">= 2.6.0"
17
+
18
+ # spec.metadata["allowed_push_host"] = nil
19
+ spec.metadata["github_repo"] = "https://github.com/tanzil7890/outhad"
20
+ spec.metadata["homepage_uri"] = spec.homepage
21
+ spec.metadata["source_code_uri"] = "https://github.com/tanzil7890/outhad/tree/main/integrations"
22
+ #spec.metadata["changelog_uri"] = "https://github.com/Outhad/outhad/blob/main/integrations/CHANGELOG.md"
23
+
24
+ # Specify which files should be added to the gem when it is released.
25
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
26
+ spec.files = Dir.chdir(__dir__) do
27
+ `git ls-files -z`.split("\x0").reject do |f|
28
+ (File.expand_path(f) == __FILE__) ||
29
+ f.start_with?(*%w[bin/ test/ spec/ features/ .git .circleci appveyor Gemfile vendor/])
30
+ end
31
+ end
32
+ spec.bindir = "exe"
33
+ spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
34
+ spec.require_paths = ["lib"]
35
+
36
+ spec.add_runtime_dependency "activesupport"
37
+ spec.add_runtime_dependency "async-websocket"
38
+ spec.add_runtime_dependency "aws-sdk-athena"
39
+ spec.add_runtime_dependency "aws-sdk-cloudwatchlogs"
40
+ spec.add_runtime_dependency "aws-sdk-s3"
41
+ spec.add_runtime_dependency "aws-sdk-sts"
42
+ spec.add_runtime_dependency "aws-sigv4"
43
+ spec.add_runtime_dependency "csv"
44
+ spec.add_runtime_dependency "dry-schema"
45
+ spec.add_runtime_dependency "dry-struct"
46
+ spec.add_runtime_dependency "dry-types"
47
+ spec.add_runtime_dependency "duckdb"
48
+ spec.add_runtime_dependency "git"
49
+ spec.add_runtime_dependency "google-apis-sheets_v4"
50
+ spec.add_runtime_dependency "google-cloud-ai_platform-v1"
51
+ spec.add_runtime_dependency "google-cloud-bigquery"
52
+ spec.add_runtime_dependency "grpc"
53
+ spec.add_runtime_dependency "hubspot-api-client"
54
+ spec.add_runtime_dependency "iterable-api-client"
55
+ spec.add_runtime_dependency "MailchimpMarketing"
56
+ spec.add_runtime_dependency "net-sftp"
57
+ spec.add_runtime_dependency "pg"
58
+ spec.add_runtime_dependency "rake"
59
+ spec.add_runtime_dependency "restforce"
60
+ spec.add_runtime_dependency "ruby-limiter"
61
+ spec.add_runtime_dependency "ruby-oci8"
62
+ spec.add_runtime_dependency "ruby-odbc"
63
+ spec.add_runtime_dependency "rubyzip"
64
+ spec.add_runtime_dependency "sequel"
65
+ spec.add_runtime_dependency "slack-ruby-client"
66
+ spec.add_runtime_dependency "stripe"
67
+ spec.add_runtime_dependency "tiny_tds"
68
+ spec.add_runtime_dependency "zendesk_api"
69
+
70
+ spec.add_development_dependency "byebug"
71
+ spec.add_development_dependency "rspec"
72
+ spec.add_development_dependency "rubocop"
73
+ spec.add_development_dependency "simplecov"
74
+ spec.add_development_dependency "simplecov_json_formatter"
75
+ spec.add_development_dependency "webmock"
76
+
77
+ # For more information and examples about making a new gem, check out our
78
+ # guide at: https://bundler.io/guides/creating_gem.html
79
+ end
@@ -0,0 +1,6 @@
1
+ module Outhad
2
+ module Integrations
3
+ VERSION: String
4
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
5
+ end
6
+ end