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.
- {ingestr-0.13.82 → ingestr-0.13.84}/PKG-INFO +2 -2
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/.vitepress/config.mjs +1 -0
- ingestr-0.13.84/docs/media/wise_ingestion.png +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/linear.md +0 -5
- ingestr-0.13.84/docs/supported-sources/wise.md +49 -0
- ingestr-0.13.84/ingestr/src/buildinfo.py +1 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/factory.py +2 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/linear/__init__.py +76 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/sources.py +38 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/stripe_analytics/__init__.py +1 -1
- ingestr-0.13.84/ingestr/src/wise/__init__.py +68 -0
- ingestr-0.13.84/ingestr/src/wise/client.py +63 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/pyproject.toml +4 -2
- {ingestr-0.13.82 → ingestr-0.13.84}/requirements.txt +1 -1
- ingestr-0.13.82/ingestr/src/buildinfo.py +0 -1
- {ingestr-0.13.82 → ingestr-0.13.84}/.dlt/config.toml +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/.dockerignore +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/.githooks/pre-commit-hook.sh +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/.github/workflows/deploy-docs.yml +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/.github/workflows/release.yml +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/.github/workflows/secrets-scan.yml +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/.github/workflows/tests.yml +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/.gitignore +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/.gitleaksignore +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/.python-version +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/.vale.ini +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/Dockerfile +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/LICENSE.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/Makefile +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/README.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/.vitepress/theme/custom.css +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/.vitepress/theme/index.js +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/commands/example-uris.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/commands/ingest.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/getting-started/core-concepts.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/getting-started/incremental-loading.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/getting-started/quickstart.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/getting-started/telemetry.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/index.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/applovin_max.png +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/athena.png +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/clickhouse_img.png +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/clickup_ingestion.png +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/cratedb-destination.png +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/cratedb-source.png +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/freshdesk_ingestion.png +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/gcp_spanner_ingestion.png +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/github.png +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/google_analytics_realtime_report.png +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/googleanalytics.png +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/ingestion_elasticsearch_img.png +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/kinesis.bigquery.png +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/linear.png +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/linkedin_ads.png +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/mixpanel_ingestion.png +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/personio.png +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/personio_duckdb.png +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/phantombuster.png +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/pipedrive.png +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/quickbook_ingestion.png +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/sftp.png +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/stripe_postgres.png +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/tiktok.png +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/media/zoom_ingestion.png +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/adjust.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/airtable.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/applovin.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/applovin_max.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/appsflyer.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/appstore.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/asana.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/athena.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/attio.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/bigquery.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/chess.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/clickhouse.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/clickup.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/cratedb.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/csv.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/custom_queries.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/databricks.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/db2.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/duckdb.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/dynamodb.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/elasticsearch.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/facebook-ads.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/frankfurter.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/freshdesk.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/gcs.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/github.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/google-ads.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/google_analytics.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/gorgias.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/gsheets.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/hubspot.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/influxdb.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/isoc-pulse.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/kafka.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/kinesis.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/klaviyo.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/linkedin_ads.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/mixpanel.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/mongodb.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/motherduck.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/mssql.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/mysql.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/notion.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/oracle.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/personio.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/phantombuster.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/pinterest.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/pipedrive.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/postgres.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/quickbooks.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/redshift.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/s3.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/salesforce.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/sap-hana.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/sftp.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/shopify.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/slack.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/smartsheets.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/snowflake.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/solidgate.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/spanner.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/sqlite.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/stripe.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/tiktok-ads.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/trustpilot.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/zendesk.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/supported-sources/zoom.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/tutorials/load-kinesis-bigquery.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/tutorials/load-personio-duckdb.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/docs/tutorials/load-stripe-postgres.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/conftest.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/main.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/.gitignore +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/adjust/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/adjust/adjust_helpers.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/airtable/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/applovin/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/applovin_max/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/appsflyer/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/appsflyer/client.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/appstore/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/appstore/client.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/appstore/errors.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/appstore/models.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/appstore/resources.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/arrow/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/asana_source/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/asana_source/helpers.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/asana_source/settings.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/attio/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/attio/helpers.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/blob.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/chess/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/chess/helpers.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/chess/settings.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/clickup/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/clickup/helpers.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/collector/spinner.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/destinations.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/dynamodb/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/elasticsearch/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/errors.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/facebook_ads/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/facebook_ads/exceptions.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/facebook_ads/helpers.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/facebook_ads/settings.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/facebook_ads/utils.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/filesystem/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/filesystem/helpers.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/filesystem/readers.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/filters.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/frankfurter/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/frankfurter/helpers.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/freshdesk/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/freshdesk/freshdesk_client.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/freshdesk/settings.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/github/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/github/helpers.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/github/queries.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/github/settings.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/google_ads/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/google_ads/field.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/google_ads/metrics.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/google_ads/predicates.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/google_ads/reports.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/google_analytics/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/google_analytics/helpers.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/google_sheets/README.md +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/google_sheets/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/gorgias/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/gorgias/helpers.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/http_client.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/hubspot/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/hubspot/helpers.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/hubspot/settings.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/influxdb/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/influxdb/client.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/isoc_pulse/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/kafka/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/kafka/helpers.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/kinesis/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/kinesis/helpers.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/klaviyo/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/klaviyo/client.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/klaviyo/helpers.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/linear/helpers.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/linkedin_ads/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/linkedin_ads/helpers.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/loader.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/mixpanel/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/mixpanel/client.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/mongodb/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/mongodb/helpers.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/notion/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/notion/helpers/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/notion/helpers/client.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/notion/helpers/database.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/notion/settings.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/partition.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/personio/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/personio/helpers.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/phantombuster/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/phantombuster/client.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/pinterest/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/pipedrive/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/pipedrive/helpers/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/pipedrive/helpers/custom_fields_munger.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/pipedrive/helpers/pages.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/pipedrive/settings.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/pipedrive/typing.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/quickbooks/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/resource.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/salesforce/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/salesforce/helpers.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/shopify/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/shopify/exceptions.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/shopify/helpers.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/shopify/settings.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/slack/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/slack/helpers.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/slack/settings.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/smartsheets/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/solidgate/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/solidgate/helpers.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/sql_database/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/sql_database/callbacks.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/stripe_analytics/helpers.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/stripe_analytics/settings.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/table_definition.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/telemetry/event.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/testdata/fakebqcredentials.json +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/tiktok_ads/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/time.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/trustpilot/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/trustpilot/client.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/version.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/zendesk/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/zendesk/helpers/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/zendesk/helpers/credentials.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/zendesk/settings.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/zoom/__init__.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/src/zoom/helpers.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/testdata/.gitignore +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/testdata/create_replace.csv +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/testdata/delete_insert_expected.csv +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/testdata/delete_insert_part1.csv +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/testdata/delete_insert_part2.csv +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/testdata/merge_expected.csv +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/testdata/merge_part1.csv +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/testdata/merge_part2.csv +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/ingestr/tests/unit/test_smartsheets.py +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/package-lock.json +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/package.json +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/requirements-dev.txt +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/requirements.in +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/requirements_arm64.txt +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/resources/demo.gif +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/resources/demo.tape +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/resources/ingestr.svg +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/AMPM.yml +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Acronyms.yml +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Colons.yml +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Contractions.yml +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/DateFormat.yml +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Ellipses.yml +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/EmDash.yml +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Exclamation.yml +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/FirstPerson.yml +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Gender.yml +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/GenderBias.yml +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/HeadingPunctuation.yml +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Headings.yml +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Latin.yml +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/LyHyphens.yml +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/OptionalPlurals.yml +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Ordinal.yml +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/OxfordComma.yml +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Parens.yml +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Passive.yml +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Periods.yml +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Quotes.yml +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Ranges.yml +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Semicolons.yml +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Slang.yml +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Spacing.yml +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Spelling.yml +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Units.yml +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/We.yml +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/Will.yml +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/WordList.yml +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/meta.json +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/styles/Google/vocab.txt +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/styles/bruin/Ingestr.yml +0 -0
- {ingestr-0.13.82 → ingestr-0.13.84}/styles/config/vocabularies/bruin/accept.txt +0 -0
- {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.
|
|
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.
|
|
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
|
],
|
|
Binary file
|
|
@@ -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)
|
|
@@ -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
|
|
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|