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