ingestr 0.12.4__tar.gz → 0.12.5__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 (196) hide show
  1. {ingestr-0.12.4 → ingestr-0.12.5}/PKG-INFO +4 -4
  2. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/main.py +2 -1
  3. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/arrow/__init__.py +0 -4
  4. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/sources.py +17 -44
  5. ingestr-0.12.5/ingestr/src/sql_database/callbacks.py +66 -0
  6. ingestr-0.12.5/ingestr/src/version.py +1 -0
  7. {ingestr-0.12.4 → ingestr-0.12.5}/requirements.txt +3 -3
  8. ingestr-0.12.5/styles/Google/vocab.txt +0 -0
  9. ingestr-0.12.4/ingestr/src/version.py +0 -1
  10. {ingestr-0.12.4 → ingestr-0.12.5}/.dockerignore +0 -0
  11. {ingestr-0.12.4 → ingestr-0.12.5}/.githooks/pre-commit-hook.sh +0 -0
  12. {ingestr-0.12.4 → ingestr-0.12.5}/.github/workflows/deploy-docs.yml +0 -0
  13. {ingestr-0.12.4 → ingestr-0.12.5}/.github/workflows/secrets-scan.yml +0 -0
  14. {ingestr-0.12.4 → ingestr-0.12.5}/.github/workflows/tests.yml +0 -0
  15. {ingestr-0.12.4 → ingestr-0.12.5}/.gitignore +0 -0
  16. {ingestr-0.12.4 → ingestr-0.12.5}/.gitleaksignore +0 -0
  17. {ingestr-0.12.4 → ingestr-0.12.5}/.python-version +0 -0
  18. {ingestr-0.12.4 → ingestr-0.12.5}/.vale.ini +0 -0
  19. {ingestr-0.12.4 → ingestr-0.12.5}/Dockerfile +0 -0
  20. {ingestr-0.12.4 → ingestr-0.12.5}/LICENSE.md +0 -0
  21. {ingestr-0.12.4 → ingestr-0.12.5}/Makefile +0 -0
  22. {ingestr-0.12.4 → ingestr-0.12.5}/README.md +0 -0
  23. {ingestr-0.12.4 → ingestr-0.12.5}/docs/.vitepress/config.mjs +0 -0
  24. {ingestr-0.12.4 → ingestr-0.12.5}/docs/.vitepress/theme/custom.css +0 -0
  25. {ingestr-0.12.4 → ingestr-0.12.5}/docs/.vitepress/theme/index.js +0 -0
  26. {ingestr-0.12.4 → ingestr-0.12.5}/docs/commands/example-uris.md +0 -0
  27. {ingestr-0.12.4 → ingestr-0.12.5}/docs/commands/ingest.md +0 -0
  28. {ingestr-0.12.4 → ingestr-0.12.5}/docs/getting-started/core-concepts.md +0 -0
  29. {ingestr-0.12.4 → ingestr-0.12.5}/docs/getting-started/incremental-loading.md +0 -0
  30. {ingestr-0.12.4 → ingestr-0.12.5}/docs/getting-started/quickstart.md +0 -0
  31. {ingestr-0.12.4 → ingestr-0.12.5}/docs/getting-started/telemetry.md +0 -0
  32. {ingestr-0.12.4 → ingestr-0.12.5}/docs/index.md +0 -0
  33. {ingestr-0.12.4 → ingestr-0.12.5}/docs/media/athena.png +0 -0
  34. {ingestr-0.12.4 → ingestr-0.12.5}/docs/media/github.png +0 -0
  35. {ingestr-0.12.4 → ingestr-0.12.5}/docs/media/googleanalytics.png +0 -0
  36. {ingestr-0.12.4 → ingestr-0.12.5}/docs/media/tiktok.png +0 -0
  37. {ingestr-0.12.4 → ingestr-0.12.5}/docs/supported-sources/adjust.md +0 -0
  38. {ingestr-0.12.4 → ingestr-0.12.5}/docs/supported-sources/airtable.md +0 -0
  39. {ingestr-0.12.4 → ingestr-0.12.5}/docs/supported-sources/appsflyer.md +0 -0
  40. {ingestr-0.12.4 → ingestr-0.12.5}/docs/supported-sources/asana.md +0 -0
  41. {ingestr-0.12.4 → ingestr-0.12.5}/docs/supported-sources/athena.md +0 -0
  42. {ingestr-0.12.4 → ingestr-0.12.5}/docs/supported-sources/bigquery.md +0 -0
  43. {ingestr-0.12.4 → ingestr-0.12.5}/docs/supported-sources/chess.md +0 -0
  44. {ingestr-0.12.4 → ingestr-0.12.5}/docs/supported-sources/csv.md +0 -0
  45. {ingestr-0.12.4 → ingestr-0.12.5}/docs/supported-sources/custom_queries.md +0 -0
  46. {ingestr-0.12.4 → ingestr-0.12.5}/docs/supported-sources/databricks.md +0 -0
  47. {ingestr-0.12.4 → ingestr-0.12.5}/docs/supported-sources/duckdb.md +0 -0
  48. {ingestr-0.12.4 → ingestr-0.12.5}/docs/supported-sources/dynamodb.md +0 -0
  49. {ingestr-0.12.4 → ingestr-0.12.5}/docs/supported-sources/facebook-ads.md +0 -0
  50. {ingestr-0.12.4 → ingestr-0.12.5}/docs/supported-sources/github.md +0 -0
  51. {ingestr-0.12.4 → ingestr-0.12.5}/docs/supported-sources/google_analytics.md +0 -0
  52. {ingestr-0.12.4 → ingestr-0.12.5}/docs/supported-sources/gorgias.md +0 -0
  53. {ingestr-0.12.4 → ingestr-0.12.5}/docs/supported-sources/gsheets.md +0 -0
  54. {ingestr-0.12.4 → ingestr-0.12.5}/docs/supported-sources/hubspot.md +0 -0
  55. {ingestr-0.12.4 → ingestr-0.12.5}/docs/supported-sources/kafka.md +0 -0
  56. {ingestr-0.12.4 → ingestr-0.12.5}/docs/supported-sources/klaviyo.md +0 -0
  57. {ingestr-0.12.4 → ingestr-0.12.5}/docs/supported-sources/mongodb.md +0 -0
  58. {ingestr-0.12.4 → ingestr-0.12.5}/docs/supported-sources/mssql.md +0 -0
  59. {ingestr-0.12.4 → ingestr-0.12.5}/docs/supported-sources/mysql.md +0 -0
  60. {ingestr-0.12.4 → ingestr-0.12.5}/docs/supported-sources/notion.md +0 -0
  61. {ingestr-0.12.4 → ingestr-0.12.5}/docs/supported-sources/oracle.md +0 -0
  62. {ingestr-0.12.4 → ingestr-0.12.5}/docs/supported-sources/postgres.md +0 -0
  63. {ingestr-0.12.4 → ingestr-0.12.5}/docs/supported-sources/redshift.md +0 -0
  64. {ingestr-0.12.4 → ingestr-0.12.5}/docs/supported-sources/s3.md +0 -0
  65. {ingestr-0.12.4 → ingestr-0.12.5}/docs/supported-sources/sap-hana.md +0 -0
  66. {ingestr-0.12.4 → ingestr-0.12.5}/docs/supported-sources/shopify.md +0 -0
  67. {ingestr-0.12.4 → ingestr-0.12.5}/docs/supported-sources/slack.md +0 -0
  68. {ingestr-0.12.4 → ingestr-0.12.5}/docs/supported-sources/snowflake.md +0 -0
  69. {ingestr-0.12.4 → ingestr-0.12.5}/docs/supported-sources/sqlite.md +0 -0
  70. {ingestr-0.12.4 → ingestr-0.12.5}/docs/supported-sources/stripe.md +0 -0
  71. {ingestr-0.12.4 → ingestr-0.12.5}/docs/supported-sources/tiktok-ads.md +0 -0
  72. {ingestr-0.12.4 → ingestr-0.12.5}/docs/supported-sources/zendesk.md +0 -0
  73. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/.gitignore +0 -0
  74. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/adjust/__init__.py +0 -0
  75. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/adjust/adjust_helpers.py +0 -0
  76. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/airtable/__init__.py +0 -0
  77. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/appsflyer/_init_.py +0 -0
  78. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/appsflyer/client.py +0 -0
  79. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/asana_source/__init__.py +0 -0
  80. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/asana_source/helpers.py +0 -0
  81. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/asana_source/settings.py +0 -0
  82. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/chess/__init__.py +0 -0
  83. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/chess/helpers.py +0 -0
  84. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/chess/settings.py +0 -0
  85. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/destinations.py +0 -0
  86. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/dynamodb/__init__.py +0 -0
  87. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/facebook_ads/__init__.py +0 -0
  88. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/facebook_ads/exceptions.py +0 -0
  89. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/facebook_ads/helpers.py +0 -0
  90. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/facebook_ads/settings.py +0 -0
  91. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/factory.py +0 -0
  92. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/filesystem/__init__.py +0 -0
  93. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/filesystem/helpers.py +0 -0
  94. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/filesystem/readers.py +0 -0
  95. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/filters.py +0 -0
  96. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/github/__init__.py +0 -0
  97. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/github/helpers.py +0 -0
  98. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/github/queries.py +0 -0
  99. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/github/settings.py +0 -0
  100. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/google_analytics/__init__.py +0 -0
  101. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/google_analytics/helpers/__init__.py +0 -0
  102. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/google_analytics/helpers/data_processing.py +0 -0
  103. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/google_sheets/README.md +0 -0
  104. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/google_sheets/__init__.py +0 -0
  105. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
  106. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
  107. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
  108. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/gorgias/__init__.py +0 -0
  109. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/gorgias/helpers.py +0 -0
  110. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/hubspot/__init__.py +0 -0
  111. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/hubspot/helpers.py +0 -0
  112. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/hubspot/settings.py +0 -0
  113. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/kafka/__init__.py +0 -0
  114. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/kafka/helpers.py +0 -0
  115. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/klaviyo/_init_.py +0 -0
  116. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/klaviyo/client.py +0 -0
  117. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/klaviyo/helpers.py +0 -0
  118. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/mongodb/__init__.py +0 -0
  119. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/mongodb/helpers.py +0 -0
  120. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/notion/__init__.py +0 -0
  121. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/notion/helpers/__init__.py +0 -0
  122. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/notion/helpers/client.py +0 -0
  123. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/notion/helpers/database.py +0 -0
  124. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/notion/settings.py +0 -0
  125. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/shopify/__init__.py +0 -0
  126. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/shopify/exceptions.py +0 -0
  127. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/shopify/helpers.py +0 -0
  128. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/shopify/settings.py +0 -0
  129. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/slack/__init__.py +0 -0
  130. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/slack/helpers.py +0 -0
  131. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/slack/settings.py +0 -0
  132. /ingestr-0.12.4/styles/Google/vocab.txt → /ingestr-0.12.5/ingestr/src/sql_database/__init__.py +0 -0
  133. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/stripe_analytics/__init__.py +0 -0
  134. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/stripe_analytics/helpers.py +0 -0
  135. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/stripe_analytics/settings.py +0 -0
  136. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/table_definition.py +0 -0
  137. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/telemetry/event.py +0 -0
  138. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/testdata/fakebqcredentials.json +0 -0
  139. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/tiktok_ads/__init__.py +0 -0
  140. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -0
  141. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/time.py +0 -0
  142. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/zendesk/__init__.py +0 -0
  143. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/zendesk/helpers/__init__.py +0 -0
  144. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
  145. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/zendesk/helpers/credentials.py +0 -0
  146. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
  147. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/src/zendesk/settings.py +0 -0
  148. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/testdata/.gitignore +0 -0
  149. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/testdata/create_replace.csv +0 -0
  150. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/testdata/delete_insert_expected.csv +0 -0
  151. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/testdata/delete_insert_part1.csv +0 -0
  152. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/testdata/delete_insert_part2.csv +0 -0
  153. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/testdata/merge_expected.csv +0 -0
  154. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/testdata/merge_part1.csv +0 -0
  155. {ingestr-0.12.4 → ingestr-0.12.5}/ingestr/testdata/merge_part2.csv +0 -0
  156. {ingestr-0.12.4 → ingestr-0.12.5}/package-lock.json +0 -0
  157. {ingestr-0.12.4 → ingestr-0.12.5}/package.json +0 -0
  158. {ingestr-0.12.4 → ingestr-0.12.5}/pyproject.toml +0 -0
  159. {ingestr-0.12.4 → ingestr-0.12.5}/requirements-dev.txt +0 -0
  160. {ingestr-0.12.4 → ingestr-0.12.5}/resources/demo.gif +0 -0
  161. {ingestr-0.12.4 → ingestr-0.12.5}/resources/demo.tape +0 -0
  162. {ingestr-0.12.4 → ingestr-0.12.5}/resources/ingestr.svg +0 -0
  163. {ingestr-0.12.4 → ingestr-0.12.5}/styles/Google/AMPM.yml +0 -0
  164. {ingestr-0.12.4 → ingestr-0.12.5}/styles/Google/Acronyms.yml +0 -0
  165. {ingestr-0.12.4 → ingestr-0.12.5}/styles/Google/Colons.yml +0 -0
  166. {ingestr-0.12.4 → ingestr-0.12.5}/styles/Google/Contractions.yml +0 -0
  167. {ingestr-0.12.4 → ingestr-0.12.5}/styles/Google/DateFormat.yml +0 -0
  168. {ingestr-0.12.4 → ingestr-0.12.5}/styles/Google/Ellipses.yml +0 -0
  169. {ingestr-0.12.4 → ingestr-0.12.5}/styles/Google/EmDash.yml +0 -0
  170. {ingestr-0.12.4 → ingestr-0.12.5}/styles/Google/Exclamation.yml +0 -0
  171. {ingestr-0.12.4 → ingestr-0.12.5}/styles/Google/FirstPerson.yml +0 -0
  172. {ingestr-0.12.4 → ingestr-0.12.5}/styles/Google/Gender.yml +0 -0
  173. {ingestr-0.12.4 → ingestr-0.12.5}/styles/Google/GenderBias.yml +0 -0
  174. {ingestr-0.12.4 → ingestr-0.12.5}/styles/Google/HeadingPunctuation.yml +0 -0
  175. {ingestr-0.12.4 → ingestr-0.12.5}/styles/Google/Headings.yml +0 -0
  176. {ingestr-0.12.4 → ingestr-0.12.5}/styles/Google/Latin.yml +0 -0
  177. {ingestr-0.12.4 → ingestr-0.12.5}/styles/Google/LyHyphens.yml +0 -0
  178. {ingestr-0.12.4 → ingestr-0.12.5}/styles/Google/OptionalPlurals.yml +0 -0
  179. {ingestr-0.12.4 → ingestr-0.12.5}/styles/Google/Ordinal.yml +0 -0
  180. {ingestr-0.12.4 → ingestr-0.12.5}/styles/Google/OxfordComma.yml +0 -0
  181. {ingestr-0.12.4 → ingestr-0.12.5}/styles/Google/Parens.yml +0 -0
  182. {ingestr-0.12.4 → ingestr-0.12.5}/styles/Google/Passive.yml +0 -0
  183. {ingestr-0.12.4 → ingestr-0.12.5}/styles/Google/Periods.yml +0 -0
  184. {ingestr-0.12.4 → ingestr-0.12.5}/styles/Google/Quotes.yml +0 -0
  185. {ingestr-0.12.4 → ingestr-0.12.5}/styles/Google/Ranges.yml +0 -0
  186. {ingestr-0.12.4 → ingestr-0.12.5}/styles/Google/Semicolons.yml +0 -0
  187. {ingestr-0.12.4 → ingestr-0.12.5}/styles/Google/Slang.yml +0 -0
  188. {ingestr-0.12.4 → ingestr-0.12.5}/styles/Google/Spacing.yml +0 -0
  189. {ingestr-0.12.4 → ingestr-0.12.5}/styles/Google/Spelling.yml +0 -0
  190. {ingestr-0.12.4 → ingestr-0.12.5}/styles/Google/Units.yml +0 -0
  191. {ingestr-0.12.4 → ingestr-0.12.5}/styles/Google/We.yml +0 -0
  192. {ingestr-0.12.4 → ingestr-0.12.5}/styles/Google/Will.yml +0 -0
  193. {ingestr-0.12.4 → ingestr-0.12.5}/styles/Google/WordList.yml +0 -0
  194. {ingestr-0.12.4 → ingestr-0.12.5}/styles/Google/meta.json +0 -0
  195. {ingestr-0.12.4 → ingestr-0.12.5}/styles/bruin/Ingestr.yml +0 -0
  196. {ingestr-0.12.4 → ingestr-0.12.5}/styles/config/vocabularies/bruin/accept.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ingestr
