ingestr 0.13.19__tar.gz → 0.13.21__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.19 → ingestr-0.13.21}/PKG-INFO +3 -1
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/.vitepress/config.mjs +9 -1
- ingestr-0.13.21/docs/media/personio_duckdb.png +0 -0
- ingestr-0.13.21/docs/media/stripe_postgres.png +0 -0
- ingestr-0.13.21/docs/supported-sources/db2.md +20 -0
- ingestr-0.13.21/docs/tutorials/load-personio-duckdb.md +95 -0
- ingestr-0.13.21/docs/tutorials/load-stripe-postgres.md +101 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/main.py +29 -25
- ingestr-0.13.21/ingestr/src/buildinfo.py +1 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/factory.py +1 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/sources.py +3 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/requirements.in +2 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/requirements.txt +7 -0
- ingestr-0.13.19/ingestr/src/buildinfo.py +0 -1
- {ingestr-0.13.19 → ingestr-0.13.21}/.dockerignore +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/.githooks/pre-commit-hook.sh +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/.github/workflows/deploy-docs.yml +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/.github/workflows/release.yml +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/.github/workflows/secrets-scan.yml +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/.github/workflows/tests.yml +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/.gitignore +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/.gitleaksignore +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/.python-version +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/.vale.ini +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/Dockerfile +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/LICENSE.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/Makefile +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/README.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/.vitepress/theme/custom.css +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/.vitepress/theme/index.js +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/commands/example-uris.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/commands/ingest.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/getting-started/core-concepts.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/getting-started/incremental-loading.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/getting-started/quickstart.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/getting-started/telemetry.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/index.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/media/applovin_max.png +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/media/athena.png +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/media/clickhouse_img.png +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/media/github.png +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/media/googleanalytics.png +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/media/kinesis.bigquery.png +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/media/linkedin_ads.png +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/media/personio.png +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/media/tiktok.png +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/adjust.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/airtable.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/applovin.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/applovin_max.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/appsflyer.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/appstore.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/asana.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/athena.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/bigquery.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/chess.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/clickhouse.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/csv.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/custom_queries.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/databricks.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/duckdb.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/dynamodb.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/facebook-ads.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/gcs.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/github.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/google-ads.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/google_analytics.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/gorgias.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/gsheets.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/hubspot.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/kafka.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/kinesis.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/klaviyo.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/linkedin_ads.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/mongodb.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/mssql.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/mysql.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/notion.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/oracle.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/personio.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/postgres.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/redshift.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/s3.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/salesforce.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/sap-hana.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/shopify.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/slack.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/snowflake.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/sqlite.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/stripe.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/tiktok-ads.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/supported-sources/zendesk.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/docs/tutorials/load-kinesis-bigquery.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/.gitignore +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/adjust/__init__.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/adjust/adjust_helpers.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/airtable/__init__.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/applovin/__init__.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/applovin_max/__init__.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/appsflyer/_init_.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/appsflyer/client.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/appstore/__init__.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/appstore/client.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/appstore/errors.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/appstore/models.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/appstore/resources.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/arrow/__init__.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/asana_source/__init__.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/asana_source/helpers.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/asana_source/settings.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/blob.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/chess/__init__.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/chess/helpers.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/chess/settings.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/destinations.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/dynamodb/__init__.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/errors.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/facebook_ads/__init__.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/facebook_ads/exceptions.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/facebook_ads/helpers.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/facebook_ads/settings.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/filesystem/__init__.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/filesystem/helpers.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/filesystem/readers.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/filters.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/github/__init__.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/github/helpers.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/github/queries.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/github/settings.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/google_ads/__init__.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/google_ads/field.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/google_ads/metrics.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/google_ads/predicates.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/google_ads/reports.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/google_analytics/__init__.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/google_analytics/helpers.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/google_sheets/README.md +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/google_sheets/__init__.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/gorgias/__init__.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/gorgias/helpers.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/hubspot/__init__.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/hubspot/helpers.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/hubspot/settings.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/kafka/__init__.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/kafka/helpers.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/kinesis/__init__.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/kinesis/helpers.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/klaviyo/_init_.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/klaviyo/client.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/klaviyo/helpers.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/linkedin_ads/__init__.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/linkedin_ads/helpers.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/loader.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/mongodb/__init__.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/mongodb/helpers.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/notion/__init__.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/notion/helpers/__init__.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/notion/helpers/client.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/notion/helpers/database.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/notion/settings.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/partition.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/personio/__init__.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/personio/helpers.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/resource.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/salesforce/__init__.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/salesforce/helpers.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/shopify/__init__.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/shopify/exceptions.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/shopify/helpers.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/shopify/settings.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/slack/__init__.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/slack/helpers.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/slack/settings.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/sql_database/__init__.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/sql_database/callbacks.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/stripe_analytics/__init__.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/stripe_analytics/helpers.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/stripe_analytics/settings.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/table_definition.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/telemetry/event.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/testdata/fakebqcredentials.json +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/tiktok_ads/__init__.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/time.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/version.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/zendesk/__init__.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/zendesk/helpers/__init__.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/zendesk/helpers/credentials.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/src/zendesk/settings.py +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/testdata/.gitignore +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/testdata/create_replace.csv +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/testdata/delete_insert_expected.csv +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/testdata/delete_insert_part1.csv +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/testdata/delete_insert_part2.csv +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/testdata/merge_expected.csv +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/testdata/merge_part1.csv +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/ingestr/testdata/merge_part2.csv +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/package-lock.json +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/package.json +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/pyproject.toml +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/requirements-dev.txt +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/resources/demo.gif +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/resources/demo.tape +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/resources/ingestr.svg +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/styles/Google/AMPM.yml +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/styles/Google/Acronyms.yml +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/styles/Google/Colons.yml +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/styles/Google/Contractions.yml +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/styles/Google/DateFormat.yml +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/styles/Google/Ellipses.yml +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/styles/Google/EmDash.yml +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/styles/Google/Exclamation.yml +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/styles/Google/FirstPerson.yml +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/styles/Google/Gender.yml +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/styles/Google/GenderBias.yml +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/styles/Google/HeadingPunctuation.yml +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/styles/Google/Headings.yml +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/styles/Google/Latin.yml +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/styles/Google/LyHyphens.yml +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/styles/Google/OptionalPlurals.yml +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/styles/Google/Ordinal.yml +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/styles/Google/OxfordComma.yml +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/styles/Google/Parens.yml +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/styles/Google/Passive.yml +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/styles/Google/Periods.yml +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/styles/Google/Quotes.yml +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/styles/Google/Ranges.yml +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/styles/Google/Semicolons.yml +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/styles/Google/Slang.yml +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/styles/Google/Spacing.yml +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/styles/Google/Spelling.yml +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/styles/Google/Units.yml +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/styles/Google/We.yml +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/styles/Google/Will.yml +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/styles/Google/WordList.yml +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/styles/Google/meta.json +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/styles/Google/vocab.txt +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/styles/bruin/Ingestr.yml +0 -0
- {ingestr-0.13.19 → ingestr-0.13.21}/styles/config/vocabularies/bruin/accept.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ingestr
|
|
3
|
-
Version: 0.13.
|
|
3
|
+
Version: 0.13.21
|
|
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
|
|
@@ -81,6 +81,8 @@ Requires-Dist: hdbcli==2.23.27
|
|
|
81
81
|
Requires-Dist: hexbytes==1.3.0
|
|
82
82
|
Requires-Dist: httplib2==0.22.0
|
|
83
83
|
Requires-Dist: humanize==4.12.1
|
|
84
|
+
Requires-Dist: ibm-db-sa==0.4.1
|
|
85
|
+
Requires-Dist: ibm-db==3.2.6
|
|
84
86
|
Requires-Dist: idna==3.10
|
|
85
87
|
Requires-Dist: inflection==0.5.1
|
|
86
88
|
Requires-Dist: isodate==0.7.2
|
|
@@ -40,7 +40,6 @@ export default defineConfig({
|
|
|
40
40
|
text: "Incremental Loading",
|
|
41
41
|
link: "/getting-started/incremental-loading.md",
|
|
42
42
|
},
|
|
43
|
-
{ text: "Load Kinesis Data to BigQuery", link: "/tutorials/load-kinesis-bigquery.md" },
|
|
44
43
|
{ text: "Telemetry", link: "/getting-started/telemetry.md" },
|
|
45
44
|
],
|
|
46
45
|
},
|
|
@@ -51,6 +50,14 @@ export default defineConfig({
|
|
|
51
50
|
{ text: "example-uris", link: "/commands/example-uris.md" },
|
|
52
51
|
],
|
|
53
52
|
},
|
|
53
|
+
{
|
|
54
|
+
text: "Tutorials",
|
|
55
|
+
items: [
|
|
56
|
+
{ text: "Load Kinesis Data to BigQuery", link: "/tutorials/load-kinesis-bigquery.md" },
|
|
57
|
+
{ text: "Load Personio Data to DuckDB", link: "/tutorials/load-personio-duckdb.md" },
|
|
58
|
+
{ text: "Load Stripe Data to Postgres", link: "/tutorials/load-stripe-postgres.md" },
|
|
59
|
+
],
|
|
60
|
+
},
|
|
54
61
|
{
|
|
55
62
|
text: "Sources & Destinations",
|
|
56
63
|
items: [
|
|
@@ -68,6 +75,7 @@ export default defineConfig({
|
|
|
68
75
|
text: "Google BigQuery",
|
|
69
76
|
link: "/supported-sources/bigquery.md",
|
|
70
77
|
},
|
|
78
|
+
{ text: "IBM Db2", link: "/supported-sources/db2.md" },
|
|
71
79
|
{ text: "Kafka", link: "/supported-sources/kafka.md" },
|
|
72
80
|
{ text: "Local CSV Files", link: "/supported-sources/csv.md" },
|
|
73
81
|
{
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# IBM Db2
|
|
2
|
+
[IBM Db2](https://www.ibm.com/db2) is a high-performance, enterprise-grade relational database system designed for reliability, scalability, and transactional integrity.
|
|
3
|
+
|
|
4
|
+
ingestr supports IBM Db2 as a source.
|
|
5
|
+
|
|
6
|
+
## URI format
|
|
7
|
+
The URI format for DB2 is as follows:
|
|
8
|
+
|
|
9
|
+
```plaintext
|
|
10
|
+
db2://<username>:<password>@<host>:<port>/<database-name>
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
URI parameters:
|
|
14
|
+
- `username`: The username to connect to the database
|
|
15
|
+
- `password`: The password for the user
|
|
16
|
+
- `host`: The host address of the database server
|
|
17
|
+
- `port`: The port number the database server is listening
|
|
18
|
+
- `database-name`: the name of the database to connect to
|
|
19
|
+
|
|
20
|
+
The same URI structure can be used both for sources and destinations. You can read more about SQLAlchemy's Db2 dialect [here](https://github.com/ibmdb/python-ibmdbsa?tab=readme-ov-file#connecting).
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# Load Data from Personio to DuckDB
|
|
2
|
+
|
|
3
|
+
Welcome! 👋
|
|
4
|
+
This beginner-friendly guide will help you load data from `Personio` into `DuckDB` using ingestr — a simple yet powerful command-line tool. No prior experience is needed, and best of all, no coding required!
|
|
5
|
+
|
|
6
|
+
By the end of this guide, you'll have your Personio data securely stored in DuckDB. But before we dive in, let’s take a quick look at `ingestr`
|
|
7
|
+
|
|
8
|
+
## Overview of ingestr
|
|
9
|
+
`ingestr` is a command-line tool that simplifies data ingestion by allowing users to load data from a source to a destination using simple command-line flags.
|
|
10
|
+
|
|
11
|
+
### `ingestr` Command
|
|
12
|
+
```bash
|
|
13
|
+
ingestr ingest \
|
|
14
|
+
--source-uri '<your-source-uri-here>' \
|
|
15
|
+
--source-table '<your-schema>.<your-table>' \
|
|
16
|
+
--dest-uri '<your-destination-uri-here>' \
|
|
17
|
+
--dest-table '<your-schema>.<your-table>'
|
|
18
|
+
```
|
|
19
|
+
- `ingestr ingest`: Executes the data ingestion process.
|
|
20
|
+
- `--source-uri TEXT`: Specifies the URI of the data source.
|
|
21
|
+
- `--dest-uri TEXT`: Specifies the URI of the destination.
|
|
22
|
+
- `--source-table TEXT`: Defines the table to fetch data from.
|
|
23
|
+
- `--dest-table TEXT`: Specifies the destination table. If not provided, it defaults to `--source-table`.
|
|
24
|
+
|
|
25
|
+
With this command, we connect to the source, retrieve the specified data, and load it into the destination database.
|
|
26
|
+
## Let's Load Data from Personio to DuckDB Together!
|
|
27
|
+
|
|
28
|
+
Personio is a human resources management platform that helps businesses handle recruitment and employee data. To analyze this data, you may need to load it into an analytics database like DuckDB. `ingestr` makes this process simple.
|
|
29
|
+
|
|
30
|
+
### Step 1: Install `ingestr`
|
|
31
|
+
Ensure `ingestr` is installed. If not, follow the installation guide [here](../getting-started/quickstart.md#Installation).
|
|
32
|
+
|
|
33
|
+
### Step 2: Get Personio Credentials
|
|
34
|
+
Personio will be our data source.
|
|
35
|
+
1. Log in to your Personio account.
|
|
36
|
+
2. Ensure your user has API access.
|
|
37
|
+
3. Navigate to **Settings > Integrations > API Credentials**.
|
|
38
|
+
4. Click **Generate new credentials**.
|
|
39
|
+
5. Assign **read access** to required attributes (e.g., last name, last modified).
|
|
40
|
+
6. Copy the generated `client ID` and `client secret`.
|
|
41
|
+
|
|
42
|
+
For more details, refer to [Personio API documentation](https://developer.personio.de/docs/getting-started-with-the-personio-api#21-employee-attendance-and-absence-endpoints).
|
|
43
|
+
|
|
44
|
+
### Step 3: Install DuckDB
|
|
45
|
+
DuckDB will be our data destination. If it’s not already installed, you can install it using pip:
|
|
46
|
+
```bash
|
|
47
|
+
pip install duckdb
|
|
48
|
+
```
|
|
49
|
+
Alternatively, you can download the latest version from the [official DuckDB website](https://duckdb.org/docs/installation/?version=stable&environment=cli&platform=macos&download_method=direct).
|
|
50
|
+
|
|
51
|
+
### Step 4: Run the `ingestr` Command
|
|
52
|
+
Execute the following command to load data from Personio to DuckDB:
|
|
53
|
+
```bash
|
|
54
|
+
ingestr ingest \
|
|
55
|
+
--source-uri 'personio://?client_id=<YOUR_CLIENT_ID>&client_secret=<YOUR_CLIENT_SECRET>' \
|
|
56
|
+
--source-table 'employees' \
|
|
57
|
+
--dest-uri 'duckdb:///personio.duckdb' \
|
|
58
|
+
--dest-table 'dest.employees'
|
|
59
|
+
```
|
|
60
|
+
- `--source-uri 'personio://?client_id=<ID>&client_secret=<SECRET>'`: Connects to Personio using API credentials.
|
|
61
|
+
- `--source-table 'employees'`: Specifies the table to fetch data from Personio.
|
|
62
|
+
- `--dest-uri 'duckdb:///personio.duckdb'`: Specifies DuckDB as the destination database.
|
|
63
|
+
- `--dest-table 'dest.employees'`: Defines where the data will be stored in DuckDB.
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
## Verify Data in DuckDB
|
|
67
|
+
Once the command runs successfully, your Personio data will be available in DuckDB. Follow these steps to verify the data:
|
|
68
|
+
|
|
69
|
+
### Step 1: Open DuckDB
|
|
70
|
+
If DuckDB is installed, you can open it using the following command:
|
|
71
|
+
```bash
|
|
72
|
+
duckdb personio.duckdb
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Step 2: List Available Tables
|
|
76
|
+
To check if the `employees` table has been created, run:
|
|
77
|
+
```sql
|
|
78
|
+
.tables;
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Step 3: View Data in the `employees` Table
|
|
82
|
+
To display all data from the `employees` table, run:
|
|
83
|
+
```sql
|
|
84
|
+
SELECT * FROM dest.employees;
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Step 4: Validate Data
|
|
88
|
+
Ensure that the retrieved data matches what was expected from Personio.
|
|
89
|
+
|
|
90
|
+
Example output:
|
|
91
|
+
|
|
92
|
+

|
|
93
|
+
|
|
94
|
+
🎉 **Congratulations!** You have successfully loaded data from Personio to DuckDB using `ingestr`.
|
|
95
|
+
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# Load Data from Stripe to PostgreSQL
|
|
2
|
+
|
|
3
|
+
Welcome! 👋 This beginner-friendly guide will help you load data from `Stripe` into `PostgreSQL` using ingestr — a simple yet powerful command-line tool. No prior experience is needed, and best of all, no coding required! 🚀
|
|
4
|
+
|
|
5
|
+
By the end of this guide, you'll have your Stripe data securely stored in PostgreSQL. But before we dive in, let’s take a quick look at ingestr.
|
|
6
|
+
|
|
7
|
+
## Overview of `ingestr`
|
|
8
|
+
`ingestr` is a command-line tool that simplifies data ingestion by allowing users to load data from a source to a destination.
|
|
9
|
+
|
|
10
|
+
### `ingestr` Command
|
|
11
|
+
```bash
|
|
12
|
+
ingestr ingest \
|
|
13
|
+
--source-uri '<your-source-uri-here>' \
|
|
14
|
+
--source-table '<your-schema>.<your-table>' \
|
|
15
|
+
--dest-uri '<your-destination-uri-here>' \
|
|
16
|
+
--dest-table '<your-schema>.<your-table>'
|
|
17
|
+
```
|
|
18
|
+
- `ingestr ingest`: Executes the data ingestion process.
|
|
19
|
+
- `--source-uri TEXT`: Defines the source database URI.
|
|
20
|
+
- `--dest-uri TEXT`: Defines the destination database URI.
|
|
21
|
+
- `--source-table TEXT`: Specifies the table to fetch data from.
|
|
22
|
+
- `--dest-table TEXT`: Defines where the data should be stored (defaults to `--source-table` if not specified).
|
|
23
|
+
|
|
24
|
+
With this command, we connect to the source, retrieve the specified data, and load it into the destination database.
|
|
25
|
+
|
|
26
|
+
## Let's Load Data from Stripe into PostgreSQL Together!
|
|
27
|
+
|
|
28
|
+
Stripe is a popular payment processing platform used by e-commerce and SaaS applications. If you need to analyze Stripe data, you can load it into PostgreSQL, a reliable and widely used relational database.
|
|
29
|
+
|
|
30
|
+
## Step 1: Install `ingestr`
|
|
31
|
+
Ensure `ingestr` is installed on your system. If not, follow the installation guide [here](../getting-started/quickstart.md#Installation).
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
pip install ingestr
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Step 2: Retrieve Stripe API Credentials
|
|
38
|
+
Stripe will be our **data source**. To retrieve your API credentials:
|
|
39
|
+
|
|
40
|
+
1. Log in to your **Stripe Dashboard**: [dashboard.stripe.com](https://dashboard.stripe.com)
|
|
41
|
+
2. Navigate to **Developers** → **API Keys**.
|
|
42
|
+
3. Under **Standard Keys**, find:
|
|
43
|
+
- **Secret Key**: Required for server-to-server requests
|
|
44
|
+
4. Click **Reveal Key** next to your **Secret Key** and copy it.
|
|
45
|
+
|
|
46
|
+
For detailed API documentation, visit the [Stripe API Docs](https://stripe.com/docs/api).
|
|
47
|
+
|
|
48
|
+
## Step 3: Retrieve PostgreSQL Credentials
|
|
49
|
+
In this example, we are using a **cloud-hosted PostgreSQL instance**.
|
|
50
|
+
1. Log in to your cloud provider (e.g., [Neon](https://neon.tech/)).
|
|
51
|
+
2. Navigate to your **PostgreSQL instance** and retrieve:
|
|
52
|
+
- **Host**: Example - `your-db-instance.aws.com`
|
|
53
|
+
- **Port**: Default is `5432`
|
|
54
|
+
- **Database Name**: The database where Stripe data will be stored.
|
|
55
|
+
- **Username & Password**: Credentials used to connect to PostgreSQL.
|
|
56
|
+
- **sslmode**: Required depending on the security settings of your PostgreSQL instance
|
|
57
|
+
|
|
58
|
+
## Step 4: Run the `ingestr` Command
|
|
59
|
+
Execute the following command to load data from **Stripe to PostgreSQL**:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
ingestr ingest \
|
|
63
|
+
--source-uri 'stripe://?api_key=<YOUR_STRIPE_SECRET_KEY>' \
|
|
64
|
+
--source-table 'event' \
|
|
65
|
+
--dest-uri 'postgresql://<username>:<password>@<host>:<port>/<database-name>?sslmode=<sslmode>' \
|
|
66
|
+
--dest-table 'dest.events'
|
|
67
|
+
```
|
|
68
|
+
- `--source-uri 'stripe://?api_key=<YOUR_STRIPE_SECRET_KEY>'`: Connects to Stripe using secret key .
|
|
69
|
+
- `--source-table 'event'`: Specifies the data to fetch data from Stripe.
|
|
70
|
+
- `--dest-uri 'postgresql://<username>:<password>@<host>:<port>/<database-name>?sslmode=<sslmode>'`: Connects to PostgreSQL as the destination database using the provided credentials.
|
|
71
|
+
- `--dest-table 'dest.events'`: Defines where the data will be stored in Postgres.
|
|
72
|
+
|
|
73
|
+
## Step 5: Verify Data in PostgreSQL via DBeaver
|
|
74
|
+
|
|
75
|
+
Once the command runs successfully, let's verify that the Stripe data has been loaded into PostgreSQL.
|
|
76
|
+
|
|
77
|
+
### 1: Connect to PostgreSQL via DBeaver
|
|
78
|
+
1. **Open DBeaver** and go to **Database** → **New Connection**.
|
|
79
|
+
2. Select **PostgreSQL**.
|
|
80
|
+
3. Enter your **PostgreSQL credentials**:
|
|
81
|
+
- **Host**: `<your-host>`
|
|
82
|
+
- **Port**: `5432` (default)
|
|
83
|
+
- **Database**: `<your-database>`
|
|
84
|
+
- **Username**: `<your-username>`
|
|
85
|
+
- **Password**: `<your-password>`
|
|
86
|
+
4. Click **Test Connection** to verify.
|
|
87
|
+
5. If successful, click **Finish**.
|
|
88
|
+
|
|
89
|
+
### 2: Browse Tables
|
|
90
|
+
1. Expand your **PostgreSQL connection** in the **Database Navigator**.
|
|
91
|
+
2. Expand **Schemas** → **Public**.
|
|
92
|
+
3. Expand **Tables** and find `events`.
|
|
93
|
+
|
|
94
|
+
### 3: View Data in DBeaver
|
|
95
|
+
1. Right-click the `events` table.
|
|
96
|
+
2. Click **View Data** → **All Rows**.
|
|
97
|
+
3. Ensure that the retrieved data matches what was expected from Stripe.
|
|
98
|
+
|
|
99
|
+

|
|
100
|
+
🎉 Congratulations!
|
|
101
|
+
Your Stripe data is now securely stored in PostgreSQL 🚀
|
|
@@ -127,40 +127,44 @@ class SqlReflectionLevel(str, Enum):
|
|
|
127
127
|
def ingest(
|
|
128
128
|
source_uri: Annotated[
|
|
129
129
|
str,
|
|
130
|
-
typer.Option(
|
|
130
|
+
typer.Option(
|
|
131
|
+
help="The URI of the [green]source[/green]",
|
|
132
|
+
envvar=["SOURCE_URI", "INGESTR_SOURCE_URI"],
|
|
133
|
+
),
|
|
131
134
|
], # type: ignore
|
|
132
135
|
dest_uri: Annotated[
|
|
133
136
|
str,
|
|
134
137
|
typer.Option(
|
|
135
|
-
help="The URI of the [cyan]destination[/cyan]",
|
|
138
|
+
help="The URI of the [cyan]destination[/cyan]",
|
|
139
|
+
envvar=["DESTINATION_URI", "INGESTR_DESTINATION_URI"],
|
|
136
140
|
),
|
|
137
141
|
], # type: ignore
|
|
138
142
|
source_table: Annotated[
|
|
139
143
|
str,
|
|
140
144
|
typer.Option(
|
|
141
145
|
help="The table name in the [green]source[/green] to fetch",
|
|
142
|
-
envvar="SOURCE_TABLE",
|
|
146
|
+
envvar=["SOURCE_TABLE", "INGESTR_SOURCE_TABLE"],
|
|
143
147
|
),
|
|
144
148
|
], # type: ignore
|
|
145
149
|
dest_table: Annotated[
|
|
146
150
|
str,
|
|
147
151
|
typer.Option(
|
|
148
152
|
help="The table in the [cyan]destination[/cyan] to save the data into",
|
|
149
|
-
envvar="DESTINATION_TABLE",
|
|
153
|
+
envvar=["DESTINATION_TABLE", "INGESTR_DESTINATION_TABLE"],
|
|
150
154
|
),
|
|
151
155
|
] = None, # type: ignore
|
|
152
156
|
incremental_key: Annotated[
|
|
153
157
|
Optional[str],
|
|
154
158
|
typer.Option(
|
|
155
159
|
help="The incremental key from the table to be used for incremental strategies",
|
|
156
|
-
envvar="INCREMENTAL_KEY",
|
|
160
|
+
envvar=["INCREMENTAL_KEY", "INGESTR_INCREMENTAL_KEY"],
|
|
157
161
|
),
|
|
158
162
|
] = None, # type: ignore
|
|
159
163
|
incremental_strategy: Annotated[
|
|
160
164
|
IncrementalStrategy,
|
|
161
165
|
typer.Option(
|
|
162
166
|
help="The incremental strategy to use",
|
|
163
|
-
envvar="INCREMENTAL_STRATEGY",
|
|
167
|
+
envvar=["INCREMENTAL_STRATEGY", "INGESTR_INCREMENTAL_STRATEGY"],
|
|
164
168
|
),
|
|
165
169
|
] = IncrementalStrategy.create_replace, # type: ignore
|
|
166
170
|
interval_start: Annotated[
|
|
@@ -168,7 +172,7 @@ def ingest(
|
|
|
168
172
|
typer.Option(
|
|
169
173
|
help="The start of the interval the incremental key will cover",
|
|
170
174
|
formats=DATE_FORMATS,
|
|
171
|
-
envvar="INTERVAL_START",
|
|
175
|
+
envvar=["INTERVAL_START", "INGESTR_INTERVAL_START"],
|
|
172
176
|
),
|
|
173
177
|
] = None, # type: ignore
|
|
174
178
|
interval_end: Annotated[
|
|
@@ -176,126 +180,126 @@ def ingest(
|
|
|
176
180
|
typer.Option(
|
|
177
181
|
help="The end of the interval the incremental key will cover",
|
|
178
182
|
formats=DATE_FORMATS,
|
|
179
|
-
envvar="INTERVAL_END",
|
|
183
|
+
envvar=["INTERVAL_END", "INGESTR_INTERVAL_END"],
|
|
180
184
|
),
|
|
181
185
|
] = None, # type: ignore
|
|
182
186
|
primary_key: Annotated[
|
|
183
187
|
Optional[list[str]],
|
|
184
188
|
typer.Option(
|
|
185
189
|
help="The key that will be used to deduplicate the resulting table",
|
|
186
|
-
envvar="PRIMARY_KEY",
|
|
190
|
+
envvar=["PRIMARY_KEY", "INGESTR_PRIMARY_KEY"],
|
|
187
191
|
),
|
|
188
192
|
] = None, # type: ignore
|
|
189
193
|
partition_by: Annotated[
|
|
190
194
|
Optional[str],
|
|
191
195
|
typer.Option(
|
|
192
196
|
help="The partition key to be used for partitioning the destination table",
|
|
193
|
-
envvar="PARTITION_BY",
|
|
197
|
+
envvar=["PARTITION_BY", "INGESTR_PARTITION_BY"],
|
|
194
198
|
),
|
|
195
199
|
] = None, # type: ignore
|
|
196
200
|
cluster_by: Annotated[
|
|
197
201
|
Optional[str],
|
|
198
202
|
typer.Option(
|
|
199
203
|
help="The clustering key to be used for clustering the destination table, not every destination supports clustering.",
|
|
200
|
-
envvar="CLUSTER_BY",
|
|
204
|
+
envvar=["CLUSTER_BY", "INGESTR_CLUSTER_BY"],
|
|
201
205
|
),
|
|
202
206
|
] = None, # type: ignore
|
|
203
207
|
yes: Annotated[
|
|
204
208
|
Optional[bool],
|
|
205
209
|
typer.Option(
|
|
206
210
|
help="Skip the confirmation prompt and ingest right away",
|
|
207
|
-
envvar="SKIP_CONFIRMATION",
|
|
211
|
+
envvar=["SKIP_CONFIRMATION", "INGESTR_SKIP_CONFIRMATION"],
|
|
208
212
|
),
|
|
209
213
|
] = False, # type: ignore
|
|
210
214
|
full_refresh: Annotated[
|
|
211
215
|
bool,
|
|
212
216
|
typer.Option(
|
|
213
217
|
help="Ignore the state and refresh the destination table completely",
|
|
214
|
-
envvar="FULL_REFRESH",
|
|
218
|
+
envvar=["FULL_REFRESH", "INGESTR_FULL_REFRESH"],
|
|
215
219
|
),
|
|
216
220
|
] = False, # type: ignore
|
|
217
221
|
progress: Annotated[
|
|
218
222
|
Progress,
|
|
219
223
|
typer.Option(
|
|
220
224
|
help="The progress display type, must be one of 'interactive', 'log'",
|
|
221
|
-
envvar="PROGRESS",
|
|
225
|
+
envvar=["PROGRESS", "INGESTR_PROGRESS"],
|
|
222
226
|
),
|
|
223
227
|
] = Progress.interactive, # type: ignore
|
|
224
228
|
sql_backend: Annotated[
|
|
225
229
|
SqlBackend,
|
|
226
230
|
typer.Option(
|
|
227
231
|
help="The SQL backend to use",
|
|
228
|
-
envvar="SQL_BACKEND",
|
|
232
|
+
envvar=["SQL_BACKEND", "INGESTR_SQL_BACKEND"],
|
|
229
233
|
),
|
|
230
234
|
] = SqlBackend.pyarrow, # type: ignore
|
|
231
235
|
loader_file_format: Annotated[
|
|
232
236
|
Optional[LoaderFileFormat],
|
|
233
237
|
typer.Option(
|
|
234
238
|
help="The file format to use when loading data",
|
|
235
|
-
envvar="LOADER_FILE_FORMAT",
|
|
239
|
+
envvar=["LOADER_FILE_FORMAT", "INGESTR_LOADER_FILE_FORMAT"],
|
|
236
240
|
),
|
|
237
241
|
] = None, # type: ignore
|
|
238
242
|
page_size: Annotated[
|
|
239
243
|
Optional[int],
|
|
240
244
|
typer.Option(
|
|
241
245
|
help="The page size to be used when fetching data from SQL sources",
|
|
242
|
-
envvar="PAGE_SIZE",
|
|
246
|
+
envvar=["PAGE_SIZE", "INGESTR_PAGE_SIZE"],
|
|
243
247
|
),
|
|
244
248
|
] = 50000, # type: ignore
|
|
245
249
|
loader_file_size: Annotated[
|
|
246
250
|
Optional[int],
|
|
247
251
|
typer.Option(
|
|
248
252
|
help="The file size to be used by the loader to split the data into multiple files. This can be set independent of the page size, since page size is used for fetching the data from the sources whereas this is used for the processing/loading part.",
|
|
249
|
-
envvar="LOADER_FILE_SIZE",
|
|
253
|
+
envvar=["LOADER_FILE_SIZE", "INGESTR_LOADER_FILE_SIZE"],
|
|
250
254
|
),
|
|
251
255
|
] = 100000, # type: ignore
|
|
252
256
|
schema_naming: Annotated[
|
|
253
257
|
SchemaNaming,
|
|
254
258
|
typer.Option(
|
|
255
259
|
help="The naming convention to use when moving the tables from source to destination. The default behavior is explained here: https://dlthub.com/docs/general-usage/schema#naming-convention",
|
|
256
|
-
envvar="SCHEMA_NAMING",
|
|
260
|
+
envvar=["SCHEMA_NAMING", "INGESTR_SCHEMA_NAMING"],
|
|
257
261
|
),
|
|
258
262
|
] = SchemaNaming.default, # type: ignore
|
|
259
263
|
pipelines_dir: Annotated[
|
|
260
264
|
Optional[str],
|
|
261
265
|
typer.Option(
|
|
262
266
|
help="The path to store dlt-related pipeline metadata. By default, ingestr will create a temporary directory and delete it after the execution is done in order to make retries stateless.",
|
|
263
|
-
envvar="PIPELINES_DIR",
|
|
267
|
+
envvar=["PIPELINES_DIR", "INGESTR_PIPELINES_DIR"],
|
|
264
268
|
),
|
|
265
269
|
] = None, # type: ignore
|
|
266
270
|
extract_parallelism: Annotated[
|
|
267
271
|
Optional[int],
|
|
268
272
|
typer.Option(
|
|
269
273
|
help="The number of parallel jobs to run for extracting data from the source, only applicable for certain sources",
|
|
270
|
-
envvar="EXTRACT_PARALLELISM",
|
|
274
|
+
envvar=["EXTRACT_PARALLELISM", "INGESTR_EXTRACT_PARALLELISM"],
|
|
271
275
|
),
|
|
272
276
|
] = 5, # type: ignore
|
|
273
277
|
sql_reflection_level: Annotated[
|
|
274
278
|
SqlReflectionLevel,
|
|
275
279
|
typer.Option(
|
|
276
280
|
help="The reflection level to use when reflecting the table schema from the source",
|
|
277
|
-
envvar="SQL_REFLECTION_LEVEL",
|
|
281
|
+
envvar=["SQL_REFLECTION_LEVEL", "INGESTR_SQL_REFLECTION_LEVEL"],
|
|
278
282
|
),
|
|
279
283
|
] = SqlReflectionLevel.full, # type: ignore
|
|
280
284
|
sql_limit: Annotated[
|
|
281
285
|
Optional[int],
|
|
282
286
|
typer.Option(
|
|
283
287
|
help="The limit to use when fetching data from the source",
|
|
284
|
-
envvar="SQL_LIMIT",
|
|
288
|
+
envvar=["SQL_LIMIT", "INGESTR_SQL_LIMIT"],
|
|
285
289
|
),
|
|
286
290
|
] = None, # type: ignore
|
|
287
291
|
sql_exclude_columns: Annotated[
|
|
288
292
|
Optional[list[str]],
|
|
289
293
|
typer.Option(
|
|
290
294
|
help="The columns to exclude from the source table",
|
|
291
|
-
envvar="SQL_EXCLUDE_COLUMNS",
|
|
295
|
+
envvar=["SQL_EXCLUDE_COLUMNS", "INGESTR_SQL_EXCLUDE_COLUMNS"],
|
|
292
296
|
),
|
|
293
297
|
] = [], # type: ignore
|
|
294
298
|
columns: Annotated[
|
|
295
299
|
Optional[list[str]],
|
|
296
300
|
typer.Option(
|
|
297
301
|
help="The column types to be used for the destination table in the format of 'column_name:column_type'",
|
|
298
|
-
envvar="COLUMNS",
|
|
302
|
+
envvar=["COLUMNS", "INGESTR_COLUMNS"],
|
|
299
303
|
),
|
|
300
304
|
] = None, # type: ignore
|
|
301
305
|
):
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
version = "v0.13.21"
|
|
@@ -177,6 +177,9 @@ class SqlSource:
|
|
|
177
177
|
scheme="clickhouse+native",
|
|
178
178
|
query=urlencode(query_params, doseq=True),
|
|
179
179
|
).geturl()
|
|
180
|
+
|
|
181
|
+
if uri.startswith("db2://"):
|
|
182
|
+
uri = uri.replace("db2://", "db2+ibm_db://")
|
|
180
183
|
|
|
181
184
|
query_adapters = []
|
|
182
185
|
if kwargs.get("sql_limit"):
|
|
@@ -207,6 +207,12 @@ httplib2==0.22.0
|
|
|
207
207
|
# google-auth-httplib2
|
|
208
208
|
humanize==4.12.1
|
|
209
209
|
# via dlt
|
|
210
|
+
ibm-db==3.2.6
|
|
211
|
+
# via
|
|
212
|
+
# -r requirements.in
|
|
213
|
+
# ibm-db-sa
|
|
214
|
+
ibm-db-sa==0.4.1
|
|
215
|
+
# via -r requirements.in
|
|
210
216
|
idna==3.10
|
|
211
217
|
# via
|
|
212
218
|
# requests
|
|
@@ -476,6 +482,7 @@ sqlalchemy==1.4.52
|
|
|
476
482
|
# databricks-sql-connector
|
|
477
483
|
# databricks-sqlalchemy
|
|
478
484
|
# duckdb-engine
|
|
485
|
+
# ibm-db-sa
|
|
479
486
|
# snowflake-sqlalchemy
|
|
480
487
|
# sqlalchemy-bigquery
|
|
481
488
|
# sqlalchemy-hana
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
version = "v0.13.19"
|
|
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
|