ingestr 0.13.52__tar.gz → 0.13.53__tar.gz

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.

Potentially problematic release.


This version of ingestr might be problematic. Click here for more details.

Files changed (289) hide show
  1. {ingestr-0.13.52 → ingestr-0.13.53}/.gitignore +1 -0
  2. {ingestr-0.13.52 → ingestr-0.13.53}/PKG-INFO +51 -4
  3. {ingestr-0.13.52 → ingestr-0.13.53}/README.md +42 -2
  4. {ingestr-0.13.52 → ingestr-0.13.53}/docs/.vitepress/config.mjs +2 -1
  5. ingestr-0.13.53/docs/media/cratedb-source.png +0 -0
  6. ingestr-0.13.53/docs/media/sftp.png +0 -0
  7. ingestr-0.13.53/docs/supported-sources/cratedb.md +80 -0
  8. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/mysql.md +3 -3
  9. ingestr-0.13.53/docs/supported-sources/sftp.md +43 -0
  10. ingestr-0.13.53/ingestr/src/buildinfo.py +1 -0
  11. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/destinations.py +18 -0
  12. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/factory.py +6 -0
  13. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/sources.py +55 -25
  14. {ingestr-0.13.52 → ingestr-0.13.53}/requirements.in +2 -0
  15. {ingestr-0.13.52 → ingestr-0.13.53}/requirements.txt +24 -2
  16. {ingestr-0.13.52 → ingestr-0.13.53}/requirements_arm64.txt +23 -1
  17. ingestr-0.13.52/ingestr/src/buildinfo.py +0 -1
  18. {ingestr-0.13.52 → ingestr-0.13.53}/.dockerignore +0 -0
  19. {ingestr-0.13.52 → ingestr-0.13.53}/.githooks/pre-commit-hook.sh +0 -0
  20. {ingestr-0.13.52 → ingestr-0.13.53}/.github/workflows/deploy-docs.yml +0 -0
  21. {ingestr-0.13.52 → ingestr-0.13.53}/.github/workflows/release.yml +0 -0
  22. {ingestr-0.13.52 → ingestr-0.13.53}/.github/workflows/secrets-scan.yml +0 -0
  23. {ingestr-0.13.52 → ingestr-0.13.53}/.github/workflows/tests.yml +0 -0
  24. {ingestr-0.13.52 → ingestr-0.13.53}/.gitleaksignore +0 -0
  25. {ingestr-0.13.52 → ingestr-0.13.53}/.python-version +0 -0
  26. {ingestr-0.13.52 → ingestr-0.13.53}/.vale.ini +0 -0
  27. {ingestr-0.13.52 → ingestr-0.13.53}/Dockerfile +0 -0
  28. {ingestr-0.13.52 → ingestr-0.13.53}/LICENSE.md +0 -0
  29. {ingestr-0.13.52 → ingestr-0.13.53}/Makefile +0 -0
  30. {ingestr-0.13.52 → ingestr-0.13.53}/docs/.vitepress/theme/custom.css +0 -0
  31. {ingestr-0.13.52 → ingestr-0.13.53}/docs/.vitepress/theme/index.js +0 -0
  32. {ingestr-0.13.52 → ingestr-0.13.53}/docs/commands/example-uris.md +0 -0
  33. {ingestr-0.13.52 → ingestr-0.13.53}/docs/commands/ingest.md +0 -0
  34. {ingestr-0.13.52 → ingestr-0.13.53}/docs/getting-started/core-concepts.md +0 -0
  35. {ingestr-0.13.52 → ingestr-0.13.53}/docs/getting-started/incremental-loading.md +0 -0
  36. {ingestr-0.13.52 → ingestr-0.13.53}/docs/getting-started/quickstart.md +0 -0
  37. {ingestr-0.13.52 → ingestr-0.13.53}/docs/getting-started/telemetry.md +0 -0
  38. {ingestr-0.13.52 → ingestr-0.13.53}/docs/index.md +0 -0
  39. {ingestr-0.13.52 → ingestr-0.13.53}/docs/media/applovin_max.png +0 -0
  40. {ingestr-0.13.52 → ingestr-0.13.53}/docs/media/athena.png +0 -0
  41. {ingestr-0.13.52 → ingestr-0.13.53}/docs/media/clickhouse_img.png +0 -0
  42. {ingestr-0.13.52 → ingestr-0.13.53}/docs/media/freshdesk_ingestion.png +0 -0
  43. {ingestr-0.13.52 → ingestr-0.13.53}/docs/media/gcp_spanner_ingestion.png +0 -0
  44. {ingestr-0.13.52 → ingestr-0.13.53}/docs/media/github.png +0 -0
  45. {ingestr-0.13.52 → ingestr-0.13.53}/docs/media/google_analytics_realtime_report.png +0 -0
  46. {ingestr-0.13.52 → ingestr-0.13.53}/docs/media/googleanalytics.png +0 -0
  47. {ingestr-0.13.52 → ingestr-0.13.53}/docs/media/ingestion_elasticsearch_img.png +0 -0
  48. {ingestr-0.13.52 → ingestr-0.13.53}/docs/media/kinesis.bigquery.png +0 -0
  49. {ingestr-0.13.52 → ingestr-0.13.53}/docs/media/linkedin_ads.png +0 -0
  50. {ingestr-0.13.52 → ingestr-0.13.53}/docs/media/personio.png +0 -0
  51. {ingestr-0.13.52 → ingestr-0.13.53}/docs/media/personio_duckdb.png +0 -0
  52. {ingestr-0.13.52 → ingestr-0.13.53}/docs/media/phantombuster.png +0 -0
  53. {ingestr-0.13.52 → ingestr-0.13.53}/docs/media/pipedrive.png +0 -0
  54. {ingestr-0.13.52 → ingestr-0.13.53}/docs/media/stripe_postgres.png +0 -0
  55. {ingestr-0.13.52 → ingestr-0.13.53}/docs/media/tiktok.png +0 -0
  56. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/adjust.md +0 -0
  57. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/airtable.md +0 -0
  58. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/applovin.md +0 -0
  59. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/applovin_max.md +0 -0
  60. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/appsflyer.md +0 -0
  61. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/appstore.md +0 -0
  62. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/asana.md +0 -0
  63. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/athena.md +0 -0
  64. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/attio.md +0 -0
  65. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/bigquery.md +0 -0
  66. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/chess.md +0 -0
  67. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/clickhouse.md +0 -0
  68. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/csv.md +0 -0
  69. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/custom_queries.md +0 -0
  70. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/databricks.md +0 -0
  71. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/db2.md +0 -0
  72. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/duckdb.md +0 -0
  73. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/dynamodb.md +0 -0
  74. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/elasticsearch.md +0 -0
  75. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/facebook-ads.md +0 -0
  76. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/frankfurter.md +0 -0
  77. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/freshdesk.md +0 -0
  78. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/gcs.md +0 -0
  79. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/github.md +0 -0
  80. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/google-ads.md +0 -0
  81. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/google_analytics.md +0 -0
  82. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/gorgias.md +0 -0
  83. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/gsheets.md +0 -0
  84. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/hubspot.md +0 -0
  85. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/kafka.md +0 -0
  86. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/kinesis.md +0 -0
  87. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/klaviyo.md +0 -0
  88. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/linkedin_ads.md +0 -0
  89. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/mongodb.md +0 -0
  90. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/mssql.md +0 -0
  91. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/notion.md +0 -0
  92. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/oracle.md +0 -0
  93. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/personio.md +0 -0
  94. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/phantombuster.md +0 -0
  95. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/pipedrive.md +0 -0
  96. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/postgres.md +0 -0
  97. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/redshift.md +0 -0
  98. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/s3.md +0 -0
  99. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/salesforce.md +0 -0
  100. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/sap-hana.md +0 -0
  101. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/shopify.md +0 -0
  102. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/slack.md +0 -0
  103. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/smartsheets.md +0 -0
  104. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/snowflake.md +0 -0
  105. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/solidgate.md +0 -0
  106. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/spanner.md +0 -0
  107. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/sqlite.md +0 -0
  108. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/stripe.md +0 -0
  109. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/tiktok-ads.md +0 -0
  110. {ingestr-0.13.52 → ingestr-0.13.53}/docs/supported-sources/zendesk.md +0 -0
  111. {ingestr-0.13.52 → ingestr-0.13.53}/docs/tutorials/load-kinesis-bigquery.md +0 -0
  112. {ingestr-0.13.52 → ingestr-0.13.53}/docs/tutorials/load-personio-duckdb.md +0 -0
  113. {ingestr-0.13.52 → ingestr-0.13.53}/docs/tutorials/load-stripe-postgres.md +0 -0
  114. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/conftest.py +0 -0
  115. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/main.py +0 -0
  116. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/.gitignore +0 -0
  117. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/adjust/__init__.py +0 -0
  118. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/adjust/adjust_helpers.py +0 -0
  119. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/airtable/__init__.py +0 -0
  120. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/applovin/__init__.py +0 -0
  121. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/applovin_max/__init__.py +0 -0
  122. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/appsflyer/__init__.py +0 -0
  123. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/appsflyer/client.py +0 -0
  124. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/appstore/__init__.py +0 -0
  125. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/appstore/client.py +0 -0
  126. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/appstore/errors.py +0 -0
  127. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/appstore/models.py +0 -0
  128. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/appstore/resources.py +0 -0
  129. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/arrow/__init__.py +0 -0
  130. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/asana_source/__init__.py +0 -0
  131. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/asana_source/helpers.py +0 -0
  132. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/asana_source/settings.py +0 -0
  133. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/attio/__init__.py +0 -0
  134. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/attio/helpers.py +0 -0
  135. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/blob.py +0 -0
  136. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/chess/__init__.py +0 -0
  137. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/chess/helpers.py +0 -0
  138. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/chess/settings.py +0 -0
  139. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/collector/spinner.py +0 -0
  140. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/dynamodb/__init__.py +0 -0
  141. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/elasticsearch/__init__.py +0 -0
  142. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/errors.py +0 -0
  143. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/facebook_ads/__init__.py +0 -0
  144. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/facebook_ads/exceptions.py +0 -0
  145. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/facebook_ads/helpers.py +0 -0
  146. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/facebook_ads/settings.py +0 -0
  147. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/filesystem/__init__.py +0 -0
  148. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/filesystem/helpers.py +0 -0
  149. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/filesystem/readers.py +0 -0
  150. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/filters.py +0 -0
  151. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/frankfurter/__init__.py +0 -0
  152. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/frankfurter/helpers.py +0 -0
  153. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/freshdesk/__init__.py +0 -0
  154. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/freshdesk/freshdesk_client.py +0 -0
  155. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/freshdesk/settings.py +0 -0
  156. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/github/__init__.py +0 -0
  157. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/github/helpers.py +0 -0
  158. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/github/queries.py +0 -0
  159. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/github/settings.py +0 -0
  160. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/google_ads/__init__.py +0 -0
  161. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/google_ads/field.py +0 -0
  162. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/google_ads/metrics.py +0 -0
  163. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/google_ads/predicates.py +0 -0
  164. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/google_ads/reports.py +0 -0
  165. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/google_analytics/__init__.py +0 -0
  166. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/google_analytics/helpers.py +0 -0
  167. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/google_sheets/README.md +0 -0
  168. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/google_sheets/__init__.py +0 -0
  169. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
  170. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
  171. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
  172. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/gorgias/__init__.py +0 -0
  173. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/gorgias/helpers.py +0 -0
  174. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/http_client.py +0 -0
  175. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/hubspot/__init__.py +0 -0
  176. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/hubspot/helpers.py +0 -0
  177. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/hubspot/settings.py +0 -0
  178. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/kafka/__init__.py +0 -0
  179. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/kafka/helpers.py +0 -0
  180. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/kinesis/__init__.py +0 -0
  181. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/kinesis/helpers.py +0 -0
  182. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/klaviyo/__init__.py +0 -0
  183. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/klaviyo/client.py +0 -0
  184. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/klaviyo/helpers.py +0 -0
  185. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/linkedin_ads/__init__.py +0 -0
  186. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
  187. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/linkedin_ads/helpers.py +0 -0
  188. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/loader.py +0 -0
  189. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/mongodb/__init__.py +0 -0
  190. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/mongodb/helpers.py +0 -0
  191. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/notion/__init__.py +0 -0
  192. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/notion/helpers/__init__.py +0 -0
  193. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/notion/helpers/client.py +0 -0
  194. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/notion/helpers/database.py +0 -0
  195. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/notion/settings.py +0 -0
  196. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/partition.py +0 -0
  197. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/personio/__init__.py +0 -0
  198. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/personio/helpers.py +0 -0
  199. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/phantombuster/__init__.py +0 -0
  200. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/phantombuster/client.py +0 -0
  201. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/pipedrive/__init__.py +0 -0
  202. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/pipedrive/helpers/__init__.py +0 -0
  203. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/pipedrive/helpers/custom_fields_munger.py +0 -0
  204. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/pipedrive/helpers/pages.py +0 -0
  205. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/pipedrive/settings.py +0 -0
  206. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/pipedrive/typing.py +0 -0
  207. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/resource.py +0 -0
  208. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/salesforce/__init__.py +0 -0
  209. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/salesforce/helpers.py +0 -0
  210. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/shopify/__init__.py +0 -0
  211. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/shopify/exceptions.py +0 -0
  212. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/shopify/helpers.py +0 -0
  213. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/shopify/settings.py +0 -0
  214. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/slack/__init__.py +0 -0
  215. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/slack/helpers.py +0 -0
  216. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/slack/settings.py +0 -0
  217. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/smartsheets/__init__.py +0 -0
  218. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/solidgate/__init__.py +0 -0
  219. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/solidgate/helpers.py +0 -0
  220. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/sql_database/__init__.py +0 -0
  221. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/sql_database/callbacks.py +0 -0
  222. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/stripe_analytics/__init__.py +0 -0
  223. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/stripe_analytics/helpers.py +0 -0
  224. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/stripe_analytics/settings.py +0 -0
  225. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/table_definition.py +0 -0
  226. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/telemetry/event.py +0 -0
  227. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/testdata/fakebqcredentials.json +0 -0
  228. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/tiktok_ads/__init__.py +0 -0
  229. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -0
  230. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/time.py +0 -0
  231. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/version.py +0 -0
  232. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/zendesk/__init__.py +0 -0
  233. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/zendesk/helpers/__init__.py +0 -0
  234. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
  235. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/zendesk/helpers/credentials.py +0 -0
  236. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
  237. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/src/zendesk/settings.py +0 -0
  238. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/testdata/.gitignore +0 -0
  239. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/testdata/create_replace.csv +0 -0
  240. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/testdata/delete_insert_expected.csv +0 -0
  241. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/testdata/delete_insert_part1.csv +0 -0
  242. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/testdata/delete_insert_part2.csv +0 -0
  243. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/testdata/merge_expected.csv +0 -0
  244. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/testdata/merge_part1.csv +0 -0
  245. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/testdata/merge_part2.csv +0 -0
  246. {ingestr-0.13.52 → ingestr-0.13.53}/ingestr/tests/unit/test_smartsheets.py +0 -0
  247. {ingestr-0.13.52 → ingestr-0.13.53}/package-lock.json +0 -0
  248. {ingestr-0.13.52 → ingestr-0.13.53}/package.json +0 -0
  249. {ingestr-0.13.52 → ingestr-0.13.53}/pyproject.toml +0 -0
  250. {ingestr-0.13.52 → ingestr-0.13.53}/requirements-dev.txt +0 -0
  251. {ingestr-0.13.52 → ingestr-0.13.53}/resources/demo.gif +0 -0
  252. {ingestr-0.13.52 → ingestr-0.13.53}/resources/demo.tape +0 -0
  253. {ingestr-0.13.52 → ingestr-0.13.53}/resources/ingestr.svg +0 -0
  254. {ingestr-0.13.52 → ingestr-0.13.53}/styles/Google/AMPM.yml +0 -0
  255. {ingestr-0.13.52 → ingestr-0.13.53}/styles/Google/Acronyms.yml +0 -0
  256. {ingestr-0.13.52 → ingestr-0.13.53}/styles/Google/Colons.yml +0 -0
  257. {ingestr-0.13.52 → ingestr-0.13.53}/styles/Google/Contractions.yml +0 -0
  258. {ingestr-0.13.52 → ingestr-0.13.53}/styles/Google/DateFormat.yml +0 -0
  259. {ingestr-0.13.52 → ingestr-0.13.53}/styles/Google/Ellipses.yml +0 -0
  260. {ingestr-0.13.52 → ingestr-0.13.53}/styles/Google/EmDash.yml +0 -0
  261. {ingestr-0.13.52 → ingestr-0.13.53}/styles/Google/Exclamation.yml +0 -0
  262. {ingestr-0.13.52 → ingestr-0.13.53}/styles/Google/FirstPerson.yml +0 -0
  263. {ingestr-0.13.52 → ingestr-0.13.53}/styles/Google/Gender.yml +0 -0
  264. {ingestr-0.13.52 → ingestr-0.13.53}/styles/Google/GenderBias.yml +0 -0
  265. {ingestr-0.13.52 → ingestr-0.13.53}/styles/Google/HeadingPunctuation.yml +0 -0
  266. {ingestr-0.13.52 → ingestr-0.13.53}/styles/Google/Headings.yml +0 -0
  267. {ingestr-0.13.52 → ingestr-0.13.53}/styles/Google/Latin.yml +0 -0
  268. {ingestr-0.13.52 → ingestr-0.13.53}/styles/Google/LyHyphens.yml +0 -0
  269. {ingestr-0.13.52 → ingestr-0.13.53}/styles/Google/OptionalPlurals.yml +0 -0
  270. {ingestr-0.13.52 → ingestr-0.13.53}/styles/Google/Ordinal.yml +0 -0
  271. {ingestr-0.13.52 → ingestr-0.13.53}/styles/Google/OxfordComma.yml +0 -0
  272. {ingestr-0.13.52 → ingestr-0.13.53}/styles/Google/Parens.yml +0 -0
  273. {ingestr-0.13.52 → ingestr-0.13.53}/styles/Google/Passive.yml +0 -0
  274. {ingestr-0.13.52 → ingestr-0.13.53}/styles/Google/Periods.yml +0 -0
  275. {ingestr-0.13.52 → ingestr-0.13.53}/styles/Google/Quotes.yml +0 -0
  276. {ingestr-0.13.52 → ingestr-0.13.53}/styles/Google/Ranges.yml +0 -0
  277. {ingestr-0.13.52 → ingestr-0.13.53}/styles/Google/Semicolons.yml +0 -0
  278. {ingestr-0.13.52 → ingestr-0.13.53}/styles/Google/Slang.yml +0 -0
  279. {ingestr-0.13.52 → ingestr-0.13.53}/styles/Google/Spacing.yml +0 -0
  280. {ingestr-0.13.52 → ingestr-0.13.53}/styles/Google/Spelling.yml +0 -0
  281. {ingestr-0.13.52 → ingestr-0.13.53}/styles/Google/Units.yml +0 -0
  282. {ingestr-0.13.52 → ingestr-0.13.53}/styles/Google/We.yml +0 -0
  283. {ingestr-0.13.52 → ingestr-0.13.53}/styles/Google/Will.yml +0 -0
  284. {ingestr-0.13.52 → ingestr-0.13.53}/styles/Google/WordList.yml +0 -0
  285. {ingestr-0.13.52 → ingestr-0.13.53}/styles/Google/meta.json +0 -0
  286. {ingestr-0.13.52 → ingestr-0.13.53}/styles/Google/vocab.txt +0 -0
  287. {ingestr-0.13.52 → ingestr-0.13.53}/styles/bruin/Ingestr.yml +0 -0
  288. {ingestr-0.13.52 → ingestr-0.13.53}/styles/config/vocabularies/bruin/accept.txt +0 -0
  289. {ingestr-0.13.52 → ingestr-0.13.53}/test.env.template +0 -0