3
- Version: 0.12.4
3
+ Version: 0.12.5
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
@@ -17,11 +17,11 @@ Requires-Python: >=3.9
17
17
  Requires-Dist: asana==3.2.3
18
18
  Requires-Dist: confluent-kafka>=2.6.1
19
19
  Requires-Dist: databricks-sql-connector==2.9.3
20
- Requires-Dist: dlt==1.4.0
20
+ Requires-Dist: dlt==1.5.0
21
21
  Requires-Dist: duckdb-engine==0.13.5
22
22
  Requires-Dist: duckdb==1.1.3
23
23
  Requires-Dist: facebook-business==20.0.0
24
- Requires-Dist: google-analytics-data==0.18.15
24
+ Requires-Dist: google-analytics-data==0.18.16
25
25
  Requires-Dist: google-api-python-client==2.130.0
26
26
  Requires-Dist: google-cloud-bigquery-storage==2.24.0
27
27
  Requires-Dist: mysql-connector-python==9.1.0
@@ -34,7 +34,7 @@ Requires-Dist: pyathena==3.9.0
34
34
  Requires-Dist: pymongo==4.10.1
35
35
  Requires-Dist: pymysql==1.1.1
36
36
  Requires-Dist: pyrate-limiter==3.7.0
37
- Requires-Dist: redshift-connector==2.1.3
37
+ Requires-Dist: redshift-connector==2.1.5
38
38
  Requires-Dist: rich==13.9.4
