ingestr 0.13.32__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.33/.gitleaksignore +3 -0
  2. {ingestr-0.13.32 → ingestr-0.13.33}/PKG-INFO +1 -1
  3. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/bigquery.md +12 -0
  4. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/main.py +15 -5
  5. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/airtable/__init__.py +1 -1
  6. ingestr-0.13.33/ingestr/src/buildinfo.py +1 -0
  7. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/destinations.py +20 -0
  8. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/filters.py +2 -3
  9. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/partition.py +2 -1
  10. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/sources.py +131 -76
  11. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/telemetry/event.py +10 -9
  12. ingestr-0.13.32/.gitleaksignore +0 -3
  13. ingestr-0.13.32/ingestr/src/buildinfo.py +0 -1
  14. {ingestr-0.13.32 → ingestr-0.13.33}/.dockerignore +0 -0
  15. {ingestr-0.13.32 → ingestr-0.13.33}/.githooks/pre-commit-hook.sh +0 -0
  16. {ingestr-0.13.32 → ingestr-0.13.33}/.github/workflows/deploy-docs.yml +0 -0
  17. {ingestr-0.13.32 → ingestr-0.13.33}/.github/workflows/release.yml +0 -0
  18. {ingestr-0.13.32 → ingestr-0.13.33}/.github/workflows/secrets-scan.yml +0 -0
  19. {ingestr-0.13.32 → ingestr-0.13.33}/.github/workflows/tests.yml +0 -0
  20. {ingestr-0.13.32 → ingestr-0.13.33}/.gitignore +0 -0
  21. {ingestr-0.13.32 → ingestr-0.13.33}/.python-version +0 -0
  22. {ingestr-0.13.32 → ingestr-0.13.33}/.vale.ini +0 -0
  23. {ingestr-0.13.32 → ingestr-0.13.33}/Dockerfile +0 -0
  24. {ingestr-0.13.32 → ingestr-0.13.33}/LICENSE.md +0 -0
  25. {ingestr-0.13.32 → ingestr-0.13.33}/Makefile +0 -0
  26. {ingestr-0.13.32 → ingestr-0.13.33}/README.md +0 -0
  27. {ingestr-0.13.32 → ingestr-0.13.33}/docs/.vitepress/config.mjs +0 -0
  28. {ingestr-0.13.32 → ingestr-0.13.33}/docs/.vitepress/theme/custom.css +0 -0
  29. {ingestr-0.13.32 → ingestr-0.13.33}/docs/.vitepress/theme/index.js +0 -0
  30. {ingestr-0.13.32 → ingestr-0.13.33}/docs/commands/example-uris.md +0 -0
  31. {ingestr-0.13.32 → ingestr-0.13.33}/docs/commands/ingest.md +0 -0
  32. {ingestr-0.13.32 → ingestr-0.13.33}/docs/getting-started/core-concepts.md +0 -0
  33. {ingestr-0.13.32 → ingestr-0.13.33}/docs/getting-started/incremental-loading.md +0 -0
  34. {ingestr-0.13.32 → ingestr-0.13.33}/docs/getting-started/quickstart.md +0 -0
  35. {ingestr-0.13.32 → ingestr-0.13.33}/docs/getting-started/telemetry.md +0 -0
  36. {ingestr-0.13.32 → ingestr-0.13.33}/docs/index.md +0 -0
  37. {ingestr-0.13.32 → ingestr-0.13.33}/docs/media/applovin_max.png +0 -0
  38. {ingestr-0.13.32 → ingestr-0.13.33}/docs/media/athena.png +0 -0
  39. {ingestr-0.13.32 → ingestr-0.13.33}/docs/media/clickhouse_img.png +0 -0
  40. {ingestr-0.13.32 → ingestr-0.13.33}/docs/media/github.png +0 -0
  41. {ingestr-0.13.32 → ingestr-0.13.33}/docs/media/googleanalytics.png +0 -0
  42. {ingestr-0.13.32 → ingestr-0.13.33}/docs/media/kinesis.bigquery.png +0 -0
  43. {ingestr-0.13.32 → ingestr-0.13.33}/docs/media/linkedin_ads.png +0 -0
  44. {ingestr-0.13.32 → ingestr-0.13.33}/docs/media/personio.png +0 -0
  45. {ingestr-0.13.32 → ingestr-0.13.33}/docs/media/personio_duckdb.png +0 -0
  46. {ingestr-0.13.32 → ingestr-0.13.33}/docs/media/pipedrive.png +0 -0
  47. {ingestr-0.13.32 → ingestr-0.13.33}/docs/media/stripe_postgres.png +0 -0
  48. {ingestr-0.13.32 → ingestr-0.13.33}/docs/media/tiktok.png +0 -0
  49. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/adjust.md +0 -0
  50. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/airtable.md +0 -0
  51. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/applovin.md +0 -0
  52. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/applovin_max.md +0 -0
  53. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/appsflyer.md +0 -0
  54. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/appstore.md +0 -0
  55. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/asana.md +0 -0
  56. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/athena.md +0 -0
  57. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/chess.md +0 -0
  58. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/clickhouse.md +0 -0
  59. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/csv.md +0 -0
  60. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/custom_queries.md +0 -0
  61. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/databricks.md +0 -0
  62. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/db2.md +0 -0
  63. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/duckdb.md +0 -0
  64. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/dynamodb.md +0 -0
  65. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/facebook-ads.md +0 -0
  66. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/frankfurter.md +0 -0
  67. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/gcs.md +0 -0
  68. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/github.md +0 -0
  69. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/google-ads.md +0 -0
  70. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/google_analytics.md +0 -0
  71. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/gorgias.md +0 -0
  72. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/gsheets.md +0 -0
  73. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/hubspot.md +0 -0
  74. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/kafka.md +0 -0
  75. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/kinesis.md +0 -0
  76. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/klaviyo.md +0 -0
  77. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/linkedin_ads.md +0 -0
  78. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/mongodb.md +0 -0
  79. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/mssql.md +0 -0
  80. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/mysql.md +0 -0
  81. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/notion.md +0 -0
  82. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/oracle.md +0 -0
  83. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/personio.md +0 -0
  84. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/pipedrive.md +0 -0
  85. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/postgres.md +0 -0
  86. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/redshift.md +0 -0
  87. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/s3.md +0 -0
  88. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/salesforce.md +0 -0
  89. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/sap-hana.md +0 -0
  90. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/shopify.md +0 -0
  91. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/slack.md +0 -0
  92. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/snowflake.md +0 -0
  93. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/sqlite.md +0 -0
  94. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/stripe.md +0 -0
  95. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/tiktok-ads.md +0 -0
  96. {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/zendesk.md +0 -0
  97. {ingestr-0.13.32 → ingestr-0.13.33}/docs/tutorials/load-kinesis-bigquery.md +0 -0
  98. {ingestr-0.13.32 → ingestr-0.13.33}/docs/tutorials/load-personio-duckdb.md +0 -0
  99. {ingestr-0.13.32 → ingestr-0.13.33}/docs/tutorials/load-stripe-postgres.md +0 -0
  100. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/conftest.py +0 -0
  101. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/.gitignore +0 -0
  102. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/adjust/__init__.py +0 -0
  103. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/adjust/adjust_helpers.py +0 -0
  104. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/applovin/__init__.py +0 -0
  105. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/applovin_max/__init__.py +0 -0
  106. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/appsflyer/__init__.py +0 -0
  107. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/appsflyer/client.py +0 -0
  108. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/appstore/__init__.py +0 -0
  109. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/appstore/client.py +0 -0
  110. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/appstore/errors.py +0 -0
  111. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/appstore/models.py +0 -0
  112. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/appstore/resources.py +0 -0
  113. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/arrow/__init__.py +0 -0
  114. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/asana_source/__init__.py +0 -0
  115. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/asana_source/helpers.py +0 -0
  116. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/asana_source/settings.py +0 -0
  117. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/blob.py +0 -0
  118. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/chess/__init__.py +0 -0
  119. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/chess/helpers.py +0 -0
  120. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/chess/settings.py +0 -0
  121. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/collector/spinner.py +0 -0
  122. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/dynamodb/__init__.py +0 -0
  123. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/errors.py +0 -0
  124. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/facebook_ads/__init__.py +0 -0
  125. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/facebook_ads/exceptions.py +0 -0
  126. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/facebook_ads/helpers.py +0 -0
  127. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/facebook_ads/settings.py +0 -0
  128. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/factory.py +0 -0
  129. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/filesystem/__init__.py +0 -0
  130. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/filesystem/helpers.py +0 -0
  131. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/filesystem/readers.py +0 -0
  132. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/frankfurter/__init__.py +0 -0
  133. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/frankfurter/helpers.py +0 -0
  134. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/github/__init__.py +0 -0
  135. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/github/helpers.py +0 -0
  136. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/github/queries.py +0 -0
  137. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/github/settings.py +0 -0
  138. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/google_ads/__init__.py +0 -0
  139. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/google_ads/field.py +0 -0
  140. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/google_ads/metrics.py +0 -0
  141. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/google_ads/predicates.py +0 -0
  142. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/google_ads/reports.py +0 -0
  143. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/google_analytics/__init__.py +0 -0
  144. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/google_analytics/helpers.py +0 -0
  145. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/google_sheets/README.md +0 -0
  146. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/google_sheets/__init__.py +0 -0
  147. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
  148. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
  149. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
  150. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/gorgias/__init__.py +0 -0
  151. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/gorgias/helpers.py +0 -0
  152. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/hubspot/__init__.py +0 -0
  153. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/hubspot/helpers.py +0 -0
  154. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/hubspot/settings.py +0 -0
  155. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/kafka/__init__.py +0 -0
  156. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/kafka/helpers.py +0 -0
  157. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/kinesis/__init__.py +0 -0
  158. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/kinesis/helpers.py +0 -0
  159. /ingestr-0.13.32/ingestr/src/klaviyo/_init_.py → /ingestr-0.13.33/ingestr/src/klaviyo/__init__.py +0 -0
  160. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/klaviyo/client.py +0 -0
  161. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/klaviyo/helpers.py +0 -0
  162. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/linkedin_ads/__init__.py +0 -0
  163. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
  164. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/linkedin_ads/helpers.py +0 -0
  165. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/loader.py +0 -0
  166. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/mongodb/__init__.py +0 -0
  167. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/mongodb/helpers.py +0 -0
  168. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/notion/__init__.py +0 -0
  169. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/notion/helpers/__init__.py +0 -0
  170. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/notion/helpers/client.py +0 -0
  171. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/notion/helpers/database.py +0 -0
  172. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/notion/settings.py +0 -0
  173. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/personio/__init__.py +0 -0
  174. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/personio/helpers.py +0 -0
  175. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/pipedrive/__init__.py +0 -0
  176. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/pipedrive/helpers/__init__.py +0 -0
  177. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/pipedrive/helpers/custom_fields_munger.py +0 -0
  178. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/pipedrive/helpers/pages.py +0 -0
  179. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/pipedrive/settings.py +0 -0
  180. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/pipedrive/typing.py +0 -0
  181. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/resource.py +0 -0
  182. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/salesforce/__init__.py +0 -0
  183. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/salesforce/helpers.py +0 -0
  184. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/shopify/__init__.py +0 -0
  185. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/shopify/exceptions.py +0 -0
  186. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/shopify/helpers.py +0 -0
  187. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/shopify/settings.py +0 -0
  188. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/slack/__init__.py +0 -0
  189. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/slack/helpers.py +0 -0
  190. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/slack/settings.py +0 -0
  191. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/sql_database/__init__.py +0 -0
  192. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/sql_database/callbacks.py +0 -0
  193. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/stripe_analytics/__init__.py +0 -0
  194. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/stripe_analytics/helpers.py +0 -0
  195. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/stripe_analytics/settings.py +0 -0
  196. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/table_definition.py +0 -0
  197. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/testdata/fakebqcredentials.json +0 -0
  198. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/tiktok_ads/__init__.py +0 -0
  199. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -0
  200. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/time.py +0 -0
  201. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/version.py +0 -0
  202. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/zendesk/__init__.py +0 -0
  203. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/zendesk/helpers/__init__.py +0 -0
  204. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
  205. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/zendesk/helpers/credentials.py +0 -0
  206. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
  207. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/zendesk/settings.py +0 -0
  208. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/testdata/.gitignore +0 -0
  209. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/testdata/create_replace.csv +0 -0
  210. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/testdata/delete_insert_expected.csv +0 -0
  211. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/testdata/delete_insert_part1.csv +0 -0
  212. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/testdata/delete_insert_part2.csv +0 -0
  213. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/testdata/merge_expected.csv +0 -0
  214. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/testdata/merge_part1.csv +0 -0
  215. {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/testdata/merge_part2.csv +0 -0
  216. {ingestr-0.13.32 → ingestr-0.13.33}/package-lock.json +0 -0
  217. {ingestr-0.13.32 → ingestr-0.13.33}/package.json +0 -0
  218. {ingestr-0.13.32 → ingestr-0.13.33}/pyproject.toml +0 -0
  219. {ingestr-0.13.32 → ingestr-0.13.33}/requirements-dev.txt +0 -0
  220. {ingestr-0.13.32 → ingestr-0.13.33}/requirements.in +0 -0
  221. {ingestr-0.13.32 → ingestr-0.13.33}/requirements.txt +0 -0
  222. {ingestr-0.13.32 → ingestr-0.13.33}/requirements_arm64.txt +0 -0
  223. {ingestr-0.13.32 → ingestr-0.13.33}/resources/demo.gif +0 -0
  224. {ingestr-0.13.32 → ingestr-0.13.33}/resources/demo.tape +0 -0
  225. {ingestr-0.13.32 → ingestr-0.13.33}/resources/ingestr.svg +0 -0
  226. {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/AMPM.yml +0 -0
  227. {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Acronyms.yml +0 -0
  228. {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Colons.yml +0 -0
  229. {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Contractions.yml +0 -0
  230. {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/DateFormat.yml +0 -0
  231. {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Ellipses.yml +0 -0
  232. {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/EmDash.yml +0 -0
  233. {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Exclamation.yml +0 -0
  234. {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/FirstPerson.yml +0 -0
  235. {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Gender.yml +0 -0
  236. {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/GenderBias.yml +0 -0
  237. {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/HeadingPunctuation.yml +0 -0
  238. {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Headings.yml +0 -0
  239. {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Latin.yml +0 -0
  240. {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/LyHyphens.yml +0 -0
  241. {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/OptionalPlurals.yml +0 -0
  242. {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Ordinal.yml +0 -0
  243. {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/OxfordComma.yml +0 -0
  244. {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Parens.yml +0 -0
  245. {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Passive.yml +0 -0
  246. {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Periods.yml +0 -0
  247. {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Quotes.yml +0 -0
  248. {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Ranges.yml +0 -0
  249. {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Semicolons.yml +0 -0
  250. {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Slang.yml +0 -0
  251. {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Spacing.yml +0 -0
  252. {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Spelling.yml +0 -0
  253. {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Units.yml +0 -0
  254. {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/We.yml +0 -0
  255. {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Will.yml +0 -0
  256. {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/WordList.yml +0 -0
  257. {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/meta.json +0 -0
  258. {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/vocab.txt +0 -0
  259. {ingestr-0.13.32 → ingestr-0.13.33}/styles/bruin/Ingestr.yml +0 -0
  260. {ingestr-0.13.32 → ingestr-0.13.33}/styles/config/vocabularies/bruin/accept.txt +0 -0
  261. {ingestr-0.13.32 → ingestr-0.13.33}/test.env.template +0 -0
@@ -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.32
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
@@ -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
 
@@ -264,6 +264,13 @@ def ingest(
264
264
  envvar=["YIELD_LIMIT", "INGESTR_YIELD_LIMIT"],
265
265
  ),
266
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
267
274
  ):
268
275
  import hashlib
269
276
  import tempfile
@@ -272,8 +279,6 @@ def ingest(
272
279
  import dlt
273
280
  import humanize
274
281
  import typer
275
- from dlt.common.data_types import TDataType
276
- from dlt.common.destination import Destination
277
282
  from dlt.common.pipeline import LoadInfo
278
283
  from dlt.common.runtime.collector import Collector, LogCollector
279
284
  from dlt.common.schema.typing import TColumnSchema
@@ -318,7 +323,7 @@ def ingest(
318
323
  return (source_table, dest_table)
319
324
 
320
325
  def validate_loader_file_format(
321
- dlt_dest: Destination, loader_file_format: Optional[LoaderFileFormat]
326
+ dlt_dest, loader_file_format: Optional[LoaderFileFormat]
322
327
  ):
323
328
  if (
324
329
  loader_file_format
@@ -330,9 +335,11 @@ def ingest(
330
335
  )
331
336
  raise typer.Abort()
332
337
 
333
- def parse_columns(columns: list[str]) -> dict[str, TDataType]:
338
+ def parse_columns(columns: list[str]) -> dict:
334
339
  from typing import cast, get_args
335
340
 
341
+ from dlt.common.data_types import TDataType
342
+
336
343
  possible_types = get_args(TDataType)
337
344
 
338
345
  types: dict[str, TDataType] = {}
@@ -417,7 +424,9 @@ def ingest(
417
424
  pipelines_dir = tempfile.mkdtemp()
418
425
  is_pipelines_dir_temp = True
419
426
 
420
- 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
+ )
421
430
  validate_loader_file_format(dlt_dest, loader_file_format)
422
431
 
423
432
  if partition_by:
@@ -566,6 +575,7 @@ def ingest(
566
575
  **destination.dlt_run_params(
567
576
  uri=dest_uri,
568
577
  table=dest_table,
578
+ staging_bucket=staging_bucket,
569
579
  ),
570
580
  write_disposition=write_disposition, # type: ignore
571
581
  primary_key=(primary_key if primary_key and len(primary_key) > 0 else None), # type: ignore
@@ -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
@@ -0,0 +1 @@
1
+ version = "v0.13.33"
@@ -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):
@@ -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:
@@ -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
 
@@ -13,91 +13,37 @@ from typing import (
13
13
  List,
14
14
  Literal,
15
15
  Optional,
16
+ TypeAlias,
16
17
  Union,
17
18
  )
18
19
  from urllib.parse import ParseResult, parse_qs, quote, urlencode, urlparse
19
20
 
20
- import dlt
21
21
  import pendulum
22
- from dlt.common.configuration.specs import (
23
- AwsCredentials,
24
- )
25
- from dlt.common.libs.sql_alchemy import (
26
- Engine,
27
- MetaData,
28
- )
29
22
  from dlt.common.time import ensure_pendulum_datetime
30
- from dlt.common.typing import TDataItem, TSecretStrValue
31
23
  from dlt.extract import Incremental
24
+ from dlt.sources import incremental as dlt_incremental
32
25
  from dlt.sources.credentials import (
33
26
  ConnectionStringCredentials,
34
27
  )
35
- from dlt.sources.sql_database import sql_table
36
- from dlt.sources.sql_database.helpers import TableLoader
37
- from dlt.sources.sql_database.schema_types import (
38
- ReflectionLevel,
39
- SelectAny,
40
- Table,
41
- TTypeAdapter,
42
- )
43
- from sqlalchemy import Column
44
- from sqlalchemy import types as sa
45
28
 
46
29
  from ingestr.src import blob
47
- from ingestr.src.adjust import REQUIRED_CUSTOM_DIMENSIONS, adjust_source
48
- from ingestr.src.adjust.adjust_helpers import parse_filters
49
- from ingestr.src.applovin import applovin_source
50
- from ingestr.src.applovin_max import applovin_max_source
51
- from ingestr.src.arrow import memory_mapped_arrow
52
- from ingestr.src.chess import source
53
30
  from ingestr.src.errors import (
54
31
  InvalidBlobTableError,
55
32
  MissingValueError,
56
33
  UnsupportedResourceError,
57
34
  )
58
- from ingestr.src.facebook_ads import facebook_ads_source, facebook_insights_source
59
- from ingestr.src.filesystem import readers
60
- from ingestr.src.filters import table_adapter_exclude_columns
61
- from ingestr.src.frankfurter import frankfurter_source
62
- from ingestr.src.frankfurter.helpers import validate_dates
63
- from ingestr.src.github import github_reactions, github_repo_events, github_stargazers
64
- from ingestr.src.gorgias import gorgias_source
65
- from ingestr.src.hubspot import hubspot
66
- from ingestr.src.kafka import kafka_consumer
67
- from ingestr.src.kafka.helpers import KafkaCredentials
68
- from ingestr.src.klaviyo._init_ import klaviyo_source
69
- from ingestr.src.linkedin_ads import linked_in_ads_source
70
- from ingestr.src.linkedin_ads.dimension_time_enum import (
71
- Dimension,
72
- TimeGranularity,
73
- )
74
- from ingestr.src.notion import notion_databases
75
- from ingestr.src.personio import personio_source
76
- from ingestr.src.shopify import shopify_source
77
- from ingestr.src.slack import slack_source
78
- from ingestr.src.sql_database.callbacks import (
79
- chained_query_adapter_callback,
80
- custom_query_variable_subsitution,
81
- limit_callback,
82
- type_adapter_callback,
83
- )
84
35
  from ingestr.src.table_definition import TableDefinition, table_string_to_dataclass
85
- from ingestr.src.tiktok_ads import tiktok_source
86
- from ingestr.src.time import isotime
87
- from ingestr.src.zendesk import zendesk_chat, zendesk_support, zendesk_talk
88
- from ingestr.src.zendesk.helpers.credentials import (
89
- ZendeskCredentialsOAuth,
90
- ZendeskCredentialsToken,
91
- )
92
-
93
- TableBackend = Literal["sqlalchemy", "pyarrow", "pandas", "connectorx"]
94
- TQueryAdapter = Callable[[SelectAny, Table], SelectAny]
95
36
 
96
37
 
97
38
  class SqlSource:
98
39
  table_builder: Callable
99
40
 
100
- def __init__(self, table_builder=sql_table) -> None:
41
+ def __init__(self, table_builder=None) -> None:
42
+ if table_builder is None:
43
+ from dlt.sources.sql_database import sql_table
44
+
45
+ table_builder = sql_table
46
+
101
47
  self.table_builder = table_builder
102
48
 
103
49
  def handles_incrementality(self) -> bool:
@@ -112,7 +58,7 @@ class SqlSource:
112
58
  if kwargs.get("incremental_key"):
113
59
  start_value = kwargs.get("interval_start")
114
60
  end_value = kwargs.get("interval_end")
115
- incremental = dlt.sources.incremental(
61
+ incremental = dlt_incremental(
116
62
  kwargs.get("incremental_key", ""),
117
63
  initial_value=start_value,
118
64
  end_value=end_value,
@@ -167,6 +113,27 @@ class SqlSource:
167
113
  if uri.startswith("db2://"):
168
114
  uri = uri.replace("db2://", "db2+ibm_db://")
169
115
 
116
+ from dlt.common.libs.sql_alchemy import (
117
+ Engine,
118
+ MetaData,
119
+ )
120
+ from dlt.sources.sql_database.schema_types import (
121
+ ReflectionLevel,
122
+ SelectAny,
123
+ Table,
124
+ TTypeAdapter,
125
+ )
126
+ from sqlalchemy import Column
127
+ from sqlalchemy import types as sa
128
+
129
+ from ingestr.src.filters import table_adapter_exclude_columns
130
+ from ingestr.src.sql_database.callbacks import (
131
+ chained_query_adapter_callback,
132
+ custom_query_variable_subsitution,
133
+ limit_callback,
134
+ type_adapter_callback,
135
+ )
136
+
170
137
  query_adapters = []
171
138
  if kwargs.get("sql_limit"):
172
139
  query_adapters.append(
@@ -185,6 +152,13 @@ class SqlSource:
185
152
  defer_table_reflect = True
186
153
  query_value = table.split(":", 1)[1]
187
154
 
155
+ TableBackend: TypeAlias = Literal[
156
+ "sqlalchemy", "pyarrow", "pandas", "connectorx"
157
+ ]
158
+ TQueryAdapter: TypeAlias = Callable[[SelectAny, Table], SelectAny]
159
+ import dlt
160
+ from dlt.common.typing import TDataItem
161
+
188
162
  # this is a very hacky version of the table_rows function. it is built this way to go around the dlt's table loader.
189
163
  # I didn't want to write a full fledged sqlalchemy source for now, and wanted to benefit from the existing stuff to begin with.
190
164
  # this is by no means a production ready solution, but it works for now.
@@ -235,6 +209,8 @@ class SqlSource:
235
209
  *cols,
236
210
  )
237
211
 
212
+ from dlt.sources.sql_database.helpers import TableLoader
213
+
238
214
  loader = TableLoader(
239
215
  engine,
240
216
  backend,
@@ -277,7 +253,12 @@ class SqlSource:
277
253
  class ArrowMemoryMappedSource:
278
254
  table_builder: Callable
279
255
 
280
- def __init__(self, table_builder=memory_mapped_arrow) -> None:
256
+ def __init__(self, table_builder=None) -> None:
257
+ if table_builder is None:
258
+ from ingestr.src.arrow import memory_mapped_arrow
259
+
260
+ table_builder = memory_mapped_arrow
261
+
281
262
  self.table_builder = table_builder
282
263
 
283
264
  def handles_incrementality(self) -> bool:
@@ -289,7 +270,7 @@ class ArrowMemoryMappedSource:
289
270
  start_value = kwargs.get("interval_start")
290
271
  end_value = kwargs.get("interval_end")
291
272
 
292
- incremental = dlt.sources.incremental(
273
+ incremental = dlt_incremental(
293
274
  kwargs.get("incremental_key", ""),
294
275
  initial_value=start_value,
295
276
  end_value=end_value,
@@ -341,7 +322,7 @@ class MongoDbSource:
341
322
  start_value = kwargs.get("interval_start")
342
323
  end_value = kwargs.get("interval_end")
343
324
 
344
- incremental = dlt.sources.incremental(
325
+ incremental = dlt_incremental(
345
326
  kwargs.get("incremental_key", ""),
346
327
  initial_value=start_value,
347
328
  end_value=end_value,
@@ -366,7 +347,7 @@ class LocalCsvSource:
366
347
 
367
348
  def dlt_source(self, uri: str, table: str, **kwargs):
368
349
  def csv_file(
369
- incremental: Optional[dlt.sources.incremental[Any]] = None,
350
+ incremental: Optional[dlt_incremental[Any]] = None,
370
351
  ):
371
352
  file_path = uri.split("://")[1]
372
353
  myFile = open(file_path, "r")
@@ -408,11 +389,13 @@ class LocalCsvSource:
408
389
  if page:
409
390
  yield page
410
391
 
411
- return dlt.resource(
392
+ from dlt import resource
393
+
394
+ return resource(
412
395
  csv_file,
413
396
  merge_key=kwargs.get("merge_key"), # type: ignore
414
397
  )(
415
- incremental=dlt.sources.incremental(
398
+ incremental=dlt_incremental(
416
399
  kwargs.get("incremental_key", ""),
417
400
  initial_value=kwargs.get("interval_start"),
418
401
  end_value=kwargs.get("interval_end"),
@@ -428,7 +411,12 @@ class LocalCsvSource:
428
411
  class NotionSource:
429
412
  table_builder: Callable
430
413
 
431
- def __init__(self, table_builder=notion_databases) -> None:
414
+ def __init__(self, table_builder=None) -> None:
415
+ if table_builder is None:
416
+ from ingestr.src.notion import notion_databases
417
+
418
+ table_builder = notion_databases
419
+
432
420
  self.table_builder = table_builder
433
421
 
434
422
  def handles_incrementality(self) -> bool:
@@ -488,6 +476,8 @@ class ShopifySource:
488
476
  f"Table name '{table}' is not supported for Shopify source yet, if you are interested in it please create a GitHub issue at https://github.com/bruin-data/ingestr"
489
477
  )
490
478
 
479
+ from ingestr.src.shopify import shopify_source
480
+
491
481
  return shopify_source(
492
482
  private_app_password=api_key[0],
493
483
  shop_url=f"https://{source_fields.netloc}",
@@ -532,6 +522,8 @@ class GorgiasSource:
532
522
  if kwargs.get("interval_end"):
533
523
  date_args["end_date"] = kwargs.get("interval_end")
534
524
 
525
+ from ingestr.src.gorgias import gorgias_source
526
+
535
527
  return gorgias_source(
536
528
  domain=source_fields.netloc,
537
529
  email=email[0],
@@ -629,6 +621,8 @@ class ChessSource:
629
621
  f"Resource '{table}' is not supported for Chess source yet, if you are interested in it please create a GitHub issue at https://github.com/bruin-data/ingestr"
630
622
  )
631
623
 
624
+ from ingestr.src.chess import source
625
+
632
626
  return source(players=list_players, **date_args).with_resources(
633
627
  table_mapping[table]
634
628
  )
@@ -713,6 +707,11 @@ class FacebookAdsSource:
713
707
  "access_token and accound_id are required to connect to Facebook Ads."
714
708
  )
715
709
 
710
+ from ingestr.src.facebook_ads import (
711
+ facebook_ads_source,
712
+ facebook_insights_source,
713
+ )
714
+
716
715
  endpoint = None
717
716
  if table in ["campaigns", "ad_sets", "ad_creatives", "ads", "leads"]:
718
717
  endpoint = table
@@ -770,6 +769,8 @@ class SlackSource:
770
769
  if kwargs.get("interval_end"):
771
770
  date_args["end_date"] = kwargs.get("interval_end")
772
771
 
772
+ from ingestr.src.slack import slack_source
773
+
773
774
  return slack_source(
774
775
  access_token=api_key[0],
775
776
  table_per_channel=False,
@@ -799,6 +800,8 @@ class HubspotSource:
799
800
 
800
801
  endpoint = None
801
802
 
803
+ from ingestr.src.hubspot import hubspot
804
+
802
805
  if table.startswith("custom:"):
803
806
  fields = table.split(":", 2)
804
807
  if len(fields) != 2:
@@ -905,6 +908,9 @@ class KlaviyoSource:
905
908
  )
906
909
 
907
910
  start_date = kwargs.get("interval_start") or "2000-01-01"
911
+
912
+ from ingestr.src.klaviyo import klaviyo_source
913
+
908
914
  return klaviyo_source(
909
915
  api_key=api_key[0],
910
916
  start_date=start_date,
@@ -938,6 +944,9 @@ class KafkaSource:
938
944
  raise ValueError("group_id in the URI is required to connect to kafka")
939
945
 
940
946
  start_date = kwargs.get("interval_start")
947
+ from ingestr.src.kafka import kafka_consumer
948
+ from ingestr.src.kafka.helpers import KafkaCredentials
949
+
941
950
  return kafka_consumer(
942
951
  topics=[table],
943
952
  credentials=KafkaCredentials(
@@ -993,6 +1002,9 @@ class AdjustSource:
993
1002
  if kwargs.get("interval_end"):
994
1003
  end_date = ensure_pendulum_datetime(str(kwargs.get("interval_end")))
995
1004
 
1005
+ from ingestr.src.adjust import REQUIRED_CUSTOM_DIMENSIONS, adjust_source
1006
+ from ingestr.src.adjust.adjust_helpers import parse_filters
1007
+
996
1008
  dimensions = None
997
1009
  metrics = None
998
1010
  filters = []
@@ -1099,6 +1111,12 @@ class ZendeskSource:
1099
1111
  if not subdomain:
1100
1112
  raise ValueError("Subdomain is required to connect with Zendesk")
1101
1113
 
1114
+ from ingestr.src.zendesk import zendesk_chat, zendesk_support, zendesk_talk
1115
+ from ingestr.src.zendesk.helpers.credentials import (
1116
+ ZendeskCredentialsOAuth,
1117
+ ZendeskCredentialsToken,
1118
+ )
1119
+
1102
1120
  if not source_fields.username and source_fields.password:
1103
1121
  oauth_token = source_fields.password
1104
1122
  if not oauth_token:
@@ -1206,6 +1224,8 @@ class S3Source:
1206
1224
  "S3 Source only supports specific formats files: csv, jsonl, parquet"
1207
1225
  )
1208
1226
 
1227
+ from ingestr.src.filesystem import readers
1228
+
1209
1229
  return readers(bucket_url, fs, path_to_file).with_resources(endpoint)
1210
1230
 
1211
1231
 
@@ -1300,6 +1320,8 @@ class TikTokSource:
1300
1320
  filter_name = list(filters.keys())[0]
1301
1321
  filter_value = list(map(int, filters[list(filters.keys())[0]]))
1302
1322
 
1323
+ from ingestr.src.tiktok_ads import tiktok_source
1324
+
1303
1325
  return tiktok_source(
1304
1326
  start_date=start_date,
1305
1327
  end_date=end_date,
@@ -1348,9 +1370,12 @@ class AsanaSource:
1348
1370
  f"Resource '{table}' is not supported for Asana source yet, if you are interested in it please create a GitHub issue at https://github.com/bruin-data/ingestr"
1349
1371
  )
1350
1372
 
1351
- dlt.secrets["sources.asana_source.access_token"] = access_token[0]
1373
+ import dlt
1374
+
1352
1375
  from ingestr.src.asana_source import asana_source
1353
1376
 
1377
+ dlt.secrets["sources.asana_source.access_token"] = access_token[0]
1378
+
1354
1379
  src = asana_source()
1355
1380
  src.workspaces.add_filter(lambda w: w["gid"] == workspace)
1356
1381
  return src.with_resources(table)
@@ -1396,6 +1421,9 @@ class DynamoDBSource:
1396
1421
  if not secret_key:
1397
1422
  raise ValueError("secret_access_key is required to connect to Dynamodb")
1398
1423
 
1424
+ from dlt.common.configuration.specs import AwsCredentials
1425
+ from dlt.common.typing import TSecretStrValue
1426
+
1399
1427
  creds = AwsCredentials(
1400
1428
  aws_access_key_id=access_key[0],
1401
1429
  aws_secret_access_key=TSecretStrValue(secret_key[0]),
@@ -1406,8 +1434,11 @@ class DynamoDBSource:
1406
1434
  incremental = None
1407
1435
  incremental_key = kwargs.get("incremental_key")
1408
1436
 
1437
+ from ingestr.src.dynamodb import dynamodb
1438
+ from ingestr.src.time import isotime
1439
+
1409
1440
  if incremental_key:
1410
- incremental = dlt.sources.incremental(
1441
+ incremental = dlt_incremental(
1411
1442
  incremental_key.strip(),
1412
1443
  initial_value=isotime(kwargs.get("interval_start")),
1413
1444
  end_value=isotime(kwargs.get("interval_end")),
@@ -1415,8 +1446,6 @@ class DynamoDBSource:
1415
1446
  range_start="closed",
1416
1447
  )
1417
1448
 
1418
- from ingestr.src.dynamodb import dynamodb
1419
-
1420
1449
  # bug: we never validate table.
1421
1450
  return dynamodb(table, creds, incremental)
1422
1451
 
@@ -1517,6 +1546,12 @@ class GitHubSource:
1517
1546
 
1518
1547
  access_token = source_fields.get("access_token", [""])[0]
1519
1548
 
1549
+ from ingestr.src.github import (
1550
+ github_reactions,
1551
+ github_repo_events,
1552
+ github_stargazers,
1553
+ )
1554
+
1520
1555
  if table in ["issues", "pull_requests"]:
1521
1556
  return github_reactions(
1522
1557
  owner=owner, name=repo, access_token=access_token
@@ -1667,6 +1702,8 @@ class GCSSource:
1667
1702
  "GCS Source only supports specific formats files: csv, jsonl, parquet"
1668
1703
  )
1669
1704
 
1705
+ from ingestr.src.filesystem import readers
1706
+
1670
1707
  return readers(bucket_url, fs, path_to_file).with_resources(endpoint)
1671
1708
 
1672
1709
 
@@ -1818,6 +1855,12 @@ class LinkedInAdsSource:
1818
1855
  "'date' or 'month' is required to connect to LinkedIn Ads, please provide at least one of these dimensions."
1819
1856
  )
1820
1857
 
1858
+ from ingestr.src.linkedin_ads import linked_in_ads_source
1859
+ from ingestr.src.linkedin_ads.dimension_time_enum import (
1860
+ Dimension,
1861
+ TimeGranularity,
1862
+ )
1863
+
1821
1864
  if "date" in dimensions:
1822
1865
  time_granularity = TimeGranularity.daily
1823
1866
  dimensions.remove("date")
@@ -1876,6 +1919,8 @@ class AppLovinSource:
1876
1919
  custom_report = table
1877
1920
  table = "custom_report"
1878
1921
 
1922
+ from ingestr.src.applovin import applovin_source
1923
+
1879
1924
  src = applovin_source(
1880
1925
  api_key[0],
1881
1926
  start_date.strftime("%Y-%m-%d"),
@@ -1943,6 +1988,8 @@ class ApplovinMaxSource:
1943
1988
 
1944
1989
  end_date = interval_end.date() if interval_end is not None else None
1945
1990
 
1991
+ from ingestr.src.applovin_max import applovin_max_source
1992
+
1946
1993
  return applovin_max_source(
1947
1994
  start_date=start_date,
1948
1995
  end_date=end_date,
@@ -2020,6 +2067,8 @@ class PersonioSource:
2020
2067
  ]:
2021
2068
  raise UnsupportedResourceError(table, "Personio")
2022
2069
 
2070
+ from ingestr.src.personio import personio_source
2071
+
2023
2072
  return personio_source(
2024
2073
  client_id=client_id[0],
2025
2074
  client_secret=client_secret[0],
@@ -2054,14 +2103,17 @@ class KinesisSource:
2054
2103
  if start_date is not None:
2055
2104
  # the resource will read all messages after this timestamp.
2056
2105
  start_date = ensure_pendulum_datetime(start_date)
2106
+
2107
+ from dlt.common.configuration.specs import AwsCredentials
2108
+
2109
+ from ingestr.src.kinesis import kinesis_stream
2110
+
2057
2111
  credentials = AwsCredentials(
2058
2112
  aws_access_key_id=aws_access_key_id[0],
2059
2113
  aws_secret_access_key=aws_secret_access_key[0],
2060
2114
  region_name=region_name[0],
2061
2115
  )
2062
2116
 
2063
- from ingestr.src.kinesis import kinesis_stream
2064
-
2065
2117
  return kinesis_stream(
2066
2118
  stream_name=table, credentials=credentials, initial_at_timestamp=start_date
2067
2119
  )
@@ -2109,6 +2161,9 @@ class FrankfurterSource:
2109
2161
  def dlt_source(self, uri: str, table: str, **kwargs):
2110
2162
  # start and end dates only assigned and validated for exchange_rates table
2111
2163
  # Note: if an end date but no start date is provided, start date and end date will be set to current date
2164
+ from ingestr.src.frankfurter import frankfurter_source
2165
+ from ingestr.src.frankfurter.helpers import validate_dates
2166
+
2112
2167
  if table == "exchange_rates":
2113
2168
  if kwargs.get("interval_start"):
2114
2169
  start_date = ensure_pendulum_datetime(str(kwargs.get("interval_start")))
@@ -1,13 +1,4 @@
1
1
  import os
2
- import platform
3
-
4
- import machineid
5
- import rudderstack.analytics as rudder_analytics # type: ignore
6
-
7
- from ingestr.src.version import __version__ # type: ignore
8
-
9
- rudder_analytics.write_key = "2cUr13DDQcX2x2kAfMEfdrKvrQa"
10
- rudder_analytics.dataPlaneUrl = "https://getbruinbumlky.dataplane.rudderstack.com"
11
2
 
12
3
 
13
4
  def track(event_name, event_properties: dict):
@@ -16,6 +7,16 @@ def track(event_name, event_properties: dict):
16
7
  ):
17
8
  return
18
9
 
10
+ import platform
11
+
12
+ import machineid
13
+ import rudderstack.analytics as rudder_analytics # type: ignore
14
+
15
+ from ingestr.src.version import __version__ # type: ignore
16
+
17
+ rudder_analytics.write_key = "2cUr13DDQcX2x2kAfMEfdrKvrQa"
18
+ rudder_analytics.dataPlaneUrl = "https://getbruinbumlky.dataplane.rudderstack.com"
19
+
19
20
  try:
20
21
  if not event_properties:
21
22
  event_properties = {}
@@ -1,3 +0,0 @@
1
- ingestr/src/telemetry/event.py:generic-api-key:9
2
- ingestr/src/testdata/fakebqcredentials.json:private-key:5
3
- docs/supported-sources/shopify.md:generic-api-key:26
@@ -1 +0,0 @@
1
- version = "v0.13.32"