ingestr 0.13.67__tar.gz → 0.13.69__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.
- ingestr-0.13.69/.dlt/config.toml +3 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/PKG-INFO +2 -2
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/conftest.py +9 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/main.py +2 -2
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/applovin_max/__init__.py +1 -0
- ingestr-0.13.69/ingestr/src/buildinfo.py +1 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/destinations.py +2 -2
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/linear/__init__.py +5 -3
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/linear/helpers.py +16 -4
- ingestr-0.13.69/ingestr/src/solidgate/__init__.py +223 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/solidgate/helpers.py +29 -21
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/sources.py +21 -1
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/stripe_analytics/helpers.py +0 -1
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/zoom/__init__.py +2 -2
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/zoom/helpers.py +1 -1
- {ingestr-0.13.67 → ingestr-0.13.69}/requirements.in +1 -1
- {ingestr-0.13.67 → ingestr-0.13.69}/requirements.txt +1 -1
- {ingestr-0.13.67 → ingestr-0.13.69}/requirements_arm64.txt +1 -1
- ingestr-0.13.67/ingestr/src/buildinfo.py +0 -1
- ingestr-0.13.67/ingestr/src/solidgate/__init__.py +0 -127
- {ingestr-0.13.67 → ingestr-0.13.69}/.dockerignore +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/.githooks/pre-commit-hook.sh +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/.github/workflows/deploy-docs.yml +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/.github/workflows/release.yml +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/.github/workflows/secrets-scan.yml +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/.github/workflows/tests.yml +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/.gitignore +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/.gitleaksignore +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/.python-version +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/.vale.ini +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/Dockerfile +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/LICENSE.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/Makefile +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/README.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/.vitepress/config.mjs +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/.vitepress/theme/custom.css +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/.vitepress/theme/index.js +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/commands/example-uris.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/commands/ingest.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/getting-started/core-concepts.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/getting-started/incremental-loading.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/getting-started/quickstart.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/getting-started/telemetry.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/index.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/media/applovin_max.png +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/media/athena.png +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/media/clickhouse_img.png +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/media/cratedb-destination.png +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/media/cratedb-source.png +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/media/freshdesk_ingestion.png +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/media/gcp_spanner_ingestion.png +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/media/github.png +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/media/google_analytics_realtime_report.png +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/media/googleanalytics.png +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/media/ingestion_elasticsearch_img.png +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/media/kinesis.bigquery.png +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/media/linear.png +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/media/linkedin_ads.png +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/media/mixpanel_ingestion.png +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/media/personio.png +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/media/personio_duckdb.png +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/media/phantombuster.png +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/media/pipedrive.png +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/media/quickbook_ingestion.png +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/media/sftp.png +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/media/stripe_postgres.png +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/media/tiktok.png +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/media/zoom_ingestion.png +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/adjust.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/airtable.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/applovin.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/applovin_max.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/appsflyer.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/appstore.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/asana.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/athena.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/attio.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/bigquery.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/chess.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/clickhouse.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/cratedb.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/csv.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/custom_queries.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/databricks.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/db2.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/duckdb.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/dynamodb.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/elasticsearch.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/facebook-ads.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/frankfurter.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/freshdesk.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/gcs.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/github.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/google-ads.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/google_analytics.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/gorgias.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/gsheets.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/hubspot.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/isoc-pulse.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/kafka.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/kinesis.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/klaviyo.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/linear.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/linkedin_ads.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/mixpanel.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/mongodb.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/mssql.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/mysql.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/notion.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/oracle.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/personio.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/phantombuster.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/pinterest.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/pipedrive.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/postgres.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/quickbooks.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/redshift.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/s3.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/salesforce.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/sap-hana.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/sftp.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/shopify.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/slack.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/smartsheets.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/snowflake.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/solidgate.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/spanner.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/sqlite.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/stripe.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/tiktok-ads.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/trustpilot.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/zendesk.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/supported-sources/zoom.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/tutorials/load-kinesis-bigquery.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/tutorials/load-personio-duckdb.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/docs/tutorials/load-stripe-postgres.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/.gitignore +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/adjust/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/adjust/adjust_helpers.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/airtable/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/applovin/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/appsflyer/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/appsflyer/client.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/appstore/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/appstore/client.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/appstore/errors.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/appstore/models.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/appstore/resources.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/arrow/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/asana_source/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/asana_source/helpers.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/asana_source/settings.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/attio/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/attio/helpers.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/blob.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/chess/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/chess/helpers.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/chess/settings.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/collector/spinner.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/dynamodb/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/elasticsearch/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/errors.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/facebook_ads/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/facebook_ads/exceptions.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/facebook_ads/helpers.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/facebook_ads/settings.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/facebook_ads/utils.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/factory.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/filesystem/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/filesystem/helpers.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/filesystem/readers.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/filters.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/frankfurter/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/frankfurter/helpers.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/freshdesk/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/freshdesk/freshdesk_client.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/freshdesk/settings.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/github/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/github/helpers.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/github/queries.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/github/settings.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/google_ads/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/google_ads/field.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/google_ads/metrics.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/google_ads/predicates.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/google_ads/reports.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/google_analytics/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/google_analytics/helpers.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/google_sheets/README.md +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/google_sheets/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/gorgias/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/gorgias/helpers.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/http_client.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/hubspot/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/hubspot/helpers.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/hubspot/settings.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/isoc_pulse/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/kafka/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/kafka/helpers.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/kinesis/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/kinesis/helpers.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/klaviyo/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/klaviyo/client.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/klaviyo/helpers.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/linkedin_ads/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/linkedin_ads/helpers.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/loader.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/mixpanel/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/mixpanel/client.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/mongodb/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/mongodb/helpers.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/notion/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/notion/helpers/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/notion/helpers/client.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/notion/helpers/database.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/notion/settings.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/partition.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/personio/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/personio/helpers.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/phantombuster/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/phantombuster/client.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/pinterest/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/pipedrive/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/pipedrive/helpers/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/pipedrive/helpers/custom_fields_munger.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/pipedrive/helpers/pages.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/pipedrive/settings.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/pipedrive/typing.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/quickbooks/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/resource.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/salesforce/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/salesforce/helpers.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/shopify/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/shopify/exceptions.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/shopify/helpers.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/shopify/settings.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/slack/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/slack/helpers.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/slack/settings.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/smartsheets/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/sql_database/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/sql_database/callbacks.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/stripe_analytics/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/stripe_analytics/settings.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/table_definition.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/telemetry/event.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/testdata/fakebqcredentials.json +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/tiktok_ads/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/time.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/trustpilot/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/trustpilot/client.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/version.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/zendesk/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/zendesk/helpers/__init__.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/zendesk/helpers/credentials.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/src/zendesk/settings.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/testdata/.gitignore +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/testdata/create_replace.csv +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/testdata/delete_insert_expected.csv +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/testdata/delete_insert_part1.csv +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/testdata/delete_insert_part2.csv +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/testdata/merge_expected.csv +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/testdata/merge_part1.csv +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/testdata/merge_part2.csv +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/ingestr/tests/unit/test_smartsheets.py +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/package-lock.json +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/package.json +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/pyproject.toml +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/requirements-dev.txt +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/resources/demo.gif +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/resources/demo.tape +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/resources/ingestr.svg +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/styles/Google/AMPM.yml +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/styles/Google/Acronyms.yml +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/styles/Google/Colons.yml +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/styles/Google/Contractions.yml +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/styles/Google/DateFormat.yml +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/styles/Google/Ellipses.yml +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/styles/Google/EmDash.yml +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/styles/Google/Exclamation.yml +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/styles/Google/FirstPerson.yml +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/styles/Google/Gender.yml +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/styles/Google/GenderBias.yml +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/styles/Google/HeadingPunctuation.yml +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/styles/Google/Headings.yml +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/styles/Google/Latin.yml +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/styles/Google/LyHyphens.yml +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/styles/Google/OptionalPlurals.yml +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/styles/Google/Ordinal.yml +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/styles/Google/OxfordComma.yml +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/styles/Google/Parens.yml +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/styles/Google/Passive.yml +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/styles/Google/Periods.yml +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/styles/Google/Quotes.yml +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/styles/Google/Ranges.yml +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/styles/Google/Semicolons.yml +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/styles/Google/Slang.yml +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/styles/Google/Spacing.yml +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/styles/Google/Spelling.yml +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/styles/Google/Units.yml +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/styles/Google/We.yml +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/styles/Google/Will.yml +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/styles/Google/WordList.yml +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/styles/Google/meta.json +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/styles/Google/vocab.txt +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/styles/bruin/Ingestr.yml +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/styles/config/vocabularies/bruin/accept.txt +0 -0
- {ingestr-0.13.67 → ingestr-0.13.69}/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.69
|
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
|
@@ -48,7 +48,7 @@ Requires-Dist: dataclasses-json==0.6.7
|
|
48
48
|
Requires-Dist: decorator==5.2.1
|
49
49
|
Requires-Dist: deprecation==2.1.0
|
50
50
|
Requires-Dist: dlt-cratedb==0.0.1
|
51
|
-
Requires-Dist: dlt==1.
|
51
|
+
Requires-Dist: dlt==1.11.0
|
52
52
|
Requires-Dist: dnspython==2.7.0
|
53
53
|
Requires-Dist: duckdb-engine==0.17.0
|
54
54
|
Requires-Dist: duckdb==1.2.1
|
@@ -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=["
|
259
|
+
envvar=["INGESTR_COLUMNS"],
|
260
260
|
),
|
261
261
|
] = None, # type: ignore
|
262
262
|
yield_limit: Annotated[
|
@@ -455,7 +455,7 @@ def ingest(
|
|
455
455
|
|
456
456
|
column_hints[key]["primary_key"] = True
|
457
457
|
|
458
|
-
pipeline = dlt.pipeline(
|
458
|
+
pipeline = dlt.pipeline( # type: ignore
|
459
459
|
pipeline_name=m.hexdigest(),
|
460
460
|
destination=dlt_dest,
|
461
461
|
progress=progressInstance,
|
@@ -0,0 +1 @@
|
|
1
|
+
version = "v0.13.69"
|
@@ -90,7 +90,7 @@ class BigQueryDestination:
|
|
90
90
|
|
91
91
|
return dlt.destinations.bigquery(
|
92
92
|
credentials=credentials, # type: ignore
|
93
|
-
location=location,
|
93
|
+
location=location, # type: ignore
|
94
94
|
project_id=project_id,
|
95
95
|
**kwargs,
|
96
96
|
)
|
@@ -398,7 +398,7 @@ class AthenaDestination:
|
|
398
398
|
|
399
399
|
return dlt.destinations.athena(
|
400
400
|
query_result_bucket=query_result_path,
|
401
|
-
athena_work_group=source_params.get("workgroup", [None])[0],
|
401
|
+
athena_work_group=source_params.get("workgroup", [None])[0], # type: ignore
|
402
402
|
credentials=AwsCredentials(
|
403
403
|
aws_access_key_id=access_key_id, # type: ignore
|
404
404
|
aws_secret_access_key=secret_access_key, # type: ignore
|
@@ -3,7 +3,7 @@ from typing import Any, Dict, Iterable, Iterator
|
|
3
3
|
import dlt
|
4
4
|
import pendulum
|
5
5
|
|
6
|
-
from .helpers import
|
6
|
+
from .helpers import _normalize_issue, _normalize_team, _paginate
|
7
7
|
|
8
8
|
ISSUES_QUERY = """
|
9
9
|
query Issues($cursor: String) {
|
@@ -143,13 +143,15 @@ def linear_source(
|
|
143
143
|
yield item
|
144
144
|
|
145
145
|
@dlt.resource(name="teams", primary_key="id", write_disposition="merge")
|
146
|
-
def teams(
|
146
|
+
def teams(
|
147
|
+
updated_at: dlt.sources.incremental[str] = dlt.sources.incremental(
|
147
148
|
"updatedAt",
|
148
149
|
initial_value=start_date.isoformat(),
|
149
150
|
end_value=end_date.isoformat() if end_date else None,
|
150
151
|
range_start="closed",
|
151
152
|
range_end="closed",
|
152
|
-
),
|
153
|
+
),
|
154
|
+
) -> Iterator[Dict[str, Any]]:
|
153
155
|
print(start_date)
|
154
156
|
if updated_at.last_value:
|
155
157
|
current_start_date = pendulum.parse(updated_at.last_value)
|
@@ -1,10 +1,10 @@
|
|
1
|
-
import json
|
2
1
|
from typing import Any, Dict, Iterator, Optional
|
3
2
|
|
4
3
|
import requests
|
5
4
|
|
6
5
|
LINEAR_GRAPHQL_ENDPOINT = "https://api.linear.app/graphql"
|
7
6
|
|
7
|
+
|
8
8
|
def _graphql(
|
9
9
|
api_key: str, query: str, variables: Optional[Dict[str, Any]] = None
|
10
10
|
) -> Dict[str, Any]:
|
@@ -20,6 +20,7 @@ def _graphql(
|
|
20
20
|
raise ValueError(str(payload["errors"]))
|
21
21
|
return payload["data"]
|
22
22
|
|
23
|
+
|
23
24
|
def _paginate(api_key: str, query: str, root: str) -> Iterator[Dict[str, Any]]:
|
24
25
|
cursor: Optional[str] = None
|
25
26
|
while True:
|
@@ -30,6 +31,7 @@ def _paginate(api_key: str, query: str, root: str) -> Iterator[Dict[str, Any]]:
|
|
30
31
|
break
|
31
32
|
cursor = data["pageInfo"]["endCursor"]
|
32
33
|
|
34
|
+
|
33
35
|
def _normalize_issue(item: Dict[str, Any]) -> Dict[str, Any]:
|
34
36
|
field_mapping = {
|
35
37
|
"assignee": "assignee_id",
|
@@ -45,16 +47,26 @@ def _normalize_issue(item: Dict[str, Any]) -> Dict[str, Any]:
|
|
45
47
|
else:
|
46
48
|
item[value] = None
|
47
49
|
del item[key]
|
48
|
-
json_fields = [
|
50
|
+
json_fields = [
|
51
|
+
"comments",
|
52
|
+
"subscribers",
|
53
|
+
"attachments",
|
54
|
+
"labels",
|
55
|
+
"subtasks",
|
56
|
+
"projects",
|
57
|
+
"memberships",
|
58
|
+
"members",
|
59
|
+
]
|
49
60
|
for field in json_fields:
|
50
61
|
if item.get(field):
|
51
62
|
item[f"{field}"] = item[field].get("nodes", [])
|
52
|
-
|
63
|
+
|
53
64
|
return item
|
54
65
|
|
66
|
+
|
55
67
|
def _normalize_team(item: Dict[str, Any]) -> Dict[str, Any]:
|
56
68
|
json_fields = ["memberships", "members", "projects"]
|
57
69
|
for field in json_fields:
|
58
70
|
if item.get(field):
|
59
71
|
item[f"{field}"] = item[field].get("nodes", [])
|
60
|
-
return item
|
72
|
+
return item
|
@@ -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
|
-
|
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
|
-
|
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
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
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
|
-
|
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
|
@@ -76,6 +76,27 @@ class SqlSource:
|
|
76
76
|
if uri.startswith("mysql://"):
|
77
77
|
uri = uri.replace("mysql://", "mysql+pymysql://")
|
78
78
|
|
79
|
+
# Process Snowflake private key authentication
|
80
|
+
if uri.startswith("snowflake://"):
|
81
|
+
parsed_uri = urlparse(uri)
|
82
|
+
query_params = parse_qs(parsed_uri.query)
|
83
|
+
|
84
|
+
if "private_key" in query_params:
|
85
|
+
from dlt.common.libs.cryptography import decode_private_key
|
86
|
+
|
87
|
+
private_key = query_params["private_key"][0]
|
88
|
+
passphrase = query_params.get("private_key_passphrase", [None])[0]
|
89
|
+
decoded_key = decode_private_key(private_key, passphrase)
|
90
|
+
|
91
|
+
query_params["private_key"] = [base64.b64encode(decoded_key).decode()]
|
92
|
+
if "private_key_passphrase" in query_params:
|
93
|
+
del query_params["private_key_passphrase"]
|
94
|
+
|
95
|
+
# Rebuild URI
|
96
|
+
uri = parsed_uri._replace(
|
97
|
+
query=urlencode(query_params, doseq=True)
|
98
|
+
).geturl()
|
99
|
+
|
79
100
|
# clickhouse://<username>:<password>@<host>:<port>?secure=<secure>
|
80
101
|
if uri.startswith("clickhouse://"):
|
81
102
|
parsed_uri = urlparse(uri)
|
@@ -139,7 +160,6 @@ class SqlSource:
|
|
139
160
|
return engine.execution_options(read_only=True)
|
140
161
|
|
141
162
|
engine_adapter_callback = eng_callback
|
142
|
-
|
143
163
|
from dlt.common.libs.sql_alchemy import (
|
144
164
|
Engine,
|
145
165
|
MetaData,
|
@@ -42,14 +42,14 @@ def zoom_source(
|
|
42
42
|
end_dt = pendulum.now("UTC")
|
43
43
|
else:
|
44
44
|
end_dt = pendulum.parse(datetime.end_value)
|
45
|
-
|
45
|
+
|
46
46
|
base_params: Dict[str, Any] = {
|
47
47
|
"type": "scheduled",
|
48
48
|
"page_size": 300,
|
49
49
|
"from": start_dt.to_date_string(),
|
50
50
|
"to": end_dt.to_date_string(),
|
51
51
|
}
|
52
|
-
|
52
|
+
|
53
53
|
for user in client.get_users():
|
54
54
|
user_id = user["id"]
|
55
55
|
yield from client.get_meetings(user_id, base_params)
|
@@ -62,7 +62,7 @@ class ZoomClient:
|
|
62
62
|
break
|
63
63
|
params["next_page_token"] = token
|
64
64
|
|
65
|
-
#https://developers.zoom.us/docs/api/rest/reference/zoom-api/methods/#operation/meetings
|
65
|
+
# https://developers.zoom.us/docs/api/rest/reference/zoom-api/methods/#operation/meetings
|
66
66
|
def get_meetings(
|
67
67
|
self, user_id: str, params: Dict[str, Any]
|
68
68
|
) -> Iterator[Dict[str, Any]]:
|
@@ -1 +0,0 @@
|
|
1
|
-
version = "v0.13.67"
|