ingestr 0.13.22__tar.gz → 0.13.24__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 (255) hide show
  1. {ingestr-0.13.22 → ingestr-0.13.24}/Dockerfile +8 -1
  2. {ingestr-0.13.22 → ingestr-0.13.24}/Makefile +2 -1
  3. {ingestr-0.13.22 → ingestr-0.13.24}/PKG-INFO +5 -4
  4. ingestr-0.13.24/ingestr/conftest.py +63 -0
  5. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/main.py +4 -2
  6. ingestr-0.13.24/ingestr/src/buildinfo.py +1 -0
  7. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/filters.py +21 -0
  8. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/github/helpers.py +5 -5
  9. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/google_sheets/__init__.py +4 -4
  10. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/google_sheets/helpers/data_processing.py +2 -2
  11. {ingestr-0.13.22 → ingestr-0.13.24}/requirements-dev.txt +4 -3
  12. {ingestr-0.13.22 → ingestr-0.13.24}/requirements.in +5 -5
  13. {ingestr-0.13.22 → ingestr-0.13.24}/requirements.txt +5 -3
  14. ingestr-0.13.24/requirements_arm64.txt +566 -0
  15. ingestr-0.13.22/ingestr/src/buildinfo.py +0 -1
  16. {ingestr-0.13.22 → ingestr-0.13.24}/.dockerignore +0 -0
  17. {ingestr-0.13.22 → ingestr-0.13.24}/.githooks/pre-commit-hook.sh +0 -0
  18. {ingestr-0.13.22 → ingestr-0.13.24}/.github/workflows/deploy-docs.yml +0 -0
  19. {ingestr-0.13.22 → ingestr-0.13.24}/.github/workflows/release.yml +0 -0
  20. {ingestr-0.13.22 → ingestr-0.13.24}/.github/workflows/secrets-scan.yml +0 -0
  21. {ingestr-0.13.22 → ingestr-0.13.24}/.github/workflows/tests.yml +0 -0
  22. {ingestr-0.13.22 → ingestr-0.13.24}/.gitignore +0 -0
  23. {ingestr-0.13.22 → ingestr-0.13.24}/.gitleaksignore +0 -0
  24. {ingestr-0.13.22 → ingestr-0.13.24}/.python-version +0 -0
  25. {ingestr-0.13.22 → ingestr-0.13.24}/.vale.ini +0 -0
  26. {ingestr-0.13.22 → ingestr-0.13.24}/LICENSE.md +0 -0
  27. {ingestr-0.13.22 → ingestr-0.13.24}/README.md +0 -0
  28. {ingestr-0.13.22 → ingestr-0.13.24}/docs/.vitepress/config.mjs +0 -0
  29. {ingestr-0.13.22 → ingestr-0.13.24}/docs/.vitepress/theme/custom.css +0 -0
  30. {ingestr-0.13.22 → ingestr-0.13.24}/docs/.vitepress/theme/index.js +0 -0
  31. {ingestr-0.13.22 → ingestr-0.13.24}/docs/commands/example-uris.md +0 -0
  32. {ingestr-0.13.22 → ingestr-0.13.24}/docs/commands/ingest.md +0 -0
  33. {ingestr-0.13.22 → ingestr-0.13.24}/docs/getting-started/core-concepts.md +0 -0
  34. {ingestr-0.13.22 → ingestr-0.13.24}/docs/getting-started/incremental-loading.md +0 -0
  35. {ingestr-0.13.22 → ingestr-0.13.24}/docs/getting-started/quickstart.md +0 -0
  36. {ingestr-0.13.22 → ingestr-0.13.24}/docs/getting-started/telemetry.md +0 -0
  37. {ingestr-0.13.22 → ingestr-0.13.24}/docs/index.md +0 -0
  38. {ingestr-0.13.22 → ingestr-0.13.24}/docs/media/applovin_max.png +0 -0
  39. {ingestr-0.13.22 → ingestr-0.13.24}/docs/media/athena.png +0 -0
  40. {ingestr-0.13.22 → ingestr-0.13.24}/docs/media/clickhouse_img.png +0 -0
  41. {ingestr-0.13.22 → ingestr-0.13.24}/docs/media/github.png +0 -0
  42. {ingestr-0.13.22 → ingestr-0.13.24}/docs/media/googleanalytics.png +0 -0
  43. {ingestr-0.13.22 → ingestr-0.13.24}/docs/media/kinesis.bigquery.png +0 -0
  44. {ingestr-0.13.22 → ingestr-0.13.24}/docs/media/linkedin_ads.png +0 -0
  45. {ingestr-0.13.22 → ingestr-0.13.24}/docs/media/personio.png +0 -0
  46. {ingestr-0.13.22 → ingestr-0.13.24}/docs/media/personio_duckdb.png +0 -0
  47. {ingestr-0.13.22 → ingestr-0.13.24}/docs/media/pipedrive.png +0 -0
  48. {ingestr-0.13.22 → ingestr-0.13.24}/docs/media/stripe_postgres.png +0 -0
  49. {ingestr-0.13.22 → ingestr-0.13.24}/docs/media/tiktok.png +0 -0
  50. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/adjust.md +0 -0
  51. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/airtable.md +0 -0
  52. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/applovin.md +0 -0
  53. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/applovin_max.md +0 -0
  54. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/appsflyer.md +0 -0
  55. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/appstore.md +0 -0
  56. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/asana.md +0 -0
  57. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/athena.md +0 -0
  58. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/bigquery.md +0 -0
  59. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/chess.md +0 -0
  60. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/clickhouse.md +0 -0
  61. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/csv.md +0 -0
  62. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/custom_queries.md +0 -0
  63. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/databricks.md +0 -0
  64. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/db2.md +0 -0
  65. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/duckdb.md +0 -0
  66. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/dynamodb.md +0 -0
  67. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/facebook-ads.md +0 -0
  68. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/gcs.md +0 -0
  69. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/github.md +0 -0
  70. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/google-ads.md +0 -0
  71. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/google_analytics.md +0 -0
  72. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/gorgias.md +0 -0
  73. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/gsheets.md +0 -0
  74. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/hubspot.md +0 -0
  75. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/kafka.md +0 -0
  76. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/kinesis.md +0 -0
  77. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/klaviyo.md +0 -0
  78. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/linkedin_ads.md +0 -0
  79. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/mongodb.md +0 -0
  80. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/mssql.md +0 -0
  81. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/mysql.md +0 -0
  82. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/notion.md +0 -0
  83. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/oracle.md +0 -0
  84. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/personio.md +0 -0
  85. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/pipedrive.md +0 -0
  86. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/postgres.md +0 -0
  87. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/redshift.md +0 -0
  88. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/s3.md +0 -0
  89. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/salesforce.md +0 -0
  90. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/sap-hana.md +0 -0
  91. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/shopify.md +0 -0
  92. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/slack.md +0 -0
  93. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/snowflake.md +0 -0
  94. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/sqlite.md +0 -0
  95. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/stripe.md +0 -0
  96. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/tiktok-ads.md +0 -0
  97. {ingestr-0.13.22 → ingestr-0.13.24}/docs/supported-sources/zendesk.md +0 -0
  98. {ingestr-0.13.22 → ingestr-0.13.24}/docs/tutorials/load-kinesis-bigquery.md +0 -0
  99. {ingestr-0.13.22 → ingestr-0.13.24}/docs/tutorials/load-personio-duckdb.md +0 -0
  100. {ingestr-0.13.22 → ingestr-0.13.24}/docs/tutorials/load-stripe-postgres.md +0 -0
  101. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/.gitignore +0 -0
  102. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/adjust/__init__.py +0 -0
  103. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/adjust/adjust_helpers.py +0 -0
  104. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/airtable/__init__.py +0 -0
  105. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/applovin/__init__.py +0 -0
  106. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/applovin_max/__init__.py +0 -0
  107. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/appsflyer/_init_.py +0 -0
  108. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/appsflyer/client.py +0 -0
  109. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/appstore/__init__.py +0 -0
  110. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/appstore/client.py +0 -0
  111. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/appstore/errors.py +0 -0
  112. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/appstore/models.py +0 -0
  113. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/appstore/resources.py +0 -0
  114. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/arrow/__init__.py +0 -0
  115. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/asana_source/__init__.py +0 -0
  116. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/asana_source/helpers.py +0 -0
  117. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/asana_source/settings.py +0 -0
  118. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/blob.py +0 -0
  119. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/chess/__init__.py +0 -0
  120. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/chess/helpers.py +0 -0
  121. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/chess/settings.py +0 -0
  122. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/destinations.py +0 -0
  123. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/dynamodb/__init__.py +0 -0
  124. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/errors.py +0 -0
  125. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/facebook_ads/__init__.py +0 -0
  126. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/facebook_ads/exceptions.py +0 -0
  127. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/facebook_ads/helpers.py +0 -0
  128. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/facebook_ads/settings.py +0 -0
  129. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/factory.py +0 -0
  130. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/filesystem/__init__.py +0 -0
  131. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/filesystem/helpers.py +0 -0
  132. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/filesystem/readers.py +0 -0
  133. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/github/__init__.py +0 -0
  134. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/github/queries.py +0 -0
  135. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/github/settings.py +0 -0
  136. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/google_ads/__init__.py +0 -0
  137. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/google_ads/field.py +0 -0
  138. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/google_ads/metrics.py +0 -0
  139. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/google_ads/predicates.py +0 -0
  140. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/google_ads/reports.py +0 -0
  141. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/google_analytics/__init__.py +0 -0
  142. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/google_analytics/helpers.py +0 -0
  143. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/google_sheets/README.md +0 -0
  144. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
  145. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
  146. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/gorgias/__init__.py +0 -0
  147. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/gorgias/helpers.py +0 -0
  148. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/hubspot/__init__.py +0 -0
  149. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/hubspot/helpers.py +0 -0
  150. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/hubspot/settings.py +0 -0
  151. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/kafka/__init__.py +0 -0
  152. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/kafka/helpers.py +0 -0
  153. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/kinesis/__init__.py +0 -0
  154. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/kinesis/helpers.py +0 -0
  155. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/klaviyo/_init_.py +0 -0
  156. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/klaviyo/client.py +0 -0
  157. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/klaviyo/helpers.py +0 -0
  158. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/linkedin_ads/__init__.py +0 -0
  159. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
  160. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/linkedin_ads/helpers.py +0 -0
  161. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/loader.py +0 -0
  162. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/mongodb/__init__.py +0 -0
  163. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/mongodb/helpers.py +0 -0
  164. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/notion/__init__.py +0 -0
  165. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/notion/helpers/__init__.py +0 -0
  166. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/notion/helpers/client.py +0 -0
  167. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/notion/helpers/database.py +0 -0
  168. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/notion/settings.py +0 -0
  169. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/partition.py +0 -0
  170. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/personio/__init__.py +0 -0
  171. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/personio/helpers.py +0 -0
  172. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/pipedrive/__init__.py +0 -0
  173. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/pipedrive/helpers/__init__.py +0 -0
  174. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/pipedrive/helpers/custom_fields_munger.py +0 -0
  175. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/pipedrive/helpers/pages.py +0 -0
  176. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/pipedrive/settings.py +0 -0
  177. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/pipedrive/typing.py +0 -0
  178. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/resource.py +0 -0
  179. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/salesforce/__init__.py +0 -0
  180. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/salesforce/helpers.py +0 -0
  181. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/shopify/__init__.py +0 -0
  182. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/shopify/exceptions.py +0 -0
  183. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/shopify/helpers.py +0 -0
  184. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/shopify/settings.py +0 -0
  185. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/slack/__init__.py +0 -0
  186. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/slack/helpers.py +0 -0
  187. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/slack/settings.py +0 -0
  188. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/sources.py +0 -0
  189. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/sql_database/__init__.py +0 -0
  190. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/sql_database/callbacks.py +0 -0
  191. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/stripe_analytics/__init__.py +0 -0
  192. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/stripe_analytics/helpers.py +0 -0
  193. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/stripe_analytics/settings.py +0 -0
  194. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/table_definition.py +0 -0
  195. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/telemetry/event.py +0 -0
  196. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/testdata/fakebqcredentials.json +0 -0
  197. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/tiktok_ads/__init__.py +0 -0
  198. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -0
  199. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/time.py +0 -0
  200. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/version.py +0 -0
  201. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/zendesk/__init__.py +0 -0
  202. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/zendesk/helpers/__init__.py +0 -0
  203. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
  204. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/zendesk/helpers/credentials.py +0 -0
  205. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
  206. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/src/zendesk/settings.py +0 -0
  207. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/testdata/.gitignore +0 -0
  208. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/testdata/create_replace.csv +0 -0
  209. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/testdata/delete_insert_expected.csv +0 -0
  210. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/testdata/delete_insert_part1.csv +0 -0
  211. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/testdata/delete_insert_part2.csv +0 -0
  212. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/testdata/merge_expected.csv +0 -0
  213. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/testdata/merge_part1.csv +0 -0
  214. {ingestr-0.13.22 → ingestr-0.13.24}/ingestr/testdata/merge_part2.csv +0 -0
  215. {ingestr-0.13.22 → ingestr-0.13.24}/package-lock.json +0 -0
  216. {ingestr-0.13.22 → ingestr-0.13.24}/package.json +0 -0
  217. {ingestr-0.13.22 → ingestr-0.13.24}/pyproject.toml +0 -0
  218. {ingestr-0.13.22 → ingestr-0.13.24}/resources/demo.gif +0 -0
  219. {ingestr-0.13.22 → ingestr-0.13.24}/resources/demo.tape +0 -0
  220. {ingestr-0.13.22 → ingestr-0.13.24}/resources/ingestr.svg +0 -0
  221. {ingestr-0.13.22 → ingestr-0.13.24}/styles/Google/AMPM.yml +0 -0
  222. {ingestr-0.13.22 → ingestr-0.13.24}/styles/Google/Acronyms.yml +0 -0
  223. {ingestr-0.13.22 → ingestr-0.13.24}/styles/Google/Colons.yml +0 -0
  224. {ingestr-0.13.22 → ingestr-0.13.24}/styles/Google/Contractions.yml +0 -0
  225. {ingestr-0.13.22 → ingestr-0.13.24}/styles/Google/DateFormat.yml +0 -0
  226. {ingestr-0.13.22 → ingestr-0.13.24}/styles/Google/Ellipses.yml +0 -0
  227. {ingestr-0.13.22 → ingestr-0.13.24}/styles/Google/EmDash.yml +0 -0
  228. {ingestr-0.13.22 → ingestr-0.13.24}/styles/Google/Exclamation.yml +0 -0
  229. {ingestr-0.13.22 → ingestr-0.13.24}/styles/Google/FirstPerson.yml +0 -0
  230. {ingestr-0.13.22 → ingestr-0.13.24}/styles/Google/Gender.yml +0 -0
  231. {ingestr-0.13.22 → ingestr-0.13.24}/styles/Google/GenderBias.yml +0 -0
  232. {ingestr-0.13.22 → ingestr-0.13.24}/styles/Google/HeadingPunctuation.yml +0 -0
  233. {ingestr-0.13.22 → ingestr-0.13.24}/styles/Google/Headings.yml +0 -0
  234. {ingestr-0.13.22 → ingestr-0.13.24}/styles/Google/Latin.yml +0 -0
  235. {ingestr-0.13.22 → ingestr-0.13.24}/styles/Google/LyHyphens.yml +0 -0
  236. {ingestr-0.13.22 → ingestr-0.13.24}/styles/Google/OptionalPlurals.yml +0 -0
  237. {ingestr-0.13.22 → ingestr-0.13.24}/styles/Google/Ordinal.yml +0 -0
  238. {ingestr-0.13.22 → ingestr-0.13.24}/styles/Google/OxfordComma.yml +0 -0
  239. {ingestr-0.13.22 → ingestr-0.13.24}/styles/Google/Parens.yml +0 -0
  240. {ingestr-0.13.22 → ingestr-0.13.24}/styles/Google/Passive.yml +0 -0
  241. {ingestr-0.13.22 → ingestr-0.13.24}/styles/Google/Periods.yml +0 -0
  242. {ingestr-0.13.22 → ingestr-0.13.24}/styles/Google/Quotes.yml +0 -0
  243. {ingestr-0.13.22 → ingestr-0.13.24}/styles/Google/Ranges.yml +0 -0
  244. {ingestr-0.13.22 → ingestr-0.13.24}/styles/Google/Semicolons.yml +0 -0
  245. {ingestr-0.13.22 → ingestr-0.13.24}/styles/Google/Slang.yml +0 -0
  246. {ingestr-0.13.22 → ingestr-0.13.24}/styles/Google/Spacing.yml +0 -0
  247. {ingestr-0.13.22 → ingestr-0.13.24}/styles/Google/Spelling.yml +0 -0
  248. {ingestr-0.13.22 → ingestr-0.13.24}/styles/Google/Units.yml +0 -0
  249. {ingestr-0.13.22 → ingestr-0.13.24}/styles/Google/We.yml +0 -0
  250. {ingestr-0.13.22 → ingestr-0.13.24}/styles/Google/Will.yml +0 -0
  251. {ingestr-0.13.22 → ingestr-0.13.24}/styles/Google/WordList.yml +0 -0
  252. {ingestr-0.13.22 → ingestr-0.13.24}/styles/Google/meta.json +0 -0
  253. {ingestr-0.13.22 → ingestr-0.13.24}/styles/Google/vocab.txt +0 -0
  254. {ingestr-0.13.22 → ingestr-0.13.24}/styles/bruin/Ingestr.yml +0 -0
  255. {ingestr-0.13.22 → ingestr-0.13.24}/styles/config/vocabularies/bruin/accept.txt +0 -0
