ingestr 0.13.40__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.40 → ingestr-0.13.41}/PKG-INFO +6 -1
  2. {ingestr-0.13.40 → ingestr-0.13.41}/docs/.vitepress/config.mjs +1 -0
  3. ingestr-0.13.41/docs/media/spanner_ingestion.png +0 -0
  4. ingestr-0.13.41/docs/supported-sources/spanner.md +41 -0
  5. ingestr-0.13.41/ingestr/src/buildinfo.py +1 -0
  6. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/factory.py +1 -0
  7. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/sources.py +46 -2
  8. {ingestr-0.13.40 → ingestr-0.13.41}/requirements.in +2 -0
  9. {ingestr-0.13.40 → ingestr-0.13.41}/requirements.txt +25 -1
  10. {ingestr-0.13.40 → ingestr-0.13.41}/requirements_arm64.txt +25 -1
  11. ingestr-0.13.40/ingestr/src/buildinfo.py +0 -1
  12. {ingestr-0.13.40 → ingestr-0.13.41}/.dockerignore +0 -0
  13. {ingestr-0.13.40 → ingestr-0.13.41}/.githooks/pre-commit-hook.sh +0 -0
  14. {ingestr-0.13.40 → ingestr-0.13.41}/.github/workflows/deploy-docs.yml +0 -0
  15. {ingestr-0.13.40 → ingestr-0.13.41}/.github/workflows/release.yml +0 -0
  16. {ingestr-0.13.40 → ingestr-0.13.41}/.github/workflows/secrets-scan.yml +0 -0
  17. {ingestr-0.13.40 → ingestr-0.13.41}/.github/workflows/tests.yml +0 -0
  18. {ingestr-0.13.40 → ingestr-0.13.41}/.gitignore +0 -0
  19. {ingestr-0.13.40 → ingestr-0.13.41}/.gitleaksignore +0 -0
  20. {ingestr-0.13.40 → ingestr-0.13.41}/.python-version +0 -0
  21. {ingestr-0.13.40 → ingestr-0.13.41}/.vale.ini +0 -0
  22. {ingestr-0.13.40 → ingestr-0.13.41}/Dockerfile +0 -0
  23. {ingestr-0.13.40 → ingestr-0.13.41}/LICENSE.md +0 -0
  24. {ingestr-0.13.40 → ingestr-0.13.41}/Makefile +0 -0
  25. {ingestr-0.13.40 → ingestr-0.13.41}/README.md +0 -0
  26. {ingestr-0.13.40 → ingestr-0.13.41}/docs/.vitepress/theme/custom.css +0 -0
  27. {ingestr-0.13.40 → ingestr-0.13.41}/docs/.vitepress/theme/index.js +0 -0
  28. {ingestr-0.13.40 → ingestr-0.13.41}/docs/commands/example-uris.md +0 -0
  29. {ingestr-0.13.40 → ingestr-0.13.41}/docs/commands/ingest.md +0 -0
  30. {ingestr-0.13.40 → ingestr-0.13.41}/docs/getting-started/core-concepts.md +0 -0
  31. {ingestr-0.13.40 → ingestr-0.13.41}/docs/getting-started/incremental-loading.md +0 -0
  32. {ingestr-0.13.40 → ingestr-0.13.41}/docs/getting-started/quickstart.md +0 -0
  33. {ingestr-0.13.40 → ingestr-0.13.41}/docs/getting-started/telemetry.md +0 -0
  34. {ingestr-0.13.40 → ingestr-0.13.41}/docs/index.md +0 -0
  35. {ingestr-0.13.40 → ingestr-0.13.41}/docs/media/applovin_max.png +0 -0
  36. {ingestr-0.13.40 → ingestr-0.13.41}/docs/media/athena.png +0 -0
  37. {ingestr-0.13.40 → ingestr-0.13.41}/docs/media/clickhouse_img.png +0 -0
  38. {ingestr-0.13.40 → ingestr-0.13.41}/docs/media/freshdesk_ingestion.png +0 -0
  39. {ingestr-0.13.40 → ingestr-0.13.41}/docs/media/github.png +0 -0
  40. {ingestr-0.13.40 → ingestr-0.13.41}/docs/media/google_analytics_realtime_report.png +0 -0
  41. {ingestr-0.13.40 → ingestr-0.13.41}/docs/media/googleanalytics.png +0 -0
  42. {ingestr-0.13.40 → ingestr-0.13.41}/docs/media/ingestion_elasticsearch_img.png +0 -0
  43. {ingestr-0.13.40 → ingestr-0.13.41}/docs/media/kinesis.bigquery.png +0 -0
  44. {ingestr-0.13.40 → ingestr-0.13.41}/docs/media/linkedin_ads.png +0 -0
  45. {ingestr-0.13.40 → ingestr-0.13.41}/docs/media/personio.png +0 -0
  46. {ingestr-0.13.40 → ingestr-0.13.41}/docs/media/personio_duckdb.png +0 -0
  47. {ingestr-0.13.40 → ingestr-0.13.41}/docs/media/phantombuster.png +0 -0
  48. {ingestr-0.13.40 → ingestr-0.13.41}/docs/media/pipedrive.png +0 -0
  49. {ingestr-0.13.40 → ingestr-0.13.41}/docs/media/stripe_postgres.png +0 -0
  50. {ingestr-0.13.40 → ingestr-0.13.41}/docs/media/tiktok.png +0 -0
  51. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/adjust.md +0 -0
  52. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/airtable.md +0 -0
  53. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/applovin.md +0 -0
  54. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/applovin_max.md +0 -0
  55. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/appsflyer.md +0 -0
  56. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/appstore.md +0 -0
  57. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/asana.md +0 -0
  58. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/athena.md +0 -0
  59. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/bigquery.md +0 -0
  60. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/chess.md +0 -0
  61. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/clickhouse.md +0 -0
  62. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/csv.md +0 -0
  63. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/custom_queries.md +0 -0
  64. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/databricks.md +0 -0
  65. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/db2.md +0 -0
  66. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/duckdb.md +0 -0
  67. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/dynamodb.md +0 -0
  68. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/elasticsearch.md +0 -0
  69. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/facebook-ads.md +0 -0
  70. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/frankfurter.md +0 -0
  71. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/freshdesk.md +0 -0
  72. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/gcs.md +0 -0
  73. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/github.md +0 -0
  74. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/google-ads.md +0 -0
  75. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/google_analytics.md +0 -0
  76. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/gorgias.md +0 -0
  77. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/gsheets.md +0 -0
  78. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/hubspot.md +0 -0
  79. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/kafka.md +0 -0
  80. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/kinesis.md +0 -0
  81. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/klaviyo.md +0 -0
  82. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/linkedin_ads.md +0 -0
  83. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/mongodb.md +0 -0
  84. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/mssql.md +0 -0
  85. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/mysql.md +0 -0
  86. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/notion.md +0 -0
  87. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/oracle.md +0 -0
  88. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/personio.md +0 -0
  89. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/phantombuster.md +0 -0
  90. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/pipedrive.md +0 -0
  91. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/postgres.md +0 -0
  92. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/redshift.md +0 -0
  93. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/s3.md +0 -0
  94. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/salesforce.md +0 -0
  95. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/sap-hana.md +0 -0
  96. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/shopify.md +0 -0
  97. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/slack.md +0 -0
  98. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/snowflake.md +0 -0
  99. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/sqlite.md +0 -0
  100. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/stripe.md +0 -0
  101. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/tiktok-ads.md +0 -0
  102. {ingestr-0.13.40 → ingestr-0.13.41}/docs/supported-sources/zendesk.md +0 -0
  103. {ingestr-0.13.40 → ingestr-0.13.41}/docs/tutorials/load-kinesis-bigquery.md +0 -0
  104. {ingestr-0.13.40 → ingestr-0.13.41}/docs/tutorials/load-personio-duckdb.md +0 -0
  105. {ingestr-0.13.40 → ingestr-0.13.41}/docs/tutorials/load-stripe-postgres.md +0 -0
  106. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/conftest.py +0 -0
  107. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/main.py +0 -0
  108. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/.gitignore +0 -0
  109. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/adjust/__init__.py +0 -0
  110. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/adjust/adjust_helpers.py +0 -0
  111. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/airtable/__init__.py +0 -0
  112. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/applovin/__init__.py +0 -0
  113. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/applovin_max/__init__.py +0 -0
  114. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/appsflyer/__init__.py +0 -0
  115. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/appsflyer/client.py +0 -0
  116. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/appstore/__init__.py +0 -0
  117. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/appstore/client.py +0 -0
  118. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/appstore/errors.py +0 -0
  119. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/appstore/models.py +0 -0
  120. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/appstore/resources.py +0 -0
  121. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/arrow/__init__.py +0 -0
  122. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/asana_source/__init__.py +0 -0
  123. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/asana_source/helpers.py +0 -0
  124. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/asana_source/settings.py +0 -0
  125. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/blob.py +0 -0
  126. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/chess/__init__.py +0 -0
  127. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/chess/helpers.py +0 -0
  128. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/chess/settings.py +0 -0
  129. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/collector/spinner.py +0 -0
  130. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/destinations.py +0 -0
  131. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/dynamodb/__init__.py +0 -0
  132. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/elasticsearch/__init__.py +0 -0
  133. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/errors.py +0 -0
  134. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/facebook_ads/__init__.py +0 -0
  135. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/facebook_ads/exceptions.py +0 -0
  136. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/facebook_ads/helpers.py +0 -0
  137. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/facebook_ads/settings.py +0 -0
  138. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/filesystem/__init__.py +0 -0
  139. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/filesystem/helpers.py +0 -0
  140. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/filesystem/readers.py +0 -0
  141. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/filters.py +0 -0
  142. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/frankfurter/__init__.py +0 -0
  143. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/frankfurter/helpers.py +0 -0
  144. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/freshdesk/__init__.py +0 -0
  145. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/freshdesk/freshdesk_client.py +0 -0
  146. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/freshdesk/settings.py +0 -0
  147. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/github/__init__.py +0 -0
  148. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/github/helpers.py +0 -0
  149. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/github/queries.py +0 -0
  150. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/github/settings.py +0 -0
  151. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/google_ads/__init__.py +0 -0
  152. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/google_ads/field.py +0 -0
  153. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/google_ads/metrics.py +0 -0
  154. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/google_ads/predicates.py +0 -0
  155. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/google_ads/reports.py +0 -0
  156. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/google_analytics/__init__.py +0 -0
  157. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/google_analytics/helpers.py +0 -0
  158. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/google_sheets/README.md +0 -0
  159. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/google_sheets/__init__.py +0 -0
  160. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
  161. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
  162. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
  163. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/gorgias/__init__.py +0 -0
  164. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/gorgias/helpers.py +0 -0
  165. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/hubspot/__init__.py +0 -0
  166. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/hubspot/helpers.py +0 -0
  167. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/hubspot/settings.py +0 -0
  168. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/kafka/__init__.py +0 -0
  169. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/kafka/helpers.py +0 -0
  170. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/kinesis/__init__.py +0 -0
  171. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/kinesis/helpers.py +0 -0
  172. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/klaviyo/__init__.py +0 -0
  173. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/klaviyo/client.py +0 -0
  174. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/klaviyo/helpers.py +0 -0
  175. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/linkedin_ads/__init__.py +0 -0
  176. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
  177. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/linkedin_ads/helpers.py +0 -0
  178. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/loader.py +0 -0
  179. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/mongodb/__init__.py +0 -0
  180. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/mongodb/helpers.py +0 -0
  181. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/notion/__init__.py +0 -0
  182. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/notion/helpers/__init__.py +0 -0
  183. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/notion/helpers/client.py +0 -0
  184. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/notion/helpers/database.py +0 -0
  185. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/notion/settings.py +0 -0
  186. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/partition.py +0 -0
  187. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/personio/__init__.py +0 -0
  188. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/personio/helpers.py +0 -0
  189. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/phantombuster/__init__.py +0 -0
  190. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/phantombuster/client.py +0 -0
  191. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/pipedrive/__init__.py +0 -0
  192. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/pipedrive/helpers/__init__.py +0 -0
  193. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/pipedrive/helpers/custom_fields_munger.py +0 -0
  194. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/pipedrive/helpers/pages.py +0 -0
  195. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/pipedrive/settings.py +0 -0
  196. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/pipedrive/typing.py +0 -0
  197. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/resource.py +0 -0
  198. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/salesforce/__init__.py +0 -0
  199. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/salesforce/helpers.py +0 -0
  200. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/shopify/__init__.py +0 -0
  201. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/shopify/exceptions.py +0 -0
  202. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/shopify/helpers.py +0 -0
  203. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/shopify/settings.py +0 -0
  204. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/slack/__init__.py +0 -0
  205. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/slack/helpers.py +0 -0
  206. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/slack/settings.py +0 -0
  207. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/sql_database/__init__.py +0 -0
  208. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/sql_database/callbacks.py +0 -0
  209. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/stripe_analytics/__init__.py +0 -0
  210. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/stripe_analytics/helpers.py +0 -0
  211. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/stripe_analytics/settings.py +0 -0
  212. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/table_definition.py +0 -0
  213. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/telemetry/event.py +0 -0
  214. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/testdata/fakebqcredentials.json +0 -0
  215. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/tiktok_ads/__init__.py +0 -0
  216. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -0
  217. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/time.py +0 -0
  218. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/version.py +0 -0
  219. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/zendesk/__init__.py +0 -0
  220. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/zendesk/helpers/__init__.py +0 -0
  221. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
  222. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/zendesk/helpers/credentials.py +0 -0
  223. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
  224. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/src/zendesk/settings.py +0 -0
  225. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/testdata/.gitignore +0 -0
  226. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/testdata/create_replace.csv +0 -0
  227. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/testdata/delete_insert_expected.csv +0 -0
  228. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/testdata/delete_insert_part1.csv +0 -0
  229. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/testdata/delete_insert_part2.csv +0 -0
  230. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/testdata/merge_expected.csv +0 -0
  231. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/testdata/merge_part1.csv +0 -0
  232. {ingestr-0.13.40 → ingestr-0.13.41}/ingestr/testdata/merge_part2.csv +0 -0
  233. {ingestr-0.13.40 → ingestr-0.13.41}/package-lock.json +0 -0
  234. {ingestr-0.13.40 → ingestr-0.13.41}/package.json +0 -0
  235. {ingestr-0.13.40 → ingestr-0.13.41}/pyproject.toml +0 -0
  236. {ingestr-0.13.40 → ingestr-0.13.41}/requirements-dev.txt +0 -0
  237. {ingestr-0.13.40 → ingestr-0.13.41}/resources/demo.gif +0 -0
  238. {ingestr-0.13.40 → ingestr-0.13.41}/resources/demo.tape +0 -0
  239. {ingestr-0.13.40 → ingestr-0.13.41}/resources/ingestr.svg +0 -0
  240. {ingestr-0.13.40 → ingestr-0.13.41}/styles/Google/AMPM.yml +0 -0
  241. {ingestr-0.13.40 → ingestr-0.13.41}/styles/Google/Acronyms.yml +0 -0
  242. {ingestr-0.13.40 → ingestr-0.13.41}/styles/Google/Colons.yml +0 -0
  243. {ingestr-0.13.40 → ingestr-0.13.41}/styles/Google/Contractions.yml +0 -0
  244. {ingestr-0.13.40 → ingestr-0.13.41}/styles/Google/DateFormat.yml +0 -0
  245. {ingestr-0.13.40 → ingestr-0.13.41}/styles/Google/Ellipses.yml +0 -0
  246. {ingestr-0.13.40 → ingestr-0.13.41}/styles/Google/EmDash.yml +0 -0
  247. {ingestr-0.13.40 → ingestr-0.13.41}/styles/Google/Exclamation.yml +0 -0
  248. {ingestr-0.13.40 → ingestr-0.13.41}/styles/Google/FirstPerson.yml +0 -0
  249. {ingestr-0.13.40 → ingestr-0.13.41}/styles/Google/Gender.yml +0 -0
  250. {ingestr-0.13.40 → ingestr-0.13.41}/styles/Google/GenderBias.yml +0 -0
  251. {ingestr-0.13.40 → ingestr-0.13.41}/styles/Google/HeadingPunctuation.yml +0 -0
  252. {ingestr-0.13.40 → ingestr-0.13.41}/styles/Google/Headings.yml +0 -0
  253. {ingestr-0.13.40 → ingestr-0.13.41}/styles/Google/Latin.yml +0 -0
  254. {ingestr-0.13.40 → ingestr-0.13.41}/styles/Google/LyHyphens.yml +0 -0
  255. {ingestr-0.13.40 → ingestr-0.13.41}/styles/Google/OptionalPlurals.yml +0 -0
  256. {ingestr-0.13.40 → ingestr-0.13.41}/styles/Google/Ordinal.yml +0 -0
  257. {ingestr-0.13.40 → ingestr-0.13.41}/styles/Google/OxfordComma.yml +0 -0
  258. {ingestr-0.13.40 → ingestr-0.13.41}/styles/Google/Parens.yml +0 -0
  259. {ingestr-0.13.40 → ingestr-0.13.41}/styles/Google/Passive.yml +0 -0
  260. {ingestr-0.13.40 → ingestr-0.13.41}/styles/Google/Periods.yml +0 -0
  261. {ingestr-0.13.40 → ingestr-0.13.41}/styles/Google/Quotes.yml +0 -0
  262. {ingestr-0.13.40 → ingestr-0.13.41}/styles/Google/Ranges.yml +0 -0
  263. {ingestr-0.13.40 → ingestr-0.13.41}/styles/Google/Semicolons.yml +0 -0
  264. {ingestr-0.13.40 → ingestr-0.13.41}/styles/Google/Slang.yml +0 -0
  265. {ingestr-0.13.40 → ingestr-0.13.41}/styles/Google/Spacing.yml +0 -0
  266. {ingestr-0.13.40 → ingestr-0.13.41}/styles/Google/Spelling.yml +0 -0
  267. {ingestr-0.13.40 → ingestr-0.13.41}/styles/Google/Units.yml +0 -0
  268. {ingestr-0.13.40 → ingestr-0.13.41}/styles/Google/We.yml +0 -0
  269. {ingestr-0.13.40 → ingestr-0.13.41}/styles/Google/Will.yml +0 -0
  270. {ingestr-0.13.40 → ingestr-0.13.41}/styles/Google/WordList.yml +0 -0
  271. {ingestr-0.13.40 → ingestr-0.13.41}/styles/Google/meta.json +0 -0
  272. {ingestr-0.13.40 → ingestr-0.13.41}/styles/Google/vocab.txt +0 -0
  273. {ingestr-0.13.40 → ingestr-0.13.41}/styles/bruin/Ingestr.yml +0 -0
  274. {ingestr-0.13.40 → ingestr-0.13.41}/styles/config/vocabularies/bruin/accept.txt +0 -0
  275. {ingestr-0.13.40 → 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.40
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
@@ -72,11 +72,14 @@ Requires-Dist: google-auth==2.38.0
72
72
  Requires-Dist: google-cloud-bigquery-storage==2.24.0
73
73
  Requires-Dist: google-cloud-bigquery==3.30.0
74
74
  Requires-Dist: google-cloud-core==2.4.2
75
+ Requires-Dist: google-cloud-spanner==3.54.0
75
76
  Requires-Dist: google-cloud-storage==3.1.0
76
77
  Requires-Dist: google-crc32c==1.6.0
77
78
  Requires-Dist: google-resumable-media==2.7.2
78
79
  Requires-Dist: googleapis-common-protos==1.69.0
79
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
80
83
  Requires-Dist: grpcio-status==1.62.3
81
84
  Requires-Dist: grpcio==1.70.0
82
85
  Requires-Dist: hdbcli==2.23.27
@@ -168,9 +171,11 @@ Requires-Dist: soupsieve==2.6
168
171
  Requires-Dist: sqlalchemy-bigquery==1.12.1
169
172
  Requires-Dist: sqlalchemy-hana==2.0.0
170
173
  Requires-Dist: sqlalchemy-redshift==0.8.14
174
+ Requires-Dist: sqlalchemy-spanner==1.11.0
171
175
  Requires-Dist: sqlalchemy2-stubs==0.0.2a38
172
176
  Requires-Dist: sqlalchemy==1.4.52
173
177
  Requires-Dist: sqlglot==26.12.1
178
+ Requires-Dist: sqlparse==0.5.3
174
179
  Requires-Dist: stripe==10.7.0
175
180
  Requires-Dist: tenacity==9.0.0
176
181
  Requires-Dist: thrift==0.16.0
@@ -138,6 +138,7 @@ export default defineConfig({
138
138
  { text: "Salesforce", link: "/supported-sources/salesforce.md" },
139
139
  { text: "Shopify", link: "/supported-sources/shopify.md" },
140
140
  { text: "Slack", link: "/supported-sources/slack.md" },
141
+ { text: "Spanner", link: "/supported-sources/spanner.md" },
141
142
  { text: "Stripe", link: "/supported-sources/stripe.md" },
142
143
  { text: "TikTok Ads", link: "/supported-sources/tiktok-ads.md" },
143
144
  { text: "Zendesk", link: "/supported-sources/zendesk.md" },
@@ -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"
@@ -79,6 +79,7 @@ SQL_SOURCE_SCHEMES = [
79
79
  "clickhouse",
80
80
  "databricks",
81
81
  "db2",
82
+ "spanner",
82
83
  ]
83
84
 
84
85
 
@@ -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,
@@ -2325,7 +2367,9 @@ class ElasticsearchSource:
2325
2367
 
2326
2368
  index = table
2327
2369
  if not index:
2328
- raise ValueError("Table name must be provided which is the index name in elasticsearch")
2370
+ raise ValueError(
2371
+ "Table name must be provided which is the index name in elasticsearch"
2372
+ )
2329
2373
 
2330
2374
  query_params = parsed.query
2331
2375
  params = parse_qs(query_params)
@@ -50,3 +50,5 @@ ibm-db==3.2.6; platform_machine != "aarch64"
50
50
  ibm-db-sa==0.4.1; platform_machine != "aarch64"
51
51
  aiohttp>=3.11.15
52
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
@@ -147,6 +149,7 @@ google-api-core==2.24.1
147
149
  # google-cloud-bigquery
148
150
  # google-cloud-bigquery-storage
149
151
  # google-cloud-core
152
+ # google-cloud-spanner
150
153
  # google-cloud-storage
151
154
  # sqlalchemy-bigquery
152
155
  google-api-python-client==2.130.0
@@ -176,7 +179,12 @@ google-cloud-bigquery-storage==2.24.0
176
179
  google-cloud-core==2.4.2
177
180
  # via
178
181
  # google-cloud-bigquery
182
+ # google-cloud-spanner
179
183
  # google-cloud-storage
184
+ google-cloud-spanner==3.54.0
185
+ # via
186
+ # -r requirements.in
187
+ # sqlalchemy-spanner
180
188
  google-cloud-storage==3.1.0
181
189
  # via gcsfs
182
190
  google-crc32c==1.6.0
@@ -191,13 +199,21 @@ googleapis-common-protos==1.69.0
191
199
  # via
192
200
  # google-ads
193
201
  # google-api-core
202
+ # grpc-google-iam-v1
194
203
  # grpcio-status
195
204
  greenlet==3.2.2
196
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
197
210
  grpcio==1.70.0
198
211
  # via
199
212
  # google-ads
200
213
  # google-api-core
214
+ # googleapis-common-protos
215
+ # grpc-google-iam-v1
216
+ # grpc-interceptor
201
217
  # grpcio-status
202
218
  grpcio-status==1.62.3
203
219
  # via
@@ -321,13 +337,16 @@ proto-plus==1.26.0
321
337
  # google-analytics-data
322
338
  # google-api-core
323
339
  # google-cloud-bigquery-storage
340
+ # google-cloud-spanner
324
341
  protobuf==4.25.6
325
342
  # via
326
343
  # google-ads
327
344
  # google-analytics-data
328
345
  # google-api-core
329
346
  # google-cloud-bigquery-storage
347
+ # google-cloud-spanner
330
348
  # googleapis-common-protos
349
+ # grpc-google-iam-v1
331
350
  # grpcio-status
332
351
  # proto-plus
333
352
  psutil==6.1.1
@@ -493,16 +512,21 @@ sqlalchemy==1.4.52
493
512
  # sqlalchemy-bigquery
494
513
  # sqlalchemy-hana
495
514
  # sqlalchemy-redshift
515
+ # sqlalchemy-spanner
496
516
  sqlalchemy-bigquery==1.12.1
497
517
  # via -r requirements.in
498
518
  sqlalchemy-hana==2.0.0
499
519
  # via -r requirements.in
500
520
  sqlalchemy-redshift==0.8.14
501
521
  # via -r requirements.in
522
+ sqlalchemy-spanner==1.11.0
523
+ # via -r requirements.in
502
524
  sqlalchemy2-stubs==0.0.2a38
503
525
  # via -r requirements.in
504
526
  sqlglot==26.12.1
505
527
  # via dlt
528
+ sqlparse==0.5.3
529
+ # via google-cloud-spanner
506
530
  stripe==10.7.0
507
531
  # via -r requirements.in
508
532
  tenacity==9.0.0
@@ -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
@@ -147,6 +149,7 @@ google-api-core==2.24.2
147
149
  # google-cloud-bigquery
148
150
  # google-cloud-bigquery-storage
149
151
  # google-cloud-core
152
+ # google-cloud-spanner
150
153
  # google-cloud-storage
151
154
  # sqlalchemy-bigquery
152
155
  google-api-python-client==2.130.0
@@ -176,7 +179,12 @@ google-cloud-bigquery-storage==2.24.0
176
179
  google-cloud-core==2.4.3
177
180
  # via
178
181
  # google-cloud-bigquery
182
+ # google-cloud-spanner
179
183
  # google-cloud-storage
184
+ google-cloud-spanner==3.54.0
185
+ # via
186
+ # -r requirements.in
187
+ # sqlalchemy-spanner
180
188
  google-cloud-storage==3.1.0
181
189
  # via gcsfs
182
190
  google-crc32c==1.7.1
@@ -191,13 +199,21 @@ googleapis-common-protos==1.69.2
191
199
  # via
192
200
  # google-ads
193
201
  # google-api-core
202
+ # grpc-google-iam-v1
194
203
  # grpcio-status
195
204
  greenlet==3.1.1
196
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
197
210
  grpcio==1.71.0
198
211
  # via
199
212
  # google-ads
200
213
  # google-api-core
214
+ # googleapis-common-protos
215
+ # grpc-google-iam-v1
216
+ # grpc-interceptor
201
217
  # grpcio-status
202
218
  grpcio-status==1.62.3
203
219
  # via
@@ -315,13 +331,16 @@ proto-plus==1.26.1
315
331
  # google-analytics-data
316
332
  # google-api-core
317
333
  # google-cloud-bigquery-storage
334
+ # google-cloud-spanner
318
335
  protobuf==4.25.6
319
336
  # via
320
337
  # google-ads
321
338
  # google-analytics-data
322
339
  # google-api-core
323
340
  # google-cloud-bigquery-storage
341
+ # google-cloud-spanner
324
342
  # googleapis-common-protos
343
+ # grpc-google-iam-v1
325
344
  # grpcio-status
326
345
  # proto-plus
327
346
  psutil==6.1.1
@@ -486,16 +505,21 @@ sqlalchemy==1.4.52
486
505
  # sqlalchemy-bigquery
487
506
  # sqlalchemy-hana
488
507
  # sqlalchemy-redshift
508
+ # sqlalchemy-spanner
489
509
  sqlalchemy-bigquery==1.12.1
490
510
  # via -r requirements.in
491
511
  sqlalchemy-hana==2.0.0
492
512
  # via -r requirements.in
493
513
  sqlalchemy-redshift==0.8.14
494
514
  # via -r requirements.in
515
+ sqlalchemy-spanner==1.11.0
516
+ # via -r requirements.in
495
517
  sqlalchemy2-stubs==0.0.2a38
496
518
  # via -r requirements.in
497
519
  sqlglot==26.12.1
498
520
  # via dlt
521
+ sqlparse==0.5.3
522
+ # via google-cloud-spanner
499
523
  stripe==10.7.0
500
524
  # via -r requirements.in
501
525
  tenacity==9.0.0
@@ -1 +0,0 @@
1
- version = "v0.13.40"
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
File without changes
File without changes