ingestr 0.13.32__tar.gz → 0.13.34__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.34/.gitleaksignore +3 -0
  2. {ingestr-0.13.32 → ingestr-0.13.34}/PKG-INFO +1 -1
  3. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/bigquery.md +12 -0
  4. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/hubspot.md +20 -0
  5. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/main.py +15 -5
  6. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/airtable/__init__.py +1 -1
  7. ingestr-0.13.34/ingestr/src/buildinfo.py +1 -0
  8. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/destinations.py +20 -0
  9. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/filters.py +2 -3
  10. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/hubspot/__init__.py +11 -2
  11. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/hubspot/helpers.py +0 -4
  12. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/partition.py +2 -1
  13. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/sources.py +141 -81
  14. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/telemetry/event.py +10 -9
  15. ingestr-0.13.32/.gitleaksignore +0 -3
  16. ingestr-0.13.32/ingestr/src/buildinfo.py +0 -1
  17. {ingestr-0.13.32 → ingestr-0.13.34}/.dockerignore +0 -0
  18. {ingestr-0.13.32 → ingestr-0.13.34}/.githooks/pre-commit-hook.sh +0 -0
  19. {ingestr-0.13.32 → ingestr-0.13.34}/.github/workflows/deploy-docs.yml +0 -0
  20. {ingestr-0.13.32 → ingestr-0.13.34}/.github/workflows/release.yml +0 -0
  21. {ingestr-0.13.32 → ingestr-0.13.34}/.github/workflows/secrets-scan.yml +0 -0
  22. {ingestr-0.13.32 → ingestr-0.13.34}/.github/workflows/tests.yml +0 -0
  23. {ingestr-0.13.32 → ingestr-0.13.34}/.gitignore +0 -0
  24. {ingestr-0.13.32 → ingestr-0.13.34}/.python-version +0 -0
  25. {ingestr-0.13.32 → ingestr-0.13.34}/.vale.ini +0 -0
  26. {ingestr-0.13.32 → ingestr-0.13.34}/Dockerfile +0 -0
  27. {ingestr-0.13.32 → ingestr-0.13.34}/LICENSE.md +0 -0
  28. {ingestr-0.13.32 → ingestr-0.13.34}/Makefile +0 -0
  29. {ingestr-0.13.32 → ingestr-0.13.34}/README.md +0 -0
  30. {ingestr-0.13.32 → ingestr-0.13.34}/docs/.vitepress/config.mjs +0 -0
  31. {ingestr-0.13.32 → ingestr-0.13.34}/docs/.vitepress/theme/custom.css +0 -0
  32. {ingestr-0.13.32 → ingestr-0.13.34}/docs/.vitepress/theme/index.js +0 -0
  33. {ingestr-0.13.32 → ingestr-0.13.34}/docs/commands/example-uris.md +0 -0
  34. {ingestr-0.13.32 → ingestr-0.13.34}/docs/commands/ingest.md +0 -0
  35. {ingestr-0.13.32 → ingestr-0.13.34}/docs/getting-started/core-concepts.md +0 -0
  36. {ingestr-0.13.32 → ingestr-0.13.34}/docs/getting-started/incremental-loading.md +0 -0
  37. {ingestr-0.13.32 → ingestr-0.13.34}/docs/getting-started/quickstart.md +0 -0
  38. {ingestr-0.13.32 → ingestr-0.13.34}/docs/getting-started/telemetry.md +0 -0
  39. {ingestr-0.13.32 → ingestr-0.13.34}/docs/index.md +0 -0
  40. {ingestr-0.13.32 → ingestr-0.13.34}/docs/media/applovin_max.png +0 -0
  41. {ingestr-0.13.32 → ingestr-0.13.34}/docs/media/athena.png +0 -0
  42. {ingestr-0.13.32 → ingestr-0.13.34}/docs/media/clickhouse_img.png +0 -0
  43. {ingestr-0.13.32 → ingestr-0.13.34}/docs/media/github.png +0 -0
  44. {ingestr-0.13.32 → ingestr-0.13.34}/docs/media/googleanalytics.png +0 -0
  45. {ingestr-0.13.32 → ingestr-0.13.34}/docs/media/kinesis.bigquery.png +0 -0
  46. {ingestr-0.13.32 → ingestr-0.13.34}/docs/media/linkedin_ads.png +0 -0
  47. {ingestr-0.13.32 → ingestr-0.13.34}/docs/media/personio.png +0 -0
  48. {ingestr-0.13.32 → ingestr-0.13.34}/docs/media/personio_duckdb.png +0 -0
  49. {ingestr-0.13.32 → ingestr-0.13.34}/docs/media/pipedrive.png +0 -0
  50. {ingestr-0.13.32 → ingestr-0.13.34}/docs/media/stripe_postgres.png +0 -0
  51. {ingestr-0.13.32 → ingestr-0.13.34}/docs/media/tiktok.png +0 -0
  52. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/adjust.md +0 -0
  53. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/airtable.md +0 -0
  54. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/applovin.md +0 -0
  55. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/applovin_max.md +0 -0
  56. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/appsflyer.md +0 -0
  57. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/appstore.md +0 -0
  58. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/asana.md +0 -0
  59. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/athena.md +0 -0
  60. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/chess.md +0 -0
  61. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/clickhouse.md +0 -0
  62. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/csv.md +0 -0
  63. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/custom_queries.md +0 -0
  64. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/databricks.md +0 -0
  65. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/db2.md +0 -0
  66. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/duckdb.md +0 -0
  67. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/dynamodb.md +0 -0
  68. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/facebook-ads.md +0 -0
  69. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/frankfurter.md +0 -0
  70. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/gcs.md +0 -0
  71. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/github.md +0 -0
  72. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/google-ads.md +0 -0
  73. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/google_analytics.md +0 -0
  74. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/gorgias.md +0 -0
  75. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/gsheets.md +0 -0
  76. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/kafka.md +0 -0
  77. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/kinesis.md +0 -0
  78. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/klaviyo.md +0 -0
  79. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/linkedin_ads.md +0 -0
  80. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/mongodb.md +0 -0
  81. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/mssql.md +0 -0
  82. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/mysql.md +0 -0
  83. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/notion.md +0 -0
  84. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/oracle.md +0 -0
  85. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/personio.md +0 -0
  86. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/pipedrive.md +0 -0
  87. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/postgres.md +0 -0
  88. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/redshift.md +0 -0
  89. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/s3.md +0 -0
  90. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/salesforce.md +0 -0
  91. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/sap-hana.md +0 -0
  92. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/shopify.md +0 -0
  93. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/slack.md +0 -0
  94. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/snowflake.md +0 -0
  95. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/sqlite.md +0 -0
  96. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/stripe.md +0 -0
  97. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/tiktok-ads.md +0 -0
  98. {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/zendesk.md +0 -0
  99. {ingestr-0.13.32 → ingestr-0.13.34}/docs/tutorials/load-kinesis-bigquery.md +0 -0
  100. {ingestr-0.13.32 → ingestr-0.13.34}/docs/tutorials/load-personio-duckdb.md +0 -0
  101. {ingestr-0.13.32 → ingestr-0.13.34}/docs/tutorials/load-stripe-postgres.md +0 -0
  102. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/conftest.py +0 -0
  103. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/.gitignore +0 -0
  104. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/adjust/__init__.py +0 -0
  105. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/adjust/adjust_helpers.py +0 -0
  106. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/applovin/__init__.py +0 -0
  107. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/applovin_max/__init__.py +0 -0
  108. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/appsflyer/__init__.py +0 -0
  109. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/appsflyer/client.py +0 -0
  110. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/appstore/__init__.py +0 -0
  111. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/appstore/client.py +0 -0
  112. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/appstore/errors.py +0 -0
  113. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/appstore/models.py +0 -0
  114. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/appstore/resources.py +0 -0
  115. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/arrow/__init__.py +0 -0
  116. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/asana_source/__init__.py +0 -0
  117. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/asana_source/helpers.py +0 -0
  118. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/asana_source/settings.py +0 -0
  119. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/blob.py +0 -0
  120. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/chess/__init__.py +0 -0
  121. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/chess/helpers.py +0 -0
  122. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/chess/settings.py +0 -0
  123. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/collector/spinner.py +0 -0
  124. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/dynamodb/__init__.py +0 -0
  125. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/errors.py +0 -0
  126. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/facebook_ads/__init__.py +0 -0
  127. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/facebook_ads/exceptions.py +0 -0
  128. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/facebook_ads/helpers.py +0 -0
  129. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/facebook_ads/settings.py +0 -0
  130. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/factory.py +0 -0
  131. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/filesystem/__init__.py +0 -0
  132. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/filesystem/helpers.py +0 -0
  133. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/filesystem/readers.py +0 -0
  134. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/frankfurter/__init__.py +0 -0
  135. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/frankfurter/helpers.py +0 -0
  136. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/github/__init__.py +0 -0
  137. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/github/helpers.py +0 -0
  138. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/github/queries.py +0 -0
  139. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/github/settings.py +0 -0
  140. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/google_ads/__init__.py +0 -0
  141. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/google_ads/field.py +0 -0
  142. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/google_ads/metrics.py +0 -0
  143. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/google_ads/predicates.py +0 -0
  144. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/google_ads/reports.py +0 -0
  145. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/google_analytics/__init__.py +0 -0
  146. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/google_analytics/helpers.py +0 -0
  147. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/google_sheets/README.md +0 -0
  148. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/google_sheets/__init__.py +0 -0
  149. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
  150. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
  151. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
  152. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/gorgias/__init__.py +0 -0
  153. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/gorgias/helpers.py +0 -0
  154. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/hubspot/settings.py +0 -0
  155. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/kafka/__init__.py +0 -0
  156. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/kafka/helpers.py +0 -0
  157. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/kinesis/__init__.py +0 -0
  158. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/kinesis/helpers.py +0 -0
  159. /ingestr-0.13.32/ingestr/src/klaviyo/_init_.py → /ingestr-0.13.34/ingestr/src/klaviyo/__init__.py +0 -0
  160. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/klaviyo/client.py +0 -0
  161. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/klaviyo/helpers.py +0 -0
  162. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/linkedin_ads/__init__.py +0 -0
  163. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
  164. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/linkedin_ads/helpers.py +0 -0
  165. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/loader.py +0 -0
  166. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/mongodb/__init__.py +0 -0
  167. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/mongodb/helpers.py +0 -0
  168. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/notion/__init__.py +0 -0
  169. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/notion/helpers/__init__.py +0 -0
  170. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/notion/helpers/client.py +0 -0
  171. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/notion/helpers/database.py +0 -0
  172. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/notion/settings.py +0 -0
  173. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/personio/__init__.py +0 -0
  174. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/personio/helpers.py +0 -0
  175. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/pipedrive/__init__.py +0 -0
  176. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/pipedrive/helpers/__init__.py +0 -0
  177. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/pipedrive/helpers/custom_fields_munger.py +0 -0
  178. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/pipedrive/helpers/pages.py +0 -0
  179. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/pipedrive/settings.py +0 -0
  180. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/pipedrive/typing.py +0 -0
  181. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/resource.py +0 -0
  182. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/salesforce/__init__.py +0 -0
  183. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/salesforce/helpers.py +0 -0
  184. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/shopify/__init__.py +0 -0
  185. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/shopify/exceptions.py +0 -0
  186. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/shopify/helpers.py +0 -0
  187. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/shopify/settings.py +0 -0
  188. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/slack/__init__.py +0 -0
  189. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/slack/helpers.py +0 -0
  190. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/slack/settings.py +0 -0
  191. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/sql_database/__init__.py +0 -0
  192. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/sql_database/callbacks.py +0 -0
  193. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/stripe_analytics/__init__.py +0 -0
  194. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/stripe_analytics/helpers.py +0 -0
  195. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/stripe_analytics/settings.py +0 -0
  196. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/table_definition.py +0 -0
  197. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/testdata/fakebqcredentials.json +0 -0
  198. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/tiktok_ads/__init__.py +0 -0
  199. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -0
  200. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/time.py +0 -0
  201. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/version.py +0 -0
  202. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/zendesk/__init__.py +0 -0
  203. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/zendesk/helpers/__init__.py +0 -0
  204. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
  205. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/zendesk/helpers/credentials.py +0 -0
  206. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
  207. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/zendesk/settings.py +0 -0
  208. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/testdata/.gitignore +0 -0
  209. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/testdata/create_replace.csv +0 -0
  210. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/testdata/delete_insert_expected.csv +0 -0
  211. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/testdata/delete_insert_part1.csv +0 -0
  212. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/testdata/delete_insert_part2.csv +0 -0
  213. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/testdata/merge_expected.csv +0 -0
  214. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/testdata/merge_part1.csv +0 -0
  215. {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/testdata/merge_part2.csv +0 -0
  216. {ingestr-0.13.32 → ingestr-0.13.34}/package-lock.json +0 -0
  217. {ingestr-0.13.32 → ingestr-0.13.34}/package.json +0 -0
  218. {ingestr-0.13.32 → ingestr-0.13.34}/pyproject.toml +0 -0
  219. {ingestr-0.13.32 → ingestr-0.13.34}/requirements-dev.txt +0 -0
  220. {ingestr-0.13.32 → ingestr-0.13.34}/requirements.in +0 -0
  221. {ingestr-0.13.32 → ingestr-0.13.34}/requirements.txt +0 -0
  222. {ingestr-0.13.32 → ingestr-0.13.34}/requirements_arm64.txt +0 -0
  223. {ingestr-0.13.32 → ingestr-0.13.34}/resources/demo.gif +0 -0
  224. {ingestr-0.13.32 → ingestr-0.13.34}/resources/demo.tape +0 -0
  225. {ingestr-0.13.32 → ingestr-0.13.34}/resources/ingestr.svg +0 -0
  226. {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/AMPM.yml +0 -0
  227. {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Acronyms.yml +0 -0
  228. {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Colons.yml +0 -0
  229. {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Contractions.yml +0 -0
  230. {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/DateFormat.yml +0 -0
  231. {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Ellipses.yml +0 -0
  232. {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/EmDash.yml +0 -0
  233. {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Exclamation.yml +0 -0
  234. {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/FirstPerson.yml +0 -0
  235. {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Gender.yml +0 -0
  236. {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/GenderBias.yml +0 -0
  237. {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/HeadingPunctuation.yml +0 -0
  238. {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Headings.yml +0 -0
  239. {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Latin.yml +0 -0
  240. {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/LyHyphens.yml +0 -0
  241. {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/OptionalPlurals.yml +0 -0
  242. {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Ordinal.yml +0 -0
  243. {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/OxfordComma.yml +0 -0
  244. {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Parens.yml +0 -0
  245. {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Passive.yml +0 -0
  246. {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Periods.yml +0 -0
  247. {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Quotes.yml +0 -0
  248. {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Ranges.yml +0 -0
  249. {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Semicolons.yml +0 -0
  250. {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Slang.yml +0 -0
  251. {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Spacing.yml +0 -0
  252. {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Spelling.yml +0 -0
  253. {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Units.yml +0 -0
  254. {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/We.yml +0 -0
  255. {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Will.yml +0 -0
  256. {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/WordList.yml +0 -0
  257. {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/meta.json +0 -0
  258. {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/vocab.txt +0 -0
  259. {ingestr-0.13.32 → ingestr-0.13.34}/styles/bruin/Ingestr.yml +0 -0
  260. {ingestr-0.13.32 → ingestr-0.13.34}/styles/config/vocabularies/bruin/accept.txt +0 -0
  261. {ingestr-0.13.32 → ingestr-0.13.34}/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.34
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
 
@@ -42,3 +42,23 @@ HubSpot source allows ingesting the following sources into separate tables:
42
42
  - `contacts`: Retrieves information about visitors, potential customers, and leads.
43
43
 
44
44
  Use these as `--source-table` parameter in the `ingestr ingest` command.
45
+
46
+ ## Custom Objects
47
+
48
+ HubSpot custom objects are supported by using the `custom` table.
49
+
50
+ The format for the custom object is as follows:
51
+
52
+ ```plaintext
53
+ custom:<custom_object_name>:<optional associations>
54
+ ```
55
+
56
+ For example, to ingest the `course` custom object with the `contacts` and `companies` associations, the format would be:
57
+
58
+ ```plaintext
59
+ custom:course:contacts,companies
60
+ ```
61
+
62
+ This would pull all the data for the `course` custom object and include the `contacts` and `companies` associations in the resulting table.
63
+
64
+
@@ -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.34"
@@ -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:
@@ -197,11 +197,18 @@ def hubspot(
197
197
  api_key: str = api_key,
198
198
  custom_object_name: str = custom_object,
199
199
  ) -> Iterator[TDataItems]:
200
- get_custom_object = fetch_data_raw(CRM_SCHEMAS_ENDPOINT, api_key)
200
+ custom_objects = fetch_data_raw(CRM_SCHEMAS_ENDPOINT, api_key)
201
201
  object_type_id = None
202
+ associations = None
203
+ if ":" in custom_object_name:
204
+ fields = custom_object_name.split(":")
205
+ if len(fields) == 2:
206
+ custom_object_name = fields[0]
207
+ associations = fields[1]
202
208
 
203
209
  custom_object_lowercase = custom_object_name.lower()
204
- for custom_object in get_custom_object["results"]:
210
+
211
+ for custom_object in custom_objects["results"]:
205
212
  if custom_object["name"].lower() == custom_object_lowercase:
206
213
  object_type_id = custom_object["objectTypeId"]
207
214
  break
@@ -223,6 +230,8 @@ def hubspot(
223
230
  props = ",".join(sorted(list(set(props))))
224
231
 
225
232
  custom_object_endpoint = f"crm/v3/objects/{object_type_id}/?properties={props}"
233
+ if associations:
234
+ custom_object_endpoint += f"&associations={associations}"
226
235
 
227
236
  """Hubspot custom object details resource"""
228
237
  yield from fetch_data(custom_object_endpoint, api_key, resource_name="custom")
@@ -148,10 +148,6 @@ def fetch_data(
148
148
  "updatedAt": _result.get("updatedAt", ""),
149
149
  }
150
150
  )
151
- elif resource_name == "custom":
152
- _objects.append(
153
- _result.get("properties", ""),
154
- )
155
151
  else:
156
152
  _obj = _result.get("properties", _result)
157
153
  if "id" not in _obj and "id" in _result:
@@ -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