@@ -3,6 +3,10 @@ FROM python:3.11-slim
3
3
  WORKDIR /app
4
4
 
5
5
  COPY ./requirements.txt /app/requirements.txt
6
+ COPY ./requirements_arm64.txt /app/requirements_arm64.txt
7
+ RUN if [ "$(uname -m)" = "aarch64" ]; then \
8
+ cp /app/requirements_arm64.txt /app/requirements.txt; \
9
+ fi
6
10
 
7
11
  # Setup dependencies for pyodbc
8
12
  RUN \
@@ -31,7 +35,10 @@ RUN /install.sh && rm /install.sh
31
35
  RUN $HOME/.local/bin/uv pip install --system --no-cache -r requirements.txt
32
36
 
33
37
  COPY . /app
38
+ RUN if [ "$(uname -m)" = "aarch64" ]; then \
39
+ cp /app/requirements_arm64.txt /app/requirements.txt; \
40
+ fi
34
41
 
35
- RUN pip3 install -e . && pip3 install pyodbc
42
+ RUN $HOME/.local/bin/uv pip install --system . && $HOME/.local/bin/uv pip install --system pyodbc
36
43
 
37
44
  ENTRYPOINT ["ingestr"]
@@ -13,6 +13,7 @@ venv/touchfile: requirements-dev.txt requirements.txt
13
13
 
