ingestr 0.13.68__tar.gz → 0.13.70__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.
Files changed (315) hide show
  1. ingestr-0.13.70/.dlt/config.toml +3 -0
  2. {ingestr-0.13.68 → ingestr-0.13.70}/PKG-INFO +1 -1
  3. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/conftest.py +9 -0
  4. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/main.py +1 -1
  5. ingestr-0.13.70/ingestr/src/buildinfo.py +1 -0
  6. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/kafka/__init__.py +4 -1
  7. ingestr-0.13.70/ingestr/src/solidgate/__init__.py +223 -0
  8. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/solidgate/helpers.py +29 -21
  9. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/sources.py +4 -4
  10. ingestr-0.13.68/ingestr/src/buildinfo.py +0 -1
  11. ingestr-0.13.68/ingestr/src/solidgate/__init__.py +0 -127
  12. {ingestr-0.13.68 → ingestr-0.13.70}/.dockerignore +0 -0
  13. {ingestr-0.13.68 → ingestr-0.13.70}/.githooks/pre-commit-hook.sh +0 -0
  14. {ingestr-0.13.68 → ingestr-0.13.70}/.github/workflows/deploy-docs.yml +0 -0
  15. {ingestr-0.13.68 → ingestr-0.13.70}/.github/workflows/release.yml +0 -0
  16. {ingestr-0.13.68 → ingestr-0.13.70}/.github/workflows/secrets-scan.yml +0 -0
  17. {ingestr-0.13.68 → ingestr-0.13.70}/.github/workflows/tests.yml +0 -0
  18. {ingestr-0.13.68 → ingestr-0.13.70}/.gitignore +0 -0
  19. {ingestr-0.13.68 → ingestr-0.13.70}/.gitleaksignore +0 -0
  20. {ingestr-0.13.68 → ingestr-0.13.70}/.python-version +0 -0
  21. {ingestr-0.13.68 → ingestr-0.13.70}/.vale.ini +0 -0
  22. {ingestr-0.13.68 → ingestr-0.13.70}/Dockerfile +0 -0
  23. {ingestr-0.13.68 → ingestr-0.13.70}/LICENSE.md +0 -0
  24. {ingestr-0.13.68 → ingestr-0.13.70}/Makefile +0 -0
  25. {ingestr-0.13.68 → ingestr-0.13.70}/README.md +0 -0
  26. {ingestr-0.13.68 → ingestr-0.13.70}/docs/.vitepress/config.mjs +0 -0
  27. {ingestr-0.13.68 → ingestr-0.13.70}/docs/.vitepress/theme/custom.css +0 -0
  28. {ingestr-0.13.68 → ingestr-0.13.70}/docs/.vitepress/theme/index.js +0 -0
  29. {ingestr-0.13.68 → ingestr-0.13.70}/docs/commands/example-uris.md +0 -0
  30. {ingestr-0.13.68 → ingestr-0.13.70}/docs/commands/ingest.md +0 -0
  31. {ingestr-0.13.68 → ingestr-0.13.70}/docs/getting-started/core-concepts.md +0 -0
  32. {ingestr-0.13.68 → ingestr-0.13.70}/docs/getting-started/incremental-loading.md +0 -0
  33. {ingestr-0.13.68 → ingestr-0.13.70}/docs/getting-started/quickstart.md +0 -0
  34. {ingestr-0.13.68 → ingestr-0.13.70}/docs/getting-started/telemetry.md +0 -0
  35. {ingestr-0.13.68 → ingestr-0.13.70}/docs/index.md +0 -0
  36. {ingestr-0.13.68 → ingestr-0.13.70}/docs/media/applovin_max.png +0 -0
  37. {ingestr-0.13.68 → ingestr-0.13.70}/docs/media/athena.png +0 -0
  38. {ingestr-0.13.68 → ingestr-0.13.70}/docs/media/clickhouse_img.png +0 -0
  39. {ingestr-0.13.68 → ingestr-0.13.70}/docs/media/cratedb-destination.png +0 -0
  40. {ingestr-0.13.68 → ingestr-0.13.70}/docs/media/cratedb-source.png +0 -0
  41. {ingestr-0.13.68 → ingestr-0.13.70}/docs/media/freshdesk_ingestion.png +0 -0
  42. {ingestr-0.13.68 → ingestr-0.13.70}/docs/media/gcp_spanner_ingestion.png +0 -0
  43. {ingestr-0.13.68 → ingestr-0.13.70}/docs/media/github.png +0 -0
  44. {ingestr-0.13.68 → ingestr-0.13.70}/docs/media/google_analytics_realtime_report.png +0 -0
  45. {ingestr-0.13.68 → ingestr-0.13.70}/docs/media/googleanalytics.png +0 -0
  46. {ingestr-0.13.68 → ingestr-0.13.70}/docs/media/ingestion_elasticsearch_img.png +0 -0
  47. {ingestr-0.13.68 → ingestr-0.13.70}/docs/media/kinesis.bigquery.png +0 -0
  48. {ingestr-0.13.68 → ingestr-0.13.70}/docs/media/linear.png +0 -0
  49. {ingestr-0.13.68 → ingestr-0.13.70}/docs/media/linkedin_ads.png +0 -0
  50. {ingestr-0.13.68 → ingestr-0.13.70}/docs/media/mixpanel_ingestion.png +0 -0
  51. {ingestr-0.13.68 → ingestr-0.13.70}/docs/media/personio.png +0 -0
  52. {ingestr-0.13.68 → ingestr-0.13.70}/docs/media/personio_duckdb.png +0 -0
  53. {ingestr-0.13.68 → ingestr-0.13.70}/docs/media/phantombuster.png +0 -0
  54. {ingestr-0.13.68 → ingestr-0.13.70}/docs/media/pipedrive.png +0 -0
  55. {ingestr-0.13.68 → ingestr-0.13.70}/docs/media/quickbook_ingestion.png +0 -0
  56. {ingestr-0.13.68 → ingestr-0.13.70}/docs/media/sftp.png +0 -0
  57. {ingestr-0.13.68 → ingestr-0.13.70}/docs/media/stripe_postgres.png +0 -0
  58. {ingestr-0.13.68 → ingestr-0.13.70}/docs/media/tiktok.png +0 -0
  59. {ingestr-0.13.68 → ingestr-0.13.70}/docs/media/zoom_ingestion.png +0 -0
  60. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/adjust.md +0 -0
  61. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/airtable.md +0 -0
  62. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/applovin.md +0 -0
  63. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/applovin_max.md +0 -0
  64. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/appsflyer.md +0 -0
  65. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/appstore.md +0 -0
  66. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/asana.md +0 -0
  67. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/athena.md +0 -0
  68. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/attio.md +0 -0
  69. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/bigquery.md +0 -0
  70. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/chess.md +0 -0
  71. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/clickhouse.md +0 -0
  72. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/cratedb.md +0 -0
  73. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/csv.md +0 -0
  74. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/custom_queries.md +0 -0
  75. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/databricks.md +0 -0
  76. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/db2.md +0 -0
  77. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/duckdb.md +0 -0
  78. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/dynamodb.md +0 -0
  79. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/elasticsearch.md +0 -0
  80. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/facebook-ads.md +0 -0
  81. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/frankfurter.md +0 -0
  82. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/freshdesk.md +0 -0
  83. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/gcs.md +0 -0
  84. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/github.md +0 -0
  85. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/google-ads.md +0 -0
  86. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/google_analytics.md +0 -0
  87. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/gorgias.md +0 -0
  88. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/gsheets.md +0 -0
  89. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/hubspot.md +0 -0
  90. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/isoc-pulse.md +0 -0
  91. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/kafka.md +0 -0
  92. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/kinesis.md +0 -0
  93. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/klaviyo.md +0 -0
  94. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/linear.md +0 -0
  95. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/linkedin_ads.md +0 -0
  96. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/mixpanel.md +0 -0
  97. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/mongodb.md +0 -0
  98. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/mssql.md +0 -0
  99. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/mysql.md +0 -0
  100. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/notion.md +0 -0
  101. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/oracle.md +0 -0
  102. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/personio.md +0 -0
  103. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/phantombuster.md +0 -0
  104. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/pinterest.md +0 -0
  105. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/pipedrive.md +0 -0
  106. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/postgres.md +0 -0
  107. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/quickbooks.md +0 -0
  108. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/redshift.md +0 -0
  109. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/s3.md +0 -0
  110. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/salesforce.md +0 -0
  111. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/sap-hana.md +0 -0
  112. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/sftp.md +0 -0
  113. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/shopify.md +0 -0
  114. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/slack.md +0 -0
  115. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/smartsheets.md +0 -0
  116. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/snowflake.md +0 -0
  117. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/solidgate.md +0 -0
  118. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/spanner.md +0 -0
  119. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/sqlite.md +0 -0
  120. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/stripe.md +0 -0
  121. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/tiktok-ads.md +0 -0
  122. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/trustpilot.md +0 -0
  123. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/zendesk.md +0 -0
  124. {ingestr-0.13.68 → ingestr-0.13.70}/docs/supported-sources/zoom.md +0 -0
  125. {ingestr-0.13.68 → ingestr-0.13.70}/docs/tutorials/load-kinesis-bigquery.md +0 -0
  126. {ingestr-0.13.68 → ingestr-0.13.70}/docs/tutorials/load-personio-duckdb.md +0 -0
  127. {ingestr-0.13.68 → ingestr-0.13.70}/docs/tutorials/load-stripe-postgres.md +0 -0
  128. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/.gitignore +0 -0
  129. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/adjust/__init__.py +0 -0
  130. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/adjust/adjust_helpers.py +0 -0
  131. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/airtable/__init__.py +0 -0
  132. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/applovin/__init__.py +0 -0
  133. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/applovin_max/__init__.py +0 -0
  134. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/appsflyer/__init__.py +0 -0
  135. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/appsflyer/client.py +0 -0
  136. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/appstore/__init__.py +0 -0
  137. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/appstore/client.py +0 -0
  138. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/appstore/errors.py +0 -0
  139. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/appstore/models.py +0 -0
  140. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/appstore/resources.py +0 -0
  141. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/arrow/__init__.py +0 -0
  142. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/asana_source/__init__.py +0 -0
  143. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/asana_source/helpers.py +0 -0
  144. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/asana_source/settings.py +0 -0
  145. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/attio/__init__.py +0 -0
  146. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/attio/helpers.py +0 -0
  147. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/blob.py +0 -0
  148. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/chess/__init__.py +0 -0
  149. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/chess/helpers.py +0 -0
  150. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/chess/settings.py +0 -0
  151. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/collector/spinner.py +0 -0
  152. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/destinations.py +0 -0
  153. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/dynamodb/__init__.py +0 -0
  154. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/elasticsearch/__init__.py +0 -0
  155. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/errors.py +0 -0
  156. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/facebook_ads/__init__.py +0 -0
  157. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/facebook_ads/exceptions.py +0 -0
  158. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/facebook_ads/helpers.py +0 -0
  159. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/facebook_ads/settings.py +0 -0
  160. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/facebook_ads/utils.py +0 -0
  161. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/factory.py +0 -0
  162. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/filesystem/__init__.py +0 -0
  163. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/filesystem/helpers.py +0 -0
  164. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/filesystem/readers.py +0 -0
  165. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/filters.py +0 -0
  166. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/frankfurter/__init__.py +0 -0
  167. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/frankfurter/helpers.py +0 -0
  168. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/freshdesk/__init__.py +0 -0
  169. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/freshdesk/freshdesk_client.py +0 -0
  170. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/freshdesk/settings.py +0 -0
  171. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/github/__init__.py +0 -0
  172. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/github/helpers.py +0 -0
  173. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/github/queries.py +0 -0
  174. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/github/settings.py +0 -0
  175. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/google_ads/__init__.py +0 -0
  176. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/google_ads/field.py +0 -0
  177. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/google_ads/metrics.py +0 -0
  178. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/google_ads/predicates.py +0 -0
  179. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/google_ads/reports.py +0 -0
  180. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/google_analytics/__init__.py +0 -0
  181. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/google_analytics/helpers.py +0 -0
  182. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/google_sheets/README.md +0 -0
  183. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/google_sheets/__init__.py +0 -0
  184. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
  185. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
  186. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
  187. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/gorgias/__init__.py +0 -0
  188. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/gorgias/helpers.py +0 -0
  189. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/http_client.py +0 -0
  190. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/hubspot/__init__.py +0 -0
  191. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/hubspot/helpers.py +0 -0
  192. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/hubspot/settings.py +0 -0
  193. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/isoc_pulse/__init__.py +0 -0
  194. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/kafka/helpers.py +0 -0
  195. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/kinesis/__init__.py +0 -0
  196. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/kinesis/helpers.py +0 -0
  197. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/klaviyo/__init__.py +0 -0
  198. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/klaviyo/client.py +0 -0
  199. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/klaviyo/helpers.py +0 -0
  200. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/linear/__init__.py +0 -0
  201. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/linear/helpers.py +0 -0
  202. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/linkedin_ads/__init__.py +0 -0
  203. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
  204. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/linkedin_ads/helpers.py +0 -0
  205. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/loader.py +0 -0
  206. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/mixpanel/__init__.py +0 -0
  207. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/mixpanel/client.py +0 -0
  208. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/mongodb/__init__.py +0 -0
  209. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/mongodb/helpers.py +0 -0
  210. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/notion/__init__.py +0 -0
  211. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/notion/helpers/__init__.py +0 -0
  212. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/notion/helpers/client.py +0 -0
  213. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/notion/helpers/database.py +0 -0
  214. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/notion/settings.py +0 -0
  215. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/partition.py +0 -0
  216. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/personio/__init__.py +0 -0
  217. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/personio/helpers.py +0 -0
  218. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/phantombuster/__init__.py +0 -0
  219. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/phantombuster/client.py +0 -0
  220. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/pinterest/__init__.py +0 -0
  221. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/pipedrive/__init__.py +0 -0
  222. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/pipedrive/helpers/__init__.py +0 -0
  223. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/pipedrive/helpers/custom_fields_munger.py +0 -0
  224. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/pipedrive/helpers/pages.py +0 -0
  225. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/pipedrive/settings.py +0 -0
  226. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/pipedrive/typing.py +0 -0
  227. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/quickbooks/__init__.py +0 -0
  228. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/resource.py +0 -0
  229. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/salesforce/__init__.py +0 -0
  230. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/salesforce/helpers.py +0 -0
  231. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/shopify/__init__.py +0 -0
  232. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/shopify/exceptions.py +0 -0
  233. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/shopify/helpers.py +0 -0
  234. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/shopify/settings.py +0 -0
  235. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/slack/__init__.py +0 -0
  236. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/slack/helpers.py +0 -0
  237. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/slack/settings.py +0 -0
  238. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/smartsheets/__init__.py +0 -0
  239. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/sql_database/__init__.py +0 -0
  240. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/sql_database/callbacks.py +0 -0
  241. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/stripe_analytics/__init__.py +0 -0
  242. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/stripe_analytics/helpers.py +0 -0
  243. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/stripe_analytics/settings.py +0 -0
  244. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/table_definition.py +0 -0
  245. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/telemetry/event.py +0 -0
  246. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/testdata/fakebqcredentials.json +0 -0
  247. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/tiktok_ads/__init__.py +0 -0
  248. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -0
  249. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/time.py +0 -0
  250. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/trustpilot/__init__.py +0 -0
  251. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/trustpilot/client.py +0 -0
  252. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/version.py +0 -0
  253. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/zendesk/__init__.py +0 -0
  254. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/zendesk/helpers/__init__.py +0 -0
  255. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
  256. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/zendesk/helpers/credentials.py +0 -0
  257. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
  258. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/zendesk/settings.py +0 -0
  259. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/zoom/__init__.py +0 -0
  260. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/src/zoom/helpers.py +0 -0
  261. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/testdata/.gitignore +0 -0
  262. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/testdata/create_replace.csv +0 -0
  263. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/testdata/delete_insert_expected.csv +0 -0
  264. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/testdata/delete_insert_part1.csv +0 -0
  265. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/testdata/delete_insert_part2.csv +0 -0
  266. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/testdata/merge_expected.csv +0 -0
  267. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/testdata/merge_part1.csv +0 -0
  268. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/testdata/merge_part2.csv +0 -0
  269. {ingestr-0.13.68 → ingestr-0.13.70}/ingestr/tests/unit/test_smartsheets.py +0 -0
  270. {ingestr-0.13.68 → ingestr-0.13.70}/package-lock.json +0 -0
  271. {ingestr-0.13.68 → ingestr-0.13.70}/package.json +0 -0
  272. {ingestr-0.13.68 → ingestr-0.13.70}/pyproject.toml +0 -0
  273. {ingestr-0.13.68 → ingestr-0.13.70}/requirements-dev.txt +0 -0
  274. {ingestr-0.13.68 → ingestr-0.13.70}/requirements.in +0 -0
  275. {ingestr-0.13.68 → ingestr-0.13.70}/requirements.txt +0 -0
  276. {ingestr-0.13.68 → ingestr-0.13.70}/requirements_arm64.txt +0 -0
  277. {ingestr-0.13.68 → ingestr-0.13.70}/resources/demo.gif +0 -0
  278. {ingestr-0.13.68 → ingestr-0.13.70}/resources/demo.tape +0 -0
  279. {ingestr-0.13.68 → ingestr-0.13.70}/resources/ingestr.svg +0 -0
  280. {ingestr-0.13.68 → ingestr-0.13.70}/styles/Google/AMPM.yml +0 -0
  281. {ingestr-0.13.68 → ingestr-0.13.70}/styles/Google/Acronyms.yml +0 -0
  282. {ingestr-0.13.68 → ingestr-0.13.70}/styles/Google/Colons.yml +0 -0
  283. {ingestr-0.13.68 → ingestr-0.13.70}/styles/Google/Contractions.yml +0 -0
  284. {ingestr-0.13.68 → ingestr-0.13.70}/styles/Google/DateFormat.yml +0 -0
  285. {ingestr-0.13.68 → ingestr-0.13.70}/styles/Google/Ellipses.yml +0 -0
  286. {ingestr-0.13.68 → ingestr-0.13.70}/styles/Google/EmDash.yml +0 -0
  287. {ingestr-0.13.68 → ingestr-0.13.70}/styles/Google/Exclamation.yml +0 -0
  288. {ingestr-0.13.68 → ingestr-0.13.70}/styles/Google/FirstPerson.yml +0 -0
  289. {ingestr-0.13.68 → ingestr-0.13.70}/styles/Google/Gender.yml +0 -0
  290. {ingestr-0.13.68 → ingestr-0.13.70}/styles/Google/GenderBias.yml +0 -0
  291. {ingestr-0.13.68 → ingestr-0.13.70}/styles/Google/HeadingPunctuation.yml +0 -0
  292. {ingestr-0.13.68 → ingestr-0.13.70}/styles/Google/Headings.yml +0 -0
  293. {ingestr-0.13.68 → ingestr-0.13.70}/styles/Google/Latin.yml +0 -0
  294. {ingestr-0.13.68 → ingestr-0.13.70}/styles/Google/LyHyphens.yml +0 -0
  295. {ingestr-0.13.68 → ingestr-0.13.70}/styles/Google/OptionalPlurals.yml +0 -0
  296. {ingestr-0.13.68 → ingestr-0.13.70}/styles/Google/Ordinal.yml +0 -0
  297. {ingestr-0.13.68 → ingestr-0.13.70}/styles/Google/OxfordComma.yml +0 -0
  298. {ingestr-0.13.68 → ingestr-0.13.70}/styles/Google/Parens.yml +0 -0
  299. {ingestr-0.13.68 → ingestr-0.13.70}/styles/Google/Passive.yml +0 -0
  300. {ingestr-0.13.68 → ingestr-0.13.70}/styles/Google/Periods.yml +0 -0
  301. {ingestr-0.13.68 → ingestr-0.13.70}/styles/Google/Quotes.yml +0 -0
  302. {ingestr-0.13.68 → ingestr-0.13.70}/styles/Google/Ranges.yml +0 -0
  303. {ingestr-0.13.68 → ingestr-0.13.70}/styles/Google/Semicolons.yml +0 -0
  304. {ingestr-0.13.68 → ingestr-0.13.70}/styles/Google/Slang.yml +0 -0
  305. {ingestr-0.13.68 → ingestr-0.13.70}/styles/Google/Spacing.yml +0 -0
  306. {ingestr-0.13.68 → ingestr-0.13.70}/styles/Google/Spelling.yml +0 -0
  307. {ingestr-0.13.68 → ingestr-0.13.70}/styles/Google/Units.yml +0 -0
  308. {ingestr-0.13.68 → ingestr-0.13.70}/styles/Google/We.yml +0 -0
  309. {ingestr-0.13.68 → ingestr-0.13.70}/styles/Google/Will.yml +0 -0
  310. {ingestr-0.13.68 → ingestr-0.13.70}/styles/Google/WordList.yml +0 -0
  311. {ingestr-0.13.68 → ingestr-0.13.70}/styles/Google/meta.json +0 -0
  312. {ingestr-0.13.68 → ingestr-0.13.70}/styles/Google/vocab.txt +0 -0
  313. {ingestr-0.13.68 → ingestr-0.13.70}/styles/bruin/Ingestr.yml +0 -0
  314. {ingestr-0.13.68 → ingestr-0.13.70}/styles/config/vocabularies/bruin/accept.txt +0 -0
  315. {ingestr-0.13.68 → ingestr-0.13.70}/test.env.template +0 -0
