ingestr 0.13.31__tar.gz → 0.13.32__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.31 → ingestr-0.13.32}/.gitignore +2 -1
- {ingestr-0.13.31 → ingestr-0.13.32}/PKG-INFO +1 -6
- {ingestr-0.13.31 → ingestr-0.13.32}/README.md +0 -5
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/athena.md +9 -1
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/main.py +6 -46
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/adjust/adjust_helpers.py +1 -1
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/applovin_max/__init__.py +0 -1
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/appsflyer/client.py +0 -1
- ingestr-0.13.32/ingestr/src/buildinfo.py +1 -0
- ingestr-0.13.32/ingestr/src/collector/spinner.py +43 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/destinations.py +31 -18
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/klaviyo/_init_.py +0 -1
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/linkedin_ads/helpers.py +0 -1
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/sources.py +43 -19
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -1
- ingestr-0.13.31/ingestr/src/buildinfo.py +0 -1
- {ingestr-0.13.31 → ingestr-0.13.32}/.dockerignore +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/.githooks/pre-commit-hook.sh +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/.github/workflows/deploy-docs.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/.github/workflows/release.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/.github/workflows/secrets-scan.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/.github/workflows/tests.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/.gitleaksignore +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/.python-version +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/.vale.ini +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/Dockerfile +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/LICENSE.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/Makefile +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/.vitepress/config.mjs +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/.vitepress/theme/custom.css +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/.vitepress/theme/index.js +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/commands/example-uris.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/commands/ingest.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/getting-started/core-concepts.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/getting-started/incremental-loading.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/getting-started/quickstart.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/getting-started/telemetry.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/index.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/media/applovin_max.png +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/media/athena.png +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/media/clickhouse_img.png +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/media/github.png +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/media/googleanalytics.png +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/media/kinesis.bigquery.png +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/media/linkedin_ads.png +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/media/personio.png +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/media/personio_duckdb.png +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/media/pipedrive.png +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/media/stripe_postgres.png +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/media/tiktok.png +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/adjust.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/airtable.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/applovin.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/applovin_max.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/appsflyer.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/appstore.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/asana.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/bigquery.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/chess.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/clickhouse.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/csv.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/custom_queries.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/databricks.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/db2.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/duckdb.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/dynamodb.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/facebook-ads.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/frankfurter.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/gcs.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/github.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/google-ads.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/google_analytics.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/gorgias.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/gsheets.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/hubspot.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/kafka.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/kinesis.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/klaviyo.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/linkedin_ads.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/mongodb.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/mssql.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/mysql.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/notion.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/oracle.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/personio.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/pipedrive.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/postgres.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/redshift.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/s3.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/salesforce.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/sap-hana.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/shopify.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/slack.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/snowflake.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/sqlite.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/stripe.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/tiktok-ads.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/supported-sources/zendesk.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/tutorials/load-kinesis-bigquery.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/tutorials/load-personio-duckdb.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/docs/tutorials/load-stripe-postgres.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/conftest.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/.gitignore +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/adjust/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/airtable/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/applovin/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/appsflyer/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/appstore/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/appstore/client.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/appstore/errors.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/appstore/models.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/appstore/resources.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/arrow/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/asana_source/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/asana_source/helpers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/asana_source/settings.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/blob.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/chess/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/chess/helpers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/chess/settings.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/dynamodb/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/errors.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/facebook_ads/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/facebook_ads/exceptions.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/facebook_ads/helpers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/facebook_ads/settings.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/factory.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/filesystem/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/filesystem/helpers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/filesystem/readers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/filters.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/frankfurter/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/frankfurter/helpers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/github/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/github/helpers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/github/queries.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/github/settings.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/google_ads/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/google_ads/field.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/google_ads/metrics.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/google_ads/predicates.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/google_ads/reports.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/google_analytics/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/google_analytics/helpers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/google_sheets/README.md +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/google_sheets/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/gorgias/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/gorgias/helpers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/hubspot/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/hubspot/helpers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/hubspot/settings.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/kafka/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/kafka/helpers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/kinesis/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/kinesis/helpers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/klaviyo/client.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/klaviyo/helpers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/linkedin_ads/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/loader.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/mongodb/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/mongodb/helpers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/notion/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/notion/helpers/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/notion/helpers/client.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/notion/helpers/database.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/notion/settings.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/partition.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/personio/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/personio/helpers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/pipedrive/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/pipedrive/helpers/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/pipedrive/helpers/custom_fields_munger.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/pipedrive/helpers/pages.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/pipedrive/settings.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/pipedrive/typing.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/resource.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/salesforce/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/salesforce/helpers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/shopify/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/shopify/exceptions.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/shopify/helpers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/shopify/settings.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/slack/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/slack/helpers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/slack/settings.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/sql_database/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/sql_database/callbacks.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/stripe_analytics/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/stripe_analytics/helpers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/stripe_analytics/settings.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/table_definition.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/telemetry/event.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/testdata/fakebqcredentials.json +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/tiktok_ads/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/time.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/version.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/zendesk/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/zendesk/helpers/__init__.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/zendesk/helpers/credentials.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/src/zendesk/settings.py +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/testdata/.gitignore +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/testdata/create_replace.csv +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/testdata/delete_insert_expected.csv +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/testdata/delete_insert_part1.csv +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/testdata/delete_insert_part2.csv +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/testdata/merge_expected.csv +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/testdata/merge_part1.csv +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/ingestr/testdata/merge_part2.csv +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/package-lock.json +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/package.json +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/pyproject.toml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/requirements-dev.txt +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/requirements.in +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/requirements.txt +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/requirements_arm64.txt +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/resources/demo.gif +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/resources/demo.tape +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/resources/ingestr.svg +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/styles/Google/AMPM.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/styles/Google/Acronyms.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/styles/Google/Colons.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/styles/Google/Contractions.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/styles/Google/DateFormat.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/styles/Google/Ellipses.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/styles/Google/EmDash.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/styles/Google/Exclamation.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/styles/Google/FirstPerson.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/styles/Google/Gender.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/styles/Google/GenderBias.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/styles/Google/HeadingPunctuation.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/styles/Google/Headings.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/styles/Google/Latin.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/styles/Google/LyHyphens.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/styles/Google/OptionalPlurals.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/styles/Google/Ordinal.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/styles/Google/OxfordComma.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/styles/Google/Parens.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/styles/Google/Passive.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/styles/Google/Periods.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/styles/Google/Quotes.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/styles/Google/Ranges.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/styles/Google/Semicolons.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/styles/Google/Slang.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/styles/Google/Spacing.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/styles/Google/Spelling.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/styles/Google/Units.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/styles/Google/We.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/styles/Google/Will.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/styles/Google/WordList.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/styles/Google/meta.json +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/styles/Google/vocab.txt +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/styles/bruin/Ingestr.yml +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/styles/config/vocabularies/bruin/accept.txt +0 -0
- {ingestr-0.13.31 → ingestr-0.13.32}/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.32
|
|
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
|
|
@@ -419,11 +419,6 @@ Pull requests are welcome. However, please open an issue first to discuss what y
|
|
|
419
419
|
<td>Google Analytics</td>
|
|
420
420
|
<td>✅</td>
|
|
421
421
|
<td>-</td>
|
|
422
|
-
</tr>
|
|
423
|
-
<tr>
|
|
424
|
-
<td>Intercom</td>
|
|
425
|
-
<td>✅</td>
|
|
426
|
-
<td>-</td>
|
|
427
422
|
</tr>
|
|
428
423
|
<tr>
|
|
429
424
|
<td>Klaviyo</td>
|
|
@@ -222,11 +222,6 @@ Pull requests are welcome. However, please open an issue first to discuss what y
|
|
|
222
222
|
<td>Google Analytics</td>
|
|
223
223
|
<td>✅</td>
|
|
224
224
|
<td>-</td>
|
|
225
|
-
</tr>
|
|
226
|
-
<tr>
|
|
227
|
-
<td>Intercom</td>
|
|
228
|
-
<td>✅</td>
|
|
229
|
-
<td>-</td>
|
|
230
225
|
</tr>
|
|
231
226
|
<tr>
|
|
232
227
|
<td>Klaviyo</td>
|
|
@@ -18,9 +18,17 @@ athena://?bucket=<your-destination-bucket> \
|
|
|
18
18
|
URI parameters:
|
|
19
19
|
- `bucket` (required): The name of the bucket where the data will be stored, containing the Parquet files that Athena will work with, e.g. `your_bucket_name` or `s3://your_bucket_name`.
|
|
20
20
|
- `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
|
-
- `
|
|
21
|
+
- `session_token` (optional): The session token for temporary credentials.
|
|
22
|
+
- `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`
|
|
22
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.
|
|
23
24
|
- `workgroup` (optional): The name of the Athena workgroup, e.g. `my_group`
|
|
25
|
+
- `profile` (optional): The name of the AWS profile to use, e.g. `my_profile`
|
|
26
|
+
|
|
27
|
+
You have two ways of providing credentials:
|
|
28
|
+
1. Provide `access_key_id` and `secret_access_key` directly in the URI.
|
|
29
|
+
2. Provide the name of the AWS profile to use in the `profile` parameter.
|
|
30
|
+
|
|
31
|
+
If there's no access key and secret key provided, ingestr will try to find the credentials in the local AWS credentials file.
|
|
24
32
|
|
|
25
33
|
## Setting up an Athena Integration
|
|
26
34
|
Athena requires a `bucket`, `access_key_id`, `secret_access_key` and `region_name` to access the S3 bucket. Please follow the guide on dltHub to obtain [credentials](https://dlthub.com/docs/dlt-ecosystem/destinations/athena#2-setup-bucket-storage-and-athena-credentials). Once you've completed the guide, you should have all the above-mentioned credentials.
|
|
@@ -3,15 +3,9 @@ from enum import Enum
|
|
|
3
3
|
from typing import Optional
|
|
4
4
|
|
|
5
5
|
import typer
|
|
6
|
-
from dlt.common.runtime.collector import Collector
|
|
7
6
|
from rich.console import Console
|
|
8
|
-
from rich.status import Status
|
|
9
7
|
from typing_extensions import Annotated
|
|
10
8
|
|
|
11
|
-
import ingestr.src.partition as partition
|
|
12
|
-
import ingestr.src.resource as resource
|
|
13
|
-
from ingestr.src.destinations import AthenaDestination
|
|
14
|
-
from ingestr.src.filters import cast_set_to_list, handle_mysql_empty_dates
|
|
15
9
|
from ingestr.src.telemetry.event import track
|
|
16
10
|
|
|
17
11
|
app = typer.Typer(
|
|
@@ -46,45 +40,6 @@ PARQUET_SUPPORTED_DESTINATIONS = [
|
|
|
46
40
|
JSON_RETURNING_SOURCES = ["notion"]
|
|
47
41
|
|
|
48
42
|
|
|
49
|
-
class SpinnerCollector(Collector):
|
|
50
|
-
status: Status
|
|
51
|
-
current_step: str
|
|
52
|
-
started: bool
|
|
53
|
-
|
|
54
|
-
def __init__(self) -> None:
|
|
55
|
-
self.status = Status("Ingesting data...", spinner="dots")
|
|
56
|
-
self.started = False
|
|
57
|
-
|
|
58
|
-
def update(
|
|
59
|
-
self,
|
|
60
|
-
name: str,
|
|
61
|
-
inc: int = 1,
|
|
62
|
-
total: Optional[int] = None,
|
|
63
|
-
message: Optional[str] = None, # type: ignore
|
|
64
|
-
label: str = "",
|
|
65
|
-
**kwargs,
|
|
66
|
-
) -> None:
|
|
67
|
-
self.status.update(self.current_step)
|
|
68
|
-
|
|
69
|
-
def _start(self, step: str) -> None:
|
|
70
|
-
self.current_step = self.__step_to_label(step)
|
|
71
|
-
self.status.start()
|
|
72
|
-
|
|
73
|
-
def __step_to_label(self, step: str) -> str:
|
|
74
|
-
verb = step.split(" ")[0].lower()
|
|
75
|
-
if verb.startswith("normalize"):
|
|
76
|
-
return "Normalizing the data"
|
|
77
|
-
elif verb.startswith("load"):
|
|
78
|
-
return "Loading the data to the destination"
|
|
79
|
-
elif verb.startswith("extract"):
|
|
80
|
-
return "Extracting the data from the source"
|
|
81
|
-
|
|
82
|
-
return f"{verb.capitalize()} the data"
|
|
83
|
-
|
|
84
|
-
def _stop(self) -> None:
|
|
85
|
-
self.status.stop()
|
|
86
|
-
|
|
87
|
-
|
|
88
43
|
class IncrementalStrategy(str, Enum):
|
|
89
44
|
create_replace = "replace"
|
|
90
45
|
append = "append"
|
|
@@ -323,8 +278,12 @@ def ingest(
|
|
|
323
278
|
from dlt.common.runtime.collector import Collector, LogCollector
|
|
324
279
|
from dlt.common.schema.typing import TColumnSchema
|
|
325
280
|
|
|
281
|
+
import ingestr.src.partition as partition
|
|
282
|
+
import ingestr.src.resource as resource
|
|
283
|
+
from ingestr.src.collector.spinner import SpinnerCollector
|
|
284
|
+
from ingestr.src.destinations import AthenaDestination
|
|
326
285
|
from ingestr.src.factory import SourceDestinationFactory
|
|
327
|
-
from ingestr.src.
|
|
286
|
+
from ingestr.src.filters import cast_set_to_list, handle_mysql_empty_dates
|
|
328
287
|
|
|
329
288
|
def report_errors(run_info: LoadInfo):
|
|
330
289
|
for load_package in run_info.load_packages:
|
|
@@ -406,6 +365,7 @@ def ingest(
|
|
|
406
365
|
dlt.config["data_writer.file_max_items"] = loader_file_size
|
|
407
366
|
dlt.config["extract.workers"] = extract_parallelism
|
|
408
367
|
dlt.config["extract.max_parallel_items"] = extract_parallelism
|
|
368
|
+
dlt.config["load.raise_on_max_retries"] = 15
|
|
409
369
|
if schema_naming != SchemaNaming.default:
|
|
410
370
|
dlt.config["schema.naming"] = schema_naming.value
|
|
411
371
|
|
|
@@ -36,7 +36,7 @@ class AdjustAPI:
|
|
|
36
36
|
def __init__(self, api_key):
|
|
37
37
|
self.api_key = api_key
|
|
38
38
|
self.request_client = Client(
|
|
39
|
-
request_timeout=
|
|
39
|
+
request_timeout=1000, # Adjust support recommends 1000 seconds of read timeout.
|
|
40
40
|
raise_for_status=False,
|
|
41
41
|
retry_condition=retry_on_limit,
|
|
42
42
|
request_max_attempts=12,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
version = "v0.13.32"
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
|
|
3
|
+
from dlt.common.runtime.collector import Collector
|
|
4
|
+
from rich.status import Status
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class SpinnerCollector(Collector):
|
|
8
|
+
status: Status
|
|
9
|
+
current_step: str
|
|
10
|
+
started: bool
|
|
11
|
+
|
|
12
|
+
def __init__(self) -> None:
|
|
13
|
+
self.status = Status("Ingesting data...", spinner="dots")
|
|
14
|
+
self.started = False
|
|
15
|
+
|
|
16
|
+
def update(
|
|
17
|
+
self,
|
|
18
|
+
name: str,
|
|
19
|
+
inc: int = 1,
|
|
20
|
+
total: Optional[int] = None,
|
|
21
|
+
message: Optional[str] = None, # type: ignore
|
|
22
|
+
label: str = "",
|
|
23
|
+
**kwargs,
|
|
24
|
+
) -> None:
|
|
25
|
+
self.status.update(self.current_step)
|
|
26
|
+
|
|
27
|
+
def _start(self, step: str) -> None:
|
|
28
|
+
self.current_step = self.__step_to_label(step)
|
|
29
|
+
self.status.start()
|
|
30
|
+
|
|
31
|
+
def __step_to_label(self, step: str) -> str:
|
|
32
|
+
verb = step.split(" ")[0].lower()
|
|
33
|
+
if verb.startswith("normalize"):
|
|
34
|
+
return "Normalizing the data"
|
|
35
|
+
elif verb.startswith("load"):
|
|
36
|
+
return "Loading the data to the destination"
|
|
37
|
+
elif verb.startswith("extract"):
|
|
38
|
+
return "Extracting the data from the source"
|
|
39
|
+
|
|
40
|
+
return f"{verb.capitalize()} the data"
|
|
41
|
+
|
|
42
|
+
def _stop(self) -> None:
|
|
43
|
+
self.status.stop()
|
|
@@ -223,34 +223,47 @@ class AthenaDestination:
|
|
|
223
223
|
query_result_path = bucket
|
|
224
224
|
|
|
225
225
|
access_key_id = source_params.get("access_key_id", [None])[0]
|
|
226
|
-
if not access_key_id:
|
|
227
|
-
raise ValueError("The AWS access_key_id is required to connect to Athena.")
|
|
228
|
-
|
|
229
226
|
secret_access_key = source_params.get("secret_access_key", [None])[0]
|
|
230
|
-
|
|
231
|
-
|
|
227
|
+
session_token = source_params.get("session_token", [None])[0]
|
|
228
|
+
profile_name = source_params.get("profile", ["default"])[0]
|
|
229
|
+
region_name = source_params.get("region_name", [None])[0]
|
|
232
230
|
|
|
233
|
-
|
|
231
|
+
if not access_key_id and not secret_access_key:
|
|
232
|
+
import botocore.session # type: ignore
|
|
233
|
+
|
|
234
|
+
session = botocore.session.Session(profile=profile_name)
|
|
235
|
+
default = session.get_credentials()
|
|
236
|
+
if not profile_name:
|
|
237
|
+
raise ValueError(
|
|
238
|
+
"You have to either provide access_key_id and secret_access_key pair or a valid AWS profile name."
|
|
239
|
+
)
|
|
240
|
+
access_key_id = default.access_key
|
|
241
|
+
secret_access_key = default.secret_key
|
|
242
|
+
session_token = default.token
|
|
243
|
+
if region_name is None:
|
|
244
|
+
region_name = session.get_config_variable("region")
|
|
234
245
|
|
|
235
|
-
region_name = source_params.get("region_name", [None])[0]
|
|
236
246
|
if not region_name:
|
|
237
247
|
raise ValueError("The region_name is required to connect to Athena.")
|
|
238
248
|
|
|
239
249
|
os.environ["DESTINATION__BUCKET_URL"] = bucket
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
250
|
+
if access_key_id and secret_access_key:
|
|
251
|
+
os.environ["DESTINATION__CREDENTIALS__AWS_ACCESS_KEY_ID"] = access_key_id
|
|
252
|
+
os.environ["DESTINATION__CREDENTIALS__AWS_SECRET_ACCESS_KEY"] = (
|
|
253
|
+
secret_access_key
|
|
254
|
+
)
|
|
255
|
+
if session_token:
|
|
256
|
+
os.environ["DESTINATION__CREDENTIALS__AWS_SESSION_TOKEN"] = session_token
|
|
244
257
|
|
|
245
|
-
credentials = AwsCredentials(
|
|
246
|
-
aws_access_key_id=access_key_id,
|
|
247
|
-
aws_secret_access_key=secret_access_key,
|
|
248
|
-
region_name=region_name,
|
|
249
|
-
)
|
|
250
258
|
return dlt.destinations.athena(
|
|
251
259
|
query_result_bucket=query_result_path,
|
|
252
|
-
athena_work_group=
|
|
253
|
-
credentials=
|
|
260
|
+
athena_work_group=source_params.get("workgroup", [None])[0],
|
|
261
|
+
credentials=AwsCredentials(
|
|
262
|
+
aws_access_key_id=access_key_id, # type: ignore
|
|
263
|
+
aws_secret_access_key=secret_access_key, # type: ignore
|
|
264
|
+
aws_session_token=session_token,
|
|
265
|
+
region_name=region_name,
|
|
266
|
+
),
|
|
254
267
|
destination_name=bucket,
|
|
255
268
|
)
|
|
256
269
|
|
|
@@ -18,9 +18,7 @@ from typing import (
|
|
|
18
18
|
from urllib.parse import ParseResult, parse_qs, quote, urlencode, urlparse
|
|
19
19
|
|
|
20
20
|
import dlt
|
|
21
|
-
import gcsfs # type: ignore
|
|
22
21
|
import pendulum
|
|
23
|
-
import s3fs # type: ignore
|
|
24
22
|
from dlt.common.configuration.specs import (
|
|
25
23
|
AwsCredentials,
|
|
26
24
|
)
|
|
@@ -42,22 +40,16 @@ from dlt.sources.sql_database.schema_types import (
|
|
|
42
40
|
Table,
|
|
43
41
|
TTypeAdapter,
|
|
44
42
|
)
|
|
45
|
-
from google.ads.googleads.client import GoogleAdsClient # type: ignore
|
|
46
43
|
from sqlalchemy import Column
|
|
47
44
|
from sqlalchemy import types as sa
|
|
48
45
|
|
|
49
46
|
from ingestr.src import blob
|
|
50
47
|
from ingestr.src.adjust import REQUIRED_CUSTOM_DIMENSIONS, adjust_source
|
|
51
48
|
from ingestr.src.adjust.adjust_helpers import parse_filters
|
|
52
|
-
from ingestr.src.airtable import airtable_source
|
|
53
49
|
from ingestr.src.applovin import applovin_source
|
|
54
50
|
from ingestr.src.applovin_max import applovin_max_source
|
|
55
|
-
from ingestr.src.appstore import app_store
|
|
56
|
-
from ingestr.src.appstore.client import AppStoreConnectClient
|
|
57
51
|
from ingestr.src.arrow import memory_mapped_arrow
|
|
58
|
-
from ingestr.src.asana_source import asana_source
|
|
59
52
|
from ingestr.src.chess import source
|
|
60
|
-
from ingestr.src.dynamodb import dynamodb
|
|
61
53
|
from ingestr.src.errors import (
|
|
62
54
|
InvalidBlobTableError,
|
|
63
55
|
MissingValueError,
|
|
@@ -69,25 +61,18 @@ from ingestr.src.filters import table_adapter_exclude_columns
|
|
|
69
61
|
from ingestr.src.frankfurter import frankfurter_source
|
|
70
62
|
from ingestr.src.frankfurter.helpers import validate_dates
|
|
71
63
|
from ingestr.src.github import github_reactions, github_repo_events, github_stargazers
|
|
72
|
-
from ingestr.src.google_ads import google_ads
|
|
73
|
-
from ingestr.src.google_analytics import google_analytics
|
|
74
|
-
from ingestr.src.google_sheets import google_spreadsheet
|
|
75
64
|
from ingestr.src.gorgias import gorgias_source
|
|
76
65
|
from ingestr.src.hubspot import hubspot
|
|
77
66
|
from ingestr.src.kafka import kafka_consumer
|
|
78
67
|
from ingestr.src.kafka.helpers import KafkaCredentials
|
|
79
|
-
from ingestr.src.kinesis import kinesis_stream
|
|
80
68
|
from ingestr.src.klaviyo._init_ import klaviyo_source
|
|
81
69
|
from ingestr.src.linkedin_ads import linked_in_ads_source
|
|
82
70
|
from ingestr.src.linkedin_ads.dimension_time_enum import (
|
|
83
71
|
Dimension,
|
|
84
72
|
TimeGranularity,
|
|
85
73
|
)
|
|
86
|
-
from ingestr.src.mongodb import mongodb_collection
|
|
87
74
|
from ingestr.src.notion import notion_databases
|
|
88
75
|
from ingestr.src.personio import personio_source
|
|
89
|
-
from ingestr.src.pipedrive import pipedrive_source
|
|
90
|
-
from ingestr.src.salesforce import salesforce_source
|
|
91
76
|
from ingestr.src.shopify import shopify_source
|
|
92
77
|
from ingestr.src.slack import slack_source
|
|
93
78
|
from ingestr.src.sql_database.callbacks import (
|
|
@@ -96,7 +81,6 @@ from ingestr.src.sql_database.callbacks import (
|
|
|
96
81
|
limit_callback,
|
|
97
82
|
type_adapter_callback,
|
|
98
83
|
)
|
|
99
|
-
from ingestr.src.stripe_analytics import stripe_source
|
|
100
84
|
from ingestr.src.table_definition import TableDefinition, table_string_to_dataclass
|
|
101
85
|
from ingestr.src.tiktok_ads import tiktok_source
|
|
102
86
|
from ingestr.src.time import isotime
|
|
@@ -338,7 +322,12 @@ class ArrowMemoryMappedSource:
|
|
|
338
322
|
class MongoDbSource:
|
|
339
323
|
table_builder: Callable
|
|
340
324
|
|
|
341
|
-
def __init__(self, table_builder=
|
|
325
|
+
def __init__(self, table_builder=None) -> None:
|
|
326
|
+
if table_builder is None:
|
|
327
|
+
from ingestr.src.mongodb import mongodb_collection
|
|
328
|
+
|
|
329
|
+
table_builder = mongodb_collection
|
|
330
|
+
|
|
342
331
|
self.table_builder = table_builder
|
|
343
332
|
|
|
344
333
|
def handles_incrementality(self) -> bool:
|
|
@@ -554,7 +543,12 @@ class GorgiasSource:
|
|
|
554
543
|
class GoogleSheetsSource:
|
|
555
544
|
table_builder: Callable
|
|
556
545
|
|
|
557
|
-
def __init__(self, table_builder=
|
|
546
|
+
def __init__(self, table_builder=None) -> None:
|
|
547
|
+
if table_builder is None:
|
|
548
|
+
from ingestr.src.google_sheets import google_spreadsheet
|
|
549
|
+
|
|
550
|
+
table_builder = google_spreadsheet
|
|
551
|
+
|
|
558
552
|
self.table_builder = table_builder
|
|
559
553
|
|
|
560
554
|
def handles_incrementality(self) -> bool:
|
|
@@ -685,6 +679,8 @@ class StripeAnalyticsSource:
|
|
|
685
679
|
if kwargs.get("interval_end"):
|
|
686
680
|
date_args["end_date"] = kwargs.get("interval_end")
|
|
687
681
|
|
|
682
|
+
from ingestr.src.stripe_analytics import stripe_source
|
|
683
|
+
|
|
688
684
|
return stripe_source(
|
|
689
685
|
endpoints=[
|
|
690
686
|
endpoint,
|
|
@@ -860,6 +856,8 @@ class AirtableSource:
|
|
|
860
856
|
"base_id and access_token in the URI are required to connect to Airtable"
|
|
861
857
|
)
|
|
862
858
|
|
|
859
|
+
from ingestr.src.airtable import airtable_source
|
|
860
|
+
|
|
863
861
|
return airtable_source(
|
|
864
862
|
base_id=base_id[0], table_names=tables, access_token=access_token[0]
|
|
865
863
|
)
|
|
@@ -1189,6 +1187,8 @@ class S3Source:
|
|
|
1189
1187
|
|
|
1190
1188
|
bucket_url = f"s3://{bucket_name}/"
|
|
1191
1189
|
|
|
1190
|
+
import s3fs # type: ignore
|
|
1191
|
+
|
|
1192
1192
|
fs = s3fs.S3FileSystem(
|
|
1193
1193
|
key=access_key_id[0],
|
|
1194
1194
|
secret=secret_access_key[0],
|
|
@@ -1349,6 +1349,8 @@ class AsanaSource:
|
|
|
1349
1349
|
)
|
|
1350
1350
|
|
|
1351
1351
|
dlt.secrets["sources.asana_source.access_token"] = access_token[0]
|
|
1352
|
+
from ingestr.src.asana_source import asana_source
|
|
1353
|
+
|
|
1352
1354
|
src = asana_source()
|
|
1353
1355
|
src.workspaces.add_filter(lambda w: w["gid"] == workspace)
|
|
1354
1356
|
return src.with_resources(table)
|
|
@@ -1413,6 +1415,8 @@ class DynamoDBSource:
|
|
|
1413
1415
|
range_start="closed",
|
|
1414
1416
|
)
|
|
1415
1417
|
|
|
1418
|
+
from ingestr.src.dynamodb import dynamodb
|
|
1419
|
+
|
|
1416
1420
|
# bug: we never validate table.
|
|
1417
1421
|
return dynamodb(table, creds, incremental)
|
|
1418
1422
|
|
|
@@ -1474,6 +1478,8 @@ class GoogleAnalyticsSource:
|
|
|
1474
1478
|
if kwargs.get("interval_end") is not None:
|
|
1475
1479
|
end_date = pendulum.instance(kwargs.get("interval_end")) # type: ignore
|
|
1476
1480
|
|
|
1481
|
+
from ingestr.src.google_analytics import google_analytics
|
|
1482
|
+
|
|
1477
1483
|
return google_analytics(
|
|
1478
1484
|
property_id=property_id[0],
|
|
1479
1485
|
start_date=start_date,
|
|
@@ -1543,6 +1549,8 @@ class AppleAppStoreSource:
|
|
|
1543
1549
|
else:
|
|
1544
1550
|
key = base64.b64decode(key_base64[0]).decode() # type: ignore
|
|
1545
1551
|
|
|
1552
|
+
from ingestr.src.appstore.client import AppStoreConnectClient
|
|
1553
|
+
|
|
1546
1554
|
return AppStoreConnectClient(key.encode(), key_id, issuer_id)
|
|
1547
1555
|
|
|
1548
1556
|
def dlt_source(self, uri: str, table: str, **kwargs):
|
|
@@ -1583,6 +1591,8 @@ class AppleAppStoreSource:
|
|
|
1583
1591
|
if app_ids is None:
|
|
1584
1592
|
raise MissingValueError("app_id", "App Store")
|
|
1585
1593
|
|
|
1594
|
+
from ingestr.src.appstore import app_store
|
|
1595
|
+
|
|
1586
1596
|
src = app_store(
|
|
1587
1597
|
client,
|
|
1588
1598
|
app_ids,
|
|
@@ -1639,6 +1649,8 @@ class GCSSource:
|
|
|
1639
1649
|
# (The RECOMMENDED way of passing service account credentials)
|
|
1640
1650
|
# directly with gcsfs. As a workaround, we construct the GCSFileSystem
|
|
1641
1651
|
# and pass it directly to filesystem.readers.
|
|
1652
|
+
import gcsfs # type: ignore
|
|
1653
|
+
|
|
1642
1654
|
fs = gcsfs.GCSFileSystem(
|
|
1643
1655
|
token=credentials,
|
|
1644
1656
|
)
|
|
@@ -1662,7 +1674,9 @@ class GoogleAdsSource:
|
|
|
1662
1674
|
def handles_incrementality(self) -> bool:
|
|
1663
1675
|
return True
|
|
1664
1676
|
|
|
1665
|
-
def init_client(self, params: Dict[str, List[str]])
|
|
1677
|
+
def init_client(self, params: Dict[str, List[str]]):
|
|
1678
|
+
from google.ads.googleads.client import GoogleAdsClient # type: ignore
|
|
1679
|
+
|
|
1666
1680
|
dev_token = params.get("dev_token")
|
|
1667
1681
|
if dev_token is None or len(dev_token) == 0:
|
|
1668
1682
|
raise MissingValueError("dev_token", "Google Ads")
|
|
@@ -1716,6 +1730,7 @@ class GoogleAdsSource:
|
|
|
1716
1730
|
raise MissingValueError("customer_id", "Google Ads")
|
|
1717
1731
|
|
|
1718
1732
|
params = parse_qs(parsed_uri.query)
|
|
1733
|
+
|
|
1719
1734
|
client = self.init_client(params)
|
|
1720
1735
|
|
|
1721
1736
|
start_date = kwargs.get("interval_start") or datetime.now(
|
|
@@ -1737,6 +1752,8 @@ class GoogleAdsSource:
|
|
|
1737
1752
|
report_spec = table
|
|
1738
1753
|
table = "daily_report"
|
|
1739
1754
|
|
|
1755
|
+
from ingestr.src.google_ads import google_ads
|
|
1756
|
+
|
|
1740
1757
|
src = google_ads(
|
|
1741
1758
|
client,
|
|
1742
1759
|
customer_id,
|
|
@@ -1954,6 +1971,8 @@ class SalesforceSource:
|
|
|
1954
1971
|
if v is None:
|
|
1955
1972
|
raise MissingValueError(k, "Salesforce")
|
|
1956
1973
|
|
|
1974
|
+
from ingestr.src.salesforce import salesforce_source
|
|
1975
|
+
|
|
1957
1976
|
src = salesforce_source(**creds) # type: ignore
|
|
1958
1977
|
|
|
1959
1978
|
if table not in src.resources:
|
|
@@ -2040,6 +2059,9 @@ class KinesisSource:
|
|
|
2040
2059
|
aws_secret_access_key=aws_secret_access_key[0],
|
|
2041
2060
|
region_name=region_name[0],
|
|
2042
2061
|
)
|
|
2062
|
+
|
|
2063
|
+
from ingestr.src.kinesis import kinesis_stream
|
|
2064
|
+
|
|
2043
2065
|
return kinesis_stream(
|
|
2044
2066
|
stream_name=table, credentials=credentials, initial_at_timestamp=start_date
|
|
2045
2067
|
)
|
|
@@ -2073,6 +2095,8 @@ class PipedriveSource:
|
|
|
2073
2095
|
]:
|
|
2074
2096
|
raise UnsupportedResourceError(table, "Pipedrive")
|
|
2075
2097
|
|
|
2098
|
+
from ingestr.src.pipedrive import pipedrive_source
|
|
2099
|
+
|
|
2076
2100
|
return pipedrive_source(
|
|
2077
2101
|
pipedrive_api_key=api_key, since_timestamp=start_date
|
|
2078
2102
|
).with_resources(table)
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
version = "v0.13.31"
|
|
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
|