ingestr 0.13.56__tar.gz → 0.13.57__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 (301) hide show
  1. {ingestr-0.13.56 → ingestr-0.13.57}/PKG-INFO +1 -5
  2. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/kinesis.md +5 -1
  3. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/stripe.md +63 -9
  4. ingestr-0.13.57/ingestr/src/buildinfo.py +1 -0
  5. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/kinesis/__init__.py +3 -3
  6. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/kinesis/helpers.py +19 -2
  7. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/sources.py +45 -15
  8. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/stripe_analytics/__init__.py +86 -1
  9. ingestr-0.13.57/ingestr/src/stripe_analytics/helpers.py +408 -0
  10. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/stripe_analytics/settings.py +6 -13
  11. {ingestr-0.13.56 → ingestr-0.13.57}/requirements.in +0 -1
  12. {ingestr-0.13.56 → ingestr-0.13.57}/requirements.txt +3 -23
  13. {ingestr-0.13.56 → ingestr-0.13.57}/requirements_arm64.txt +3 -23
  14. ingestr-0.13.56/ingestr/src/buildinfo.py +0 -1
  15. ingestr-0.13.56/ingestr/src/stripe_analytics/helpers.py +0 -68
  16. {ingestr-0.13.56 → ingestr-0.13.57}/.dockerignore +0 -0
  17. {ingestr-0.13.56 → ingestr-0.13.57}/.githooks/pre-commit-hook.sh +0 -0
  18. {ingestr-0.13.56 → ingestr-0.13.57}/.github/workflows/deploy-docs.yml +0 -0
  19. {ingestr-0.13.56 → ingestr-0.13.57}/.github/workflows/release.yml +0 -0
  20. {ingestr-0.13.56 → ingestr-0.13.57}/.github/workflows/secrets-scan.yml +0 -0
  21. {ingestr-0.13.56 → ingestr-0.13.57}/.github/workflows/tests.yml +0 -0
  22. {ingestr-0.13.56 → ingestr-0.13.57}/.gitignore +0 -0
  23. {ingestr-0.13.56 → ingestr-0.13.57}/.gitleaksignore +0 -0
  24. {ingestr-0.13.56 → ingestr-0.13.57}/.python-version +0 -0
  25. {ingestr-0.13.56 → ingestr-0.13.57}/.vale.ini +0 -0
  26. {ingestr-0.13.56 → ingestr-0.13.57}/Dockerfile +0 -0
  27. {ingestr-0.13.56 → ingestr-0.13.57}/LICENSE.md +0 -0
  28. {ingestr-0.13.56 → ingestr-0.13.57}/Makefile +0 -0
  29. {ingestr-0.13.56 → ingestr-0.13.57}/README.md +0 -0
  30. {ingestr-0.13.56 → ingestr-0.13.57}/docs/.vitepress/config.mjs +0 -0
  31. {ingestr-0.13.56 → ingestr-0.13.57}/docs/.vitepress/theme/custom.css +0 -0
  32. {ingestr-0.13.56 → ingestr-0.13.57}/docs/.vitepress/theme/index.js +0 -0
  33. {ingestr-0.13.56 → ingestr-0.13.57}/docs/commands/example-uris.md +0 -0
  34. {ingestr-0.13.56 → ingestr-0.13.57}/docs/commands/ingest.md +0 -0
  35. {ingestr-0.13.56 → ingestr-0.13.57}/docs/getting-started/core-concepts.md +0 -0
  36. {ingestr-0.13.56 → ingestr-0.13.57}/docs/getting-started/incremental-loading.md +0 -0
  37. {ingestr-0.13.56 → ingestr-0.13.57}/docs/getting-started/quickstart.md +0 -0
  38. {ingestr-0.13.56 → ingestr-0.13.57}/docs/getting-started/telemetry.md +0 -0
  39. {ingestr-0.13.56 → ingestr-0.13.57}/docs/index.md +0 -0
  40. {ingestr-0.13.56 → ingestr-0.13.57}/docs/media/applovin_max.png +0 -0
  41. {ingestr-0.13.56 → ingestr-0.13.57}/docs/media/athena.png +0 -0
  42. {ingestr-0.13.56 → ingestr-0.13.57}/docs/media/clickhouse_img.png +0 -0
  43. {ingestr-0.13.56 → ingestr-0.13.57}/docs/media/cratedb-source.png +0 -0
  44. {ingestr-0.13.56 → ingestr-0.13.57}/docs/media/freshdesk_ingestion.png +0 -0
  45. {ingestr-0.13.56 → ingestr-0.13.57}/docs/media/gcp_spanner_ingestion.png +0 -0
  46. {ingestr-0.13.56 → ingestr-0.13.57}/docs/media/github.png +0 -0
  47. {ingestr-0.13.56 → ingestr-0.13.57}/docs/media/google_analytics_realtime_report.png +0 -0
  48. {ingestr-0.13.56 → ingestr-0.13.57}/docs/media/googleanalytics.png +0 -0
  49. {ingestr-0.13.56 → ingestr-0.13.57}/docs/media/ingestion_elasticsearch_img.png +0 -0
  50. {ingestr-0.13.56 → ingestr-0.13.57}/docs/media/kinesis.bigquery.png +0 -0
  51. {ingestr-0.13.56 → ingestr-0.13.57}/docs/media/linkedin_ads.png +0 -0
  52. {ingestr-0.13.56 → ingestr-0.13.57}/docs/media/mixpanel_ingestion.png +0 -0
  53. {ingestr-0.13.56 → ingestr-0.13.57}/docs/media/personio.png +0 -0
  54. {ingestr-0.13.56 → ingestr-0.13.57}/docs/media/personio_duckdb.png +0 -0
  55. {ingestr-0.13.56 → ingestr-0.13.57}/docs/media/phantombuster.png +0 -0
  56. {ingestr-0.13.56 → ingestr-0.13.57}/docs/media/pipedrive.png +0 -0
  57. {ingestr-0.13.56 → ingestr-0.13.57}/docs/media/quickbook_ingestion.png +0 -0
  58. {ingestr-0.13.56 → ingestr-0.13.57}/docs/media/sftp.png +0 -0
  59. {ingestr-0.13.56 → ingestr-0.13.57}/docs/media/stripe_postgres.png +0 -0
  60. {ingestr-0.13.56 → ingestr-0.13.57}/docs/media/tiktok.png +0 -0
  61. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/adjust.md +0 -0
  62. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/airtable.md +0 -0
  63. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/applovin.md +0 -0
  64. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/applovin_max.md +0 -0
  65. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/appsflyer.md +0 -0
  66. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/appstore.md +0 -0
  67. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/asana.md +0 -0
  68. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/athena.md +0 -0
  69. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/attio.md +0 -0
  70. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/bigquery.md +0 -0
  71. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/chess.md +0 -0
  72. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/clickhouse.md +0 -0
  73. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/cratedb.md +0 -0
  74. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/csv.md +0 -0
  75. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/custom_queries.md +0 -0
  76. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/databricks.md +0 -0
  77. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/db2.md +0 -0
  78. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/duckdb.md +0 -0
  79. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/dynamodb.md +0 -0
  80. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/elasticsearch.md +0 -0
  81. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/facebook-ads.md +0 -0
  82. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/frankfurter.md +0 -0
  83. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/freshdesk.md +0 -0
  84. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/gcs.md +0 -0
  85. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/github.md +0 -0
  86. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/google-ads.md +0 -0
  87. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/google_analytics.md +0 -0
  88. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/gorgias.md +0 -0
  89. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/gsheets.md +0 -0
  90. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/hubspot.md +0 -0
  91. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/kafka.md +0 -0
  92. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/klaviyo.md +0 -0
  93. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/linkedin_ads.md +0 -0
  94. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/mixpanel.md +0 -0
  95. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/mongodb.md +0 -0
  96. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/mssql.md +0 -0
  97. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/mysql.md +0 -0
  98. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/notion.md +0 -0
  99. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/oracle.md +0 -0
  100. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/personio.md +0 -0
  101. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/phantombuster.md +0 -0
  102. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/pipedrive.md +0 -0
  103. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/postgres.md +0 -0
  104. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/quickbooks.md +0 -0
  105. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/redshift.md +0 -0
  106. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/s3.md +0 -0
  107. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/salesforce.md +0 -0
  108. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/sap-hana.md +0 -0
  109. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/sftp.md +0 -0
  110. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/shopify.md +0 -0
  111. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/slack.md +0 -0
  112. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/smartsheets.md +0 -0
  113. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/snowflake.md +0 -0
  114. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/solidgate.md +0 -0
  115. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/spanner.md +0 -0
  116. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/sqlite.md +0 -0
  117. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/tiktok-ads.md +0 -0
  118. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/trustpilot.md +0 -0
  119. {ingestr-0.13.56 → ingestr-0.13.57}/docs/supported-sources/zendesk.md +0 -0
  120. {ingestr-0.13.56 → ingestr-0.13.57}/docs/tutorials/load-kinesis-bigquery.md +0 -0
  121. {ingestr-0.13.56 → ingestr-0.13.57}/docs/tutorials/load-personio-duckdb.md +0 -0
  122. {ingestr-0.13.56 → ingestr-0.13.57}/docs/tutorials/load-stripe-postgres.md +0 -0
  123. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/conftest.py +0 -0
  124. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/main.py +0 -0
  125. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/.gitignore +0 -0
  126. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/adjust/__init__.py +0 -0
  127. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/adjust/adjust_helpers.py +0 -0
  128. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/airtable/__init__.py +0 -0
  129. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/applovin/__init__.py +0 -0
  130. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/applovin_max/__init__.py +0 -0
  131. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/appsflyer/__init__.py +0 -0
  132. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/appsflyer/client.py +0 -0
  133. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/appstore/__init__.py +0 -0
  134. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/appstore/client.py +0 -0
  135. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/appstore/errors.py +0 -0
  136. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/appstore/models.py +0 -0
  137. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/appstore/resources.py +0 -0
  138. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/arrow/__init__.py +0 -0
  139. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/asana_source/__init__.py +0 -0
  140. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/asana_source/helpers.py +0 -0
  141. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/asana_source/settings.py +0 -0
  142. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/attio/__init__.py +0 -0
  143. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/attio/helpers.py +0 -0
  144. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/blob.py +0 -0
  145. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/chess/__init__.py +0 -0
  146. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/chess/helpers.py +0 -0
  147. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/chess/settings.py +0 -0
  148. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/collector/spinner.py +0 -0
  149. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/destinations.py +0 -0
  150. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/dynamodb/__init__.py +0 -0
  151. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/elasticsearch/__init__.py +0 -0
  152. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/errors.py +0 -0
  153. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/facebook_ads/__init__.py +0 -0
  154. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/facebook_ads/exceptions.py +0 -0
  155. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/facebook_ads/helpers.py +0 -0
  156. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/facebook_ads/settings.py +0 -0
  157. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/facebook_ads/utils.py +0 -0
  158. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/factory.py +0 -0
  159. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/filesystem/__init__.py +0 -0
  160. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/filesystem/helpers.py +0 -0
  161. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/filesystem/readers.py +0 -0
  162. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/filters.py +0 -0
  163. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/frankfurter/__init__.py +0 -0
  164. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/frankfurter/helpers.py +0 -0
  165. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/freshdesk/__init__.py +0 -0
  166. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/freshdesk/freshdesk_client.py +0 -0
  167. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/freshdesk/settings.py +0 -0
  168. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/github/__init__.py +0 -0
  169. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/github/helpers.py +0 -0
  170. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/github/queries.py +0 -0
  171. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/github/settings.py +0 -0
  172. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/google_ads/__init__.py +0 -0
  173. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/google_ads/field.py +0 -0
  174. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/google_ads/metrics.py +0 -0
  175. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/google_ads/predicates.py +0 -0
  176. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/google_ads/reports.py +0 -0
  177. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/google_analytics/__init__.py +0 -0
  178. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/google_analytics/helpers.py +0 -0
  179. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/google_sheets/README.md +0 -0
  180. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/google_sheets/__init__.py +0 -0
  181. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
  182. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
  183. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
  184. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/gorgias/__init__.py +0 -0
  185. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/gorgias/helpers.py +0 -0
  186. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/http_client.py +0 -0
  187. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/hubspot/__init__.py +0 -0
  188. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/hubspot/helpers.py +0 -0
  189. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/hubspot/settings.py +0 -0
  190. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/kafka/__init__.py +0 -0
  191. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/kafka/helpers.py +0 -0
  192. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/klaviyo/__init__.py +0 -0
  193. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/klaviyo/client.py +0 -0
  194. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/klaviyo/helpers.py +0 -0
  195. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/linkedin_ads/__init__.py +0 -0
  196. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
  197. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/linkedin_ads/helpers.py +0 -0
  198. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/loader.py +0 -0
  199. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/mixpanel/__init__.py +0 -0
  200. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/mixpanel/client.py +0 -0
  201. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/mongodb/__init__.py +0 -0
  202. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/mongodb/helpers.py +0 -0
  203. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/notion/__init__.py +0 -0
  204. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/notion/helpers/__init__.py +0 -0
  205. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/notion/helpers/client.py +0 -0
  206. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/notion/helpers/database.py +0 -0
  207. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/notion/settings.py +0 -0
  208. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/partition.py +0 -0
  209. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/personio/__init__.py +0 -0
  210. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/personio/helpers.py +0 -0
  211. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/phantombuster/__init__.py +0 -0
  212. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/phantombuster/client.py +0 -0
  213. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/pipedrive/__init__.py +0 -0
  214. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/pipedrive/helpers/__init__.py +0 -0
  215. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/pipedrive/helpers/custom_fields_munger.py +0 -0
  216. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/pipedrive/helpers/pages.py +0 -0
  217. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/pipedrive/settings.py +0 -0
  218. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/pipedrive/typing.py +0 -0
  219. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/quickbooks/__init__.py +0 -0
  220. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/resource.py +0 -0
  221. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/salesforce/__init__.py +0 -0
  222. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/salesforce/helpers.py +0 -0
  223. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/shopify/__init__.py +0 -0
  224. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/shopify/exceptions.py +0 -0
  225. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/shopify/helpers.py +0 -0
  226. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/shopify/settings.py +0 -0
  227. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/slack/__init__.py +0 -0
  228. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/slack/helpers.py +0 -0
  229. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/slack/settings.py +0 -0
  230. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/smartsheets/__init__.py +0 -0
  231. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/solidgate/__init__.py +0 -0
  232. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/solidgate/helpers.py +0 -0
  233. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/sql_database/__init__.py +0 -0
  234. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/sql_database/callbacks.py +0 -0
  235. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/table_definition.py +0 -0
  236. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/telemetry/event.py +0 -0
  237. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/testdata/fakebqcredentials.json +0 -0
  238. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/tiktok_ads/__init__.py +0 -0
  239. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -0
  240. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/time.py +0 -0
  241. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/trustpilot/__init__.py +0 -0
  242. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/trustpilot/client.py +0 -0
  243. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/version.py +0 -0
  244. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/zendesk/__init__.py +0 -0
  245. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/zendesk/helpers/__init__.py +0 -0
  246. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
  247. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/zendesk/helpers/credentials.py +0 -0
  248. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
  249. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/src/zendesk/settings.py +0 -0
  250. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/testdata/.gitignore +0 -0
  251. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/testdata/create_replace.csv +0 -0
  252. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/testdata/delete_insert_expected.csv +0 -0
  253. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/testdata/delete_insert_part1.csv +0 -0
  254. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/testdata/delete_insert_part2.csv +0 -0
  255. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/testdata/merge_expected.csv +0 -0
  256. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/testdata/merge_part1.csv +0 -0
  257. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/testdata/merge_part2.csv +0 -0
  258. {ingestr-0.13.56 → ingestr-0.13.57}/ingestr/tests/unit/test_smartsheets.py +0 -0
  259. {ingestr-0.13.56 → ingestr-0.13.57}/package-lock.json +0 -0
  260. {ingestr-0.13.56 → ingestr-0.13.57}/package.json +0 -0
  261. {ingestr-0.13.56 → ingestr-0.13.57}/pyproject.toml +0 -0
  262. {ingestr-0.13.56 → ingestr-0.13.57}/requirements-dev.txt +0 -0
  263. {ingestr-0.13.56 → ingestr-0.13.57}/resources/demo.gif +0 -0
  264. {ingestr-0.13.56 → ingestr-0.13.57}/resources/demo.tape +0 -0
  265. {ingestr-0.13.56 → ingestr-0.13.57}/resources/ingestr.svg +0 -0
  266. {ingestr-0.13.56 → ingestr-0.13.57}/styles/Google/AMPM.yml +0 -0
  267. {ingestr-0.13.56 → ingestr-0.13.57}/styles/Google/Acronyms.yml +0 -0
  268. {ingestr-0.13.56 → ingestr-0.13.57}/styles/Google/Colons.yml +0 -0
  269. {ingestr-0.13.56 → ingestr-0.13.57}/styles/Google/Contractions.yml +0 -0
  270. {ingestr-0.13.56 → ingestr-0.13.57}/styles/Google/DateFormat.yml +0 -0
  271. {ingestr-0.13.56 → ingestr-0.13.57}/styles/Google/Ellipses.yml +0 -0
  272. {ingestr-0.13.56 → ingestr-0.13.57}/styles/Google/EmDash.yml +0 -0
  273. {ingestr-0.13.56 → ingestr-0.13.57}/styles/Google/Exclamation.yml +0 -0
  274. {ingestr-0.13.56 → ingestr-0.13.57}/styles/Google/FirstPerson.yml +0 -0
  275. {ingestr-0.13.56 → ingestr-0.13.57}/styles/Google/Gender.yml +0 -0
  276. {ingestr-0.13.56 → ingestr-0.13.57}/styles/Google/GenderBias.yml +0 -0
  277. {ingestr-0.13.56 → ingestr-0.13.57}/styles/Google/HeadingPunctuation.yml +0 -0
  278. {ingestr-0.13.56 → ingestr-0.13.57}/styles/Google/Headings.yml +0 -0
  279. {ingestr-0.13.56 → ingestr-0.13.57}/styles/Google/Latin.yml +0 -0
  280. {ingestr-0.13.56 → ingestr-0.13.57}/styles/Google/LyHyphens.yml +0 -0
  281. {ingestr-0.13.56 → ingestr-0.13.57}/styles/Google/OptionalPlurals.yml +0 -0
  282. {ingestr-0.13.56 → ingestr-0.13.57}/styles/Google/Ordinal.yml +0 -0
  283. {ingestr-0.13.56 → ingestr-0.13.57}/styles/Google/OxfordComma.yml +0 -0
  284. {ingestr-0.13.56 → ingestr-0.13.57}/styles/Google/Parens.yml +0 -0
  285. {ingestr-0.13.56 → ingestr-0.13.57}/styles/Google/Passive.yml +0 -0
  286. {ingestr-0.13.56 → ingestr-0.13.57}/styles/Google/Periods.yml +0 -0
  287. {ingestr-0.13.56 → ingestr-0.13.57}/styles/Google/Quotes.yml +0 -0
  288. {ingestr-0.13.56 → ingestr-0.13.57}/styles/Google/Ranges.yml +0 -0
  289. {ingestr-0.13.56 → ingestr-0.13.57}/styles/Google/Semicolons.yml +0 -0
  290. {ingestr-0.13.56 → ingestr-0.13.57}/styles/Google/Slang.yml +0 -0
  291. {ingestr-0.13.56 → ingestr-0.13.57}/styles/Google/Spacing.yml +0 -0
  292. {ingestr-0.13.56 → ingestr-0.13.57}/styles/Google/Spelling.yml +0 -0
  293. {ingestr-0.13.56 → ingestr-0.13.57}/styles/Google/Units.yml +0 -0
  294. {ingestr-0.13.56 → ingestr-0.13.57}/styles/Google/We.yml +0 -0
  295. {ingestr-0.13.56 → ingestr-0.13.57}/styles/Google/Will.yml +0 -0
  296. {ingestr-0.13.56 → ingestr-0.13.57}/styles/Google/WordList.yml +0 -0
  297. {ingestr-0.13.56 → ingestr-0.13.57}/styles/Google/meta.json +0 -0
  298. {ingestr-0.13.56 → ingestr-0.13.57}/styles/Google/vocab.txt +0 -0
  299. {ingestr-0.13.56 → ingestr-0.13.57}/styles/bruin/Ingestr.yml +0 -0
  300. {ingestr-0.13.56 → ingestr-0.13.57}/styles/config/vocabularies/bruin/accept.txt +0 -0
  301. {ingestr-0.13.56 → ingestr-0.13.57}/test.env.template +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ingestr
