ingestr 0.13.17__tar.gz → 0.13.19__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.17 → ingestr-0.13.19}/Makefile +8 -5
- {ingestr-0.13.17 → ingestr-0.13.19}/PKG-INFO +128 -1
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/.vitepress/config.mjs +1 -0
- ingestr-0.13.19/docs/media/kinesis.bigquery.png +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/hubspot.md +0 -1
- ingestr-0.13.19/docs/tutorials/load-kinesis-bigquery.md +67 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/main.py +9 -11
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/adjust/adjust_helpers.py +2 -2
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/blob.py +13 -10
- ingestr-0.13.19/ingestr/src/buildinfo.py +1 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/hubspot/__init__.py +0 -8
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/kinesis/__init__.py +1 -0
- ingestr-0.13.19/ingestr/src/partition.py +31 -0
- ingestr-0.13.19/ingestr/src/resource.py +17 -0
- ingestr-0.13.17/requirements.txt → ingestr-0.13.19/requirements.in +0 -1
- ingestr-0.13.19/requirements.txt +560 -0
- ingestr-0.13.17/ingestr/src/buildinfo.py +0 -1
- {ingestr-0.13.17 → ingestr-0.13.19}/.dockerignore +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/.githooks/pre-commit-hook.sh +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/.github/workflows/deploy-docs.yml +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/.github/workflows/release.yml +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/.github/workflows/secrets-scan.yml +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/.github/workflows/tests.yml +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/.gitignore +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/.gitleaksignore +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/.python-version +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/.vale.ini +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/Dockerfile +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/LICENSE.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/README.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/.vitepress/theme/custom.css +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/.vitepress/theme/index.js +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/commands/example-uris.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/commands/ingest.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/getting-started/core-concepts.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/getting-started/incremental-loading.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/getting-started/quickstart.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/getting-started/telemetry.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/index.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/media/applovin_max.png +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/media/athena.png +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/media/clickhouse_img.png +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/media/github.png +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/media/googleanalytics.png +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/media/linkedin_ads.png +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/media/personio.png +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/media/tiktok.png +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/adjust.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/airtable.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/applovin.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/applovin_max.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/appsflyer.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/appstore.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/asana.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/athena.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/bigquery.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/chess.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/clickhouse.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/csv.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/custom_queries.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/databricks.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/duckdb.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/dynamodb.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/facebook-ads.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/gcs.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/github.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/google-ads.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/google_analytics.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/gorgias.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/gsheets.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/kafka.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/kinesis.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/klaviyo.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/linkedin_ads.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/mongodb.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/mssql.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/mysql.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/notion.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/oracle.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/personio.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/postgres.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/redshift.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/s3.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/salesforce.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/sap-hana.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/shopify.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/slack.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/snowflake.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/sqlite.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/stripe.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/tiktok-ads.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/docs/supported-sources/zendesk.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/.gitignore +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/adjust/__init__.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/airtable/__init__.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/applovin/__init__.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/applovin_max/__init__.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/appsflyer/_init_.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/appsflyer/client.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/appstore/__init__.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/appstore/client.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/appstore/errors.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/appstore/models.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/appstore/resources.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/arrow/__init__.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/asana_source/__init__.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/asana_source/helpers.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/asana_source/settings.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/chess/__init__.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/chess/helpers.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/chess/settings.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/destinations.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/dynamodb/__init__.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/errors.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/facebook_ads/__init__.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/facebook_ads/exceptions.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/facebook_ads/helpers.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/facebook_ads/settings.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/factory.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/filesystem/__init__.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/filesystem/helpers.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/filesystem/readers.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/filters.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/github/__init__.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/github/helpers.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/github/queries.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/github/settings.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/google_ads/__init__.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/google_ads/field.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/google_ads/metrics.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/google_ads/predicates.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/google_ads/reports.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/google_analytics/__init__.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/google_analytics/helpers.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/google_sheets/README.md +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/google_sheets/__init__.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/gorgias/__init__.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/gorgias/helpers.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/hubspot/helpers.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/hubspot/settings.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/kafka/__init__.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/kafka/helpers.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/kinesis/helpers.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/klaviyo/_init_.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/klaviyo/client.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/klaviyo/helpers.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/linkedin_ads/__init__.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/linkedin_ads/helpers.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/loader.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/mongodb/__init__.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/mongodb/helpers.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/notion/__init__.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/notion/helpers/__init__.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/notion/helpers/client.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/notion/helpers/database.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/notion/settings.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/personio/__init__.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/personio/helpers.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/salesforce/__init__.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/salesforce/helpers.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/shopify/__init__.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/shopify/exceptions.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/shopify/helpers.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/shopify/settings.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/slack/__init__.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/slack/helpers.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/slack/settings.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/sources.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/sql_database/__init__.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/sql_database/callbacks.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/stripe_analytics/__init__.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/stripe_analytics/helpers.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/stripe_analytics/settings.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/table_definition.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/telemetry/event.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/testdata/fakebqcredentials.json +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/tiktok_ads/__init__.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/time.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/version.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/zendesk/__init__.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/zendesk/helpers/__init__.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/zendesk/helpers/credentials.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/src/zendesk/settings.py +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/testdata/.gitignore +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/testdata/create_replace.csv +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/testdata/delete_insert_expected.csv +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/testdata/delete_insert_part1.csv +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/testdata/delete_insert_part2.csv +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/testdata/merge_expected.csv +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/testdata/merge_part1.csv +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/ingestr/testdata/merge_part2.csv +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/package-lock.json +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/package.json +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/pyproject.toml +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/requirements-dev.txt +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/resources/demo.gif +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/resources/demo.tape +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/resources/ingestr.svg +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/AMPM.yml +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Acronyms.yml +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Colons.yml +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Contractions.yml +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/DateFormat.yml +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Ellipses.yml +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/EmDash.yml +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Exclamation.yml +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/FirstPerson.yml +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Gender.yml +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/GenderBias.yml +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/HeadingPunctuation.yml +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Headings.yml +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Latin.yml +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/LyHyphens.yml +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/OptionalPlurals.yml +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Ordinal.yml +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/OxfordComma.yml +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Parens.yml +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Passive.yml +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Periods.yml +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Quotes.yml +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Ranges.yml +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Semicolons.yml +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Slang.yml +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Spacing.yml +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Spelling.yml +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Units.yml +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/We.yml +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/Will.yml +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/WordList.yml +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/meta.json +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/styles/Google/vocab.txt +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/styles/bruin/Ingestr.yml +0 -0
- {ingestr-0.13.17 → ingestr-0.13.19}/styles/config/vocabularies/bruin/accept.txt +0 -0
|
@@ -11,7 +11,10 @@ venv/touchfile: requirements-dev.txt requirements.txt
|
|
|
11
11
|
. venv/bin/activate; pip install uv; $(MAKE) deps
|
|
12
12
|
touch venv/touchfile
|
|
13
13
|
|
|
14
|
-
deps:
|
|
14
|
+
lock-deps:
|
|
15
|
+
@uv pip compile requirements.in --quiet -o requirements.txt
|
|
16
|
+
|
|
17
|
+
deps: lock-deps
|
|
15
18
|
uv pip install -r requirements-dev.txt
|
|
16
19
|
|
|
17
20
|
deps-ci:
|
|
@@ -20,17 +23,17 @@ deps-ci:
|
|
|
20
23
|
test-ci:
|
|
21
24
|
TESTCONTAINERS_RYUK_DISABLED=true pytest -n auto -x -rP -vv --tb=short --durations=10 --cov=ingestr --no-cov-on-fail
|
|
22
25
|
|
|
23
|
-
test: venv
|
|
26
|
+
test : venv lock-deps
|
|
24
27
|
. venv/bin/activate; $(MAKE) test-ci
|
|
25
28
|
|
|
26
|
-
test-specific: venv
|
|
29
|
+
test-specific: venv lock-deps
|
|
27
30
|
. venv/bin/activate; pytest -rP -vv --tb=short --capture=no -k $(test)
|
|
28
31
|
|
|
29
32
|
lint-ci:
|
|
30
33
|
ruff format ingestr && ruff check ingestr --fix
|
|
31
34
|
mypy --config-file pyproject.toml --explicit-package-bases ingestr
|
|
32
35
|
|
|
33
|
-
lint: venv
|
|
36
|
+
lint: venv lock-deps
|
|
34
37
|
. venv/bin/activate; $(MAKE) lint-ci
|
|
35
38
|
|
|
36
39
|
lint-docs:
|
|
@@ -38,7 +41,7 @@ lint-docs:
|
|
|
38
41
|
|
|
39
42
|
tl: test lint
|
|
40
43
|
|
|
41
|
-
build:
|
|
44
|
+
build: lock-deps
|
|
42
45
|
cat > ${BUILDINFO} <<< "version = \"$$(git describe --tags --abbrev=0)\""
|
|
43
46
|
rm -rf dist && python3 -m build
|
|
44
47
|
rm -f ${BUILDINFO}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ingestr
|
|
3
|
-
Version: 0.13.
|
|
3
|
+
Version: 0.13.19
|
|
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
|
|
@@ -14,50 +14,177 @@ Classifier: Operating System :: OS Independent
|
|
|
14
14
|
Classifier: Programming Language :: Python :: 3
|
|
15
15
|
Classifier: Topic :: Database
|
|
16
16
|
Requires-Python: >=3.9
|
|
17
|
+
Requires-Dist: aiobotocore==2.21.1
|
|
18
|
+
Requires-Dist: aiohappyeyeballs==2.4.8
|
|
19
|
+
Requires-Dist: aiohttp==3.11.13
|
|
20
|
+
Requires-Dist: aioitertools==0.12.0
|
|
21
|
+
Requires-Dist: aiosignal==1.3.2
|
|
22
|
+
Requires-Dist: alembic==1.15.1
|
|
23
|
+
Requires-Dist: annotated-types==0.7.0
|
|
17
24
|
Requires-Dist: asana==3.2.3
|
|
25
|
+
Requires-Dist: asn1crypto==1.5.1
|
|
26
|
+
Requires-Dist: asynch==0.2.4
|
|
27
|
+
Requires-Dist: attrs==25.1.0
|
|
28
|
+
Requires-Dist: backoff==2.2.1
|
|
29
|
+
Requires-Dist: beautifulsoup4==4.13.3
|
|
30
|
+
Requires-Dist: boto3==1.37.1
|
|
31
|
+
Requires-Dist: botocore==1.37.1
|
|
32
|
+
Requires-Dist: cachetools==5.5.2
|
|
33
|
+
Requires-Dist: certifi==2025.1.31
|
|
34
|
+
Requires-Dist: cffi==1.17.1
|
|
35
|
+
Requires-Dist: charset-normalizer==3.4.1
|
|
36
|
+
Requires-Dist: ciso8601==2.3.2
|
|
37
|
+
Requires-Dist: click==8.1.8
|
|
18
38
|
Requires-Dist: clickhouse-connect==0.8.14
|
|
19
39
|
Requires-Dist: clickhouse-driver==0.2.9
|
|
20
40
|
Requires-Dist: clickhouse-sqlalchemy==0.2.7
|
|
21
41
|
Requires-Dist: confluent-kafka==2.8.0
|
|
42
|
+
Requires-Dist: cryptography==44.0.2
|
|
43
|
+
Requires-Dist: curlify==2.2.1
|
|
22
44
|
Requires-Dist: databricks-sql-connector==2.9.3
|
|
23
45
|
Requires-Dist: databricks-sqlalchemy==1.0.2
|
|
24
46
|
Requires-Dist: dataclasses-json==0.6.7
|
|
47
|
+
Requires-Dist: decorator==5.2.1
|
|
48
|
+
Requires-Dist: deprecation==2.1.0
|
|
25
49
|
Requires-Dist: dlt==1.6.1
|
|
50
|
+
Requires-Dist: dnspython==2.7.0
|
|
26
51
|
Requires-Dist: duckdb-engine==0.15.0
|
|
27
52
|
Requires-Dist: duckdb==1.2.0
|
|
53
|
+
Requires-Dist: et-xmlfile==2.0.0
|
|
28
54
|
Requires-Dist: facebook-business==20.0.0
|
|
55
|
+
Requires-Dist: filelock==3.17.0
|
|
29
56
|
Requires-Dist: flatten-json==0.1.14
|
|
57
|
+
Requires-Dist: frozenlist==1.5.0
|
|
58
|
+
Requires-Dist: fsspec==2024.10.0
|
|
30
59
|
Requires-Dist: gcsfs==2024.10.0
|
|
60
|
+
Requires-Dist: gitdb==4.0.12
|
|
61
|
+
Requires-Dist: gitpython==3.1.44
|
|
62
|
+
Requires-Dist: giturlparse==0.12.0
|
|
31
63
|
Requires-Dist: google-ads==25.1.0
|
|
32
64
|
Requires-Dist: google-analytics-data==0.18.17
|
|
65
|
+
Requires-Dist: google-api-core==2.24.1
|
|
33
66
|
Requires-Dist: google-api-python-client==2.130.0
|
|
67
|
+
Requires-Dist: google-auth-httplib2==0.2.0
|
|
68
|
+
Requires-Dist: google-auth-oauthlib==1.2.1
|
|
69
|
+
Requires-Dist: google-auth==2.38.0
|
|
34
70
|
Requires-Dist: google-cloud-bigquery-storage==2.24.0
|
|
71
|
+
Requires-Dist: google-cloud-bigquery==3.30.0
|
|
72
|
+
Requires-Dist: google-cloud-core==2.4.2
|
|
73
|
+
Requires-Dist: google-cloud-storage==3.1.0
|
|
74
|
+
Requires-Dist: google-crc32c==1.6.0
|
|
75
|
+
Requires-Dist: google-resumable-media==2.7.2
|
|
76
|
+
Requires-Dist: googleapis-common-protos==1.69.0
|
|
77
|
+
Requires-Dist: greenlet==3.1.1
|
|
78
|
+
Requires-Dist: grpcio-status==1.62.3
|
|
79
|
+
Requires-Dist: grpcio==1.70.0
|
|
80
|
+
Requires-Dist: hdbcli==2.23.27
|
|
81
|
+
Requires-Dist: hexbytes==1.3.0
|
|
82
|
+
Requires-Dist: httplib2==0.22.0
|
|
83
|
+
Requires-Dist: humanize==4.12.1
|
|
84
|
+
Requires-Dist: idna==3.10
|
|
85
|
+
Requires-Dist: inflection==0.5.1
|
|
86
|
+
Requires-Dist: isodate==0.7.2
|
|
87
|
+
Requires-Dist: jmespath==1.0.1
|
|
88
|
+
Requires-Dist: jsonpath-ng==1.7.0
|
|
89
|
+
Requires-Dist: leb128==1.0.8
|
|
90
|
+
Requires-Dist: lxml==5.3.1
|
|
91
|
+
Requires-Dist: lz4==4.4.3
|
|
92
|
+
Requires-Dist: makefun==1.15.6
|
|
93
|
+
Requires-Dist: mako==1.3.9
|
|
94
|
+
Requires-Dist: markdown-it-py==3.0.0
|
|
95
|
+
Requires-Dist: markupsafe==3.0.2
|
|
96
|
+
Requires-Dist: marshmallow==3.26.1
|
|
97
|
+
Requires-Dist: mdurl==0.1.2
|
|
98
|
+
Requires-Dist: monotonic==1.6
|
|
99
|
+
Requires-Dist: more-itertools==10.6.0
|
|
100
|
+
Requires-Dist: multidict==6.1.0
|
|
101
|
+
Requires-Dist: mypy-extensions==1.0.0
|
|
35
102
|
Requires-Dist: mysql-connector-python==9.2.0
|
|
103
|
+
Requires-Dist: numpy==2.2.3
|
|
104
|
+
Requires-Dist: oauthlib==3.2.2
|
|
105
|
+
Requires-Dist: openpyxl==3.1.5
|
|
106
|
+
Requires-Dist: orjson==3.10.15
|
|
107
|
+
Requires-Dist: packaging==24.2
|
|
108
|
+
Requires-Dist: pandas==2.2.3
|
|
109
|
+
Requires-Dist: pathvalidate==3.2.3
|
|
36
110
|
Requires-Dist: pendulum==3.0.0
|
|
111
|
+
Requires-Dist: platformdirs==4.3.6
|
|
112
|
+
Requires-Dist: pluggy==1.5.0
|
|
113
|
+
Requires-Dist: ply==3.11
|
|
114
|
+
Requires-Dist: propcache==0.3.0
|
|
115
|
+
Requires-Dist: proto-plus==1.26.0
|
|
116
|
+
Requires-Dist: protobuf==4.25.6
|
|
37
117
|
Requires-Dist: psutil==6.1.1
|
|
38
118
|
Requires-Dist: psycopg2-binary==2.9.10
|
|
39
119
|
Requires-Dist: py-machineid==0.6.0
|
|
40
120
|
Requires-Dist: pyairtable==2.3.3
|
|
41
121
|
Requires-Dist: pyarrow==18.1.0
|
|
122
|
+
Requires-Dist: pyasn1-modules==0.4.1
|
|
123
|
+
Requires-Dist: pyasn1==0.6.1
|
|
42
124
|
Requires-Dist: pyathena==3.12.2
|
|
125
|
+
Requires-Dist: pycountry==24.6.1
|
|
126
|
+
Requires-Dist: pycparser==2.22
|
|
127
|
+
Requires-Dist: pydantic-core==2.27.2
|
|
128
|
+
Requires-Dist: pydantic==2.10.6
|
|
129
|
+
Requires-Dist: pygments==2.19.1
|
|
130
|
+
Requires-Dist: pyjwt==2.10.1
|
|
43
131
|
Requires-Dist: pymongo==4.11.1
|
|
44
132
|
Requires-Dist: pymysql==1.1.1
|
|
133
|
+
Requires-Dist: pyopenssl==25.0.0
|
|
134
|
+
Requires-Dist: pyparsing==3.2.1
|
|
45
135
|
Requires-Dist: pyrate-limiter==3.7.0
|
|
136
|
+
Requires-Dist: python-dateutil==2.9.0.post0
|
|
137
|
+
Requires-Dist: python-dotenv==1.0.1
|
|
138
|
+
Requires-Dist: pytz==2025.1
|
|
139
|
+
Requires-Dist: pyyaml==6.0.2
|
|
46
140
|
Requires-Dist: redshift-connector==2.1.5
|
|
141
|
+
Requires-Dist: requests-file==2.1.0
|
|
142
|
+
Requires-Dist: requests-oauthlib==1.3.1
|
|
143
|
+
Requires-Dist: requests-toolbelt==1.0.0
|
|
144
|
+
Requires-Dist: requests==2.32.3
|
|
145
|
+
Requires-Dist: requirements-parser==0.11.0
|
|
146
|
+
Requires-Dist: rich-argparse==1.7.0
|
|
47
147
|
Requires-Dist: rich==13.9.4
|
|
148
|
+
Requires-Dist: rsa==4.9
|
|
48
149
|
Requires-Dist: rudder-sdk-python==2.1.4
|
|
49
150
|
Requires-Dist: s3fs==2024.10.0
|
|
151
|
+
Requires-Dist: s3transfer==0.11.3
|
|
152
|
+
Requires-Dist: scramp==1.4.5
|
|
153
|
+
Requires-Dist: semver==3.0.4
|
|
154
|
+
Requires-Dist: setuptools==75.8.2
|
|
155
|
+
Requires-Dist: shellingham==1.5.4
|
|
50
156
|
Requires-Dist: simple-salesforce==1.12.6
|
|
157
|
+
Requires-Dist: simplejson==3.20.1
|
|
158
|
+
Requires-Dist: six==1.17.0
|
|
159
|
+
Requires-Dist: smmap==5.0.2
|
|
160
|
+
Requires-Dist: snowflake-connector-python==3.14.0
|
|
51
161
|
Requires-Dist: snowflake-sqlalchemy==1.6.1
|
|
162
|
+
Requires-Dist: sortedcontainers==2.4.0
|
|
163
|
+
Requires-Dist: soupsieve==2.6
|
|
52
164
|
Requires-Dist: sqlalchemy-bigquery==1.12.1
|
|
53
165
|
Requires-Dist: sqlalchemy-hana==2.0.0
|
|
54
166
|
Requires-Dist: sqlalchemy-redshift==0.8.14
|
|
55
167
|
Requires-Dist: sqlalchemy2-stubs==0.0.2a38
|
|
56
168
|
Requires-Dist: sqlalchemy==1.4.52
|
|
57
169
|
Requires-Dist: stripe==10.7.0
|
|
170
|
+
Requires-Dist: tenacity==9.0.0
|
|
171
|
+
Requires-Dist: thrift==0.16.0
|
|
172
|
+
Requires-Dist: time-machine==2.16.0
|
|
173
|
+
Requires-Dist: tomlkit==0.13.2
|
|
58
174
|
Requires-Dist: tqdm==4.67.1
|
|
59
175
|
Requires-Dist: typer==0.13.1
|
|
60
176
|
Requires-Dist: types-requests==2.32.0.20240907
|
|
177
|
+
Requires-Dist: types-setuptools==75.8.2.20250305
|
|
178
|
+
Requires-Dist: typing-extensions==4.12.2
|
|
179
|
+
Requires-Dist: typing-inspect==0.9.0
|
|
180
|
+
Requires-Dist: tzdata==2025.1
|
|
181
|
+
Requires-Dist: tzlocal==5.3
|
|
182
|
+
Requires-Dist: uritemplate==4.1.1
|
|
183
|
+
Requires-Dist: urllib3==2.3.0
|
|
184
|
+
Requires-Dist: wrapt==1.17.2
|
|
185
|
+
Requires-Dist: yarl==1.18.3
|
|
186
|
+
Requires-Dist: zeep==4.3.1
|
|
187
|
+
Requires-Dist: zstandard==0.23.0
|
|
61
188
|
Requires-Dist: zstd==1.5.6.5
|
|
62
189
|
Provides-Extra: odbc
|
|
63
190
|
Requires-Dist: pyodbc==5.1.0; extra == 'odbc'
|
|
@@ -40,6 +40,7 @@ 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" },
|
|
43
44
|
{ text: "Telemetry", link: "/getting-started/telemetry.md" },
|
|
44
45
|
],
|
|
45
46
|
},
|
|
Binary file
|
|
@@ -39,7 +39,6 @@ HubSpot source allows ingesting the following sources into separate tables:
|
|
|
39
39
|
- `products`: Retrieves pricing information of products.
|
|
40
40
|
- `tickets`: Handles requests for help from customers or users.
|
|
41
41
|
- `quotes`: Retrieves price proposals that salespeople can create and send to their contacts.
|
|
42
|
-
- `hubspot_events_for_objects`: Retrieves web analytics events for a given object type and object IDs.
|
|
43
42
|
- `contacts`: Retrieves information about visitors, potential customers, and leads.
|
|
44
43
|
|
|
45
44
|
Use these as `--source-table` parameter in the `ingestr ingest` command.
|
|
@@ -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.
|
|
@@ -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.19"
|
|
@@ -199,14 +199,6 @@ def crm_objects(
|
|
|
199
199
|
|
|
200
200
|
props = ",".join(sorted(list(set(props))))
|
|
201
201
|
|
|
202
|
-
if len(props) > 2000:
|
|
203
|
-
raise ValueError(
|
|
204
|
-
"Your request to Hubspot is too long to process. "
|
|
205
|
-
"Maximum allowed query length is 2000 symbols, while "
|
|
206
|
-
f"your list of properties `{props[:200]}`... is {len(props)} "
|
|
207
|
-
"symbols long. Use the `props` argument of the resource to "
|
|
208
|
-
"set the list of properties to extract from the endpoint."
|
|
209
|
-
)
|
|
210
202
|
|
|
211
203
|
params = {"properties": props, "limit": 100}
|
|
212
204
|
|
|
@@ -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]
|