ingestr 0.13.39__tar.gz → 0.13.41__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 (275) hide show
  1. {ingestr-0.13.39 → ingestr-0.13.41}/PKG-INFO +8 -1
  2. {ingestr-0.13.39 → ingestr-0.13.41}/docs/.vitepress/config.mjs +2 -0
  3. ingestr-0.13.41/docs/media/ingestion_elasticsearch_img.png +0 -0
  4. ingestr-0.13.41/docs/media/spanner_ingestion.png +0 -0
  5. ingestr-0.13.41/docs/supported-sources/elasticsearch.md +35 -0
  6. ingestr-0.13.41/docs/supported-sources/spanner.md +41 -0
  7. ingestr-0.13.41/ingestr/src/buildinfo.py +1 -0
  8. ingestr-0.13.41/ingestr/src/elasticsearch/__init__.py +80 -0
  9. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/factory.py +3 -0
  10. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/sources.py +95 -1
  11. {ingestr-0.13.39 → ingestr-0.13.41}/requirements.in +4 -1
  12. {ingestr-0.13.39 → ingestr-0.13.41}/requirements.txt +31 -1
  13. {ingestr-0.13.39 → ingestr-0.13.41}/requirements_arm64.txt +31 -1
  14. ingestr-0.13.39/ingestr/src/buildinfo.py +0 -1
  15. {ingestr-0.13.39 → ingestr-0.13.41}/.dockerignore +0 -0
  16. {ingestr-0.13.39 → ingestr-0.13.41}/.githooks/pre-commit-hook.sh +0 -0
  17. {ingestr-0.13.39 → ingestr-0.13.41}/.github/workflows/deploy-docs.yml +0 -0
  18. {ingestr-0.13.39 → ingestr-0.13.41}/.github/workflows/release.yml +0 -0
  19. {ingestr-0.13.39 → ingestr-0.13.41}/.github/workflows/secrets-scan.yml +0 -0
  20. {ingestr-0.13.39 → ingestr-0.13.41}/.github/workflows/tests.yml +0 -0
  21. {ingestr-0.13.39 → ingestr-0.13.41}/.gitignore +0 -0
  22. {ingestr-0.13.39 → ingestr-0.13.41}/.gitleaksignore +0 -0
  23. {ingestr-0.13.39 → ingestr-0.13.41}/.python-version +0 -0
  24. {ingestr-0.13.39 → ingestr-0.13.41}/.vale.ini +0 -0
  25. {ingestr-0.13.39 → ingestr-0.13.41}/Dockerfile +0 -0
  26. {ingestr-0.13.39 → ingestr-0.13.41}/LICENSE.md +0 -0
  27. {ingestr-0.13.39 → ingestr-0.13.41}/Makefile +0 -0
  28. {ingestr-0.13.39 → ingestr-0.13.41}/README.md +0 -0
  29. {ingestr-0.13.39 → ingestr-0.13.41}/docs/.vitepress/theme/custom.css +0 -0
  30. {ingestr-0.13.39 → ingestr-0.13.41}/docs/.vitepress/theme/index.js +0 -0
  31. {ingestr-0.13.39 → ingestr-0.13.41}/docs/commands/example-uris.md +0 -0
  32. {ingestr-0.13.39 → ingestr-0.13.41}/docs/commands/ingest.md +0 -0
  33. {ingestr-0.13.39 → ingestr-0.13.41}/docs/getting-started/core-concepts.md +0 -0
  34. {ingestr-0.13.39 → ingestr-0.13.41}/docs/getting-started/incremental-loading.md +0 -0
  35. {ingestr-0.13.39 → ingestr-0.13.41}/docs/getting-started/quickstart.md +0 -0
  36. {ingestr-0.13.39 → ingestr-0.13.41}/docs/getting-started/telemetry.md +0 -0
  37. {ingestr-0.13.39 → ingestr-0.13.41}/docs/index.md +0 -0
  38. {ingestr-0.13.39 → ingestr-0.13.41}/docs/media/applovin_max.png +0 -0
  39. {ingestr-0.13.39 → ingestr-0.13.41}/docs/media/athena.png +0 -0
  40. {ingestr-0.13.39 → ingestr-0.13.41}/docs/media/clickhouse_img.png +0 -0
  41. {ingestr-0.13.39 → ingestr-0.13.41}/docs/media/freshdesk_ingestion.png +0 -0
  42. {ingestr-0.13.39 → ingestr-0.13.41}/docs/media/github.png +0 -0
  43. {ingestr-0.13.39 → ingestr-0.13.41}/docs/media/google_analytics_realtime_report.png +0 -0
  44. {ingestr-0.13.39 → ingestr-0.13.41}/docs/media/googleanalytics.png +0 -0
  45. {ingestr-0.13.39 → ingestr-0.13.41}/docs/media/kinesis.bigquery.png +0 -0
  46. {ingestr-0.13.39 → ingestr-0.13.41}/docs/media/linkedin_ads.png +0 -0
  47. {ingestr-0.13.39 → ingestr-0.13.41}/docs/media/personio.png +0 -0
  48. {ingestr-0.13.39 → ingestr-0.13.41}/docs/media/personio_duckdb.png +0 -0
  49. {ingestr-0.13.39 → ingestr-0.13.41}/docs/media/phantombuster.png +0 -0
  50. {ingestr-0.13.39 → ingestr-0.13.41}/docs/media/pipedrive.png +0 -0
  51. {ingestr-0.13.39 → ingestr-0.13.41}/docs/media/stripe_postgres.png +0 -0
  52. {ingestr-0.13.39 → ingestr-0.13.41}/docs/media/tiktok.png +0 -0
  53. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/adjust.md +0 -0
  54. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/airtable.md +0 -0
  55. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/applovin.md +0 -0
  56. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/applovin_max.md +0 -0
  57. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/appsflyer.md +0 -0
  58. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/appstore.md +0 -0
  59. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/asana.md +0 -0
  60. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/athena.md +0 -0
  61. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/bigquery.md +0 -0
  62. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/chess.md +0 -0
  63. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/clickhouse.md +0 -0
  64. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/csv.md +0 -0
  65. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/custom_queries.md +0 -0
  66. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/databricks.md +0 -0
  67. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/db2.md +0 -0
  68. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/duckdb.md +0 -0
  69. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/dynamodb.md +0 -0
  70. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/facebook-ads.md +0 -0
  71. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/frankfurter.md +0 -0
  72. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/freshdesk.md +0 -0
  73. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/gcs.md +0 -0
  74. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/github.md +0 -0
  75. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/google-ads.md +0 -0
  76. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/google_analytics.md +0 -0
  77. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/gorgias.md +0 -0
  78. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/gsheets.md +0 -0
  79. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/hubspot.md +0 -0
  80. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/kafka.md +0 -0
  81. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/kinesis.md +0 -0
  82. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/klaviyo.md +0 -0
  83. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/linkedin_ads.md +0 -0
  84. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/mongodb.md +0 -0
  85. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/mssql.md +0 -0
  86. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/mysql.md +0 -0
  87. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/notion.md +0 -0
  88. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/oracle.md +0 -0
  89. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/personio.md +0 -0
  90. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/phantombuster.md +0 -0
  91. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/pipedrive.md +0 -0
  92. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/postgres.md +0 -0
  93. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/redshift.md +0 -0
  94. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/s3.md +0 -0
  95. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/salesforce.md +0 -0
  96. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/sap-hana.md +0 -0
  97. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/shopify.md +0 -0
  98. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/slack.md +0 -0
  99. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/snowflake.md +0 -0
  100. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/sqlite.md +0 -0
  101. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/stripe.md +0 -0
  102. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/tiktok-ads.md +0 -0
  103. {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/zendesk.md +0 -0
  104. {ingestr-0.13.39 → ingestr-0.13.41}/docs/tutorials/load-kinesis-bigquery.md +0 -0
  105. {ingestr-0.13.39 → ingestr-0.13.41}/docs/tutorials/load-personio-duckdb.md +0 -0
  106. {ingestr-0.13.39 → ingestr-0.13.41}/docs/tutorials/load-stripe-postgres.md +0 -0
  107. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/conftest.py +0 -0
  108. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/main.py +0 -0
  109. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/.gitignore +0 -0
  110. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/adjust/__init__.py +0 -0
  111. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/adjust/adjust_helpers.py +0 -0
  112. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/airtable/__init__.py +0 -0
  113. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/applovin/__init__.py +0 -0
  114. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/applovin_max/__init__.py +0 -0
  115. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/appsflyer/__init__.py +0 -0
  116. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/appsflyer/client.py +0 -0
  117. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/appstore/__init__.py +0 -0
  118. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/appstore/client.py +0 -0
  119. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/appstore/errors.py +0 -0
  120. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/appstore/models.py +0 -0
  121. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/appstore/resources.py +0 -0
  122. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/arrow/__init__.py +0 -0
  123. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/asana_source/__init__.py +0 -0
  124. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/asana_source/helpers.py +0 -0
  125. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/asana_source/settings.py +0 -0
  126. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/blob.py +0 -0
  127. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/chess/__init__.py +0 -0
  128. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/chess/helpers.py +0 -0
  129. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/chess/settings.py +0 -0
  130. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/collector/spinner.py +0 -0
  131. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/destinations.py +0 -0
  132. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/dynamodb/__init__.py +0 -0
  133. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/errors.py +0 -0
  134. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/facebook_ads/__init__.py +0 -0
  135. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/facebook_ads/exceptions.py +0 -0
  136. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/facebook_ads/helpers.py +0 -0
  137. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/facebook_ads/settings.py +0 -0
  138. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/filesystem/__init__.py +0 -0
  139. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/filesystem/helpers.py +0 -0
  140. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/filesystem/readers.py +0 -0
  141. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/filters.py +0 -0
  142. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/frankfurter/__init__.py +0 -0
  143. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/frankfurter/helpers.py +0 -0
  144. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/freshdesk/__init__.py +0 -0
  145. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/freshdesk/freshdesk_client.py +0 -0
  146. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/freshdesk/settings.py +0 -0
  147. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/github/__init__.py +0 -0
  148. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/github/helpers.py +0 -0
  149. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/github/queries.py +0 -0
  150. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/github/settings.py +0 -0
  151. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/google_ads/__init__.py +0 -0
  152. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/google_ads/field.py +0 -0
  153. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/google_ads/metrics.py +0 -0
  154. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/google_ads/predicates.py +0 -0
  155. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/google_ads/reports.py +0 -0
  156. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/google_analytics/__init__.py +0 -0
  157. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/google_analytics/helpers.py +0 -0
  158. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/google_sheets/README.md +0 -0
  159. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/google_sheets/__init__.py +0 -0
  160. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
  161. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
  162. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
  163. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/gorgias/__init__.py +0 -0
  164. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/gorgias/helpers.py +0 -0
  165. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/hubspot/__init__.py +0 -0
  166. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/hubspot/helpers.py +0 -0
  167. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/hubspot/settings.py +0 -0
  168. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/kafka/__init__.py +0 -0
  169. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/kafka/helpers.py +0 -0
  170. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/kinesis/__init__.py +0 -0
  171. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/kinesis/helpers.py +0 -0
  172. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/klaviyo/__init__.py +0 -0
  173. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/klaviyo/client.py +0 -0
  174. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/klaviyo/helpers.py +0 -0
  175. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/linkedin_ads/__init__.py +0 -0
  176. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
  177. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/linkedin_ads/helpers.py +0 -0
  178. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/loader.py +0 -0
  179. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/mongodb/__init__.py +0 -0
  180. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/mongodb/helpers.py +0 -0
  181. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/notion/__init__.py +0 -0
  182. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/notion/helpers/__init__.py +0 -0
  183. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/notion/helpers/client.py +0 -0
  184. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/notion/helpers/database.py +0 -0
  185. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/notion/settings.py +0 -0
  186. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/partition.py +0 -0
  187. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/personio/__init__.py +0 -0
  188. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/personio/helpers.py +0 -0
  189. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/phantombuster/__init__.py +0 -0
  190. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/phantombuster/client.py +0 -0
  191. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/pipedrive/__init__.py +0 -0
  192. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/pipedrive/helpers/__init__.py +0 -0
  193. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/pipedrive/helpers/custom_fields_munger.py +0 -0
  194. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/pipedrive/helpers/pages.py +0 -0
  195. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/pipedrive/settings.py +0 -0
  196. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/pipedrive/typing.py +0 -0
  197. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/resource.py +0 -0
  198. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/salesforce/__init__.py +0 -0
  199. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/salesforce/helpers.py +0 -0
  200. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/shopify/__init__.py +0 -0
  201. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/shopify/exceptions.py +0 -0
  202. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/shopify/helpers.py +0 -0
  203. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/shopify/settings.py +0 -0
  204. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/slack/__init__.py +0 -0
  205. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/slack/helpers.py +0 -0
  206. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/slack/settings.py +0 -0
  207. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/sql_database/__init__.py +0 -0
  208. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/sql_database/callbacks.py +0 -0
  209. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/stripe_analytics/__init__.py +0 -0
  210. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/stripe_analytics/helpers.py +0 -0
  211. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/stripe_analytics/settings.py +0 -0
  212. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/table_definition.py +0 -0
  213. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/telemetry/event.py +0 -0
  214. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/testdata/fakebqcredentials.json +0 -0
  215. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/tiktok_ads/__init__.py +0 -0
  216. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -0
  217. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/time.py +0 -0
  218. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/version.py +0 -0
  219. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/zendesk/__init__.py +0 -0
  220. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/zendesk/helpers/__init__.py +0 -0
  221. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
  222. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/zendesk/helpers/credentials.py +0 -0
  223. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
  224. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/zendesk/settings.py +0 -0
  225. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/testdata/.gitignore +0 -0
  226. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/testdata/create_replace.csv +0 -0
  227. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/testdata/delete_insert_expected.csv +0 -0
  228. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/testdata/delete_insert_part1.csv +0 -0
  229. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/testdata/delete_insert_part2.csv +0 -0
  230. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/testdata/merge_expected.csv +0 -0
  231. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/testdata/merge_part1.csv +0 -0
  232. {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/testdata/merge_part2.csv +0 -0
  233. {ingestr-0.13.39 → ingestr-0.13.41}/package-lock.json +0 -0
  234. {ingestr-0.13.39 → ingestr-0.13.41}/package.json +0 -0
  235. {ingestr-0.13.39 → ingestr-0.13.41}/pyproject.toml +0 -0
  236. {ingestr-0.13.39 → ingestr-0.13.41}/requirements-dev.txt +0 -0
  237. {ingestr-0.13.39 → ingestr-0.13.41}/resources/demo.gif +0 -0
  238. {ingestr-0.13.39 → ingestr-0.13.41}/resources/demo.tape +0 -0
  239. {ingestr-0.13.39 → ingestr-0.13.41}/resources/ingestr.svg +0 -0
  240. {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/AMPM.yml +0 -0
  241. {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Acronyms.yml +0 -0
  242. {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Colons.yml +0 -0
  243. {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Contractions.yml +0 -0
  244. {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/DateFormat.yml +0 -0
  245. {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Ellipses.yml +0 -0
  246. {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/EmDash.yml +0 -0
  247. {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Exclamation.yml +0 -0
  248. {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/FirstPerson.yml +0 -0
  249. {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Gender.yml +0 -0
  250. {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/GenderBias.yml +0 -0
  251. {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/HeadingPunctuation.yml +0 -0
  252. {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Headings.yml +0 -0
  253. {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Latin.yml +0 -0
  254. {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/LyHyphens.yml +0 -0
  255. {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/OptionalPlurals.yml +0 -0
  256. {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Ordinal.yml +0 -0
  257. {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/OxfordComma.yml +0 -0
  258. {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Parens.yml +0 -0
  259. {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Passive.yml +0 -0
  260. {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Periods.yml +0 -0
  261. {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Quotes.yml +0 -0
  262. {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Ranges.yml +0 -0
  263. {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Semicolons.yml +0 -0
  264. {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Slang.yml +0 -0
  265. {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Spacing.yml +0 -0
  266. {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Spelling.yml +0 -0
  267. {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Units.yml +0 -0
  268. {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/We.yml +0 -0
  269. {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Will.yml +0 -0
  270. {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/WordList.yml +0 -0
  271. {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/meta.json +0 -0
  272. {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/vocab.txt +0 -0
  273. {ingestr-0.13.39 → ingestr-0.13.41}/styles/bruin/Ingestr.yml +0 -0
  274. {ingestr-0.13.39 → ingestr-0.13.41}/styles/config/vocabularies/bruin/accept.txt +0 -0
  275. {ingestr-0.13.39 → ingestr-0.13.41}/test.env.template +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ingestr
3
- Version: 0.13.39
3
+ Version: 0.13.41
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
@@ -50,6 +50,8 @@ Requires-Dist: dlt==1.10.0
50
50
  Requires-Dist: dnspython==2.7.0
51
51
  Requires-Dist: duckdb-engine==0.17.0
52
52
  Requires-Dist: duckdb==1.2.1
53
+ Requires-Dist: elastic-transport==8.17.1
54
+ Requires-Dist: elasticsearch==8.10.1
53
55
  Requires-Dist: et-xmlfile==2.0.0
54
56
  Requires-Dist: facebook-business==20.0.0
55
57
  Requires-Dist: filelock==3.17.0
@@ -70,11 +72,14 @@ Requires-Dist: google-auth==2.38.0
70
72
  Requires-Dist: google-cloud-bigquery-storage==2.24.0
71
73
  Requires-Dist: google-cloud-bigquery==3.30.0
72
74
  Requires-Dist: google-cloud-core==2.4.2
75
+ Requires-Dist: google-cloud-spanner==3.54.0
73
76
  Requires-Dist: google-cloud-storage==3.1.0
74
77
  Requires-Dist: google-crc32c==1.6.0
75
78
  Requires-Dist: google-resumable-media==2.7.2
76
79
  Requires-Dist: googleapis-common-protos==1.69.0
77
80
  Requires-Dist: greenlet==3.2.2
81
+ Requires-Dist: grpc-google-iam-v1==0.14.2
82
+ Requires-Dist: grpc-interceptor==0.15.4
78
83
  Requires-Dist: grpcio-status==1.62.3
79
84
  Requires-Dist: grpcio==1.70.0
80
85
  Requires-Dist: hdbcli==2.23.27
@@ -166,9 +171,11 @@ Requires-Dist: soupsieve==2.6
166
171
  Requires-Dist: sqlalchemy-bigquery==1.12.1
167
172
  Requires-Dist: sqlalchemy-hana==2.0.0
168
173
  Requires-Dist: sqlalchemy-redshift==0.8.14
174
+ Requires-Dist: sqlalchemy-spanner==1.11.0
169
175
  Requires-Dist: sqlalchemy2-stubs==0.0.2a38
170
176
  Requires-Dist: sqlalchemy==1.4.52
171
177
  Requires-Dist: sqlglot==26.12.1
178
+ Requires-Dist: sqlparse==0.5.3
172
179
  Requires-Dist: stripe==10.7.0
173
180
  Requires-Dist: tenacity==9.0.0
174
181
  Requires-Dist: thrift==0.16.0
@@ -74,6 +74,7 @@ export default defineConfig({
74
74
  { text: "Databricks", link: "/supported-sources/databricks.md" },
75
75
  { text: "DuckDB", link: "/supported-sources/duckdb.md" },
76
76
  { text: "DynamoDB", link: "/supported-sources/dynamodb.md" },
77
+ { text: "Elasticsearch", link: "/supported-sources/elasticsearch.md" },
77
78
  {
78
79
  text: "Google BigQuery",
79
80
  link: "/supported-sources/bigquery.md",
@@ -137,6 +138,7 @@ export default defineConfig({
137
138
  { text: "Salesforce", link: "/supported-sources/salesforce.md" },
138
139
  { text: "Shopify", link: "/supported-sources/shopify.md" },
139
140
  { text: "Slack", link: "/supported-sources/slack.md" },
141
+ { text: "Spanner", link: "/supported-sources/spanner.md" },
140
142
  { text: "Stripe", link: "/supported-sources/stripe.md" },
141
143
  { text: "TikTok Ads", link: "/supported-sources/tiktok-ads.md" },
142
144
  { text: "Zendesk", link: "/supported-sources/zendesk.md" },
@@ -0,0 +1,35 @@
1
+ # Elasticsearch
2
+ [Elasticsearch](https://www.elastic.co/elasticsearch) is a distributed, RESTful search and analytics engine designed for fast and scalable data retrieval.
3
+
4
+ ingestr supports Elasticsearch as a source.
5
+
6
+ ## URI format
7
+ The URI format for Elasticsearch is as follows:
8
+
9
+ ```plaintext
10
+ elasticsearch://username:password@host:port?secure=<secure>&verify_certs=<verify_certs>
11
+ ```
12
+
13
+ URI parameters:
14
+ - `username`: The username used to authenticate with Elasticsearch.
15
+ - `password`: The password associated with the specified username.
16
+ - `host`: The host address of the Elasticsearch server.
17
+ - `port`: The port number used by the Elasticsearch server.
18
+ - `secure`: Enables HTTPS when set to true. By default, it is true.
19
+ - `verify_certs`: Verifies TLS certificates when set to true. By default, it is true.
20
+
21
+ Source Table
22
+
23
+ `<index-name>`: Fetches all available documents from the specified index.
24
+
25
+ ```ingestr ingest \
26
+ --source-uri "elasticsearch://elastic:changeme@localhost:9200?secure=false&verify_certs=false" \
27
+ --source-table 'test-index' \
28
+ --dest-uri "duckdb:///users.duckdb" \
29
+ --dest-table 'dest.users_detail'
30
+ ```
31
+
32
+ This command retrieves all documents from the test-index in Elasticsearch and copy them to the dest.users_detail table in DuckDB.
33
+
34
+ <img alt="ingestion_elasticsearch_img" src="../media/ingestion_elasticsearch_img.png" />
35
+
@@ -0,0 +1,41 @@
1
+ # Spanner
2
+ [Spanner](https://cloud.google.com/spanner) is a fully managed, scalable, and strongly consistent database service.
3
+
4
+ ingestr supports Spanner as a source.
5
+
6
+ ## URI format
7
+ The URI format for Spanner is as follows:
8
+
9
+
10
+ ```plaintext
11
+ spanner://?project_id=<project_id>&instance_id=<instance_id>&database=<database>&credentials_path=</path/to/service/account.json>
12
+ ```
13
+ or
14
+ ```plaintext
15
+ spanner://?project_id=<project_id>&instance_id=<instance_id>&database=<database>&credentials_base64=<base64_encoded_credentials>
16
+ ```
17
+
18
+ URI parameters:
19
+ - `project_id`: Your Google Cloud project ID (e.g., "my-project-123")
20
+ - `instance_id`: The Spanner instance ID (e.g., "my-instance")
21
+ - `database`: The database name (e.g., "my-database")
22
+ - `credentials_path`: Path to your Google Cloud service account JSON file
23
+ - `credentials_base64`: Base64-encoded service account credentials (alternative to credentials_path)
24
+
25
+ Let's say we have the above credentials. Here's a sample command that will copy the data from Spanner (GoogleSQL) to DuckDB.
26
+
27
+ ```sh
28
+ ingestr ingest \
29
+ --source-uri 'spanner://?project_id=id_123&instance_id=instance_123&database=db_123&credentials_path=./service_account.json' \
30
+ --source-table 'users' \
31
+ --dest-uri duckdb:///spanner.duckdb \
32
+ --dest-table 'dest.output'
33
+
34
+ ```
35
+
36
+ <img alt="pipedrive_img" src="../media/spanner_ingestion.png"/>
37
+
38
+ > [!NOTE]
39
+ > Currently, only GoogleSQL databases are supported.
40
+
41
+
@@ -0,0 +1 @@
1
+ version = "v0.13.41"
@@ -0,0 +1,80 @@
1
+ from datetime import date, datetime
2
+ from typing import Any, Optional
3
+
4
+ import dlt
5
+ import pendulum
6
+ from dlt.common.time import ensure_pendulum_datetime
7
+ from pendulum import parse
8
+
9
+ from elasticsearch import Elasticsearch
10
+
11
+
12
+ @dlt.source
13
+ def elasticsearch_source(
14
+ connection_url: str,
15
+ index: str,
16
+ verify_certs: bool,
17
+ incremental: Optional[dlt.sources.incremental] = None,
18
+ ):
19
+ client = Elasticsearch(connection_url, verify_certs=verify_certs)
20
+
21
+ @dlt.resource(
22
+ name=index, primary_key="id", write_disposition="merge", incremental=incremental
23
+ )
24
+ def get_documents(incremental=incremental):
25
+ body = {"query": {"match_all": {}}}
26
+
27
+ if incremental:
28
+ start_value = incremental.last_value
29
+ range_filter = {"gte": start_value}
30
+ if incremental.end_value is not None:
31
+ range_filter["lt"] = incremental.end_value
32
+ body = {"query": {"range": {incremental.cursor_path: range_filter}}}
33
+
34
+ page = client.search(index=index, scroll="5m", size=5, body=body)
35
+
36
+ sid = page["_scroll_id"]
37
+ hits = page["hits"]["hits"]
38
+
39
+ if not hits:
40
+ return
41
+
42
+ # fetching first page (via .search)
43
+ for doc in hits:
44
+ doc_data = {"id": doc["_id"], **doc["_source"]}
45
+ if incremental:
46
+ doc_data[incremental.cursor_path] = convert_elasticsearch_objs(
47
+ doc_data[incremental.cursor_path]
48
+ )
49
+ yield doc_data
50
+
51
+ while True:
52
+ # fetching page 2 and other pages (via .scroll)
53
+ page = client.scroll(scroll_id=sid, scroll="5m")
54
+ sid = page["_scroll_id"]
55
+ hits = page["hits"]["hits"]
56
+ if not hits:
57
+ break
58
+ for doc in hits:
59
+ doc_data = {"id": doc["_id"], **doc["_source"]}
60
+ if incremental:
61
+ doc_data[incremental.cursor_path] = convert_elasticsearch_objs(
62
+ doc_data[incremental.cursor_path]
63
+ )
64
+ yield doc_data
65
+
66
+ client.clear_scroll(scroll_id=sid)
67
+
68
+ return get_documents
69
+
70
+
71
+ def convert_elasticsearch_objs(value: Any) -> Any:
72
+ if isinstance(value, str):
73
+ parsed_date = parse(value, strict=False)
74
+ if parsed_date is not None:
75
+ if isinstance(
76
+ parsed_date,
77
+ (pendulum.DateTime, pendulum.Date, datetime, date, str, float, int),
78
+ ):
79
+ return ensure_pendulum_datetime(parsed_date)
80
+ return value
@@ -28,6 +28,7 @@ from ingestr.src.sources import (
28
28
  AsanaSource,
29
29
  ChessSource,
30
30
  DynamoDBSource,
31
+ ElasticsearchSource,
31
32
  FacebookAdsSource,
32
33
  FrankfurterSource,
33
34
  FreshdeskSource,
@@ -78,6 +79,7 @@ SQL_SOURCE_SCHEMES = [
78
79
  "clickhouse",
79
80
  "databricks",
80
81
  "db2",
82
+ "spanner",
81
83
  ]
82
84
 
83
85
 
@@ -153,6 +155,7 @@ class SourceDestinationFactory:
153
155
  "frankfurter": FrankfurterSource,
154
156
  "freshdesk": FreshdeskSource,
155
157
  "phantombuster": PhantombusterSource,
158
+ "elasticsearch": ElasticsearchSource,
156
159
  }
157
160
  destinations: Dict[str, Type[DestinationProtocol]] = {
158
161
  "bigquery": BigQueryDestination,
@@ -52,7 +52,10 @@ class SqlSource:
52
52
  def dlt_source(self, uri: str, table: str, **kwargs):
53
53
  table_fields = TableDefinition(dataset="custom", table="custom")
54
54
  if not table.startswith("query:"):
55
- table_fields = table_string_to_dataclass(table)
55
+ if uri.startswith("spanner://"):
56
+ table_fields = TableDefinition(dataset="", table=table)
57
+ else:
58
+ table_fields = table_string_to_dataclass(table)
56
59
 
57
60
  incremental = None
58
61
  if kwargs.get("incremental_key"):
@@ -113,6 +116,45 @@ class SqlSource:
113
116
  if uri.startswith("db2://"):
114
117
  uri = uri.replace("db2://", "db2+ibm_db://")
115
118
 
119
+ if uri.startswith("spanner://"):
120
+ parsed_uri = urlparse(uri)
121
+ query_params = parse_qs(parsed_uri.query)
122
+
123
+ project_id_param = query_params.get("project_id")
124
+ instance_id_param = query_params.get("instance_id")
125
+ database_param = query_params.get("database")
126
+
127
+ cred_path = query_params.get("credentials_path")
128
+ cred_base64 = query_params.get("credentials_base64")
129
+
130
+ if not project_id_param or not instance_id_param or not database_param:
131
+ raise ValueError(
132
+ "project_id, instance_id and database are required in the URI to get data from Google Spanner"
133
+ )
134
+
135
+ project_id = project_id_param[0]
136
+ instance_id = instance_id_param[0]
137
+ database = database_param[0]
138
+
139
+ if not cred_path and not cred_base64:
140
+ raise ValueError(
141
+ "credentials_path or credentials_base64 is required in the URI to get data from Google Sheets"
142
+ )
143
+ if cred_path:
144
+ os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = cred_path[0]
145
+ elif cred_base64:
146
+ credentials = json.loads(
147
+ base64.b64decode(cred_base64[0]).decode("utf-8")
148
+ )
149
+ temp = tempfile.NamedTemporaryFile(
150
+ mode="w", delete=False, suffix=".json"
151
+ )
152
+ json.dump(credentials, temp)
153
+ temp.close()
154
+ os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = temp.name
155
+
156
+ uri = f"spanner+spanner:///projects/{project_id}/instances/{instance_id}/databases/{database}"
157
+
116
158
  from dlt.common.libs.sql_alchemy import (
117
159
  Engine,
118
160
  MetaData,
@@ -2298,3 +2340,55 @@ class PhantombusterSource:
2298
2340
  start_date=start_date,
2299
2341
  end_date=end_date,
2300
2342
  ).with_resources(table_name)
2343
+
2344
+
2345
+ class ElasticsearchSource:
2346
+ def handles_incrementality(self) -> bool:
2347
+ return False
2348
+
2349
+ def dlt_source(self, uri: str, table: str, **kwargs):
2350
+ from ingestr.src.elasticsearch import elasticsearch_source
2351
+
2352
+ incremental = None
2353
+ if kwargs.get("incremental_key"):
2354
+ start_value = kwargs.get("interval_start")
2355
+ end_value = kwargs.get("interval_end")
2356
+
2357
+ incremental = dlt_incremental(
2358
+ kwargs.get("incremental_key", ""),
2359
+ initial_value=start_value,
2360
+ end_value=end_value,
2361
+ range_end="closed",
2362
+ range_start="closed",
2363
+ )
2364
+
2365
+ # elasticsearch://localhost:9200?secure=true&verify_certs=false
2366
+ parsed = urlparse(uri)
2367
+
2368
+ index = table
2369
+ if not index:
2370
+ raise ValueError(
2371
+ "Table name must be provided which is the index name in elasticsearch"
2372
+ )
2373
+
2374
+ query_params = parsed.query
2375
+ params = parse_qs(query_params)
2376
+
2377
+ secure = True
2378
+ if "secure" in params:
2379
+ secure = params["secure"][0].capitalize() == "True"
2380
+
2381
+ verify_certs = True
2382
+ if "verify_certs" in params:
2383
+ verify_certs = params["verify_certs"][0].capitalize() == "True"
2384
+
2385
+ scheme = "https" if secure else "http"
2386
+ netloc = parsed.netloc
2387
+ connection_url = f"{scheme}://{netloc}"
2388
+
2389
+ return elasticsearch_source(
2390
+ connection_url=connection_url,
2391
+ index=index,
2392
+ verify_certs=verify_certs,
2393
+ incremental=incremental,
2394
+ ).with_resources(table)
@@ -48,4 +48,7 @@ clickhouse-sqlalchemy==0.2.7
48
48
  zstd==1.5.6.5
49
49
  ibm-db==3.2.6; platform_machine != "aarch64"
50
50
  ibm-db-sa==0.4.1; platform_machine != "aarch64"
51
- aiohttp>=3.11.15
51
+ aiohttp>=3.11.15
52
+ elasticsearch==8.10.1
53
+ sqlalchemy-spanner==1.11.0
54
+ google-cloud-spanner==3.54.0
@@ -16,7 +16,9 @@ aioitertools==0.12.0
16
16
  aiosignal==1.3.2
17
17
  # via aiohttp
18
18
  alembic==1.15.1
19
- # via databricks-sql-connector
19
+ # via
20
+ # databricks-sql-connector
21
+ # sqlalchemy-spanner
20
22
  annotated-types==0.7.0
21
23
  # via pydantic
22
24
  asana==3.2.3
@@ -51,6 +53,7 @@ cachetools==5.5.2
51
53
  certifi==2025.1.31
52
54
  # via
53
55
  # clickhouse-connect
56
+ # elastic-transport
54
57
  # requests
55
58
  # snowflake-connector-python
56
59
  cffi==1.17.1
@@ -104,6 +107,10 @@ duckdb==1.2.1
104
107
  # duckdb-engine
105
108
  duckdb-engine==0.17.0
106
109
  # via -r requirements.in
110
+ elastic-transport==8.17.1
111
+ # via elasticsearch
112
+ elasticsearch==8.10.1
113
+ # via -r requirements.in
107
114
  et-xmlfile==2.0.0
108
115
  # via openpyxl
109
116
  facebook-business==20.0.0
@@ -142,6 +149,7 @@ google-api-core==2.24.1
142
149
  # google-cloud-bigquery
143
150
  # google-cloud-bigquery-storage
144
151
  # google-cloud-core
152
+ # google-cloud-spanner
145
153
  # google-cloud-storage
146
154
  # sqlalchemy-bigquery
147
155
  google-api-python-client==2.130.0
@@ -171,7 +179,12 @@ google-cloud-bigquery-storage==2.24.0
171
179
  google-cloud-core==2.4.2
172
180
  # via
173
181
  # google-cloud-bigquery
182
+ # google-cloud-spanner
174
183
  # google-cloud-storage
184
+ google-cloud-spanner==3.54.0
185
+ # via
186
+ # -r requirements.in
187
+ # sqlalchemy-spanner
175
188
  google-cloud-storage==3.1.0
176
189
  # via gcsfs
177
190
  google-crc32c==1.6.0
@@ -186,13 +199,21 @@ googleapis-common-protos==1.69.0
186
199
  # via
187
200
  # google-ads
188
201
  # google-api-core
202
+ # grpc-google-iam-v1
189
203
  # grpcio-status
190
204
  greenlet==3.2.2
191
205
  # via sqlalchemy
206
+ grpc-google-iam-v1==0.14.2
207
+ # via google-cloud-spanner
208
+ grpc-interceptor==0.15.4
209
+ # via google-cloud-spanner
192
210
  grpcio==1.70.0
193
211
  # via
194
212
  # google-ads
195
213
  # google-api-core
214
+ # googleapis-common-protos
215
+ # grpc-google-iam-v1
216
+ # grpc-interceptor
196
217
  # grpcio-status
197
218
  grpcio-status==1.62.3
198
219
  # via
@@ -316,13 +337,16 @@ proto-plus==1.26.0
316
337
  # google-analytics-data
317
338
  # google-api-core
318
339
  # google-cloud-bigquery-storage
340
+ # google-cloud-spanner
319
341
  protobuf==4.25.6
320
342
  # via
321
343
  # google-ads
322
344
  # google-analytics-data
323
345
  # google-api-core
324
346
  # google-cloud-bigquery-storage
347
+ # google-cloud-spanner
325
348
  # googleapis-common-protos
349
+ # grpc-google-iam-v1
326
350
  # grpcio-status
327
351
  # proto-plus
328
352
  psutil==6.1.1
@@ -488,16 +512,21 @@ sqlalchemy==1.4.52
488
512
  # sqlalchemy-bigquery
489
513
  # sqlalchemy-hana
490
514
  # sqlalchemy-redshift
515
+ # sqlalchemy-spanner
491
516
  sqlalchemy-bigquery==1.12.1
492
517
  # via -r requirements.in
493
518
  sqlalchemy-hana==2.0.0
494
519
  # via -r requirements.in
495
520
  sqlalchemy-redshift==0.8.14
496
521
  # via -r requirements.in
522
+ sqlalchemy-spanner==1.11.0
523
+ # via -r requirements.in
497
524
  sqlalchemy2-stubs==0.0.2a38
498
525
  # via -r requirements.in
499
526
  sqlglot==26.12.1
500
527
  # via dlt
528
+ sqlparse==0.5.3
529
+ # via google-cloud-spanner
501
530
  stripe==10.7.0
502
531
  # via -r requirements.in
503
532
  tenacity==9.0.0
@@ -553,6 +582,7 @@ urllib3==2.3.0
553
582
  # botocore
554
583
  # clickhouse-connect
555
584
  # databricks-sql-connector
585
+ # elastic-transport
556
586
  # pyairtable
557
587
  # requests
558
588
  # types-requests
@@ -16,7 +16,9 @@ aioitertools==0.12.0
16
16
  aiosignal==1.3.2
17
17
  # via aiohttp
18
18
  alembic==1.15.2
19
- # via databricks-sql-connector
19
+ # via
20
+ # databricks-sql-connector
21
+ # sqlalchemy-spanner
20
22
  annotated-types==0.7.0
21
23
  # via pydantic
22
24
  asana==3.2.3
@@ -51,6 +53,7 @@ cachetools==5.5.2
51
53
  certifi==2025.1.31
52
54
  # via
53
55
  # clickhouse-connect
56
+ # elastic-transport
54
57
  # requests
55
58
  # snowflake-connector-python
56
59
  cffi==1.17.1
@@ -104,6 +107,10 @@ duckdb==1.2.1
104
107
  # duckdb-engine
105
108
  duckdb-engine==0.17.0
106
109
  # via -r requirements.in
110
+ elastic-transport==8.17.1
111
+ # via elasticsearch
112
+ elasticsearch==8.10.1
113
+ # via -r requirements.in
107
114
  et-xmlfile==2.0.0
108
115
  # via openpyxl
109
116
  facebook-business==20.0.0
@@ -142,6 +149,7 @@ google-api-core==2.24.2
142
149
  # google-cloud-bigquery
143
150
  # google-cloud-bigquery-storage
144
151
  # google-cloud-core
152
+ # google-cloud-spanner
145
153
  # google-cloud-storage
146
154
  # sqlalchemy-bigquery
147
155
  google-api-python-client==2.130.0
@@ -171,7 +179,12 @@ google-cloud-bigquery-storage==2.24.0
171
179
  google-cloud-core==2.4.3
172
180
  # via
173
181
  # google-cloud-bigquery
182
+ # google-cloud-spanner
174
183
  # google-cloud-storage
184
+ google-cloud-spanner==3.54.0
185
+ # via
186
+ # -r requirements.in
187
+ # sqlalchemy-spanner
175
188
  google-cloud-storage==3.1.0
176
189
  # via gcsfs
177
190
  google-crc32c==1.7.1
@@ -186,13 +199,21 @@ googleapis-common-protos==1.69.2
186
199
  # via
187
200
  # google-ads
188
201
  # google-api-core
202
+ # grpc-google-iam-v1
189
203
  # grpcio-status
190
204
  greenlet==3.1.1
191
205
  # via sqlalchemy
206
+ grpc-google-iam-v1==0.14.2
207
+ # via google-cloud-spanner
208
+ grpc-interceptor==0.15.4
209
+ # via google-cloud-spanner
192
210
  grpcio==1.71.0
193
211
  # via
194
212
  # google-ads
195
213
  # google-api-core
214
+ # googleapis-common-protos
215
+ # grpc-google-iam-v1
216
+ # grpc-interceptor
196
217
  # grpcio-status
197
218
  grpcio-status==1.62.3
198
219
  # via
@@ -310,13 +331,16 @@ proto-plus==1.26.1
310
331
  # google-analytics-data
311
332
  # google-api-core
312
333
  # google-cloud-bigquery-storage
334
+ # google-cloud-spanner
313
335
  protobuf==4.25.6
314
336
  # via
315
337
  # google-ads
316
338
  # google-analytics-data
317
339
  # google-api-core
318
340
  # google-cloud-bigquery-storage
341
+ # google-cloud-spanner
319
342
  # googleapis-common-protos
343
+ # grpc-google-iam-v1
320
344
  # grpcio-status
321
345
  # proto-plus
322
346
  psutil==6.1.1
@@ -481,16 +505,21 @@ sqlalchemy==1.4.52
481
505
  # sqlalchemy-bigquery
482
506
  # sqlalchemy-hana
483
507
  # sqlalchemy-redshift
508
+ # sqlalchemy-spanner
484
509
  sqlalchemy-bigquery==1.12.1
485
510
  # via -r requirements.in
486
511
  sqlalchemy-hana==2.0.0
487
512
  # via -r requirements.in
488
513
  sqlalchemy-redshift==0.8.14
489
514
  # via -r requirements.in
515
+ sqlalchemy-spanner==1.11.0
516
+ # via -r requirements.in
490
517
  sqlalchemy2-stubs==0.0.2a38
491
518
  # via -r requirements.in
492
519
  sqlglot==26.12.1
493
520
  # via dlt
521
+ sqlparse==0.5.3
522
+ # via google-cloud-spanner
494
523
  stripe==10.7.0
495
524
  # via -r requirements.in
496
525
  tenacity==9.0.0
@@ -549,6 +578,7 @@ urllib3==2.3.0
549
578
  # botocore
550
579
  # clickhouse-connect
551
580
  # databricks-sql-connector
581
+ # elastic-transport
552
582
  # pyairtable
553
583
  # requests
554
584
  # types-requests
@@ -1 +0,0 @@
1
- version = "v0.13.39"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes