ingestr 0.13.18__tar.gz → 0.13.20__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.18 → ingestr-0.13.20}/PKG-INFO +3 -1
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/.vitepress/config.mjs +9 -0
- ingestr-0.13.20/docs/media/kinesis.bigquery.png +0 -0
- ingestr-0.13.20/docs/media/personio_duckdb.png +0 -0
- ingestr-0.13.20/docs/media/stripe_postgres.png +0 -0
- ingestr-0.13.20/docs/supported-sources/db2.md +20 -0
- ingestr-0.13.20/docs/tutorials/load-kinesis-bigquery.md +67 -0
- ingestr-0.13.20/docs/tutorials/load-personio-duckdb.md +95 -0
- ingestr-0.13.20/docs/tutorials/load-stripe-postgres.md +101 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/main.py +9 -11
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/adjust/adjust_helpers.py +2 -2
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/blob.py +13 -10
- ingestr-0.13.20/ingestr/src/buildinfo.py +1 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/factory.py +1 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/kinesis/__init__.py +1 -0
- ingestr-0.13.20/ingestr/src/partition.py +31 -0
- ingestr-0.13.20/ingestr/src/resource.py +17 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/sources.py +3 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/requirements.in +2 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/requirements.txt +7 -0
- ingestr-0.13.18/ingestr/src/buildinfo.py +0 -1
- {ingestr-0.13.18 → ingestr-0.13.20}/.dockerignore +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/.githooks/pre-commit-hook.sh +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/.github/workflows/deploy-docs.yml +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/.github/workflows/release.yml +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/.github/workflows/secrets-scan.yml +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/.github/workflows/tests.yml +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/.gitignore +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/.gitleaksignore +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/.python-version +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/.vale.ini +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/Dockerfile +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/LICENSE.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/Makefile +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/README.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/.vitepress/theme/custom.css +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/.vitepress/theme/index.js +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/commands/example-uris.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/commands/ingest.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/getting-started/core-concepts.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/getting-started/incremental-loading.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/getting-started/quickstart.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/getting-started/telemetry.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/index.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/media/applovin_max.png +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/media/athena.png +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/media/clickhouse_img.png +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/media/github.png +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/media/googleanalytics.png +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/media/linkedin_ads.png +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/media/personio.png +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/media/tiktok.png +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/adjust.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/airtable.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/applovin.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/applovin_max.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/appsflyer.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/appstore.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/asana.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/athena.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/bigquery.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/chess.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/clickhouse.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/csv.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/custom_queries.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/databricks.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/duckdb.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/dynamodb.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/facebook-ads.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/gcs.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/github.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/google-ads.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/google_analytics.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/gorgias.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/gsheets.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/hubspot.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/kafka.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/kinesis.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/klaviyo.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/linkedin_ads.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/mongodb.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/mssql.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/mysql.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/notion.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/oracle.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/personio.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/postgres.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/redshift.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/s3.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/salesforce.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/sap-hana.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/shopify.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/slack.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/snowflake.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/sqlite.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/stripe.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/tiktok-ads.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/docs/supported-sources/zendesk.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/.gitignore +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/adjust/__init__.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/airtable/__init__.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/applovin/__init__.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/applovin_max/__init__.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/appsflyer/_init_.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/appsflyer/client.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/appstore/__init__.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/appstore/client.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/appstore/errors.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/appstore/models.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/appstore/resources.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/arrow/__init__.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/asana_source/__init__.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/asana_source/helpers.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/asana_source/settings.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/chess/__init__.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/chess/helpers.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/chess/settings.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/destinations.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/dynamodb/__init__.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/errors.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/facebook_ads/__init__.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/facebook_ads/exceptions.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/facebook_ads/helpers.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/facebook_ads/settings.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/filesystem/__init__.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/filesystem/helpers.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/filesystem/readers.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/filters.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/github/__init__.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/github/helpers.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/github/queries.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/github/settings.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/google_ads/__init__.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/google_ads/field.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/google_ads/metrics.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/google_ads/predicates.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/google_ads/reports.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/google_analytics/__init__.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/google_analytics/helpers.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/google_sheets/README.md +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/google_sheets/__init__.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/gorgias/__init__.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/gorgias/helpers.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/hubspot/__init__.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/hubspot/helpers.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/hubspot/settings.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/kafka/__init__.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/kafka/helpers.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/kinesis/helpers.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/klaviyo/_init_.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/klaviyo/client.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/klaviyo/helpers.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/linkedin_ads/__init__.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/linkedin_ads/helpers.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/loader.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/mongodb/__init__.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/mongodb/helpers.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/notion/__init__.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/notion/helpers/__init__.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/notion/helpers/client.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/notion/helpers/database.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/notion/settings.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/personio/__init__.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/personio/helpers.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/salesforce/__init__.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/salesforce/helpers.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/shopify/__init__.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/shopify/exceptions.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/shopify/helpers.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/shopify/settings.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/slack/__init__.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/slack/helpers.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/slack/settings.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/sql_database/__init__.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/sql_database/callbacks.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/stripe_analytics/__init__.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/stripe_analytics/helpers.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/stripe_analytics/settings.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/table_definition.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/telemetry/event.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/testdata/fakebqcredentials.json +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/tiktok_ads/__init__.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/time.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/version.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/zendesk/__init__.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/zendesk/helpers/__init__.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/zendesk/helpers/credentials.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/src/zendesk/settings.py +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/testdata/.gitignore +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/testdata/create_replace.csv +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/testdata/delete_insert_expected.csv +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/testdata/delete_insert_part1.csv +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/testdata/delete_insert_part2.csv +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/testdata/merge_expected.csv +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/testdata/merge_part1.csv +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/ingestr/testdata/merge_part2.csv +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/package-lock.json +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/package.json +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/pyproject.toml +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/requirements-dev.txt +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/resources/demo.gif +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/resources/demo.tape +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/resources/ingestr.svg +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/styles/Google/AMPM.yml +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/styles/Google/Acronyms.yml +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/styles/Google/Colons.yml +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/styles/Google/Contractions.yml +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/styles/Google/DateFormat.yml +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/styles/Google/Ellipses.yml +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/styles/Google/EmDash.yml +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/styles/Google/Exclamation.yml +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/styles/Google/FirstPerson.yml +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/styles/Google/Gender.yml +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/styles/Google/GenderBias.yml +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/styles/Google/HeadingPunctuation.yml +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/styles/Google/Headings.yml +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/styles/Google/Latin.yml +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/styles/Google/LyHyphens.yml +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/styles/Google/OptionalPlurals.yml +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/styles/Google/Ordinal.yml +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/styles/Google/OxfordComma.yml +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/styles/Google/Parens.yml +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/styles/Google/Passive.yml +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/styles/Google/Periods.yml +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/styles/Google/Quotes.yml +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/styles/Google/Ranges.yml +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/styles/Google/Semicolons.yml +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/styles/Google/Slang.yml +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/styles/Google/Spacing.yml +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/styles/Google/Spelling.yml +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/styles/Google/Units.yml +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/styles/Google/We.yml +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/styles/Google/Will.yml +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/styles/Google/WordList.yml +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/styles/Google/meta.json +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/styles/Google/vocab.txt +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/styles/bruin/Ingestr.yml +0 -0
- {ingestr-0.13.18 → ingestr-0.13.20}/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.20
|
|
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
|
|
@@ -50,6 +50,14 @@ export default defineConfig({
|
|
|
50
50
|
{ text: "example-uris", link: "/commands/example-uris.md" },
|
|
51
51
|
],
|
|
52
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
|
+
},
|
|
53
61
|
{
|
|
54
62
|
text: "Sources & Destinations",
|
|
55
63
|
items: [
|
|
@@ -67,6 +75,7 @@ export default defineConfig({
|
|
|
67
75
|
text: "Google BigQuery",
|
|
68
76
|
link: "/supported-sources/bigquery.md",
|
|
69
77
|
},
|
|
78
|
+
{ text: "IBM Db2", link: "/supported-sources/db2.md" },
|
|
70
79
|
{ text: "Kafka", link: "/supported-sources/kafka.md" },
|
|
71
80
|
{ text: "Local CSV Files", link: "/supported-sources/csv.md" },
|
|
72
81
|
{
|
|
Binary file
|
|
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,67 @@
|
|
|
1
|
+
# Load Kinesis Data to BigQuery
|
|
2
|
+
|
|
3
|
+
Welcome! 👋 This tutorial will guide you through loading data from `Amazon Kinesis` into `Google BigQuery` using `ingestr`, a command-line tool that enables data ingestion between any source and destination using simple flags, no coding required.
|
|
4
|
+
|
|
5
|
+
Amazon Kinesis is a cloud-based service for real-time data streaming and analytics that processes large data streams in real-time. You often need to store this data in a data warehouse like BigQuery for analysis and reporting. This is where ingestr simplifies the process.
|
|
6
|
+
|
|
7
|
+
## Prerequisites
|
|
8
|
+
- Install ingestr by following the instructions [here](../getting-started/quickstart.md#Installation)
|
|
9
|
+
- AWS credentials - Access key and Secret key
|
|
10
|
+
- BigQuery service account
|
|
11
|
+
|
|
12
|
+
## Configuration Steps
|
|
13
|
+
### Source Configuration - Kinesis
|
|
14
|
+
|
|
15
|
+
#### `--source-uri`
|
|
16
|
+
This flag connects to your Kinesis stream. The URI format is:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
kinesis://?aws_access_key_id=$KEY_ID&aws_secret_access_key=$SECRET_KEY®ion_name=eu-central-1
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Required parameters:
|
|
23
|
+
- `aws_access_key_id`: Your AWS access key
|
|
24
|
+
- `aws_secret_access_key`: Your AWS secret key
|
|
25
|
+
- `region_name`: AWS region of your Kinesis stream.
|
|
26
|
+
|
|
27
|
+
#### `--source-table`
|
|
28
|
+
This flag specifies which Kinesis stream to read from:
|
|
29
|
+
```bash
|
|
30
|
+
--source-table 'kinesis_stream_name'
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Destination Configuration - BigQuery
|
|
34
|
+
#### `--dest-uri`
|
|
35
|
+
|
|
36
|
+
This flag connects to BigQuery. The URI format is:
|
|
37
|
+
```bash
|
|
38
|
+
bigquery://project-name?credentials_path=/path/to/service/account.json&location=<location>
|
|
39
|
+
```
|
|
40
|
+
Required parameters:
|
|
41
|
+
- `project-name`: Your BigQuery project name
|
|
42
|
+
- `credentials_path`: Path to service account JSON file
|
|
43
|
+
- `location`: (Optional) Dataset location
|
|
44
|
+
|
|
45
|
+
#### `--dest-table`
|
|
46
|
+
This flag specifies where to save the data:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
--dest-table 'schema.table_name'
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Now that we've configured all our flags, we can run a single command to connect to Kinesis, read from our specified stream, and load the data into our BigQuery target table.
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
ingestr ingest \
|
|
56
|
+
--source-uri 'kinesis://?aws_access_key_id=id_123&aws_secret_access_key=secret_123®ion_name=eu-central-1' \
|
|
57
|
+
--source-table 'stream_name_1' \
|
|
58
|
+
--dest-uri 'bigquery://test-playground?credentials_path=/Users/abc.json' \
|
|
59
|
+
--dest-table 'dest.results'
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
After running this command, your Kinesis data will be loaded into BigQuery. Here's what the data looks like in the destination:
|
|
63
|
+
|
|
64
|
+
<img alt="kinesis_bigquery" src="../media/kinesis.bigquery.png" />
|
|
65
|
+
|
|
66
|
+
🎉 Congratulations!
|
|
67
|
+
You've successfully loaded data from Amazon Kinesis to your desired destination.
|
|
@@ -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 🚀
|
|
@@ -8,6 +8,9 @@ from rich.console import Console
|
|
|
8
8
|
from rich.status import Status
|
|
9
9
|
from typing_extensions import Annotated
|
|
10
10
|
|
|
11
|
+
import ingestr.src.partition as partition
|
|
12
|
+
import ingestr.src.resource as resource
|
|
13
|
+
from ingestr.src.destinations import AthenaDestination
|
|
11
14
|
from ingestr.src.filters import cast_set_to_list
|
|
12
15
|
from ingestr.src.telemetry.event import track
|
|
13
16
|
|
|
@@ -357,14 +360,6 @@ def ingest(
|
|
|
357
360
|
)
|
|
358
361
|
raise typer.Abort()
|
|
359
362
|
|
|
360
|
-
def run_on_resource(source, executable):
|
|
361
|
-
if hasattr(source, "selected_resources") and source.selected_resources:
|
|
362
|
-
resource_names = list(source.selected_resources.keys())
|
|
363
|
-
for res in resource_names:
|
|
364
|
-
executable(source.resources[res])
|
|
365
|
-
else:
|
|
366
|
-
executable(source)
|
|
367
|
-
|
|
368
363
|
def parse_columns(columns: list[str]) -> dict[str, TDataType]:
|
|
369
364
|
from typing import cast, get_args
|
|
370
365
|
|
|
@@ -553,20 +548,23 @@ def ingest(
|
|
|
553
548
|
sql_exclude_columns=sql_exclude_columns,
|
|
554
549
|
)
|
|
555
550
|
|
|
556
|
-
|
|
551
|
+
resource.for_each(dlt_source, lambda x: x.add_map(cast_set_to_list))
|
|
557
552
|
|
|
558
553
|
def col_h(x):
|
|
559
554
|
if column_hints:
|
|
560
555
|
x.apply_hints(columns=column_hints)
|
|
561
556
|
|
|
562
|
-
|
|
557
|
+
resource.for_each(dlt_source, col_h)
|
|
558
|
+
|
|
559
|
+
if isinstance(destination, AthenaDestination) and partition_by:
|
|
560
|
+
partition.apply_athena_hints(dlt_source, partition_by, column_hints)
|
|
563
561
|
|
|
564
562
|
if original_incremental_strategy == IncrementalStrategy.delete_insert:
|
|
565
563
|
|
|
566
564
|
def set_primary_key(x):
|
|
567
565
|
x.incremental.primary_key = ()
|
|
568
566
|
|
|
569
|
-
|
|
567
|
+
resource.for_each(dlt_source, set_primary_key)
|
|
570
568
|
|
|
571
569
|
if (
|
|
572
570
|
factory.destination_scheme in PARQUET_SUPPORTED_DESTINATIONS
|
|
@@ -82,7 +82,7 @@ class AdjustAPI:
|
|
|
82
82
|
items = result.get("rows", [])
|
|
83
83
|
yield items
|
|
84
84
|
else:
|
|
85
|
-
raise HTTPError(f"Request failed with status code: {response.status_code}")
|
|
85
|
+
raise HTTPError(f"Request failed with status code: {response.status_code}, {response.text}.")
|
|
86
86
|
|
|
87
87
|
def fetch_events(self):
|
|
88
88
|
headers = {"Authorization": f"Bearer {self.api_key}"}
|
|
@@ -93,7 +93,7 @@ class AdjustAPI:
|
|
|
93
93
|
result = response.json()
|
|
94
94
|
yield result
|
|
95
95
|
else:
|
|
96
|
-
raise HTTPError(f"Request failed with status code: {response.status_code}")
|
|
96
|
+
raise HTTPError(f"Request failed with status code: {response.status_code}, {response.text}.")
|
|
97
97
|
|
|
98
98
|
|
|
99
99
|
def parse_filters(filters_raw: str) -> dict:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import warnings
|
|
2
2
|
from typing import Tuple, TypeAlias
|
|
3
|
-
from urllib.parse import ParseResult
|
|
3
|
+
from urllib.parse import ParseResult, urlparse
|
|
4
4
|
|
|
5
5
|
BucketName: TypeAlias = str
|
|
6
6
|
FileGlob: TypeAlias = str
|
|
@@ -14,13 +14,16 @@ def parse_uri(uri: ParseResult, table: str) -> Tuple[BucketName, FileGlob]:
|
|
|
14
14
|
Supports the following Forms:
|
|
15
15
|
- uri: "gs://"
|
|
16
16
|
table: "bucket-name/file-glob"
|
|
17
|
+
- uri: "gs://uri-bucket-name" (uri-bucket-name is preferred)
|
|
18
|
+
table: "gs://table-bucket-name/file-glob"
|
|
19
|
+
- uri: "gs://"
|
|
20
|
+
table: "gs://bucket-name/file-glob"
|
|
17
21
|
- uri: gs://bucket-name/file-glob
|
|
18
22
|
table: None
|
|
19
23
|
- uri: "gs://bucket-name"
|
|
20
24
|
table: "file-glob"
|
|
21
25
|
|
|
22
|
-
The first form is the prefered method. Other forms are supported
|
|
23
|
-
for backward compatibility, but discouraged.
|
|
26
|
+
The first form is the prefered method. Other forms are supported but discouraged.
|
|
24
27
|
"""
|
|
25
28
|
|
|
26
29
|
table = table.strip()
|
|
@@ -34,15 +37,15 @@ def parse_uri(uri: ParseResult, table: str) -> Tuple[BucketName, FileGlob]:
|
|
|
34
37
|
)
|
|
35
38
|
return host, uri.path.lstrip("/")
|
|
36
39
|
|
|
40
|
+
table_uri = urlparse(table)
|
|
41
|
+
|
|
37
42
|
if host != "":
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
)
|
|
43
|
-
return host, table.lstrip("/")
|
|
43
|
+
return host, table_uri.path.lstrip("/")
|
|
44
|
+
|
|
45
|
+
if table_uri.hostname:
|
|
46
|
+
return table_uri.hostname, table_uri.path.lstrip("/")
|
|
44
47
|
|
|
45
|
-
parts =
|
|
48
|
+
parts = table_uri.path.lstrip("/").split("/", maxsplit=1)
|
|
46
49
|
if len(parts) != 2:
|
|
47
50
|
return "", parts[0]
|
|
48
51
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
version = "v0.13.20"
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
from typing import Dict
|
|
2
|
+
|
|
3
|
+
from dlt.common.schema.typing import TColumnSchema
|
|
4
|
+
from dlt.destinations.adapters import athena_adapter, athena_partition
|
|
5
|
+
from dlt.sources import DltResource, DltSource
|
|
6
|
+
|
|
7
|
+
import ingestr.src.resource as resource
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def apply_athena_hints(
|
|
11
|
+
source: DltSource | DltResource,
|
|
12
|
+
partition_column: str,
|
|
13
|
+
additional_hints: Dict[str, TColumnSchema] = {},
|
|
14
|
+
) -> None:
|
|
15
|
+
def _apply_partition_hint(resource: DltResource) -> None:
|
|
16
|
+
|
|
17
|
+
columns = resource.columns if resource.columns else {}
|
|
18
|
+
|
|
19
|
+
partition_hint = (
|
|
20
|
+
columns.get(partition_column) # type: ignore
|
|
21
|
+
or additional_hints.get(partition_column)
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
athena_adapter(
|
|
25
|
+
resource,
|
|
26
|
+
athena_partition.day(partition_column)
|
|
27
|
+
if partition_hint and partition_hint.get("data_type") in ("timestamp", "date")
|
|
28
|
+
else partition_column,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
resource.for_each(source, _apply_partition_hint)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
from typing import Callable
|
|
2
|
+
|
|
3
|
+
from dlt.sources import DltResource, DltSource
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def for_each(
|
|
7
|
+
source: DltSource | DltResource, ex: Callable[[DltResource], None | DltResource]
|
|
8
|
+
):
|
|
9
|
+
"""
|
|
10
|
+
Apply a function to each resource in a source.
|
|
11
|
+
"""
|
|
12
|
+
if hasattr(source, "selected_resources") and source.selected_resources:
|
|
13
|
+
resource_names = list(source.selected_resources.keys())
|
|
14
|
+
for res in resource_names:
|
|
15
|
+
ex(source.resources[res]) # type: ignore[union-attr]
|
|
16
|
+
else:
|
|
17
|
+
ex(source) # type: ignore[arg-type]
|
|
@@ -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.18"
|
|
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
|