14
14
  lock-deps:
15
15
  @uv pip compile requirements.in --quiet -o requirements.txt
16
+ @uv pip compile requirements.in --quiet -o requirements_arm64.txt --python-platform aarch64-unknown-linux-gnu
16
17
 
17
18
  deps: lock-deps
18
19
  uv pip install -r requirements-dev.txt
@@ -27,7 +28,7 @@ test : venv lock-deps
27
28
  . venv/bin/activate; $(MAKE) test-ci
28
29
 
29
30
  test-specific: venv lock-deps
30
- . venv/bin/activate; pytest -rP -vv --tb=short --capture=no -k $(test)
31
+ . venv/bin/activate; TESTCONTAINERS_RYUK_DISABLED=true pytest -n auto -rP -vv --tb=short --capture=no -k $(test)
31
32
 
32
33
  lint-ci:
33
34
  ruff format ingestr && ruff check ingestr --fix
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ingestr
3
- Version: 0.13.22
3
+ Version: 0.13.24
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
@@ -46,10 +46,10 @@ Requires-Dist: databricks-sqlalchemy==1.0.2
46
46
  Requires-Dist: dataclasses-json==0.6.7
47
47
  Requires-Dist: decorator==5.2.1
48
48
  Requires-Dist: deprecation==2.1.0