3
- Version: 0.13.56
3
+ Version: 0.13.57
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
@@ -27,7 +27,6 @@ Requires-Dist: asynch==0.2.4
27
27
  Requires-Dist: attrs==25.1.0
28
28
  Requires-Dist: backoff==2.2.1
29
29
  Requires-Dist: bcrypt==4.3.0
30
- Requires-Dist: beautifulsoup4==4.13.3
31
30
  Requires-Dist: boto3==1.37.1
32
31
  Requires-Dist: botocore==1.37.1
33
32
  Requires-Dist: cachetools==5.5.2
@@ -156,7 +155,6 @@ Requires-Dist: python-quickbooks==0.9.2
156
155
  Requires-Dist: pytz==2025.1
157
156
  Requires-Dist: pyyaml==6.0.2
158
157
  Requires-Dist: rauth==0.7.3
159
- Requires-Dist: redshift-connector==2.1.5
160
158
  Requires-Dist: requests-file==2.1.0
161
159
  Requires-Dist: requests-oauthlib==1.3.1
162
160
  Requires-Dist: requests-toolbelt==1.0.0
@@ -168,7 +166,6 @@ Requires-Dist: rsa==4.9
168
166
  Requires-Dist: rudder-sdk-python==2.1.4
169
167
  Requires-Dist: s3fs==2025.3.2