39
39
  Requires-Dist: rudder-sdk-python==2.1.4
40
40
  Requires-Dist: s3fs==2024.10.0
@@ -57,8 +57,9 @@ class SpinnerCollector(Collector):
57
57
  name: str,
58
58
  inc: int = 1,
59
59
  total: Optional[int] = None,
60
- message: Optional[str] = None,
60
+ message: Optional[str] = None, # type: ignore
61
61
  label: str = "",
62
+ **kwargs,
62
63
  ) -> None:
63
64
  self.status.update(self.current_step)
64
65
 
@@ -1,7 +1,3 @@
1
- """Source that loads tables form Airtable.
2
- Supports whitelisting of tables or loading of all tables from a specified base.
3
- """
4
-
5
1
  from typing import Any, Optional
6
2
 
7
3
  import dlt
@@ -18,7 +18,6 @@ from urllib.parse import ParseResult, parse_qs, quote, urlparse
18
18
 
19
19
  import dlt
20
20
  import pendulum
21
- import sqlalchemy
22
21
  from dlt.common.configuration.specs import (
23
22
  AwsCredentials,
24
23
  )
@@ -42,7 +41,6 @@ from dlt.sources.sql_database.schema_types import (
42
41
  )
43
42
  from sqlalchemy import Column
44
43
  from sqlalchemy import types as sa
45
- from sqlalchemy.dialects import mysql
46
44
 
47
45
  from ingestr.src.adjust import REQUIRED_CUSTOM_DIMENSIONS, adjust_source
48
46
  from ingestr.src.adjust.adjust_helpers import parse_filters
@@ -67,6 +65,12 @@ from ingestr.src.mongodb import mongodb_collection
67
65
  from ingestr.src.notion import notion_databases
68
66
  from ingestr.src.shopify import shopify_source
69
67
  from ingestr.src.slack import slack_source
68
+ from ingestr.src.sql_database.callbacks import (
69
+ chained_query_adapter_callback,
70
+ custom_query_variable_subsitution,
71
+ limit_callback,
72
+ type_adapter_callback,
73
+ )
70
74
  from ingestr.src.stripe_analytics import stripe_source
71
75
  from ingestr.src.table_definition import TableDefinition, table_string_to_dataclass
72
76
  from ingestr.src.tiktok_ads import tiktok_source
@@ -103,21 +107,18 @@ class SqlSource:
103
107
  kwargs.get("incremental_key", ""),
104
108
  initial_value=start_value,
105
109
  end_value=end_value,
110
+ range_end="closed",
111
+ range_start="closed",
106
112
  )
107
113
 
108
114
  if uri.startswith("mysql://"):
109
115
  uri = uri.replace("mysql://", "mysql+pymysql://")
110
116
 
111
- reflection_level = kwargs.get("sql_reflection_level")
112
-
113
- query_adapter_callback = None
117
+ query_adapters = []
114
118
  if kwargs.get("sql_limit"):
115
-
116
- def query_adapter_callback(query, table):
117
- query = query.limit(kwargs.get("sql_limit"))
118
- if kwargs.get("incremental_key"):
119
- query = query.order_by(kwargs.get("incremental_key"))
120
- return query
119
+ query_adapters.append(
120
+ limit_callback(kwargs.get("sql_limit"), kwargs.get("incremental_key"))
121
+ )
121
122
 
122
123
  defer_table_reflect = False
123
124
  sql_backend = kwargs.get("sql_backend", "sqlalchemy")
@@ -196,38 +197,10 @@ class SqlSource:
196
197
  if getattr(engine, "may_dispose_after_use", False):
197
198
  engine.dispose()
198
199
 
199
- dlt.sources.sql_database.table_rows = table_rows
200
-
201
- def query_adapter_callback(query, table, incremental=None, engine=None):
202
- params = {}
203
- if incremental:
204
- params["interval_start"] = (
205
- incremental.last_value
206
- if incremental.last_value is not None
207
- else datetime(year=1, month=1, day=1)
208
- )
209
- if incremental.end_value is not None:
210
- params["interval_end"] = incremental.end_value
211
- else:
212
- if ":interval_start" in query_value:
213
- params["interval_start"] = (
214
- datetime.min
215
- if kwargs.get("interval_start") is None
216
- else kwargs.get("interval_start")
217
- )
218
- if ":interval_end" in query_value:
219
- params["interval_end"] = (
220
- datetime.max
221
- if kwargs.get("interval_end") is None
222
- else kwargs.get("interval_end")
223
- )
224
-
225
- return sqlalchemy.text(query_value).bindparams(**params)
200
+ dlt.sources.sql_database.table_rows = table_rows # type: ignore
226
201
 
227
- def type_adapter_callback(sql_type):
228
- if isinstance(sql_type, mysql.SET):
229
- return sa.JSON
230
- return sql_type
202
+ # override the query adapters, the only one we want is the one here in the case of custom queries
203
+ query_adapters = [custom_query_variable_subsitution(query_value, kwargs)]
231
204
 
232
205
  builder_res = self.table_builder(
233
206
  credentials=ConnectionStringCredentials(uri),
@@ -236,8 +209,8 @@ class SqlSource:
236
209
  incremental=incremental,
237
210
  backend=sql_backend,
238
211
  chunk_size=kwargs.get("page_size", None),
239
- reflection_level=reflection_level,
240
- query_adapter_callback=query_adapter_callback,
212
+ reflection_level=kwargs.get("sql_reflection_level", None),
213
+ query_adapter_callback=chained_query_adapter_callback(query_adapters),
241
214
  type_adapter_callback=type_adapter_callback,
242
215
  table_adapter_callback=table_adapter_exclude_columns(
243
216
  kwargs.get("sql_exclude_columns", [])
@@ -0,0 +1,66 @@
1
+ from datetime import datetime
2
+
3
+ from sqlalchemy import text
4
+ from sqlalchemy import types as sa
5
+ from sqlalchemy.dialects import mysql
6
+
7
+
8
+ def type_adapter_callback(sql_type):
9
+ if isinstance(sql_type, mysql.SET):
10
+ return sa.JSON
11
+ return sql_type
12
+
13
+
14
+ def chained_query_adapter_callback(query_adapters):
15
+ """
16
+ This function is used to chain multiple query adapters together,.
17
+ This gives us the flexibility to introduce various adapters based on the given command parameters.
18
+ """
19
+
20
+ def callback(query, table):
21
+ for adapter in query_adapters:
22
+ query = adapter(query, table)
23
+
24
+ return query
25
+
26
+ return callback
27
+
28
+
29
+ def limit_callback(sql_limit: int, incremental_key: str):
30
+ def callback(query, table):
31
+ query = query.limit(sql_limit)
32
+ if incremental_key:
33
+ query = query.order_by(incremental_key)
34
+ return query
35
+
36
+ return callback
37
+
38
+
39
+ def custom_query_variable_subsitution(query_value: str, kwargs: dict):
40
+ def callback(query, table, incremental=None, engine=None):
41
+ params = {}
42
+ if incremental:
43
+ params["interval_start"] = (
44
+ incremental.last_value
45
+ if incremental.last_value is not None
46
+ else datetime(year=1, month=1, day=1)
47
+ )
48
+ if incremental.end_value is not None:
49
+ params["interval_end"] = incremental.end_value
50
+ else:
51
+ if ":interval_start" in query_value:
52
+ params["interval_start"] = (
53
+ datetime.min
54
+ if kwargs.get("interval_start") is None
55
+ else kwargs.get("interval_start")
56
+ )
57
+ if ":interval_end" in query_value:
58
+ params["interval_end"] = (
59
+ datetime.max
60
+ if kwargs.get("interval_end") is None
61
+ else kwargs.get("interval_end")
62
+ )
63
+
64
+ return text(query_value).bindparams(**params)
65
+
66
+ return callback
@@ -0,0 +1 @@
1
+ __version__ = "0.12.5"
@@ -1,6 +1,6 @@
1
1
  confluent-kafka>=2.6.1
2
2
  databricks-sql-connector==2.9.3
3
- dlt==1.4.0
3
+ dlt==1.5.0
4
4
  duckdb_engine==0.13.5
5
5
  duckdb==1.1.3
6
6
  google-api-python-client==2.130.0
@@ -12,7 +12,7 @@ py-machineid==0.6.0
12
12
  pymongo==4.10.1
13
13
  pymysql==1.1.1
14
14
  pyrate-limiter==3.7.0
15
- redshift-connector==2.1.3
15
+ redshift-connector==2.1.5
16
16
  rich==13.9.4
17
17
  rudder-sdk-python==2.1.4
18
18
  snowflake-sqlalchemy==1.6.1
@@ -30,5 +30,5 @@ types-requests==2.32.0.20240907
30
30
  s3fs==2024.10.0
31
31
  pyarrow==18.1.0
32
32
  pyathena==3.9.0
33
- google-analytics-data==0.18.15
33
+ google-analytics-data==0.18.16
34
34
  asana==3.2.3
File without changes
@@ -1 +0,0 @@
1
- __version__ = "0.12.4"
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
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