49
- Requires-Dist: dlt==1.6.1
49
+ Requires-Dist: dlt==1.9.0
50
50
  Requires-Dist: dnspython==2.7.0
51
- Requires-Dist: duckdb-engine==0.15.0
52
- Requires-Dist: duckdb==1.2.0
51
+ Requires-Dist: duckdb-engine==0.17.0
52
+ Requires-Dist: duckdb==1.2.1
53
53
  Requires-Dist: et-xmlfile==2.0.0
54
54
  Requires-Dist: facebook-business==20.0.0
55
55
  Requires-Dist: filelock==3.17.0
@@ -168,6 +168,7 @@ Requires-Dist: sqlalchemy-hana==2.0.0
168
168
  Requires-Dist: sqlalchemy-redshift==0.8.14
169
169
  Requires-Dist: sqlalchemy2-stubs==0.0.2a38
170
170
  Requires-Dist: sqlalchemy==1.4.52
171
+ Requires-Dist: sqlglot==26.12.1
171
172
  Requires-Dist: stripe==10.7.0
172
173
  Requires-Dist: tenacity==9.0.0
173
174
  Requires-Dist: thrift==0.16.0
@@ -0,0 +1,63 @@
1
+ import os
2
+ import tempfile
3
+ from concurrent.futures import ThreadPoolExecutor
4
+
5
+ from main_test import DESTINATIONS, SOURCES # type: ignore
6
+
7
+
8
+ def pytest_configure(config):
9
+ if is_master(config):
10
+ config.shared_directory = tempfile.mkdtemp()
11
+
12
+
13
+ def pytest_configure_node(node):
14
+ """xdist hook"""
15
+ node.workerinput["shared_directory"] = node.config.shared_directory
16
+
17
+
18
+ def is_master(config):
19
+ """True if the code running the given pytest.config object is running in a xdist master
20
+ node or not running xdist at all.
21
+ """
22
+ return not hasattr(config, "workerinput")
23
+
24
+
25
+ def start_containers(config):
26
+ if hasattr(config, "workerinput"):
27
+ return
28
+
29
+ unique_containers = set(SOURCES.values()) | set(DESTINATIONS.values())
30
+ for container in unique_containers:
31
+ container.container_lock_dir = config.shared_directory
32
+
33
+ with ThreadPoolExecutor() as executor:
34
+ for container in unique_containers:
35
+ executor.submit(container.start_fully)
36
+ # futures = [
37
+ # executor.submit(container.start_fully) for container in unique_containers
38
+ # ]
39
+ # # Wait for all futures to complete
40
+ # for future in futures:
41
+ # future.result()
42
+
43
+
44
+ def stop_containers(config):
45
+ if hasattr(config, "workerinput"):
46
+ return
47
+
48
+ should_manage_containers = os.environ.get("PYTEST_XDIST_WORKER", "gw0") == "gw0"
49
+ if not should_manage_containers:
50
+ return
51
+
52
+ unique_containers = set(SOURCES.values()) | set(DESTINATIONS.values())
53
+
54
+ for container in unique_containers:
55
+ container.stop_fully()
56
+
57
+
58
+ def pytest_sessionstart(session):
59
+ start_containers(session.config)
60
+
61
+
62
+ def pytest_sessionfinish(session, exitstatus):
63
+ stop_containers(session.config)
@@ -11,7 +11,7 @@ from typing_extensions import Annotated
11
11
  import ingestr.src.partition as partition
