ingestr 0.13.20__tar.gz → 0.13.22__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.20 → ingestr-0.13.22}/PKG-INFO +5 -5
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/.vitepress/config.mjs +1 -0
- ingestr-0.13.22/docs/media/pipedrive.png +0 -0
- ingestr-0.13.22/docs/supported-sources/pipedrive.md +43 -0
- ingestr-0.13.22/docs/tutorials/load-kinesis-bigquery.md +130 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/main.py +29 -25
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/adjust/adjust_helpers.py +6 -2
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/applovin_max/__init__.py +5 -3
- ingestr-0.13.22/ingestr/src/buildinfo.py +1 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/factory.py +2 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/hubspot/__init__.py +0 -1
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/kinesis/__init__.py +3 -4
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/partition.py +2 -2
- ingestr-0.13.22/ingestr/src/pipedrive/__init__.py +198 -0
- ingestr-0.13.22/ingestr/src/pipedrive/helpers/__init__.py +23 -0
- ingestr-0.13.22/ingestr/src/pipedrive/helpers/custom_fields_munger.py +102 -0
- ingestr-0.13.22/ingestr/src/pipedrive/helpers/pages.py +115 -0
- ingestr-0.13.22/ingestr/src/pipedrive/settings.py +27 -0
- ingestr-0.13.22/ingestr/src/pipedrive/typing.py +3 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/sources.py +46 -14
- {ingestr-0.13.20 → ingestr-0.13.22}/pyproject.toml +2 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/requirements.in +4 -4
- {ingestr-0.13.20 → ingestr-0.13.22}/requirements.txt +5 -4
- ingestr-0.13.20/docs/tutorials/load-kinesis-bigquery.md +0 -67
- ingestr-0.13.20/ingestr/src/buildinfo.py +0 -1
- {ingestr-0.13.20 → ingestr-0.13.22}/.dockerignore +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/.githooks/pre-commit-hook.sh +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/.github/workflows/deploy-docs.yml +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/.github/workflows/release.yml +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/.github/workflows/secrets-scan.yml +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/.github/workflows/tests.yml +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/.gitignore +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/.gitleaksignore +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/.python-version +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/.vale.ini +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/Dockerfile +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/LICENSE.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/Makefile +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/README.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/.vitepress/theme/custom.css +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/.vitepress/theme/index.js +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/commands/example-uris.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/commands/ingest.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/getting-started/core-concepts.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/getting-started/incremental-loading.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/getting-started/quickstart.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/getting-started/telemetry.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/index.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/media/applovin_max.png +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/media/athena.png +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/media/clickhouse_img.png +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/media/github.png +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/media/googleanalytics.png +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/media/kinesis.bigquery.png +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/media/linkedin_ads.png +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/media/personio.png +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/media/personio_duckdb.png +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/media/stripe_postgres.png +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/media/tiktok.png +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/adjust.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/airtable.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/applovin.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/applovin_max.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/appsflyer.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/appstore.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/asana.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/athena.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/bigquery.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/chess.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/clickhouse.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/csv.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/custom_queries.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/databricks.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/db2.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/duckdb.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/dynamodb.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/facebook-ads.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/gcs.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/github.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/google-ads.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/google_analytics.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/gorgias.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/gsheets.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/hubspot.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/kafka.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/kinesis.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/klaviyo.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/linkedin_ads.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/mongodb.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/mssql.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/mysql.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/notion.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/oracle.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/personio.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/postgres.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/redshift.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/s3.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/salesforce.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/sap-hana.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/shopify.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/slack.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/snowflake.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/sqlite.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/stripe.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/tiktok-ads.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/supported-sources/zendesk.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/tutorials/load-personio-duckdb.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/docs/tutorials/load-stripe-postgres.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/.gitignore +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/adjust/__init__.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/airtable/__init__.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/applovin/__init__.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/appsflyer/_init_.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/appsflyer/client.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/appstore/__init__.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/appstore/client.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/appstore/errors.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/appstore/models.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/appstore/resources.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/arrow/__init__.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/asana_source/__init__.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/asana_source/helpers.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/asana_source/settings.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/blob.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/chess/__init__.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/chess/helpers.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/chess/settings.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/destinations.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/dynamodb/__init__.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/errors.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/facebook_ads/__init__.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/facebook_ads/exceptions.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/facebook_ads/helpers.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/facebook_ads/settings.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/filesystem/__init__.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/filesystem/helpers.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/filesystem/readers.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/filters.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/github/__init__.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/github/helpers.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/github/queries.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/github/settings.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/google_ads/__init__.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/google_ads/field.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/google_ads/metrics.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/google_ads/predicates.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/google_ads/reports.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/google_analytics/__init__.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/google_analytics/helpers.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/google_sheets/README.md +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/google_sheets/__init__.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/gorgias/__init__.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/gorgias/helpers.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/hubspot/helpers.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/hubspot/settings.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/kafka/__init__.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/kafka/helpers.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/kinesis/helpers.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/klaviyo/_init_.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/klaviyo/client.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/klaviyo/helpers.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/linkedin_ads/__init__.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/linkedin_ads/helpers.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/loader.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/mongodb/__init__.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/mongodb/helpers.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/notion/__init__.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/notion/helpers/__init__.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/notion/helpers/client.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/notion/helpers/database.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/notion/settings.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/personio/__init__.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/personio/helpers.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/resource.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/salesforce/__init__.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/salesforce/helpers.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/shopify/__init__.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/shopify/exceptions.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/shopify/helpers.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/shopify/settings.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/slack/__init__.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/slack/helpers.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/slack/settings.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/sql_database/__init__.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/sql_database/callbacks.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/stripe_analytics/__init__.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/stripe_analytics/helpers.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/stripe_analytics/settings.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/table_definition.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/telemetry/event.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/testdata/fakebqcredentials.json +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/tiktok_ads/__init__.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/time.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/version.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/zendesk/__init__.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/zendesk/helpers/__init__.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/zendesk/helpers/credentials.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/src/zendesk/settings.py +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/testdata/.gitignore +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/testdata/create_replace.csv +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/testdata/delete_insert_expected.csv +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/testdata/delete_insert_part1.csv +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/testdata/delete_insert_part2.csv +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/testdata/merge_expected.csv +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/testdata/merge_part1.csv +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/ingestr/testdata/merge_part2.csv +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/package-lock.json +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/package.json +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/requirements-dev.txt +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/resources/demo.gif +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/resources/demo.tape +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/resources/ingestr.svg +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/AMPM.yml +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Acronyms.yml +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Colons.yml +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Contractions.yml +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/DateFormat.yml +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Ellipses.yml +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/EmDash.yml +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Exclamation.yml +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/FirstPerson.yml +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Gender.yml +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/GenderBias.yml +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/HeadingPunctuation.yml +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Headings.yml +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Latin.yml +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/LyHyphens.yml +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/OptionalPlurals.yml +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Ordinal.yml +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/OxfordComma.yml +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Parens.yml +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Passive.yml +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Periods.yml +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Quotes.yml +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Ranges.yml +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Semicolons.yml +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Slang.yml +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Spacing.yml +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Spelling.yml +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Units.yml +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/We.yml +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/Will.yml +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/WordList.yml +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/meta.json +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/styles/Google/vocab.txt +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/styles/bruin/Ingestr.yml +0 -0
- {ingestr-0.13.20 → ingestr-0.13.22}/styles/config/vocabularies/bruin/accept.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ingestr
|
|
3
|
-
Version: 0.13.
|
|
3
|
+
Version: 0.13.22
|
|
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
|
|
@@ -16,7 +16,7 @@ Classifier: Topic :: Database
|
|
|
16
16
|
Requires-Python: >=3.9
|
|
17
17
|
Requires-Dist: aiobotocore==2.21.1
|
|
18
18
|
Requires-Dist: aiohappyeyeballs==2.4.8
|
|
19
|
-
Requires-Dist: aiohttp==3.11.
|
|
19
|
+
Requires-Dist: aiohttp==3.11.15
|
|
20
20
|
Requires-Dist: aioitertools==0.12.0
|
|
21
21
|
Requires-Dist: aiosignal==1.3.2
|
|
22
22
|
Requires-Dist: alembic==1.15.1
|
|
@@ -55,8 +55,8 @@ Requires-Dist: facebook-business==20.0.0
|
|
|
55
55
|
Requires-Dist: filelock==3.17.0
|
|
56
56
|
Requires-Dist: flatten-json==0.1.14
|
|
57
57
|
Requires-Dist: frozenlist==1.5.0
|
|
58
|
-
Requires-Dist: fsspec==
|
|
59
|
-
Requires-Dist: gcsfs==
|
|
58
|
+
Requires-Dist: fsspec==2025.3.2
|
|
59
|
+
Requires-Dist: gcsfs==2025.3.2
|
|
60
60
|
Requires-Dist: gitdb==4.0.12
|
|
61
61
|
Requires-Dist: gitpython==3.1.44
|
|
62
62
|
Requires-Dist: giturlparse==0.12.0
|
|
@@ -149,7 +149,7 @@ Requires-Dist: rich-argparse==1.7.0
|
|
|
149
149
|
Requires-Dist: rich==13.9.4
|
|
150
150
|
Requires-Dist: rsa==4.9
|
|
151
151
|
Requires-Dist: rudder-sdk-python==2.1.4
|
|
152
|
-
Requires-Dist: s3fs==
|
|
152
|
+
Requires-Dist: s3fs==2025.3.2
|
|
153
153
|
Requires-Dist: s3transfer==0.11.3
|
|
154
154
|
Requires-Dist: scramp==1.4.5
|
|
155
155
|
Requires-Dist: semver==3.0.4
|
|
@@ -126,6 +126,7 @@ export default defineConfig({
|
|
|
126
126
|
{ text: "LinkedIn Ads", link: "/supported-sources/linkedin_ads.md" },
|
|
127
127
|
{ text: "Notion", link: "/supported-sources/notion.md" },
|
|
128
128
|
{ text: "Personio", link: "/supported-sources/personio.md" },
|
|
129
|
+
{ text: "Pipedrive", link: "/supported-sources/pipedrive.md" },
|
|
129
130
|
{ text: "S3", link: "/supported-sources/s3.md" },
|
|
130
131
|
{ text: "Salesforce", link: "/supported-sources/salesforce.md" },
|
|
131
132
|
{ text: "Shopify", link: "/supported-sources/shopify.md" },
|
|
Binary file
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Pipedrive
|
|
2
|
+
[Pipedrive](https://www.pipedrive.com/) is a cloud-based sales Customer Relationship Management (CRM) tool designed to help businesses manage leads and deals, track communication, and automate sales processes.
|
|
3
|
+
|
|
4
|
+
ingestr supports pipedrive as a source.
|
|
5
|
+
|
|
6
|
+
## URI format
|
|
7
|
+
|
|
8
|
+
The URI format for pipedrive is as follows:
|
|
9
|
+
|
|
10
|
+
```plaintext
|
|
11
|
+
pipedrive://?api_token=<api_token>
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
URI parameters:
|
|
15
|
+
- api_token: token used for authentication with the Pipedrive API
|
|
16
|
+
|
|
17
|
+
## Setting up a pipedrive Integration
|
|
18
|
+
|
|
19
|
+
To grab pipedrive credentials, please follow the guide [here](https://dlthub.com/docs/dlt-ecosystem/verified-sources/pipedrive#grab-api-token).
|
|
20
|
+
|
|
21
|
+
Once you complete the guide, you should have a `api_token`. Let's say your `api_token` is token_123, here's a sample command that will copy the data from pipedriveinto a DuckDB database:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
ingestr ingest \
|
|
25
|
+
--source-uri 'pipedrive://?api_token=token' \
|
|
26
|
+
--source-table 'users' \
|
|
27
|
+
--dest-uri duckdb:///pipedrive.duckdb \
|
|
28
|
+
--dest-table 'dest.users'
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
<img alt="pipedrive_img" src="../media/pipedrive.png"/>
|
|
32
|
+
|
|
33
|
+
pipedrive source allows ingesting the following resources into separate tables:
|
|
34
|
+
|
|
35
|
+
- `activities`: Refers to scheduled events or tasks associated with deals, contacts, or organizations
|
|
36
|
+
- `organizations`: Refers to company or entity with which you have potential or existing business dealings.
|
|
37
|
+
- `products`: Refers to items or services offered for sale that can be associated with deals
|
|
38
|
+
- `deals`: Refers to potential sale or transaction that you can track through various stages
|
|
39
|
+
- `users`: Refers to Individual with a unique login credential who can access and use the platform
|
|
40
|
+
- `persons`: Refers individual contacts or leads that can be linked to sales deals
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
Use these as `--source-table` parameter in the `ingestr ingest` command.
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# Load Data from Amazon Kinesis to Google BigQuery
|
|
2
|
+
|
|
3
|
+
Welcome! 👋
|
|
4
|
+
This beginner-friendly guide will help you load data from `Amazon Kinesis` into `Google BigQuery` using `ingestr` — a simple yet powerful command-line tool. No prior experience is needed, and best of all, no coding required!
|
|
5
|
+
|
|
6
|
+
By the end of this guide, you'll have your Kinesis data securely stored in BigQuery. But before we dive in, let’s take a quick look at `ingestr`.
|
|
7
|
+
|
|
8
|
+
## Overview of ingestr
|
|
9
|
+
|
|
10
|
+
`ingestr` is a command-line tool that simplifies data ingestion by allowing users to load data from a source to a destination using simple command-line flags.
|
|
11
|
+
|
|
12
|
+
### ingestr Command
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
ingestr ingest \
|
|
16
|
+
--source-uri '<your-source-uri-here>' \
|
|
17
|
+
--source-table '<your-schema>.<your-table>' \
|
|
18
|
+
--dest-uri '<your-destination-uri-here>' \
|
|
19
|
+
--dest-table '<your-schema>.<your-table>'
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
- `ingestr ingest`: Executes the data ingestion process.
|
|
23
|
+
- `--source-uri TEXT`: Specifies the URI of the data source.
|
|
24
|
+
- `--dest-uri TEXT`: Specifies the URI of the destination.
|
|
25
|
+
- `--source-table TEXT`: Defines the table to fetch data from.
|
|
26
|
+
- `--dest-table TEXT`: Specifies the destination table. If not provided, it defaults to `--source-table`.
|
|
27
|
+
|
|
28
|
+
With this command, we connect to the source, retrieve the specified data, and load it into the destination database.
|
|
29
|
+
|
|
30
|
+
## Let's Load Data from Kinesis to BigQuery Together!
|
|
31
|
+
|
|
32
|
+
Amazon Kinesis is a cloud-based service for real-time data streaming and analytics that processes large data streams. To analyze this data, you may need to load it into a data warehouse like Google BigQuery. `ingestr` makes this process simple.
|
|
33
|
+
|
|
34
|
+
### Step 1: Install ingestr
|
|
35
|
+
|
|
36
|
+
Ensure `ingestr` is installed. If not, follow the installation guide [here](../getting-started/quickstart.md#Installation).
|
|
37
|
+
|
|
38
|
+
### Step 2: Get AWS Credentials
|
|
39
|
+
Kinesis will be our data source. To access it, you need AWS credentials.
|
|
40
|
+
|
|
41
|
+
1. Log in to your AWS account.
|
|
42
|
+
2. Navigate to `IAM` (Identity and Access Management).
|
|
43
|
+
3. Create a new IAM user or select an existing one.
|
|
44
|
+
4. Assign necessary permissions (e.g., `AmazonKinesisReadOnlyAccess`).
|
|
45
|
+
5. Generate and copy the `Access Key ID` and `Secret Access Key`.
|
|
46
|
+
|
|
47
|
+
For more details, read [here](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html).
|
|
48
|
+
|
|
49
|
+
### Step 3: Configure Kinesis as Source
|
|
50
|
+
|
|
51
|
+
#### `--source-uri`
|
|
52
|
+
This flag connects to your Kinesis stream. The URI format is:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
kinesis://?aws_access_key_id=<YOUR_KEY_ID>&aws_secret_access_key=<YOUR_SECRET_KEY>®ion_name=<YOUR_REGION>
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Required parameters:
|
|
59
|
+
- `aws_access_key_id`: Your AWS access key
|
|
60
|
+
- `aws_secret_access_key`: Your AWS secret key
|
|
61
|
+
- `region_name`: AWS region of your Kinesis stream
|
|
62
|
+
|
|
63
|
+
#### `--source-table`
|
|
64
|
+
This flag specifies which Kinesis stream to read from:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
--source-table 'kinesis_stream_name'
|
|
68
|
+
```
|
|
69
|
+
This flag specifies which Kinesis stream to read from:
|
|
70
|
+
### Step 4: Configure BigQuery as Destination
|
|
71
|
+
|
|
72
|
+
#### `--dest-uri`
|
|
73
|
+
This flag connects to BigQuery. The URI format is:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
bigquery://<project-name>?credentials_path=/path/to/service/account.json&location=<location>
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Required parameters:
|
|
80
|
+
- `project-name`: Your BigQuery project name
|
|
81
|
+
- `credentials_path`: Path to the service account JSON file
|
|
82
|
+
- `location`: (Optional) Dataset location
|
|
83
|
+
|
|
84
|
+
#### `--dest-table`
|
|
85
|
+
This flag specifies where to save the data:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
--dest-table 'dataset.table_name'
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Step 5: Run the ingestr Command
|
|
92
|
+
|
|
93
|
+
Execute the following command to load data from Kinesis to BigQuery:
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
ingestr ingest \
|
|
97
|
+
--source-uri 'kinesis://?aws_access_key_id=<YOUR_KEY_ID>&aws_secret_access_key=<YOUR_SECRET_KEY>®ion_name=eu-central-1' \
|
|
98
|
+
--source-table 'kinesis_stream_name' \
|
|
99
|
+
--dest-uri 'bigquery://project-name?credentials_path=/Users/abc.json' \
|
|
100
|
+
--dest-table 'dataset.results'
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Step 6: Verify Data in BigQuery
|
|
104
|
+
Once the command runs successfully, your Kinesis data will be available in BigQuery. Follow these steps to verify the data:
|
|
105
|
+
|
|
106
|
+
1. Open the [BigQuery Console](https://console.cloud.google.com/bigquery) and select your project.
|
|
107
|
+
|
|
108
|
+
2. In the left-hand side panel:
|
|
109
|
+
- Expand your project.
|
|
110
|
+
- Navigate to the appropriate dataset and click on the table name.
|
|
111
|
+
|
|
112
|
+
3. Select the "Preview" tab to view a sample of the ingested data.
|
|
113
|
+
- Confirm that rows are present and fields appear as expected.
|
|
114
|
+
|
|
115
|
+
5. Go to the "Query" tab and run a basic query to inspect your data more closely. For example:
|
|
116
|
+
```sql
|
|
117
|
+
SELECT * FROM `project-name.dataset.results` LIMIT 100;
|
|
118
|
+
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Ensure that the retrieved data matches what was expected from the Kinesis stream.
|
|
122
|
+
|
|
123
|
+
### Example Output
|
|
124
|
+
|
|
125
|
+
After running the ingestion process, your Kinesis data will be available in BigQuery. Here's an example of what the data might look like:
|
|
126
|
+
|
|
127
|
+
<img alt="kinesis_bigquery" src="../media/kinesis.bigquery.png" />
|
|
128
|
+
|
|
129
|
+
## 🎉 Congratulations!
|
|
130
|
+
You have successfully loaded data from Amazon Kinesis to BigQuery using `ingestr`.
|
|
@@ -127,40 +127,44 @@ class SqlReflectionLevel(str, Enum):
|
|
|
127
127
|
def ingest(
|
|
128
128
|
source_uri: Annotated[
|
|
129
129
|
str,
|
|
130
|
-
typer.Option(
|
|
130
|
+
typer.Option(
|
|
131
|
+
help="The URI of the [green]source[/green]",
|
|
132
|
+
envvar=["SOURCE_URI", "INGESTR_SOURCE_URI"],
|
|
133
|
+
),
|
|
131
134
|
], # type: ignore
|
|
132
135
|
dest_uri: Annotated[
|
|
133
136
|
str,
|
|
134
137
|
typer.Option(
|
|
135
|
-
help="The URI of the [cyan]destination[/cyan]",
|
|
138
|
+
help="The URI of the [cyan]destination[/cyan]",
|
|
139
|
+
envvar=["DESTINATION_URI", "INGESTR_DESTINATION_URI"],
|
|
136
140
|
),
|
|
137
141
|
], # type: ignore
|
|
138
142
|
source_table: Annotated[
|
|
139
143
|
str,
|
|
140
144
|
typer.Option(
|
|
141
145
|
help="The table name in the [green]source[/green] to fetch",
|
|
142
|
-
envvar="SOURCE_TABLE",
|
|
146
|
+
envvar=["SOURCE_TABLE", "INGESTR_SOURCE_TABLE"],
|
|
143
147
|
),
|
|
144
148
|
], # type: ignore
|
|
145
149
|
dest_table: Annotated[
|
|
146
150
|
str,
|
|
147
151
|
typer.Option(
|
|
148
152
|
help="The table in the [cyan]destination[/cyan] to save the data into",
|
|
149
|
-
envvar="DESTINATION_TABLE",
|
|
153
|
+
envvar=["DESTINATION_TABLE", "INGESTR_DESTINATION_TABLE"],
|
|
150
154
|
),
|
|
151
155
|
] = None, # type: ignore
|
|
152
156
|
incremental_key: Annotated[
|
|
153
157
|
Optional[str],
|
|
154
158
|
typer.Option(
|
|
155
159
|
help="The incremental key from the table to be used for incremental strategies",
|
|
156
|
-
envvar="INCREMENTAL_KEY",
|
|
160
|
+
envvar=["INCREMENTAL_KEY", "INGESTR_INCREMENTAL_KEY"],
|
|
157
161
|
),
|
|
158
162
|
] = None, # type: ignore
|
|
159
163
|
incremental_strategy: Annotated[
|
|
160
164
|
IncrementalStrategy,
|
|
161
165
|
typer.Option(
|
|
162
166
|
help="The incremental strategy to use",
|
|
163
|
-
envvar="INCREMENTAL_STRATEGY",
|
|
167
|
+
envvar=["INCREMENTAL_STRATEGY", "INGESTR_INCREMENTAL_STRATEGY"],
|
|
164
168
|
),
|
|
165
169
|
] = IncrementalStrategy.create_replace, # type: ignore
|
|
166
170
|
interval_start: Annotated[
|
|
@@ -168,7 +172,7 @@ def ingest(
|
|
|
168
172
|
typer.Option(
|
|
169
173
|
help="The start of the interval the incremental key will cover",
|
|
170
174
|
formats=DATE_FORMATS,
|
|
171
|
-
envvar="INTERVAL_START",
|
|
175
|
+
envvar=["INTERVAL_START", "INGESTR_INTERVAL_START"],
|
|
172
176
|
),
|
|
173
177
|
] = None, # type: ignore
|
|
174
178
|
interval_end: Annotated[
|
|
@@ -176,126 +180,126 @@ def ingest(
|
|
|
176
180
|
typer.Option(
|
|
177
181
|
help="The end of the interval the incremental key will cover",
|
|
178
182
|
formats=DATE_FORMATS,
|
|
179
|
-
envvar="INTERVAL_END",
|
|
183
|
+
envvar=["INTERVAL_END", "INGESTR_INTERVAL_END"],
|
|
180
184
|
),
|
|
181
185
|
] = None, # type: ignore
|
|
182
186
|
primary_key: Annotated[
|
|
183
187
|
Optional[list[str]],
|
|
184
188
|
typer.Option(
|
|
185
189
|
help="The key that will be used to deduplicate the resulting table",
|
|
186
|
-
envvar="PRIMARY_KEY",
|
|
190
|
+
envvar=["PRIMARY_KEY", "INGESTR_PRIMARY_KEY"],
|
|
187
191
|
),
|
|
188
192
|
] = None, # type: ignore
|
|
189
193
|
partition_by: Annotated[
|
|
190
194
|
Optional[str],
|
|
191
195
|
typer.Option(
|
|
192
196
|
help="The partition key to be used for partitioning the destination table",
|
|
193
|
-
envvar="PARTITION_BY",
|
|
197
|
+
envvar=["PARTITION_BY", "INGESTR_PARTITION_BY"],
|
|
194
198
|
),
|
|
195
199
|
] = None, # type: ignore
|
|
196
200
|
cluster_by: Annotated[
|
|
197
201
|
Optional[str],
|
|
198
202
|
typer.Option(
|
|
199
203
|
help="The clustering key to be used for clustering the destination table, not every destination supports clustering.",
|
|
200
|
-
envvar="CLUSTER_BY",
|
|
204
|
+
envvar=["CLUSTER_BY", "INGESTR_CLUSTER_BY"],
|
|
201
205
|
),
|
|
202
206
|
] = None, # type: ignore
|
|
203
207
|
yes: Annotated[
|
|
204
208
|
Optional[bool],
|
|
205
209
|
typer.Option(
|
|
206
210
|
help="Skip the confirmation prompt and ingest right away",
|
|
207
|
-
envvar="SKIP_CONFIRMATION",
|
|
211
|
+
envvar=["SKIP_CONFIRMATION", "INGESTR_SKIP_CONFIRMATION"],
|
|
208
212
|
),
|
|
209
213
|
] = False, # type: ignore
|
|
210
214
|
full_refresh: Annotated[
|
|
211
215
|
bool,
|
|
212
216
|
typer.Option(
|
|
213
217
|
help="Ignore the state and refresh the destination table completely",
|
|
214
|
-
envvar="FULL_REFRESH",
|
|
218
|
+
envvar=["FULL_REFRESH", "INGESTR_FULL_REFRESH"],
|
|
215
219
|
),
|
|
216
220
|
] = False, # type: ignore
|
|
217
221
|
progress: Annotated[
|
|
218
222
|
Progress,
|
|
219
223
|
typer.Option(
|
|
220
224
|
help="The progress display type, must be one of 'interactive', 'log'",
|
|
221
|
-
envvar="PROGRESS",
|
|
225
|
+
envvar=["PROGRESS", "INGESTR_PROGRESS"],
|
|
222
226
|
),
|
|
223
227
|
] = Progress.interactive, # type: ignore
|
|
224
228
|
sql_backend: Annotated[
|
|
225
229
|
SqlBackend,
|
|
226
230
|
typer.Option(
|
|
227
231
|
help="The SQL backend to use",
|
|
228
|
-
envvar="SQL_BACKEND",
|
|
232
|
+
envvar=["SQL_BACKEND", "INGESTR_SQL_BACKEND"],
|
|
229
233
|
),
|
|
230
234
|
] = SqlBackend.pyarrow, # type: ignore
|
|
231
235
|
loader_file_format: Annotated[
|
|
232
236
|
Optional[LoaderFileFormat],
|
|
233
237
|
typer.Option(
|
|
234
238
|
help="The file format to use when loading data",
|
|
235
|
-
envvar="LOADER_FILE_FORMAT",
|
|
239
|
+
envvar=["LOADER_FILE_FORMAT", "INGESTR_LOADER_FILE_FORMAT"],
|
|
236
240
|
),
|
|
237
241
|
] = None, # type: ignore
|
|
238
242
|
page_size: Annotated[
|
|
239
243
|
Optional[int],
|
|
240
244
|
typer.Option(
|
|
241
245
|
help="The page size to be used when fetching data from SQL sources",
|
|
242
|
-
envvar="PAGE_SIZE",
|
|
246
|
+
envvar=["PAGE_SIZE", "INGESTR_PAGE_SIZE"],
|
|
243
247
|
),
|
|
244
248
|
] = 50000, # type: ignore
|
|
245
249
|
loader_file_size: Annotated[
|
|
246
250
|
Optional[int],
|
|
247
251
|
typer.Option(
|
|
248
252
|
help="The file size to be used by the loader to split the data into multiple files. This can be set independent of the page size, since page size is used for fetching the data from the sources whereas this is used for the processing/loading part.",
|
|
249
|
-
envvar="LOADER_FILE_SIZE",
|
|
253
|
+
envvar=["LOADER_FILE_SIZE", "INGESTR_LOADER_FILE_SIZE"],
|
|
250
254
|
),
|
|
251
255
|
] = 100000, # type: ignore
|
|
252
256
|
schema_naming: Annotated[
|
|
253
257
|
SchemaNaming,
|
|
254
258
|
typer.Option(
|
|
255
259
|
help="The naming convention to use when moving the tables from source to destination. The default behavior is explained here: https://dlthub.com/docs/general-usage/schema#naming-convention",
|
|
256
|
-
envvar="SCHEMA_NAMING",
|
|
260
|
+
envvar=["SCHEMA_NAMING", "INGESTR_SCHEMA_NAMING"],
|
|
257
261
|
),
|
|
258
262
|
] = SchemaNaming.default, # type: ignore
|
|
259
263
|
pipelines_dir: Annotated[
|
|
260
264
|
Optional[str],
|
|
261
265
|
typer.Option(
|
|
262
266
|
help="The path to store dlt-related pipeline metadata. By default, ingestr will create a temporary directory and delete it after the execution is done in order to make retries stateless.",
|
|
263
|
-
envvar="PIPELINES_DIR",
|
|
267
|
+
envvar=["PIPELINES_DIR", "INGESTR_PIPELINES_DIR"],
|
|
264
268
|
),
|
|
265
269
|
] = None, # type: ignore
|
|
266
270
|
extract_parallelism: Annotated[
|
|
267
271
|
Optional[int],
|
|
268
272
|
typer.Option(
|
|
269
273
|
help="The number of parallel jobs to run for extracting data from the source, only applicable for certain sources",
|
|
270
|
-
envvar="EXTRACT_PARALLELISM",
|
|
274
|
+
envvar=["EXTRACT_PARALLELISM", "INGESTR_EXTRACT_PARALLELISM"],
|
|
271
275
|
),
|
|
272
276
|
] = 5, # type: ignore
|
|
273
277
|
sql_reflection_level: Annotated[
|
|
274
278
|
SqlReflectionLevel,
|
|
275
279
|
typer.Option(
|
|
276
280
|
help="The reflection level to use when reflecting the table schema from the source",
|
|
277
|
-
envvar="SQL_REFLECTION_LEVEL",
|
|
281
|
+
envvar=["SQL_REFLECTION_LEVEL", "INGESTR_SQL_REFLECTION_LEVEL"],
|
|
278
282
|
),
|
|
279
283
|
] = SqlReflectionLevel.full, # type: ignore
|
|
280
284
|
sql_limit: Annotated[
|
|
281
285
|
Optional[int],
|
|
282
286
|
typer.Option(
|
|
283
287
|
help="The limit to use when fetching data from the source",
|
|
284
|
-
envvar="SQL_LIMIT",
|
|
288
|
+
envvar=["SQL_LIMIT", "INGESTR_SQL_LIMIT"],
|
|
285
289
|
),
|
|
286
290
|
] = None, # type: ignore
|
|
287
291
|
sql_exclude_columns: Annotated[
|
|
288
292
|
Optional[list[str]],
|
|
289
293
|
typer.Option(
|
|
290
294
|
help="The columns to exclude from the source table",
|
|
291
|
-
envvar="SQL_EXCLUDE_COLUMNS",
|
|
295
|
+
envvar=["SQL_EXCLUDE_COLUMNS", "INGESTR_SQL_EXCLUDE_COLUMNS"],
|
|
292
296
|
),
|
|
293
297
|
] = [], # type: ignore
|
|
294
298
|
columns: Annotated[
|
|
295
299
|
Optional[list[str]],
|
|
296
300
|
typer.Option(
|
|
297
301
|
help="The column types to be used for the destination table in the format of 'column_name:column_type'",
|
|
298
|
-
envvar="COLUMNS",
|
|
302
|
+
envvar=["COLUMNS", "INGESTR_COLUMNS"],
|
|
299
303
|
),
|
|
300
304
|
] = None, # type: ignore
|
|
301
305
|
):
|
|
@@ -82,7 +82,9 @@ class AdjustAPI:
|
|
|
82
82
|
items = result.get("rows", [])
|
|
83
83
|
yield items
|
|
84
84
|
else:
|
|
85
|
-
raise HTTPError(
|
|
85
|
+
raise HTTPError(
|
|
86
|
+
f"Request failed with status code: {response.status_code}, {response.text}."
|
|
87
|
+
)
|
|
86
88
|
|
|
87
89
|
def fetch_events(self):
|
|
88
90
|
headers = {"Authorization": f"Bearer {self.api_key}"}
|
|
@@ -93,7 +95,9 @@ class AdjustAPI:
|
|
|
93
95
|
result = response.json()
|
|
94
96
|
yield result
|
|
95
97
|
else:
|
|
96
|
-
raise HTTPError(
|
|
98
|
+
raise HTTPError(
|
|
99
|
+
f"Request failed with status code: {response.status_code}, {response.text}."
|
|
100
|
+
)
|
|
97
101
|
|
|
98
102
|
|
|
99
103
|
def parse_filters(filters_raw: str) -> dict:
|
|
@@ -105,11 +105,13 @@ def get_data(
|
|
|
105
105
|
if response.status_code == 404:
|
|
106
106
|
if "No Mediation App Id found for platform" in response.text:
|
|
107
107
|
return None
|
|
108
|
-
error_message =
|
|
108
|
+
error_message = (
|
|
109
|
+
f"AppLovin MAX API error (status {response.status_code}): {response.text}"
|
|
110
|
+
)
|
|
109
111
|
raise requests.HTTPError(error_message)
|
|
110
|
-
|
|
112
|
+
|
|
111
113
|
response_url = response.json().get("ad_revenue_report_url")
|
|
112
114
|
df = pd.read_csv(response_url)
|
|
113
115
|
df["Date"] = pd.to_datetime(df["Date"])
|
|
114
116
|
df["partition_date"] = df["Date"].dt.date
|
|
115
|
-
return df
|
|
117
|
+
return df
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
version = "v0.13.22"
|
|
@@ -43,6 +43,7 @@ from ingestr.src.sources import (
|
|
|
43
43
|
MongoDbSource,
|
|
44
44
|
NotionSource,
|
|
45
45
|
PersonioSource,
|
|
46
|
+
PipedriveSource,
|
|
46
47
|
S3Source,
|
|
47
48
|
SalesforceSource,
|
|
48
49
|
ShopifySource,
|
|
@@ -144,6 +145,7 @@ class SourceDestinationFactory:
|
|
|
144
145
|
"salesforce": SalesforceSource,
|
|
145
146
|
"personio": PersonioSource,
|
|
146
147
|
"kinesis": KinesisSource,
|
|
148
|
+
"pipedrive": PipedriveSource,
|
|
147
149
|
}
|
|
148
150
|
destinations: Dict[str, Type[DestinationProtocol]] = {
|
|
149
151
|
"bigquery": BigQueryDestination,
|
|
@@ -16,7 +16,7 @@ from .helpers import get_shard_iterator, max_sequence_by_shard
|
|
|
16
16
|
name=lambda args: args["stream_name"],
|
|
17
17
|
primary_key="kinesis_msg_id",
|
|
18
18
|
standalone=True,
|
|
19
|
-
max_table_nesting=0
|
|
19
|
+
max_table_nesting=0,
|
|
20
20
|
)
|
|
21
21
|
def kinesis_stream(
|
|
22
22
|
stream_name: str,
|
|
@@ -75,7 +75,6 @@ def kinesis_stream(
|
|
|
75
75
|
|
|
76
76
|
# get next shard to fetch messages from
|
|
77
77
|
while shard_id := shard_ids.pop(0) if shard_ids else None:
|
|
78
|
-
|
|
79
78
|
shard_iterator, _ = get_shard_iterator(
|
|
80
79
|
kinesis_client,
|
|
81
80
|
stream_name,
|
|
@@ -83,14 +82,14 @@ def kinesis_stream(
|
|
|
83
82
|
last_msg, # type: ignore
|
|
84
83
|
initial_at_datetime, # type: ignore
|
|
85
84
|
)
|
|
86
|
-
|
|
85
|
+
|
|
87
86
|
while shard_iterator:
|
|
88
87
|
records = []
|
|
89
88
|
records_response = kinesis_client.get_records(
|
|
90
89
|
ShardIterator=shard_iterator,
|
|
91
90
|
Limit=chunk_size, # The size of data can be up to 1 MB, it must be controlled by the user
|
|
92
91
|
)
|
|
93
|
-
|
|
92
|
+
|
|
94
93
|
for record in records_response["Records"]:
|
|
95
94
|
sequence_number = record["SequenceNumber"]
|
|
96
95
|
content = record["Data"]
|
|
@@ -13,7 +13,6 @@ def apply_athena_hints(
|
|
|
13
13
|
additional_hints: Dict[str, TColumnSchema] = {},
|
|
14
14
|
) -> None:
|
|
15
15
|
def _apply_partition_hint(resource: DltResource) -> None:
|
|
16
|
-
|
|
17
16
|
columns = resource.columns if resource.columns else {}
|
|
18
17
|
|
|
19
18
|
partition_hint = (
|
|
@@ -24,7 +23,8 @@ def apply_athena_hints(
|
|
|
24
23
|
athena_adapter(
|
|
25
24
|
resource,
|
|
26
25
|
athena_partition.day(partition_column)
|
|
27
|
-
if partition_hint
|
|
26
|
+
if partition_hint
|
|
27
|
+
and partition_hint.get("data_type") in ("timestamp", "date")
|
|
28
28
|
else partition_column,
|
|
29
29
|
)
|
|
30
30
|
|