ingestr 0.13.32__tar.gz → 0.13.34__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/.gitleaksignore +3 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/PKG-INFO +1 -1
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/bigquery.md +12 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/hubspot.md +20 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/main.py +15 -5
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/airtable/__init__.py +1 -1
- ingestr-0.13.34/ingestr/src/buildinfo.py +1 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/destinations.py +20 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/filters.py +2 -3
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/hubspot/__init__.py +11 -2
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/hubspot/helpers.py +0 -4
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/partition.py +2 -1
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/sources.py +141 -81
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/telemetry/event.py +10 -9
- ingestr-0.13.32/.gitleaksignore +0 -3
- ingestr-0.13.32/ingestr/src/buildinfo.py +0 -1
- {ingestr-0.13.32 → ingestr-0.13.34}/.dockerignore +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/.githooks/pre-commit-hook.sh +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/.github/workflows/deploy-docs.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/.github/workflows/release.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/.github/workflows/secrets-scan.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/.github/workflows/tests.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/.gitignore +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/.python-version +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/.vale.ini +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/Dockerfile +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/LICENSE.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/Makefile +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/README.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/.vitepress/config.mjs +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/.vitepress/theme/custom.css +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/.vitepress/theme/index.js +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/commands/example-uris.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/commands/ingest.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/getting-started/core-concepts.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/getting-started/incremental-loading.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/getting-started/quickstart.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/getting-started/telemetry.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/index.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/media/applovin_max.png +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/media/athena.png +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/media/clickhouse_img.png +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/media/github.png +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/media/googleanalytics.png +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/media/kinesis.bigquery.png +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/media/linkedin_ads.png +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/media/personio.png +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/media/personio_duckdb.png +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/media/pipedrive.png +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/media/stripe_postgres.png +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/media/tiktok.png +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/adjust.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/airtable.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/applovin.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/applovin_max.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/appsflyer.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/appstore.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/asana.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/athena.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/chess.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/clickhouse.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/csv.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/custom_queries.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/databricks.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/db2.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/duckdb.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/dynamodb.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/facebook-ads.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/frankfurter.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/gcs.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/github.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/google-ads.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/google_analytics.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/gorgias.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/gsheets.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/kafka.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/kinesis.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/klaviyo.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/linkedin_ads.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/mongodb.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/mssql.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/mysql.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/notion.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/oracle.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/personio.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/pipedrive.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/postgres.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/redshift.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/s3.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/salesforce.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/sap-hana.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/shopify.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/slack.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/snowflake.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/sqlite.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/stripe.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/tiktok-ads.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/supported-sources/zendesk.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/tutorials/load-kinesis-bigquery.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/tutorials/load-personio-duckdb.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/docs/tutorials/load-stripe-postgres.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/conftest.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/.gitignore +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/adjust/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/adjust/adjust_helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/applovin/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/applovin_max/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/appsflyer/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/appsflyer/client.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/appstore/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/appstore/client.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/appstore/errors.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/appstore/models.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/appstore/resources.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/arrow/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/asana_source/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/asana_source/helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/asana_source/settings.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/blob.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/chess/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/chess/helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/chess/settings.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/collector/spinner.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/dynamodb/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/errors.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/facebook_ads/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/facebook_ads/exceptions.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/facebook_ads/helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/facebook_ads/settings.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/factory.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/filesystem/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/filesystem/helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/filesystem/readers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/frankfurter/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/frankfurter/helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/github/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/github/helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/github/queries.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/github/settings.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/google_ads/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/google_ads/field.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/google_ads/metrics.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/google_ads/predicates.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/google_ads/reports.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/google_analytics/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/google_analytics/helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/google_sheets/README.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/google_sheets/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/gorgias/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/gorgias/helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/hubspot/settings.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/kafka/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/kafka/helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/kinesis/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/kinesis/helpers.py +0 -0
- /ingestr-0.13.32/ingestr/src/klaviyo/_init_.py → /ingestr-0.13.34/ingestr/src/klaviyo/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/klaviyo/client.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/klaviyo/helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/linkedin_ads/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/linkedin_ads/helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/loader.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/mongodb/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/mongodb/helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/notion/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/notion/helpers/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/notion/helpers/client.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/notion/helpers/database.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/notion/settings.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/personio/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/personio/helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/pipedrive/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/pipedrive/helpers/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/pipedrive/helpers/custom_fields_munger.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/pipedrive/helpers/pages.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/pipedrive/settings.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/pipedrive/typing.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/resource.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/salesforce/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/salesforce/helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/shopify/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/shopify/exceptions.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/shopify/helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/shopify/settings.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/slack/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/slack/helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/slack/settings.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/sql_database/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/sql_database/callbacks.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/stripe_analytics/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/stripe_analytics/helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/stripe_analytics/settings.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/table_definition.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/testdata/fakebqcredentials.json +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/tiktok_ads/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/time.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/version.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/zendesk/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/zendesk/helpers/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/zendesk/helpers/credentials.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/src/zendesk/settings.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/testdata/.gitignore +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/testdata/create_replace.csv +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/testdata/delete_insert_expected.csv +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/testdata/delete_insert_part1.csv +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/testdata/delete_insert_part2.csv +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/testdata/merge_expected.csv +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/testdata/merge_part1.csv +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/ingestr/testdata/merge_part2.csv +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/package-lock.json +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/package.json +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/pyproject.toml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/requirements-dev.txt +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/requirements.in +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/requirements.txt +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/requirements_arm64.txt +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/resources/demo.gif +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/resources/demo.tape +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/resources/ingestr.svg +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/AMPM.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Acronyms.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Colons.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Contractions.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/DateFormat.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Ellipses.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/EmDash.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Exclamation.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/FirstPerson.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Gender.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/GenderBias.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/HeadingPunctuation.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Headings.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Latin.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/LyHyphens.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/OptionalPlurals.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Ordinal.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/OxfordComma.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Parens.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Passive.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Periods.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Quotes.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Ranges.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Semicolons.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Slang.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Spacing.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Spelling.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Units.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/We.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/Will.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/WordList.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/meta.json +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/styles/Google/vocab.txt +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/styles/bruin/Ingestr.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/styles/config/vocabularies/bruin/accept.txt +0 -0
- {ingestr-0.13.32 → ingestr-0.13.34}/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.34
|
|
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
|
|
@@ -17,4 +17,16 @@ URI parameters:
|
|
|
17
17
|
|
|
18
18
|
The same URI structure can be used both for sources and destinations. You can read more about SQLAlchemy's BigQuery dialect [here](https://github.com/googleapis/python-bigquery-sqlalchemy?tab=readme-ov-file#connection-string-parameters).
|
|
19
19
|
|
|
20
|
+
### Using GCS as a staging area
|
|
21
|
+
|
|
22
|
+
ingestr can use GCS as a staging area for BigQuery. To do this, you need to set the `--staging-bucket` flag when you are running the command.
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
ingestr ingest
|
|
26
|
+
--source-uri $SOURCE_URI
|
|
27
|
+
--dest-uri $BIGQUERY_URI
|
|
28
|
+
--source-table raw.input
|
|
29
|
+
--dest-table raw.output
|
|
30
|
+
--staging-bucket "gs://your-bucket-name" # [!code focus]
|
|
31
|
+
```
|
|
20
32
|
|
|
@@ -42,3 +42,23 @@ HubSpot source allows ingesting the following sources into separate tables:
|
|
|
42
42
|
- `contacts`: Retrieves information about visitors, potential customers, and leads.
|
|
43
43
|
|
|
44
44
|
Use these as `--source-table` parameter in the `ingestr ingest` command.
|
|
45
|
+
|
|
46
|
+
## Custom Objects
|
|
47
|
+
|
|
48
|
+
HubSpot custom objects are supported by using the `custom` table.
|
|
49
|
+
|
|
50
|
+
The format for the custom object is as follows:
|
|
51
|
+
|
|
52
|
+
```plaintext
|
|
53
|
+
custom:<custom_object_name>:<optional associations>
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
For example, to ingest the `course` custom object with the `contacts` and `companies` associations, the format would be:
|
|
57
|
+
|
|
58
|
+
```plaintext
|
|
59
|
+
custom:course:contacts,companies
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
This would pull all the data for the `course` custom object and include the `contacts` and `companies` associations in the resulting table.
|
|
63
|
+
|
|
64
|
+
|
|
@@ -264,6 +264,13 @@ def ingest(
|
|
|
264
264
|
envvar=["YIELD_LIMIT", "INGESTR_YIELD_LIMIT"],
|
|
265
265
|
),
|
|
266
266
|
] = None, # type: ignore
|
|
267
|
+
staging_bucket: Annotated[
|
|
268
|
+
Optional[str],
|
|
269
|
+
typer.Option(
|
|
270
|
+
help="The staging bucket to be used for the ingestion, must be prefixed with 'gs://' or 's3://'",
|
|
271
|
+
envvar=["STAGING_BUCKET", "INGESTR_STAGING_BUCKET"],
|
|
272
|
+
),
|
|
273
|
+
] = None, # type: ignore
|
|
267
274
|
):
|
|
268
275
|
import hashlib
|
|
269
276
|
import tempfile
|
|
@@ -272,8 +279,6 @@ def ingest(
|
|
|
272
279
|
import dlt
|
|
273
280
|
import humanize
|
|
274
281
|
import typer
|
|
275
|
-
from dlt.common.data_types import TDataType
|
|
276
|
-
from dlt.common.destination import Destination
|
|
277
282
|
from dlt.common.pipeline import LoadInfo
|
|
278
283
|
from dlt.common.runtime.collector import Collector, LogCollector
|
|
279
284
|
from dlt.common.schema.typing import TColumnSchema
|
|
@@ -318,7 +323,7 @@ def ingest(
|
|
|
318
323
|
return (source_table, dest_table)
|
|
319
324
|
|
|
320
325
|
def validate_loader_file_format(
|
|
321
|
-
dlt_dest
|
|
326
|
+
dlt_dest, loader_file_format: Optional[LoaderFileFormat]
|
|
322
327
|
):
|
|
323
328
|
if (
|
|
324
329
|
loader_file_format
|
|
@@ -330,9 +335,11 @@ def ingest(
|
|
|
330
335
|
)
|
|
331
336
|
raise typer.Abort()
|
|
332
337
|
|
|
333
|
-
def parse_columns(columns: list[str]) -> dict
|
|
338
|
+
def parse_columns(columns: list[str]) -> dict:
|
|
334
339
|
from typing import cast, get_args
|
|
335
340
|
|
|
341
|
+
from dlt.common.data_types import TDataType
|
|
342
|
+
|
|
336
343
|
possible_types = get_args(TDataType)
|
|
337
344
|
|
|
338
345
|
types: dict[str, TDataType] = {}
|
|
@@ -417,7 +424,9 @@ def ingest(
|
|
|
417
424
|
pipelines_dir = tempfile.mkdtemp()
|
|
418
425
|
is_pipelines_dir_temp = True
|
|
419
426
|
|
|
420
|
-
dlt_dest = destination.dlt_dest(
|
|
427
|
+
dlt_dest = destination.dlt_dest(
|
|
428
|
+
uri=dest_uri, dest_table=dest_table, staging_bucket=staging_bucket
|
|
429
|
+
)
|
|
421
430
|
validate_loader_file_format(dlt_dest, loader_file_format)
|
|
422
431
|
|
|
423
432
|
if partition_by:
|
|
@@ -566,6 +575,7 @@ def ingest(
|
|
|
566
575
|
**destination.dlt_run_params(
|
|
567
576
|
uri=dest_uri,
|
|
568
577
|
table=dest_table,
|
|
578
|
+
staging_bucket=staging_bucket,
|
|
569
579
|
),
|
|
570
580
|
write_disposition=write_disposition, # type: ignore
|
|
571
581
|
primary_key=(primary_key if primary_key and len(primary_key) > 0 else None), # type: ignore
|
|
@@ -55,7 +55,7 @@ def airtable_resource(
|
|
|
55
55
|
field for field in table["fields"] if field["id"] == primary_key_id
|
|
56
56
|
][0]
|
|
57
57
|
table_name: str = table["name"]
|
|
58
|
-
primary_key: List[str] = [primary_key_field[
|
|
58
|
+
primary_key: List[str] = [f"fields__{primary_key_field['name']}"]
|
|
59
59
|
air_table = api.table(base_id, table["id"])
|
|
60
60
|
|
|
61
61
|
# Table.iterate() supports rich customization options, such as chunk size, fields, cell format, timezone, locale, and view
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
version = "v0.13.34"
|
|
@@ -60,6 +60,22 @@ class BigQueryDestination:
|
|
|
60
60
|
base64.b64decode(credentials_base64[0]).decode("utf-8")
|
|
61
61
|
)
|
|
62
62
|
|
|
63
|
+
staging_bucket = kwargs.get("staging_bucket", None)
|
|
64
|
+
if staging_bucket:
|
|
65
|
+
if not staging_bucket.startswith("gs://"):
|
|
66
|
+
raise ValueError("Staging bucket must start with gs://")
|
|
67
|
+
|
|
68
|
+
os.environ["DESTINATION__FILESYSTEM__BUCKET_URL"] = staging_bucket
|
|
69
|
+
os.environ["DESTINATION__FILESYSTEM__CREDENTIALS__PROJECT_ID"] = (
|
|
70
|
+
credentials.get("project_id", None)
|
|
71
|
+
)
|
|
72
|
+
os.environ["DESTINATION__FILESYSTEM__CREDENTIALS__PRIVATE_KEY"] = (
|
|
73
|
+
credentials.get("private_key", None)
|
|
74
|
+
)
|
|
75
|
+
os.environ["DESTINATION__FILESYSTEM__CREDENTIALS__CLIENT_EMAIL"] = (
|
|
76
|
+
credentials.get("client_email", None)
|
|
77
|
+
)
|
|
78
|
+
|
|
63
79
|
project_id = None
|
|
64
80
|
if source_fields.hostname:
|
|
65
81
|
project_id = source_fields.hostname
|
|
@@ -83,6 +99,10 @@ class BigQueryDestination:
|
|
|
83
99
|
"table_name": table_fields[-1],
|
|
84
100
|
}
|
|
85
101
|
|
|
102
|
+
staging_bucket = kwargs.get("staging_bucket", None)
|
|
103
|
+
if staging_bucket:
|
|
104
|
+
res["staging"] = "filesystem"
|
|
105
|
+
|
|
86
106
|
return res
|
|
87
107
|
|
|
88
108
|
def post_load(self):
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
from dlt.common.libs.sql_alchemy import Table
|
|
2
|
-
|
|
3
|
-
|
|
4
1
|
def cast_set_to_list(row):
|
|
5
2
|
# this handles just the sqlalchemy backend for now
|
|
6
3
|
if isinstance(row, dict):
|
|
@@ -32,6 +29,8 @@ def handle_mysql_empty_dates(row):
|
|
|
32
29
|
|
|
33
30
|
|
|
34
31
|
def table_adapter_exclude_columns(cols: list[str]):
|
|
32
|
+
from dlt.common.libs.sql_alchemy import Table
|
|
33
|
+
|
|
35
34
|
def excluder(table: Table):
|
|
36
35
|
cols_to_remove = [col for col in table._columns if col.name in cols] # type: ignore
|
|
37
36
|
for col in cols_to_remove:
|
|
@@ -197,11 +197,18 @@ def hubspot(
|
|
|
197
197
|
api_key: str = api_key,
|
|
198
198
|
custom_object_name: str = custom_object,
|
|
199
199
|
) -> Iterator[TDataItems]:
|
|
200
|
-
|
|
200
|
+
custom_objects = fetch_data_raw(CRM_SCHEMAS_ENDPOINT, api_key)
|
|
201
201
|
object_type_id = None
|
|
202
|
+
associations = None
|
|
203
|
+
if ":" in custom_object_name:
|
|
204
|
+
fields = custom_object_name.split(":")
|
|
205
|
+
if len(fields) == 2:
|
|
206
|
+
custom_object_name = fields[0]
|
|
207
|
+
associations = fields[1]
|
|
202
208
|
|
|
203
209
|
custom_object_lowercase = custom_object_name.lower()
|
|
204
|
-
|
|
210
|
+
|
|
211
|
+
for custom_object in custom_objects["results"]:
|
|
205
212
|
if custom_object["name"].lower() == custom_object_lowercase:
|
|
206
213
|
object_type_id = custom_object["objectTypeId"]
|
|
207
214
|
break
|
|
@@ -223,6 +230,8 @@ def hubspot(
|
|
|
223
230
|
props = ",".join(sorted(list(set(props))))
|
|
224
231
|
|
|
225
232
|
custom_object_endpoint = f"crm/v3/objects/{object_type_id}/?properties={props}"
|
|
233
|
+
if associations:
|
|
234
|
+
custom_object_endpoint += f"&associations={associations}"
|
|
226
235
|
|
|
227
236
|
"""Hubspot custom object details resource"""
|
|
228
237
|
yield from fetch_data(custom_object_endpoint, api_key, resource_name="custom")
|
|
@@ -148,10 +148,6 @@ def fetch_data(
|
|
|
148
148
|
"updatedAt": _result.get("updatedAt", ""),
|
|
149
149
|
}
|
|
150
150
|
)
|
|
151
|
-
elif resource_name == "custom":
|
|
152
|
-
_objects.append(
|
|
153
|
-
_result.get("properties", ""),
|
|
154
|
-
)
|
|
155
151
|
else:
|
|
156
152
|
_obj = _result.get("properties", _result)
|
|
157
153
|
if "id" not in _obj and "id" in _result:
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from typing import Dict
|
|
2
2
|
|
|
3
3
|
from dlt.common.schema.typing import TColumnSchema
|
|
4
|
-
from dlt.destinations.adapters import athena_adapter, athena_partition
|
|
5
4
|
from dlt.sources import DltResource, DltSource
|
|
6
5
|
|
|
7
6
|
import ingestr.src.resource as resource
|
|
@@ -12,6 +11,8 @@ def apply_athena_hints(
|
|
|
12
11
|
partition_column: str,
|
|
13
12
|
additional_hints: Dict[str, TColumnSchema] = {},
|
|
14
13
|
) -> None:
|
|
14
|
+
from dlt.destinations.adapters import athena_adapter, athena_partition
|
|
15
|
+
|
|
15
16
|
def _apply_partition_hint(resource: DltResource) -> None:
|
|
16
17
|
columns = resource.columns if resource.columns else {}
|
|
17
18
|
|