@@ -3,6 +3,7 @@ __pycache__
3
3
  .env
4
4
  venv
5
5
  !.gitkeep
6
+ .idea
6
7
  .vscode/*
7
8
  .metals/*
8
9
  .coverage.*
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ingestr
3
- Version: 0.13.52
3
+ Version: 0.13.53
4
4
  Summary: ingestr is a command-line application that ingests data from various sources and stores them in any database.
5
5
  Project-URL: Homepage, https://github.com/bruin-data/ingestr
6
6
  Project-URL: Issues, https://github.com/bruin-data/ingestr/issues
@@ -26,6 +26,7 @@ Requires-Dist: asn1crypto==1.5.1
26
26
  Requires-Dist: asynch==0.2.4
27
27
  Requires-Dist: attrs==25.1.0
28
28
  Requires-Dist: backoff==2.2.1
29
+ Requires-Dist: bcrypt==4.3.0
29
30
  Requires-Dist: beautifulsoup4==4.13.3
30
31
  Requires-Dist: boto3==1.37.1
31
32
  Requires-Dist: botocore==1.37.1
@@ -39,6 +40,7 @@ Requires-Dist: clickhouse-connect==0.8.14
39
40
  Requires-Dist: clickhouse-driver==0.2.9
40
41
  Requires-Dist: clickhouse-sqlalchemy==0.2.7
41
42
  Requires-Dist: confluent-kafka==2.8.0
43
+ Requires-Dist: crate==2.0.0
42
44
  Requires-Dist: cryptography==44.0.2
43
45
  Requires-Dist: curlify==2.2.1
44
46
  Requires-Dist: databricks-sql-connector==2.9.3
@@ -59,6 +61,7 @@ Requires-Dist: flatten-json==0.1.14
59
61
  Requires-Dist: frozenlist==1.5.0
60
62
  Requires-Dist: fsspec==2025.3.2
61
63
  Requires-Dist: gcsfs==2025.3.2
64
+ Requires-Dist: geojson==3.2.0
62
65
  Requires-Dist: gitdb==4.0.12
63
66
  Requires-Dist: gitpython==3.1.44
64
67
  Requires-Dist: giturlparse==0.12.0
@@ -77,7 +80,7 @@ Requires-Dist: google-cloud-storage==3.1.0
77
80
  Requires-Dist: google-crc32c==1.6.0
78
81
  Requires-Dist: google-resumable-media==2.7.2
79
82
  Requires-Dist: googleapis-common-protos==1.69.0
80
- Requires-Dist: greenlet==3.2.2
83
+ Requires-Dist: greenlet==3.2.3
81
84
  Requires-Dist: grpc-google-iam-v1==0.14.2
82
85
  Requires-Dist: grpc-interceptor==0.15.4
83
86
  Requires-Dist: grpcio-status==1.62.3
@@ -113,6 +116,7 @@ Requires-Dist: openpyxl==3.1.5
113
116
  Requires-Dist: orjson==3.10.15
114
117
  Requires-Dist: packaging==24.2
115
118
  Requires-Dist: pandas==2.2.3
119
+ Requires-Dist: paramiko==3.5.1
116
120
  Requires-Dist: pathvalidate==3.2.3
117
121
  Requires-Dist: pendulum==3.0.0
118
122
  Requires-Dist: platformdirs==4.3.6
@@ -137,6 +141,7 @@ Requires-Dist: pygments==2.19.1
137
141
  Requires-Dist: pyjwt==2.10.1
138
142
  Requires-Dist: pymongo==4.11.1
139
143
  Requires-Dist: pymysql==1.1.1
144
+ Requires-Dist: pynacl==1.5.0
140
145
  Requires-Dist: pyopenssl==25.0.0
141
146
  Requires-Dist: pyparsing==3.2.1
142
147
  Requires-Dist: pyrate-limiter==3.7.0
@@ -170,6 +175,7 @@ Requires-Dist: snowflake-sqlalchemy==1.6.1
170
175
  Requires-Dist: sortedcontainers==2.4.0
171
176
  Requires-Dist: soupsieve==2.6
172
177
  Requires-Dist: sqlalchemy-bigquery==1.12.1
178
+ Requires-Dist: sqlalchemy-cratedb==0.42.0.dev2
173
179
  Requires-Dist: sqlalchemy-hana==2.0.0
174
180
  Requires-Dist: sqlalchemy-redshift==0.8.14
175
181
  Requires-Dist: sqlalchemy-spanner==1.11.0
@@ -192,6 +198,7 @@ Requires-Dist: tzdata==2025.1
192
198
  Requires-Dist: tzlocal==5.3
193
199
  Requires-Dist: uritemplate==4.1.1
194
200
  Requires-Dist: urllib3==2.3.0
201
+ Requires-Dist: verlib2==0.3.1
195
202
  Requires-Dist: wrapt==1.17.2
196
203
  Requires-Dist: yarl==1.18.3
197
204
  Requires-Dist: zeep==4.3.1
@@ -292,11 +299,21 @@ Pull requests are welcome. However, please open an issue first to discuss what y
292
299
  <td>✅</td>
293
300
  <td>✅</td>
294
301
  </tr>
302
+ <tr>
303
+ <td>CrateDB</td>
304
+ <td>✅</td>
305
+ <td>❌</td>
306
+ </tr>
295
307
  <tr>
296
308
  <td>Databricks</td>
297
309
  <td>✅</td>
298
310
  <td>✅</td>
299
311
  </tr>
312
+ <tr>
313
+ <td>IBM Db2</td>
314
+ <td>✅</td>
315
+ <td>-</td>
316
+ </tr>
300
317
  <tr>
301
318
  <td>DuckDB</td>
302
319
  <td>✅</td>
@@ -307,6 +324,16 @@ Pull requests are welcome. However, please open an issue first to discuss what y
307
324
  <td>✅</td>
308
325
  <td>-</td>
309
326
  </tr>
327
+ <tr>
328
+ <td>Elasticsearch</td>
329
+ <td>✅</td>
330
+ <td>-</td>
331
+ </tr>
332
+ <tr>
333
+ <td>GCP Spanner</td>
334
+ <td>✅</td>
335
+ <td>-</td>
336
+ </tr>
310
337
  <tr>
311
338
  <td>Local CSV file</td>
312
339
  <td>✅</td>
@@ -393,6 +420,11 @@ Pull requests are welcome. However, please open an issue first to discuss what y
393
420
  <td>✅</td>
394
421
  <td>-</td>
395
422
  </tr>
423
+ <tr>
424
+ <td>Attio</td>
425
+ <td>✅</td>
426
+ <td>-</td>
427
+ </tr>
396
428
  <tr>
397
429
  <td>Chess.com</td>
398
430
  <td>✅</td>
@@ -404,7 +436,7 @@ Pull requests are welcome. However, please open an issue first to discuss what y
404
436
  <td>-</td>
405
437
  </tr>
406
438
  <tr>
407
- <td>Github</td>
439
+ <td>GitHub</td>
408
440
  <td>✅</td>
409
441
  <td>-</td>
410
442
  </tr>
@@ -447,6 +479,16 @@ Pull requests are welcome. However, please open an issue first to discuss what y
447
479
  <td>Personio</td>
448
480
  <td>✅</td>
449
481
  <td>-</td>
482
+ </tr>
483
+ <tr>
484
+ <td>Phantombuster</td>
485
+ <td>✅</td>
486
+ <td>-</td>
487
+ </tr>
488
+ <tr>
489
+ <td>Pipedrive</td>
490
+ <td>✅</td>
491
+ <td>-</td>
450
492
  </tr>
451
493
  <tr>
452
494
  <td>S3</td>
@@ -469,7 +511,12 @@ Pull requests are welcome. However, please open an issue first to discuss what y
469
511
  <td>-</td>
470
512
  </tr>
471
513
  <tr>
472
- <td>Smartsheet</td>
514
+ <td>Smartsheets</td>
515
+ <td>✅</td>
516
+ <td>-</td>
517
+ </tr>
518
+ <tr>
519
+ <td>Solidgate</td>
473
520
  <td>✅</td>
474
521
  <td>-</td>
475
522
  </tr>
@@ -87,11 +87,21 @@ Pull requests are welcome. However, please open an issue first to discuss what y
87
87
  <td>✅</td>
88
88
  <td>✅</td>
89
89
  </tr>
90
+ <tr>
91
+ <td>CrateDB</td>
92
+ <td>✅</td>
93
+ <td>❌</td>
94
+ </tr>
90
95
  <tr>
91
96
  <td>Databricks</td>
92
97
  <td>✅</td>
93
98
  <td>✅</td>
94
99
  </tr>
100
+ <tr>
101
+ <td>IBM Db2</td>
102
+ <td>✅</td>
103
+ <td>-</td>
104
+ </tr>
95
105
  <tr>
96
106
  <td>DuckDB</td>
97
107
  <td>✅</td>
@@ -102,6 +112,16 @@ Pull requests are welcome. However, please open an issue first to discuss what y
102
112
  <td>✅</td>
103
113
  <td>-</td>
104
114
  </tr>
115
+ <tr>
116
+ <td>Elasticsearch</td>
117
+ <td>✅</td>
118
+ <td>-</td>
119
+ </tr>
120
+ <tr>
121
+ <td>GCP Spanner</td>
122
+ <td>✅</td>
123
+ <td>-</td>
124
+ </tr>
105
125
  <tr>
106
126
  <td>Local CSV file</td>
107
127
  <td>✅</td>
@@ -188,6 +208,11 @@ Pull requests are welcome. However, please open an issue first to discuss what y
188
208
  <td>✅</td>
189
209
  <td>-</td>
190
210
  </tr>
211
+ <tr>
212
+ <td>Attio</td>
213
+ <td>✅</td>
214
+ <td>-</td>
215
+ </tr>
191
216
  <tr>
192
217
  <td>Chess.com</td>
193
218
  <td>✅</td>
@@ -199,7 +224,7 @@ Pull requests are welcome. However, please open an issue first to discuss what y
199
224
  <td>-</td>
200
225
  </tr>
201
226
  <tr>
202
- <td>Github</td>
227
+ <td>GitHub</td>
203
228
  <td>✅</td>
204
229
  <td>-</td>
205
230
  </tr>
@@ -242,6 +267,16 @@ Pull requests are welcome. However, please open an issue first to discuss what y
242
267
  <td>Personio</td>
243
268
  <td>✅</td>
244
269
  <td>-</td>
270
+ </tr>
271
+ <tr>
272
+ <td>Phantombuster</td>
273
+ <td>✅</td>
274
+ <td>-</td>
275
+ </tr>
276
+ <tr>
277
+ <td>Pipedrive</td>
278
+ <td>✅</td>
279
+ <td>-</td>
245
280
  </tr>
246
281
  <tr>
247
282
  <td>S3</td>
@@ -264,7 +299,12 @@ Pull requests are welcome. However, please open an issue first to discuss what y
264
299
  <td>-</td>
265
300
  </tr>
266
301
  <tr>
267
- <td>Smartsheet</td>
302
+ <td>Smartsheets</td>
303
+ <td>✅</td>
304
+ <td>-</td>
305
+ </tr>
306
+ <tr>
307
+ <td>Solidgate</td>
268
308
  <td>✅</td>
269
309
  <td>-</td>
270
310
  </tr>
@@ -136,8 +136,9 @@ export default defineConfig({
136
136
  { text: "Personio", link: "/supported-sources/personio.md" },
137
137
  { text: "PhantomBuster", link: "/supported-sources/phantombuster.md" },
138
138
  { text: "Pipedrive", link: "/supported-sources/pipedrive.md" },
139
- { text: "S3", link: "/supported-sources/s3.md" },
139
+ { text: "S3", link: "/supported-sources/s3.md"},
140
140
  { text: "Salesforce", link: "/supported-sources/salesforce.md" },
141
+ { text: "SFTP", link: "/supported-sources/sftp.md"},
141
142
  { text: "Shopify", link: "/supported-sources/shopify.md" },
142
143
  { text: "Slack", link: "/supported-sources/slack.md" },
143
144
  { text: "Smartsheet", link: "/supported-sources/smartsheets.md" },
Binary file
@@ -0,0 +1,80 @@
1
+ # CrateDB
2
+
3
+ [CrateDB] is a distributed and scalable SQL database for storing and analyzing
4
+ massive amounts of data in near real-time, even with complex queries. It is
5
+ PostgreSQL-compatible, and based on Lucene.
6
+
7
+ ingestr supports CrateDB as a source database.
8
+
9
+ ## Source
10
+
11
+ For connecting to CrateDB as a database source, ingestr uses its SQLAlchemy
12
+ dialect package [sqlalchemy-cratedb].
13
+
14
+ ### URI format
15
+
16
+ The URI format for CrateDB as a source is as follows:
17
+ ```plaintext
18
+ crate://<username>:<password>@<host>:<port>?ssl=<ssl>
19
+ ```
20
+ > [!INFO]
21
+ > The driver does not require any option, and will default to
22
+ > `crate://crate@localhost:4200?ssl=false` when just using `crate://`.
23
+ >
24
+ > When connecting to CrateDB on localhost, use:
25
+ > ```plaintext
26
+ > crate://crate@localhost:4200?ssl=false
27
+ > ```
28
+ >
29
+ > When connecting to [CrateDB Cloud], the URI looks like this:
30
+ > ```plaintext
31
+ > crate://admin:<PASSWORD>@<CLUSTERNAME>.eks1.eu-west-1.aws.cratedb.net:4200?ssl=true
32
+ > ```
33
+
34
+ ### URI parameters
35
+ - `username` (required): The username is required to authenticate with the CrateDB server.
36
+ - `password` (required): The password is required to authenticate the provided username.
37
+ - `host` (required): The hostname or IP address of the CrateDB server where the database is hosted.
38
+ - `port` (required): The TCP port number used by the CrateDB server. Mostly `4200`.
39
+ - `ssl` (optional): Set to `true` for a secure HTTPS connection. By default, SSL is disabled (`false`).
40
+
41
+ ### Example
42
+
43
+ This is an example command that will copy the `sys.summits` table from CrateDB
44
+ to DuckDB, then display the content from DuckDB.
45
+
46
+ ```shell
47
+ ingestr ingest \
48
+ --source-uri 'crate://crate@localhost:4200/' \
49
+ --source-table 'sys.summits' \
50
+ --dest-uri 'duckdb:///cratedb.duckdb' \
51
+ --dest-table 'dest.summits'
52
+ ```
53
+ ```shell
54
+ duckdb cratedb.duckdb 'SELECT * FROM dest.summits LIMIT 5'
55
+ ```
56
+
57
+ <img alt="CrateDB_img" src="../media/cratedb-source.png" />
58
+
59
+
60
+ ## Appendix
61
+
62
+ To start a single-node instance of CrateDB for evaluation purposes,
63
+ use Docker or Podman.
64
+ ```shell
65
+ docker run --rm -it --name=cratedb \
66
+ --publish=4200:4200 --publish=5432:5432 \
67
+ --env=CRATE_HEAP_SIZE=2g crate/crate:nightly \
68
+ -Cdiscovery.type=single-node
69
+ ```
70
+
71
+ We are tracking development progress and incompatibilities at
72
+ [Support for ingestr/CrateDB] and ["tool: dlt/ingestr"]. Please join the discussion
73
+ or share relevant issue reports that help us improve interoperability. Thanks!
74
+
75
+
76
+ [CrateDB]: https://github.com/crate/crate
77
+ [CrateDB Cloud]: https://console.cratedb.cloud/
78
+ [sqlalchemy-cratedb]: https://pypi.org/project/sqlalchemy-cratedb/
79
+ [Support for ingestr/CrateDB]: https://github.com/crate/crate-clients-tools/issues/86
80
+ ["tool: dlt/ingestr"]: https://github.com/crate/crate/issues?q=state%3Aopen%20label%3A%22tool%3A%20dlt%2Fingestr%22
@@ -1,13 +1,13 @@
1
1
  # MySQL
2
2
  MySQL is an open source relational database management system, known for its speed and reliability.
3
3
 
4
- ingestr supports MySQL as a source.
4
+ ingestr supports MySQL as a source and a destination.
5
5
 
6
6
  ## URI format
7
7
  The URI format for MySQL is as follows:
8
8
 
9
9
  ```plaintext
10
- mysql://user:password@host:port/dbname
10
+ mysql://user:password@host:port/dbname
11
11
  ```
12
12
 
13
13
  URI parameters:
@@ -17,4 +17,4 @@ URI parameters:
17
17
  - `port`: the port number the database server is listening on, the default is 3306
18
18
  - `dbname`: the name of the database to connect to
19
19
 
20
- The same URI structure can be used both for sources and destinations. You can read more about SQLAlchemy's MySQL dialect [here](https://docs.sqlalchemy.org/en/20/core/engines.html#mysql).
20
+ The same URI structure and table can be used both for sources and destinations. You can read more about SQLAlchemy's MySQL dialect [here](https://docs.sqlalchemy.org/en/20/core/engines.html#mysql).
@@ -0,0 +1,43 @@
1
+ # SFTP
2
+
3
+ SFTP (SSH File Transfer Protocol) is a secure file transfer protocol that runs over the SSH protocol. It provides a secure way to transfer files between a local and a remote computer.
4
+
5
+ `ingestr` supports SFTP as a data source.
6
+
7
+ ## URI Format
8
+
9
+ The URI for connecting to an SFTP server is structured as follows:
10
+
11
+ ```plaintext
12
+ sftp://<username>:<password>@<host>:<port>
13
+ ```
14
+
15
+ ## URI Components:
16
+ - `username`: The username for the SFTP server.
17
+ - `password`: The password for the SFTP server.
18
+ - `host`: The hostname or IP address of the SFTP server.
19
+ - `port`: The port number of the SFTP server (defaults to 22 if not specified).
20
+
21
+ ## Setting up an SFTP Integration
22
+
23
+ To integrate `ingestr` with an SFTP server, you need the server's hostname, port, a valid username, and a password.
24
+
25
+ Once you have your credentials, you can load data to desired destaination.
26
+
27
+ ### Example: Loading data from SFTP TO DUCKDB
28
+
29
+ ```sh
30
+ ingestr ingest \
31
+ --source-uri 'sftp://myuser:MySecretPassword123@sftp.example.com' \
32
+ --source-table 'user.csv' \
33
+ --dest-uri duckdb:///sftp_data.duckdb \
34
+ --dest-table 'dest.users_deatils'
35
+ ```
36
+
37
+ <img alt="sftp" src="../media/sftp.png"/>
38
+
39
+
40
+ The `--source-table` specifies `/path/to/directory` The base directory on the server where `ingestr` should start looking for files.
41
+
42
+
43
+
@@ -0,0 +1 @@
1
+ version = "v0.13.53"
@@ -480,3 +480,21 @@ class SqliteDestination(GenericSqlDestination):
480
480
  "dataset_name": "main",
481
481
  "table_name": table,
482
482
  }
483
+
484
+
485
+ class MySqlDestination(GenericSqlDestination):
486
+ def dlt_dest(self, uri: str, **kwargs):
487
+ return dlt.destinations.sqlalchemy(credentials=uri)
488
+
489
+ def dlt_run_params(self, uri: str, table: str, **kwargs):
490
+ parsed = urlparse(uri)
491
+ database = parsed.path.lstrip("/")
492
+ if not database:
493
+ raise ValueError("You need to specify a database")
494
+ return {
495
+ "dataset_name": database,
496
+ "table_name": table,
497
+ }
498
+
499
+
500
+
@@ -11,6 +11,7 @@ from ingestr.src.destinations import (
11
11
  DatabricksDestination,
12
12
  DuckDBDestination,
13
13
  MsSQLDestination,
14
+ MySqlDestination,
14
15
  PostgresDestination,
15
16
  RedshiftDestination,
16
17
  S3Destination,
@@ -53,6 +54,7 @@ from ingestr.src.sources import (
53
54
  PipedriveSource,
54
55
  S3Source,
55
56
  SalesforceSource,
57
+ SFTPSource,
56
58
  ShopifySource,
57
59
  SlackSource,
58
60
  SmartsheetSource,
@@ -65,6 +67,7 @@ from ingestr.src.sources import (
65
67
 
66
68
  SQL_SOURCE_SCHEMES = [
67
69
  "bigquery",
70
+ "crate",
68
71
  "duckdb",
69
72
  "mssql",
70
73
  "mysql",
@@ -164,6 +167,7 @@ class SourceDestinationFactory:
164
167
  "attio": AttioSource,
165
168
  "solidgate": SolidgateSource,
166
169
  "smartsheet": SmartsheetSource,
170
+ "sftp": SFTPSource,
167
171
  }
168
172
  destinations: Dict[str, Type[DestinationProtocol]] = {
169
173
  "bigquery": BigQueryDestination,
@@ -184,6 +188,8 @@ class SourceDestinationFactory:
184
188
  "clickhouse": ClickhouseDestination,
185
189
  "s3": S3Destination,
186
190
  "sqlite": SqliteDestination,
191
+ "mysql": MySqlDestination,
192
+ "mysql+pymysql": MySqlDestination,
187
193
  }
188
194
 
189
195
  def __init__(self, source_uri: str, destination_uri: str):
@@ -18,6 +18,7 @@ from typing import (
18
18
  )
19
19
  from urllib.parse import ParseResult, parse_qs, quote, urlencode, urlparse
20
20
 
21
+ import fsspec # type: ignore
21
22
  import pendulum
22
23
  from dlt.common.time import ensure_pendulum_datetime
23
24
  from dlt.extract import Incremental
@@ -78,31 +79,7 @@ class SqlSource:
78
79
  # clickhouse://<username>:<password>@<host>:<port>?secure=<secure>
79
80
  if uri.startswith("clickhouse://"):
80
81
  parsed_uri = urlparse(uri)
81
-
82
- username = parsed_uri.username
83
- if not username:
84
- raise ValueError(
85
- "A username is required to connect to the ClickHouse database."
86
- )
87
-
88
- password = parsed_uri.password
89
- if not password:
90
- raise ValueError(
91
- "A password is required to authenticate with the ClickHouse database."
92
- )
93
-
94
- host = parsed_uri.hostname
95
- if not host:
96
- raise ValueError(
97
- "The hostname or IP address of the ClickHouse server is required to establish a connection."
98
- )
99
-
100
- port = parsed_uri.port
101
- if not port:
102
- raise ValueError(
103
- "The TCP port of the ClickHouse server is required to establish a connection."
104
- )
105
-
82
+
106
83
  query_params = parse_qs(parsed_uri.query)
107
84
 
108
85
  if "http_port" in query_params:
@@ -2506,3 +2483,56 @@ class SolidgateSource:
2506
2483
  ).with_resources(table_name)
2507
2484
  except ResourcesNotFoundError:
2508
2485
  raise UnsupportedResourceError(table_name, "Solidgate")
2486
+
2487
+
2488
+ class SFTPSource:
2489
+ def handles_incrementality(self) -> bool:
2490
+ return True
2491
+
2492
+ def dlt_source(self, uri: str, table: str, **kwargs):
2493
+ parsed_uri = urlparse(uri)
2494
+ host = parsed_uri.hostname
2495
+ if not host:
2496
+ raise MissingValueError("host", "SFTP URI")
2497
+ port = parsed_uri.port or 22
2498
+ username = parsed_uri.username
2499
+ password = parsed_uri.password
2500
+
2501
+ params: Dict[str, Any] = {
2502
+ "host": host,
2503
+ "port": port,
2504
+ "username": username,
2505
+ "password": password,
2506
+ "look_for_keys": False,
2507
+ "allow_agent": False,
2508
+ }
2509
+
2510
+ try:
2511
+ fs = fsspec.filesystem("sftp", **params)
2512
+ except Exception as e:
2513
+ raise ConnectionError(
2514
+ f"Failed to connect or authenticate to sftp server {host}:{port}. Error: {e}"
2515
+ )
2516
+ bucket_url = f"sftp://{host}:{port}"
2517
+
2518
+ if table.startswith("/"):
2519
+ file_glob = table
2520
+ else:
2521
+ file_glob = f"/{table}"
2522
+
2523
+ file_extension = table.split(".")[-1].lower()
2524
+ endpoint: str
2525
+ if file_extension == "csv":
2526
+ endpoint = "read_csv"
2527
+ elif file_extension == "jsonl":
2528
+ endpoint = "read_jsonl"
2529
+ elif file_extension == "parquet":
2530
+ endpoint = "read_parquet"
2531
+ else:
2532
+ raise ValueError(
2533
+ "FTPServer Source only supports specific file formats: csv, jsonl, parquet."
2534
+ )
2535
+ from ingestr.src.filesystem import readers
2536
+
2537
+ dlt_source_resource = readers(bucket_url, fs, file_glob)
2538
+ return dlt_source_resource.with_resources(endpoint)
@@ -25,6 +25,7 @@ rich==13.9.4
25
25
  rudder-sdk-python==2.1.4
26
26
  snowflake-sqlalchemy==1.6.1
27
27
  sqlalchemy-bigquery==1.12.1
28
+ sqlalchemy-cratedb==0.42.0.dev2
28
29
  sqlalchemy-hana==2.0.0
29
30
  sqlalchemy-redshift==0.8.14
30
31
  SQLAlchemy==1.4.52
@@ -53,3 +54,4 @@ elasticsearch==8.10.1
53
54
  sqlalchemy-spanner==1.11.0
54
55
  google-cloud-spanner==3.54.0
55
56
  smartsheet-python-sdk==3.0.5
57
+ paramiko==3.5.1