ingestr 0.13.26__tar.gz → 0.13.28__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.26 → ingestr-0.13.28}/PKG-INFO +2 -2
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/google_analytics.md +6 -1
- ingestr-0.13.28/ingestr/src/buildinfo.py +1 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/hubspot/__init__.py +31 -3
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/hubspot/helpers.py +6 -2
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/sources.py +25 -6
- {ingestr-0.13.26 → ingestr-0.13.28}/requirements.txt +1 -1
- ingestr-0.13.26/ingestr/src/buildinfo.py +0 -1
- {ingestr-0.13.26 → ingestr-0.13.28}/.dockerignore +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/.githooks/pre-commit-hook.sh +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/.github/workflows/deploy-docs.yml +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/.github/workflows/release.yml +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/.github/workflows/secrets-scan.yml +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/.github/workflows/tests.yml +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/.gitignore +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/.gitleaksignore +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/.python-version +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/.vale.ini +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/Dockerfile +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/LICENSE.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/Makefile +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/README.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/.vitepress/config.mjs +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/.vitepress/theme/custom.css +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/.vitepress/theme/index.js +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/commands/example-uris.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/commands/ingest.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/getting-started/core-concepts.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/getting-started/incremental-loading.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/getting-started/quickstart.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/getting-started/telemetry.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/index.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/media/applovin_max.png +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/media/athena.png +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/media/clickhouse_img.png +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/media/github.png +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/media/googleanalytics.png +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/media/kinesis.bigquery.png +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/media/linkedin_ads.png +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/media/personio.png +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/media/personio_duckdb.png +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/media/pipedrive.png +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/media/stripe_postgres.png +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/media/tiktok.png +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/adjust.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/airtable.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/applovin.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/applovin_max.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/appsflyer.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/appstore.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/asana.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/athena.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/bigquery.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/chess.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/clickhouse.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/csv.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/custom_queries.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/databricks.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/db2.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/duckdb.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/dynamodb.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/facebook-ads.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/frankfurter.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/gcs.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/github.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/google-ads.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/gorgias.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/gsheets.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/hubspot.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/kafka.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/kinesis.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/klaviyo.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/linkedin_ads.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/mongodb.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/mssql.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/mysql.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/notion.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/oracle.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/personio.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/pipedrive.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/postgres.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/redshift.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/s3.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/salesforce.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/sap-hana.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/shopify.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/slack.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/snowflake.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/sqlite.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/stripe.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/tiktok-ads.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/supported-sources/zendesk.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/tutorials/load-kinesis-bigquery.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/tutorials/load-personio-duckdb.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/docs/tutorials/load-stripe-postgres.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/conftest.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/main.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/.gitignore +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/adjust/__init__.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/adjust/adjust_helpers.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/airtable/__init__.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/applovin/__init__.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/applovin_max/__init__.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/appsflyer/_init_.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/appsflyer/client.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/appstore/__init__.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/appstore/client.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/appstore/errors.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/appstore/models.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/appstore/resources.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/arrow/__init__.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/asana_source/__init__.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/asana_source/helpers.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/asana_source/settings.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/blob.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/chess/__init__.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/chess/helpers.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/chess/settings.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/destinations.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/dynamodb/__init__.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/errors.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/facebook_ads/__init__.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/facebook_ads/exceptions.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/facebook_ads/helpers.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/facebook_ads/settings.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/factory.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/filesystem/__init__.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/filesystem/helpers.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/filesystem/readers.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/filters.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/frankfurter/__init__.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/frankfurter/helpers.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/github/__init__.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/github/helpers.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/github/queries.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/github/settings.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/google_ads/__init__.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/google_ads/field.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/google_ads/metrics.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/google_ads/predicates.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/google_ads/reports.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/google_analytics/__init__.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/google_analytics/helpers.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/google_sheets/README.md +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/google_sheets/__init__.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/gorgias/__init__.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/gorgias/helpers.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/hubspot/settings.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/kafka/__init__.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/kafka/helpers.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/kinesis/__init__.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/kinesis/helpers.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/klaviyo/_init_.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/klaviyo/client.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/klaviyo/helpers.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/linkedin_ads/__init__.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/linkedin_ads/helpers.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/loader.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/mongodb/__init__.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/mongodb/helpers.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/notion/__init__.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/notion/helpers/__init__.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/notion/helpers/client.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/notion/helpers/database.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/notion/settings.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/partition.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/personio/__init__.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/personio/helpers.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/pipedrive/__init__.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/pipedrive/helpers/__init__.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/pipedrive/helpers/custom_fields_munger.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/pipedrive/helpers/pages.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/pipedrive/settings.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/pipedrive/typing.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/resource.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/salesforce/__init__.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/salesforce/helpers.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/shopify/__init__.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/shopify/exceptions.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/shopify/helpers.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/shopify/settings.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/slack/__init__.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/slack/helpers.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/slack/settings.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/sql_database/__init__.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/sql_database/callbacks.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/stripe_analytics/__init__.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/stripe_analytics/helpers.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/stripe_analytics/settings.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/table_definition.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/telemetry/event.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/testdata/fakebqcredentials.json +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/tiktok_ads/__init__.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/time.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/version.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/zendesk/__init__.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/zendesk/helpers/__init__.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/zendesk/helpers/credentials.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/src/zendesk/settings.py +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/testdata/.gitignore +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/testdata/create_replace.csv +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/testdata/delete_insert_expected.csv +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/testdata/delete_insert_part1.csv +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/testdata/delete_insert_part2.csv +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/testdata/merge_expected.csv +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/testdata/merge_part1.csv +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/ingestr/testdata/merge_part2.csv +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/package-lock.json +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/package.json +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/pyproject.toml +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/requirements-dev.txt +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/requirements.in +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/requirements_arm64.txt +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/resources/demo.gif +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/resources/demo.tape +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/resources/ingestr.svg +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/AMPM.yml +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Acronyms.yml +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Colons.yml +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Contractions.yml +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/DateFormat.yml +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Ellipses.yml +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/EmDash.yml +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Exclamation.yml +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/FirstPerson.yml +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Gender.yml +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/GenderBias.yml +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/HeadingPunctuation.yml +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Headings.yml +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Latin.yml +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/LyHyphens.yml +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/OptionalPlurals.yml +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Ordinal.yml +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/OxfordComma.yml +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Parens.yml +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Passive.yml +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Periods.yml +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Quotes.yml +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Ranges.yml +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Semicolons.yml +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Slang.yml +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Spacing.yml +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Spelling.yml +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Units.yml +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/We.yml +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/Will.yml +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/WordList.yml +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/meta.json +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/styles/Google/vocab.txt +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/styles/bruin/Ingestr.yml +0 -0
- {ingestr-0.13.26 → ingestr-0.13.28}/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.28
|
|
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
|
|
@@ -74,7 +74,7 @@ Requires-Dist: google-cloud-storage==3.1.0
|
|
|
74
74
|
Requires-Dist: google-crc32c==1.6.0
|
|
75
75
|
Requires-Dist: google-resumable-media==2.7.2
|
|
76
76
|
Requires-Dist: googleapis-common-protos==1.69.0
|
|
77
|
-
Requires-Dist: greenlet==3.
|
|
77
|
+
Requires-Dist: greenlet==3.2.0
|
|
78
78
|
Requires-Dist: grpcio-status==1.62.3
|
|
79
79
|
Requires-Dist: grpcio==1.70.0
|
|
80
80
|
Requires-Dist: hdbcli==2.23.27
|
|
@@ -9,10 +9,15 @@ The URI format for Google Analytics is as follows:
|
|
|
9
9
|
```plaintext
|
|
10
10
|
googleanalytics://?credentials_path=/path/to/service/account.json&property_id=<property_id>
|
|
11
11
|
```
|
|
12
|
+
Alternatively, you can use base64 encoded credentials:
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
googleanalytics://?credentials_base64=<base64_encoded_credentials>&property_id=<property_id>
|
|
16
|
+
```
|
|
12
17
|
|
|
13
18
|
URI parameters:
|
|
14
19
|
- `credentials_path`: The path to the service account JSON file.
|
|
15
|
-
- `property_id`: It is a unique number that identifies a particular property on Google Analytics. [Follow this guide](https://developers.google.com/analytics/devguides/reporting/data/v1/property-id#what_is_my_property_id)
|
|
20
|
+
- `property_id`: It is a unique number that identifies a particular property on Google Analytics. [Follow this guide](https://developers.google.com/analytics/devguides/reporting/data/v1/property-id#what_is_my_property_id) to know more about property ID.
|
|
16
21
|
|
|
17
22
|
## Setting up an Google Analytics Integration
|
|
18
23
|
Google Analytics requires a few steps to set up an integration, please follow the guide dltHub [has built here](https://dlthub.com/docs/dlt-ecosystem/verified-sources/google_analytics#grab-google-service-account-credentials). Once you complete the guide, you should have an `.json` file and `project_id`.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
version = "v0.13.28"
|
|
@@ -56,6 +56,7 @@ def hubspot(
|
|
|
56
56
|
api_key: str = dlt.secrets.value,
|
|
57
57
|
include_history: bool = False,
|
|
58
58
|
include_custom_props: bool = True,
|
|
59
|
+
custom_object: str = None,
|
|
59
60
|
) -> Sequence[DltResource]:
|
|
60
61
|
"""
|
|
61
62
|
A DLT source that retrieves data from the HubSpot API using the
|
|
@@ -162,13 +163,13 @@ def hubspot(
|
|
|
162
163
|
props,
|
|
163
164
|
include_custom_props,
|
|
164
165
|
)
|
|
165
|
-
|
|
166
|
+
|
|
166
167
|
@dlt.resource(name="schemas", write_disposition="merge", primary_key="id")
|
|
167
168
|
def schemas(
|
|
168
169
|
api_key: str = api_key,
|
|
169
170
|
) -> Iterator[TDataItems]:
|
|
170
171
|
"""Hubspot schemas resource"""
|
|
171
|
-
yield from fetch_data(CRM_SCHEMAS_ENDPOINT, api_key)
|
|
172
|
+
yield from fetch_data(CRM_SCHEMAS_ENDPOINT, api_key,resource_name="schemas")
|
|
172
173
|
|
|
173
174
|
@dlt.resource(name="quotes", write_disposition="replace")
|
|
174
175
|
def quotes(
|
|
@@ -186,7 +187,34 @@ def hubspot(
|
|
|
186
187
|
include_custom_props,
|
|
187
188
|
)
|
|
188
189
|
|
|
189
|
-
|
|
190
|
+
@dlt.resource(write_disposition="merge", primary_key="hs_object_id")
|
|
191
|
+
def custom(
|
|
192
|
+
api_key: str = api_key,
|
|
193
|
+
custom_object_name: str = custom_object,
|
|
194
|
+
) -> Iterator[TDataItems]:
|
|
195
|
+
|
|
196
|
+
get_custom_object = schemas(api_key)
|
|
197
|
+
object_type_id = None
|
|
198
|
+
for custom_object in get_custom_object:
|
|
199
|
+
if custom_object["name"] == custom_object_name.capitalize():
|
|
200
|
+
object_type_id = custom_object["objectTypeId"]
|
|
201
|
+
break
|
|
202
|
+
if object_type_id is None:
|
|
203
|
+
raise ValueError(f"There is no such custom object as {custom_object_name}")
|
|
204
|
+
custom_object_properties= f"crm/v3/properties/{object_type_id}"
|
|
205
|
+
|
|
206
|
+
props_pages = fetch_data(custom_object_properties, api_key)
|
|
207
|
+
props = []
|
|
208
|
+
for page in props_pages:
|
|
209
|
+
props.extend([prop["name"] for prop in page])
|
|
210
|
+
props = ",".join(sorted(list(set(props))))
|
|
211
|
+
|
|
212
|
+
custom_object_endpoint= f"crm/v3/objects/{object_type_id}/?properties={props}"
|
|
213
|
+
|
|
214
|
+
"""Hubspot custom object details resource"""
|
|
215
|
+
yield from fetch_data(custom_object_endpoint, api_key,resource_name="custom")
|
|
216
|
+
|
|
217
|
+
return companies, contacts, deals, tickets, products, quotes, schemas, custom
|
|
190
218
|
|
|
191
219
|
|
|
192
220
|
def crm_objects(
|
|
@@ -90,7 +90,7 @@ def fetch_property_history(
|
|
|
90
90
|
|
|
91
91
|
|
|
92
92
|
def fetch_data(
|
|
93
|
-
endpoint: str, api_key: str, params: Optional[Dict[str, Any]] = None
|
|
93
|
+
endpoint: str, api_key: str, params: Optional[Dict[str, Any]] = None,resource_name: str = None
|
|
94
94
|
) -> Iterator[List[Dict[str, Any]]]:
|
|
95
95
|
"""
|
|
96
96
|
Fetch data from HUBSPOT endpoint using a specified API key and yield the properties of each result.
|
|
@@ -132,7 +132,7 @@ def fetch_data(
|
|
|
132
132
|
if "results" in _data:
|
|
133
133
|
_objects: List[Dict[str, Any]] = []
|
|
134
134
|
for _result in _data["results"]:
|
|
135
|
-
if
|
|
135
|
+
if resource_name == "schemas":
|
|
136
136
|
_objects.append({
|
|
137
137
|
"name": _result["labels"].get("singular", ""),
|
|
138
138
|
"objectTypeId": _result.get("objectTypeId", ""),
|
|
@@ -142,6 +142,10 @@ def fetch_data(
|
|
|
142
142
|
"createdAt": _result.get("createdAt", ""),
|
|
143
143
|
"updatedAt": _result.get("updatedAt", "")
|
|
144
144
|
})
|
|
145
|
+
elif resource_name == "custom":
|
|
146
|
+
_objects.append(
|
|
147
|
+
_result.get("properties", ""),
|
|
148
|
+
)
|
|
145
149
|
else:
|
|
146
150
|
_obj = _result.get("properties", _result)
|
|
147
151
|
if "id" not in _obj and "id" in _result:
|
|
@@ -803,7 +803,20 @@ class HubspotSource:
|
|
|
803
803
|
raise ValueError("api_key in the URI is required to connect to Hubspot")
|
|
804
804
|
|
|
805
805
|
endpoint = None
|
|
806
|
-
|
|
806
|
+
|
|
807
|
+
if table.startswith("custom:"):
|
|
808
|
+
fields = table.split(":", 2)
|
|
809
|
+
if len(fields) != 2:
|
|
810
|
+
raise ValueError(
|
|
811
|
+
"Invalid Hubspot custom table format. Expected format: custom:<custom_object_type>"
|
|
812
|
+
)
|
|
813
|
+
endpoint = fields[1]
|
|
814
|
+
return hubspot(
|
|
815
|
+
api_key=api_key[0],
|
|
816
|
+
custom_object=endpoint,
|
|
817
|
+
).with_resources("custom")
|
|
818
|
+
|
|
819
|
+
elif table in ["contacts", "companies", "deals", "tickets", "products", "quotes", "schemas"]:
|
|
807
820
|
endpoint = table
|
|
808
821
|
else:
|
|
809
822
|
raise ValueError(
|
|
@@ -1398,13 +1411,19 @@ class GoogleAnalyticsSource:
|
|
|
1398
1411
|
parse_uri = urlparse(uri)
|
|
1399
1412
|
source_fields = parse_qs(parse_uri.query)
|
|
1400
1413
|
cred_path = source_fields.get("credentials_path")
|
|
1414
|
+
cred_base64 = source_fields.get("credentials_base64")
|
|
1401
1415
|
|
|
1402
|
-
if not cred_path:
|
|
1403
|
-
raise ValueError("credentials_path is required to connect Google Analytics")
|
|
1404
|
-
credentials = {}
|
|
1416
|
+
if not cred_path and not cred_base64:
|
|
1417
|
+
raise ValueError("credentials_path or credentials_base64 is required to connect Google Analytics")
|
|
1405
1418
|
|
|
1406
|
-
|
|
1407
|
-
|
|
1419
|
+
credentials = {}
|
|
1420
|
+
if cred_path:
|
|
1421
|
+
with open(cred_path[0], "r") as f:
|
|
1422
|
+
credentials = json.load(f)
|
|
1423
|
+
elif cred_base64:
|
|
1424
|
+
credentials = json.loads(
|
|
1425
|
+
base64.b64decode(cred_base64[0]).decode("utf-8")
|
|
1426
|
+
)
|
|
1408
1427
|
|
|
1409
1428
|
property_id = source_fields.get("property_id")
|
|
1410
1429
|
if not property_id:
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
version = "v0.13.26"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|