ingestr 0.13.90__tar.gz → 0.13.91__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.90 → ingestr-0.13.91}/PKG-INFO +1 -1
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/adjust.md +12 -9
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/airtable.md +22 -5
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/appsflyer.md +39 -8
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/appstore.md +60 -59
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/salesforce.md +20 -0
- ingestr-0.13.91/ingestr/src/buildinfo.py +1 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/salesforce/__init__.py +6 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/sources.py +6 -1
- {ingestr-0.13.90 → ingestr-0.13.91}/pyproject.toml +5 -2
- ingestr-0.13.90/ingestr/src/buildinfo.py +0 -1
- {ingestr-0.13.90 → ingestr-0.13.91}/.dlt/config.toml +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/.dockerignore +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/.githooks/pre-commit-hook.sh +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/.github/workflows/deploy-docs.yml +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/.github/workflows/release.yml +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/.github/workflows/secrets-scan.yml +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/.github/workflows/tests.yml +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/.gitignore +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/.gitleaksignore +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/.python-version +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/.vale.ini +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/Dockerfile +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/LICENSE.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/Makefile +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/README.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/.vitepress/config.mjs +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/.vitepress/theme/custom.css +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/.vitepress/theme/index.js +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/commands/example-uris.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/commands/ingest.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/getting-started/core-concepts.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/getting-started/data-masking.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/getting-started/incremental-loading.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/getting-started/quickstart.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/getting-started/telemetry.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/index.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/media/applovin_max.png +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/media/athena.png +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/media/clickhouse_img.png +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/media/clickup_ingestion.png +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/media/cratedb-destination.png +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/media/cratedb-source.png +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/media/freshdesk_ingestion.png +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/media/gcp_spanner_ingestion.png +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/media/github.png +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/media/google_analytics_realtime_report.png +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/media/googleanalytics.png +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/media/ingestion_elasticsearch_img.png +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/media/kinesis.bigquery.png +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/media/linear.png +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/media/linkedin_ads.png +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/media/mixpanel_ingestion.png +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/media/personio.png +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/media/personio_duckdb.png +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/media/phantombuster.png +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/media/pipedrive.png +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/media/quickbook_ingestion.png +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/media/sftp.png +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/media/stripe_postgres.png +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/media/tiktok.png +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/media/wise_ingestion.png +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/media/zoom_ingestion.png +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/applovin.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/applovin_max.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/asana.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/athena.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/attio.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/bigquery.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/chess.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/clickhouse.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/clickup.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/cratedb.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/csv.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/custom_queries.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/databricks.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/db2.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/duckdb.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/dynamodb.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/elasticsearch.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/facebook-ads.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/fluxx.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/frankfurter.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/freshdesk.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/gcs.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/github.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/google-ads.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/google_analytics.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/gorgias.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/gsheets.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/hubspot.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/influxdb.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/isoc-pulse.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/kafka.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/kinesis.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/klaviyo.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/linear.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/linkedin_ads.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/mixpanel.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/mongodb.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/motherduck.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/mssql.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/mysql.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/notion.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/oracle.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/personio.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/phantombuster.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/pinterest.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/pipedrive.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/postgres.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/quickbooks.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/redshift.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/revenuecat.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/s3.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/sap-hana.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/sftp.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/shopify.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/slack.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/smartsheets.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/snowflake.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/solidgate.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/spanner.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/sqlite.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/stripe.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/tiktok-ads.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/trustpilot.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/wise.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/zendesk.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/supported-sources/zoom.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/tutorials/load-kinesis-bigquery.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/tutorials/load-personio-duckdb.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/docs/tutorials/load-stripe-postgres.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/conftest.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/main.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/.gitignore +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/adjust/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/adjust/adjust_helpers.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/airtable/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/applovin/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/applovin_max/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/appsflyer/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/appsflyer/client.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/appstore/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/appstore/client.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/appstore/errors.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/appstore/models.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/appstore/resources.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/arrow/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/asana_source/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/asana_source/helpers.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/asana_source/settings.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/attio/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/attio/helpers.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/blob.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/chess/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/chess/helpers.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/chess/settings.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/clickup/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/clickup/helpers.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/collector/spinner.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/destinations.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/dynamodb/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/elasticsearch/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/errors.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/facebook_ads/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/facebook_ads/exceptions.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/facebook_ads/helpers.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/facebook_ads/settings.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/facebook_ads/utils.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/factory.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/filesystem/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/filesystem/helpers.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/filesystem/readers.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/filters.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/fluxx/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/fluxx/helpers.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/frankfurter/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/frankfurter/helpers.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/freshdesk/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/freshdesk/freshdesk_client.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/freshdesk/settings.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/github/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/github/helpers.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/github/queries.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/github/settings.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/google_ads/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/google_ads/field.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/google_ads/metrics.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/google_ads/predicates.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/google_ads/reports.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/google_analytics/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/google_analytics/helpers.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/google_sheets/README.md +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/google_sheets/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/gorgias/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/gorgias/helpers.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/http_client.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/hubspot/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/hubspot/helpers.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/hubspot/settings.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/influxdb/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/influxdb/client.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/isoc_pulse/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/kafka/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/kafka/helpers.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/kinesis/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/kinesis/helpers.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/klaviyo/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/klaviyo/client.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/klaviyo/helpers.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/linear/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/linear/helpers.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/linkedin_ads/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/linkedin_ads/helpers.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/loader.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/masking.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/mixpanel/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/mixpanel/client.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/mongodb/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/mongodb/helpers.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/notion/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/notion/helpers/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/notion/helpers/client.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/notion/helpers/database.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/notion/settings.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/partition.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/personio/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/personio/helpers.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/phantombuster/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/phantombuster/client.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/pinterest/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/pipedrive/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/pipedrive/helpers/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/pipedrive/helpers/custom_fields_munger.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/pipedrive/helpers/pages.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/pipedrive/settings.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/pipedrive/typing.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/quickbooks/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/resource.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/revenuecat/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/revenuecat/helpers.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/salesforce/helpers.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/shopify/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/shopify/exceptions.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/shopify/helpers.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/shopify/settings.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/slack/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/slack/helpers.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/slack/settings.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/smartsheets/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/solidgate/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/solidgate/helpers.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/sql_database/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/sql_database/callbacks.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/stripe_analytics/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/stripe_analytics/helpers.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/stripe_analytics/settings.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/table_definition.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/telemetry/event.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/testdata/fakebqcredentials.json +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/tiktok_ads/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/time.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/trustpilot/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/trustpilot/client.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/version.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/wise/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/wise/client.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/zendesk/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/zendesk/helpers/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/zendesk/helpers/credentials.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/zendesk/settings.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/zoom/__init__.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/src/zoom/helpers.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/testdata/.gitignore +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/testdata/create_replace.csv +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/testdata/delete_insert_expected.csv +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/testdata/delete_insert_part1.csv +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/testdata/delete_insert_part2.csv +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/testdata/merge_expected.csv +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/testdata/merge_part1.csv +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/testdata/merge_part2.csv +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/ingestr/tests/unit/test_smartsheets.py +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/package-lock.json +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/package.json +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/requirements-dev.txt +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/requirements.in +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/requirements.txt +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/requirements_arm64.txt +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/resources/demo.gif +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/resources/demo.tape +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/resources/ingestr.svg +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/styles/Google/AMPM.yml +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/styles/Google/Acronyms.yml +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/styles/Google/Colons.yml +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/styles/Google/Contractions.yml +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/styles/Google/DateFormat.yml +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/styles/Google/Ellipses.yml +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/styles/Google/EmDash.yml +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/styles/Google/Exclamation.yml +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/styles/Google/FirstPerson.yml +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/styles/Google/Gender.yml +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/styles/Google/GenderBias.yml +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/styles/Google/HeadingPunctuation.yml +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/styles/Google/Headings.yml +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/styles/Google/Latin.yml +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/styles/Google/LyHyphens.yml +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/styles/Google/OptionalPlurals.yml +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/styles/Google/Ordinal.yml +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/styles/Google/OxfordComma.yml +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/styles/Google/Parens.yml +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/styles/Google/Passive.yml +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/styles/Google/Periods.yml +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/styles/Google/Quotes.yml +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/styles/Google/Ranges.yml +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/styles/Google/Semicolons.yml +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/styles/Google/Slang.yml +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/styles/Google/Spacing.yml +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/styles/Google/Spelling.yml +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/styles/Google/Units.yml +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/styles/Google/We.yml +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/styles/Google/Will.yml +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/styles/Google/WordList.yml +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/styles/Google/meta.json +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/styles/Google/vocab.txt +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/styles/bruin/Ingestr.yml +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/styles/config/vocabularies/bruin/accept.txt +0 -0
- {ingestr-0.13.90 → ingestr-0.13.91}/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.91
|
|
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
|
|
@@ -9,7 +9,7 @@ ingestr supports Adjust as a source.
|
|
|
9
9
|
The URI format for Adjust is as follows:
|
|
10
10
|
|
|
11
11
|
```plaintext
|
|
12
|
-
adjust://?api_key=<api-key-here
|
|
12
|
+
adjust://?api_key=<api-key-here>&lookback_days=40
|
|
13
13
|
```
|
|
14
14
|
Parameters:
|
|
15
15
|
- `api_key`: Required. The API key for the Adjust account.
|
|
@@ -20,7 +20,10 @@ An API token is required to retrieve reports from the Adjust reporting API. plea
|
|
|
20
20
|
Once you complete the guide, you should have an API key. Let's say your API key is `nr_123`, here's a sample command that will copy the data from Adjust into a DuckDB database:
|
|
21
21
|
|
|
22
22
|
```sh
|
|
23
|
-
ingestr ingest --source-uri 'adjust://?api_key=nr_123'
|
|
23
|
+
ingestr ingest --source-uri 'adjust://?api_key=nr_123' \
|
|
24
|
+
--source-table 'campaigns' \
|
|
25
|
+
--dest-uri duckdb:///adjust.duckdb \
|
|
26
|
+
--dest-table 'adjust.output'
|
|
24
27
|
```
|
|
25
28
|
|
|
26
29
|
The result of this command will be a table in the `adjust.duckdb` database.
|
|
@@ -32,6 +35,13 @@ Adjust data may change going back, which means you'll need to change your start
|
|
|
32
35
|
## Tables
|
|
33
36
|
Adjust source allows ingesting data from various sources:
|
|
34
37
|
|
|
38
|
+
| Table | PK/Merge Key | Inc Key | Inc Strategy | Details |
|
|
39
|
+
| --------------- | ----------- | --------------- | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
40
|
+
| [Events](https://dev.adjust.com/en/api/rs-api/events) | id | – | replace | Retrieves data for [events](https://dev.adjust.com/en/api/rs-api/events/) and event slugs. | |
|
|
41
|
+
| [campaigns](https://dev.adjust.com/en/api/rs-api/reports) | day | – | merge | Retrieves data for a campaign, showing the app's revenue and network costs over multiple days. `Columns:` campaign, day, app, store_type, channel, country, network_cost, all_revenue_total_d0, ad_revenue_total_d0, revenue_total_d0, all_revenue_total_d1, ad_revenue_total_d1, revenue_total_d1, all_revenue_total_d3, ad_revenue_total_d3, revenue_total_d3, all_revenue_total_d7, ad_revenue_total_d7, revenue_total_d7, all_revenue_total_d14, ad_revenue_total_d14, revenue_total_d14, all_revenue_total_d21 |
|
|
42
|
+
| [creatives](https://dev.adjust.com/en/api/rs-api/reports) | day | - | merge | Retrieves data for a creative assets, detailing the app's revenue and network costs across multiple days. `Columns:` campaign, day, app, store_type, channel, country, adgroup, creative, network_cost, all_revenue_total_d0, ad_revenue_total_d0, revenue_total_d0, all_revenue_total_d1, ad_revenue_total_d1, revenue_total_d1, all_revenue_total_d3, ad_revenue_total_d3, revenue_total_d3, all_revenue_total_d7, ad_revenue_total_d7, revenue_total_d7, all_revenue_total_d14, ad_revenue_total_d14, revenue_total_d14, all_revenue_total_d21 |
|
|
43
|
+
| `custom` | `configurable` | - | merge | Retrieves custom data based on the dimensions and metrics specified. Please refer to the `custom reports` section below for more information.
|
|
44
|
+
|
|
35
45
|
#### Custom reports: `custom:<dimensions>:<metrics>[:<filters>]`
|
|
36
46
|
|
|
37
47
|
The custom table allows you to retrieve data based on specific dimensions and metrics, and apply filters to the data.
|
|
@@ -50,13 +60,6 @@ Parameters:
|
|
|
50
60
|
> [!WARNING]
|
|
51
61
|
> Custom tables require a time-based dimension for efficient operation, such as `hour`, `day`, `week`, `month`, or `year`.
|
|
52
62
|
|
|
53
|
-
| Table | PK/Merge Key | Inc Key | Inc Strategy | Details |
|
|
54
|
-
| --------------- | ----------- | --------------- | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
55
|
-
| [Events](https://dev.adjust.com/en/api/rs-api/events) | id | – | replace | Retrieves data for [events](https://dev.adjust.com/en/api/rs-api/events/) and event slugs. | |
|
|
56
|
-
| [campaigns](https://dev.adjust.com/en/api/rs-api/reports) | day | – | merge | Retrieves data for a campaign, showing the app's revenue and network costs over multiple days. `Columns:` campaign, day, app, store_type, channel, country, network_cost, all_revenue_total_d0, ad_revenue_total_d0, revenue_total_d0, all_revenue_total_d1, ad_revenue_total_d1, revenue_total_d1, all_revenue_total_d3, ad_revenue_total_d3, revenue_total_d3, all_revenue_total_d7, ad_revenue_total_d7, revenue_total_d7, all_revenue_total_d14, ad_revenue_total_d14, revenue_total_d14, all_revenue_total_d21 |
|
|
57
|
-
| [creatives](https://dev.adjust.com/en/api/rs-api/reports) | day | - | merge | Retrieves data for a creative assets, detailing the app's revenue and network costs across multiple days. `Columns:` campaign, day, app, store_type, channel, country, adgroup, creative, network_cost, all_revenue_total_d0, ad_revenue_total_d0, revenue_total_d0, all_revenue_total_d1, ad_revenue_total_d1, revenue_total_d1, all_revenue_total_d3, ad_revenue_total_d3, revenue_total_d3, all_revenue_total_d7, ad_revenue_total_d7, revenue_total_d7, all_revenue_total_d14, ad_revenue_total_d14, revenue_total_d14, all_revenue_total_d21 |
|
|
58
|
-
| `custom` | `configurable` | - | merge | Retrieves custom data based on the dimensions and metrics specified.
|
|
59
|
-
|
|
60
63
|
## Examples
|
|
61
64
|
|
|
62
65
|
Copy campaigns data from Adjust into a DuckDB database:
|
|
@@ -22,15 +22,32 @@ The URI is used to connect to the Airtable API for extracting data. More details
|
|
|
22
22
|
|
|
23
23
|
Airtable 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/airtable#setup-guide).
|
|
24
24
|
|
|
25
|
-
Once you complete the guide, you should have an Access Token
|
|
25
|
+
Once you complete the guide, you should have an Access Token.
|
|
26
|
+
|
|
27
|
+
The source table you'll use for ingestr will be `<base_id>/<table_id>`.
|
|
28
|
+
|
|
29
|
+
### Getting your Base ID and Table ID
|
|
30
|
+
|
|
31
|
+
To find your Base ID and Table ID:
|
|
32
|
+
|
|
33
|
+
1. Log into Airtable and navigate to your base or table
|
|
34
|
+
2. Look at the URL in your browser's address bar when viewing your base
|
|
35
|
+
3. The Base ID always starts with "app" and appears before the next `/`
|
|
36
|
+
4. The Table IDs start with "tbl" and appears before the next `/`.
|
|
37
|
+
|
|
38
|
+
For example, in this URL:
|
|
39
|
+
```plaintext
|
|
40
|
+
https://airtable.com/appve10kl227BIT4GV/tblOUnZVLFWbemTP1/viw3qtF76bRQC3wKx/rec9khXgeTotgCQ62?blocks=hide
|
|
41
|
+
```
|
|
42
|
+
In this case base_id is `appve10kl227BIT4GV` and table_id is `tblOUnZVLFWbemTP1`
|
|
26
43
|
|
|
27
44
|
Let's say your access token is `patr123.abc` and the base ID is `appXYZ`, here's a sample command that will copy the data from Airtable into a DuckDB database:
|
|
28
45
|
|
|
29
46
|
```sh
|
|
30
|
-
ingestr ingest
|
|
31
|
-
--source-uri 'airtable://?access_token=patr123.abc'
|
|
32
|
-
--source-table 'appXYZ/employee'
|
|
33
|
-
--dest-uri 'duckdb:///airtable.duckdb'
|
|
47
|
+
ingestr ingest \
|
|
48
|
+
--source-uri 'airtable://?access_token=patr123.abc' \
|
|
49
|
+
--source-table 'appXYZ/employee' \
|
|
50
|
+
--dest-uri 'duckdb:///airtable.duckdb' \
|
|
34
51
|
--dest-table 'des.employee'
|
|
35
52
|
```
|
|
36
53
|
|
|
@@ -21,10 +21,10 @@ An API token is required to retrieve reports from the AppsFlyer API, please [fol
|
|
|
21
21
|
Let's say your API key is `ey123`, here's a sample command that will copy the data from AppsFlyer into a DuckDB database:
|
|
22
22
|
|
|
23
23
|
```bash
|
|
24
|
-
ingestr ingest
|
|
25
|
-
--source-uri 'appsflyer://?api_key=ey123'
|
|
26
|
-
--source-table 'campaigns'
|
|
27
|
-
--dest-uri duckdb:///appsflyer.duckdb
|
|
24
|
+
ingestr ingest \
|
|
25
|
+
--source-uri 'appsflyer://?api_key=ey123' \
|
|
26
|
+
--source-table 'campaigns' \
|
|
27
|
+
--dest-uri duckdb:///appsflyer.duckdb \
|
|
28
28
|
--dest-table 'appsflyer.output'
|
|
29
29
|
```
|
|
30
30
|
|
|
@@ -40,7 +40,7 @@ ingestr integrates with the [Master Report API](https://dev.appsflyer.com/hc/ref
|
|
|
40
40
|
| --------------- | ----------- | --------------- | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
41
41
|
| [campaigns](https://dev.appsflyer.com/hc/reference/master_api_get) | install_time | install_time | merge| Retrieves data for campaigns, detailing the app's costs, loyal users, total installs, and revenue over multiple days.`columns:` app_id, campaign, geo, install_time, average_ecpi, clicks, cohort_day_1_revenue_per_user, cohort_day_1_total_revenue_per_user, cohort_day_14_revenue_per_user, cohort_day_14_total_revenue_per_user, cohort_day_21_revenue_per_user, cohort_day_21_total_revenue_per_user, cohort_day_3_revenue_per_user, cohort_day_3_total_revenue_per_user, cohort_day_7_revenue_per_user, cohort_day_7_total_revenue_per_user, cost, impressions, installs, loyal_users, retention_day_7, revenue, roi, uninstalls |
|
|
42
42
|
| [creatives](https://dev.appsflyer.com/hc/reference/master_api_get) | install_time | install_time | merge| Retrieves data for a creative asset, including revenue and cost. `columns:` geo, app_id, install_time, campaign, adset_id, adset, ad_id, impressions, clicks, installs, cost, revenue, average_ecpi, loyal_users, uninstalls, roi |
|
|
43
|
-
| `custom:<dimensions>:<metrics>` | Dynamic (dimensions + install_time) | install_time | merge| Retrieves data for custom tables, which can be specified by the user
|
|
43
|
+
| `custom:<dimensions>:<metrics>` | Dynamic (dimensions + install_time) | install_time | merge| Retrieves data for custom tables, which can be specified by the user. Please refer to the `custom Tables` section below for more information. |
|
|
44
44
|
|
|
45
45
|
Use these as `--source-table` parameter in the `ingestr ingest` command.
|
|
46
46
|
|
|
@@ -48,15 +48,46 @@ Use these as `--source-table` parameter in the `ingestr ingest` command.
|
|
|
48
48
|
|
|
49
49
|
You can also ingest custom tables by providing a list of dimensions and metrics.
|
|
50
50
|
|
|
51
|
-
The
|
|
51
|
+
The format for the custom table is:
|
|
52
52
|
|
|
53
53
|
```plaintext
|
|
54
54
|
custom:<dimension1>,<dimension2>,<metric1>,<metric2>
|
|
55
55
|
```
|
|
56
|
-
|
|
57
|
-
|
|
56
|
+
Parameters:
|
|
57
|
+
- `dimensions`: A comma-separated list of [dimensions](https://support.appsflyer.com/hc/en-us/articles/213223166-Master-API-user-acquisition-metrics-via-API#groupings) to retrieve.
|
|
58
|
+
- `metrics`: A comma-separated list of [metrics](https://support.appsflyer.com/hc/en-us/articles/213223166-Master-API-user-acquisition-metrics-via-API#kpis) to retrieve.
|
|
58
59
|
|
|
59
60
|
For custom tables, ingestr will use the given dimensions as the primary key to deduplicate the data.
|
|
60
61
|
|
|
61
62
|
> [!NOTE]
|
|
62
63
|
> ingestr will add `install_time` as the primary key to the table by default if it is not provided as one of the dimensions.
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
## Examples
|
|
67
|
+
|
|
68
|
+
Copy campaigns data from Appsflyer into a DuckDB database:
|
|
69
|
+
```sh
|
|
70
|
+
ingestr ingest \
|
|
71
|
+
--source-uri 'appsflyer://?api_key=ey123' \
|
|
72
|
+
--source-table 'campaigns' \
|
|
73
|
+
--dest-uri duckdb:///appsflyer.duckdb \
|
|
74
|
+
--dest-table 'dest.output'
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Copy creatives data from Appsflyer into a DuckDB database:
|
|
78
|
+
```sh
|
|
79
|
+
ingestr ingest \
|
|
80
|
+
--source-uri 'appsflyer://?api_key=ey123' \
|
|
81
|
+
--source-table 'creatives' \
|
|
82
|
+
--dest-uri duckdb:///appsflyer.duckdb \
|
|
83
|
+
--dest-table 'dest.output'
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Copy custom data from Appsflyer into a DuckDB database:
|
|
87
|
+
```sh
|
|
88
|
+
ingestr ingest \
|
|
89
|
+
--source-uri "appsflyer://?api_key=ey123" \
|
|
90
|
+
--source-table "custom:app_id,geo,install_time,clicks,install" \
|
|
91
|
+
--dest-uri duckdb:///appsflyer.db \
|
|
92
|
+
--dest-table "mat.example"
|
|
93
|
+
```
|
|
@@ -57,70 +57,14 @@ We recommend using `ONGOING` access-type for reports. Please note that it may ta
|
|
|
57
57
|
|
|
58
58
|
> [!NOTE]
|
|
59
59
|
> you have to create a Report Request for each individual App that you want to ingest data for. You can use [list apps](https://developer.apple.com/documentation/appstoreconnectapi/get-v1-apps) API to get the list of all apps in your Apple Account.
|
|
60
|
-
### Example: Loading App Downloads Analytics
|
|
61
|
-
|
|
62
|
-
For this example, we'll assume that:
|
|
63
|
-
* `key_id` is `key_0`
|
|
64
|
-
* `issuer_id` is `issue_0`
|
|
65
|
-
* `key` is stored in the current directory and is named `api.key`
|
|
66
|
-
* `app_id` is `12345`
|
|
67
|
-
|
|
68
|
-
We will run `ingestr` to save this data to a [duckdb](https://duckdb.org/) database called `analytics.db` under the name `public.app_downloads`.
|
|
69
|
-
|
|
70
|
-
```sh
|
|
71
|
-
ingestr ingest \
|
|
72
|
-
--source-uri "appstore://app_id=12345&key_path=api.key&key_id=key_0&issuer_id=issue_0" \
|
|
73
|
-
--source-table "app-downloads-detailed" \
|
|
74
|
-
--dest-uri "duckdb:///analytics.db" \
|
|
75
|
-
--dest-table "public.app_downloads" \
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
### Example: Loading Data for multiple Apps
|
|
79
|
-
|
|
80
|
-
We will extend the prior example with another app with ID `67890`. To achieve this, simply add another `app_id` query parameter to the URI.
|
|
81
|
-
```sh
|
|
82
|
-
ingestr ingest \
|
|
83
|
-
--source-uri "appstore://app_id=12345&app_id=67890&key_path=api.key&key_id=key_0&issuer_id=issue_0" \
|
|
84
|
-
--source-table "app-downloads-detailed" \
|
|
85
|
-
--dest-uri "duckdb:///analytics.db" \
|
|
86
|
-
--dest-table "public.app_downloads" \
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
### Example: Incremental Loading
|
|
91
|
-
|
|
92
|
-
`ingestr` supports incremental loading for all App Store tables.
|
|
93
|
-
|
|
94
|
-
To begin, we will first load all data till `2025-01-01` by specifying the `--interval-end` flag. We'll assume the same credentials from our [first example](#example-loading-app-downloads-analytics)
|
|
95
|
-
```sh
|
|
96
|
-
ingestr ingest \
|
|
97
|
-
--source-uri "appstore://app_id=12345&key_path=api.key&key_id=key_0&issuer_id=issue_0" \
|
|
98
|
-
--source-table "app-downloads-detailed" \
|
|
99
|
-
--dest-uri "duckdb:///analytics.db" \
|
|
100
|
-
--dest-table "public.app_downloads" \
|
|
101
|
-
--interval-end "2025-01-01"
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
`ingestr` will load all data available till `2025-01-01`. Now we will run `ingestr` again, but this time, we'll let `ingestr` pickup from where it left off by specifying the `--incremental-strategy` flag.
|
|
105
|
-
|
|
106
|
-
```sh
|
|
107
|
-
ingestr ingest \
|
|
108
|
-
--source-uri "appstore://app_id=12345&key_path=api.key&key_id=key_0&issuer_id=issue_0" \
|
|
109
|
-
--source-table "app-downloads-detailed" \
|
|
110
|
-
--dest-uri "duckdb:///analytics.db" \
|
|
111
|
-
--dest-table "public.app_downloads" \
|
|
112
|
-
--incremental-strategy "merge"
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
Notice how we didn't specify a date parameter? `ingestr` will automatically use the metadata from last load and continue loading data from that point on.
|
|
116
60
|
|
|
117
61
|
## Tables
|
|
118
62
|
| Table | PK | Inc Key | Inc Strategy | Details |
|
|
119
63
|
|-------|----|---------|--------------|---------|
|
|
120
64
|
| `app-downloads-detailed` | [App Apple Identifier,App Name, App Version,Campaign,Date,Device,Download Type,Page Title,Page Type,Platform Version,Pre-Order,Source Info,Source Type,Territory] | processing_date | merge | App download analytics including first-time downloads, redownloads, updates, and more. |
|
|
121
|
-
| `app-store-discovery-and-engagement-detailed` |
|
|
122
|
-
|`app-sessions-detailed` |
|
|
123
|
-
| app-store-installation-and-deletion-detailed | [App Apple Identifier,App Download Date,App Name,App Version,Campaign,Counts,Date,Device,Download Type,Event,Page Title,Page Type,Platform Version,Source Info,Source Type,Territory,Unique Devices] | processing_date | merge | App installation and deletion metrics including device to estimate the number of times people install and delete your App Store apps. |
|
|
65
|
+
| `app-store-discovery-and-engagement-detailed` | [App Apple Identifier,App Name,Campaign,Date,Device,Engagement Type,Event,Page Title,Page Type,Platform Version,Source Info,Source Type,Territory] | processing_date | merge | App Store discovery and engagement metrics including data about user engagement with your app’s icons, product pages, in-app event pages, and other install sheets. |
|
|
66
|
+
|`app-sessions-detailed` | [Date,App Name,App Apple Identifier,App Version,Device,Platform Version,Source Type,Source Info,Campaign,Page Type,Page Title,App Download Date,Territory] | processing_date | merge | App Session provides insights on how often people open your app, and how long they spend in your app. |
|
|
67
|
+
| `app-store-installation-and-deletion-detailed` | [App Apple Identifier,App Download Date,App Name,App Version,Campaign,Counts,Date,Device,Download Type,Event,Page Title,Page Type,Platform Version,Source Info,Source Type,Territory,Unique Devices] | processing_date | merge | App installation and deletion metrics including device to estimate the number of times people install and delete your App Store apps. |
|
|
124
68
|
| `app-store-purchases-detailed`| [App Apple Identifier,App Download Date,App Name,Campaign,Content Apple Identifier,Content Name,Date,Device,Page Title,Page Type,Payment Method,Platform Version,Pre-Order,Purchase Type,Source Info,Source Type,Territory] | processing_date | merge | App purchase analytics including revenue, payment methods, and content details. |
|
|
125
69
|
| `app-crashes-expanded`| [App Name,App Version,Build,Date,Device,Platform,Release Type,Territory] |processing_date | merge | App crash analytics including crash counts, device information, and version details. |
|
|
126
70
|
|
|
@@ -257,6 +201,63 @@ Use this report to understand crashes for your App Store apps by app version and
|
|
|
257
201
|
| `unique_devices` | Number of unique devices where app crashed. |
|
|
258
202
|
|
|
259
203
|
|
|
204
|
+
## Examples
|
|
205
|
+
### Loading App Downloads Analytics
|
|
206
|
+
|
|
207
|
+
For this example, we'll assume that:
|
|
208
|
+
* `key_id` is `key_0`
|
|
209
|
+
* `issuer_id` is `issue_0`
|
|
210
|
+
* `key` is stored in the current directory and is named `api.key`
|
|
211
|
+
* `app_id` is `12345`
|
|
212
|
+
|
|
213
|
+
We will run `ingestr` to save this data to a [duckdb](https://duckdb.org/) database called `analytics.db` under the name `public.app_downloads`.
|
|
214
|
+
|
|
215
|
+
```sh
|
|
216
|
+
ingestr ingest \
|
|
217
|
+
--source-uri "appstore://app_id=12345&key_path=api.key&key_id=key_0&issuer_id=issue_0" \
|
|
218
|
+
--source-table "app-downloads-detailed" \
|
|
219
|
+
--dest-uri "duckdb:///analytics.db" \
|
|
220
|
+
--dest-table "public.app_downloads"
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### Loading Data for multiple Apps
|
|
224
|
+
|
|
225
|
+
We will extend the prior example with another app with ID `67890`. To achieve this, simply add another `app_id` query parameter to the URI.
|
|
226
|
+
```sh
|
|
227
|
+
ingestr ingest \
|
|
228
|
+
--source-uri "appstore://app_id=12345&app_id=67890&key_path=api.key&key_id=key_0&issuer_id=issue_0" \
|
|
229
|
+
--source-table "app-downloads-detailed" \
|
|
230
|
+
--dest-uri "duckdb:///analytics.db" \
|
|
231
|
+
--dest-table "public.app_downloads"
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### Incremental Loading
|
|
235
|
+
|
|
236
|
+
`ingestr` supports incremental loading for all App Store tables.
|
|
237
|
+
|
|
238
|
+
To begin, we will first load all data till `2025-01-01` by specifying the `--interval-end` flag. We'll assume the same credentials from our [first example](#example-loading-app-downloads-analytics)
|
|
239
|
+
```sh
|
|
240
|
+
ingestr ingest \
|
|
241
|
+
--source-uri "appstore://app_id=12345&key_path=api.key&key_id=key_0&issuer_id=issue_0" \
|
|
242
|
+
--source-table "app-downloads-detailed" \
|
|
243
|
+
--dest-uri "duckdb:///analytics.db" \
|
|
244
|
+
--dest-table "public.app_downloads"
|
|
245
|
+
--interval-end "2025-01-01"
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
`ingestr` will load all data available till `2025-01-01`. Now we will run `ingestr` again, but this time, we'll let `ingestr` pickup from where it left off by specifying the `--incremental-strategy` flag.
|
|
249
|
+
|
|
250
|
+
```sh
|
|
251
|
+
ingestr ingest \
|
|
252
|
+
--source-uri "appstore://app_id=12345&key_path=api.key&key_id=key_0&issuer_id=issue_0" \
|
|
253
|
+
--source-table "app-downloads-detailed" \
|
|
254
|
+
--dest-uri "duckdb:///analytics.db" \
|
|
255
|
+
--dest-table "public.app_downloads" \
|
|
256
|
+
--incremental-strategy "merge"
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
Notice how we didn't specify a date parameter? `ingestr` will automatically use the metadata from last load and continue loading data from that point on.
|
|
260
|
+
|
|
260
261
|
Use these as `--source-table` parameter in the `ingestr ingest` command.
|
|
261
262
|
|
|
262
263
|
To know more about these reports and their dimensions, see [App Store Analytics docs](https://developer.apple.com/documentation/analytics-reports).
|
|
@@ -62,9 +62,29 @@ Salesforce source allows ingesting the following objects into separate tables:
|
|
|
62
62
|
| `pricebook_entry` | id | - | replace | Represents a specific price for a product in a price book. |
|
|
63
63
|
| `task` | id | last_timestamp | merge | Used to track and manage various activities and tasks within the Salesforce platform. |
|
|
64
64
|
| `event` | id | last_timestamp | merge | Used to track and manage calendar-based events, such as meetings, appointments, or calls. |
|
|
65
|
+
| `custom:<custom_object_name>` | - | - | replace | Track and store data that’s unique to your organization. For more information about custom objects in Salesforce, read [here](https://developer.salesforce.com/docs/atlas.en-us.object_reference.meta/object_reference/sforce_api_objects_custom_objects.htm)|
|
|
65
66
|
|
|
66
67
|
Use these as `--source-table` parameters in the `ingestr ingest` command.
|
|
67
68
|
|
|
69
|
+
## Examples
|
|
70
|
+
Copy user_role data from Salesforce into a DuckDB database:
|
|
71
|
+
```sh
|
|
72
|
+
ingestr ingest \
|
|
73
|
+
--source-uri "salesforce://?username=<username>&password=<password>&token=<token>&domain=<domain>" \
|
|
74
|
+
--source-table "user_role" \
|
|
75
|
+
--dest-uri "duckdb:///sf.db" \
|
|
76
|
+
--dest-table "public.user_role"
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Copy custom object data from Salesforce into a DuckDB database:
|
|
80
|
+
```sh
|
|
81
|
+
ingestr ingest \
|
|
82
|
+
--source-uri "salesforce://?username=<username>&password=<password>&token=<token>&domain=<domain>" \
|
|
83
|
+
--source-table "custom:My__Community_Group__c" \
|
|
84
|
+
--dest-uri "duckdb:///sf.db" \
|
|
85
|
+
--dest-table "public.my_community"
|
|
86
|
+
```
|
|
87
|
+
|
|
68
88
|
> [!WARNING]
|
|
69
89
|
> Salesforce API limits may affect the frequency and volume of data ingestion. Incremental loading is supported for objects with the `SystemModstamp` field, but some objects may require full-refresh loads. This is indicated by `mode` in the tables above. Tables with mode `replace` don't support incremental loads, while the ones with `merge` do.
|
|
70
90
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
version = "v0.13.91"
|
|
@@ -14,6 +14,7 @@ def salesforce_source(
|
|
|
14
14
|
password: str,
|
|
15
15
|
token: str,
|
|
16
16
|
domain: str,
|
|
17
|
+
custom_object: str = None,
|
|
17
18
|
) -> Iterable[DltResource]:
|
|
18
19
|
"""
|
|
19
20
|
Retrieves data from Salesforce using the Salesforce API.
|
|
@@ -131,6 +132,10 @@ def salesforce_source(
|
|
|
131
132
|
) -> Iterable[TDataItem]:
|
|
132
133
|
yield get_records(client, "Event", last_timestamp.last_value, "SystemModstamp")
|
|
133
134
|
|
|
135
|
+
@dlt.resource(write_disposition="replace")
|
|
136
|
+
def custom() -> Iterable[TDataItem]:
|
|
137
|
+
yield get_records(client, custom_object)
|
|
138
|
+
|
|
134
139
|
return (
|
|
135
140
|
user,
|
|
136
141
|
user_role,
|
|
@@ -147,4 +152,5 @@ def salesforce_source(
|
|
|
147
152
|
pricebook_entry,
|
|
148
153
|
task,
|
|
149
154
|
event,
|
|
155
|
+
custom,
|
|
150
156
|
)
|
|
@@ -2525,9 +2525,14 @@ class SalesforceSource:
|
|
|
2525
2525
|
|
|
2526
2526
|
src = salesforce_source(**creds) # type: ignore
|
|
2527
2527
|
|
|
2528
|
+
if table.startswith("custom:"):
|
|
2529
|
+
custom_object = table.split(":")[1]
|
|
2530
|
+
src = salesforce_source(**creds, custom_object=custom_object)
|
|
2531
|
+
return src.with_resources("custom")
|
|
2532
|
+
|
|
2528
2533
|
if table not in src.resources:
|
|
2529
2534
|
raise UnsupportedResourceError(table, "Salesforce")
|
|
2530
|
-
|
|
2535
|
+
|
|
2531
2536
|
return src.with_resources(table)
|
|
2532
2537
|
|
|
2533
2538
|
|
|
@@ -94,7 +94,9 @@ exclude = [
|
|
|
94
94
|
'src/clickup/.*',
|
|
95
95
|
'src/influxdb/.*',
|
|
96
96
|
'src/freshdesk/.*',
|
|
97
|
-
'src/wise/.*'
|
|
97
|
+
'src/wise/.*',
|
|
98
|
+
'src/salesforce/.*'
|
|
99
|
+
|
|
98
100
|
]
|
|
99
101
|
|
|
100
102
|
[[tool.mypy.overrides]]
|
|
@@ -128,7 +130,8 @@ module = [
|
|
|
128
130
|
"ingestr.src.influxdb",
|
|
129
131
|
"ingestr.src.freshdesk",
|
|
130
132
|
"ingestr.src.wise",
|
|
131
|
-
"ingestr.src.revenuecat"
|
|
133
|
+
"ingestr.src.revenuecat",
|
|
134
|
+
"ingestr.src.salesforce",
|
|
132
135
|
]
|
|
133
136
|
follow_imports = "skip"
|
|
134
137
|
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
version = "v0.13.90"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|