ingestr 0.13.17__tar.gz → 0.13.19__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 (240) hide show
  1. {ingestr-0.13.17 → ingestr-0.13.19}/Makefile +8 -5
  2. {ingestr-0.13.17 → ingestr-0.13.19}/PKG-INFO +128 -1
  3. {ingestr-0.13.17 → ingestr-0.13.19}/docs/.vitepress/config.mjs +1 -0
  4. ingestr-0.13.19/docs/media/kinesis.bigquery.png +0 -0
  5. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/hubspot.md +0 -1
  6. ingestr-0.13.19/docs/tutorials/load-kinesis-bigquery.md +67 -0
  7. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/main.py +9 -11
  8. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/adjust/adjust_helpers.py +2 -2
  9. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/blob.py +13 -10
  10. ingestr-0.13.19/ingestr/src/buildinfo.py +1 -0
  11. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/hubspot/__init__.py +0 -8
  12. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/kinesis/__init__.py +1 -0
  13. ingestr-0.13.19/ingestr/src/partition.py +31 -0
  14. ingestr-0.13.19/ingestr/src/resource.py +17 -0
  15. ingestr-0.13.17/requirements.txt → ingestr-0.13.19/requirements.in +0 -1
  16. ingestr-0.13.19/requirements.txt +560 -0
  17. ingestr-0.13.17/ingestr/src/buildinfo.py +0 -1
  18. {ingestr-0.13.17 → ingestr-0.13.19}/.dockerignore +0 -0
  19. {ingestr-0.13.17 → ingestr-0.13.19}/.githooks/pre-commit-hook.sh +0 -0
  20. {ingestr-0.13.17 → ingestr-0.13.19}/.github/workflows/deploy-docs.yml +0 -0
  21. {ingestr-0.13.17 → ingestr-0.13.19}/.github/workflows/release.yml +0 -0
  22. {ingestr-0.13.17 → ingestr-0.13.19}/.github/workflows/secrets-scan.yml +0 -0
  23. {ingestr-0.13.17 → ingestr-0.13.19}/.github/workflows/tests.yml +0 -0
  24. {ingestr-0.13.17 → ingestr-0.13.19}/.gitignore +0 -0
  25. {ingestr-0.13.17 → ingestr-0.13.19}/.gitleaksignore +0 -0
  26. {ingestr-0.13.17 → ingestr-0.13.19}/.python-version +0 -0
  27. {ingestr-0.13.17 → ingestr-0.13.19}/.vale.ini +0 -0
  28. {ingestr-0.13.17 → ingestr-0.13.19}/Dockerfile +0 -0
  29. {ingestr-0.13.17 → ingestr-0.13.19}/LICENSE.md +0 -0
  30. {ingestr-0.13.17 → ingestr-0.13.19}/README.md +0 -0
  31. {ingestr-0.13.17 → ingestr-0.13.19}/docs/.vitepress/theme/custom.css +0 -0
  32. {ingestr-0.13.17 → ingestr-0.13.19}/docs/.vitepress/theme/index.js +0 -0
  33. {ingestr-0.13.17 → ingestr-0.13.19}/docs/commands/example-uris.md +0 -0
  34. {ingestr-0.13.17 → ingestr-0.13.19}/docs/commands/ingest.md +0 -0
  35. {ingestr-0.13.17 → ingestr-0.13.19}/docs/getting-started/core-concepts.md +0 -0
  36. {ingestr-0.13.17 → ingestr-0.13.19}/docs/getting-started/incremental-loading.md +0 -0
  37. {ingestr-0.13.17 → ingestr-0.13.19}/docs/getting-started/quickstart.md +0 -0
  38. {ingestr-0.13.17 → ingestr-0.13.19}/docs/getting-started/telemetry.md +0 -0
  39. {ingestr-0.13.17 → ingestr-0.13.19}/docs/index.md +0 -0
  40. {ingestr-0.13.17 → ingestr-0.13.19}/docs/media/applovin_max.png +0 -0
  41. {ingestr-0.13.17 → ingestr-0.13.19}/docs/media/athena.png +0 -0
  42. {ingestr-0.13.17 → ingestr-0.13.19}/docs/media/clickhouse_img.png +0 -0
  43. {ingestr-0.13.17 → ingestr-0.13.19}/docs/media/github.png +0 -0
  44. {ingestr-0.13.17 → ingestr-0.13.19}/docs/media/googleanalytics.png +0 -0
  45. {ingestr-0.13.17 → ingestr-0.13.19}/docs/media/linkedin_ads.png +0 -0
  46. {ingestr-0.13.17 → ingestr-0.13.19}/docs/media/personio.png +0 -0
  47. {ingestr-0.13.17 → ingestr-0.13.19}/docs/media/tiktok.png +0 -0
  48. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/adjust.md +0 -0
  49. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/airtable.md +0 -0
  50. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/applovin.md +0 -0
  51. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/applovin_max.md +0 -0
  52. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/appsflyer.md +0 -0
  53. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/appstore.md +0 -0
  54. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/asana.md +0 -0
  55. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/athena.md +0 -0
  56. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/bigquery.md +0 -0
  57. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/chess.md +0 -0
  58. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/clickhouse.md +0 -0
  59. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/csv.md +0 -0
  60. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/custom_queries.md +0 -0
  61. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/databricks.md +0 -0
  62. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/duckdb.md +0 -0
  63. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/dynamodb.md +0 -0
  64. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/facebook-ads.md +0 -0
  65. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/gcs.md +0 -0
  66. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/github.md +0 -0
  67. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/google-ads.md +0 -0
  68. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/google_analytics.md +0 -0
  69. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/gorgias.md +0 -0
  70. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/gsheets.md +0 -0
  71. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/kafka.md +0 -0
  72. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/kinesis.md +0 -0
  73. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/klaviyo.md +0 -0
  74. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/linkedin_ads.md +0 -0
  75. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/mongodb.md +0 -0
  76. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/mssql.md +0 -0
  77. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/mysql.md +0 -0
  78. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/notion.md +0 -0
  79. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/oracle.md +0 -0
  80. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/personio.md +0 -0
  81. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/postgres.md +0 -0
  82. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/redshift.md +0 -0
  83. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/s3.md +0 -0
  84. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/salesforce.md +0 -0
  85. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/sap-hana.md +0 -0
  86. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/shopify.md +0 -0
  87. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/slack.md +0 -0
  88. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/snowflake.md +0 -0
  89. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/sqlite.md +0 -0
  90. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/stripe.md +0 -0
  91. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/tiktok-ads.md +0 -0
  92. {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/zendesk.md +0 -0
  93. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/.gitignore +0 -0
  94. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/adjust/__init__.py +0 -0
  95. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/airtable/__init__.py +0 -0
  96. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/applovin/__init__.py +0 -0
  97. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/applovin_max/__init__.py +0 -0
  98. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/appsflyer/_init_.py +0 -0
  99. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/appsflyer/client.py +0 -0
  100. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/appstore/__init__.py +0 -0
  101. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/appstore/client.py +0 -0
  102. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/appstore/errors.py +0 -0
  103. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/appstore/models.py +0 -0
  104. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/appstore/resources.py +0 -0
  105. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/arrow/__init__.py +0 -0
  106. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/asana_source/__init__.py +0 -0
  107. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/asana_source/helpers.py +0 -0
  108. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/asana_source/settings.py +0 -0
  109. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/chess/__init__.py +0 -0
  110. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/chess/helpers.py +0 -0
  111. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/chess/settings.py +0 -0
  112. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/destinations.py +0 -0
  113. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/dynamodb/__init__.py +0 -0
  114. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/errors.py +0 -0
  115. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/facebook_ads/__init__.py +0 -0
  116. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/facebook_ads/exceptions.py +0 -0
  117. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/facebook_ads/helpers.py +0 -0
  118. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/facebook_ads/settings.py +0 -0
  119. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/factory.py +0 -0
  120. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/filesystem/__init__.py +0 -0
  121. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/filesystem/helpers.py +0 -0
  122. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/filesystem/readers.py +0 -0
  123. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/filters.py +0 -0
  124. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/github/__init__.py +0 -0
  125. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/github/helpers.py +0 -0
  126. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/github/queries.py +0 -0
  127. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/github/settings.py +0 -0
  128. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/google_ads/__init__.py +0 -0
  129. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/google_ads/field.py +0 -0
  130. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/google_ads/metrics.py +0 -0
  131. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/google_ads/predicates.py +0 -0
  132. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/google_ads/reports.py +0 -0
  133. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/google_analytics/__init__.py +0 -0
  134. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/google_analytics/helpers.py +0 -0
  135. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/google_sheets/README.md +0 -0
  136. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/google_sheets/__init__.py +0 -0
  137. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
  138. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
  139. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
  140. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/gorgias/__init__.py +0 -0
  141. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/gorgias/helpers.py +0 -0
  142. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/hubspot/helpers.py +0 -0
  143. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/hubspot/settings.py +0 -0
  144. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/kafka/__init__.py +0 -0
  145. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/kafka/helpers.py +0 -0
  146. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/kinesis/helpers.py +0 -0
  147. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/klaviyo/_init_.py +0 -0
  148. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/klaviyo/client.py +0 -0
  149. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/klaviyo/helpers.py +0 -0
  150. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/linkedin_ads/__init__.py +0 -0
  151. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
  152. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/linkedin_ads/helpers.py +0 -0
  153. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/loader.py +0 -0
  154. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/mongodb/__init__.py +0 -0
  155. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/mongodb/helpers.py +0 -0
  156. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/notion/__init__.py +0 -0
  157. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/notion/helpers/__init__.py +0 -0
  158. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/notion/helpers/client.py +0 -0
  159. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/notion/helpers/database.py +0 -0
  160. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/notion/settings.py +0 -0
  161. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/personio/__init__.py +0 -0
  162. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/personio/helpers.py +0 -0
  163. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/salesforce/__init__.py +0 -0
  164. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/salesforce/helpers.py +0 -0
  165. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/shopify/__init__.py +0 -0
  166. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/shopify/exceptions.py +0 -0
  167. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/shopify/helpers.py +0 -0
  168. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/shopify/settings.py +0 -0
  169. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/slack/__init__.py +0 -0
  170. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/slack/helpers.py +0 -0
  171. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/slack/settings.py +0 -0
  172. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/sources.py +0 -0
  173. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/sql_database/__init__.py +0 -0
  174. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/sql_database/callbacks.py +0 -0
  175. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/stripe_analytics/__init__.py +0 -0
  176. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/stripe_analytics/helpers.py +0 -0
  177. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/stripe_analytics/settings.py +0 -0
  178. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/table_definition.py +0 -0
  179. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/telemetry/event.py +0 -0
  180. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/testdata/fakebqcredentials.json +0 -0
  181. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/tiktok_ads/__init__.py +0 -0
  182. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -0
  183. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/time.py +0 -0
  184. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/version.py +0 -0
  185. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/zendesk/__init__.py +0 -0
  186. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/zendesk/helpers/__init__.py +0 -0
  187. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
  188. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/zendesk/helpers/credentials.py +0 -0
  189. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
  190. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/zendesk/settings.py +0 -0
  191. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/testdata/.gitignore +0 -0
  192. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/testdata/create_replace.csv +0 -0
  193. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/testdata/delete_insert_expected.csv +0 -0
  194. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/testdata/delete_insert_part1.csv +0 -0
  195. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/testdata/delete_insert_part2.csv +0 -0
  196. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/testdata/merge_expected.csv +0 -0
  197. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/testdata/merge_part1.csv +0 -0
  198. {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/testdata/merge_part2.csv +0 -0
  199. {ingestr-0.13.17 → ingestr-0.13.19}/package-lock.json +0 -0
  200. {ingestr-0.13.17 → ingestr-0.13.19}/package.json +0 -0
  201. {ingestr-0.13.17 → ingestr-0.13.19}/pyproject.toml +0 -0
  202. {ingestr-0.13.17 → ingestr-0.13.19}/requirements-dev.txt +0 -0
  203. {ingestr-0.13.17 → ingestr-0.13.19}/resources/demo.gif +0 -0
  204. {ingestr-0.13.17 → ingestr-0.13.19}/resources/demo.tape +0 -0
  205. {ingestr-0.13.17 → ingestr-0.13.19}/resources/ingestr.svg +0 -0
  206. {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/AMPM.yml +0 -0
  207. {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Acronyms.yml +0 -0
  208. {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Colons.yml +0 -0
  209. {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Contractions.yml +0 -0
  210. {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/DateFormat.yml +0 -0
  211. {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Ellipses.yml +0 -0
  212. {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/EmDash.yml +0 -0
  213. {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Exclamation.yml +0 -0
  214. {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/FirstPerson.yml +0 -0
  215. {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Gender.yml +0 -0
  216. {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/GenderBias.yml +0 -0
  217. {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/HeadingPunctuation.yml +0 -0
  218. {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Headings.yml +0 -0
  219. {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Latin.yml +0 -0
  220. {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/LyHyphens.yml +0 -0
  221. {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/OptionalPlurals.yml +0 -0
  222. {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Ordinal.yml +0 -0
  223. {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/OxfordComma.yml +0 -0
  224. {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Parens.yml +0 -0
  225. {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Passive.yml +0 -0
  226. {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Periods.yml +0 -0
  227. {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Quotes.yml +0 -0
  228. {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Ranges.yml +0 -0
  229. {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Semicolons.yml +0 -0
  230. {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Slang.yml +0 -0
  231. {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Spacing.yml +0 -0
  232. {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Spelling.yml +0 -0
  233. {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Units.yml +0 -0
  234. {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/We.yml +0 -0
  235. {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Will.yml +0 -0
  236. {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/WordList.yml +0 -0
  237. {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/meta.json +0 -0
  238. {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/vocab.txt +0 -0
  239. {ingestr-0.13.17 → ingestr-0.13.19}/styles/bruin/Ingestr.yml +0 -0
  240. {ingestr-0.13.17 → ingestr-0.13.19}/styles/config/vocabularies/bruin/accept.txt +0 -0
@@ -11,7 +11,10 @@ venv/touchfile: requirements-dev.txt requirements.txt
11
11
  . venv/bin/activate; pip install uv; $(MAKE) deps
12
12
  touch venv/touchfile
13
13
 
14
- deps:
14
+ lock-deps:
15
+ @uv pip compile requirements.in --quiet -o requirements.txt
16
+
17
+ deps: lock-deps
15
18
  uv pip install -r requirements-dev.txt
16
19
 
17
20
  deps-ci:
@@ -20,17 +23,17 @@ deps-ci:
20
23
  test-ci:
21
24
  TESTCONTAINERS_RYUK_DISABLED=true pytest -n auto -x -rP -vv --tb=short --durations=10 --cov=ingestr --no-cov-on-fail
22
25
 
23
- test: venv
26
+ test : venv lock-deps
24
27
  . venv/bin/activate; $(MAKE) test-ci
25
28
 
26
- test-specific: venv
29
+ test-specific: venv lock-deps
27
30
  . venv/bin/activate; pytest -rP -vv --tb=short --capture=no -k $(test)
28
31
 
29
32
  lint-ci:
30
33
  ruff format ingestr && ruff check ingestr --fix
31
34
  mypy --config-file pyproject.toml --explicit-package-bases ingestr
32
35
 
33
- lint: venv
36
+ lint: venv lock-deps
34
37
  . venv/bin/activate; $(MAKE) lint-ci
35
38
 
36
39
  lint-docs:
@@ -38,7 +41,7 @@ lint-docs:
38
41
 
39
42
  tl: test lint
40
43
 
41
- build:
44
+ build: lock-deps
42
45
  cat > ${BUILDINFO} <<< "version = \"$$(git describe --tags --abbrev=0)\""
43
46
  rm -rf dist && python3 -m build
44
47
  rm -f ${BUILDINFO}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ingestr
3
- Version: 0.13.17
3
+ Version: 0.13.19
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
@@ -14,50 +14,177 @@ Classifier: Operating System :: OS Independent
14
14
  Classifier: Programming Language :: Python :: 3
15
15
  Classifier: Topic :: Database
16
16
  Requires-Python: >=3.9
17
+ Requires-Dist: aiobotocore==2.21.1
18
+ Requires-Dist: aiohappyeyeballs==2.4.8
19
+ Requires-Dist: aiohttp==3.11.13
20
+ Requires-Dist: aioitertools==0.12.0
21
+ Requires-Dist: aiosignal==1.3.2
22
+ Requires-Dist: alembic==1.15.1
23
+ Requires-Dist: annotated-types==0.7.0
17
24
  Requires-Dist: asana==3.2.3
25
+ Requires-Dist: asn1crypto==1.5.1
26
+ Requires-Dist: asynch==0.2.4
27
+ Requires-Dist: attrs==25.1.0
28
+ Requires-Dist: backoff==2.2.1
29
+ Requires-Dist: beautifulsoup4==4.13.3
30
+ Requires-Dist: boto3==1.37.1
31
+ Requires-Dist: botocore==1.37.1
32
+ Requires-Dist: cachetools==5.5.2
33
+ Requires-Dist: certifi==2025.1.31
34
+ Requires-Dist: cffi==1.17.1
35
+ Requires-Dist: charset-normalizer==3.4.1
36
+ Requires-Dist: ciso8601==2.3.2
37
+ Requires-Dist: click==8.1.8
18
38
  Requires-Dist: clickhouse-connect==0.8.14
19
39
  Requires-Dist: clickhouse-driver==0.2.9
20
40
  Requires-Dist: clickhouse-sqlalchemy==0.2.7
21
41
  Requires-Dist: confluent-kafka==2.8.0
42
+ Requires-Dist: cryptography==44.0.2
43
+ Requires-Dist: curlify==2.2.1
22
44
  Requires-Dist: databricks-sql-connector==2.9.3
23
45
  Requires-Dist: databricks-sqlalchemy==1.0.2
24
46
  Requires-Dist: dataclasses-json==0.6.7
47
+ Requires-Dist: decorator==5.2.1
48
+ Requires-Dist: deprecation==2.1.0
25
49
  Requires-Dist: dlt==1.6.1
50
+ Requires-Dist: dnspython==2.7.0
26
51
  Requires-Dist: duckdb-engine==0.15.0
27
52
  Requires-Dist: duckdb==1.2.0
53
+ Requires-Dist: et-xmlfile==2.0.0
28
54
  Requires-Dist: facebook-business==20.0.0
55
+ Requires-Dist: filelock==3.17.0
29
56
  Requires-Dist: flatten-json==0.1.14
57
+ Requires-Dist: frozenlist==1.5.0
58
+ Requires-Dist: fsspec==2024.10.0
30
59
  Requires-Dist: gcsfs==2024.10.0
60
+ Requires-Dist: gitdb==4.0.12
61
+ Requires-Dist: gitpython==3.1.44
62
+ Requires-Dist: giturlparse==0.12.0
31
63
  Requires-Dist: google-ads==25.1.0
32
64
  Requires-Dist: google-analytics-data==0.18.17
65
+ Requires-Dist: google-api-core==2.24.1
33
66
  Requires-Dist: google-api-python-client==2.130.0
67
+ Requires-Dist: google-auth-httplib2==0.2.0
68
+ Requires-Dist: google-auth-oauthlib==1.2.1
69
+ Requires-Dist: google-auth==2.38.0
34
70
  Requires-Dist: google-cloud-bigquery-storage==2.24.0
71
+ Requires-Dist: google-cloud-bigquery==3.30.0
72
+ Requires-Dist: google-cloud-core==2.4.2
73
+ Requires-Dist: google-cloud-storage==3.1.0
74
+ Requires-Dist: google-crc32c==1.6.0
75
+ Requires-Dist: google-resumable-media==2.7.2
76
+ Requires-Dist: googleapis-common-protos==1.69.0
77
+ Requires-Dist: greenlet==3.1.1
78
+ Requires-Dist: grpcio-status==1.62.3
79
+ Requires-Dist: grpcio==1.70.0
80
+ Requires-Dist: hdbcli==2.23.27
81
+ Requires-Dist: hexbytes==1.3.0
82
+ Requires-Dist: httplib2==0.22.0
83
+ Requires-Dist: humanize==4.12.1
84
+ Requires-Dist: idna==3.10
85
+ Requires-Dist: inflection==0.5.1
86
+ Requires-Dist: isodate==0.7.2
87
+ Requires-Dist: jmespath==1.0.1
88
+ Requires-Dist: jsonpath-ng==1.7.0
89
+ Requires-Dist: leb128==1.0.8
90
+ Requires-Dist: lxml==5.3.1
91
+ Requires-Dist: lz4==4.4.3
92
+ Requires-Dist: makefun==1.15.6
93
+ Requires-Dist: mako==1.3.9
94
+ Requires-Dist: markdown-it-py==3.0.0
95
+ Requires-Dist: markupsafe==3.0.2
96
+ Requires-Dist: marshmallow==3.26.1
97
+ Requires-Dist: mdurl==0.1.2
98
+ Requires-Dist: monotonic==1.6
99
+ Requires-Dist: more-itertools==10.6.0
100
+ Requires-Dist: multidict==6.1.0
101
+ Requires-Dist: mypy-extensions==1.0.0
35
102
  Requires-Dist: mysql-connector-python==9.2.0
103
+ Requires-Dist: numpy==2.2.3
104
+ Requires-Dist: oauthlib==3.2.2
105
+ Requires-Dist: openpyxl==3.1.5
106
+ Requires-Dist: orjson==3.10.15
107
+ Requires-Dist: packaging==24.2
108
+ Requires-Dist: pandas==2.2.3
109
+ Requires-Dist: pathvalidate==3.2.3
36
110
  Requires-Dist: pendulum==3.0.0
111
+ Requires-Dist: platformdirs==4.3.6
112
+ Requires-Dist: pluggy==1.5.0
113
+ Requires-Dist: ply==3.11
114
+ Requires-Dist: propcache==0.3.0
115
+ Requires-Dist: proto-plus==1.26.0
116
+ Requires-Dist: protobuf==4.25.6
37
117
  Requires-Dist: psutil==6.1.1
38
118
  Requires-Dist: psycopg2-binary==2.9.10
39
119
  Requires-Dist: py-machineid==0.6.0
40
120
  Requires-Dist: pyairtable==2.3.3
41
121
  Requires-Dist: pyarrow==18.1.0
122
+ Requires-Dist: pyasn1-modules==0.4.1
123
+ Requires-Dist: pyasn1==0.6.1
42
124
  Requires-Dist: pyathena==3.12.2
125
+ Requires-Dist: pycountry==24.6.1
126
+ Requires-Dist: pycparser==2.22
127
+ Requires-Dist: pydantic-core==2.27.2
128
+ Requires-Dist: pydantic==2.10.6
129
+ Requires-Dist: pygments==2.19.1
130
+ Requires-Dist: pyjwt==2.10.1
43
131
  Requires-Dist: pymongo==4.11.1
44
132
  Requires-Dist: pymysql==1.1.1
133
+ Requires-Dist: pyopenssl==25.0.0
134
+ Requires-Dist: pyparsing==3.2.1
45
135
  Requires-Dist: pyrate-limiter==3.7.0
136
+ Requires-Dist: python-dateutil==2.9.0.post0
137
+ Requires-Dist: python-dotenv==1.0.1
138
+ Requires-Dist: pytz==2025.1
139
+ Requires-Dist: pyyaml==6.0.2
46
140
  Requires-Dist: redshift-connector==2.1.5
141
+ Requires-Dist: requests-file==2.1.0
142
+ Requires-Dist: requests-oauthlib==1.3.1
143
+ Requires-Dist: requests-toolbelt==1.0.0
144
+ Requires-Dist: requests==2.32.3
145
+ Requires-Dist: requirements-parser==0.11.0
146
+ Requires-Dist: rich-argparse==1.7.0
47
147
  Requires-Dist: rich==13.9.4
148
+ Requires-Dist: rsa==4.9
48
149
  Requires-Dist: rudder-sdk-python==2.1.4
49
150
  Requires-Dist: s3fs==2024.10.0
151
+ Requires-Dist: s3transfer==0.11.3
152
+ Requires-Dist: scramp==1.4.5
153
+ Requires-Dist: semver==3.0.4
154
+ Requires-Dist: setuptools==75.8.2
155
+ Requires-Dist: shellingham==1.5.4
50
156
  Requires-Dist: simple-salesforce==1.12.6
157
+ Requires-Dist: simplejson==3.20.1
158
+ Requires-Dist: six==1.17.0
159
+ Requires-Dist: smmap==5.0.2
160
+ Requires-Dist: snowflake-connector-python==3.14.0
51
161
  Requires-Dist: snowflake-sqlalchemy==1.6.1
162
+ Requires-Dist: sortedcontainers==2.4.0
163
+ Requires-Dist: soupsieve==2.6
52
164
  Requires-Dist: sqlalchemy-bigquery==1.12.1
53
165
  Requires-Dist: sqlalchemy-hana==2.0.0
54
166
  Requires-Dist: sqlalchemy-redshift==0.8.14
55
167
  Requires-Dist: sqlalchemy2-stubs==0.0.2a38
56
168
  Requires-Dist: sqlalchemy==1.4.52
57
169
  Requires-Dist: stripe==10.7.0
170
+ Requires-Dist: tenacity==9.0.0
171
+ Requires-Dist: thrift==0.16.0
172
+ Requires-Dist: time-machine==2.16.0
173
+ Requires-Dist: tomlkit==0.13.2
58
174
  Requires-Dist: tqdm==4.67.1
59
175
  Requires-Dist: typer==0.13.1
60
176
  Requires-Dist: types-requests==2.32.0.20240907
177
+ Requires-Dist: types-setuptools==75.8.2.20250305
178
+ Requires-Dist: typing-extensions==4.12.2
179
+ Requires-Dist: typing-inspect==0.9.0
180
+ Requires-Dist: tzdata==2025.1
181
+ Requires-Dist: tzlocal==5.3
182
+ Requires-Dist: uritemplate==4.1.1
183
+ Requires-Dist: urllib3==2.3.0
184
+ Requires-Dist: wrapt==1.17.2
185
+ Requires-Dist: yarl==1.18.3
186
+ Requires-Dist: zeep==4.3.1
187
+ Requires-Dist: zstandard==0.23.0
61
188
  Requires-Dist: zstd==1.5.6.5
62
189
  Provides-Extra: odbc
63
190
  Requires-Dist: pyodbc==5.1.0; extra == 'odbc'
@@ -40,6 +40,7 @@ export default defineConfig({
40
40
  text: "Incremental Loading",
41
41
  link: "/getting-started/incremental-loading.md",
42
42
  },
43
+ { text: "Load Kinesis Data to BigQuery", link: "/tutorials/load-kinesis-bigquery.md" },
43
44
  { text: "Telemetry", link: "/getting-started/telemetry.md" },
44
45
  ],
45
46
  },
@@ -39,7 +39,6 @@ HubSpot source allows ingesting the following sources into separate tables:
39
39
  - `products`: Retrieves pricing information of products.
40
40
  - `tickets`: Handles requests for help from customers or users.
41
41
  - `quotes`: Retrieves price proposals that salespeople can create and send to their contacts.
42
- - `hubspot_events_for_objects`: Retrieves web analytics events for a given object type and object IDs.
43
42
  - `contacts`: Retrieves information about visitors, potential customers, and leads.
44
43
 
45
44
  Use these as `--source-table` parameter in the `ingestr ingest` command.
@@ -0,0 +1,67 @@
1
+ # Load Kinesis Data to BigQuery
2
+
3
+ Welcome! 👋 This tutorial will guide you through loading data from `Amazon Kinesis` into `Google BigQuery` using `ingestr`, a command-line tool that enables data ingestion between any source and destination using simple flags, no coding required.
4
+
5
+ Amazon Kinesis is a cloud-based service for real-time data streaming and analytics that processes large data streams in real-time. You often need to store this data in a data warehouse like BigQuery for analysis and reporting. This is where ingestr simplifies the process.
6
+
7
+ ## Prerequisites
8
+ - Install ingestr by following the instructions [here](../getting-started/quickstart.md#Installation)
9
+ - AWS credentials - Access key and Secret key
10
+ - BigQuery service account
11
+
12
+ ## Configuration Steps
13
+ ### Source Configuration - Kinesis
14
+
15
+ #### `--source-uri`
16
+ This flag connects to your Kinesis stream. The URI format is:
17
+
18
+ ```bash
19
+ kinesis://?aws_access_key_id=$KEY_ID&aws_secret_access_key=$SECRET_KEY&region_name=eu-central-1
20
+ ```
21
+
22
+ Required parameters:
23
+ - `aws_access_key_id`: Your AWS access key
24
+ - `aws_secret_access_key`: Your AWS secret key
25
+ - `region_name`: AWS region of your Kinesis stream.
26
+
27
+ #### `--source-table`
28
+ This flag specifies which Kinesis stream to read from:
29
+ ```bash
30
+ --source-table 'kinesis_stream_name'
31
+ ```
32
+
33
+ ### Destination Configuration - BigQuery
34
+ #### `--dest-uri`
35
+
36
+ This flag connects to BigQuery. The URI format is:
37
+ ```bash
38
+ bigquery://project-name?credentials_path=/path/to/service/account.json&location=<location>
39
+ ```
40
+ Required parameters:
41
+ - `project-name`: Your BigQuery project name
42
+ - `credentials_path`: Path to service account JSON file
43
+ - `location`: (Optional) Dataset location
44
+
45
+ #### `--dest-table`
46
+ This flag specifies where to save the data:
47
+
48
+ ```bash
49
+ --dest-table 'schema.table_name'
50
+ ```
51
+
52
+ Now that we've configured all our flags, we can run a single command to connect to Kinesis, read from our specified stream, and load the data into our BigQuery target table.
53
+
54
+ ```bash
55
+ ingestr ingest \
56
+ --source-uri 'kinesis://?aws_access_key_id=id_123&aws_secret_access_key=secret_123&region_name=eu-central-1' \
57
+ --source-table 'stream_name_1' \
58
+ --dest-uri 'bigquery://test-playground?credentials_path=/Users/abc.json' \
59
+ --dest-table 'dest.results'
60
+ ```
61
+
62
+ After running this command, your Kinesis data will be loaded into BigQuery. Here's what the data looks like in the destination:
63
+
64
+ <img alt="kinesis_bigquery" src="../media/kinesis.bigquery.png" />
65
+
66
+ 🎉 Congratulations!
67
+ You've successfully loaded data from Amazon Kinesis to your desired destination.
@@ -8,6 +8,9 @@ from rich.console import Console
8
8
  from rich.status import Status
9
9
  from typing_extensions import Annotated
10
10
 
11
+ import ingestr.src.partition as partition
12
+ import ingestr.src.resource as resource
13
+ from ingestr.src.destinations import AthenaDestination
11
14
  from ingestr.src.filters import cast_set_to_list
12
15
  from ingestr.src.telemetry.event import track
13
16
 
@@ -357,14 +360,6 @@ def ingest(
357
360
  )
358
361
  raise typer.Abort()
359
362
 
360
- def run_on_resource(source, executable):
361
- if hasattr(source, "selected_resources") and source.selected_resources:
362
- resource_names = list(source.selected_resources.keys())
363
- for res in resource_names:
364
- executable(source.resources[res])
365
- else:
366
- executable(source)
367
-
368
363
  def parse_columns(columns: list[str]) -> dict[str, TDataType]:
369
364
  from typing import cast, get_args
370
365
 
@@ -553,20 +548,23 @@ def ingest(
553
548
  sql_exclude_columns=sql_exclude_columns,
554
549
  )
555
550
 
556
- run_on_resource(dlt_source, lambda x: x.add_map(cast_set_to_list))
551
+ resource.for_each(dlt_source, lambda x: x.add_map(cast_set_to_list))
557
552
 
558
553
  def col_h(x):
559
554
  if column_hints:
560
555
  x.apply_hints(columns=column_hints)
561
556
 
562
- run_on_resource(dlt_source, col_h)
557
+ resource.for_each(dlt_source, col_h)
558
+
559
+ if isinstance(destination, AthenaDestination) and partition_by:
560
+ partition.apply_athena_hints(dlt_source, partition_by, column_hints)
563
561
 
564
562
  if original_incremental_strategy == IncrementalStrategy.delete_insert:
565
563
 
566
564
  def set_primary_key(x):
567
565
  x.incremental.primary_key = ()
568
566
 
569
- run_on_resource(dlt_source, set_primary_key)
567
+ resource.for_each(dlt_source, set_primary_key)
570
568
 
571
569
  if (
572
570
  factory.destination_scheme in PARQUET_SUPPORTED_DESTINATIONS
@@ -82,7 +82,7 @@ class AdjustAPI:
82
82
  items = result.get("rows", [])
83
83
  yield items
84
84
  else:
85
- raise HTTPError(f"Request failed with status code: {response.status_code}")
85
+ raise HTTPError(f"Request failed with status code: {response.status_code}, {response.text}.")
86
86
 
87
87
  def fetch_events(self):
88
88
  headers = {"Authorization": f"Bearer {self.api_key}"}
@@ -93,7 +93,7 @@ class AdjustAPI:
93
93
  result = response.json()
94
94
  yield result
95
95
  else:
96
- raise HTTPError(f"Request failed with status code: {response.status_code}")
96
+ raise HTTPError(f"Request failed with status code: {response.status_code}, {response.text}.")
97
97
 
98
98
 
99
99
  def parse_filters(filters_raw: str) -> dict:
@@ -1,6 +1,6 @@
1
1
  import warnings
2
2
  from typing import Tuple, TypeAlias
3
- from urllib.parse import ParseResult
3
+ from urllib.parse import ParseResult, urlparse
4
4
 
5
5
  BucketName: TypeAlias = str
6
6
  FileGlob: TypeAlias = str
@@ -14,13 +14,16 @@ def parse_uri(uri: ParseResult, table: str) -> Tuple[BucketName, FileGlob]:
14
14
  Supports the following Forms:
15
15
  - uri: "gs://"
16
16
  table: "bucket-name/file-glob"
17
+ - uri: "gs://uri-bucket-name" (uri-bucket-name is preferred)
18
+ table: "gs://table-bucket-name/file-glob"
19
+ - uri: "gs://"
20
+ table: "gs://bucket-name/file-glob"
17
21
  - uri: gs://bucket-name/file-glob
18
22
  table: None
19
23
  - uri: "gs://bucket-name"
20
24
  table: "file-glob"
21
25
 
22
- The first form is the prefered method. Other forms are supported
23
- for backward compatibility, but discouraged.
26
+ The first form is the prefered method. Other forms are supported but discouraged.
24
27
  """
25
28
 
26
29
  table = table.strip()
@@ -34,15 +37,15 @@ def parse_uri(uri: ParseResult, table: str) -> Tuple[BucketName, FileGlob]:
34
37
  )
35
38
  return host, uri.path.lstrip("/")
36
39
 
40
+ table_uri = urlparse(table)
41
+
37
42
  if host != "":
38
- warnings.warn(
39
- f"Using the form '{uri.scheme}://bucket-name' is deprecated and will be removed in future versions.",
40
- DeprecationWarning,
41
- stacklevel=2,
42
- )
43
- return host, table.lstrip("/")
43
+ return host, table_uri.path.lstrip("/")
44
+
45
+ if table_uri.hostname:
46
+ return table_uri.hostname, table_uri.path.lstrip("/")
44
47
 
45
- parts = table.lstrip("/").split("/", maxsplit=1)
48
+ parts = table_uri.path.lstrip("/").split("/", maxsplit=1)
46
49
  if len(parts) != 2:
47
50
  return "", parts[0]
48
51
 
@@ -0,0 +1 @@
1
+ version = "v0.13.19"
@@ -199,14 +199,6 @@ def crm_objects(
199
199
 
200
200
  props = ",".join(sorted(list(set(props))))
201
201
 
202
- if len(props) > 2000:
203
- raise ValueError(
204
- "Your request to Hubspot is too long to process. "
205
- "Maximum allowed query length is 2000 symbols, while "
206
- f"your list of properties `{props[:200]}`... is {len(props)} "
207
- "symbols long. Use the `props` argument of the resource to "
208
- "set the list of properties to extract from the endpoint."
209
- )
210
202
 
211
203
  params = {"properties": props, "limit": 100}
212
204
 
@@ -16,6 +16,7 @@ from .helpers import get_shard_iterator, max_sequence_by_shard
16
16
  name=lambda args: args["stream_name"],
17
17
  primary_key="kinesis_msg_id",
18
18
  standalone=True,
19
+ max_table_nesting=0
19
20
  )
20
21
  def kinesis_stream(
21
22
  stream_name: str,
@@ -0,0 +1,31 @@
1
+ from typing import Dict
2
+
3
+ from dlt.common.schema.typing import TColumnSchema
4
+ from dlt.destinations.adapters import athena_adapter, athena_partition
5
+ from dlt.sources import DltResource, DltSource
6
+
7
+ import ingestr.src.resource as resource
8
+
9
+
10
+ def apply_athena_hints(
11
+ source: DltSource | DltResource,
12
+ partition_column: str,
13
+ additional_hints: Dict[str, TColumnSchema] = {},
14
+ ) -> None:
15
+ def _apply_partition_hint(resource: DltResource) -> None:
16
+
17
+ columns = resource.columns if resource.columns else {}
18
+
19
+ partition_hint = (
20
+ columns.get(partition_column) # type: ignore
21
+ or additional_hints.get(partition_column)
22
+ )
23
+
24
+ athena_adapter(
25
+ resource,
26
+ athena_partition.day(partition_column)
27
+ if partition_hint and partition_hint.get("data_type") in ("timestamp", "date")
28
+ else partition_column,
29
+ )
30
+
31
+ resource.for_each(source, _apply_partition_hint)
@@ -0,0 +1,17 @@
1
+ from typing import Callable
2
+
3
+ from dlt.sources import DltResource, DltSource
4
+
5
+
6
+ def for_each(
7
+ source: DltSource | DltResource, ex: Callable[[DltResource], None | DltResource]
8
+ ):
9
+ """
10
+ Apply a function to each resource in a source.
11
+ """
12
+ if hasattr(source, "selected_resources") and source.selected_resources:
13
+ resource_names = list(source.selected_resources.keys())
14
+ for res in resource_names:
15
+ ex(source.resources[res]) # type: ignore[union-attr]
16
+ else:
17
+ ex(source) # type: ignore[arg-type]
@@ -47,4 +47,3 @@ clickhouse-connect==0.8.14
47
47
  clickhouse-driver==0.2.9
48
48
  clickhouse-sqlalchemy==0.2.7
49
49
  zstd==1.5.6.5
50
-