ingestr 0.12.11__tar.gz → 0.13.1__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.12.11 → ingestr-0.13.1}/PKG-INFO +4 -1
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/.vitepress/config.mjs +1 -0
- ingestr-0.13.1/docs/media/clickhouse_img.png +0 -0
- ingestr-0.13.1/docs/supported-sources/clickhouse.md +37 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/main.py +1 -1
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/destinations.py +80 -14
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/factory.py +3 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/sources.py +1 -0
- ingestr-0.13.1/ingestr/src/version.py +1 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/package-lock.json +1015 -422
- {ingestr-0.12.11 → ingestr-0.13.1}/package.json +1 -1
- {ingestr-0.12.11 → ingestr-0.13.1}/pyproject.toml +2 -1
- {ingestr-0.12.11 → ingestr-0.13.1}/requirements.txt +3 -1
- ingestr-0.12.11/ingestr/src/version.py +0 -1
- {ingestr-0.12.11 → ingestr-0.13.1}/.dockerignore +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/.githooks/pre-commit-hook.sh +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/.github/workflows/deploy-docs.yml +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/.github/workflows/secrets-scan.yml +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/.github/workflows/tests.yml +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/.gitignore +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/.gitleaksignore +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/.python-version +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/.vale.ini +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/Dockerfile +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/LICENSE.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/Makefile +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/README.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/.vitepress/theme/custom.css +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/.vitepress/theme/index.js +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/commands/example-uris.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/commands/ingest.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/getting-started/core-concepts.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/getting-started/incremental-loading.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/getting-started/quickstart.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/getting-started/telemetry.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/index.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/media/athena.png +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/media/github.png +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/media/googleanalytics.png +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/media/linkedin_ads.png +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/media/tiktok.png +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/adjust.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/airtable.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/appsflyer.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/appstore.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/asana.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/athena.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/bigquery.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/chess.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/csv.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/custom_queries.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/databricks.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/duckdb.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/dynamodb.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/facebook-ads.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/gcs.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/github.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/google-ads.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/google_analytics.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/gorgias.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/gsheets.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/hubspot.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/kafka.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/klaviyo.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/linkedin_ads.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/mongodb.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/mssql.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/mysql.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/notion.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/oracle.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/postgres.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/redshift.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/s3.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/sap-hana.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/shopify.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/slack.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/snowflake.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/sqlite.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/stripe.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/tiktok-ads.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/docs/supported-sources/zendesk.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/.gitignore +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/adjust/__init__.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/adjust/adjust_helpers.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/airtable/__init__.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/appsflyer/_init_.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/appsflyer/client.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/appstore/__init__.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/appstore/client.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/appstore/errors.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/appstore/models.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/appstore/resources.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/arrow/__init__.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/asana_source/__init__.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/asana_source/helpers.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/asana_source/settings.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/blob.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/chess/__init__.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/chess/helpers.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/chess/settings.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/dynamodb/__init__.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/errors.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/facebook_ads/__init__.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/facebook_ads/exceptions.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/facebook_ads/helpers.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/facebook_ads/settings.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/filesystem/__init__.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/filesystem/helpers.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/filesystem/readers.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/filters.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/github/__init__.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/github/helpers.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/github/queries.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/github/settings.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/google_ads/__init__.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/google_ads/field.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/google_ads/metrics.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/google_ads/predicates.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/google_ads/reports.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/google_analytics/__init__.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/google_analytics/helpers.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/google_sheets/README.md +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/google_sheets/__init__.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/gorgias/__init__.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/gorgias/helpers.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/hubspot/__init__.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/hubspot/helpers.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/hubspot/settings.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/kafka/__init__.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/kafka/helpers.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/klaviyo/_init_.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/klaviyo/client.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/klaviyo/helpers.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/linkedin_ads/__init__.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/linkedin_ads/helpers.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/mongodb/__init__.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/mongodb/helpers.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/notion/__init__.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/notion/helpers/__init__.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/notion/helpers/client.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/notion/helpers/database.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/notion/settings.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/shopify/__init__.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/shopify/exceptions.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/shopify/helpers.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/shopify/settings.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/slack/__init__.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/slack/helpers.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/slack/settings.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/sql_database/__init__.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/sql_database/callbacks.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/stripe_analytics/__init__.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/stripe_analytics/helpers.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/stripe_analytics/settings.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/table_definition.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/telemetry/event.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/testdata/fakebqcredentials.json +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/tiktok_ads/__init__.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/time.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/zendesk/__init__.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/zendesk/helpers/__init__.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/zendesk/helpers/credentials.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/src/zendesk/settings.py +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/testdata/.gitignore +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/testdata/create_replace.csv +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/testdata/delete_insert_expected.csv +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/testdata/delete_insert_part1.csv +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/testdata/delete_insert_part2.csv +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/testdata/merge_expected.csv +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/testdata/merge_part1.csv +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/ingestr/testdata/merge_part2.csv +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/requirements-dev.txt +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/resources/demo.gif +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/resources/demo.tape +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/resources/ingestr.svg +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/styles/Google/AMPM.yml +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/styles/Google/Acronyms.yml +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/styles/Google/Colons.yml +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/styles/Google/Contractions.yml +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/styles/Google/DateFormat.yml +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/styles/Google/Ellipses.yml +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/styles/Google/EmDash.yml +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/styles/Google/Exclamation.yml +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/styles/Google/FirstPerson.yml +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/styles/Google/Gender.yml +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/styles/Google/GenderBias.yml +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/styles/Google/HeadingPunctuation.yml +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/styles/Google/Headings.yml +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/styles/Google/Latin.yml +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/styles/Google/LyHyphens.yml +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/styles/Google/OptionalPlurals.yml +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/styles/Google/Ordinal.yml +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/styles/Google/OxfordComma.yml +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/styles/Google/Parens.yml +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/styles/Google/Passive.yml +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/styles/Google/Periods.yml +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/styles/Google/Quotes.yml +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/styles/Google/Ranges.yml +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/styles/Google/Semicolons.yml +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/styles/Google/Slang.yml +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/styles/Google/Spacing.yml +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/styles/Google/Spelling.yml +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/styles/Google/Units.yml +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/styles/Google/We.yml +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/styles/Google/Will.yml +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/styles/Google/WordList.yml +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/styles/Google/meta.json +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/styles/Google/vocab.txt +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/styles/bruin/Ingestr.yml +0 -0
- {ingestr-0.12.11 → ingestr-0.13.1}/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.
|
|
3
|
+
Version: 0.13.1
|
|
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
|
|
@@ -15,6 +15,9 @@ Classifier: Programming Language :: Python :: 3
|
|
|
15
15
|
Classifier: Topic :: Database
|
|
16
16
|
Requires-Python: >=3.9
|
|
17
17
|
Requires-Dist: asana==3.2.3
|
|
18
|
+
Requires-Dist: clickhouse-connect==0.8.14
|
|
19
|
+
Requires-Dist: clickhouse-driver==0.2.9
|
|
20
|
+
Requires-Dist: clickhouse-sqlalchemy==0.2.7
|
|
18
21
|
Requires-Dist: confluent-kafka>=2.6.1
|
|
19
22
|
Requires-Dist: databricks-sql-connector==2.9.3
|
|
20
23
|
Requires-Dist: dataclasses-json==0.6.7
|
|
@@ -59,6 +59,7 @@ export default defineConfig({
|
|
|
59
59
|
items: [
|
|
60
60
|
{ text: "AWS Athena", link: "/supported-sources/athena.md" },
|
|
61
61
|
{ text: "AWS Redshift", link: "/supported-sources/redshift.md" },
|
|
62
|
+
{ text: "ClickHouse", link: "/supported-sources/clickhouse.md" },
|
|
62
63
|
{ text: "Databricks", link: "/supported-sources/databricks.md" },
|
|
63
64
|
{ text: "DuckDB", link: "/supported-sources/duckdb.md" },
|
|
64
65
|
{
|
|
Binary file
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# ClickHouse
|
|
2
|
+
ClickHouse is a fast, open-source, column-oriented database management system that allows for high performance data ingestion and querying.
|
|
3
|
+
|
|
4
|
+
Ingestr supports ClickHouse as a destination.
|
|
5
|
+
|
|
6
|
+
## URI format
|
|
7
|
+
The URI format for ClickHouse as a destination is as follows:
|
|
8
|
+
|
|
9
|
+
```plaintext
|
|
10
|
+
clickhouse://<username>:<password>@<host>:<port>?http_port=<http_port>
|
|
11
|
+
```
|
|
12
|
+
## URI parameters:
|
|
13
|
+
- `username` (required): The username is required to authenticate with the ClickHouse server.
|
|
14
|
+
- `password` (required): The password is required to authenticate the provided username.
|
|
15
|
+
- `host` (required): The hostname or IP address of the ClickHouse server where the database is hosted.
|
|
16
|
+
- `port` (required): The TCP port number used by the ClickHouse server.
|
|
17
|
+
- `http_port` (optional): The port number to use when connecting to the ClickHouse server's HTTP interface. Make sure your ClickHouse server is configured to accept HTTP connections on the port specified by http_port. By default, ClickHouse uses port 8123.
|
|
18
|
+
|
|
19
|
+
ClickHouse requires a `username`, `password`, `host` and `port` to connect to the ClickHouse server. For more information, read [here](https://dlthub.com/docs/dlt-ecosystem/destinations/clickhouse#2-setup-clickhouse-database). Once you've completed the guide, you should have all the above-mentioned credentials.
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
ingestr ingest \
|
|
23
|
+
--source-uri "stripe://?api_key=key123" \
|
|
24
|
+
--source-table 'event' \
|
|
25
|
+
--dest-uri "clickhouse://user_123:pass123@localhost:9000" \
|
|
26
|
+
--dest-table 'stripe.event'
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
This is a sample command that will copy the data from the Stripe source into Athena.
|
|
30
|
+
|
|
31
|
+
<img alt="clickhouse_img" src="../media/clickhouse_img.png" />
|
|
32
|
+
|
|
33
|
+
<!--
|
|
34
|
+
see https://github.com/dlt-hub/dlt/issues/2248
|
|
35
|
+
-->
|
|
36
|
+
> [!WARNING]
|
|
37
|
+
> Clickhouse currently doesn't support `delete+insert`, `merge` or `scd2` incremental strategies.
|
|
@@ -451,7 +451,7 @@ def ingest(
|
|
|
451
451
|
pipelines_dir = tempfile.mkdtemp()
|
|
452
452
|
is_pipelines_dir_temp = True
|
|
453
453
|
|
|
454
|
-
dlt_dest = destination.dlt_dest(uri=dest_uri)
|
|
454
|
+
dlt_dest = destination.dlt_dest(uri=dest_uri, dest_table=dest_table)
|
|
455
455
|
validate_loader_file_format(dlt_dest, loader_file_format)
|
|
456
456
|
|
|
457
457
|
if partition_by:
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import base64
|
|
2
2
|
import csv
|
|
3
|
-
import gzip
|
|
4
3
|
import json
|
|
5
4
|
import os
|
|
6
5
|
import shutil
|
|
@@ -8,7 +7,11 @@ import tempfile
|
|
|
8
7
|
from urllib.parse import parse_qs, quote, urlparse
|
|
9
8
|
|
|
10
9
|
import dlt
|
|
10
|
+
import pyarrow.parquet # type: ignore
|
|
11
11
|
from dlt.common.configuration.specs import AwsCredentials
|
|
12
|
+
from dlt.destinations.impl.clickhouse.configuration import (
|
|
13
|
+
ClickHouseCredentials,
|
|
14
|
+
)
|
|
12
15
|
|
|
13
16
|
|
|
14
17
|
class GenericSqlDestination:
|
|
@@ -181,19 +184,17 @@ class CsvDestination(GenericSqlDestination):
|
|
|
181
184
|
if output_path.count("/") > 1:
|
|
182
185
|
os.makedirs(os.path.dirname(output_path), exist_ok=True)
|
|
183
186
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
csv_writer.writerow(json_obj)
|
|
196
|
-
|
|
187
|
+
table = pyarrow.parquet.read_table(first_file_path)
|
|
188
|
+
rows = table.to_pylist()
|
|
189
|
+
with open(output_path, "w", newline="") as csv_file:
|
|
190
|
+
csv_writer = None
|
|
191
|
+
for row in rows:
|
|
192
|
+
row = filter_keys(row)
|
|
193
|
+
if csv_writer is None:
|
|
194
|
+
csv_writer = csv.DictWriter(csv_file, fieldnames=row.keys())
|
|
195
|
+
csv_writer.writeheader()
|
|
196
|
+
|
|
197
|
+
csv_writer.writerow(row)
|
|
197
198
|
shutil.rmtree(self.temp_path)
|
|
198
199
|
|
|
199
200
|
|
|
@@ -261,3 +262,68 @@ class AthenaDestination:
|
|
|
261
262
|
|
|
262
263
|
def post_load(self):
|
|
263
264
|
pass
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
class ClickhouseDestination:
|
|
268
|
+
def dlt_dest(self, uri: str, **kwargs):
|
|
269
|
+
parsed_uri = urlparse(uri)
|
|
270
|
+
|
|
271
|
+
if "dest_table" in kwargs:
|
|
272
|
+
table = kwargs["dest_table"]
|
|
273
|
+
database = table.split(".")[0]
|
|
274
|
+
else:
|
|
275
|
+
database = parsed_uri.path.lstrip("/")
|
|
276
|
+
|
|
277
|
+
username = parsed_uri.username
|
|
278
|
+
if not username:
|
|
279
|
+
raise ValueError(
|
|
280
|
+
"A username is required to connect to the ClickHouse database."
|
|
281
|
+
)
|
|
282
|
+
|
|
283
|
+
password = parsed_uri.password
|
|
284
|
+
if not password:
|
|
285
|
+
raise ValueError(
|
|
286
|
+
"A password is required to authenticate with the ClickHouse database."
|
|
287
|
+
)
|
|
288
|
+
|
|
289
|
+
host = parsed_uri.hostname
|
|
290
|
+
if not host:
|
|
291
|
+
raise ValueError(
|
|
292
|
+
"The hostname or IP address of the ClickHouse server is required to establish a connection."
|
|
293
|
+
)
|
|
294
|
+
|
|
295
|
+
port = parsed_uri.port
|
|
296
|
+
if not port:
|
|
297
|
+
raise ValueError(
|
|
298
|
+
"The TCP port of the ClickHouse server is required to establish a connection."
|
|
299
|
+
)
|
|
300
|
+
|
|
301
|
+
query_params = parse_qs(parsed_uri.query)
|
|
302
|
+
http_port = (
|
|
303
|
+
int(query_params["http_port"][0]) if "http_port" in query_params else 8123
|
|
304
|
+
)
|
|
305
|
+
|
|
306
|
+
credentials = ClickHouseCredentials(
|
|
307
|
+
{
|
|
308
|
+
"host": host,
|
|
309
|
+
"port": port,
|
|
310
|
+
"username": username,
|
|
311
|
+
"password": password,
|
|
312
|
+
"database": database,
|
|
313
|
+
"http_port": http_port,
|
|
314
|
+
"secure": 0,
|
|
315
|
+
}
|
|
316
|
+
)
|
|
317
|
+
|
|
318
|
+
return dlt.destinations.clickhouse(credentials=credentials)
|
|
319
|
+
|
|
320
|
+
def dlt_run_params(self, uri: str, table: str, **kwargs) -> dict:
|
|
321
|
+
table_fields = table.split(".")
|
|
322
|
+
if len(table_fields) != 2:
|
|
323
|
+
raise ValueError("Table name must be in the format <schema>.<table>")
|
|
324
|
+
return {
|
|
325
|
+
"table_name": table_fields[-1],
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
def post_load(self):
|
|
329
|
+
pass
|
|
@@ -6,6 +6,7 @@ from dlt.common.destination import Destination
|
|
|
6
6
|
from ingestr.src.destinations import (
|
|
7
7
|
AthenaDestination,
|
|
8
8
|
BigQueryDestination,
|
|
9
|
+
ClickhouseDestination,
|
|
9
10
|
CsvDestination,
|
|
10
11
|
DatabricksDestination,
|
|
11
12
|
DuckDBDestination,
|
|
@@ -146,6 +147,8 @@ class SourceDestinationFactory:
|
|
|
146
147
|
"synapse": SynapseDestination,
|
|
147
148
|
"csv": CsvDestination,
|
|
148
149
|
"athena": AthenaDestination,
|
|
150
|
+
"clickhouse+native": ClickhouseDestination,
|
|
151
|
+
"clickhouse": ClickhouseDestination,
|
|
149
152
|
}
|
|
150
153
|
|
|
151
154
|
def __init__(self, source_uri: str, destination_uri: str):
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.13.1"
|