ingestr 0.13.34__tar.gz → 0.13.35__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.34 → ingestr-0.13.35}/PKG-INFO +2 -2
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/airtable.md +10 -7
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/athena.md +0 -2
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/airtable/__init__.py +3 -2
- ingestr-0.13.35/ingestr/src/buildinfo.py +1 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/destinations.py +14 -6
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/sources.py +15 -6
- {ingestr-0.13.34 → ingestr-0.13.35}/requirements.in +1 -1
- {ingestr-0.13.34 → ingestr-0.13.35}/requirements.txt +1 -1
- {ingestr-0.13.34 → ingestr-0.13.35}/requirements_arm64.txt +1 -1
- ingestr-0.13.34/ingestr/src/buildinfo.py +0 -1
- {ingestr-0.13.34 → ingestr-0.13.35}/.dockerignore +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/.githooks/pre-commit-hook.sh +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/.github/workflows/deploy-docs.yml +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/.github/workflows/release.yml +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/.github/workflows/secrets-scan.yml +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/.github/workflows/tests.yml +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/.gitignore +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/.gitleaksignore +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/.python-version +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/.vale.ini +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/Dockerfile +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/LICENSE.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/Makefile +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/README.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/.vitepress/config.mjs +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/.vitepress/theme/custom.css +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/.vitepress/theme/index.js +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/commands/example-uris.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/commands/ingest.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/getting-started/core-concepts.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/getting-started/incremental-loading.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/getting-started/quickstart.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/getting-started/telemetry.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/index.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/media/applovin_max.png +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/media/athena.png +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/media/clickhouse_img.png +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/media/github.png +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/media/googleanalytics.png +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/media/kinesis.bigquery.png +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/media/linkedin_ads.png +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/media/personio.png +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/media/personio_duckdb.png +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/media/pipedrive.png +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/media/stripe_postgres.png +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/media/tiktok.png +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/adjust.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/applovin.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/applovin_max.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/appsflyer.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/appstore.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/asana.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/bigquery.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/chess.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/clickhouse.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/csv.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/custom_queries.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/databricks.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/db2.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/duckdb.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/dynamodb.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/facebook-ads.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/frankfurter.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/gcs.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/github.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/google-ads.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/google_analytics.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/gorgias.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/gsheets.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/hubspot.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/kafka.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/kinesis.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/klaviyo.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/linkedin_ads.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/mongodb.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/mssql.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/mysql.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/notion.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/oracle.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/personio.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/pipedrive.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/postgres.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/redshift.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/s3.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/salesforce.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/sap-hana.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/shopify.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/slack.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/snowflake.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/sqlite.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/stripe.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/tiktok-ads.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/supported-sources/zendesk.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/tutorials/load-kinesis-bigquery.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/tutorials/load-personio-duckdb.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/docs/tutorials/load-stripe-postgres.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/conftest.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/main.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/.gitignore +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/adjust/__init__.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/adjust/adjust_helpers.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/applovin/__init__.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/applovin_max/__init__.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/appsflyer/__init__.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/appsflyer/client.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/appstore/__init__.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/appstore/client.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/appstore/errors.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/appstore/models.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/appstore/resources.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/arrow/__init__.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/asana_source/__init__.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/asana_source/helpers.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/asana_source/settings.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/blob.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/chess/__init__.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/chess/helpers.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/chess/settings.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/collector/spinner.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/dynamodb/__init__.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/errors.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/facebook_ads/__init__.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/facebook_ads/exceptions.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/facebook_ads/helpers.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/facebook_ads/settings.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/factory.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/filesystem/__init__.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/filesystem/helpers.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/filesystem/readers.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/filters.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/frankfurter/__init__.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/frankfurter/helpers.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/github/__init__.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/github/helpers.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/github/queries.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/github/settings.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/google_ads/__init__.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/google_ads/field.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/google_ads/metrics.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/google_ads/predicates.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/google_ads/reports.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/google_analytics/__init__.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/google_analytics/helpers.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/google_sheets/README.md +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/google_sheets/__init__.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/gorgias/__init__.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/gorgias/helpers.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/hubspot/__init__.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/hubspot/helpers.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/hubspot/settings.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/kafka/__init__.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/kafka/helpers.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/kinesis/__init__.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/kinesis/helpers.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/klaviyo/__init__.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/klaviyo/client.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/klaviyo/helpers.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/linkedin_ads/__init__.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/linkedin_ads/helpers.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/loader.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/mongodb/__init__.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/mongodb/helpers.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/notion/__init__.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/notion/helpers/__init__.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/notion/helpers/client.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/notion/helpers/database.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/notion/settings.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/partition.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/personio/__init__.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/personio/helpers.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/pipedrive/__init__.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/pipedrive/helpers/__init__.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/pipedrive/helpers/custom_fields_munger.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/pipedrive/helpers/pages.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/pipedrive/settings.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/pipedrive/typing.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/resource.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/salesforce/__init__.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/salesforce/helpers.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/shopify/__init__.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/shopify/exceptions.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/shopify/helpers.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/shopify/settings.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/slack/__init__.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/slack/helpers.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/slack/settings.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/sql_database/__init__.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/sql_database/callbacks.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/stripe_analytics/__init__.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/stripe_analytics/helpers.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/stripe_analytics/settings.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/table_definition.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/telemetry/event.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/testdata/fakebqcredentials.json +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/tiktok_ads/__init__.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/time.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/version.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/zendesk/__init__.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/zendesk/helpers/__init__.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/zendesk/helpers/credentials.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/src/zendesk/settings.py +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/testdata/.gitignore +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/testdata/create_replace.csv +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/testdata/delete_insert_expected.csv +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/testdata/delete_insert_part1.csv +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/testdata/delete_insert_part2.csv +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/testdata/merge_expected.csv +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/testdata/merge_part1.csv +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/ingestr/testdata/merge_part2.csv +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/package-lock.json +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/package.json +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/pyproject.toml +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/requirements-dev.txt +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/resources/demo.gif +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/resources/demo.tape +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/resources/ingestr.svg +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/styles/Google/AMPM.yml +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/styles/Google/Acronyms.yml +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/styles/Google/Colons.yml +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/styles/Google/Contractions.yml +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/styles/Google/DateFormat.yml +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/styles/Google/Ellipses.yml +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/styles/Google/EmDash.yml +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/styles/Google/Exclamation.yml +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/styles/Google/FirstPerson.yml +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/styles/Google/Gender.yml +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/styles/Google/GenderBias.yml +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/styles/Google/HeadingPunctuation.yml +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/styles/Google/Headings.yml +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/styles/Google/Latin.yml +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/styles/Google/LyHyphens.yml +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/styles/Google/OptionalPlurals.yml +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/styles/Google/Ordinal.yml +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/styles/Google/OxfordComma.yml +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/styles/Google/Parens.yml +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/styles/Google/Passive.yml +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/styles/Google/Periods.yml +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/styles/Google/Quotes.yml +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/styles/Google/Ranges.yml +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/styles/Google/Semicolons.yml +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/styles/Google/Slang.yml +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/styles/Google/Spacing.yml +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/styles/Google/Spelling.yml +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/styles/Google/Units.yml +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/styles/Google/We.yml +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/styles/Google/Will.yml +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/styles/Google/WordList.yml +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/styles/Google/meta.json +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/styles/Google/vocab.txt +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/styles/bruin/Ingestr.yml +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/styles/config/vocabularies/bruin/accept.txt +0 -0
- {ingestr-0.13.34 → ingestr-0.13.35}/test.env.template +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ingestr
|
|
3
|
-
Version: 0.13.
|
|
3
|
+
Version: 0.13.35
|
|
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
|
|
@@ -46,7 +46,7 @@ Requires-Dist: databricks-sqlalchemy==1.0.2
|
|
|
46
46
|
Requires-Dist: dataclasses-json==0.6.7
|
|
47
47
|
Requires-Dist: decorator==5.2.1
|
|
48
48
|
Requires-Dist: deprecation==2.1.0
|
|
49
|
-
Requires-Dist: dlt==1.
|
|
49
|
+
Requires-Dist: dlt==1.10.0
|
|
50
50
|
Requires-Dist: dnspython==2.7.0
|
|
51
51
|
Requires-Dist: duckdb-engine==0.17.0
|
|
52
52
|
Requires-Dist: duckdb==1.2.1
|
|
@@ -9,12 +9,11 @@ ingestr supports Airtable as a source.
|
|
|
9
9
|
The URI format for Airtable is as follows:
|
|
10
10
|
|
|
11
11
|
```plaintext
|
|
12
|
-
airtable://?access_token=<access_token
|
|
12
|
+
airtable://?access_token=<access_token>
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
URI parameters:
|
|
16
16
|
|
|
17
|
-
- `base_id`: A unique identifier for an Airtable base.
|
|
18
17
|
- `access_token`: A personal access token for authentication with the Airtable API.
|
|
19
18
|
|
|
20
19
|
The URI is used to connect to the Airtable API for extracting data. More details on setting up Airtable integrations can be found [here](https://airtable.com/developers/web/api).
|
|
@@ -23,15 +22,19 @@ The URI is used to connect to the Airtable API for extracting data. More details
|
|
|
23
22
|
|
|
24
23
|
Airtable requires a few steps to set up an integration, please follow the guide dltHub [has built here](https://dlthub.com/docs/dlt-ecosystem/verified-sources/airtable#setup-guide).
|
|
25
24
|
|
|
26
|
-
Once you complete the guide, you should have an Access Token and Base
|
|
25
|
+
Once you complete the guide, you should have an Access Token and a Base ID. The source table you'll use for ingestr will be `<base_id>/<table_name>`.
|
|
26
|
+
|
|
27
|
+
Let's say your access token is `patr123.abc` and the base ID is `appXYZ`, here's a sample command that will copy the data from Airtable into a DuckDB database:
|
|
27
28
|
|
|
28
29
|
```sh
|
|
29
|
-
ingestr ingest
|
|
30
|
+
ingestr ingest
|
|
31
|
+
--source-uri 'airtable://?access_token=patr123.abc'
|
|
32
|
+
--source-table 'appXYZ/employee'
|
|
33
|
+
--dest-uri 'duckdb:///airtable.duckdb'
|
|
34
|
+
--dest-table 'des.employee'
|
|
30
35
|
```
|
|
31
36
|
|
|
32
|
-
The result of this command will be an `employee` table containing data from the `employee` source in the `
|
|
33
|
-
|
|
34
|
-
The `source-table` can include multiple table names that share the same `base_id`, e.g. `--source-table 'employee,users'`, but this will merge all the data from the specified tables into a single destination table.
|
|
37
|
+
The result of this command will be an `employee` table containing data from the `employee` source in the `airtable.duckdb` database.
|
|
35
38
|
|
|
36
39
|
> [!CAUTION]
|
|
37
40
|
> Airtable does not support incremental loading, which means every time you run the command, the entire table will be copied from Airtable to the destination. This can be slow for large tables.
|
|
@@ -10,7 +10,6 @@ The URI format for Athena is as follows:
|
|
|
10
10
|
|
|
11
11
|
```plaintext
|
|
12
12
|
athena://?bucket=<your-destination-bucket> \
|
|
13
|
-
query_results_path=<your-query-results-location> \
|
|
14
13
|
access_key_id=<your-aws-access-key-id> \
|
|
15
14
|
secret_access_key=<your-aws-secret-access-key> \
|
|
16
15
|
region_name=<your-aws-region>
|
|
@@ -20,7 +19,6 @@ URI parameters:
|
|
|
20
19
|
- `access_key_id` and `secret_access_key` (required): These are AWS credentials that will be used to authenticate with AWS services like S3 and Athena.
|
|
21
20
|
- `session_token` (optional): The session token for temporary credentials.
|
|
22
21
|
- `region_name` (required if there's no local profile found): The AWS region of the Athena service and S3 buckets, e.g. `eu-central-1`
|
|
23
|
-
- `query_results_path` (optional): The query location path where the results of Athena queries will be saved, e.g. `dest_path` or `s3://dest_path`. If not provided, it will default to the bucket specified in the `bucket` parameter.
|
|
24
22
|
- `workgroup` (optional): The name of the Athena workgroup, e.g. `my_group`
|
|
25
23
|
- `profile` (optional): The name of the AWS profile to use, e.g. `my_profile`
|
|
26
24
|
|
|
@@ -9,7 +9,7 @@ import pyairtable
|
|
|
9
9
|
from dlt.sources import DltResource
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
@dlt.source
|
|
12
|
+
@dlt.source(max_table_nesting=1)
|
|
13
13
|
def airtable_source(
|
|
14
14
|
base_id: str = dlt.config.value,
|
|
15
15
|
table_names: Optional[List[str]] = dlt.config.value,
|
|
@@ -50,12 +50,13 @@ def airtable_resource(
|
|
|
50
50
|
It starts with "app". See https://support.airtable.com/docs/finding-airtable-ids
|
|
51
51
|
table (Dict[str, Any]): Metadata about an airtable, does not contain the actual records
|
|
52
52
|
"""
|
|
53
|
+
|
|
53
54
|
primary_key_id = table["primaryFieldId"]
|
|
54
55
|
primary_key_field = [
|
|
55
56
|
field for field in table["fields"] if field["id"] == primary_key_id
|
|
56
57
|
][0]
|
|
57
58
|
table_name: str = table["name"]
|
|
58
|
-
primary_key: List[str] = [f"fields__{primary_key_field['name']}"]
|
|
59
|
+
primary_key: List[str] = [f"fields__{primary_key_field['name']}".lower()]
|
|
59
60
|
air_table = api.table(base_id, table["id"])
|
|
60
61
|
|
|
61
62
|
# Table.iterate() supports rich customization options, such as chunk size, fields, cell format, timezone, locale, and view
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
version = "v0.13.35"
|
|
@@ -235,12 +235,19 @@ class AthenaDestination:
|
|
|
235
235
|
if not bucket.startswith("s3://"):
|
|
236
236
|
bucket = f"s3://{bucket}"
|
|
237
237
|
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
238
|
+
bucket = bucket.rstrip("/")
|
|
239
|
+
|
|
240
|
+
dest_table = kwargs.get("dest_table", None)
|
|
241
|
+
if not dest_table:
|
|
242
|
+
raise ValueError("A destination table is required to connect to Athena.")
|
|
243
|
+
|
|
244
|
+
dest_table_fields = dest_table.split(".")
|
|
245
|
+
if len(dest_table_fields) != 2:
|
|
246
|
+
raise ValueError(
|
|
247
|
+
f"Table name must be in the format <schema>.<table>, given: {dest_table}"
|
|
248
|
+
)
|
|
249
|
+
|
|
250
|
+
query_result_path = f"{bucket}/{dest_table_fields[0]}_staging/metadata"
|
|
244
251
|
|
|
245
252
|
access_key_id = source_params.get("access_key_id", [None])[0]
|
|
246
253
|
secret_access_key = source_params.get("secret_access_key", [None])[0]
|
|
@@ -285,6 +292,7 @@ class AthenaDestination:
|
|
|
285
292
|
region_name=region_name,
|
|
286
293
|
),
|
|
287
294
|
destination_name=bucket,
|
|
295
|
+
force_iceberg=True,
|
|
288
296
|
)
|
|
289
297
|
|
|
290
298
|
def dlt_run_params(self, uri: str, table: str, **kwargs) -> dict:
|
|
@@ -852,22 +852,31 @@ class AirtableSource:
|
|
|
852
852
|
if not table:
|
|
853
853
|
raise ValueError("Source table is required to connect to Airtable")
|
|
854
854
|
|
|
855
|
-
tables = table.split(",")
|
|
856
|
-
|
|
857
855
|
source_parts = urlparse(uri)
|
|
858
856
|
source_fields = parse_qs(source_parts.query)
|
|
859
|
-
base_id = source_fields.get("base_id")
|
|
860
857
|
access_token = source_fields.get("access_token")
|
|
861
858
|
|
|
862
|
-
if not
|
|
859
|
+
if not access_token:
|
|
863
860
|
raise ValueError(
|
|
864
|
-
"
|
|
861
|
+
"access_token in the URI is required to connect to Airtable"
|
|
865
862
|
)
|
|
866
863
|
|
|
864
|
+
base_id = source_fields.get("base_id", [None])[0]
|
|
865
|
+
clean_table = table
|
|
866
|
+
|
|
867
|
+
table_fields = table.split("/")
|
|
868
|
+
if len(table_fields) == 2:
|
|
869
|
+
clean_table = table_fields[1]
|
|
870
|
+
if not base_id:
|
|
871
|
+
base_id = table_fields[0]
|
|
872
|
+
|
|
873
|
+
if not base_id:
|
|
874
|
+
raise ValueError("base_id in the URI is required to connect to Airtable")
|
|
875
|
+
|
|
867
876
|
from ingestr.src.airtable import airtable_source
|
|
868
877
|
|
|
869
878
|
return airtable_source(
|
|
870
|
-
base_id=base_id
|
|
879
|
+
base_id=base_id, table_names=[clean_table], access_token=access_token[0]
|
|
871
880
|
)
|
|
872
881
|
|
|
873
882
|
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
version = "v0.13.34"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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
|