ingestr 0.13.36__tar.gz → 0.13.37__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.36 → ingestr-0.13.37}/PKG-INFO +1 -1
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/.vitepress/config.mjs +1 -0
- ingestr-0.13.37/ingestr/src/buildinfo.py +1 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/factory.py +2 -0
- ingestr-0.13.37/ingestr/src/phantombuster/__init__.py +38 -0
- ingestr-0.13.37/ingestr/src/phantombuster/client.py +65 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/sources.py +41 -1
- ingestr-0.13.36/ingestr/src/buildinfo.py +0 -1
- {ingestr-0.13.36 → ingestr-0.13.37}/.dockerignore +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/.githooks/pre-commit-hook.sh +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/.github/workflows/deploy-docs.yml +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/.github/workflows/release.yml +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/.github/workflows/secrets-scan.yml +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/.github/workflows/tests.yml +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/.gitignore +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/.gitleaksignore +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/.python-version +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/.vale.ini +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/Dockerfile +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/LICENSE.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/Makefile +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/README.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/.vitepress/theme/custom.css +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/.vitepress/theme/index.js +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/commands/example-uris.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/commands/ingest.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/getting-started/core-concepts.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/getting-started/incremental-loading.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/getting-started/quickstart.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/getting-started/telemetry.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/index.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/media/applovin_max.png +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/media/athena.png +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/media/clickhouse_img.png +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/media/freshdesk_ingestion.png +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/media/github.png +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/media/google_analytics_realtime_report.png +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/media/googleanalytics.png +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/media/kinesis.bigquery.png +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/media/linkedin_ads.png +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/media/personio.png +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/media/personio_duckdb.png +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/media/pipedrive.png +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/media/stripe_postgres.png +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/media/tiktok.png +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/adjust.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/airtable.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/applovin.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/applovin_max.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/appsflyer.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/appstore.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/asana.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/athena.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/bigquery.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/chess.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/clickhouse.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/csv.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/custom_queries.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/databricks.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/db2.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/duckdb.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/dynamodb.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/facebook-ads.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/frankfurter.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/freshdesk.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/gcs.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/github.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/google-ads.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/google_analytics.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/gorgias.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/gsheets.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/hubspot.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/kafka.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/kinesis.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/klaviyo.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/linkedin_ads.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/mongodb.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/mssql.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/mysql.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/notion.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/oracle.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/personio.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/pipedrive.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/postgres.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/redshift.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/s3.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/salesforce.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/sap-hana.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/shopify.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/slack.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/snowflake.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/sqlite.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/stripe.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/tiktok-ads.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/supported-sources/zendesk.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/tutorials/load-kinesis-bigquery.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/tutorials/load-personio-duckdb.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/docs/tutorials/load-stripe-postgres.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/conftest.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/main.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/.gitignore +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/adjust/__init__.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/adjust/adjust_helpers.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/airtable/__init__.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/applovin/__init__.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/applovin_max/__init__.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/appsflyer/__init__.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/appsflyer/client.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/appstore/__init__.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/appstore/client.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/appstore/errors.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/appstore/models.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/appstore/resources.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/arrow/__init__.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/asana_source/__init__.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/asana_source/helpers.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/asana_source/settings.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/blob.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/chess/__init__.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/chess/helpers.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/chess/settings.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/collector/spinner.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/destinations.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/dynamodb/__init__.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/errors.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/facebook_ads/__init__.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/facebook_ads/exceptions.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/facebook_ads/helpers.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/facebook_ads/settings.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/filesystem/__init__.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/filesystem/helpers.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/filesystem/readers.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/filters.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/frankfurter/__init__.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/frankfurter/helpers.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/freshdesk/__init__.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/freshdesk/freshdesk_client.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/freshdesk/settings.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/github/__init__.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/github/helpers.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/github/queries.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/github/settings.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/google_ads/__init__.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/google_ads/field.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/google_ads/metrics.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/google_ads/predicates.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/google_ads/reports.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/google_analytics/__init__.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/google_analytics/helpers.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/google_sheets/README.md +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/google_sheets/__init__.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/gorgias/__init__.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/gorgias/helpers.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/hubspot/__init__.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/hubspot/helpers.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/hubspot/settings.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/kafka/__init__.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/kafka/helpers.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/kinesis/__init__.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/kinesis/helpers.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/klaviyo/__init__.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/klaviyo/client.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/klaviyo/helpers.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/linkedin_ads/__init__.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/linkedin_ads/helpers.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/loader.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/mongodb/__init__.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/mongodb/helpers.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/notion/__init__.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/notion/helpers/__init__.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/notion/helpers/client.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/notion/helpers/database.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/notion/settings.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/partition.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/personio/__init__.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/personio/helpers.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/pipedrive/__init__.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/pipedrive/helpers/__init__.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/pipedrive/helpers/custom_fields_munger.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/pipedrive/helpers/pages.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/pipedrive/settings.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/pipedrive/typing.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/resource.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/salesforce/__init__.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/salesforce/helpers.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/shopify/__init__.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/shopify/exceptions.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/shopify/helpers.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/shopify/settings.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/slack/__init__.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/slack/helpers.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/slack/settings.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/sql_database/__init__.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/sql_database/callbacks.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/stripe_analytics/__init__.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/stripe_analytics/helpers.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/stripe_analytics/settings.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/table_definition.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/telemetry/event.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/testdata/fakebqcredentials.json +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/tiktok_ads/__init__.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/time.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/version.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/zendesk/__init__.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/zendesk/helpers/__init__.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/zendesk/helpers/credentials.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/src/zendesk/settings.py +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/testdata/.gitignore +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/testdata/create_replace.csv +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/testdata/delete_insert_expected.csv +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/testdata/delete_insert_part1.csv +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/testdata/delete_insert_part2.csv +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/testdata/merge_expected.csv +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/testdata/merge_part1.csv +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/ingestr/testdata/merge_part2.csv +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/package-lock.json +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/package.json +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/pyproject.toml +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/requirements-dev.txt +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/requirements.in +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/requirements.txt +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/requirements_arm64.txt +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/resources/demo.gif +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/resources/demo.tape +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/resources/ingestr.svg +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/styles/Google/AMPM.yml +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/styles/Google/Acronyms.yml +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/styles/Google/Colons.yml +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/styles/Google/Contractions.yml +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/styles/Google/DateFormat.yml +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/styles/Google/Ellipses.yml +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/styles/Google/EmDash.yml +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/styles/Google/Exclamation.yml +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/styles/Google/FirstPerson.yml +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/styles/Google/Gender.yml +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/styles/Google/GenderBias.yml +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/styles/Google/HeadingPunctuation.yml +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/styles/Google/Headings.yml +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/styles/Google/Latin.yml +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/styles/Google/LyHyphens.yml +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/styles/Google/OptionalPlurals.yml +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/styles/Google/Ordinal.yml +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/styles/Google/OxfordComma.yml +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/styles/Google/Parens.yml +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/styles/Google/Passive.yml +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/styles/Google/Periods.yml +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/styles/Google/Quotes.yml +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/styles/Google/Ranges.yml +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/styles/Google/Semicolons.yml +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/styles/Google/Slang.yml +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/styles/Google/Spacing.yml +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/styles/Google/Spelling.yml +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/styles/Google/Units.yml +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/styles/Google/We.yml +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/styles/Google/Will.yml +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/styles/Google/WordList.yml +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/styles/Google/meta.json +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/styles/Google/vocab.txt +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/styles/bruin/Ingestr.yml +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/styles/config/vocabularies/bruin/accept.txt +0 -0
- {ingestr-0.13.36 → ingestr-0.13.37}/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.37
|
|
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
|
|
@@ -119,6 +119,7 @@ export default defineConfig({
|
|
|
119
119
|
link: "/supported-sources/facebook-ads.md",
|
|
120
120
|
},
|
|
121
121
|
{ text: "Frankfurter", link: "/supported-sources/frankfurter.md" },
|
|
122
|
+
{ text: "Freshdesk", link: "/supported-sources/freshdesk.md" },
|
|
122
123
|
{ text: "Google Cloud Storage (GCS)", link: "/supported-sources/gcs.md" },
|
|
123
124
|
{ text: "Google Analytics", link: "/supported-sources/google_analytics.md" },
|
|
124
125
|
{ text: "Google Ads", link: "/supported-sources/google-ads.md" },
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
version = "v0.13.37"
|
|
@@ -54,6 +54,7 @@ from ingestr.src.sources import (
|
|
|
54
54
|
TikTokSource,
|
|
55
55
|
ZendeskSource,
|
|
56
56
|
FreshdeskSource,
|
|
57
|
+
PhantombusterSource,
|
|
57
58
|
)
|
|
58
59
|
|
|
59
60
|
SQL_SOURCE_SCHEMES = [
|
|
@@ -150,6 +151,7 @@ class SourceDestinationFactory:
|
|
|
150
151
|
"pipedrive": PipedriveSource,
|
|
151
152
|
"frankfurter": FrankfurterSource,
|
|
152
153
|
"freshdesk": FreshdeskSource,
|
|
154
|
+
"phantombuster": PhantombusterSource,
|
|
153
155
|
}
|
|
154
156
|
destinations: Dict[str, Type[DestinationProtocol]] = {
|
|
155
157
|
"bigquery": BigQueryDestination,
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
from typing import Iterable, Optional
|
|
2
|
+
|
|
3
|
+
import dlt
|
|
4
|
+
import pendulum
|
|
5
|
+
import requests
|
|
6
|
+
from dlt.common.typing import TDataItem
|
|
7
|
+
from dlt.sources import DltResource
|
|
8
|
+
from dlt.sources.helpers.requests import Client
|
|
9
|
+
|
|
10
|
+
from ingestr.src.phantombuster.client import PhantombusterClient
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def retry_on_limit(
|
|
14
|
+
response: Optional[requests.Response], exception: Optional[BaseException]
|
|
15
|
+
) -> bool:
|
|
16
|
+
if response is not None and response.status_code == 429:
|
|
17
|
+
return True
|
|
18
|
+
return False
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def create_client() -> requests.Session:
|
|
22
|
+
return Client(
|
|
23
|
+
raise_for_status=False,
|
|
24
|
+
retry_condition=retry_on_limit,
|
|
25
|
+
request_max_attempts=12,
|
|
26
|
+
request_backoff_factor=2,
|
|
27
|
+
).session
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@dlt.source(max_table_nesting=0)
|
|
31
|
+
def phantombuster_source(api_key: str, agent_id: str, start_date: pendulum.DateTime, end_date: pendulum.DateTime) -> Iterable[DltResource]:
|
|
32
|
+
client = PhantombusterClient(api_key)
|
|
33
|
+
|
|
34
|
+
@dlt.resource()
|
|
35
|
+
def completed_phantoms() -> Iterable[TDataItem]:
|
|
36
|
+
yield client.fetch_containers_result(create_client(), agent_id, start_date, end_date)
|
|
37
|
+
|
|
38
|
+
return completed_phantoms
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
from typing import Union
|
|
2
|
+
|
|
3
|
+
import pendulum
|
|
4
|
+
import requests
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class PhantombusterClient:
|
|
8
|
+
def __init__(self, api_key: str):
|
|
9
|
+
self.api_key = api_key
|
|
10
|
+
|
|
11
|
+
def _get_headers(self):
|
|
12
|
+
return {
|
|
13
|
+
"X-Phantombuster-Key-1": self.api_key,
|
|
14
|
+
"accept": "application/json",
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
def fetch_containers_result(self, session: requests.Session, agent_id: str, start_date: pendulum.DateTime, end_date: pendulum.DateTime):
|
|
18
|
+
url = "https://api.phantombuster.com/api/v2/containers/fetch-all/"
|
|
19
|
+
before_ended_at = None
|
|
20
|
+
limit = 100
|
|
21
|
+
started_at = start_date.int_timestamp * 1000 + int(start_date.microsecond / 1000)
|
|
22
|
+
ended_at = end_date.int_timestamp * 1000 + int(end_date.microsecond / 1000)
|
|
23
|
+
while True:
|
|
24
|
+
params: dict[str, Union[str, int, float, bytes, None]] = {
|
|
25
|
+
"agentId": agent_id,
|
|
26
|
+
"limit": limit,
|
|
27
|
+
"mode": "finalized",
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if before_ended_at:
|
|
31
|
+
params["beforeEndedAt"] = before_ended_at
|
|
32
|
+
|
|
33
|
+
response = session.get(url=url, headers=self._get_headers(), params=params)
|
|
34
|
+
data = response.json()
|
|
35
|
+
containers = data.get("containers", [])
|
|
36
|
+
|
|
37
|
+
for container in containers:
|
|
38
|
+
container_ended_at = container.get("endedAt")
|
|
39
|
+
if before_ended_at is None or before_ended_at > container["endedAt"]:
|
|
40
|
+
before_ended_at = container["endedAt"]
|
|
41
|
+
|
|
42
|
+
if not (started_at <= container_ended_at <= ended_at):
|
|
43
|
+
continue
|
|
44
|
+
try:
|
|
45
|
+
result = self.fetch_result_object(session, container["id"])
|
|
46
|
+
partition_dt = pendulum.from_timestamp(container_ended_at / 1000, tz="UTC").to_date_string()
|
|
47
|
+
row = {"container": container, "result": result, "partition_dt": partition_dt}
|
|
48
|
+
yield row
|
|
49
|
+
|
|
50
|
+
except requests.RequestException as e:
|
|
51
|
+
print(f"Error fetching result for container {container['id']}: {e}")
|
|
52
|
+
|
|
53
|
+
if data["maxLimitReached"] is False:
|
|
54
|
+
break
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def fetch_result_object(self, session: requests.Session, container_id: str):
|
|
58
|
+
result_url = (
|
|
59
|
+
"https://api.phantombuster.com/api/v2/containers/fetch-result-object"
|
|
60
|
+
)
|
|
61
|
+
params = {"id": container_id}
|
|
62
|
+
response = session.get(result_url, headers=self._get_headers(), params=params)
|
|
63
|
+
response.raise_for_status()
|
|
64
|
+
|
|
65
|
+
return response.json()
|
|
@@ -2231,4 +2231,44 @@ class FreshdeskSource:
|
|
|
2231
2231
|
|
|
2232
2232
|
from ingestr.src.freshdesk import freshdesk_source
|
|
2233
2233
|
return freshdesk_source(api_secret_key=api_key[0], domain=domain).with_resources(table)
|
|
2234
|
-
|
|
2234
|
+
|
|
2235
|
+
class PhantombusterSource:
|
|
2236
|
+
def handles_incrementality(self) -> bool:
|
|
2237
|
+
return True
|
|
2238
|
+
|
|
2239
|
+
def dlt_source(self, uri: str, table: str, **kwargs):
|
|
2240
|
+
#phantombuster://?api_key=<api_key>
|
|
2241
|
+
#source table = phantom_results:agent_id
|
|
2242
|
+
parsed_uri = urlparse(uri)
|
|
2243
|
+
params = parse_qs(parsed_uri.query)
|
|
2244
|
+
api_key = params.get("api_key")
|
|
2245
|
+
if api_key is None:
|
|
2246
|
+
raise MissingValueError("api_key", "Phantombuster")
|
|
2247
|
+
|
|
2248
|
+
table_fields = table.replace(" ", "").split(":")
|
|
2249
|
+
table_name = table_fields[0]
|
|
2250
|
+
|
|
2251
|
+
agent_id = table_fields[1] if len(table_fields) > 1 else None
|
|
2252
|
+
|
|
2253
|
+
if table_name not in ["completed_phantoms"]:
|
|
2254
|
+
raise UnsupportedResourceError(table_name, "Phantombuster")
|
|
2255
|
+
|
|
2256
|
+
if not agent_id:
|
|
2257
|
+
raise MissingValueError("agent_id", "Phantombuster")
|
|
2258
|
+
|
|
2259
|
+
start_date = kwargs.get("interval_start")
|
|
2260
|
+
if start_date is not None:
|
|
2261
|
+
start_date = ensure_pendulum_datetime(start_date)
|
|
2262
|
+
else:
|
|
2263
|
+
start_date = pendulum.parse("2018-01-01")
|
|
2264
|
+
|
|
2265
|
+
end_date = kwargs.get("interval_end")
|
|
2266
|
+
|
|
2267
|
+
#doesnot support incremental loading
|
|
2268
|
+
if end_date is not None:
|
|
2269
|
+
end_date = ensure_pendulum_datetime(end_date)
|
|
2270
|
+
else:
|
|
2271
|
+
end_date = pendulum.now()
|
|
2272
|
+
|
|
2273
|
+
from ingestr.src.phantombuster import phantombuster_source
|
|
2274
|
+
return phantombuster_source(api_key=api_key[0], agent_id=agent_id, start_date=start_date, end_date=end_date).with_resources(table_name)
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
version = "v0.13.36"
|
|
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
|