170
168
  Requires-Dist: s3transfer==0.11.3
171
- Requires-Dist: scramp==1.4.5
172
169
  Requires-Dist: semver==3.0.4
173
170
  Requires-Dist: setuptools==75.8.2
174
171
  Requires-Dist: shellingham==1.5.4
@@ -180,7 +177,6 @@ Requires-Dist: smmap==5.0.2
180
177
  Requires-Dist: snowflake-connector-python==3.14.0
181
178
  Requires-Dist: snowflake-sqlalchemy==1.6.1
182
179
  Requires-Dist: sortedcontainers==2.4.0
183
- Requires-Dist: soupsieve==2.6
184
180
  Requires-Dist: sqlalchemy-bigquery==1.12.1
185
181
  Requires-Dist: sqlalchemy-cratedb==0.42.0.dev2
186
182
  Requires-Dist: sqlalchemy-hana==2.0.0
@@ -31,9 +31,13 @@ ingestr ingest --source-uri 'kinesis://?aws_access_key_id=id_123&aws_secret_acce
31
31
  --dest-table 'dest.results'
32
32
  ```
33
33
 
34
- When using Kinesis as a source, specify the `stream name` you want to read from as the `--source-table` parameter. For example, if you want to read from a Kinesis stream named "customer_events", you would use `--source-table 'customer_events'`.
34
+ When using Kinesis as a source, specify the [StreamName] you want to read from as the `--source-table` parameter. For example, if you want to read from a Kinesis stream named "customer_events", you would use `--source-table 'customer_events'`.
35
+ You can also use a full Kinesis [StreamARN] to address the stream in [ARN] format, like `arn:aws:kinesis:eu-central-1:842404475894:stream/customer_events`.
35
36
 
36
37
  ### Initial Load Configuration
37
38
  By default, ingestr reads from the beginning of the Kinesis stream. To start reading from a specific time, use the `interval_start` parameter.
38
39
 
39
40
 
41
+ [ARN]: https://docs.aws.amazon.com/IAM/latest/UserGuide/reference-arns.html
42
+ [StreamARN]: https://docs.aws.amazon.com/kinesis/latest/APIReference/API_StreamDescription.html#Streams-Type-StreamDescription-StreamARN
43
+ [StreamName]: https://docs.aws.amazon.com/kinesis/latest/APIReference/API_StreamDescription.html#Streams-Type-StreamDescription-StreamName
@@ -30,11 +30,68 @@ ingestr ingest --source-uri 'stripe://?api_key=sk_test_12345' --source-table 'ch
30
30
 
31
31
  The result of this command will be a table in the `stripe.duckdb` database with JSON columns.
32
32
 
33
+ ## Table Name Structure
34
+
35
+ Stripe source supports different loading modes that can be specified using the table name structure:
36
+
37
+ - `<endpoint>` - Standard async loading (default)
38
+ - `<endpoint>:sync` - Full loading with synchronous processing
39
+ - `<endpoint>:sync:incremental` - Incremental loading mode with synchronous processing
40
+
41
+ ### Loading Modes and Trade-offs
42
+
43
+ #### Standard Async Loading (Default)
44
+ **Format**: `<endpoint>` (e.g., `charges`, `subscriptions`)
45
+
46
+ - **Use case**: Full data loading from all time periods
47
+ - **Performance**: Loads data in parallel using async processing
48
+ - **Data completeness**: Captures all historical data and updates
49
+ - **Speed**: Slower due to comprehensive data retrieval
50
+ - **Best for**: You want to have all updated data in your database
51
+
52
+ **Example**:
53
+ ```sh
54
+ ingestr ingest --source-uri 'stripe://?api_key=sk_test_12345' --source-table 'subscriptions' --dest-uri duckdb:///stripe.duckdb --dest-table 'dest.subscriptions'
55
+ ```
56
+
57
+ #### Sync Loading
58
+ **Format**: `<endpoint>:sync` (e.g., `charges:sync`, `subscriptions:sync`)
59
+
60
+ - **Use case**: Full data loading from all time periods
61
+ - **Performance**: Loads data in parallel using sync processing
62
+ - **Data completeness**: Captures all historical data and updates
63
+ - **Speed**: Slower due to comprehensive data retrieval, faster if you have less data
64
+
65
+ #### Incremental Loading
66
+ **Format**: `<endpoint>:sync:incremental` (e.g., `charges:sync:incremental`, `events:sync:incremental`)
67
+
68
+ - **Use case**: Loading data within specific time windows
69
+ - **Performance**: Fast, processes only data within the specified interval
70
+ - **Data completeness**: Limited to the specified time window, does not track updates from past dates
71
+ - **Speed**: Faster due to filtered data retrieval
72
+ - **Processing**: Runs in synchronous mode only
73
+ - **Best for**: Quick loads, you don't care about the updates to past data
74
+
75
+ **Example**:
76
+ ```sh
77
+ ingestr ingest --source-uri 'stripe://?api_key=sk_test_12345' --source-table 'charges:sync:incremental' --dest-uri duckdb:///stripe.duckdb --dest-table 'dest.charges' --interval-start '2024-01-01' --interval-end '2024-01-31'
78
+ ```
79
+
80
+ ### Choosing the Right Approach
81
+
82
+ | Approach | Speed | Data Completeness | Use Case |
83
+ |----------|--------|------------------|----------|
84
+ | **Standard Async** | Faster for larger data, slower for smaller data | Complete historical data | Initial loads, full historical analysis |
85
+ | **Sync** | Slow for larger data, faster for smaller data | Complete historical data | Initial loads, full historical analysis |
86
+ | **Incremental** | Fastest | Time-window specific | Regular updates, recent data analysis |
87
+
33
88
  ## Tables
34
89
 
35
90
  Stripe source allows ingesting the following sources into separate tables:
36
91
 
37
- ### Regular Endpoints
92
+ ### All Endpoints
93
+
94
+ All endpoints support the standard async loading mode. The following endpoints are available:
38
95
 
39
96
  - `account`: Contains information about a Stripe account, including balances, payouts, and account settings.
40
97
  - `apple_pay_domain`: Represents Apple Pay domains registered with Stripe for processing Apple Pay payments.
@@ -67,12 +124,7 @@ Stripe source allows ingesting the following sources into separate tables:
67
124
  - `top_up`: Records top-ups made to Stripe accounts.
68
125
  - `transfer`: Records transfers between Stripe accounts.
69
126
  - `webhook_endpoint`: Contains webhook endpoint configurations for receiving event notifications.
70
-
71
- ### Incremental Endpoints
72
-
73
- The following endpoints support incremental loading, meaning only new or updated records will be fetched:
74
-
75
- - `application_fee`: Records fees collected by platforms (incremental).
127
+ - `application_fee`: Records fees collected by platforms.
76
128
  - `balance_transaction`: Records transactions that affect the Stripe account balance, such as charges, refunds, and payouts.
77
129
  - `charge`: Returns a list of charges.
78
130
  - `credit_note`: Contains credit note information for refunds and adjustments.
@@ -80,12 +132,14 @@ The following endpoints support incremental loading, meaning only new or updated
80
132
  - `invoice`: Represents invoices sent to customers, detailing line items, amounts, and payment status.
81
133
  - `invoice_item`: Contains individual line items that can be added to invoices.
82
134
  - `invoice_line_item`: Represents line items within invoices.
83
- - `setup_attempt`: Records attempts to set up payment methods (also available as incremental).
84
135
 
85
136
  Use these as `--source-table` parameter in the `ingestr ingest` command.
86
137
 
138
+ > [!TIP]
139
+ > For time-sensitive data analysis or regular updates, use incremental loading (`:incremental`) with `--interval-start` and `--interval-end` parameters for faster processing. For comprehensive historical analysis, use standard async loading without any suffix.
140
+
87
141
  > [!WARNING]
88
- > Stripe does not support incremental loading for many endpoints in its APIs, which means ingestr will load endpoints incrementally if they support it, and do a full-refresh if not.
142
+ > Incremental loading filters data based on the specified time window and does not track updates to records created outside that window. Use standard async loading if you need to capture all historical updates.
89
143
 
90
144
  > [!NOTE]
91
145
  > For backward compatibility, non-underscored versions of table names (e.g., `checkoutsession`, `paymentintent`, `subscriptionitem`) are still supported but will be deprecated in future versions. Please use the underscored versions (e.g., `checkout_session`, `payment_intent`, `subscription_item`) for new integrations.
@@ -0,0 +1 @@
1
+ version = "v0.13.57"
@@ -9,7 +9,7 @@ from dlt.common.time import ensure_pendulum_datetime
9
9
  from dlt.common.typing import StrStr, TAnyDateTime, TDataItem
10
10
  from dlt.common.utils import digest128
11
11
 
12
- from .helpers import get_shard_iterator, max_sequence_by_shard
12
+ from .helpers import get_shard_iterator, get_stream_address, max_sequence_by_shard
13
13
 
14
14
 
15
15
  @dlt.resource(
@@ -42,7 +42,7 @@ def kinesis_stream(
42
42
  initial_at_timestamp (TAnyDateTime): An initial timestamp used to generate AT_TIMESTAMP or LATEST iterator when timestamp value is 0
43
43
  max_number_of_messages (int): Maximum number of messages to read in one run. Actual read may exceed that number by up to chunk_size. Defaults to None (no limit).
44
44
  milliseconds_behind_latest (int): The number of milliseconds behind the top of the shard to stop reading messages, defaults to 1000.
45
- parse_json (bool): If True, assumes that messages are json strings, parses them and returns instead of `data` (otherwise). Defaults to False.
45
+ parse_json (bool): If True, assumes that messages are json strings, parses them and returns instead of `data` (otherwise). Defaults to True.
46
46
  chunk_size (int): The number of records to fetch at once. Defaults to 1000.
47
47
  Yields:
48
48
  Iterable[TDataItem]: Messages. Contain Kinesis envelope in `kinesis` and bytes data in `data` (if `parse_json` disabled)
@@ -65,7 +65,7 @@ def kinesis_stream(
65
65
  # so next time we request shards at AT_TIMESTAMP that is now
66
66
  resource_state["initial_at_timestamp"] = pendulum.now("UTC").subtract(seconds=1)
67
67
 
68
- shards_list = kinesis_client.list_shards(StreamName=stream_name)
68
+ shards_list = kinesis_client.list_shards(**get_stream_address(stream_name))
69
69
  shards: List[StrStr] = shards_list["Shards"]
70
70
  while next_token := shards_list.get("NextToken"):
71
71
  shards_list = kinesis_client.list_shards(NextToken=next_token)
@@ -2,7 +2,7 @@ from typing import Any, Sequence, Tuple
2
2
 
3
3
  import dlt
4
4
  from dlt.common import pendulum
5
- from dlt.common.typing import DictStrAny, StrAny, StrStr
5
+ from dlt.common.typing import DictStrAny, DictStrStr, StrAny, StrStr
6
6
 
7
7
 
8
8
  def get_shard_iterator(
@@ -40,7 +40,7 @@ def get_shard_iterator(
40
40
  )
41
41
 
42
42
  shard_iterator: StrStr = kinesis_client.get_shard_iterator(
43
- StreamName=stream_name, ShardId=shard_id, **iterator_params
43
+ **get_stream_address(stream_name), ShardId=shard_id, **iterator_params
44
44
  )
45
45
  return shard_iterator["ShardIterator"], iterator_params
46
46
 
@@ -63,3 +63,20 @@ def max_sequence_by_shard(values: Sequence[StrStr]) -> StrStr:
63
63
  # we compare message sequence at shard_id
64
64
  last_value[shard_id] = max(item["seq_no"], last_value.get(shard_id, ""))
65
65
  return last_value
66
+
67
+
68
+ def get_stream_address(stream_name: str) -> DictStrStr:
69
+ """
70
+ Return address of stream, either as StreamName or StreamARN, when applicable.
71
+
72
+ Examples:
73
+ - customer_events
74
+ - arn:aws:kinesis:eu-central-1:842404475894:stream/customer_events
75
+
76
+ https://docs.aws.amazon.com/kinesis/latest/APIReference/API_StreamDescription.html#Streams-Type-StreamDescription-StreamName
77
+ https://docs.aws.amazon.com/kinesis/latest/APIReference/API_StreamDescription.html#Streams-Type-StreamDescription-StreamARN
78
+ """
79
+ if stream_name.startswith("arn:"):
80
+ return {"StreamARN": stream_name}
81
+ else:
82
+ return {"StreamName": stream_name}
@@ -677,24 +677,33 @@ class StripeAnalyticsSource:
677
677
 
678
678
  table = table.lower()
679
679
 
680
- from ingestr.src.stripe_analytics.settings import (
681
- ENDPOINTS,
682
- INCREMENTAL_ENDPOINTS,
683
- )
680
+ from ingestr.src.stripe_analytics.settings import ENDPOINTS
684
681
 
685
- if table in ENDPOINTS:
686
- endpoint = ENDPOINTS[table]
687
- from ingestr.src.stripe_analytics import stripe_source
682
+ endpoint = None
683
+ incremental = False
684
+ sync = False
688
685
 
689
- return stripe_source(
690
- endpoints=[
691
- endpoint,
692
- ],
693
- stripe_secret_key=api_key[0],
694
- ).with_resources(endpoint)
686
+ table_fields = table.split(":")
687
+ if len(table_fields) == 1:
688
+ endpoint = table_fields[0]
689
+ elif len(table_fields) == 2:
690
+ endpoint = table_fields[0]
691
+ sync = table_fields[1] == "sync"
692
+ elif len(table_fields) == 3:
693
+ endpoint = table_fields[0]
694
+ sync = table_fields[1] == "sync"
695
+ incremental = table_fields[2] == "incremental"
696
+ else:
697
+ raise ValueError(
698
+ "Invalid Stripe table format. Expected: stripe:<endpoint> or stripe:<endpoint>:<sync> or stripe:<endpoint>:<sync>:<incremental>"
699
+ )
700
+
701
+ if incremental and not sync:
702
+ raise ValueError(
703
+ "incremental loads must be used with sync loading"
704
+ )
695
705
 
696
- elif table in INCREMENTAL_ENDPOINTS:
697
- endpoint = INCREMENTAL_ENDPOINTS[table]
706
+ if incremental:
698
707
  from ingestr.src.stripe_analytics import incremental_stripe_source
699
708
 
700
709
  def nullable_date(date_str: Optional[str]):
@@ -702,6 +711,7 @@ class StripeAnalyticsSource:
702
711
  return ensure_pendulum_datetime(date_str)
703
712
  return None
704
713
 
714
+ endpoint = ENDPOINTS[endpoint]
705
715
  return incremental_stripe_source(
706
716
  endpoints=[
707
717
  endpoint,
@@ -710,6 +720,26 @@ class StripeAnalyticsSource:
710
720
  initial_start_date=nullable_date(kwargs.get("interval_start", None)),
711
721
  end_date=nullable_date(kwargs.get("interval_end", None)),
712
722
  ).with_resources(endpoint)
723
+ else:
724
+ endpoint = ENDPOINTS[endpoint]
725
+ if sync:
726
+ from ingestr.src.stripe_analytics import stripe_source
727
+
728
+ return stripe_source(
729
+ endpoints=[
730
+ endpoint,
731
+ ],
732
+ stripe_secret_key=api_key[0],
733
+ ).with_resources(endpoint)
734
+ else:
735
+ from ingestr.src.stripe_analytics import async_stripe_source
736
+
737
+ return async_stripe_source(
738
+ endpoints=[
739
+ endpoint,
740
+ ],
741
+ stripe_secret_key=api_key[0],
742
+ ).with_resources(endpoint)
713
743
 
714
744
  raise ValueError(
715
745
  f"Resource '{table}' is not supported for stripe source yet, if you are interested in it please create a GitHub issue at https://github.com/bruin-data/ingestr"
@@ -7,7 +7,12 @@ import stripe
7
7
  from dlt.sources import DltResource
8
8
  from pendulum import DateTime
9
9
 
10
- from .helpers import pagination, transform_date
10
+ from .helpers import (
11
+ async_parallel_pagination,
12
+ pagination,
13
+ parallel_pagination,
14
+ transform_date,
15
+ )
11
16
 
12
17
 
13
18
  @dlt.source(max_table_nesting=0)
@@ -50,6 +55,86 @@ def stripe_source(
50
55
  )(endpoint)
51
56
 
52
57
 
58
+ @dlt.source(max_table_nesting=0)
59
+ def parallel_stripe_source(
60
+ endpoints: Tuple[str, ...],
61
+ stripe_secret_key: str = dlt.secrets.value,
62
+ start_date: Optional[DateTime] = None,
63
+ end_date: Optional[DateTime] = None,
64
+ max_workers: int = 12,
65
+ ) -> Iterable[DltResource]:
66
+ """
67
+ Retrieves data from the Stripe API for the specified endpoints using parallel pagination.
68
+
69
+ This source divides the date range across multiple workers to fetch data in parallel,
70
+ which can significantly speed up data retrieval for large date ranges.
71
+
72
+ Args:
73
+ endpoints (Tuple[str, ...]): A tuple of endpoint names to retrieve data from.
74
+ stripe_secret_key (str): The API access token for authentication. Defaults to the value in the `dlt.secrets` object.
75
+ start_date (Optional[DateTime]): An optional start date to limit the data retrieved. Format: datetime(YYYY, MM, DD). Required for parallel processing.
76
+ end_date (Optional[DateTime]): An optional end date to limit the data retrieved. Format: datetime(YYYY, MM, DD). Required for parallel processing.
77
+ max_workers (int): Maximum number of worker threads for parallel fetching. Defaults to 4.
78
+
79
+ Returns:
80
+ Iterable[DltResource]: Resources with data that was created during the period greater than or equal to 'start_date' and less than 'end_date'.
81
+ """
82
+ stripe.api_key = stripe_secret_key
83
+ stripe.api_version = "2022-11-15"
84
+
85
+ def parallel_stripe_resource(
86
+ endpoint: str,
87
+ ) -> Generator[Dict[Any, Any], Any, None]:
88
+ yield from parallel_pagination(endpoint, start_date, end_date, max_workers)
89
+
90
+ for endpoint in endpoints:
91
+ yield dlt.resource(
92
+ parallel_stripe_resource,
93
+ name=endpoint,
94
+ write_disposition="replace",
95
+ )(endpoint)
96
+
97
+
98
+ @dlt.source(max_table_nesting=0)
99
+ def async_stripe_source(
100
+ endpoints: Tuple[str, ...],
101
+ stripe_secret_key: str = dlt.secrets.value,
102
+ start_date: Optional[DateTime] = None,
103
+ end_date: Optional[DateTime] = None,
104
+ max_workers: int = 40,
105
+ rate_limit_delay: float = 0.03,
106
+ ) -> Iterable[DltResource]:
107
+ """
108
+ ULTRA-FAST async Stripe source optimized for maximum speed and throughput.
109
+
110
+ WARNING: Returns data in RANDOM ORDER for maximum performance.
111
+ Uses aggressive concurrency and minimal delays to maximize API throughput.
112
+
113
+ Args:
114
+ endpoints (Tuple[str, ...]): A tuple of endpoint names to retrieve data from.
115
+ stripe_secret_key (str): The API access token for authentication. Defaults to the value in the `dlt.secrets` object.
116
+ start_date (Optional[DateTime]): An optional start date to limit the data retrieved. Format: datetime(YYYY, MM, DD). Defaults to 2010-01-01.
117
+ end_date (Optional[DateTime]): An optional end date to limit the data retrieved. Format: datetime(YYYY, MM, DD). Defaults to today.
118
+ max_workers (int): Maximum number of concurrent async tasks. Defaults to 40 for maximum speed.
119
+ rate_limit_delay (float): Minimal delay between requests. Defaults to 0.03 seconds.
120
+
121
+ Returns:
122
+ Iterable[DltResource]: Resources with data in RANDOM ORDER (optimized for speed).
123
+ """
124
+ stripe.api_key = stripe_secret_key
125
+ stripe.api_version = "2022-11-15"
126
+
127
+ async def async_stripe_resource(endpoint: str):
128
+ yield async_parallel_pagination(endpoint, max_workers, rate_limit_delay)
129
+
130
+ for endpoint in endpoints:
131
+ yield dlt.resource(
132
+ async_stripe_resource,
133
+ name=endpoint,
134
+ write_disposition="replace",
135
+ )(endpoint)
136
+
137
+
53
138
  @dlt.source
54
139
  def incremental_stripe_source(
55
140
  endpoints: Tuple[str, ...],