@@ -0,0 +1,3 @@
1
+ [runtime]
2
+
3
+ dlthub_telemetry=false
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ingestr
3
- Version: 0.13.68
3
+ Version: 0.13.70
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
@@ -2,6 +2,7 @@ import os
2
2
  import tempfile
3
3
  from concurrent.futures import ThreadPoolExecutor
4
4
 
5
+ import pytest
5
6
  from main_test import DESTINATIONS, SOURCES # type: ignore
6
7
 
7
8
 
@@ -15,6 +16,14 @@ def pytest_configure_node(node):
15
16
  node.workerinput["shared_directory"] = node.config.shared_directory
16
17
 
17
18
 
19
+ @pytest.fixture(scope="session")
20
+ def shared_directory(request):
21
+ if is_master(request.config):
22
+ return request.config.shared_directory
23
+ else:
24
+ return request.config.workerinput["shared_directory"]
25
+
26
+
18
27
  def is_master(config):
19
28
  """True if the code running the given pytest.config object is running in a xdist master
20
29
  node or not running xdist at all.
@@ -256,7 +256,7 @@ def ingest(
256
256
  Optional[list[str]],
257
257
  typer.Option(
258
258
  help="The column types to be used for the destination table in the format of 'column_name:column_type'",
259
- envvar=["COLUMNS", "INGESTR_COLUMNS"],
259
+ envvar=["INGESTR_COLUMNS"],
260
260
  ),
261
261
  ] = None, # type: ignore
262
262
  yield_limit: Annotated[
@@ -0,0 +1 @@
1
+ version = "v0.13.70"
@@ -83,7 +83,7 @@ def kafka_consumer(
83
83
  # read messages up to the maximum offsets,
84
84
  # not waiting for new messages
85
85
  with closing(consumer):
86
- while tracker.has_unread:
86
+ while True:
87
87
  messages = consumer.consume(batch_size, timeout=batch_timeout)
88
88
  if not messages:
89
89
  break
@@ -101,3 +101,6 @@ def kafka_consumer(
101
101
  tracker.renew(msg)
102
102
 
103
103
  yield batch
104
+
105
+ if tracker.has_unread is False:
106
+ return
@@ -0,0 +1,223 @@
1
+ from typing import Iterable, Iterator
2
+
3
+ import dlt
4
+ import pendulum
5
+ from dlt.sources import DltResource
6
+
7
+ from .helpers import SolidgateClient
8
+
9
+ COLUMN_HINTS = {
10
+ "subscriptions": {
11
+ "id": {"data_type": "text", "nullable": False, "primary_key": True},
12
+ "created_at": {"data_type": "timestamp", "partition": True},
13
+ "status": {"data_type": "text"},
14
+ "started_at": {"data_type": "timestamp"},
15
+ "updated_at": {"data_type": "timestamp"},
16
+ "expired_at": {"data_type": "timestamp"},
17
+ "next_charge_at": {"data_type": "timestamp"},
18
+ "payment_type": {"data_type": "text"},
19
+ "trial": {"data_type": "bool"},
20
+ "cancelled_at": {"data_type": "timestamp"},
21
+ "cancellation_requested_at": {"data_type": "timestamp"},
22
+ "cancel_code": {"data_type": "text"},
23
+ "cancel_message": {"data_type": "text"},
24
+ "customer": {"data_type": "json"},
25
+ "product": {"data_type": "json"},
26
+ "invoices": {"data_type": "json"},
27
+ },
28
+ "apm_orders": {
29
+ "order_id": {"data_type": "text", "nullable": False, "primary_key": True},
30
+ "created_at": {"data_type": "timestamp", "partition": True},
31
+ "updated_at": {"data_type": "timestamp"},
32
+ "order_description": {"data_type": "text"},
33
+ "method": {"data_type": "text"},
34
+ "amount": {"data_type": "bigint"},
35
+ "currency": {"data_type": "text"},
36
+ "processing_amount": {"data_type": "bigint"},
37
+ "processing_currency": {"data_type": "text"},
38
+ "status": {"data_type": "text"},
39
+ "customer_account_id": {"data_type": "text"},
40
+ "customer_email": {"data_type": "text"},
41
+ "ip_address": {"data_type": "text"},
42
+ "geo_country": {"data_type": "text"},
43
+ "error_code": {"data_type": "text"},
44
+ "transactions": {"data_type": "json"},
45
+ "order_metadata": {"data_type": "json"},
46
+ },
47
+ "card_orders": {
48
+ "order_id": {"data_type": "text", "nullable": False, "primary_key": True},
49
+ "created_at": {"data_type": "timestamp", "partition": True},
50
+ "updated_at": {"data_type": "timestamp"},
51
+ "order_description": {"data_type": "text"},
52
+ "psp_order_id": {"data_type": "text"},
53
+ "provider_payment_id": {"data_type": "text"},
54
+ "amount": {"data_type": "bigint"},
55
+ "currency": {"data_type": "text"},
56
+ "processing_amount": {"data_type": "bigint"},
57
+ "processing_currency": {"data_type": "text"},
58
+ "status": {"data_type": "text"},
59
+ "payment_type": {"data_type": "text"},
60
+ "type": {"data_type": "text"},
61
+ "is_secured": {"data_type": "bool"},
62
+ "routing": {"data_type": "json"},
63
+ "customer_account_id": {"data_type": "text"},
64
+ "customer_email": {"data_type": "text"},
65
+ "customer_first_name": {"data_type": "text"},
66
+ "customer_last_name": {"data_type": "text"},
67
+ "ip_address": {"data_type": "text"},
68
+ "mid": {"data_type": "text"},
69
+ "traffic_source": {"data_type": "text"},
70
+ "platform": {"data_type": "text"},
71
+ "geo_country": {"data_type": "text"},
72
+ "error_code": {"data_type": "text"},
73
+ "transactions": {"data_type": "json"},
74
+ "order_metadata": {"data_type": "json"},
75
+ "fraudulent": {"data_type": "bool"},
76
+ },
77
+ "financial_entries": {
78
+ "id": {
79
+ "data_type": "text",
80
+ "nullable": False,
81
+ "primary_key": True,
82
+ },
83
+ "order_id": {"data_type": "text"},
84
+ "external_psp_order_id": {"data_type": "text"},
85
+ "created_at": {"data_type": "timestamp", "partition": True},
86
+ "transaction_datetime_provider": {"data_type": "timestamp"},
87
+ "transaction_datetime_utc": {"data_type": "timestamp"},
88
+ "accounting_date": {"data_type": "date"},
89
+ "amount": {"data_type": "decimal", "precision": 18, "scale": 4},
90
+ "amount_in_major_units": {"data_type": "decimal", "precision": 18, "scale": 4},
91
+ "currency": {"data_type": "text"},
92
+ "currency_minor_units": {"data_type": "bigint"},
93
+ "payout_amount": {"data_type": "decimal", "precision": 18, "scale": 4},
94
+ "payout_amount_in_major_units": {
95
+ "data_type": "decimal",
96
+ "precision": 18,
97
+ "scale": 4,
98
+ },
99
+ "payout_currency": {"data_type": "text"},
100
+ "payout_currency_minor_units": {"data_type": "bigint"},
101
+ "record_type_key": {"data_type": "text"},
102
+ "provider": {"data_type": "text"},
103
+ "payment_method": {"data_type": "text"},
104
+ "card_brand": {"data_type": "text"},
105
+ "geo_country": {"data_type": "text"},
106
+ "issuing_country": {"data_type": "text"},
107
+ "transaction_id": {"data_type": "text"},
108
+ "chargeback_id": {"data_type": "text"},
109
+ "legal_entity": {"data_type": "text"},
110
+ },
111
+ }
112
+
113
+
114
+ @dlt.source(max_table_nesting=0)
115
+ def solidgate_source(
116
+ start_date: pendulum.DateTime,
117
+ end_date: pendulum.DateTime | None,
118
+ public_key: str,
119
+ secret_key: str,
120
+ ) -> Iterable[DltResource]:
121
+ solidgate_client = SolidgateClient(public_key, secret_key)
122
+
123
+ @dlt.resource(
124
+ name="subscriptions",
125
+ write_disposition="merge",
126
+ primary_key="id",
127
+ columns=COLUMN_HINTS["subscriptions"], # type: ignore
128
+ )
129
+ def fetch_all_subscriptions(
130
+ dateTime=dlt.sources.incremental(
131
+ "updated_at",
132
+ initial_value=start_date,
133
+ end_value=end_date,
134
+ range_start="closed",
135
+ range_end="closed",
136
+ ),
137
+ ) -> Iterator[dict]:
138
+ path = "subscriptions"
139
+ if dateTime.end_value is None:
140
+ end_dt = pendulum.now(tz="UTC")
141
+ else:
142
+ end_dt = dateTime.end_value
143
+
144
+ start_dt = dateTime.last_value
145
+ yield solidgate_client.fetch_data(path, date_from=start_dt, date_to=end_dt)
146
+
147
+ @dlt.resource(
148
+ name="apm_orders",
149
+ write_disposition="merge",
150
+ primary_key="order_id",
151
+ columns=COLUMN_HINTS["apm_orders"], # type: ignore
152
+ )
153
+ def fetch_apm_orders(
154
+ dateTime=dlt.sources.incremental(
155
+ "updated_at",
156
+ initial_value=start_date,
157
+ end_value=end_date,
158
+ range_start="closed",
159
+ range_end="closed",
160
+ ),
161
+ ) -> Iterator[dict]:
162
+ path = "apm-orders"
163
+ if dateTime.end_value is None:
164
+ end_dt = pendulum.now(tz="UTC")
165
+ else:
166
+ end_dt = dateTime.end_value
167
+
168
+ start_dt = dateTime.last_value
169
+ yield solidgate_client.fetch_data(path, date_from=start_dt, date_to=end_dt)
170
+
171
+ @dlt.resource(
172
+ name="card_orders",
173
+ write_disposition="merge",
174
+ primary_key="order_id",
175
+ columns=COLUMN_HINTS["card_orders"], # type: ignore
176
+ )
177
+ def fetch_card_orders(
178
+ dateTime=dlt.sources.incremental(
179
+ "updated_at",
180
+ initial_value=start_date,
181
+ end_value=end_date,
182
+ range_start="closed",
183
+ range_end="closed",
184
+ ),
185
+ ) -> Iterator[dict]:
186
+ path = "card-orders"
187
+ if dateTime.end_value is None:
188
+ end_dt = pendulum.now(tz="UTC")
189
+ else:
190
+ end_dt = dateTime.end_value
191
+
192
+ start_dt = dateTime.last_value
193
+ yield solidgate_client.fetch_data(path, date_from=start_dt, date_to=end_dt)
194
+
195
+ @dlt.resource(
196
+ name="financial_entries",
197
+ write_disposition="merge",
198
+ primary_key="id",
199
+ columns=COLUMN_HINTS["financial_entries"], # type: ignore
200
+ )
201
+ def fetch_financial_entries(
202
+ dateTime=dlt.sources.incremental(
203
+ "created_at",
204
+ initial_value=start_date,
205
+ end_value=end_date,
206
+ range_start="closed",
207
+ range_end="closed",
208
+ ),
209
+ ):
210
+ if dateTime.end_value is None:
211
+ end_date = pendulum.now(tz="UTC")
212
+ else:
213
+ end_date = dateTime.end_value
214
+
215
+ start_date = dateTime.last_value
216
+ yield solidgate_client.fetch_financial_entry_data(start_date, end_date)
217
+
218
+ return (
219
+ fetch_all_subscriptions,
220
+ fetch_apm_orders,
221
+ fetch_card_orders,
222
+ fetch_financial_entries,
223
+ )
@@ -92,9 +92,6 @@ class SolidgateClient:
92
92
  if not report_url:
93
93
  return f"Report URL not found in the response: {post_response.json()}", 400
94
94
 
95
- # Wait for 5 seconds before attempting to download the report as report may not be immediately available
96
- time.sleep(5)
97
-
98
95
  data = self.public_key + self.public_key
99
96
  hmac_hash = hmac.new(
100
97
  self.secret_key.encode("utf-8"), data.encode("utf-8"), hashlib.sha512
@@ -109,27 +106,38 @@ class SolidgateClient:
109
106
  "Content-Type": "application/json",
110
107
  }
111
108
 
112
- get_response = self.client.get(report_url, headers=headers_get)
109
+ # Retry getting the report for up to 10 minutes (600 seconds) with 5-second intervals
110
+ max_retries = 120 # 10 minutes / 5 seconds = 120 attempts
111
+ retry_count = 0
112
+
113
+ while retry_count < max_retries:
114
+ get_response = self.client.get(report_url, headers=headers_get)
113
115
 
114
- if get_response.status_code == 200:
115
- try:
116
- response_json = json.loads(get_response.content)
117
- if "error" in response_json:
118
- raise Exception(f"API Error: {response_json['error']['messages']}")
119
- except json.JSONDecodeError:
116
+ if get_response.status_code == 200:
120
117
  try:
121
- csv_data = get_response.content.decode("utf-8")
122
- df = pd.read_csv(StringIO(csv_data))
123
- df["created_at"] = df["created_at"].apply(
124
- lambda x: pendulum.parse(x)
118
+ response_json = json.loads(get_response.content)
119
+ if "error" in response_json:
120
+ raise Exception(
121
+ f"API Error: {response_json['error']['messages']}"
122
+ )
123
+ except json.JSONDecodeError:
124
+ try:
125
+ csv_data = get_response.content.decode("utf-8")
126
+ df = pd.read_csv(StringIO(csv_data))
127
+ df["created_at"] = df["created_at"].apply(
128
+ lambda x: pendulum.parse(x)
129
+ )
130
+ return df
131
+ except Exception as e:
132
+ raise Exception(f"Error reading CSV: {e}")
133
+ else:
134
+ # Report might not be ready yet, wait and retry
135
+ retry_count += 1
136
+ if retry_count >= max_retries:
137
+ raise Exception(
138
+ f"Failed to get report after {max_retries} attempts. Status code: {get_response.status_code}"
125
139
  )
126
- return df
127
- except Exception as e:
128
- raise Exception(f"Error reading CSV: {e}")
129
- else:
130
- raise Exception(
131
- f"Failed to get report. Status code: {get_response.status_code}"
132
- )
140
+ time.sleep(5) # Wait 5 seconds before retrying
133
141
 
134
142
  def generateSignature(self, json_string):
135
143
  data = self.public_key + json_string + self.public_key
@@ -80,18 +80,18 @@ class SqlSource:
80
80
  if uri.startswith("snowflake://"):
81
81
  parsed_uri = urlparse(uri)
82
82
  query_params = parse_qs(parsed_uri.query)
83
-
83
+
84
84
  if "private_key" in query_params:
85
85
  from dlt.common.libs.cryptography import decode_private_key
86
-
86
+
87
87
  private_key = query_params["private_key"][0]
88
88
  passphrase = query_params.get("private_key_passphrase", [None])[0]
89
89
  decoded_key = decode_private_key(private_key, passphrase)
90
-
90
+
91
91
  query_params["private_key"] = [base64.b64encode(decoded_key).decode()]
92
92
  if "private_key_passphrase" in query_params:
93
93
  del query_params["private_key_passphrase"]
94
-
94
+
95
95
  # Rebuild URI
96
96
  uri = parsed_uri._replace(
97
97
  query=urlencode(query_params, doseq=True)
@@ -1 +0,0 @@
1
- version = "v0.13.68"
@@ -1,127 +0,0 @@
1
- from typing import Iterable, Iterator
2
-
3
- import dlt
4
- import pendulum
5
- from dlt.sources import DltResource
6
-
7
- from .helpers import SolidgateClient
8
-
9
-
10
- @dlt.source(max_table_nesting=0)
11
- def solidgate_source(
12
- start_date: pendulum.DateTime,
13
- end_date: pendulum.DateTime | None,
14
- public_key: str,
15
- secret_key: str,
16
- ) -> Iterable[DltResource]:
17
- solidgate_client = SolidgateClient(public_key, secret_key)
18
-
19
- @dlt.resource(
20
- name="subscriptions",
21
- write_disposition="merge",
22
- primary_key="id",
23
- columns={
24
- "created_at": {"data_type": "timestamp", "partition": True},
25
- },
26
- )
27
- def fetch_all_subscriptions(
28
- dateTime=dlt.sources.incremental(
29
- "updated_at",
30
- initial_value=start_date,
31
- end_value=end_date,
32
- range_start="closed",
33
- range_end="closed",
34
- ),
35
- ) -> Iterator[dict]:
36
- path = "subscriptions"
37
- if dateTime.end_value is None:
38
- end_dt = pendulum.now(tz="UTC")
39
- else:
40
- end_dt = dateTime.end_value
41
-
42
- start_dt = dateTime.last_value
43
- yield solidgate_client.fetch_data(path, date_from=start_dt, date_to=end_dt)
44
-
45
- @dlt.resource(
46
- name="apm_orders",
47
- write_disposition="merge",
48
- primary_key="order_id",
49
- columns={
50
- "created_at": {"data_type": "timestamp", "partition": True},
51
- },
52
- )
53
- def fetch_apm_orders(
54
- dateTime=dlt.sources.incremental(
55
- "updated_at",
56
- initial_value=start_date,
57
- end_value=end_date,
58
- range_start="closed",
59
- range_end="closed",
60
- ),
61
- ) -> Iterator[dict]:
62
- path = "apm-orders"
63
- if dateTime.end_value is None:
64
- end_dt = pendulum.now(tz="UTC")
65
- else:
66
- end_dt = dateTime.end_value
67
-
68
- start_dt = dateTime.last_value
69
- yield solidgate_client.fetch_data(path, date_from=start_dt, date_to=end_dt)
70
-
71
- @dlt.resource(
72
- name="card_orders",
73
- write_disposition="merge",
74
- primary_key="order_id",
75
- columns={
76
- "created_at": {"data_type": "timestamp", "partition": True},
77
- },
78
- )
79
- def fetch_card_orders(
80
- dateTime=dlt.sources.incremental(
81
- "updated_at",
82
- initial_value=start_date,
83
- end_value=end_date,
84
- range_start="closed",
85
- range_end="closed",
86
- ),
87
- ) -> Iterator[dict]:
88
- path = "card-orders"
89
- if dateTime.end_value is None:
90
- end_dt = pendulum.now(tz="UTC")
91
- else:
92
- end_dt = dateTime.end_value
93
-
94
- start_dt = dateTime.last_value
95
- yield solidgate_client.fetch_data(path, date_from=start_dt, date_to=end_dt)
96
-
97
- @dlt.resource(
98
- name="financial_entries",
99
- write_disposition="merge",
100
- primary_key="id",
101
- columns={
102
- "created_at": {"data_type": "timestamp", "partition": True},
103
- },
104
- )
105
- def fetch_financial_entries(
106
- dateTime=dlt.sources.incremental(
107
- "created_at",
108
- initial_value=start_date,
109
- end_value=end_date,
110
- range_start="closed",
111
- range_end="closed",
112
- ),
113
- ):
114
- if dateTime.end_value is None:
115
- end_date = pendulum.now(tz="UTC")
116
- else:
117
- end_date = dateTime.end_value
118
-
119
- start_date = dateTime.last_value
120
- yield solidgate_client.fetch_financial_entry_data(start_date, end_date)
121
-
122
- return (
123
- fetch_all_subscriptions,
124
- fetch_apm_orders,
125
- fetch_card_orders,
126
- fetch_financial_entries,
127
- )
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes