ingestr 0.13.32__tar.gz → 0.13.33__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.33/.gitleaksignore +3 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/PKG-INFO +1 -1
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/bigquery.md +12 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/main.py +15 -5
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/airtable/__init__.py +1 -1
- ingestr-0.13.33/ingestr/src/buildinfo.py +1 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/destinations.py +20 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/filters.py +2 -3
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/partition.py +2 -1
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/sources.py +131 -76
- {ingestr-0.13.32 → ingestr-0.13.33}/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.33}/.dockerignore +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/.githooks/pre-commit-hook.sh +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/.github/workflows/deploy-docs.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/.github/workflows/release.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/.github/workflows/secrets-scan.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/.github/workflows/tests.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/.gitignore +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/.python-version +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/.vale.ini +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/Dockerfile +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/LICENSE.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/Makefile +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/README.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/.vitepress/config.mjs +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/.vitepress/theme/custom.css +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/.vitepress/theme/index.js +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/commands/example-uris.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/commands/ingest.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/getting-started/core-concepts.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/getting-started/incremental-loading.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/getting-started/quickstart.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/getting-started/telemetry.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/index.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/media/applovin_max.png +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/media/athena.png +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/media/clickhouse_img.png +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/media/github.png +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/media/googleanalytics.png +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/media/kinesis.bigquery.png +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/media/linkedin_ads.png +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/media/personio.png +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/media/personio_duckdb.png +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/media/pipedrive.png +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/media/stripe_postgres.png +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/media/tiktok.png +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/adjust.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/airtable.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/applovin.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/applovin_max.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/appsflyer.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/appstore.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/asana.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/athena.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/chess.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/clickhouse.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/csv.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/custom_queries.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/databricks.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/db2.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/duckdb.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/dynamodb.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/facebook-ads.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/frankfurter.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/gcs.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/github.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/google-ads.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/google_analytics.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/gorgias.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/gsheets.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/hubspot.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/kafka.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/kinesis.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/klaviyo.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/linkedin_ads.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/mongodb.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/mssql.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/mysql.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/notion.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/oracle.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/personio.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/pipedrive.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/postgres.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/redshift.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/s3.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/salesforce.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/sap-hana.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/shopify.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/slack.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/snowflake.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/sqlite.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/stripe.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/tiktok-ads.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/supported-sources/zendesk.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/tutorials/load-kinesis-bigquery.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/tutorials/load-personio-duckdb.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/docs/tutorials/load-stripe-postgres.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/conftest.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/.gitignore +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/adjust/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/adjust/adjust_helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/applovin/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/applovin_max/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/appsflyer/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/appsflyer/client.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/appstore/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/appstore/client.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/appstore/errors.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/appstore/models.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/appstore/resources.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/arrow/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/asana_source/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/asana_source/helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/asana_source/settings.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/blob.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/chess/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/chess/helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/chess/settings.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/collector/spinner.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/dynamodb/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/errors.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/facebook_ads/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/facebook_ads/exceptions.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/facebook_ads/helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/facebook_ads/settings.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/factory.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/filesystem/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/filesystem/helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/filesystem/readers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/frankfurter/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/frankfurter/helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/github/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/github/helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/github/queries.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/github/settings.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/google_ads/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/google_ads/field.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/google_ads/metrics.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/google_ads/predicates.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/google_ads/reports.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/google_analytics/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/google_analytics/helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/google_sheets/README.md +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/google_sheets/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/gorgias/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/gorgias/helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/hubspot/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/hubspot/helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/hubspot/settings.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/kafka/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/kafka/helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/kinesis/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/kinesis/helpers.py +0 -0
- /ingestr-0.13.32/ingestr/src/klaviyo/_init_.py → /ingestr-0.13.33/ingestr/src/klaviyo/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/klaviyo/client.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/klaviyo/helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/linkedin_ads/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/linkedin_ads/helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/loader.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/mongodb/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/mongodb/helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/notion/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/notion/helpers/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/notion/helpers/client.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/notion/helpers/database.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/notion/settings.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/personio/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/personio/helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/pipedrive/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/pipedrive/helpers/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/pipedrive/helpers/custom_fields_munger.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/pipedrive/helpers/pages.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/pipedrive/settings.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/pipedrive/typing.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/resource.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/salesforce/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/salesforce/helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/shopify/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/shopify/exceptions.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/shopify/helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/shopify/settings.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/slack/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/slack/helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/slack/settings.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/sql_database/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/sql_database/callbacks.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/stripe_analytics/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/stripe_analytics/helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/stripe_analytics/settings.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/table_definition.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/testdata/fakebqcredentials.json +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/tiktok_ads/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/time.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/version.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/zendesk/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/zendesk/helpers/__init__.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/zendesk/helpers/credentials.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/src/zendesk/settings.py +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/testdata/.gitignore +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/testdata/create_replace.csv +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/testdata/delete_insert_expected.csv +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/testdata/delete_insert_part1.csv +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/testdata/delete_insert_part2.csv +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/testdata/merge_expected.csv +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/testdata/merge_part1.csv +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/ingestr/testdata/merge_part2.csv +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/package-lock.json +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/package.json +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/pyproject.toml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/requirements-dev.txt +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/requirements.in +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/requirements.txt +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/requirements_arm64.txt +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/resources/demo.gif +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/resources/demo.tape +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/resources/ingestr.svg +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/AMPM.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Acronyms.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Colons.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Contractions.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/DateFormat.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Ellipses.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/EmDash.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Exclamation.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/FirstPerson.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Gender.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/GenderBias.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/HeadingPunctuation.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Headings.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Latin.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/LyHyphens.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/OptionalPlurals.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Ordinal.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/OxfordComma.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Parens.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Passive.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Periods.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Quotes.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Ranges.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Semicolons.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Slang.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Spacing.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Spelling.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Units.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/We.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/Will.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/WordList.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/meta.json +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/styles/Google/vocab.txt +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/styles/bruin/Ingestr.yml +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/styles/config/vocabularies/bruin/accept.txt +0 -0
- {ingestr-0.13.32 → ingestr-0.13.33}/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.33
|
|
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
|
|
|
@@ -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.33"
|
|
@@ -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:
|
|
@@ -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
|
|
|
@@ -13,91 +13,37 @@ from typing import (
|
|
|
13
13
|
List,
|
|
14
14
|
Literal,
|
|
15
15
|
Optional,
|
|
16
|
+
TypeAlias,
|
|
16
17
|
Union,
|
|
17
18
|
)
|
|
18
19
|
from urllib.parse import ParseResult, parse_qs, quote, urlencode, urlparse
|
|
19
20
|
|
|
20
|
-
import dlt
|
|
21
21
|
import pendulum
|
|
22
|
-
from dlt.common.configuration.specs import (
|
|
23
|
-
AwsCredentials,
|
|
24
|
-
)
|
|
25
|
-
from dlt.common.libs.sql_alchemy import (
|
|
26
|
-
Engine,
|
|
27
|
-
MetaData,
|
|
28
|
-
)
|
|
29
22
|
from dlt.common.time import ensure_pendulum_datetime
|
|
30
|
-
from dlt.common.typing import TDataItem, TSecretStrValue
|
|
31
23
|
from dlt.extract import Incremental
|
|
24
|
+
from dlt.sources import incremental as dlt_incremental
|
|
32
25
|
from dlt.sources.credentials import (
|
|
33
26
|
ConnectionStringCredentials,
|
|
34
27
|
)
|
|
35
|
-
from dlt.sources.sql_database import sql_table
|
|
36
|
-
from dlt.sources.sql_database.helpers import TableLoader
|
|
37
|
-
from dlt.sources.sql_database.schema_types import (
|
|
38
|
-
ReflectionLevel,
|
|
39
|
-
SelectAny,
|
|
40
|
-
Table,
|
|
41
|
-
TTypeAdapter,
|
|
42
|
-
)
|
|
43
|
-
from sqlalchemy import Column
|
|
44
|
-
from sqlalchemy import types as sa
|
|
45
28
|
|
|
46
29
|
from ingestr.src import blob
|
|
47
|
-
from ingestr.src.adjust import REQUIRED_CUSTOM_DIMENSIONS, adjust_source
|
|
48
|
-
from ingestr.src.adjust.adjust_helpers import parse_filters
|
|
49
|
-
from ingestr.src.applovin import applovin_source
|
|
50
|
-
from ingestr.src.applovin_max import applovin_max_source
|
|
51
|
-
from ingestr.src.arrow import memory_mapped_arrow
|
|
52
|
-
from ingestr.src.chess import source
|
|
53
30
|
from ingestr.src.errors import (
|
|
54
31
|
InvalidBlobTableError,
|
|
55
32
|
MissingValueError,
|
|
56
33
|
UnsupportedResourceError,
|
|
57
34
|
)
|
|
58
|
-
from ingestr.src.facebook_ads import facebook_ads_source, facebook_insights_source
|
|
59
|
-
from ingestr.src.filesystem import readers
|
|
60
|
-
from ingestr.src.filters import table_adapter_exclude_columns
|
|
61
|
-
from ingestr.src.frankfurter import frankfurter_source
|
|
62
|
-
from ingestr.src.frankfurter.helpers import validate_dates
|
|
63
|
-
from ingestr.src.github import github_reactions, github_repo_events, github_stargazers
|
|
64
|
-
from ingestr.src.gorgias import gorgias_source
|
|
65
|
-
from ingestr.src.hubspot import hubspot
|
|
66
|
-
from ingestr.src.kafka import kafka_consumer
|
|
67
|
-
from ingestr.src.kafka.helpers import KafkaCredentials
|
|
68
|
-
from ingestr.src.klaviyo._init_ import klaviyo_source
|
|
69
|
-
from ingestr.src.linkedin_ads import linked_in_ads_source
|
|
70
|
-
from ingestr.src.linkedin_ads.dimension_time_enum import (
|
|
71
|
-
Dimension,
|
|
72
|
-
TimeGranularity,
|
|
73
|
-
)
|
|
74
|
-
from ingestr.src.notion import notion_databases
|
|
75
|
-
from ingestr.src.personio import personio_source
|
|
76
|
-
from ingestr.src.shopify import shopify_source
|
|
77
|
-
from ingestr.src.slack import slack_source
|
|
78
|
-
from ingestr.src.sql_database.callbacks import (
|
|
79
|
-
chained_query_adapter_callback,
|
|
80
|
-
custom_query_variable_subsitution,
|
|
81
|
-
limit_callback,
|
|
82
|
-
type_adapter_callback,
|
|
83
|
-
)
|
|
84
35
|
from ingestr.src.table_definition import TableDefinition, table_string_to_dataclass
|
|
85
|
-
from ingestr.src.tiktok_ads import tiktok_source
|
|
86
|
-
from ingestr.src.time import isotime
|
|
87
|
-
from ingestr.src.zendesk import zendesk_chat, zendesk_support, zendesk_talk
|
|
88
|
-
from ingestr.src.zendesk.helpers.credentials import (
|
|
89
|
-
ZendeskCredentialsOAuth,
|
|
90
|
-
ZendeskCredentialsToken,
|
|
91
|
-
)
|
|
92
|
-
|
|
93
|
-
TableBackend = Literal["sqlalchemy", "pyarrow", "pandas", "connectorx"]
|
|
94
|
-
TQueryAdapter = Callable[[SelectAny, Table], SelectAny]
|
|
95
36
|
|
|
96
37
|
|
|
97
38
|
class SqlSource:
|
|
98
39
|
table_builder: Callable
|
|
99
40
|
|
|
100
|
-
def __init__(self, table_builder=
|
|
41
|
+
def __init__(self, table_builder=None) -> None:
|
|
42
|
+
if table_builder is None:
|
|
43
|
+
from dlt.sources.sql_database import sql_table
|
|
44
|
+
|
|
45
|
+
table_builder = sql_table
|
|
46
|
+
|
|
101
47
|
self.table_builder = table_builder
|
|
102
48
|
|
|
103
49
|
def handles_incrementality(self) -> bool:
|
|
@@ -112,7 +58,7 @@ class SqlSource:
|
|
|
112
58
|
if kwargs.get("incremental_key"):
|
|
113
59
|
start_value = kwargs.get("interval_start")
|
|
114
60
|
end_value = kwargs.get("interval_end")
|
|
115
|
-
incremental =
|
|
61
|
+
incremental = dlt_incremental(
|
|
116
62
|
kwargs.get("incremental_key", ""),
|
|
117
63
|
initial_value=start_value,
|
|
118
64
|
end_value=end_value,
|
|
@@ -167,6 +113,27 @@ class SqlSource:
|
|
|
167
113
|
if uri.startswith("db2://"):
|
|
168
114
|
uri = uri.replace("db2://", "db2+ibm_db://")
|
|
169
115
|
|
|
116
|
+
from dlt.common.libs.sql_alchemy import (
|
|
117
|
+
Engine,
|
|
118
|
+
MetaData,
|
|
119
|
+
)
|
|
120
|
+
from dlt.sources.sql_database.schema_types import (
|
|
121
|
+
ReflectionLevel,
|
|
122
|
+
SelectAny,
|
|
123
|
+
Table,
|
|
124
|
+
TTypeAdapter,
|
|
125
|
+
)
|
|
126
|
+
from sqlalchemy import Column
|
|
127
|
+
from sqlalchemy import types as sa
|
|
128
|
+
|
|
129
|
+
from ingestr.src.filters import table_adapter_exclude_columns
|
|
130
|
+
from ingestr.src.sql_database.callbacks import (
|
|
131
|
+
chained_query_adapter_callback,
|
|
132
|
+
custom_query_variable_subsitution,
|
|
133
|
+
limit_callback,
|
|
134
|
+
type_adapter_callback,
|
|
135
|
+
)
|
|
136
|
+
|
|
170
137
|
query_adapters = []
|
|
171
138
|
if kwargs.get("sql_limit"):
|
|
172
139
|
query_adapters.append(
|
|
@@ -185,6 +152,13 @@ class SqlSource:
|
|
|
185
152
|
defer_table_reflect = True
|
|
186
153
|
query_value = table.split(":", 1)[1]
|
|
187
154
|
|
|
155
|
+
TableBackend: TypeAlias = Literal[
|
|
156
|
+
"sqlalchemy", "pyarrow", "pandas", "connectorx"
|
|
157
|
+
]
|
|
158
|
+
TQueryAdapter: TypeAlias = Callable[[SelectAny, Table], SelectAny]
|
|
159
|
+
import dlt
|
|
160
|
+
from dlt.common.typing import TDataItem
|
|
161
|
+
|
|
188
162
|
# this is a very hacky version of the table_rows function. it is built this way to go around the dlt's table loader.
|
|
189
163
|
# I didn't want to write a full fledged sqlalchemy source for now, and wanted to benefit from the existing stuff to begin with.
|
|
190
164
|
# this is by no means a production ready solution, but it works for now.
|
|
@@ -235,6 +209,8 @@ class SqlSource:
|
|
|
235
209
|
*cols,
|
|
236
210
|
)
|
|
237
211
|
|
|
212
|
+
from dlt.sources.sql_database.helpers import TableLoader
|
|
213
|
+
|
|
238
214
|
loader = TableLoader(
|
|
239
215
|
engine,
|
|
240
216
|
backend,
|
|
@@ -277,7 +253,12 @@ class SqlSource:
|
|
|
277
253
|
class ArrowMemoryMappedSource:
|
|
278
254
|
table_builder: Callable
|
|
279
255
|
|
|
280
|
-
def __init__(self, table_builder=
|
|
256
|
+
def __init__(self, table_builder=None) -> None:
|
|
257
|
+
if table_builder is None:
|
|
258
|
+
from ingestr.src.arrow import memory_mapped_arrow
|
|
259
|
+
|
|
260
|
+
table_builder = memory_mapped_arrow
|
|
261
|
+
|
|
281
262
|
self.table_builder = table_builder
|
|
282
263
|
|
|
283
264
|
def handles_incrementality(self) -> bool:
|
|
@@ -289,7 +270,7 @@ class ArrowMemoryMappedSource:
|
|
|
289
270
|
start_value = kwargs.get("interval_start")
|
|
290
271
|
end_value = kwargs.get("interval_end")
|
|
291
272
|
|
|
292
|
-
incremental =
|
|
273
|
+
incremental = dlt_incremental(
|
|
293
274
|
kwargs.get("incremental_key", ""),
|
|
294
275
|
initial_value=start_value,
|
|
295
276
|
end_value=end_value,
|
|
@@ -341,7 +322,7 @@ class MongoDbSource:
|
|
|
341
322
|
start_value = kwargs.get("interval_start")
|
|
342
323
|
end_value = kwargs.get("interval_end")
|
|
343
324
|
|
|
344
|
-
incremental =
|
|
325
|
+
incremental = dlt_incremental(
|
|
345
326
|
kwargs.get("incremental_key", ""),
|
|
346
327
|
initial_value=start_value,
|
|
347
328
|
end_value=end_value,
|
|
@@ -366,7 +347,7 @@ class LocalCsvSource:
|
|
|
366
347
|
|
|
367
348
|
def dlt_source(self, uri: str, table: str, **kwargs):
|
|
368
349
|
def csv_file(
|
|
369
|
-
incremental: Optional[
|
|
350
|
+
incremental: Optional[dlt_incremental[Any]] = None,
|
|
370
351
|
):
|
|
371
352
|
file_path = uri.split("://")[1]
|
|
372
353
|
myFile = open(file_path, "r")
|
|
@@ -408,11 +389,13 @@ class LocalCsvSource:
|
|
|
408
389
|
if page:
|
|
409
390
|
yield page
|
|
410
391
|
|
|
411
|
-
|
|
392
|
+
from dlt import resource
|
|
393
|
+
|
|
394
|
+
return resource(
|
|
412
395
|
csv_file,
|
|
413
396
|
merge_key=kwargs.get("merge_key"), # type: ignore
|
|
414
397
|
)(
|
|
415
|
-
incremental=
|
|
398
|
+
incremental=dlt_incremental(
|
|
416
399
|
kwargs.get("incremental_key", ""),
|
|
417
400
|
initial_value=kwargs.get("interval_start"),
|
|
418
401
|
end_value=kwargs.get("interval_end"),
|
|
@@ -428,7 +411,12 @@ class LocalCsvSource:
|
|
|
428
411
|
class NotionSource:
|
|
429
412
|
table_builder: Callable
|
|
430
413
|
|
|
431
|
-
def __init__(self, table_builder=
|
|
414
|
+
def __init__(self, table_builder=None) -> None:
|
|
415
|
+
if table_builder is None:
|
|
416
|
+
from ingestr.src.notion import notion_databases
|
|
417
|
+
|
|
418
|
+
table_builder = notion_databases
|
|
419
|
+
|
|
432
420
|
self.table_builder = table_builder
|
|
433
421
|
|
|
434
422
|
def handles_incrementality(self) -> bool:
|
|
@@ -488,6 +476,8 @@ class ShopifySource:
|
|
|
488
476
|
f"Table name '{table}' is not supported for Shopify source yet, if you are interested in it please create a GitHub issue at https://github.com/bruin-data/ingestr"
|
|
489
477
|
)
|
|
490
478
|
|
|
479
|
+
from ingestr.src.shopify import shopify_source
|
|
480
|
+
|
|
491
481
|
return shopify_source(
|
|
492
482
|
private_app_password=api_key[0],
|
|
493
483
|
shop_url=f"https://{source_fields.netloc}",
|
|
@@ -532,6 +522,8 @@ class GorgiasSource:
|
|
|
532
522
|
if kwargs.get("interval_end"):
|
|
533
523
|
date_args["end_date"] = kwargs.get("interval_end")
|
|
534
524
|
|
|
525
|
+
from ingestr.src.gorgias import gorgias_source
|
|
526
|
+
|
|
535
527
|
return gorgias_source(
|
|
536
528
|
domain=source_fields.netloc,
|
|
537
529
|
email=email[0],
|
|
@@ -629,6 +621,8 @@ class ChessSource:
|
|
|
629
621
|
f"Resource '{table}' is not supported for Chess source yet, if you are interested in it please create a GitHub issue at https://github.com/bruin-data/ingestr"
|
|
630
622
|
)
|
|
631
623
|
|
|
624
|
+
from ingestr.src.chess import source
|
|
625
|
+
|
|
632
626
|
return source(players=list_players, **date_args).with_resources(
|
|
633
627
|
table_mapping[table]
|
|
634
628
|
)
|
|
@@ -713,6 +707,11 @@ class FacebookAdsSource:
|
|
|
713
707
|
"access_token and accound_id are required to connect to Facebook Ads."
|
|
714
708
|
)
|
|
715
709
|
|
|
710
|
+
from ingestr.src.facebook_ads import (
|
|
711
|
+
facebook_ads_source,
|
|
712
|
+
facebook_insights_source,
|
|
713
|
+
)
|
|
714
|
+
|
|
716
715
|
endpoint = None
|
|
717
716
|
if table in ["campaigns", "ad_sets", "ad_creatives", "ads", "leads"]:
|
|
718
717
|
endpoint = table
|
|
@@ -770,6 +769,8 @@ class SlackSource:
|
|
|
770
769
|
if kwargs.get("interval_end"):
|
|
771
770
|
date_args["end_date"] = kwargs.get("interval_end")
|
|
772
771
|
|
|
772
|
+
from ingestr.src.slack import slack_source
|
|
773
|
+
|
|
773
774
|
return slack_source(
|
|
774
775
|
access_token=api_key[0],
|
|
775
776
|
table_per_channel=False,
|
|
@@ -799,6 +800,8 @@ class HubspotSource:
|
|
|
799
800
|
|
|
800
801
|
endpoint = None
|
|
801
802
|
|
|
803
|
+
from ingestr.src.hubspot import hubspot
|
|
804
|
+
|
|
802
805
|
if table.startswith("custom:"):
|
|
803
806
|
fields = table.split(":", 2)
|
|
804
807
|
if len(fields) != 2:
|
|
@@ -905,6 +908,9 @@ class KlaviyoSource:
|
|
|
905
908
|
)
|
|
906
909
|
|
|
907
910
|
start_date = kwargs.get("interval_start") or "2000-01-01"
|
|
911
|
+
|
|
912
|
+
from ingestr.src.klaviyo import klaviyo_source
|
|
913
|
+
|
|
908
914
|
return klaviyo_source(
|
|
909
915
|
api_key=api_key[0],
|
|
910
916
|
start_date=start_date,
|
|
@@ -938,6 +944,9 @@ class KafkaSource:
|
|
|
938
944
|
raise ValueError("group_id in the URI is required to connect to kafka")
|
|
939
945
|
|
|
940
946
|
start_date = kwargs.get("interval_start")
|
|
947
|
+
from ingestr.src.kafka import kafka_consumer
|
|
948
|
+
from ingestr.src.kafka.helpers import KafkaCredentials
|
|
949
|
+
|
|
941
950
|
return kafka_consumer(
|
|
942
951
|
topics=[table],
|
|
943
952
|
credentials=KafkaCredentials(
|
|
@@ -993,6 +1002,9 @@ class AdjustSource:
|
|
|
993
1002
|
if kwargs.get("interval_end"):
|
|
994
1003
|
end_date = ensure_pendulum_datetime(str(kwargs.get("interval_end")))
|
|
995
1004
|
|
|
1005
|
+
from ingestr.src.adjust import REQUIRED_CUSTOM_DIMENSIONS, adjust_source
|
|
1006
|
+
from ingestr.src.adjust.adjust_helpers import parse_filters
|
|
1007
|
+
|
|
996
1008
|
dimensions = None
|
|
997
1009
|
metrics = None
|
|
998
1010
|
filters = []
|
|
@@ -1099,6 +1111,12 @@ class ZendeskSource:
|
|
|
1099
1111
|
if not subdomain:
|
|
1100
1112
|
raise ValueError("Subdomain is required to connect with Zendesk")
|
|
1101
1113
|
|
|
1114
|
+
from ingestr.src.zendesk import zendesk_chat, zendesk_support, zendesk_talk
|
|
1115
|
+
from ingestr.src.zendesk.helpers.credentials import (
|
|
1116
|
+
ZendeskCredentialsOAuth,
|
|
1117
|
+
ZendeskCredentialsToken,
|
|
1118
|
+
)
|
|
1119
|
+
|
|
1102
1120
|
if not source_fields.username and source_fields.password:
|
|
1103
1121
|
oauth_token = source_fields.password
|
|
1104
1122
|
if not oauth_token:
|
|
@@ -1206,6 +1224,8 @@ class S3Source:
|
|
|
1206
1224
|
"S3 Source only supports specific formats files: csv, jsonl, parquet"
|
|
1207
1225
|
)
|
|
1208
1226
|
|
|
1227
|
+
from ingestr.src.filesystem import readers
|
|
1228
|
+
|
|
1209
1229
|
return readers(bucket_url, fs, path_to_file).with_resources(endpoint)
|
|
1210
1230
|
|
|
1211
1231
|
|
|
@@ -1300,6 +1320,8 @@ class TikTokSource:
|
|
|
1300
1320
|
filter_name = list(filters.keys())[0]
|
|
1301
1321
|
filter_value = list(map(int, filters[list(filters.keys())[0]]))
|
|
1302
1322
|
|
|
1323
|
+
from ingestr.src.tiktok_ads import tiktok_source
|
|
1324
|
+
|
|
1303
1325
|
return tiktok_source(
|
|
1304
1326
|
start_date=start_date,
|
|
1305
1327
|
end_date=end_date,
|
|
@@ -1348,9 +1370,12 @@ class AsanaSource:
|
|
|
1348
1370
|
f"Resource '{table}' is not supported for Asana source yet, if you are interested in it please create a GitHub issue at https://github.com/bruin-data/ingestr"
|
|
1349
1371
|
)
|
|
1350
1372
|
|
|
1351
|
-
dlt
|
|
1373
|
+
import dlt
|
|
1374
|
+
|
|
1352
1375
|
from ingestr.src.asana_source import asana_source
|
|
1353
1376
|
|
|
1377
|
+
dlt.secrets["sources.asana_source.access_token"] = access_token[0]
|
|
1378
|
+
|
|
1354
1379
|
src = asana_source()
|
|
1355
1380
|
src.workspaces.add_filter(lambda w: w["gid"] == workspace)
|
|
1356
1381
|
return src.with_resources(table)
|
|
@@ -1396,6 +1421,9 @@ class DynamoDBSource:
|
|
|
1396
1421
|
if not secret_key:
|
|
1397
1422
|
raise ValueError("secret_access_key is required to connect to Dynamodb")
|
|
1398
1423
|
|
|
1424
|
+
from dlt.common.configuration.specs import AwsCredentials
|
|
1425
|
+
from dlt.common.typing import TSecretStrValue
|
|
1426
|
+
|
|
1399
1427
|
creds = AwsCredentials(
|
|
1400
1428
|
aws_access_key_id=access_key[0],
|
|
1401
1429
|
aws_secret_access_key=TSecretStrValue(secret_key[0]),
|
|
@@ -1406,8 +1434,11 @@ class DynamoDBSource:
|
|
|
1406
1434
|
incremental = None
|
|
1407
1435
|
incremental_key = kwargs.get("incremental_key")
|
|
1408
1436
|
|
|
1437
|
+
from ingestr.src.dynamodb import dynamodb
|
|
1438
|
+
from ingestr.src.time import isotime
|
|
1439
|
+
|
|
1409
1440
|
if incremental_key:
|
|
1410
|
-
incremental =
|
|
1441
|
+
incremental = dlt_incremental(
|
|
1411
1442
|
incremental_key.strip(),
|
|
1412
1443
|
initial_value=isotime(kwargs.get("interval_start")),
|
|
1413
1444
|
end_value=isotime(kwargs.get("interval_end")),
|
|
@@ -1415,8 +1446,6 @@ class DynamoDBSource:
|
|
|
1415
1446
|
range_start="closed",
|
|
1416
1447
|
)
|
|
1417
1448
|
|
|
1418
|
-
from ingestr.src.dynamodb import dynamodb
|
|
1419
|
-
|
|
1420
1449
|
# bug: we never validate table.
|
|
1421
1450
|
return dynamodb(table, creds, incremental)
|
|
1422
1451
|
|
|
@@ -1517,6 +1546,12 @@ class GitHubSource:
|
|
|
1517
1546
|
|
|
1518
1547
|
access_token = source_fields.get("access_token", [""])[0]
|
|
1519
1548
|
|
|
1549
|
+
from ingestr.src.github import (
|
|
1550
|
+
github_reactions,
|
|
1551
|
+
github_repo_events,
|
|
1552
|
+
github_stargazers,
|
|
1553
|
+
)
|
|
1554
|
+
|
|
1520
1555
|
if table in ["issues", "pull_requests"]:
|
|
1521
1556
|
return github_reactions(
|
|
1522
1557
|
owner=owner, name=repo, access_token=access_token
|
|
@@ -1667,6 +1702,8 @@ class GCSSource:
|
|
|
1667
1702
|
"GCS Source only supports specific formats files: csv, jsonl, parquet"
|
|
1668
1703
|
)
|
|
1669
1704
|
|
|
1705
|
+
from ingestr.src.filesystem import readers
|
|
1706
|
+
|
|
1670
1707
|
return readers(bucket_url, fs, path_to_file).with_resources(endpoint)
|
|
1671
1708
|
|
|
1672
1709
|
|
|
@@ -1818,6 +1855,12 @@ class LinkedInAdsSource:
|
|
|
1818
1855
|
"'date' or 'month' is required to connect to LinkedIn Ads, please provide at least one of these dimensions."
|
|
1819
1856
|
)
|
|
1820
1857
|
|
|
1858
|
+
from ingestr.src.linkedin_ads import linked_in_ads_source
|
|
1859
|
+
from ingestr.src.linkedin_ads.dimension_time_enum import (
|
|
1860
|
+
Dimension,
|
|
1861
|
+
TimeGranularity,
|
|
1862
|
+
)
|
|
1863
|
+
|
|
1821
1864
|
if "date" in dimensions:
|
|
1822
1865
|
time_granularity = TimeGranularity.daily
|
|
1823
1866
|
dimensions.remove("date")
|
|
@@ -1876,6 +1919,8 @@ class AppLovinSource:
|
|
|
1876
1919
|
custom_report = table
|
|
1877
1920
|
table = "custom_report"
|
|
1878
1921
|
|
|
1922
|
+
from ingestr.src.applovin import applovin_source
|
|
1923
|
+
|
|
1879
1924
|
src = applovin_source(
|
|
1880
1925
|
api_key[0],
|
|
1881
1926
|
start_date.strftime("%Y-%m-%d"),
|
|
@@ -1943,6 +1988,8 @@ class ApplovinMaxSource:
|
|
|
1943
1988
|
|
|
1944
1989
|
end_date = interval_end.date() if interval_end is not None else None
|
|
1945
1990
|
|
|
1991
|
+
from ingestr.src.applovin_max import applovin_max_source
|
|
1992
|
+
|
|
1946
1993
|
return applovin_max_source(
|
|
1947
1994
|
start_date=start_date,
|
|
1948
1995
|
end_date=end_date,
|
|
@@ -2020,6 +2067,8 @@ class PersonioSource:
|
|
|
2020
2067
|
]:
|
|
2021
2068
|
raise UnsupportedResourceError(table, "Personio")
|
|
2022
2069
|
|
|
2070
|
+
from ingestr.src.personio import personio_source
|
|
2071
|
+
|
|
2023
2072
|
return personio_source(
|
|
2024
2073
|
client_id=client_id[0],
|
|
2025
2074
|
client_secret=client_secret[0],
|
|
@@ -2054,14 +2103,17 @@ class KinesisSource:
|
|
|
2054
2103
|
if start_date is not None:
|
|
2055
2104
|
# the resource will read all messages after this timestamp.
|
|
2056
2105
|
start_date = ensure_pendulum_datetime(start_date)
|
|
2106
|
+
|
|
2107
|
+
from dlt.common.configuration.specs import AwsCredentials
|
|
2108
|
+
|
|
2109
|
+
from ingestr.src.kinesis import kinesis_stream
|
|
2110
|
+
|
|
2057
2111
|
credentials = AwsCredentials(
|
|
2058
2112
|
aws_access_key_id=aws_access_key_id[0],
|
|
2059
2113
|
aws_secret_access_key=aws_secret_access_key[0],
|
|
2060
2114
|
region_name=region_name[0],
|
|
2061
2115
|
)
|
|
2062
2116
|
|
|
2063
|
-
from ingestr.src.kinesis import kinesis_stream
|
|
2064
|
-
|
|
2065
2117
|
return kinesis_stream(
|
|
2066
2118
|
stream_name=table, credentials=credentials, initial_at_timestamp=start_date
|
|
2067
2119
|
)
|
|
@@ -2109,6 +2161,9 @@ class FrankfurterSource:
|
|
|
2109
2161
|
def dlt_source(self, uri: str, table: str, **kwargs):
|
|
2110
2162
|
# start and end dates only assigned and validated for exchange_rates table
|
|
2111
2163
|
# Note: if an end date but no start date is provided, start date and end date will be set to current date
|
|
2164
|
+
from ingestr.src.frankfurter import frankfurter_source
|
|
2165
|
+
from ingestr.src.frankfurter.helpers import validate_dates
|
|
2166
|
+
|
|
2112
2167
|
if table == "exchange_rates":
|
|
2113
2168
|
if kwargs.get("interval_start"):
|
|
2114
2169
|
start_date = ensure_pendulum_datetime(str(kwargs.get("interval_start")))
|
|
@@ -1,13 +1,4 @@
|
|
|
1
1
|
import os
|
|
2
|
-
import platform
|
|
3
|
-
|
|
4
|
-
import machineid
|
|
5
|
-
import rudderstack.analytics as rudder_analytics # type: ignore
|
|
6
|
-
|
|
7
|
-
from ingestr.src.version import __version__ # type: ignore
|
|
8
|
-
|
|
9
|
-
rudder_analytics.write_key = "2cUr13DDQcX2x2kAfMEfdrKvrQa"
|
|
10
|
-
rudder_analytics.dataPlaneUrl = "https://getbruinbumlky.dataplane.rudderstack.com"
|
|
11
2
|
|
|
12
3
|
|
|
13
4
|
def track(event_name, event_properties: dict):
|
|
@@ -16,6 +7,16 @@ def track(event_name, event_properties: dict):
|
|
|
16
7
|
):
|
|
17
8
|
return
|
|
18
9
|
|
|
10
|
+
import platform
|
|
11
|
+
|
|
12
|
+
import machineid
|
|
13
|
+
import rudderstack.analytics as rudder_analytics # type: ignore
|
|
14
|
+
|
|
15
|
+
from ingestr.src.version import __version__ # type: ignore
|
|
16
|
+
|
|
17
|
+
rudder_analytics.write_key = "2cUr13DDQcX2x2kAfMEfdrKvrQa"
|
|
18
|
+
rudder_analytics.dataPlaneUrl = "https://getbruinbumlky.dataplane.rudderstack.com"
|
|
19
|
+
|
|
19
20
|
try:
|
|
20
21
|
if not event_properties:
|
|
21
22
|
event_properties = {}
|
ingestr-0.13.32/.gitleaksignore
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
version = "v0.13.32"
|