12
12
  import ingestr.src.resource as resource
13
13
  from ingestr.src.destinations import AthenaDestination
14
- from ingestr.src.filters import cast_set_to_list
14
+ from ingestr.src.filters import cast_set_to_list, handle_mysql_empty_dates
15
15
  from ingestr.src.telemetry.event import track
16
16
 
17
17
  app = typer.Typer(
@@ -35,7 +35,7 @@ DATE_FORMATS = [
35
35
 
36
36
  # https://dlthub.com/docs/dlt-ecosystem/file-formats/parquet#supported-destinations
37
37
  PARQUET_SUPPORTED_DESTINATIONS = [
38
- "athena" "bigquery",
38
+ "athenabigquery",
39
39
  "duckdb",
40
40
  "snowflake",
41
41
  "databricks",
@@ -553,6 +553,8 @@ def ingest(
553
553
  )
554
554
 
555
555
  resource.for_each(dlt_source, lambda x: x.add_map(cast_set_to_list))
556
+ if factory.source_scheme.startswith("mysql"):
557
+ resource.for_each(dlt_source, lambda x: x.add_map(handle_mysql_empty_dates))
556
558
 
557
559
  def col_h(x):
558
560
  if column_hints:
@@ -0,0 +1 @@
1
+ version = "v0.13.24"
@@ -10,6 +10,27 @@ def cast_set_to_list(row):
10
10
  return row
11
11
 
12
12
 
13
+ def handle_mysql_empty_dates(row):
14
+ # MySQL returns empty dates as 0000-00-00, which is not a valid date, we handle them here.
15
+ if not isinstance(row, dict):
16
+ return row
17
+
18
+ for key in row.keys():
19
+ if not isinstance(row[key], str):
20
+ continue
21
+
22
+ if row[key] == "0000-00-00":
23
+ from datetime import date
24
+
25
+ row[key] = date(1970, 1, 1)
26
+
27
+ elif row[key] == "0000-00-00 00:00:00":
28
+ from datetime import datetime
29
+
30
+ row[key] = datetime(1970, 1, 1, 0, 0, 0)
31
+ return row
32
+
33
+
13
34
  def table_adapter_exclude_columns(cols: list[str]):
14
35
  def excluder(table: Table):
15
36
  cols_to_remove = [col for col in table._columns if col.name in cols] # type: ignore
@@ -103,9 +103,9 @@ def get_reactions_data(
103
103
 
104
104
 
105
105
  def _extract_top_connection(data: StrAny, node_type: str) -> StrAny:
106
- assert (
107
- isinstance(data, dict) and len(data) == 1
108
- ), f"The data with list of {node_type} must be a dictionary and contain only one element"
106
+ assert isinstance(data, dict) and len(data) == 1, (
107
+ f"The data with list of {node_type} must be a dictionary and contain only one element"
108
+ )
109
109
  data = next(iter(data.values()))
110
110
  return data[node_type] # type: ignore
111
111
 
@@ -158,7 +158,7 @@ def _get_graphql_pages(
158
158
  )
159
159
  items_count += len(data_items)
160
160
  print(
161
- f'Got {len(data_items)}/{items_count} {node_type}s, query cost {rate_limit["cost"]}, remaining credits: {rate_limit["remaining"]}'
161
+ f"Got {len(data_items)}/{items_count} {node_type}s, query cost {rate_limit['cost']}, remaining credits: {rate_limit['remaining']}"
162
162
  )
163
163
  if data_items:
164
164
  yield data_items
@@ -187,7 +187,7 @@ def _get_comment_reaction(comment_ids: List[str], access_token: str) -> StrAny:
187
187
  # print(query)
188
188
  page, rate_limit = _run_graphql_query(access_token, query, {})
189
189
  print(
190
- f'Got {len(page)} comments, query cost {rate_limit["cost"]}, remaining credits: {rate_limit["remaining"]}'
190
+ f"Got {len(page)} comments, query cost {rate_limit['cost']}, remaining credits: {rate_limit['remaining']}"
191
191
  )
192
192
  data.update(page)
193
193
  return data
@@ -70,9 +70,9 @@ def google_spreadsheet(
70
70
  spreadsheet_id=spreadsheet_id,
71
71
  range_names=list(all_range_names),
72
72
  )
73
- assert len(all_range_names) == len(
74
- all_range_data
75
- ), "Google Sheets API must return values for all requested ranges"
73
+ assert len(all_range_names) == len(all_range_data), (
74
+ "Google Sheets API must return values for all requested ranges"
75
+ )
76
76
 
77
77
  # get metadata for two first rows of each range
78
78
  # first should contain headers
@@ -126,7 +126,7 @@ def google_spreadsheet(
126
126
  headers = get_range_headers(headers_metadata, name)
127
127
  if headers is None:
128
128
  # generate automatic headers and treat the first row as data
129
- headers = [f"col_{idx+1}" for idx in range(len(headers_metadata))]
129
+ headers = [f"col_{idx + 1}" for idx in range(len(headers_metadata))]
130
130
  data_row_metadata = headers_metadata
131
131
  rows_data = values[0:]
132
132
  logger.warning(
@@ -149,12 +149,12 @@ def get_range_headers(headers_metadata: List[DictStrAny], range_name: str) -> Li
149
149
  header_val = str(f"col_{idx + 1}")
150
150
  else:
151
151
  logger.warning(
152
- f"In range {range_name}, header value: {header_val} at position {idx+1} is not a string!"
152
+ f"In range {range_name}, header value: {header_val} at position {idx + 1} is not a string!"
153
153
  )
154
154
  return None
155
155
  else:
156
156
  logger.warning(
157
- f"In range {range_name}, header at position {idx+1} is not missing!"
157
+ f"In range {range_name}, header at position {idx + 1} is not missing!"
158
158
  )
159
159
  return None
160
160
  headers.append(header_val)
@@ -1,13 +1,14 @@
1
1
  -r requirements.txt
2
2
 
3
- mypy==1.13.0
3
+ mypy==1.15.0
4
4
  pytest-cov==4.1.0
5
5
  pytest==8.3.3
6
- ruff==0.8.6
6
+ ruff==0.11.4
7
7
  hatchling==1.27.0
8
8
  build==1.2.1
9
9
  pyodbc==5.2.0
10
10
  twine==6.0.1
11
11
  testcontainers[postgres,mysql]==4.8.2
12
12
  pytest-xdist[psutil]==3.6.1
13
- pkginfo==1.12.0
13
+ pkginfo==1.12.0
14
+ pytest-repeat==0.9.3
@@ -2,9 +2,9 @@ asana==3.2.3
2
2
  confluent-kafka==2.8.0
3
3
  databricks-sql-connector==2.9.3
4
4
  dataclasses-json==0.6.7
5
- dlt==1.6.1
6
- duckdb_engine==0.15.0
7
- duckdb==1.2.0
5
+ dlt==1.9.0
6
+ duckdb_engine==0.17.0
7
+ duckdb==1.2.1
8
8
  google-ads==25.1.0
9
9
  facebook-business==20.0.0
10
10
  google-api-python-client==2.130.0
@@ -46,6 +46,6 @@ clickhouse-connect==0.8.14
46
46
  clickhouse-driver==0.2.9
47
47
  clickhouse-sqlalchemy==0.2.7
48
48
  zstd==1.5.6.5
49
- ibm-db==3.2.6
50
- ibm-db-sa==0.4.1
49
+ ibm-db==3.2.6; platform_machine != "aarch64"
50
+ ibm-db-sa==0.4.1; platform_machine != "aarch64"
51
51
  aiohttp>=3.11.15
@@ -94,15 +94,15 @@ decorator==5.2.1
94
94
  # via gcsfs
95
95
  deprecation==2.1.0
96
96
  # via rudder-sdk-python
97
- dlt==1.6.1
97
+ dlt==1.9.0
98
98
  # via -r requirements.in
99
99
  dnspython==2.7.0
100
100
  # via pymongo
101
- duckdb==1.2.0
101
+ duckdb==1.2.1
102
102
  # via
103
103
  # -r requirements.in
104
104
  # duckdb-engine
105
- duckdb-engine==0.15.0
105
+ duckdb-engine==0.17.0
106
106
  # via -r requirements.in
107
107
  et-xmlfile==2.0.0
108
108
  # via openpyxl
@@ -496,6 +496,8 @@ sqlalchemy-redshift==0.8.14
496
496
  # via -r requirements.in
497
497
  sqlalchemy2-stubs==0.0.2a38
498
498
  # via -r requirements.in
499
+ sqlglot==26.12.1
500
+ # via dlt
499
501
  stripe==10.7.0
500
502
  # via -r requirements.in
501
503
  tenacity==9.0.0