ingestr 0.14.92__tar.gz → 0.14.94__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.14.92 → ingestr-0.14.94}/PKG-INFO +2 -1
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/.vitepress/config.mjs +1 -0
- ingestr-0.14.94/docs/supported-sources/allium.md +164 -0
- ingestr-0.14.94/docs/supported-sources/couchbase.md +136 -0
- ingestr-0.14.94/ingestr/src/allium/__init__.py +128 -0
- ingestr-0.14.94/ingestr/src/buildinfo.py +1 -0
- ingestr-0.14.94/ingestr/src/couchbase_source/__init__.py +118 -0
- ingestr-0.14.94/ingestr/src/couchbase_source/helpers.py +135 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/factory.py +4 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/revenuecat/__init__.py +16 -41
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/revenuecat/helpers.py +19 -73
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/sources.py +236 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/requirements.in +1 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/requirements.txt +2 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/requirements_arm64.txt +2 -0
- ingestr-0.14.92/ingestr/src/buildinfo.py +0 -1
- {ingestr-0.14.92 → ingestr-0.14.94}/.dlt/config.toml +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/.dockerignore +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/.githooks/pre-commit-hook.sh +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/.github/workflows/deploy-docs.yml +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/.github/workflows/release.yml +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/.github/workflows/secrets-scan.yml +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/.github/workflows/tests.yml +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/.gitignore +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/.gitleaksignore +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/.python-version +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/.vale.ini +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/Dockerfile +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/LICENSE.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/Makefile +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/README.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/.vitepress/theme/custom.css +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/.vitepress/theme/index.js +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/commands/example-uris.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/commands/ingest.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/getting-started/core-concepts.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/getting-started/data-masking.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/getting-started/incremental-loading.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/getting-started/quickstart.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/getting-started/telemetry.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/index.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/media/applovin_max.png +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/media/athena.png +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/media/clickhouse_img.png +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/media/clickup_ingestion.png +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/media/cratedb-destination.png +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/media/cratedb-source.png +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/media/freshdesk_ingestion.png +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/media/gcp_spanner_ingestion.png +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/media/github.png +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/media/google_analytics_realtime_report.png +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/media/googleanalytics.png +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/media/ingestion_elasticsearch_img.png +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/media/kinesis.bigquery.png +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/media/linear.png +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/media/linkedin_ads.png +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/media/mixpanel_ingestion.png +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/media/personio.png +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/media/personio_duckdb.png +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/media/phantombuster.png +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/media/pipedrive.png +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/media/quickbook_ingestion.png +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/media/sftp.png +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/media/stripe_postgres.png +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/media/tiktok.png +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/media/wise_ingestion.png +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/media/zoom_ingestion.png +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/public/demo.gif +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/adjust.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/airtable.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/anthropic.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/applovin.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/applovin_max.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/appsflyer.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/appstore.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/asana.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/athena.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/attio.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/bigquery.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/chess.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/clickhouse.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/clickup.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/cratedb.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/csv.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/custom_queries.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/databricks.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/db2.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/docebo.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/duckdb.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/dynamodb.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/elasticsearch.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/facebook-ads.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/fluxx.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/frankfurter.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/freshdesk.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/fundraiseup.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/gcs.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/github.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/google-ads.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/google_analytics.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/gorgias.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/gsheets.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/http.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/hubspot.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/influxdb.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/intercom.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/isoc-pulse.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/jira.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/kafka.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/kinesis.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/klaviyo.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/linear.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/linkedin_ads.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/mailchimp.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/mixpanel.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/monday.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/mongodb.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/motherduck.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/mssql.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/mysql.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/notion.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/oracle.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/personio.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/phantombuster.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/pinterest.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/pipedrive.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/plusvibeai.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/postgres.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/quickbooks.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/redshift.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/revenuecat.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/s3.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/salesforce.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/sap-hana.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/sftp.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/shopify.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/slack.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/smartsheets.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/snowflake.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/solidgate.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/spanner.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/sqlite.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/stripe.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/tiktok-ads.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/trino.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/trustpilot.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/wise.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/zendesk.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/supported-sources/zoom.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/tutorials/load-kinesis-bigquery.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/tutorials/load-personio-duckdb.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/docs/tutorials/load-stripe-postgres.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/conftest.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/main.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/.gitignore +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/adjust/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/adjust/adjust_helpers.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/airtable/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/anthropic/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/anthropic/helpers.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/applovin/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/applovin_max/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/appsflyer/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/appsflyer/client.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/appstore/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/appstore/client.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/appstore/errors.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/appstore/models.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/appstore/resources.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/arrow/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/asana_source/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/asana_source/helpers.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/asana_source/settings.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/attio/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/attio/helpers.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/blob.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/chess/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/chess/helpers.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/chess/settings.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/clickup/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/clickup/helpers.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/collector/spinner.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/destinations.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/docebo/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/docebo/client.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/docebo/helpers.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/dynamodb/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/elasticsearch/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/elasticsearch/helpers.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/errors.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/facebook_ads/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/facebook_ads/exceptions.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/facebook_ads/helpers.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/facebook_ads/settings.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/facebook_ads/utils.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/filesystem/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/filesystem/helpers.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/filesystem/readers.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/filters.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/fluxx/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/fluxx/helpers.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/frankfurter/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/frankfurter/helpers.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/freshdesk/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/freshdesk/freshdesk_client.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/freshdesk/settings.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/fundraiseup/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/fundraiseup/client.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/github/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/github/helpers.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/github/queries.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/github/settings.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/google_ads/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/google_ads/field.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/google_ads/metrics.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/google_ads/predicates.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/google_ads/reports.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/google_analytics/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/google_analytics/helpers.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/google_sheets/README.md +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/google_sheets/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/gorgias/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/gorgias/helpers.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/http/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/http/readers.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/http_client.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/hubspot/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/hubspot/helpers.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/hubspot/settings.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/influxdb/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/influxdb/client.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/intercom/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/intercom/helpers.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/intercom/settings.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/isoc_pulse/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/jira_source/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/jira_source/helpers.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/jira_source/settings.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/kafka/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/kafka/helpers.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/kinesis/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/kinesis/helpers.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/klaviyo/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/klaviyo/client.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/klaviyo/helpers.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/linear/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/linear/helpers.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/linkedin_ads/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/linkedin_ads/helpers.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/loader.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/mailchimp/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/mailchimp/helpers.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/mailchimp/settings.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/masking.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/mixpanel/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/mixpanel/client.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/monday/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/monday/helpers.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/monday/settings.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/mongodb/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/mongodb/helpers.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/notion/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/notion/helpers/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/notion/helpers/client.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/notion/helpers/database.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/notion/settings.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/partition.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/personio/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/personio/helpers.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/phantombuster/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/phantombuster/client.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/pinterest/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/pipedrive/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/pipedrive/helpers/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/pipedrive/helpers/custom_fields_munger.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/pipedrive/helpers/pages.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/pipedrive/settings.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/pipedrive/typing.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/plusvibeai/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/plusvibeai/helpers.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/plusvibeai/settings.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/quickbooks/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/resource.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/salesforce/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/salesforce/helpers.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/shopify/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/shopify/exceptions.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/shopify/helpers.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/shopify/settings.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/slack/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/slack/helpers.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/slack/settings.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/smartsheets/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/solidgate/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/solidgate/helpers.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/sql_database/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/sql_database/callbacks.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/stripe_analytics/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/stripe_analytics/helpers.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/stripe_analytics/settings.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/table_definition.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/telemetry/event.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/testdata/fakebqcredentials.json +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/tiktok_ads/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/time.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/trustpilot/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/trustpilot/client.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/version.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/wise/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/wise/client.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/zendesk/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/zendesk/helpers/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/zendesk/helpers/credentials.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/zendesk/settings.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/zoom/__init__.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/src/zoom/helpers.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/testdata/.gitignore +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/testdata/create_replace.csv +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/testdata/delete_insert_expected.csv +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/testdata/delete_insert_part1.csv +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/testdata/delete_insert_part2.csv +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/testdata/merge_expected.csv +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/testdata/merge_part1.csv +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/testdata/merge_part2.csv +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/ingestr/tests/unit/test_smartsheets.py +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/package-lock.json +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/package.json +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/pyproject.toml +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/requirements-dev.txt +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/resources/demo.gif +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/resources/demo.tape +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/resources/ingestr.svg +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/styles/Google/AMPM.yml +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/styles/Google/Acronyms.yml +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/styles/Google/Colons.yml +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/styles/Google/Contractions.yml +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/styles/Google/DateFormat.yml +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/styles/Google/Ellipses.yml +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/styles/Google/EmDash.yml +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/styles/Google/Exclamation.yml +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/styles/Google/FirstPerson.yml +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/styles/Google/Gender.yml +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/styles/Google/GenderBias.yml +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/styles/Google/HeadingPunctuation.yml +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/styles/Google/Headings.yml +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/styles/Google/Latin.yml +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/styles/Google/LyHyphens.yml +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/styles/Google/OptionalPlurals.yml +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/styles/Google/Ordinal.yml +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/styles/Google/OxfordComma.yml +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/styles/Google/Parens.yml +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/styles/Google/Passive.yml +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/styles/Google/Periods.yml +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/styles/Google/Quotes.yml +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/styles/Google/Ranges.yml +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/styles/Google/Semicolons.yml +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/styles/Google/Slang.yml +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/styles/Google/Spacing.yml +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/styles/Google/Spelling.yml +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/styles/Google/Units.yml +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/styles/Google/We.yml +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/styles/Google/Will.yml +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/styles/Google/WordList.yml +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/styles/Google/meta.json +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/styles/Google/vocab.txt +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/styles/bruin/Ingestr.yml +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/styles/config/vocabularies/bruin/accept.txt +0 -0
- {ingestr-0.14.92 → ingestr-0.14.94}/test.env.template +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ingestr
|
|
3
|
-
Version: 0.14.
|
|
3
|
+
Version: 0.14.94
|
|
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
|
|
@@ -39,6 +39,7 @@ Requires-Dist: clickhouse-connect==0.8.14
|
|
|
39
39
|
Requires-Dist: clickhouse-driver==0.2.9
|
|
40
40
|
Requires-Dist: clickhouse-sqlalchemy==0.2.7
|
|
41
41
|
Requires-Dist: confluent-kafka==2.8.0
|
|
42
|
+
Requires-Dist: couchbase==4.3.6
|
|
42
43
|
Requires-Dist: crate==2.0.0
|
|
43
44
|
Requires-Dist: cryptography==44.0.2
|
|
44
45
|
Requires-Dist: curlify==2.2.1
|
|
@@ -82,6 +82,7 @@ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
|
|
|
82
82
|
{ text: "AWS Athena", link: "/supported-sources/athena.md" },
|
|
83
83
|
{ text: "AWS Redshift", link: "/supported-sources/redshift.md" },
|
|
84
84
|
{ text: "ClickHouse", link: "/supported-sources/clickhouse.md" },
|
|
85
|
+
{ text: "Couchbase", link: "/supported-sources/couchbase.md" },
|
|
85
86
|
{ text: "CrateDB", link: "/supported-sources/cratedb.md" },
|
|
86
87
|
{ text: "Databricks", link: "/supported-sources/databricks.md" },
|
|
87
88
|
{ text: "DuckDB", link: "/supported-sources/duckdb.md" },
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# Allium
|
|
2
|
+
|
|
3
|
+
[Allium](https://allium.so/) is a blockchain data platform that provides access to indexed blockchain data through a powerful query interface.
|
|
4
|
+
|
|
5
|
+
ingestr supports Allium as a source.
|
|
6
|
+
|
|
7
|
+
## URI format
|
|
8
|
+
|
|
9
|
+
The URI format for Allium is as follows:
|
|
10
|
+
|
|
11
|
+
```plaintext
|
|
12
|
+
allium://?api_key=<api-key>
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
URI parameters:
|
|
16
|
+
|
|
17
|
+
- `api_key`: The API key used for authentication with the Allium API (required)
|
|
18
|
+
|
|
19
|
+
The URI is used to connect to the Allium API for extracting blockchain data.
|
|
20
|
+
|
|
21
|
+
Query parameters should be passed using ingestr's `--interval-start` and `--interval-end` flags.
|
|
22
|
+
|
|
23
|
+
## Setting up an Allium Integration
|
|
24
|
+
|
|
25
|
+
To get your Allium API credentials:
|
|
26
|
+
|
|
27
|
+
1. Sign up for an Allium account at [allium.so](https://allium.so/)
|
|
28
|
+
2. Navigate to your account settings
|
|
29
|
+
3. Generate an API key
|
|
30
|
+
4. Find your query ID from the Allium explorer interface
|
|
31
|
+
|
|
32
|
+
Once you have your credentials, here's a sample command that will copy the data from Allium into a DuckDB database:
|
|
33
|
+
|
|
34
|
+
```sh
|
|
35
|
+
ingestr ingest \
|
|
36
|
+
--source-uri 'allium://?api_key=your_api_key' \
|
|
37
|
+
--source-table 'query:your_query_id' \
|
|
38
|
+
--interval-start '2025-02-01' \
|
|
39
|
+
--interval-end '2025-02-02' \
|
|
40
|
+
--dest-uri duckdb:///allium.duckdb \
|
|
41
|
+
--dest-table 'allium.query_results'
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
The result of this command will be a table in the `allium.duckdb` database.
|
|
45
|
+
|
|
46
|
+
## Query ID Format
|
|
47
|
+
|
|
48
|
+
Allium source uses query IDs to identify which query to execute. The query ID should be passed as the `--source-table` parameter with the `query:` prefix.
|
|
49
|
+
|
|
50
|
+
| Format | Example | Description |
|
|
51
|
+
|--------|---------|-------------|
|
|
52
|
+
| `query:<query_id>` | `query:abc123def456` | The query ID from Allium explorer |
|
|
53
|
+
| `query:<query_id>:<params>` | `query:abc123def456:network=ethereum&min_value=1000` | Query ID with custom parameters |
|
|
54
|
+
| `query:<query_id>:<params>` | `query:abc123def456:limit=5000&compute_profile=standard` | Query ID with run_config parameters |
|
|
55
|
+
|
|
56
|
+
Each query ID represents a specific blockchain data query that you've created in the Allium explorer.
|
|
57
|
+
|
|
58
|
+
### Run Config Parameters
|
|
59
|
+
|
|
60
|
+
Special parameters that control query execution (part of `run_config`):
|
|
61
|
+
|
|
62
|
+
- `limit`: Limit the number of rows in the result (max 250,000)
|
|
63
|
+
- `compute_profile`: Compute profile identifier
|
|
64
|
+
|
|
65
|
+
These parameters are passed in the same format as custom parameters but are used for query execution control.
|
|
66
|
+
|
|
67
|
+
### Custom Query Parameters
|
|
68
|
+
|
|
69
|
+
You can pass additional custom parameters to your Allium query using the format:
|
|
70
|
+
```
|
|
71
|
+
query:<query_id>:param1=value1¶m2=value2
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
These custom parameters will be merged with the default date parameters. If a custom parameter has the same name as a default parameter, the custom value will take precedence.
|
|
75
|
+
|
|
76
|
+
## How it works
|
|
77
|
+
|
|
78
|
+
The Allium source connector:
|
|
79
|
+
|
|
80
|
+
1. **Starts an async query execution** using your query ID and parameters
|
|
81
|
+
2. **Polls for completion status** every 5 seconds (max 12 hours)
|
|
82
|
+
3. **Fetches and returns the results** once the query completes successfully
|
|
83
|
+
|
|
84
|
+
## Examples
|
|
85
|
+
|
|
86
|
+
### Basic Query Ingestion (without date filters)
|
|
87
|
+
|
|
88
|
+
```sh
|
|
89
|
+
ingestr ingest \
|
|
90
|
+
--source-uri 'allium://?api_key=your_api_key' \
|
|
91
|
+
--source-table 'query:abc123def456' \
|
|
92
|
+
--dest-uri duckdb:///allium.duckdb \
|
|
93
|
+
--dest-table 'allium.transactions'
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Query with Date Parameters
|
|
97
|
+
|
|
98
|
+
```sh
|
|
99
|
+
ingestr ingest \
|
|
100
|
+
--source-uri 'allium://?api_key=your_api_key' \
|
|
101
|
+
--source-table 'query:abc123def456' \
|
|
102
|
+
--interval-start '2025-02-01' \
|
|
103
|
+
--interval-end '2025-02-02' \
|
|
104
|
+
--dest-uri duckdb:///allium.duckdb \
|
|
105
|
+
--dest-table 'allium.daily_transactions'
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Query with Custom Parameters
|
|
109
|
+
|
|
110
|
+
```sh
|
|
111
|
+
ingestr ingest \
|
|
112
|
+
--source-uri 'allium://?api_key=your_api_key' \
|
|
113
|
+
--source-table 'query:abc123def456:network=ethereum&min_value=1000' \
|
|
114
|
+
--interval-start '2025-02-01' \
|
|
115
|
+
--interval-end '2025-02-02' \
|
|
116
|
+
--dest-uri duckdb:///allium.duckdb \
|
|
117
|
+
--dest-table 'allium.filtered_transactions'
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
In this example, the query will receive both the default date parameters and the custom parameters `network` and `min_value`.
|
|
121
|
+
|
|
122
|
+
### Query with Run Config Parameters
|
|
123
|
+
|
|
124
|
+
```sh
|
|
125
|
+
ingestr ingest \
|
|
126
|
+
--source-uri 'allium://?api_key=your_api_key' \
|
|
127
|
+
--source-table 'query:abc123def456:limit=5000&compute_profile=standard' \
|
|
128
|
+
--interval-start '2025-02-01' \
|
|
129
|
+
--interval-end '2025-02-02' \
|
|
130
|
+
--dest-uri duckdb:///allium.duckdb \
|
|
131
|
+
--dest-table 'allium.query_results'
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
This example limits the result to 5000 rows and uses the 'standard' compute profile.
|
|
135
|
+
|
|
136
|
+
### Query with Both Custom and Run Config Parameters
|
|
137
|
+
|
|
138
|
+
```sh
|
|
139
|
+
ingestr ingest \
|
|
140
|
+
--source-uri 'allium://?api_key=your_api_key' \
|
|
141
|
+
--source-table 'query:abc123def456:network=ethereum&limit=10000&compute_profile=large' \
|
|
142
|
+
--interval-start '2025-02-01' \
|
|
143
|
+
--interval-end '2025-02-02' \
|
|
144
|
+
--dest-uri duckdb:///allium.duckdb \
|
|
145
|
+
--dest-table 'allium.filtered_transactions'
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
This example combines custom query parameters (`network`) with run config parameters (`limit` and `compute_profile`).
|
|
149
|
+
|
|
150
|
+
## Notes
|
|
151
|
+
|
|
152
|
+
> [!NOTE]
|
|
153
|
+
> - Query execution is asynchronous and may take time depending on the complexity of your query
|
|
154
|
+
> - The connector will wait up to 12 hours for query completion
|
|
155
|
+
> - Use `--interval-start` and `--interval-end` flags to pass date parameters to your Allium query
|
|
156
|
+
> - The dates will be automatically converted to:
|
|
157
|
+
> - `start_date` and `end_date` parameters in the format `YYYY-MM-DD`
|
|
158
|
+
> - `start_timestamp` and `end_timestamp` parameters as Unix timestamps (seconds since epoch)
|
|
159
|
+
> - **Default dates**: If not specified, defaults to 2 days ago (00:00) to yesterday (00:00)
|
|
160
|
+
> - Custom parameters can be added to the source table format: `query:your_query_id:param1=value1¶m2=value2`
|
|
161
|
+
> - Run config parameters (`limit`, `compute_profile`) are also passed in the source table format
|
|
162
|
+
> - Custom parameters will override default parameters if they have the same name
|
|
163
|
+
> - The `limit` parameter has a maximum value of 250,000 rows
|
|
164
|
+
> - Make sure your query ID is valid and accessible with your API key
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# Couchbase
|
|
2
|
+
|
|
3
|
+
[Couchbase](https://www.couchbase.com/) is a distributed NoSQL cloud database that delivers unmatched performance, scalability, and flexibility for building modern applications.
|
|
4
|
+
|
|
5
|
+
ingestr supports Couchbase as a source.
|
|
6
|
+
|
|
7
|
+
## URI format
|
|
8
|
+
|
|
9
|
+
### Standard format (without SSL)
|
|
10
|
+
```plaintext
|
|
11
|
+
couchbase://username:password@host
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
### With SSL/TLS enabled
|
|
15
|
+
```plaintext
|
|
16
|
+
couchbase://username:password@host?ssl=true
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### Including bucket in URI
|
|
20
|
+
```plaintext
|
|
21
|
+
couchbase://username:password@host/bucket
|
|
22
|
+
couchbase://username:password@host/bucket?ssl=true
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
URI parameters:
|
|
26
|
+
- `username`: the username to connect to the Couchbase cluster
|
|
27
|
+
- `password`: the password for the user
|
|
28
|
+
- `host`: the host address of the Couchbase server
|
|
29
|
+
- `bucket`: optional bucket name in the URI path
|
|
30
|
+
- `ssl`: SSL/TLS connection parameter
|
|
31
|
+
- `ssl=true`: Required for Couchbase Capella (cloud) deployments
|
|
32
|
+
- `ssl=false` or omitted: Use for Couchbase Server (self-hosted/on-premises) deployments
|
|
33
|
+
|
|
34
|
+
> [!NOTE]
|
|
35
|
+
> **SSL Parameter Usage:**
|
|
36
|
+
> - Use `ssl=true` when connecting to **Couchbase Capella (cloud)**
|
|
37
|
+
> - Use `ssl=false` or omit the parameter when connecting to **Couchbase Server (self-hosted/on-premises)**
|
|
38
|
+
|
|
39
|
+
The URI structure can be used for connecting to both local/self-hosted Couchbase instances and Couchbase Capella (cloud).
|
|
40
|
+
|
|
41
|
+
## Source table format
|
|
42
|
+
|
|
43
|
+
The `--source-table` option for Couchbase supports two formats depending on whether the bucket is specified in the URI:
|
|
44
|
+
|
|
45
|
+
### When bucket is NOT in URI
|
|
46
|
+
```plaintext
|
|
47
|
+
bucket.scope.collection
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### When bucket IS in URI path
|
|
51
|
+
```plaintext
|
|
52
|
+
scope.collection
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
For default scope and collection, you can use:
|
|
56
|
+
```plaintext
|
|
57
|
+
bucket._default._default
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Using Couchbase as a source
|
|
61
|
+
|
|
62
|
+
### Local/self-hosted Couchbase
|
|
63
|
+
|
|
64
|
+
#### Basic connection without SSL
|
|
65
|
+
```bash
|
|
66
|
+
ingestr ingest \
|
|
67
|
+
--source-uri "couchbase://admin:password123@localhost" \
|
|
68
|
+
--source-table "mybucket.myscope.mycollection" \
|
|
69
|
+
--dest-uri "duckdb:///output.db" \
|
|
70
|
+
--dest-table "main.couchbase_data"
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
#### For Couchbase Capella (Cloud)
|
|
74
|
+
```bash
|
|
75
|
+
ingestr ingest \
|
|
76
|
+
--source-uri "couchbase://admin:password123@localhost?ssl=true" \
|
|
77
|
+
--source-table "mybucket._default._default" \
|
|
78
|
+
--dest-uri "duckdb:///output.db" \
|
|
79
|
+
--dest-table "main.couchbase_data"
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
#### With bucket in URI
|
|
83
|
+
```bash
|
|
84
|
+
ingestr ingest \
|
|
85
|
+
--source-uri "couchbase://admin:password123@localhost/mybucket" \
|
|
86
|
+
--source-table "myscope.mycollection" \
|
|
87
|
+
--dest-uri "duckdb:///output.db" \
|
|
88
|
+
--dest-table "main.couchbase_data"
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Couchbase Capella (Cloud)
|
|
92
|
+
|
|
93
|
+
> [!IMPORTANT]
|
|
94
|
+
> Couchbase Capella (cloud) **requires SSL connections**. You must use `?ssl=true` in your connection URI and prefix the host with `cb.`
|
|
95
|
+
|
|
96
|
+
> [!TIP]
|
|
97
|
+
> You can obtain the connection string for Capella from the SDK connection details in your Couchbase Capella dashboard.
|
|
98
|
+
|
|
99
|
+
Use the `couchbase://` scheme with `ssl=true` parameter. Note the `cb.` prefix in the hostname:
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
ingestr ingest \
|
|
103
|
+
--source-uri "couchbase://username:password@cb.xxx.cloud.couchbase.com?ssl=true" \
|
|
104
|
+
--source-table "travel-sample.inventory.airport" \
|
|
105
|
+
--dest-uri "duckdb:///airports.db" \
|
|
106
|
+
--dest-table "main.airports"
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
With bucket in URI for Couchbase Capella
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
ingestr ingest \
|
|
113
|
+
--source-uri "couchbase://username:password@cb.xxx.cloud.couchbase.com/travel-sample?ssl=true" \
|
|
114
|
+
--source-table "inventory.airport" \
|
|
115
|
+
--dest-uri "duckdb:///airports.db" \
|
|
116
|
+
--dest-table "main.airports"
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
### With URL-encoded password
|
|
121
|
+
|
|
122
|
+
> [!IMPORTANT]
|
|
123
|
+
> When using ingestr CLI, passwords containing special characters (`@`, `:`, `/`, `#`, `?`, etc.) **must be URL-encoded** in the connection URI.
|
|
124
|
+
|
|
125
|
+
If your password contains special characters, you need to URL-encode them:
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
ingestr ingest \
|
|
129
|
+
--source-uri "couchbase://admin:MyPass%40123%21@localhost" \
|
|
130
|
+
--source-table "mybucket.myscope.mycollection" \
|
|
131
|
+
--dest-uri "duckdb:///output.db" \
|
|
132
|
+
--dest-table "main.couchbase_data"
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
This example encodes the password `MyPass@123!` as `MyPass%40123%21`.
|
|
136
|
+
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Allium source for data extraction via REST API.
|
|
3
|
+
|
|
4
|
+
This source provides access to Allium blockchain data via asynchronous query execution.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import time
|
|
8
|
+
from typing import Any, Iterator
|
|
9
|
+
|
|
10
|
+
import dlt
|
|
11
|
+
|
|
12
|
+
from ingestr.src.http_client import create_client
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@dlt.source(max_table_nesting=0, name="allium_source")
|
|
16
|
+
def allium_source(
|
|
17
|
+
api_key: str,
|
|
18
|
+
query_id: str,
|
|
19
|
+
parameters: dict[str, Any] | None = None,
|
|
20
|
+
limit: int | None = None,
|
|
21
|
+
compute_profile: str | None = None,
|
|
22
|
+
) -> Any:
|
|
23
|
+
"""
|
|
24
|
+
Allium data source for blockchain data extraction.
|
|
25
|
+
|
|
26
|
+
This source connects to Allium API, runs async queries, and fetches results.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
api_key: Allium API key for authentication
|
|
30
|
+
query_id: The query ID to execute (e.g., 'abc123')
|
|
31
|
+
parameters: Optional parameters for the query (e.g., {'start_date': '2025-02-01', 'end_date': '2025-02-02'})
|
|
32
|
+
limit: Limit the number of rows in the result (max 250,000)
|
|
33
|
+
compute_profile: Compute profile identifier
|
|
34
|
+
|
|
35
|
+
Yields:
|
|
36
|
+
DltResource: Data resources for Allium query results
|
|
37
|
+
"""
|
|
38
|
+
base_url = "https://api.allium.so/api/v1/explorer"
|
|
39
|
+
session = create_client()
|
|
40
|
+
headers = {"X-API-Key": api_key}
|
|
41
|
+
|
|
42
|
+
@dlt.resource(
|
|
43
|
+
name="query_results",
|
|
44
|
+
write_disposition="replace",
|
|
45
|
+
)
|
|
46
|
+
def fetch_query_results() -> Iterator[dict[str, Any]]:
|
|
47
|
+
"""
|
|
48
|
+
Fetch query results from Allium.
|
|
49
|
+
|
|
50
|
+
This function:
|
|
51
|
+
1. Starts an async query execution
|
|
52
|
+
2. Polls for completion status
|
|
53
|
+
3. Fetches and yields the results
|
|
54
|
+
"""
|
|
55
|
+
# Step 1: Start async query execution
|
|
56
|
+
run_config: dict[str, Any] = {}
|
|
57
|
+
if limit is not None:
|
|
58
|
+
run_config["limit"] = limit
|
|
59
|
+
if compute_profile is not None:
|
|
60
|
+
run_config["compute_profile"] = compute_profile
|
|
61
|
+
|
|
62
|
+
run_payload = {"parameters": parameters or {}, "run_config": run_config}
|
|
63
|
+
|
|
64
|
+
run_response = session.post(
|
|
65
|
+
f"{base_url}/queries/{query_id}/run-async",
|
|
66
|
+
json=run_payload,
|
|
67
|
+
headers=headers,
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
run_data = run_response.json()
|
|
71
|
+
|
|
72
|
+
if "run_id" not in run_data:
|
|
73
|
+
raise ValueError(f"Failed to start query execution: {run_data}")
|
|
74
|
+
|
|
75
|
+
run_id = run_data["run_id"]
|
|
76
|
+
|
|
77
|
+
# Step 2: Poll for completion
|
|
78
|
+
max_retries = 8640 # Max 12 hours with 5-second intervals
|
|
79
|
+
retry_count = 0
|
|
80
|
+
poll_interval = 5 # seconds
|
|
81
|
+
|
|
82
|
+
while retry_count < max_retries:
|
|
83
|
+
status_response = session.get(
|
|
84
|
+
f"{base_url}/query-runs/{run_id}/status",
|
|
85
|
+
headers=headers,
|
|
86
|
+
)
|
|
87
|
+
status_response.raise_for_status()
|
|
88
|
+
status_data = status_response.json()
|
|
89
|
+
|
|
90
|
+
# Handle both string and dict responses
|
|
91
|
+
if isinstance(status_data, str):
|
|
92
|
+
status = status_data
|
|
93
|
+
else:
|
|
94
|
+
status = status_data.get("status")
|
|
95
|
+
|
|
96
|
+
if status == "success":
|
|
97
|
+
break
|
|
98
|
+
elif status == "failed":
|
|
99
|
+
error_msg = (
|
|
100
|
+
status_data.get("error", "Unknown error")
|
|
101
|
+
if isinstance(status_data, dict)
|
|
102
|
+
else "Unknown error"
|
|
103
|
+
)
|
|
104
|
+
raise ValueError(f"Query execution failed: {error_msg}")
|
|
105
|
+
elif status in ["pending", "running", "queued"]:
|
|
106
|
+
time.sleep(poll_interval)
|
|
107
|
+
retry_count += 1
|
|
108
|
+
else:
|
|
109
|
+
raise ValueError(f"Unknown status: {status}")
|
|
110
|
+
|
|
111
|
+
if retry_count >= max_retries:
|
|
112
|
+
raise TimeoutError(
|
|
113
|
+
f"Query execution timed out after {max_retries * poll_interval} seconds"
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
# Step 3: Fetch results
|
|
117
|
+
results_response = session.get(
|
|
118
|
+
f"{base_url}/query-runs/{run_id}/results",
|
|
119
|
+
headers=headers,
|
|
120
|
+
params={"f": "json"},
|
|
121
|
+
)
|
|
122
|
+
results_response.raise_for_status()
|
|
123
|
+
query_output = results_response.json()
|
|
124
|
+
|
|
125
|
+
# Extract and yield all data
|
|
126
|
+
yield query_output.get("data", [])
|
|
127
|
+
|
|
128
|
+
return (fetch_query_results,)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
version = "v0.14.94"
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"""Source that loads data from Couchbase buckets, supports incremental loads."""
|
|
2
|
+
|
|
3
|
+
from typing import Optional
|
|
4
|
+
|
|
5
|
+
import dlt
|
|
6
|
+
from dlt.sources import DltResource
|
|
7
|
+
|
|
8
|
+
from .helpers import (
|
|
9
|
+
CouchbaseConfiguration,
|
|
10
|
+
client_from_credentials,
|
|
11
|
+
fetch_documents,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@dlt.source(max_table_nesting=0)
|
|
16
|
+
def couchbase_source(
|
|
17
|
+
connection_string: str = dlt.secrets.value,
|
|
18
|
+
username: str = dlt.secrets.value,
|
|
19
|
+
password: str = dlt.secrets.value,
|
|
20
|
+
bucket: str = dlt.config.value,
|
|
21
|
+
scope: Optional[str] = dlt.config.value,
|
|
22
|
+
collection: Optional[str] = dlt.config.value,
|
|
23
|
+
incremental: Optional[dlt.sources.incremental] = None, # type: ignore[type-arg]
|
|
24
|
+
write_disposition: Optional[str] = dlt.config.value,
|
|
25
|
+
limit: Optional[int] = None,
|
|
26
|
+
) -> DltResource:
|
|
27
|
+
"""
|
|
28
|
+
A DLT source which loads data from a Couchbase bucket using Couchbase Python SDK.
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
connection_string (str): Couchbase connection string (e.g., 'couchbase://localhost')
|
|
32
|
+
username (str): Couchbase username
|
|
33
|
+
password (str): Couchbase password
|
|
34
|
+
bucket (str): Bucket name to load data from
|
|
35
|
+
scope (Optional[str]): Scope name (defaults to '_default')
|
|
36
|
+
collection (Optional[str]): Collection name (defaults to '_default')
|
|
37
|
+
incremental (Optional[dlt.sources.incremental]): Option to enable incremental loading.
|
|
38
|
+
E.g., `incremental=dlt.sources.incremental('updated_at', pendulum.parse('2022-01-01T00:00:00Z'))`
|
|
39
|
+
write_disposition (str): Write disposition of the resource.
|
|
40
|
+
limit (Optional[int]): The maximum number of documents to load.
|
|
41
|
+
|
|
42
|
+
Returns:
|
|
43
|
+
DltResource: A DLT resource for the Couchbase collection.
|
|
44
|
+
"""
|
|
45
|
+
# Set up Couchbase client
|
|
46
|
+
cluster = client_from_credentials(connection_string, username, password)
|
|
47
|
+
|
|
48
|
+
resource_name = f"{bucket}_{scope}_{collection}"
|
|
49
|
+
|
|
50
|
+
return dlt.resource( # type: ignore[call-overload, arg-type]
|
|
51
|
+
fetch_documents,
|
|
52
|
+
name=resource_name,
|
|
53
|
+
primary_key="id",
|
|
54
|
+
write_disposition=write_disposition or "replace",
|
|
55
|
+
spec=CouchbaseConfiguration,
|
|
56
|
+
max_table_nesting=0,
|
|
57
|
+
)(
|
|
58
|
+
cluster=cluster,
|
|
59
|
+
bucket_name=bucket,
|
|
60
|
+
scope_name=scope,
|
|
61
|
+
collection_name=collection,
|
|
62
|
+
incremental=incremental,
|
|
63
|
+
limit=limit,
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
@dlt.resource(
|
|
68
|
+
name=lambda args: f"{args['bucket']}_{args['scope']}_{args['collection']}",
|
|
69
|
+
standalone=True,
|
|
70
|
+
spec=CouchbaseConfiguration, # type: ignore[arg-type]
|
|
71
|
+
)
|
|
72
|
+
def couchbase_collection(
|
|
73
|
+
connection_string: str = dlt.secrets.value,
|
|
74
|
+
username: str = dlt.secrets.value,
|
|
75
|
+
password: str = dlt.secrets.value,
|
|
76
|
+
bucket: str = dlt.config.value,
|
|
77
|
+
scope: Optional[str] = dlt.config.value,
|
|
78
|
+
collection: Optional[str] = dlt.config.value,
|
|
79
|
+
incremental: Optional[dlt.sources.incremental] = None, # type: ignore[type-arg]
|
|
80
|
+
write_disposition: Optional[str] = dlt.config.value,
|
|
81
|
+
limit: Optional[int] = None,
|
|
82
|
+
chunk_size: Optional[int] = 1000,
|
|
83
|
+
) -> DltResource:
|
|
84
|
+
"""
|
|
85
|
+
A DLT resource which loads a collection from Couchbase.
|
|
86
|
+
|
|
87
|
+
Args:
|
|
88
|
+
connection_string (str): Couchbase connection string (e.g., 'couchbase://localhost')
|
|
89
|
+
username (str): Couchbase username
|
|
90
|
+
password (str): Couchbase password
|
|
91
|
+
bucket (str): Bucket name to load data from
|
|
92
|
+
scope (Optional[str]): Scope name (defaults to '_default')
|
|
93
|
+
collection (Optional[str]): Collection name (defaults to '_default')
|
|
94
|
+
incremental (Optional[dlt.sources.incremental]): Option to enable incremental loading.
|
|
95
|
+
write_disposition (str): Write disposition of the resource.
|
|
96
|
+
limit (Optional[int]): The maximum number of documents to load.
|
|
97
|
+
chunk_size (Optional[int]): The number of documents to load in each batch.
|
|
98
|
+
|
|
99
|
+
Returns:
|
|
100
|
+
DltResource: A DLT resource for the Couchbase collection.
|
|
101
|
+
"""
|
|
102
|
+
# Set up Couchbase client
|
|
103
|
+
cluster = client_from_credentials(connection_string, username, password)
|
|
104
|
+
|
|
105
|
+
return dlt.resource( # type: ignore[call-overload]
|
|
106
|
+
fetch_documents,
|
|
107
|
+
name=f"{bucket}_{scope}_{collection}",
|
|
108
|
+
primary_key="id",
|
|
109
|
+
write_disposition=write_disposition or "replace",
|
|
110
|
+
)(
|
|
111
|
+
cluster=cluster,
|
|
112
|
+
bucket_name=bucket,
|
|
113
|
+
scope_name=scope,
|
|
114
|
+
collection_name=collection,
|
|
115
|
+
incremental=incremental,
|
|
116
|
+
limit=limit,
|
|
117
|
+
chunk_size=chunk_size,
|
|
118
|
+
)
|