ingestr 0.13.82__tar.gz → 0.13.84__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 (326) hide show
  1. {ingestr-0.13.82 → ingestr-0.13.84}/PKG-INFO +2 -2
  2. {ingestr-0.13.82 → ingestr-0.13.84}/docs/.vitepress/config.mjs +1 -0
  3. ingestr-0.13.84/docs/media/wise_ingestion.png +0 -0
  4. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/linear.md +0 -5
  5. ingestr-0.13.84/docs/supported-sources/wise.md +49 -0
  6. ingestr-0.13.84/ingestr/src/buildinfo.py +1 -0
  7. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/factory.py +2 -0
  8. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/linear/__init__.py +76 -0
  9. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/sources.py +38 -0
  10. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/stripe_analytics/__init__.py +1 -1
  11. ingestr-0.13.84/ingestr/src/wise/__init__.py +68 -0
  12. ingestr-0.13.84/ingestr/src/wise/client.py +63 -0
  13. {ingestr-0.13.82 → ingestr-0.13.84}/pyproject.toml +4 -2
  14. {ingestr-0.13.82 → ingestr-0.13.84}/requirements.txt +1 -1
  15. ingestr-0.13.82/ingestr/src/buildinfo.py +0 -1
  16. {ingestr-0.13.82 → ingestr-0.13.84}/.dlt/config.toml +0 -0
  17. {ingestr-0.13.82 → ingestr-0.13.84}/.dockerignore +0 -0
  18. {ingestr-0.13.82 → ingestr-0.13.84}/.githooks/pre-commit-hook.sh +0 -0
  19. {ingestr-0.13.82 → ingestr-0.13.84}/.github/workflows/deploy-docs.yml +0 -0
  20. {ingestr-0.13.82 → ingestr-0.13.84}/.github/workflows/release.yml +0 -0
  21. {ingestr-0.13.82 → ingestr-0.13.84}/.github/workflows/secrets-scan.yml +0 -0
  22. {ingestr-0.13.82 → ingestr-0.13.84}/.github/workflows/tests.yml +0 -0
  23. {ingestr-0.13.82 → ingestr-0.13.84}/.gitignore +0 -0
  24. {ingestr-0.13.82 → ingestr-0.13.84}/.gitleaksignore +0 -0
  25. {ingestr-0.13.82 → ingestr-0.13.84}/.python-version +0 -0
  26. {ingestr-0.13.82 → ingestr-0.13.84}/.vale.ini +0 -0
  27. {ingestr-0.13.82 → ingestr-0.13.84}/Dockerfile +0 -0
  28. {ingestr-0.13.82 → ingestr-0.13.84}/LICENSE.md +0 -0
  29. {ingestr-0.13.82 → ingestr-0.13.84}/Makefile +0 -0
  30. {ingestr-0.13.82 → ingestr-0.13.84}/README.md +0 -0
  31. {ingestr-0.13.82 → ingestr-0.13.84}/docs/.vitepress/theme/custom.css +0 -0
  32. {ingestr-0.13.82 → ingestr-0.13.84}/docs/.vitepress/theme/index.js +0 -0
  33. {ingestr-0.13.82 → ingestr-0.13.84}/docs/commands/example-uris.md +0 -0
  34. {ingestr-0.13.82 → ingestr-0.13.84}/docs/commands/ingest.md +0 -0
  35. {ingestr-0.13.82 → ingestr-0.13.84}/docs/getting-started/core-concepts.md +0 -0
  36. {ingestr-0.13.82 → ingestr-0.13.84}/docs/getting-started/incremental-loading.md +0 -0
  37. {ingestr-0.13.82 → ingestr-0.13.84}/docs/getting-started/quickstart.md +0 -0
  38. {ingestr-0.13.82 → ingestr-0.13.84}/docs/getting-started/telemetry.md +0 -0
  39. {ingestr-0.13.82 → ingestr-0.13.84}/docs/index.md +0 -0
  40. {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/applovin_max.png +0 -0
  41. {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/athena.png +0 -0
  42. {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/clickhouse_img.png +0 -0
  43. {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/clickup_ingestion.png +0 -0
  44. {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/cratedb-destination.png +0 -0
  45. {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/cratedb-source.png +0 -0
  46. {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/freshdesk_ingestion.png +0 -0
  47. {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/gcp_spanner_ingestion.png +0 -0
  48. {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/github.png +0 -0
  49. {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/google_analytics_realtime_report.png +0 -0
  50. {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/googleanalytics.png +0 -0
  51. {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/ingestion_elasticsearch_img.png +0 -0
  52. {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/kinesis.bigquery.png +0 -0
  53. {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/linear.png +0 -0
  54. {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/linkedin_ads.png +0 -0
  55. {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/mixpanel_ingestion.png +0 -0
  56. {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/personio.png +0 -0
  57. {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/personio_duckdb.png +0 -0
  58. {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/phantombuster.png +0 -0
  59. {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/pipedrive.png +0 -0
  60. {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/quickbook_ingestion.png +0 -0
  61. {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/sftp.png +0 -0
  62. {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/stripe_postgres.png +0 -0
  63. {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/tiktok.png +0 -0
  64. {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/zoom_ingestion.png +0 -0
  65. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/adjust.md +0 -0
  66. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/airtable.md +0 -0
  67. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/applovin.md +0 -0
  68. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/applovin_max.md +0 -0
  69. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/appsflyer.md +0 -0
  70. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/appstore.md +0 -0
  71. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/asana.md +0 -0
  72. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/athena.md +0 -0
  73. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/attio.md +0 -0
  74. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/bigquery.md +0 -0
  75. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/chess.md +0 -0
  76. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/clickhouse.md +0 -0
  77. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/clickup.md +0 -0
  78. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/cratedb.md +0 -0
  79. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/csv.md +0 -0
  80. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/custom_queries.md +0 -0
  81. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/databricks.md +0 -0
  82. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/db2.md +0 -0
  83. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/duckdb.md +0 -0
  84. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/dynamodb.md +0 -0
  85. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/elasticsearch.md +0 -0
  86. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/facebook-ads.md +0 -0
  87. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/frankfurter.md +0 -0
  88. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/freshdesk.md +0 -0
  89. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/gcs.md +0 -0
  90. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/github.md +0 -0
  91. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/google-ads.md +0 -0
  92. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/google_analytics.md +0 -0
  93. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/gorgias.md +0 -0
  94. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/gsheets.md +0 -0
  95. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/hubspot.md +0 -0
  96. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/influxdb.md +0 -0
  97. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/isoc-pulse.md +0 -0
  98. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/kafka.md +0 -0
  99. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/kinesis.md +0 -0
  100. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/klaviyo.md +0 -0
  101. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/linkedin_ads.md +0 -0
  102. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/mixpanel.md +0 -0
  103. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/mongodb.md +0 -0
  104. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/motherduck.md +0 -0
  105. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/mssql.md +0 -0
  106. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/mysql.md +0 -0
  107. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/notion.md +0 -0
  108. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/oracle.md +0 -0
  109. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/personio.md +0 -0
  110. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/phantombuster.md +0 -0
  111. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/pinterest.md +0 -0
  112. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/pipedrive.md +0 -0
  113. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/postgres.md +0 -0
  114. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/quickbooks.md +0 -0
  115. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/redshift.md +0 -0
  116. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/s3.md +0 -0
  117. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/salesforce.md +0 -0
  118. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/sap-hana.md +0 -0
  119. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/sftp.md +0 -0
  120. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/shopify.md +0 -0
  121. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/slack.md +0 -0
  122. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/smartsheets.md +0 -0
  123. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/snowflake.md +0 -0
  124. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/solidgate.md +0 -0
  125. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/spanner.md +0 -0
  126. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/sqlite.md +0 -0
  127. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/stripe.md +0 -0
  128. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/tiktok-ads.md +0 -0
  129. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/trustpilot.md +0 -0
  130. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/zendesk.md +0 -0
  131. {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/zoom.md +0 -0
  132. {ingestr-0.13.82 → ingestr-0.13.84}/docs/tutorials/load-kinesis-bigquery.md +0 -0
  133. {ingestr-0.13.82 → ingestr-0.13.84}/docs/tutorials/load-personio-duckdb.md +0 -0
  134. {ingestr-0.13.82 → ingestr-0.13.84}/docs/tutorials/load-stripe-postgres.md +0 -0
  135. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/conftest.py +0 -0
  136. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/main.py +0 -0
  137. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/.gitignore +0 -0
  138. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/adjust/__init__.py +0 -0
  139. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/adjust/adjust_helpers.py +0 -0
  140. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/airtable/__init__.py +0 -0
  141. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/applovin/__init__.py +0 -0
  142. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/applovin_max/__init__.py +0 -0
  143. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/appsflyer/__init__.py +0 -0
  144. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/appsflyer/client.py +0 -0
  145. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/appstore/__init__.py +0 -0
  146. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/appstore/client.py +0 -0
  147. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/appstore/errors.py +0 -0
  148. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/appstore/models.py +0 -0
  149. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/appstore/resources.py +0 -0
  150. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/arrow/__init__.py +0 -0
  151. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/asana_source/__init__.py +0 -0
  152. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/asana_source/helpers.py +0 -0
  153. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/asana_source/settings.py +0 -0
  154. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/attio/__init__.py +0 -0
  155. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/attio/helpers.py +0 -0
  156. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/blob.py +0 -0
  157. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/chess/__init__.py +0 -0
  158. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/chess/helpers.py +0 -0
  159. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/chess/settings.py +0 -0
  160. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/clickup/__init__.py +0 -0
  161. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/clickup/helpers.py +0 -0
  162. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/collector/spinner.py +0 -0
  163. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/destinations.py +0 -0
  164. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/dynamodb/__init__.py +0 -0
  165. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/elasticsearch/__init__.py +0 -0
  166. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/errors.py +0 -0
  167. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/facebook_ads/__init__.py +0 -0
  168. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/facebook_ads/exceptions.py +0 -0
  169. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/facebook_ads/helpers.py +0 -0
  170. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/facebook_ads/settings.py +0 -0
  171. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/facebook_ads/utils.py +0 -0
  172. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/filesystem/__init__.py +0 -0
  173. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/filesystem/helpers.py +0 -0
  174. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/filesystem/readers.py +0 -0
  175. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/filters.py +0 -0
  176. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/frankfurter/__init__.py +0 -0
  177. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/frankfurter/helpers.py +0 -0
  178. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/freshdesk/__init__.py +0 -0
  179. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/freshdesk/freshdesk_client.py +0 -0
  180. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/freshdesk/settings.py +0 -0
  181. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/github/__init__.py +0 -0
  182. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/github/helpers.py +0 -0
  183. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/github/queries.py +0 -0
  184. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/github/settings.py +0 -0
  185. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/google_ads/__init__.py +0 -0
  186. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/google_ads/field.py +0 -0
  187. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/google_ads/metrics.py +0 -0
  188. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/google_ads/predicates.py +0 -0
  189. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/google_ads/reports.py +0 -0
  190. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/google_analytics/__init__.py +0 -0
  191. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/google_analytics/helpers.py +0 -0
  192. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/google_sheets/README.md +0 -0
  193. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/google_sheets/__init__.py +0 -0
  194. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
  195. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
  196. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
  197. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/gorgias/__init__.py +0 -0
  198. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/gorgias/helpers.py +0 -0
  199. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/http_client.py +0 -0
  200. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/hubspot/__init__.py +0 -0
  201. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/hubspot/helpers.py +0 -0
  202. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/hubspot/settings.py +0 -0
  203. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/influxdb/__init__.py +0 -0
  204. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/influxdb/client.py +0 -0
  205. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/isoc_pulse/__init__.py +0 -0
  206. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/kafka/__init__.py +0 -0
  207. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/kafka/helpers.py +0 -0
  208. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/kinesis/__init__.py +0 -0
  209. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/kinesis/helpers.py +0 -0
  210. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/klaviyo/__init__.py +0 -0
  211. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/klaviyo/client.py +0 -0
  212. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/klaviyo/helpers.py +0 -0
  213. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/linear/helpers.py +0 -0
  214. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/linkedin_ads/__init__.py +0 -0
  215. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
  216. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/linkedin_ads/helpers.py +0 -0
  217. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/loader.py +0 -0
  218. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/mixpanel/__init__.py +0 -0
  219. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/mixpanel/client.py +0 -0
  220. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/mongodb/__init__.py +0 -0
  221. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/mongodb/helpers.py +0 -0
  222. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/notion/__init__.py +0 -0
  223. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/notion/helpers/__init__.py +0 -0
  224. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/notion/helpers/client.py +0 -0
  225. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/notion/helpers/database.py +0 -0
  226. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/notion/settings.py +0 -0
  227. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/partition.py +0 -0
  228. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/personio/__init__.py +0 -0
  229. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/personio/helpers.py +0 -0
  230. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/phantombuster/__init__.py +0 -0
  231. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/phantombuster/client.py +0 -0
  232. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/pinterest/__init__.py +0 -0
  233. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/pipedrive/__init__.py +0 -0
  234. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/pipedrive/helpers/__init__.py +0 -0
  235. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/pipedrive/helpers/custom_fields_munger.py +0 -0
  236. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/pipedrive/helpers/pages.py +0 -0
  237. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/pipedrive/settings.py +0 -0
  238. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/pipedrive/typing.py +0 -0
  239. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/quickbooks/__init__.py +0 -0
  240. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/resource.py +0 -0
  241. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/salesforce/__init__.py +0 -0
  242. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/salesforce/helpers.py +0 -0
  243. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/shopify/__init__.py +0 -0
  244. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/shopify/exceptions.py +0 -0
  245. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/shopify/helpers.py +0 -0
  246. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/shopify/settings.py +0 -0
  247. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/slack/__init__.py +0 -0
  248. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/slack/helpers.py +0 -0
  249. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/slack/settings.py +0 -0
  250. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/smartsheets/__init__.py +0 -0
  251. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/solidgate/__init__.py +0 -0
  252. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/solidgate/helpers.py +0 -0
  253. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/sql_database/__init__.py +0 -0
  254. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/sql_database/callbacks.py +0 -0
  255. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/stripe_analytics/helpers.py +0 -0
  256. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/stripe_analytics/settings.py +0 -0
  257. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/table_definition.py +0 -0
  258. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/telemetry/event.py +0 -0
  259. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/testdata/fakebqcredentials.json +0 -0
  260. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/tiktok_ads/__init__.py +0 -0
  261. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -0
  262. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/time.py +0 -0
  263. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/trustpilot/__init__.py +0 -0
  264. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/trustpilot/client.py +0 -0
  265. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/version.py +0 -0
  266. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/zendesk/__init__.py +0 -0
  267. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/zendesk/helpers/__init__.py +0 -0
  268. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
  269. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/zendesk/helpers/credentials.py +0 -0
  270. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
  271. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/zendesk/settings.py +0 -0
  272. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/zoom/__init__.py +0 -0
  273. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/zoom/helpers.py +0 -0
  274. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/testdata/.gitignore +0 -0
  275. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/testdata/create_replace.csv +0 -0
  276. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/testdata/delete_insert_expected.csv +0 -0
  277. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/testdata/delete_insert_part1.csv +0 -0
  278. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/testdata/delete_insert_part2.csv +0 -0
  279. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/testdata/merge_expected.csv +0 -0
  280. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/testdata/merge_part1.csv +0 -0
  281. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/testdata/merge_part2.csv +0 -0
  282. {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/tests/unit/test_smartsheets.py +0 -0
  283. {ingestr-0.13.82 → ingestr-0.13.84}/package-lock.json +0 -0
  284. {ingestr-0.13.82 → ingestr-0.13.84}/package.json +0 -0
  285. {ingestr-0.13.82 → ingestr-0.13.84}/requirements-dev.txt +0 -0
  286. {ingestr-0.13.82 → ingestr-0.13.84}/requirements.in +0 -0
  287. {ingestr-0.13.82 → ingestr-0.13.84}/requirements_arm64.txt +0 -0
  288. {ingestr-0.13.82 → ingestr-0.13.84}/resources/demo.gif +0 -0
  289. {ingestr-0.13.82 → ingestr-0.13.84}/resources/demo.tape +0 -0
  290. {ingestr-0.13.82 → ingestr-0.13.84}/resources/ingestr.svg +0 -0
  291. {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/AMPM.yml +0 -0
  292. {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Acronyms.yml +0 -0
  293. {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Colons.yml +0 -0
  294. {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Contractions.yml +0 -0
  295. {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/DateFormat.yml +0 -0
  296. {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Ellipses.yml +0 -0
  297. {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/EmDash.yml +0 -0
  298. {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Exclamation.yml +0 -0
  299. {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/FirstPerson.yml +0 -0
  300. {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Gender.yml +0 -0
  301. {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/GenderBias.yml +0 -0
  302. {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/HeadingPunctuation.yml +0 -0
  303. {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Headings.yml +0 -0
  304. {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Latin.yml +0 -0
  305. {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/LyHyphens.yml +0 -0
  306. {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/OptionalPlurals.yml +0 -0
  307. {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Ordinal.yml +0 -0
  308. {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/OxfordComma.yml +0 -0
  309. {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Parens.yml +0 -0
  310. {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Passive.yml +0 -0
  311. {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Periods.yml +0 -0
  312. {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Quotes.yml +0 -0
  313. {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Ranges.yml +0 -0
  314. {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Semicolons.yml +0 -0
  315. {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Slang.yml +0 -0
  316. {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Spacing.yml +0 -0
  317. {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Spelling.yml +0 -0
  318. {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Units.yml +0 -0
  319. {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/We.yml +0 -0
  320. {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Will.yml +0 -0
  321. {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/WordList.yml +0 -0
  322. {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/meta.json +0 -0
  323. {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/vocab.txt +0 -0
  324. {ingestr-0.13.82 → ingestr-0.13.84}/styles/bruin/Ingestr.yml +0 -0
  325. {ingestr-0.13.82 → ingestr-0.13.84}/styles/config/vocabularies/bruin/accept.txt +0 -0
  326. {ingestr-0.13.82 → ingestr-0.13.84}/test.env.template +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ingestr
3
- Version: 0.13.82
3
+ Version: 0.13.84
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
@@ -83,7 +83,7 @@ Requires-Dist: google-cloud-storage==3.1.0
83
83
  Requires-Dist: google-crc32c==1.6.0
84
84
  Requires-Dist: google-resumable-media==2.7.2
85
85
  Requires-Dist: googleapis-common-protos==1.69.0
86
- Requires-Dist: greenlet==3.2.3
86
+ Requires-Dist: greenlet==3.2.4
87
87
  Requires-Dist: grpc-google-iam-v1==0.14.2
88
88
  Requires-Dist: grpc-interceptor==0.15.4
89
89
  Requires-Dist: grpcio-status==1.62.3
@@ -155,6 +155,7 @@ export default defineConfig({
155
155
  { text: "Solidgate", link: "/supported-sources/solidgate.md" },
156
156
  { text: "Stripe", link: "/supported-sources/stripe.md" },
157
157
  { text: "TikTok Ads", link: "/supported-sources/tiktok-ads.md" },
158
+ { text: "Wise", link: "/supported-sources/wise.md" },
158
159
  { text: "Zendesk", link: "/supported-sources/zendesk.md" },
159
160
  { text: "Zoom", link: "/supported-sources/zoom.md" },
160
161
  ],
@@ -47,14 +47,9 @@ Linear source allows ingesting the following tables:
47
47
  - `labels`: Fetches labels used for categorizing issues.
48
48
  - `organization`: Fetches organization-level information.
49
49
  - `project_updates`: Fetches updates posted to projects.
50
- - `roadmaps`: Fetches roadmap data for strategic planning.
51
- - `roadmap_to_projects`: Fetches relationships between roadmaps and projects.
52
50
  - `team_memberships`: Fetches team membership information.
53
51
  - `initiative_to_project`: Fetches relationships between initiatives and projects.
54
52
  - `project_milestone`: Fetches project milestone data.
55
53
  - `project_status`: Fetches project status information.
56
- - `team`: Fetches team-level data.
57
- - `project`: Fetches individual project information.
58
-
59
54
 
60
55
  Use these as the `--source-table` parameter in the `ingestr ingest` command.
@@ -0,0 +1,49 @@
1
+ # Wise
2
+
3
+ [Wise](https://wise.com/) is a global financial technology company that provides international money transfers, multi-currency accounts, and business payment solutions.
4
+
5
+ ingestr supports Wise as a source.
6
+
7
+ ## URI format
8
+
9
+ ```plaintext
10
+ wise://?api_key=<api_token>
11
+ ```
12
+
13
+ URI parameters:
14
+
15
+ - `api_key`: Wise API token.
16
+
17
+ ### Please follow the steps below to get a Wise API token
18
+ - Go to wise.com and log in.
19
+ - Click on your profile picture.
20
+ - From the dropdown, choose "Settings".
21
+ - In the left-hand menu, click "API Tokens".
22
+ - Click "Create API Token".
23
+ - Give it a name.
24
+ - Click "Create".
25
+ Copy the token and save it securely..
26
+
27
+ ## Example
28
+
29
+ Copy transfers from Wise into a DuckDB database:
30
+
31
+ ```sh
32
+ ingestr ingest \
33
+ --source-uri 'wise://?api_key=mytoken' \
34
+ --source-table transfers \
35
+ --dest-uri duckdb:///wise.duckdb \
36
+ --dest-table wise.transfers
37
+ ```
38
+
39
+ ## Tables
40
+
41
+ Wise source allows ingesting the following sources into separate tables:
42
+ | Table | PK | Inc Key | Inc Strategy | Details |
43
+ | --------------- | ----------- | --------------- | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
44
+ | `profiles` | `id` | – | merge | Retrieves all profiles associated with the user. |
45
+ | `transfers` | `id` | `created` | merge | Lists all transfers for including status and details associated with the user. |
46
+ | `balances` | `id` | `modificationTime` | merge | Retrieve the user's multi-currency account balance accounts. It returns all balance accounts the profile has.
47
+
48
+
49
+ <img alt="wise_ingestion_img" src="../media/wise_ingestion.png" />
@@ -0,0 +1 @@
1
+ version = "v0.13.84"
@@ -73,6 +73,7 @@ from ingestr.src.sources import (
73
73
  StripeAnalyticsSource,
74
74
  TikTokSource,
75
75
  TrustpilotSource,
76
+ WiseSource,
76
77
  ZendeskSource,
77
78
  ZoomSource,
78
79
  )
@@ -192,6 +193,7 @@ class SourceDestinationFactory:
192
193
  "zoom": ZoomSource,
193
194
  "clickup": ClickupSource,
194
195
  "influxdb": InfluxDBSource,
196
+ "wise": WiseSource,
195
197
  }
196
198
  destinations: Dict[str, Type[DestinationProtocol]] = {
197
199
  "bigquery": BigQueryDestination,
@@ -485,9 +485,32 @@ query Projects($cursor: String) {
485
485
  description
486
486
  createdAt
487
487
  updatedAt
488
+ archivedAt
489
+ completedAt
490
+ canceledAt
491
+ startedAt
492
+
493
+ color
494
+ icon
495
+ slugId
496
+ url
497
+
488
498
  health
489
499
  priority
500
+ priorityLabel
501
+ state
502
+
490
503
  targetDate
504
+ startDate
505
+
506
+ progress
507
+ currentProgress
508
+ scope
509
+
510
+ sortOrder
511
+ trashed
512
+
513
+ creator { id }
491
514
  lead { id }
492
515
  }
493
516
  pageInfo { hasNextPage endCursor }
@@ -495,6 +518,58 @@ query Projects($cursor: String) {
495
518
  }
496
519
  """
497
520
 
521
+ TEAMS_QUERY = """
522
+ query Teams($cursor: String) {
523
+ teams(first: 50, after: $cursor) {
524
+ nodes {
525
+ id
526
+ name
527
+ key
528
+ description
529
+ color
530
+ icon
531
+ private
532
+ archivedAt
533
+ createdAt
534
+ updatedAt
535
+
536
+ organization { id }
537
+ parent { id }
538
+
539
+ cyclesEnabled
540
+ cycleDuration
541
+ cycleStartDay
542
+ cycleCooldownTime
543
+
544
+ issueCount
545
+ issueEstimationType
546
+ issueEstimationAllowZero
547
+ issueEstimationExtended
548
+ issueOrderingNoPriorityFirst
549
+
550
+ autoArchivePeriod
551
+ autoClosePeriod
552
+ autoCloseChildIssues
553
+ autoCloseParentIssues
554
+
555
+ groupIssueHistory
556
+ timezone
557
+ inviteHash
558
+ joinByDefault
559
+
560
+ slackNewIssue
561
+ slackIssueComments
562
+ slackIssueStatuses
563
+
564
+ triageEnabled
565
+ requirePriorityToLeaveTriage
566
+ upcomingCycleCount
567
+ }
568
+ pageInfo { hasNextPage endCursor }
569
+ }
570
+ }
571
+ """
572
+
498
573
 
499
574
  # Paginated resources configuration
500
575
  PAGINATED_RESOURCES = [
@@ -515,6 +590,7 @@ PAGINATED_RESOURCES = [
515
590
  ("project_milestone", PROJECT_MILESTONES_QUERY, "projectMilestones"),
516
591
  ("project_status", PROJECT_STATUSES_QUERY, "projectStatuses"),
517
592
  ("projects", PROJECTS_QUERY, "projects"),
593
+ ("teams", TEAMS_QUERY, "teams"),
518
594
  ]
519
595
 
520
596
 
@@ -3386,3 +3386,41 @@ class InfluxDBSource:
3386
3386
  start_date=start_date,
3387
3387
  end_date=end_date,
3388
3388
  ).with_resources(table)
3389
+
3390
+
3391
+ class WiseSource:
3392
+ def handles_incrementality(self) -> bool:
3393
+ return True
3394
+
3395
+ def dlt_source(self, uri: str, table: str, **kwargs):
3396
+ parsed = urlparse(uri)
3397
+ params = parse_qs(parsed.query)
3398
+ api_key = params.get("api_key")
3399
+
3400
+ if not api_key:
3401
+ raise MissingValueError("api_key", "Wise")
3402
+
3403
+ if table not in ["profiles", "transfers", "balances"]:
3404
+ raise ValueError(
3405
+ f"Resource '{table}' is not supported for Wise source yet, if you are interested in it please create a GitHub issue at https://github.com/bruin-data/ingestr"
3406
+ )
3407
+
3408
+ start_date = kwargs.get("interval_start")
3409
+ if start_date:
3410
+ start_date = ensure_pendulum_datetime(start_date).in_timezone("UTC")
3411
+ else:
3412
+ start_date = pendulum.datetime(2020, 1, 1).in_timezone("UTC")
3413
+
3414
+ end_date = kwargs.get("interval_end")
3415
+ if end_date:
3416
+ end_date = ensure_pendulum_datetime(end_date).in_timezone("UTC")
3417
+ else:
3418
+ end_date = None
3419
+
3420
+ from ingestr.src.wise import wise_source
3421
+
3422
+ return wise_source(
3423
+ api_key=api_key[0],
3424
+ start_date=start_date,
3425
+ end_date=end_date,
3426
+ ).with_resources(table)
@@ -94,7 +94,7 @@ def async_stripe_source(
94
94
  )(endpoint)
95
95
 
96
96
 
97
- @dlt.source
97
+ @dlt.source(max_table_nesting=0)
98
98
  def incremental_stripe_source(
99
99
  endpoints: Tuple[str, ...],
100
100
  stripe_secret_key: str = dlt.secrets.value,
@@ -0,0 +1,68 @@
1
+ from typing import Iterable
2
+
3
+ import dlt
4
+ import pendulum
5
+ from dlt.common.typing import TDataItem
6
+ from dlt.sources import DltResource
7
+
8
+ from .client import WiseClient
9
+
10
+
11
+ @dlt.source(max_table_nesting=0)
12
+ def wise_source(
13
+ api_key: str,
14
+ start_date: pendulum.DateTime,
15
+ end_date: pendulum.DateTime | None = None,
16
+ ) -> Iterable[DltResource]:
17
+ client = WiseClient(api_key)
18
+
19
+ # List of all profiles belonging to user.
20
+ @dlt.resource(write_disposition="merge", name="profiles", primary_key="id")
21
+ def profiles() -> Iterable[TDataItem]:
22
+ yield from client.fetch_profiles()
23
+
24
+ # List transfers for a profile.
25
+ @dlt.resource(write_disposition="merge", name="transfers", primary_key="id")
26
+ def transfers(
27
+ profiles=profiles,
28
+ datetime=dlt.sources.incremental(
29
+ "created",
30
+ initial_value=start_date,
31
+ end_value=end_date,
32
+ range_end="closed",
33
+ range_start="closed",
34
+ ),
35
+ ):
36
+ if datetime.end_value is None:
37
+ end_dt = pendulum.now(tz="UTC")
38
+ else:
39
+ end_dt = datetime.end_value
40
+
41
+ start_dt = datetime.last_value
42
+
43
+ for profile in profiles:
44
+ yield from client.fetch_transfers(profile["id"], start_dt, end_dt)
45
+
46
+ # Retrieve the user's multi-currency account balance accounts. It returns all balance accounts the profile has.
47
+ @dlt.resource(write_disposition="merge", name="balances", primary_key="id")
48
+ def balances(
49
+ profiles=profiles,
50
+ datetime=dlt.sources.incremental(
51
+ "modificationTime",
52
+ initial_value=start_date,
53
+ end_value=end_date,
54
+ range_end="closed",
55
+ range_start="closed",
56
+ ),
57
+ ) -> Iterable[TDataItem]:
58
+ if datetime.end_value is None:
59
+ end_dt = pendulum.now(tz="UTC")
60
+ else:
61
+ end_dt = datetime.end_value
62
+
63
+ start_dt = datetime.last_value
64
+
65
+ for profile in profiles:
66
+ yield from client.fetch_balances(profile["id"], start_dt, end_dt)
67
+
68
+ return profiles, transfers, balances
@@ -0,0 +1,63 @@
1
+ from typing import Iterable
2
+
3
+ import pendulum
4
+ from dlt.sources.helpers.requests import Client
5
+
6
+
7
+ class WiseClient:
8
+ BASE_URL = "https://api.transferwise.com"
9
+
10
+ def __init__(self, api_key: str) -> None:
11
+ self.session = Client(raise_for_status=False).session
12
+ self.session.headers.update({"Authorization": f"Bearer {api_key}"})
13
+
14
+ # https://docs.wise.com/api-docs/api-reference/profile#list-profiles
15
+ def fetch_profiles(self) -> Iterable[dict]:
16
+ url = f"{self.BASE_URL}/v2/profiles"
17
+ resp = self.session.get(url)
18
+ resp.raise_for_status()
19
+ for profile in resp.json():
20
+ yield profile
21
+
22
+ # https://docs.wise.com/api-docs/api-reference/transfer#list-transfers
23
+ def fetch_transfers(
24
+ self, profile_id: str, start_time=pendulum.DateTime, end_time=pendulum.DateTime
25
+ ):
26
+ offset = 0
27
+
28
+ while True:
29
+ data = self.session.get(
30
+ f"{self.BASE_URL}/v1/transfers",
31
+ params={
32
+ "profile": profile_id,
33
+ "createdDateStart": start_time.to_date_string(),
34
+ "createdDateEnd": end_time.to_date_string(),
35
+ "limit": 100,
36
+ "offset": offset,
37
+ },
38
+ )
39
+ response_data = data.json()
40
+
41
+ if not response_data or len(response_data) == 0:
42
+ break
43
+
44
+ for transfer in response_data:
45
+ transfer["created"] = pendulum.parse(transfer["created"])
46
+
47
+ yield transfer
48
+ offset += 100
49
+
50
+ # https://docs.wise.com/api-docs/api-reference/balance#list
51
+ def fetch_balances(
52
+ self, profile_id: str, start_time=pendulum.DateTime, end_time=pendulum.DateTime
53
+ ) -> Iterable[dict]:
54
+ url = f"{self.BASE_URL}/v4/profiles/{profile_id}/balances"
55
+ resp = self.session.get(url, params={"types": "STANDARD,SAVINGS"})
56
+ resp.raise_for_status()
57
+ for balance in resp.json():
58
+ balance["modificationTime"] = pendulum.parse(balance["modificationTime"])
59
+ if (
60
+ balance["modificationTime"] > start_time
61
+ and balance["modificationTime"] < end_time
62
+ ):
63
+ yield balance
@@ -93,7 +93,8 @@ exclude = [
93
93
  'src/zoom/.*',
94
94
  'src/clickup/.*',
95
95
  'src/influxdb/.*',
96
- 'src/freshdesk/.*'
96
+ 'src/freshdesk/.*',
97
+ 'src/wise/.*'
97
98
  ]
98
99
 
99
100
  [[tool.mypy.overrides]]
@@ -125,7 +126,8 @@ module = [
125
126
  "ingestr.src.zoom.*",
126
127
  "ingestr.src.clickup.*",
127
128
  "ingestr.src.influxdb",
128
- "ingestr.src.freshdesk"
129
+ "ingestr.src.freshdesk",
130
+ "ingestr.src.wise"
129
131
  ]
130
132
  follow_imports = "skip"
131
133
 
@@ -214,7 +214,7 @@ googleapis-common-protos==1.69.0
214
214
  # google-api-core
215
215
  # grpc-google-iam-v1
216
216
  # grpcio-status
217
- greenlet==3.2.3
217
+ greenlet==3.2.4
218
218
  # via sqlalchemy
219
219
  grpc-google-iam-v1==0.14.2
220
220
  # via google-cloud-spanner
@@ -1 +0,0 @@
1
- version = "v0.13.82"
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
File without changes