ingestr 0.13.31__tar.gz → 0.13.33__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 (261) hide show
  1. {ingestr-0.13.31 → ingestr-0.13.33}/.gitignore +2 -1
  2. ingestr-0.13.33/.gitleaksignore +3 -0
  3. {ingestr-0.13.31 → ingestr-0.13.33}/PKG-INFO +1 -6
  4. {ingestr-0.13.31 → ingestr-0.13.33}/README.md +0 -5
  5. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/athena.md +9 -1
  6. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/bigquery.md +12 -0
  7. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/main.py +21 -51
  8. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/adjust/adjust_helpers.py +1 -1
  9. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/airtable/__init__.py +1 -1
  10. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/applovin_max/__init__.py +0 -1
  11. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/appsflyer/client.py +0 -1
  12. ingestr-0.13.33/ingestr/src/buildinfo.py +1 -0
  13. ingestr-0.13.33/ingestr/src/collector/spinner.py +43 -0
  14. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/destinations.py +51 -18
  15. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/filters.py +2 -3
  16. ingestr-0.13.31/ingestr/src/klaviyo/_init_.py → ingestr-0.13.33/ingestr/src/klaviyo/__init__.py +0 -1
  17. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/linkedin_ads/helpers.py +0 -1
  18. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/partition.py +2 -1
  19. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/sources.py +169 -90
  20. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/telemetry/event.py +10 -9
  21. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -1
  22. ingestr-0.13.31/.gitleaksignore +0 -3
  23. ingestr-0.13.31/ingestr/src/buildinfo.py +0 -1
  24. {ingestr-0.13.31 → ingestr-0.13.33}/.dockerignore +0 -0
  25. {ingestr-0.13.31 → ingestr-0.13.33}/.githooks/pre-commit-hook.sh +0 -0
  26. {ingestr-0.13.31 → ingestr-0.13.33}/.github/workflows/deploy-docs.yml +0 -0
  27. {ingestr-0.13.31 → ingestr-0.13.33}/.github/workflows/release.yml +0 -0
  28. {ingestr-0.13.31 → ingestr-0.13.33}/.github/workflows/secrets-scan.yml +0 -0
  29. {ingestr-0.13.31 → ingestr-0.13.33}/.github/workflows/tests.yml +0 -0
  30. {ingestr-0.13.31 → ingestr-0.13.33}/.python-version +0 -0
  31. {ingestr-0.13.31 → ingestr-0.13.33}/.vale.ini +0 -0
  32. {ingestr-0.13.31 → ingestr-0.13.33}/Dockerfile +0 -0
  33. {ingestr-0.13.31 → ingestr-0.13.33}/LICENSE.md +0 -0
  34. {ingestr-0.13.31 → ingestr-0.13.33}/Makefile +0 -0
  35. {ingestr-0.13.31 → ingestr-0.13.33}/docs/.vitepress/config.mjs +0 -0
  36. {ingestr-0.13.31 → ingestr-0.13.33}/docs/.vitepress/theme/custom.css +0 -0
  37. {ingestr-0.13.31 → ingestr-0.13.33}/docs/.vitepress/theme/index.js +0 -0
  38. {ingestr-0.13.31 → ingestr-0.13.33}/docs/commands/example-uris.md +0 -0
  39. {ingestr-0.13.31 → ingestr-0.13.33}/docs/commands/ingest.md +0 -0
  40. {ingestr-0.13.31 → ingestr-0.13.33}/docs/getting-started/core-concepts.md +0 -0
  41. {ingestr-0.13.31 → ingestr-0.13.33}/docs/getting-started/incremental-loading.md +0 -0
  42. {ingestr-0.13.31 → ingestr-0.13.33}/docs/getting-started/quickstart.md +0 -0
  43. {ingestr-0.13.31 → ingestr-0.13.33}/docs/getting-started/telemetry.md +0 -0
  44. {ingestr-0.13.31 → ingestr-0.13.33}/docs/index.md +0 -0
  45. {ingestr-0.13.31 → ingestr-0.13.33}/docs/media/applovin_max.png +0 -0
  46. {ingestr-0.13.31 → ingestr-0.13.33}/docs/media/athena.png +0 -0
  47. {ingestr-0.13.31 → ingestr-0.13.33}/docs/media/clickhouse_img.png +0 -0
  48. {ingestr-0.13.31 → ingestr-0.13.33}/docs/media/github.png +0 -0
  49. {ingestr-0.13.31 → ingestr-0.13.33}/docs/media/googleanalytics.png +0 -0
  50. {ingestr-0.13.31 → ingestr-0.13.33}/docs/media/kinesis.bigquery.png +0 -0
  51. {ingestr-0.13.31 → ingestr-0.13.33}/docs/media/linkedin_ads.png +0 -0
  52. {ingestr-0.13.31 → ingestr-0.13.33}/docs/media/personio.png +0 -0
  53. {ingestr-0.13.31 → ingestr-0.13.33}/docs/media/personio_duckdb.png +0 -0
  54. {ingestr-0.13.31 → ingestr-0.13.33}/docs/media/pipedrive.png +0 -0
  55. {ingestr-0.13.31 → ingestr-0.13.33}/docs/media/stripe_postgres.png +0 -0
  56. {ingestr-0.13.31 → ingestr-0.13.33}/docs/media/tiktok.png +0 -0
  57. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/adjust.md +0 -0
  58. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/airtable.md +0 -0
  59. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/applovin.md +0 -0
  60. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/applovin_max.md +0 -0
  61. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/appsflyer.md +0 -0
  62. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/appstore.md +0 -0
  63. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/asana.md +0 -0
  64. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/chess.md +0 -0
  65. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/clickhouse.md +0 -0
  66. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/csv.md +0 -0
  67. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/custom_queries.md +0 -0
  68. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/databricks.md +0 -0
  69. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/db2.md +0 -0
  70. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/duckdb.md +0 -0
  71. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/dynamodb.md +0 -0
  72. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/facebook-ads.md +0 -0
  73. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/frankfurter.md +0 -0
  74. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/gcs.md +0 -0
  75. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/github.md +0 -0
  76. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/google-ads.md +0 -0
  77. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/google_analytics.md +0 -0
  78. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/gorgias.md +0 -0
  79. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/gsheets.md +0 -0
  80. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/hubspot.md +0 -0
  81. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/kafka.md +0 -0
  82. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/kinesis.md +0 -0
  83. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/klaviyo.md +0 -0
  84. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/linkedin_ads.md +0 -0
  85. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/mongodb.md +0 -0
  86. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/mssql.md +0 -0
  87. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/mysql.md +0 -0
  88. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/notion.md +0 -0
  89. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/oracle.md +0 -0
  90. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/personio.md +0 -0
  91. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/pipedrive.md +0 -0
  92. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/postgres.md +0 -0
  93. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/redshift.md +0 -0
  94. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/s3.md +0 -0
  95. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/salesforce.md +0 -0
  96. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/sap-hana.md +0 -0
  97. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/shopify.md +0 -0
  98. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/slack.md +0 -0
  99. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/snowflake.md +0 -0
  100. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/sqlite.md +0 -0
  101. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/stripe.md +0 -0
  102. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/tiktok-ads.md +0 -0
  103. {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/zendesk.md +0 -0
  104. {ingestr-0.13.31 → ingestr-0.13.33}/docs/tutorials/load-kinesis-bigquery.md +0 -0
  105. {ingestr-0.13.31 → ingestr-0.13.33}/docs/tutorials/load-personio-duckdb.md +0 -0
  106. {ingestr-0.13.31 → ingestr-0.13.33}/docs/tutorials/load-stripe-postgres.md +0 -0
  107. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/conftest.py +0 -0
  108. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/.gitignore +0 -0
  109. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/adjust/__init__.py +0 -0
  110. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/applovin/__init__.py +0 -0
  111. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/appsflyer/__init__.py +0 -0
  112. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/appstore/__init__.py +0 -0
  113. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/appstore/client.py +0 -0
  114. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/appstore/errors.py +0 -0
  115. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/appstore/models.py +0 -0
  116. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/appstore/resources.py +0 -0
  117. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/arrow/__init__.py +0 -0
  118. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/asana_source/__init__.py +0 -0
  119. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/asana_source/helpers.py +0 -0
  120. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/asana_source/settings.py +0 -0
  121. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/blob.py +0 -0
  122. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/chess/__init__.py +0 -0
  123. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/chess/helpers.py +0 -0
  124. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/chess/settings.py +0 -0
  125. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/dynamodb/__init__.py +0 -0
  126. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/errors.py +0 -0
  127. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/facebook_ads/__init__.py +0 -0
  128. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/facebook_ads/exceptions.py +0 -0
  129. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/facebook_ads/helpers.py +0 -0
  130. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/facebook_ads/settings.py +0 -0
  131. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/factory.py +0 -0
  132. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/filesystem/__init__.py +0 -0
  133. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/filesystem/helpers.py +0 -0
  134. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/filesystem/readers.py +0 -0
  135. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/frankfurter/__init__.py +0 -0
  136. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/frankfurter/helpers.py +0 -0
  137. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/github/__init__.py +0 -0
  138. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/github/helpers.py +0 -0
  139. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/github/queries.py +0 -0
  140. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/github/settings.py +0 -0
  141. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/google_ads/__init__.py +0 -0
  142. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/google_ads/field.py +0 -0
  143. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/google_ads/metrics.py +0 -0
  144. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/google_ads/predicates.py +0 -0
  145. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/google_ads/reports.py +0 -0
  146. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/google_analytics/__init__.py +0 -0
  147. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/google_analytics/helpers.py +0 -0
  148. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/google_sheets/README.md +0 -0
  149. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/google_sheets/__init__.py +0 -0
  150. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
  151. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
  152. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
  153. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/gorgias/__init__.py +0 -0
  154. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/gorgias/helpers.py +0 -0
  155. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/hubspot/__init__.py +0 -0
  156. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/hubspot/helpers.py +0 -0
  157. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/hubspot/settings.py +0 -0
  158. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/kafka/__init__.py +0 -0
  159. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/kafka/helpers.py +0 -0
  160. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/kinesis/__init__.py +0 -0
  161. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/kinesis/helpers.py +0 -0
  162. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/klaviyo/client.py +0 -0
  163. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/klaviyo/helpers.py +0 -0
  164. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/linkedin_ads/__init__.py +0 -0
  165. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
  166. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/loader.py +0 -0
  167. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/mongodb/__init__.py +0 -0
  168. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/mongodb/helpers.py +0 -0
  169. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/notion/__init__.py +0 -0
  170. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/notion/helpers/__init__.py +0 -0
  171. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/notion/helpers/client.py +0 -0
  172. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/notion/helpers/database.py +0 -0
  173. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/notion/settings.py +0 -0
  174. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/personio/__init__.py +0 -0
  175. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/personio/helpers.py +0 -0
  176. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/pipedrive/__init__.py +0 -0
  177. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/pipedrive/helpers/__init__.py +0 -0
  178. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/pipedrive/helpers/custom_fields_munger.py +0 -0
  179. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/pipedrive/helpers/pages.py +0 -0
  180. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/pipedrive/settings.py +0 -0
  181. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/pipedrive/typing.py +0 -0
  182. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/resource.py +0 -0
  183. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/salesforce/__init__.py +0 -0
  184. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/salesforce/helpers.py +0 -0
  185. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/shopify/__init__.py +0 -0
  186. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/shopify/exceptions.py +0 -0
  187. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/shopify/helpers.py +0 -0
  188. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/shopify/settings.py +0 -0
  189. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/slack/__init__.py +0 -0
  190. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/slack/helpers.py +0 -0
  191. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/slack/settings.py +0 -0
  192. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/sql_database/__init__.py +0 -0
  193. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/sql_database/callbacks.py +0 -0
  194. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/stripe_analytics/__init__.py +0 -0
  195. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/stripe_analytics/helpers.py +0 -0
  196. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/stripe_analytics/settings.py +0 -0
  197. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/table_definition.py +0 -0
  198. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/testdata/fakebqcredentials.json +0 -0
  199. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/tiktok_ads/__init__.py +0 -0
  200. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/time.py +0 -0
  201. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/version.py +0 -0
  202. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/zendesk/__init__.py +0 -0
  203. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/zendesk/helpers/__init__.py +0 -0
  204. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
  205. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/zendesk/helpers/credentials.py +0 -0
  206. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
  207. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/zendesk/settings.py +0 -0
  208. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/testdata/.gitignore +0 -0
  209. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/testdata/create_replace.csv +0 -0
  210. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/testdata/delete_insert_expected.csv +0 -0
  211. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/testdata/delete_insert_part1.csv +0 -0
  212. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/testdata/delete_insert_part2.csv +0 -0
  213. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/testdata/merge_expected.csv +0 -0
  214. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/testdata/merge_part1.csv +0 -0
  215. {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/testdata/merge_part2.csv +0 -0
  216. {ingestr-0.13.31 → ingestr-0.13.33}/package-lock.json +0 -0
  217. {ingestr-0.13.31 → ingestr-0.13.33}/package.json +0 -0
  218. {ingestr-0.13.31 → ingestr-0.13.33}/pyproject.toml +0 -0
  219. {ingestr-0.13.31 → ingestr-0.13.33}/requirements-dev.txt +0 -0
  220. {ingestr-0.13.31 → ingestr-0.13.33}/requirements.in +0 -0
  221. {ingestr-0.13.31 → ingestr-0.13.33}/requirements.txt +0 -0
  222. {ingestr-0.13.31 → ingestr-0.13.33}/requirements_arm64.txt +0 -0
  223. {ingestr-0.13.31 → ingestr-0.13.33}/resources/demo.gif +0 -0
  224. {ingestr-0.13.31 → ingestr-0.13.33}/resources/demo.tape +0 -0
  225. {ingestr-0.13.31 → ingestr-0.13.33}/resources/ingestr.svg +0 -0
  226. {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/AMPM.yml +0 -0
  227. {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Acronyms.yml +0 -0
  228. {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Colons.yml +0 -0
  229. {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Contractions.yml +0 -0
  230. {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/DateFormat.yml +0 -0
  231. {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Ellipses.yml +0 -0
  232. {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/EmDash.yml +0 -0
  233. {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Exclamation.yml +0 -0
  234. {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/FirstPerson.yml +0 -0
  235. {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Gender.yml +0 -0
  236. {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/GenderBias.yml +0 -0
  237. {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/HeadingPunctuation.yml +0 -0
  238. {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Headings.yml +0 -0
  239. {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Latin.yml +0 -0
  240. {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/LyHyphens.yml +0 -0
  241. {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/OptionalPlurals.yml +0 -0
  242. {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Ordinal.yml +0 -0
  243. {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/OxfordComma.yml +0 -0
  244. {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Parens.yml +0 -0
  245. {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Passive.yml +0 -0
  246. {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Periods.yml +0 -0
  247. {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Quotes.yml +0 -0
  248. {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Ranges.yml +0 -0
  249. {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Semicolons.yml +0 -0
  250. {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Slang.yml +0 -0
  251. {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Spacing.yml +0 -0
  252. {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Spelling.yml +0 -0
  253. {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Units.yml +0 -0
  254. {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/We.yml +0 -0
  255. {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Will.yml +0 -0
  256. {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/WordList.yml +0 -0
  257. {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/meta.json +0 -0
  258. {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/vocab.txt +0 -0
  259. {ingestr-0.13.31 → ingestr-0.13.33}/styles/bruin/Ingestr.yml +0 -0
  260. {ingestr-0.13.31 → ingestr-0.13.33}/styles/config/vocabularies/bruin/accept.txt +0 -0
  261. {ingestr-0.13.31 → ingestr-0.13.33}/test.env.template +0 -0
@@ -21,4 +21,5 @@ node_modules
21
21
  *.db.wal
22
22
  *.sql
23
23
  ingest.sh
24
- test.env
24
+ test.env
25
+ *.log
@@ -0,0 +1,3 @@
1
+ ingestr/src/telemetry/event.py:generic-api-key:17
2
+ ingestr/src/testdata/fakebqcredentials.json:private-key:5
3
+ docs/supported-sources/shopify.md:generic-api-key:26
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ingestr
3
- Version: 0.13.31
3
+ Version: 0.13.33
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
@@ -419,11 +419,6 @@ Pull requests are welcome. However, please open an issue first to discuss what y
419
419
  <td>Google Analytics</td>
420
420
  <td>✅</td>
421
421
  <td>-</td>
422
- </tr>
423
- <tr>
424
- <td>Intercom</td>
425
- <td>✅</td>
426
- <td>-</td>
427
422
  </tr>
428
423
  <tr>
429
424
  <td>Klaviyo</td>
@@ -222,11 +222,6 @@ Pull requests are welcome. However, please open an issue first to discuss what y
222
222
  <td>Google Analytics</td>
223
223
  <td>✅</td>
224
224
  <td>-</td>
225
- </tr>
226
- <tr>
227
- <td>Intercom</td>
228
- <td>✅</td>
229
- <td>-</td>
230
225
  </tr>
231
226
  <tr>
232
227
  <td>Klaviyo</td>
@@ -18,9 +18,17 @@ athena://?bucket=<your-destination-bucket> \
18
18
  URI parameters:
19
19
  - `bucket` (required): The name of the bucket where the data will be stored, containing the Parquet files that Athena will work with, e.g. `your_bucket_name` or `s3://your_bucket_name`.
20
20
  - `access_key_id` and `secret_access_key` (required): These are AWS credentials that will be used to authenticate with AWS services like S3 and Athena.
21
- - `region_name` (required): The AWS region of the Athena service and S3 buckets, e.g. `eu-central-1`
21
+ - `session_token` (optional): The session token for temporary credentials.
22
+ - `region_name` (required if there's no local profile found): The AWS region of the Athena service and S3 buckets, e.g. `eu-central-1`
22
23
  - `query_results_path` (optional): The query location path where the results of Athena queries will be saved, e.g. `dest_path` or `s3://dest_path`. If not provided, it will default to the bucket specified in the `bucket` parameter.
23
24
  - `workgroup` (optional): The name of the Athena workgroup, e.g. `my_group`
25
+ - `profile` (optional): The name of the AWS profile to use, e.g. `my_profile`
26
+
27
+ You have two ways of providing credentials:
28
+ 1. Provide `access_key_id` and `secret_access_key` directly in the URI.
29
+ 2. Provide the name of the AWS profile to use in the `profile` parameter.
30
+
31
+ If there's no access key and secret key provided, ingestr will try to find the credentials in the local AWS credentials file.
24
32
 
25
33
  ## Setting up an Athena Integration
26
34
  Athena requires a `bucket`, `access_key_id`, `secret_access_key` and `region_name` to access the S3 bucket. Please follow the guide on dltHub to obtain [credentials](https://dlthub.com/docs/dlt-ecosystem/destinations/athena#2-setup-bucket-storage-and-athena-credentials). Once you've completed the guide, you should have all the above-mentioned credentials.
@@ -17,4 +17,16 @@ URI parameters:
17
17
 
18
18
  The same URI structure can be used both for sources and destinations. You can read more about SQLAlchemy's BigQuery dialect [here](https://github.com/googleapis/python-bigquery-sqlalchemy?tab=readme-ov-file#connection-string-parameters).
19
19
 
20
+ ### Using GCS as a staging area
21
+
22
+ ingestr can use GCS as a staging area for BigQuery. To do this, you need to set the `--staging-bucket` flag when you are running the command.
23
+
24
+ ```bash
25
+ ingestr ingest
26
+ --source-uri $SOURCE_URI
27
+ --dest-uri $BIGQUERY_URI
28
+ --source-table raw.input
29
+ --dest-table raw.output
30
+ --staging-bucket "gs://your-bucket-name" # [!code focus]
31
+ ```
20
32
 
@@ -3,15 +3,9 @@ from enum import Enum
3
3
  from typing import Optional
4
4
 
5
5
  import typer
6
- from dlt.common.runtime.collector import Collector
7
6
  from rich.console import Console
8
- from rich.status import Status
9
7
  from typing_extensions import Annotated
10
8
 
11
- import ingestr.src.partition as partition
12
- import ingestr.src.resource as resource
13
- from ingestr.src.destinations import AthenaDestination
14
- from ingestr.src.filters import cast_set_to_list, handle_mysql_empty_dates
15
9
  from ingestr.src.telemetry.event import track
16
10
 
17
11
  app = typer.Typer(
@@ -46,45 +40,6 @@ PARQUET_SUPPORTED_DESTINATIONS = [
46
40
  JSON_RETURNING_SOURCES = ["notion"]
47
41
 
48
42
 
49
- class SpinnerCollector(Collector):
50
- status: Status
51
- current_step: str
52
- started: bool
53
-
54
- def __init__(self) -> None:
55
- self.status = Status("Ingesting data...", spinner="dots")
56
- self.started = False
57
-
58
- def update(
59
- self,
60
- name: str,
61
- inc: int = 1,
62
- total: Optional[int] = None,
63
- message: Optional[str] = None, # type: ignore
64
- label: str = "",
65
- **kwargs,
66
- ) -> None:
67
- self.status.update(self.current_step)
68
-
69
- def _start(self, step: str) -> None:
70
- self.current_step = self.__step_to_label(step)
71
- self.status.start()
72
-
73
- def __step_to_label(self, step: str) -> str:
74
- verb = step.split(" ")[0].lower()
75
- if verb.startswith("normalize"):
76
- return "Normalizing the data"
77
- elif verb.startswith("load"):
78
- return "Loading the data to the destination"
79
- elif verb.startswith("extract"):
80
- return "Extracting the data from the source"
81
-
82
- return f"{verb.capitalize()} the data"
83
-
84
- def _stop(self) -> None:
85
- self.status.stop()
86
-
87
-
88
43
  class IncrementalStrategy(str, Enum):
89
44
  create_replace = "replace"
90
45
  append = "append"
@@ -309,6 +264,13 @@ def ingest(
309
264
  envvar=["YIELD_LIMIT", "INGESTR_YIELD_LIMIT"],
310
265
  ),
311
266
  ] = None, # type: ignore
267
+ staging_bucket: Annotated[
268
+ Optional[str],
269
+ typer.Option(
270
+ help="The staging bucket to be used for the ingestion, must be prefixed with 'gs://' or 's3://'",
271
+ envvar=["STAGING_BUCKET", "INGESTR_STAGING_BUCKET"],
272
+ ),
273
+ ] = None, # type: ignore
312
274
  ):
313
275
  import hashlib
314
276
  import tempfile
@@ -317,14 +279,16 @@ def ingest(
317
279
  import dlt
318
280
  import humanize
319
281
  import typer
320
- from dlt.common.data_types import TDataType
321
- from dlt.common.destination import Destination
322
282
  from dlt.common.pipeline import LoadInfo
323
283
  from dlt.common.runtime.collector import Collector, LogCollector
324
284
  from dlt.common.schema.typing import TColumnSchema
325
285
 
286
+ import ingestr.src.partition as partition
287
+ import ingestr.src.resource as resource
288
+ from ingestr.src.collector.spinner import SpinnerCollector
289
+ from ingestr.src.destinations import AthenaDestination
326
290
  from ingestr.src.factory import SourceDestinationFactory
327
- from ingestr.src.telemetry.event import track
291
+ from ingestr.src.filters import cast_set_to_list, handle_mysql_empty_dates
328
292
 
329
293
  def report_errors(run_info: LoadInfo):
330
294
  for load_package in run_info.load_packages:
@@ -359,7 +323,7 @@ def ingest(
359
323
  return (source_table, dest_table)
360
324
 
361
325
  def validate_loader_file_format(
362
- dlt_dest: Destination, loader_file_format: Optional[LoaderFileFormat]
326
+ dlt_dest, loader_file_format: Optional[LoaderFileFormat]
363
327
  ):
364
328
  if (
365
329
  loader_file_format
@@ -371,9 +335,11 @@ def ingest(
371
335
  )
372
336
  raise typer.Abort()
373
337
 
374
- def parse_columns(columns: list[str]) -> dict[str, TDataType]:
338
+ def parse_columns(columns: list[str]) -> dict:
375
339
  from typing import cast, get_args
376
340
 
341
+ from dlt.common.data_types import TDataType
342
+
377
343
  possible_types = get_args(TDataType)
378
344
 
379
345
  types: dict[str, TDataType] = {}
@@ -406,6 +372,7 @@ def ingest(
406
372
  dlt.config["data_writer.file_max_items"] = loader_file_size
407
373
  dlt.config["extract.workers"] = extract_parallelism
408
374
  dlt.config["extract.max_parallel_items"] = extract_parallelism
375
+ dlt.config["load.raise_on_max_retries"] = 15
409
376
  if schema_naming != SchemaNaming.default:
410
377
  dlt.config["schema.naming"] = schema_naming.value
411
378
 
@@ -457,7 +424,9 @@ def ingest(
457
424
  pipelines_dir = tempfile.mkdtemp()
458
425
  is_pipelines_dir_temp = True
459
426
 
460
- dlt_dest = destination.dlt_dest(uri=dest_uri, dest_table=dest_table)
427
+ dlt_dest = destination.dlt_dest(
428
+ uri=dest_uri, dest_table=dest_table, staging_bucket=staging_bucket
429
+ )
461
430
  validate_loader_file_format(dlt_dest, loader_file_format)
462
431
 
463
432
  if partition_by:
@@ -606,6 +575,7 @@ def ingest(
606
575
  **destination.dlt_run_params(
607
576
  uri=dest_uri,
608
577
  table=dest_table,
578
+ staging_bucket=staging_bucket,
609
579
  ),
610
580
  write_disposition=write_disposition, # type: ignore
611
581
  primary_key=(primary_key if primary_key and len(primary_key) > 0 else None), # type: ignore
@@ -36,7 +36,7 @@ class AdjustAPI:
36
36
  def __init__(self, api_key):
37
37
  self.api_key = api_key
38
38
  self.request_client = Client(
39
- request_timeout=8.0,
39
+ request_timeout=1000, # Adjust support recommends 1000 seconds of read timeout.
40
40
  raise_for_status=False,
41
41
  retry_condition=retry_on_limit,
42
42
  request_max_attempts=12,
@@ -55,7 +55,7 @@ def airtable_resource(
55
55
  field for field in table["fields"] if field["id"] == primary_key_id
56
56
  ][0]
57
57
  table_name: str = table["name"]
58
- primary_key: List[str] = [primary_key_field["name"]]
58
+ primary_key: List[str] = [f"fields__{primary_key_field['name']}"]
59
59
  air_table = api.table(base_id, table["id"])
60
60
 
61
61
  # Table.iterate() supports rich customization options, such as chunk size, fields, cell format, timezone, locale, and view
@@ -68,7 +68,6 @@ def applovin_max_source(
68
68
 
69
69
  def create_client() -> requests.Session:
70
70
  return Client(
71
- request_timeout=10.0,
72
71
  raise_for_status=False,
73
72
  retry_condition=retry_on_limit,
74
73
  request_max_attempts=12,
@@ -46,7 +46,6 @@ class AppsflyerClient:
46
46
  )
47
47
 
48
48
  request_client = Client(
49
- request_timeout=10.0,
50
49
  raise_for_status=False,
51
50
  retry_condition=retry_on_limit,
52
51
  request_max_attempts=12,
@@ -0,0 +1 @@
1
+ version = "v0.13.33"
@@ -0,0 +1,43 @@
1
+ from typing import Optional
2
+
3
+ from dlt.common.runtime.collector import Collector
4
+ from rich.status import Status
5
+
6
+
7
+ class SpinnerCollector(Collector):
8
+ status: Status
9
+ current_step: str
10
+ started: bool
11
+
12
+ def __init__(self) -> None:
13
+ self.status = Status("Ingesting data...", spinner="dots")
14
+ self.started = False
15
+
16
+ def update(
17
+ self,
18
+ name: str,
19
+ inc: int = 1,
20
+ total: Optional[int] = None,
21
+ message: Optional[str] = None, # type: ignore
22
+ label: str = "",
23
+ **kwargs,
24
+ ) -> None:
25
+ self.status.update(self.current_step)
26
+
27
+ def _start(self, step: str) -> None:
28
+ self.current_step = self.__step_to_label(step)
29
+ self.status.start()
30
+
31
+ def __step_to_label(self, step: str) -> str:
32
+ verb = step.split(" ")[0].lower()
33
+ if verb.startswith("normalize"):
34
+ return "Normalizing the data"
35
+ elif verb.startswith("load"):
36
+ return "Loading the data to the destination"
37
+ elif verb.startswith("extract"):
38
+ return "Extracting the data from the source"
39
+
40
+ return f"{verb.capitalize()} the data"
41
+
42
+ def _stop(self) -> None:
43
+ self.status.stop()
@@ -60,6 +60,22 @@ class BigQueryDestination:
60
60
  base64.b64decode(credentials_base64[0]).decode("utf-8")
61
61
  )
62
62
 
63
+ staging_bucket = kwargs.get("staging_bucket", None)
64
+ if staging_bucket:
65
+ if not staging_bucket.startswith("gs://"):
66
+ raise ValueError("Staging bucket must start with gs://")
67
+
68
+ os.environ["DESTINATION__FILESYSTEM__BUCKET_URL"] = staging_bucket
69
+ os.environ["DESTINATION__FILESYSTEM__CREDENTIALS__PROJECT_ID"] = (
70
+ credentials.get("project_id", None)
71
+ )
72
+ os.environ["DESTINATION__FILESYSTEM__CREDENTIALS__PRIVATE_KEY"] = (
73
+ credentials.get("private_key", None)
74
+ )
75
+ os.environ["DESTINATION__FILESYSTEM__CREDENTIALS__CLIENT_EMAIL"] = (
76
+ credentials.get("client_email", None)
77
+ )
78
+
63
79
  project_id = None
64
80
  if source_fields.hostname:
65
81
  project_id = source_fields.hostname
@@ -83,6 +99,10 @@ class BigQueryDestination:
83
99
  "table_name": table_fields[-1],
84
100
  }
85
101
 
102
+ staging_bucket = kwargs.get("staging_bucket", None)
103
+ if staging_bucket:
104
+ res["staging"] = "filesystem"
105
+
86
106
  return res
87
107
 
88
108
  def post_load(self):
@@ -223,34 +243,47 @@ class AthenaDestination:
223
243
  query_result_path = bucket
224
244
 
225
245
  access_key_id = source_params.get("access_key_id", [None])[0]
226
- if not access_key_id:
227
- raise ValueError("The AWS access_key_id is required to connect to Athena.")
228
-
229
246
  secret_access_key = source_params.get("secret_access_key", [None])[0]
230
- if not secret_access_key:
231
- raise ValueError("The AWS secret_access_key is required to connect Athena")
247
+ session_token = source_params.get("session_token", [None])[0]
248
+ profile_name = source_params.get("profile", ["default"])[0]
249
+ region_name = source_params.get("region_name", [None])[0]
232
250
 
233
- work_group = source_params.get("workgroup", [None])[0]
251
+ if not access_key_id and not secret_access_key:
252
+ import botocore.session # type: ignore
253
+
254
+ session = botocore.session.Session(profile=profile_name)
255
+ default = session.get_credentials()
256
+ if not profile_name:
257
+ raise ValueError(
258
+ "You have to either provide access_key_id and secret_access_key pair or a valid AWS profile name."
259
+ )
260
+ access_key_id = default.access_key
261
+ secret_access_key = default.secret_key
262
+ session_token = default.token
263
+ if region_name is None:
264
+ region_name = session.get_config_variable("region")
234
265
 
235
- region_name = source_params.get("region_name", [None])[0]
236
266
  if not region_name:
237
267
  raise ValueError("The region_name is required to connect to Athena.")
238
268
 
239
269
  os.environ["DESTINATION__BUCKET_URL"] = bucket
240
- os.environ["DESTINATION__CREDENTIALS__AWS_ACCESS_KEY_ID"] = access_key_id
241
- os.environ["DESTINATION__CREDENTIALS__AWS_SECRET_ACCESS_KEY"] = (
242
- secret_access_key
243
- )
270
+ if access_key_id and secret_access_key:
271
+ os.environ["DESTINATION__CREDENTIALS__AWS_ACCESS_KEY_ID"] = access_key_id
272
+ os.environ["DESTINATION__CREDENTIALS__AWS_SECRET_ACCESS_KEY"] = (
273
+ secret_access_key
274
+ )
275
+ if session_token:
276
+ os.environ["DESTINATION__CREDENTIALS__AWS_SESSION_TOKEN"] = session_token
244
277
 
245
- credentials = AwsCredentials(
246
- aws_access_key_id=access_key_id,
247
- aws_secret_access_key=secret_access_key,
248
- region_name=region_name,
249
- )
250
278
  return dlt.destinations.athena(
251
279
  query_result_bucket=query_result_path,
252
- athena_work_group=work_group,
253
- credentials=credentials,
280
+ athena_work_group=source_params.get("workgroup", [None])[0],
281
+ credentials=AwsCredentials(
282
+ aws_access_key_id=access_key_id, # type: ignore
283
+ aws_secret_access_key=secret_access_key, # type: ignore
284
+ aws_session_token=session_token,
285
+ region_name=region_name,
286
+ ),
254
287
  destination_name=bucket,
255
288
  )
256
289
 
@@ -1,6 +1,3 @@
1
- from dlt.common.libs.sql_alchemy import Table
2
-
3
-
4
1
  def cast_set_to_list(row):
5
2
  # this handles just the sqlalchemy backend for now
6
3
  if isinstance(row, dict):
@@ -32,6 +29,8 @@ def handle_mysql_empty_dates(row):
32
29
 
33
30
 
34
31
  def table_adapter_exclude_columns(cols: list[str]):
32
+ from dlt.common.libs.sql_alchemy import Table
33
+
35
34
  def excluder(table: Table):
36
35
  cols_to_remove = [col for col in table._columns if col.name in cols] # type: ignore
37
36
  for col in cols_to_remove:
@@ -18,7 +18,6 @@ def retry_on_limit(response: requests.Response, exception: BaseException) -> boo
18
18
 
19
19
  def create_client() -> requests.Session:
20
20
  return Client(
21
- request_timeout=10.0,
22
21
  raise_for_status=False,
23
22
  retry_condition=retry_on_limit,
24
23
  request_max_attempts=12,
@@ -18,7 +18,6 @@ def retry_on_limit(
18
18
 
19
19
  def create_client() -> requests.Session:
20
20
  return Client(
21
- request_timeout=10.0,
22
21
  raise_for_status=False,
23
22
  retry_condition=retry_on_limit,
24
23
  request_max_attempts=12,
@@ -1,7 +1,6 @@
1
1
  from typing import Dict
2
2
 
3
3
  from dlt.common.schema.typing import TColumnSchema
4
- from dlt.destinations.adapters import athena_adapter, athena_partition
5
4
  from dlt.sources import DltResource, DltSource
6
5
 
7
6
  import ingestr.src.resource as resource
@@ -12,6 +11,8 @@ def apply_athena_hints(
12
11
  partition_column: str,
13
12
  additional_hints: Dict[str, TColumnSchema] = {},
14
13
  ) -> None:
14
+ from dlt.destinations.adapters import athena_adapter, athena_partition
15
+
15
16
  def _apply_partition_hint(resource: DltResource) -> None:
16
17
  columns = resource.columns if resource.columns else {}
17
18