ingestr 0.13.31__tar.gz → 0.13.33__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.31 → ingestr-0.13.33}/.gitignore +2 -1
- ingestr-0.13.33/.gitleaksignore +3 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/PKG-INFO +1 -6
- {ingestr-0.13.31 → ingestr-0.13.33}/README.md +0 -5
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/athena.md +9 -1
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/bigquery.md +12 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/main.py +21 -51
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/adjust/adjust_helpers.py +1 -1
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/airtable/__init__.py +1 -1
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/applovin_max/__init__.py +0 -1
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/appsflyer/client.py +0 -1
- ingestr-0.13.33/ingestr/src/buildinfo.py +1 -0
- ingestr-0.13.33/ingestr/src/collector/spinner.py +43 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/destinations.py +51 -18
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/filters.py +2 -3
- ingestr-0.13.31/ingestr/src/klaviyo/_init_.py → ingestr-0.13.33/ingestr/src/klaviyo/__init__.py +0 -1
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/linkedin_ads/helpers.py +0 -1
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/partition.py +2 -1
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/sources.py +169 -90
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/telemetry/event.py +10 -9
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -1
- ingestr-0.13.31/.gitleaksignore +0 -3
- ingestr-0.13.31/ingestr/src/buildinfo.py +0 -1
- {ingestr-0.13.31 → ingestr-0.13.33}/.dockerignore +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/.githooks/pre-commit-hook.sh +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/.github/workflows/deploy-docs.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/.github/workflows/release.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/.github/workflows/secrets-scan.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/.github/workflows/tests.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/.python-version +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/.vale.ini +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/Dockerfile +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/LICENSE.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/Makefile +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/.vitepress/config.mjs +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/.vitepress/theme/custom.css +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/.vitepress/theme/index.js +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/commands/example-uris.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/commands/ingest.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/getting-started/core-concepts.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/getting-started/incremental-loading.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/getting-started/quickstart.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/getting-started/telemetry.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/index.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/media/applovin_max.png +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/media/athena.png +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/media/clickhouse_img.png +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/media/github.png +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/media/googleanalytics.png +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/media/kinesis.bigquery.png +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/media/linkedin_ads.png +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/media/personio.png +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/media/personio_duckdb.png +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/media/pipedrive.png +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/media/stripe_postgres.png +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/media/tiktok.png +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/adjust.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/airtable.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/applovin.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/applovin_max.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/appsflyer.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/appstore.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/asana.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/chess.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/clickhouse.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/csv.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/custom_queries.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/databricks.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/db2.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/duckdb.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/dynamodb.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/facebook-ads.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/frankfurter.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/gcs.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/github.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/google-ads.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/google_analytics.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/gorgias.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/gsheets.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/hubspot.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/kafka.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/kinesis.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/klaviyo.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/linkedin_ads.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/mongodb.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/mssql.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/mysql.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/notion.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/oracle.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/personio.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/pipedrive.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/postgres.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/redshift.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/s3.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/salesforce.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/sap-hana.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/shopify.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/slack.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/snowflake.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/sqlite.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/stripe.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/tiktok-ads.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/supported-sources/zendesk.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/tutorials/load-kinesis-bigquery.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/tutorials/load-personio-duckdb.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/docs/tutorials/load-stripe-postgres.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/conftest.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/.gitignore +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/adjust/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/applovin/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/appsflyer/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/appstore/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/appstore/client.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/appstore/errors.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/appstore/models.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/appstore/resources.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/arrow/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/asana_source/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/asana_source/helpers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/asana_source/settings.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/blob.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/chess/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/chess/helpers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/chess/settings.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/dynamodb/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/errors.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/facebook_ads/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/facebook_ads/exceptions.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/facebook_ads/helpers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/facebook_ads/settings.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/factory.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/filesystem/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/filesystem/helpers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/filesystem/readers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/frankfurter/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/frankfurter/helpers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/github/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/github/helpers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/github/queries.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/github/settings.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/google_ads/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/google_ads/field.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/google_ads/metrics.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/google_ads/predicates.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/google_ads/reports.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/google_analytics/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/google_analytics/helpers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/google_sheets/README.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/google_sheets/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/gorgias/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/gorgias/helpers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/hubspot/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/hubspot/helpers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/hubspot/settings.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/kafka/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/kafka/helpers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/kinesis/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/kinesis/helpers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/klaviyo/client.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/klaviyo/helpers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/linkedin_ads/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/loader.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/mongodb/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/mongodb/helpers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/notion/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/notion/helpers/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/notion/helpers/client.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/notion/helpers/database.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/notion/settings.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/personio/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/personio/helpers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/pipedrive/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/pipedrive/helpers/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/pipedrive/helpers/custom_fields_munger.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/pipedrive/helpers/pages.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/pipedrive/settings.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/pipedrive/typing.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/resource.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/salesforce/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/salesforce/helpers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/shopify/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/shopify/exceptions.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/shopify/helpers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/shopify/settings.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/slack/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/slack/helpers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/slack/settings.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/sql_database/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/sql_database/callbacks.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/stripe_analytics/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/stripe_analytics/helpers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/stripe_analytics/settings.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/table_definition.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/testdata/fakebqcredentials.json +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/tiktok_ads/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/time.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/version.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/zendesk/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/zendesk/helpers/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/zendesk/helpers/credentials.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/src/zendesk/settings.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/testdata/.gitignore +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/testdata/create_replace.csv +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/testdata/delete_insert_expected.csv +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/testdata/delete_insert_part1.csv +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/testdata/delete_insert_part2.csv +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/testdata/merge_expected.csv +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/testdata/merge_part1.csv +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/ingestr/testdata/merge_part2.csv +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/package-lock.json +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/package.json +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/pyproject.toml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/requirements-dev.txt +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/requirements.in +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/requirements.txt +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/requirements_arm64.txt +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/resources/demo.gif +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/resources/demo.tape +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/resources/ingestr.svg +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/AMPM.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Acronyms.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Colons.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Contractions.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/DateFormat.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Ellipses.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/EmDash.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Exclamation.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/FirstPerson.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Gender.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/GenderBias.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/HeadingPunctuation.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Headings.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Latin.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/LyHyphens.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/OptionalPlurals.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Ordinal.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/OxfordComma.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Parens.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Passive.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Periods.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Quotes.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Ranges.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Semicolons.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Slang.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Spacing.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Spelling.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Units.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/We.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/Will.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/WordList.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/meta.json +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/styles/Google/vocab.txt +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/styles/bruin/Ingestr.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/styles/config/vocabularies/bruin/accept.txt +0 -0
- {ingestr-0.13.31 → ingestr-0.13.33}/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.33
|
|
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
|
|
@@ -419,11 +419,6 @@ Pull requests are welcome. However, please open an issue first to discuss what y
|
|
|
419
419
|
<td>Google Analytics</td>
|
|
420
420
|
<td>✅</td>
|
|
421
421
|
<td>-</td>
|
|
422
|
-
</tr>
|
|
423
|
-
<tr>
|
|
424
|
-
<td>Intercom</td>
|
|
425
|
-
<td>✅</td>
|
|
426
|
-
<td>-</td>
|
|
427
422
|
</tr>
|
|
428
423
|
<tr>
|
|
429
424
|
<td>Klaviyo</td>
|
|
@@ -222,11 +222,6 @@ Pull requests are welcome. However, please open an issue first to discuss what y
|
|
|
222
222
|
<td>Google Analytics</td>
|
|
223
223
|
<td>✅</td>
|
|
224
224
|
<td>-</td>
|
|
225
|
-
</tr>
|
|
226
|
-
<tr>
|
|
227
|
-
<td>Intercom</td>
|
|
228
|
-
<td>✅</td>
|
|
229
|
-
<td>-</td>
|
|
230
225
|
</tr>
|
|
231
226
|
<tr>
|
|
232
227
|
<td>Klaviyo</td>
|
|
@@ -18,9 +18,17 @@ athena://?bucket=<your-destination-bucket> \
|
|
|
18
18
|
URI parameters:
|
|
19
19
|
- `bucket` (required): The name of the bucket where the data will be stored, containing the Parquet files that Athena will work with, e.g. `your_bucket_name` or `s3://your_bucket_name`.
|
|
20
20
|
- `access_key_id` and `secret_access_key` (required): These are AWS credentials that will be used to authenticate with AWS services like S3 and Athena.
|
|
21
|
-
- `
|
|
21
|
+
- `session_token` (optional): The session token for temporary credentials.
|
|
22
|
+
- `region_name` (required if there's no local profile found): The AWS region of the Athena service and S3 buckets, e.g. `eu-central-1`
|
|
22
23
|
- `query_results_path` (optional): The query location path where the results of Athena queries will be saved, e.g. `dest_path` or `s3://dest_path`. If not provided, it will default to the bucket specified in the `bucket` parameter.
|
|
23
24
|
- `workgroup` (optional): The name of the Athena workgroup, e.g. `my_group`
|
|
25
|
+
- `profile` (optional): The name of the AWS profile to use, e.g. `my_profile`
|
|
26
|
+
|
|
27
|
+
You have two ways of providing credentials:
|
|
28
|
+
1. Provide `access_key_id` and `secret_access_key` directly in the URI.
|
|
29
|
+
2. Provide the name of the AWS profile to use in the `profile` parameter.
|
|
30
|
+
|
|
31
|
+
If there's no access key and secret key provided, ingestr will try to find the credentials in the local AWS credentials file.
|
|
24
32
|
|
|
25
33
|
## Setting up an Athena Integration
|
|
26
34
|
Athena requires a `bucket`, `access_key_id`, `secret_access_key` and `region_name` to access the S3 bucket. Please follow the guide on dltHub to obtain [credentials](https://dlthub.com/docs/dlt-ecosystem/destinations/athena#2-setup-bucket-storage-and-athena-credentials). Once you've completed the guide, you should have all the above-mentioned credentials.
|
|
@@ -17,4 +17,16 @@ URI parameters:
|
|
|
17
17
|
|
|
18
18
|
The same URI structure can be used both for sources and destinations. You can read more about SQLAlchemy's BigQuery dialect [here](https://github.com/googleapis/python-bigquery-sqlalchemy?tab=readme-ov-file#connection-string-parameters).
|
|
19
19
|
|
|
20
|
+
### Using GCS as a staging area
|
|
21
|
+
|
|
22
|
+
ingestr can use GCS as a staging area for BigQuery. To do this, you need to set the `--staging-bucket` flag when you are running the command.
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
ingestr ingest
|
|
26
|
+
--source-uri $SOURCE_URI
|
|
27
|
+
--dest-uri $BIGQUERY_URI
|
|
28
|
+
--source-table raw.input
|
|
29
|
+
--dest-table raw.output
|
|
30
|
+
--staging-bucket "gs://your-bucket-name" # [!code focus]
|
|
31
|
+
```
|
|
20
32
|
|
|
@@ -3,15 +3,9 @@ from enum import Enum
|
|
|
3
3
|
from typing import Optional
|
|
4
4
|
|
|
5
5
|
import typer
|
|
6
|
-
from dlt.common.runtime.collector import Collector
|
|
7
6
|
from rich.console import Console
|
|
8
|
-
from rich.status import Status
|
|
9
7
|
from typing_extensions import Annotated
|
|
10
8
|
|
|
11
|
-
import ingestr.src.partition as partition
|
|
12
|
-
import ingestr.src.resource as resource
|
|
13
|
-
from ingestr.src.destinations import AthenaDestination
|
|
14
|
-
from ingestr.src.filters import cast_set_to_list, handle_mysql_empty_dates
|
|
15
9
|
from ingestr.src.telemetry.event import track
|
|
16
10
|
|
|
17
11
|
app = typer.Typer(
|
|
@@ -46,45 +40,6 @@ PARQUET_SUPPORTED_DESTINATIONS = [
|
|
|
46
40
|
JSON_RETURNING_SOURCES = ["notion"]
|
|
47
41
|
|
|
48
42
|
|
|
49
|
-
class SpinnerCollector(Collector):
|
|
50
|
-
status: Status
|
|
51
|
-
current_step: str
|
|
52
|
-
started: bool
|
|
53
|
-
|
|
54
|
-
def __init__(self) -> None:
|
|
55
|
-
self.status = Status("Ingesting data...", spinner="dots")
|
|
56
|
-
self.started = False
|
|
57
|
-
|
|
58
|
-
def update(
|
|
59
|
-
self,
|
|
60
|
-
name: str,
|
|
61
|
-
inc: int = 1,
|
|
62
|
-
total: Optional[int] = None,
|
|
63
|
-
message: Optional[str] = None, # type: ignore
|
|
64
|
-
label: str = "",
|
|
65
|
-
**kwargs,
|
|
66
|
-
) -> None:
|
|
67
|
-
self.status.update(self.current_step)
|
|
68
|
-
|
|
69
|
-
def _start(self, step: str) -> None:
|
|
70
|
-
self.current_step = self.__step_to_label(step)
|
|
71
|
-
self.status.start()
|
|
72
|
-
|
|
73
|
-
def __step_to_label(self, step: str) -> str:
|
|
74
|
-
verb = step.split(" ")[0].lower()
|
|
75
|
-
if verb.startswith("normalize"):
|
|
76
|
-
return "Normalizing the data"
|
|
77
|
-
elif verb.startswith("load"):
|
|
78
|
-
return "Loading the data to the destination"
|
|
79
|
-
elif verb.startswith("extract"):
|
|
80
|
-
return "Extracting the data from the source"
|
|
81
|
-
|
|
82
|
-
return f"{verb.capitalize()} the data"
|
|
83
|
-
|
|
84
|
-
def _stop(self) -> None:
|
|
85
|
-
self.status.stop()
|
|
86
|
-
|
|
87
|
-
|
|
88
43
|
class IncrementalStrategy(str, Enum):
|
|
89
44
|
create_replace = "replace"
|
|
90
45
|
append = "append"
|
|
@@ -309,6 +264,13 @@ def ingest(
|
|
|
309
264
|
envvar=["YIELD_LIMIT", "INGESTR_YIELD_LIMIT"],
|
|
310
265
|
),
|
|
311
266
|
] = None, # type: ignore
|
|
267
|
+
staging_bucket: Annotated[
|
|
268
|
+
Optional[str],
|
|
269
|
+
typer.Option(
|
|
270
|
+
help="The staging bucket to be used for the ingestion, must be prefixed with 'gs://' or 's3://'",
|
|
271
|
+
envvar=["STAGING_BUCKET", "INGESTR_STAGING_BUCKET"],
|
|
272
|
+
),
|
|
273
|
+
] = None, # type: ignore
|
|
312
274
|
):
|
|
313
275
|
import hashlib
|
|
314
276
|
import tempfile
|
|
@@ -317,14 +279,16 @@ def ingest(
|
|
|
317
279
|
import dlt
|
|
318
280
|
import humanize
|
|
319
281
|
import typer
|
|
320
|
-
from dlt.common.data_types import TDataType
|
|
321
|
-
from dlt.common.destination import Destination
|
|
322
282
|
from dlt.common.pipeline import LoadInfo
|
|
323
283
|
from dlt.common.runtime.collector import Collector, LogCollector
|
|
324
284
|
from dlt.common.schema.typing import TColumnSchema
|
|
325
285
|
|
|
286
|
+
import ingestr.src.partition as partition
|
|
287
|
+
import ingestr.src.resource as resource
|
|
288
|
+
from ingestr.src.collector.spinner import SpinnerCollector
|
|
289
|
+
from ingestr.src.destinations import AthenaDestination
|
|
326
290
|
from ingestr.src.factory import SourceDestinationFactory
|
|
327
|
-
from ingestr.src.
|
|
291
|
+
from ingestr.src.filters import cast_set_to_list, handle_mysql_empty_dates
|
|
328
292
|
|
|
329
293
|
def report_errors(run_info: LoadInfo):
|
|
330
294
|
for load_package in run_info.load_packages:
|
|
@@ -359,7 +323,7 @@ def ingest(
|
|
|
359
323
|
return (source_table, dest_table)
|
|
360
324
|
|
|
361
325
|
def validate_loader_file_format(
|
|
362
|
-
dlt_dest
|
|
326
|
+
dlt_dest, loader_file_format: Optional[LoaderFileFormat]
|
|
363
327
|
):
|
|
364
328
|
if (
|
|
365
329
|
loader_file_format
|
|
@@ -371,9 +335,11 @@ def ingest(
|
|
|
371
335
|
)
|
|
372
336
|
raise typer.Abort()
|
|
373
337
|
|
|
374
|
-
def parse_columns(columns: list[str]) -> dict
|
|
338
|
+
def parse_columns(columns: list[str]) -> dict:
|
|
375
339
|
from typing import cast, get_args
|
|
376
340
|
|
|
341
|
+
from dlt.common.data_types import TDataType
|
|
342
|
+
|
|
377
343
|
possible_types = get_args(TDataType)
|
|
378
344
|
|
|
379
345
|
types: dict[str, TDataType] = {}
|
|
@@ -406,6 +372,7 @@ def ingest(
|
|
|
406
372
|
dlt.config["data_writer.file_max_items"] = loader_file_size
|
|
407
373
|
dlt.config["extract.workers"] = extract_parallelism
|
|
408
374
|
dlt.config["extract.max_parallel_items"] = extract_parallelism
|
|
375
|
+
dlt.config["load.raise_on_max_retries"] = 15
|
|
409
376
|
if schema_naming != SchemaNaming.default:
|
|
410
377
|
dlt.config["schema.naming"] = schema_naming.value
|
|
411
378
|
|
|
@@ -457,7 +424,9 @@ def ingest(
|
|
|
457
424
|
pipelines_dir = tempfile.mkdtemp()
|
|
458
425
|
is_pipelines_dir_temp = True
|
|
459
426
|
|
|
460
|
-
dlt_dest = destination.dlt_dest(
|
|
427
|
+
dlt_dest = destination.dlt_dest(
|
|
428
|
+
uri=dest_uri, dest_table=dest_table, staging_bucket=staging_bucket
|
|
429
|
+
)
|
|
461
430
|
validate_loader_file_format(dlt_dest, loader_file_format)
|
|
462
431
|
|
|
463
432
|
if partition_by:
|
|
@@ -606,6 +575,7 @@ def ingest(
|
|
|
606
575
|
**destination.dlt_run_params(
|
|
607
576
|
uri=dest_uri,
|
|
608
577
|
table=dest_table,
|
|
578
|
+
staging_bucket=staging_bucket,
|
|
609
579
|
),
|
|
610
580
|
write_disposition=write_disposition, # type: ignore
|
|
611
581
|
primary_key=(primary_key if primary_key and len(primary_key) > 0 else None), # type: ignore
|
|
@@ -36,7 +36,7 @@ class AdjustAPI:
|
|
|
36
36
|
def __init__(self, api_key):
|
|
37
37
|
self.api_key = api_key
|
|
38
38
|
self.request_client = Client(
|
|
39
|
-
request_timeout=
|
|
39
|
+
request_timeout=1000, # Adjust support recommends 1000 seconds of read timeout.
|
|
40
40
|
raise_for_status=False,
|
|
41
41
|
retry_condition=retry_on_limit,
|
|
42
42
|
request_max_attempts=12,
|
|
@@ -55,7 +55,7 @@ def airtable_resource(
|
|
|
55
55
|
field for field in table["fields"] if field["id"] == primary_key_id
|
|
56
56
|
][0]
|
|
57
57
|
table_name: str = table["name"]
|
|
58
|
-
primary_key: List[str] = [primary_key_field[
|
|
58
|
+
primary_key: List[str] = [f"fields__{primary_key_field['name']}"]
|
|
59
59
|
air_table = api.table(base_id, table["id"])
|
|
60
60
|
|
|
61
61
|
# Table.iterate() supports rich customization options, such as chunk size, fields, cell format, timezone, locale, and view
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
version = "v0.13.33"
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
|
|
3
|
+
from dlt.common.runtime.collector import Collector
|
|
4
|
+
from rich.status import Status
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class SpinnerCollector(Collector):
|
|
8
|
+
status: Status
|
|
9
|
+
current_step: str
|
|
10
|
+
started: bool
|
|
11
|
+
|
|
12
|
+
def __init__(self) -> None:
|
|
13
|
+
self.status = Status("Ingesting data...", spinner="dots")
|
|
14
|
+
self.started = False
|
|
15
|
+
|
|
16
|
+
def update(
|
|
17
|
+
self,
|
|
18
|
+
name: str,
|
|
19
|
+
inc: int = 1,
|
|
20
|
+
total: Optional[int] = None,
|
|
21
|
+
message: Optional[str] = None, # type: ignore
|
|
22
|
+
label: str = "",
|
|
23
|
+
**kwargs,
|
|
24
|
+
) -> None:
|
|
25
|
+
self.status.update(self.current_step)
|
|
26
|
+
|
|
27
|
+
def _start(self, step: str) -> None:
|
|
28
|
+
self.current_step = self.__step_to_label(step)
|
|
29
|
+
self.status.start()
|
|
30
|
+
|
|
31
|
+
def __step_to_label(self, step: str) -> str:
|
|
32
|
+
verb = step.split(" ")[0].lower()
|
|
33
|
+
if verb.startswith("normalize"):
|
|
34
|
+
return "Normalizing the data"
|
|
35
|
+
elif verb.startswith("load"):
|
|
36
|
+
return "Loading the data to the destination"
|
|
37
|
+
elif verb.startswith("extract"):
|
|
38
|
+
return "Extracting the data from the source"
|
|
39
|
+
|
|
40
|
+
return f"{verb.capitalize()} the data"
|
|
41
|
+
|
|
42
|
+
def _stop(self) -> None:
|
|
43
|
+
self.status.stop()
|
|
@@ -60,6 +60,22 @@ class BigQueryDestination:
|
|
|
60
60
|
base64.b64decode(credentials_base64[0]).decode("utf-8")
|
|
61
61
|
)
|
|
62
62
|
|
|
63
|
+
staging_bucket = kwargs.get("staging_bucket", None)
|
|
64
|
+
if staging_bucket:
|
|
65
|
+
if not staging_bucket.startswith("gs://"):
|
|
66
|
+
raise ValueError("Staging bucket must start with gs://")
|
|
67
|
+
|
|
68
|
+
os.environ["DESTINATION__FILESYSTEM__BUCKET_URL"] = staging_bucket
|
|
69
|
+
os.environ["DESTINATION__FILESYSTEM__CREDENTIALS__PROJECT_ID"] = (
|
|
70
|
+
credentials.get("project_id", None)
|
|
71
|
+
)
|
|
72
|
+
os.environ["DESTINATION__FILESYSTEM__CREDENTIALS__PRIVATE_KEY"] = (
|
|
73
|
+
credentials.get("private_key", None)
|
|
74
|
+
)
|
|
75
|
+
os.environ["DESTINATION__FILESYSTEM__CREDENTIALS__CLIENT_EMAIL"] = (
|
|
76
|
+
credentials.get("client_email", None)
|
|
77
|
+
)
|
|
78
|
+
|
|
63
79
|
project_id = None
|
|
64
80
|
if source_fields.hostname:
|
|
65
81
|
project_id = source_fields.hostname
|
|
@@ -83,6 +99,10 @@ class BigQueryDestination:
|
|
|
83
99
|
"table_name": table_fields[-1],
|
|
84
100
|
}
|
|
85
101
|
|
|
102
|
+
staging_bucket = kwargs.get("staging_bucket", None)
|
|
103
|
+
if staging_bucket:
|
|
104
|
+
res["staging"] = "filesystem"
|
|
105
|
+
|
|
86
106
|
return res
|
|
87
107
|
|
|
88
108
|
def post_load(self):
|
|
@@ -223,34 +243,47 @@ class AthenaDestination:
|
|
|
223
243
|
query_result_path = bucket
|
|
224
244
|
|
|
225
245
|
access_key_id = source_params.get("access_key_id", [None])[0]
|
|
226
|
-
if not access_key_id:
|
|
227
|
-
raise ValueError("The AWS access_key_id is required to connect to Athena.")
|
|
228
|
-
|
|
229
246
|
secret_access_key = source_params.get("secret_access_key", [None])[0]
|
|
230
|
-
|
|
231
|
-
|
|
247
|
+
session_token = source_params.get("session_token", [None])[0]
|
|
248
|
+
profile_name = source_params.get("profile", ["default"])[0]
|
|
249
|
+
region_name = source_params.get("region_name", [None])[0]
|
|
232
250
|
|
|
233
|
-
|
|
251
|
+
if not access_key_id and not secret_access_key:
|
|
252
|
+
import botocore.session # type: ignore
|
|
253
|
+
|
|
254
|
+
session = botocore.session.Session(profile=profile_name)
|
|
255
|
+
default = session.get_credentials()
|
|
256
|
+
if not profile_name:
|
|
257
|
+
raise ValueError(
|
|
258
|
+
"You have to either provide access_key_id and secret_access_key pair or a valid AWS profile name."
|
|
259
|
+
)
|
|
260
|
+
access_key_id = default.access_key
|
|
261
|
+
secret_access_key = default.secret_key
|
|
262
|
+
session_token = default.token
|
|
263
|
+
if region_name is None:
|
|
264
|
+
region_name = session.get_config_variable("region")
|
|
234
265
|
|
|
235
|
-
region_name = source_params.get("region_name", [None])[0]
|
|
236
266
|
if not region_name:
|
|
237
267
|
raise ValueError("The region_name is required to connect to Athena.")
|
|
238
268
|
|
|
239
269
|
os.environ["DESTINATION__BUCKET_URL"] = bucket
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
270
|
+
if access_key_id and secret_access_key:
|
|
271
|
+
os.environ["DESTINATION__CREDENTIALS__AWS_ACCESS_KEY_ID"] = access_key_id
|
|
272
|
+
os.environ["DESTINATION__CREDENTIALS__AWS_SECRET_ACCESS_KEY"] = (
|
|
273
|
+
secret_access_key
|
|
274
|
+
)
|
|
275
|
+
if session_token:
|
|
276
|
+
os.environ["DESTINATION__CREDENTIALS__AWS_SESSION_TOKEN"] = session_token
|
|
244
277
|
|
|
245
|
-
credentials = AwsCredentials(
|
|
246
|
-
aws_access_key_id=access_key_id,
|
|
247
|
-
aws_secret_access_key=secret_access_key,
|
|
248
|
-
region_name=region_name,
|
|
249
|
-
)
|
|
250
278
|
return dlt.destinations.athena(
|
|
251
279
|
query_result_bucket=query_result_path,
|
|
252
|
-
athena_work_group=
|
|
253
|
-
credentials=
|
|
280
|
+
athena_work_group=source_params.get("workgroup", [None])[0],
|
|
281
|
+
credentials=AwsCredentials(
|
|
282
|
+
aws_access_key_id=access_key_id, # type: ignore
|
|
283
|
+
aws_secret_access_key=secret_access_key, # type: ignore
|
|
284
|
+
aws_session_token=session_token,
|
|
285
|
+
region_name=region_name,
|
|
286
|
+
),
|
|
254
287
|
destination_name=bucket,
|
|
255
288
|
)
|
|
256
289
|
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
from dlt.common.libs.sql_alchemy import Table
|
|
2
|
-
|
|
3
|
-
|
|
4
1
|
def cast_set_to_list(row):
|
|
5
2
|
# this handles just the sqlalchemy backend for now
|
|
6
3
|
if isinstance(row, dict):
|
|
@@ -32,6 +29,8 @@ def handle_mysql_empty_dates(row):
|
|
|
32
29
|
|
|
33
30
|
|
|
34
31
|
def table_adapter_exclude_columns(cols: list[str]):
|
|
32
|
+
from dlt.common.libs.sql_alchemy import Table
|
|
33
|
+
|
|
35
34
|
def excluder(table: Table):
|
|
36
35
|
cols_to_remove = [col for col in table._columns if col.name in cols] # type: ignore
|
|
37
36
|
for col in cols_to_remove:
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from typing import Dict
|
|
2
2
|
|
|
3
3
|
from dlt.common.schema.typing import TColumnSchema
|
|
4
|
-
from dlt.destinations.adapters import athena_adapter, athena_partition
|
|
5
4
|
from dlt.sources import DltResource, DltSource
|
|
6
5
|
|
|
7
6
|
import ingestr.src.resource as resource
|
|
@@ -12,6 +11,8 @@ def apply_athena_hints(
|
|
|
12
11
|
partition_column: str,
|
|
13
12
|
additional_hints: Dict[str, TColumnSchema] = {},
|
|
14
13
|
) -> None:
|
|
14
|
+
from dlt.destinations.adapters import athena_adapter, athena_partition
|
|
15
|
+
|
|
15
16
|
def _apply_partition_hint(resource: DltResource) -> None:
|
|
16
17
|
columns = resource.columns if resource.columns else {}
|
|
17
18
|
|