ingestr 0.13.39__tar.gz → 0.13.41__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.39 → ingestr-0.13.41}/PKG-INFO +8 -1
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/.vitepress/config.mjs +2 -0
- ingestr-0.13.41/docs/media/ingestion_elasticsearch_img.png +0 -0
- ingestr-0.13.41/docs/media/spanner_ingestion.png +0 -0
- ingestr-0.13.41/docs/supported-sources/elasticsearch.md +35 -0
- ingestr-0.13.41/docs/supported-sources/spanner.md +41 -0
- ingestr-0.13.41/ingestr/src/buildinfo.py +1 -0
- ingestr-0.13.41/ingestr/src/elasticsearch/__init__.py +80 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/factory.py +3 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/sources.py +95 -1
- {ingestr-0.13.39 → ingestr-0.13.41}/requirements.in +4 -1
- {ingestr-0.13.39 → ingestr-0.13.41}/requirements.txt +31 -1
- {ingestr-0.13.39 → ingestr-0.13.41}/requirements_arm64.txt +31 -1
- ingestr-0.13.39/ingestr/src/buildinfo.py +0 -1
- {ingestr-0.13.39 → ingestr-0.13.41}/.dockerignore +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/.githooks/pre-commit-hook.sh +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/.github/workflows/deploy-docs.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/.github/workflows/release.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/.github/workflows/secrets-scan.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/.github/workflows/tests.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/.gitignore +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/.gitleaksignore +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/.python-version +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/.vale.ini +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/Dockerfile +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/LICENSE.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/Makefile +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/README.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/.vitepress/theme/custom.css +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/.vitepress/theme/index.js +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/commands/example-uris.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/commands/ingest.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/getting-started/core-concepts.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/getting-started/incremental-loading.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/getting-started/quickstart.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/getting-started/telemetry.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/index.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/media/applovin_max.png +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/media/athena.png +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/media/clickhouse_img.png +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/media/freshdesk_ingestion.png +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/media/github.png +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/media/google_analytics_realtime_report.png +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/media/googleanalytics.png +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/media/kinesis.bigquery.png +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/media/linkedin_ads.png +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/media/personio.png +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/media/personio_duckdb.png +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/media/phantombuster.png +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/media/pipedrive.png +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/media/stripe_postgres.png +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/media/tiktok.png +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/adjust.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/airtable.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/applovin.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/applovin_max.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/appsflyer.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/appstore.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/asana.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/athena.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/bigquery.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/chess.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/clickhouse.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/csv.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/custom_queries.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/databricks.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/db2.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/duckdb.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/dynamodb.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/facebook-ads.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/frankfurter.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/freshdesk.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/gcs.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/github.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/google-ads.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/google_analytics.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/gorgias.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/gsheets.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/hubspot.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/kafka.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/kinesis.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/klaviyo.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/linkedin_ads.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/mongodb.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/mssql.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/mysql.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/notion.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/oracle.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/personio.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/phantombuster.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/pipedrive.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/postgres.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/redshift.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/s3.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/salesforce.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/sap-hana.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/shopify.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/slack.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/snowflake.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/sqlite.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/stripe.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/tiktok-ads.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/supported-sources/zendesk.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/tutorials/load-kinesis-bigquery.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/tutorials/load-personio-duckdb.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/docs/tutorials/load-stripe-postgres.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/conftest.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/main.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/.gitignore +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/adjust/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/adjust/adjust_helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/airtable/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/applovin/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/applovin_max/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/appsflyer/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/appsflyer/client.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/appstore/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/appstore/client.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/appstore/errors.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/appstore/models.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/appstore/resources.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/arrow/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/asana_source/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/asana_source/helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/asana_source/settings.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/blob.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/chess/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/chess/helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/chess/settings.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/collector/spinner.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/destinations.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/dynamodb/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/errors.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/facebook_ads/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/facebook_ads/exceptions.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/facebook_ads/helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/facebook_ads/settings.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/filesystem/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/filesystem/helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/filesystem/readers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/filters.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/frankfurter/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/frankfurter/helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/freshdesk/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/freshdesk/freshdesk_client.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/freshdesk/settings.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/github/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/github/helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/github/queries.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/github/settings.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/google_ads/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/google_ads/field.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/google_ads/metrics.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/google_ads/predicates.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/google_ads/reports.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/google_analytics/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/google_analytics/helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/google_sheets/README.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/google_sheets/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/gorgias/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/gorgias/helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/hubspot/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/hubspot/helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/hubspot/settings.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/kafka/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/kafka/helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/kinesis/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/kinesis/helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/klaviyo/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/klaviyo/client.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/klaviyo/helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/linkedin_ads/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/linkedin_ads/helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/loader.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/mongodb/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/mongodb/helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/notion/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/notion/helpers/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/notion/helpers/client.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/notion/helpers/database.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/notion/settings.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/partition.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/personio/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/personio/helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/phantombuster/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/phantombuster/client.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/pipedrive/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/pipedrive/helpers/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/pipedrive/helpers/custom_fields_munger.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/pipedrive/helpers/pages.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/pipedrive/settings.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/pipedrive/typing.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/resource.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/salesforce/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/salesforce/helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/shopify/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/shopify/exceptions.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/shopify/helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/shopify/settings.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/slack/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/slack/helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/slack/settings.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/sql_database/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/sql_database/callbacks.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/stripe_analytics/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/stripe_analytics/helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/stripe_analytics/settings.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/table_definition.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/telemetry/event.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/testdata/fakebqcredentials.json +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/tiktok_ads/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/time.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/version.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/zendesk/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/zendesk/helpers/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/zendesk/helpers/credentials.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/src/zendesk/settings.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/testdata/.gitignore +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/testdata/create_replace.csv +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/testdata/delete_insert_expected.csv +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/testdata/delete_insert_part1.csv +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/testdata/delete_insert_part2.csv +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/testdata/merge_expected.csv +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/testdata/merge_part1.csv +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/ingestr/testdata/merge_part2.csv +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/package-lock.json +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/package.json +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/pyproject.toml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/requirements-dev.txt +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/resources/demo.gif +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/resources/demo.tape +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/resources/ingestr.svg +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/AMPM.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Acronyms.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Colons.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Contractions.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/DateFormat.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Ellipses.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/EmDash.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Exclamation.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/FirstPerson.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Gender.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/GenderBias.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/HeadingPunctuation.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Headings.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Latin.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/LyHyphens.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/OptionalPlurals.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Ordinal.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/OxfordComma.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Parens.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Passive.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Periods.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Quotes.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Ranges.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Semicolons.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Slang.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Spacing.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Spelling.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Units.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/We.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/Will.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/WordList.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/meta.json +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/styles/Google/vocab.txt +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/styles/bruin/Ingestr.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/styles/config/vocabularies/bruin/accept.txt +0 -0
- {ingestr-0.13.39 → ingestr-0.13.41}/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.41
|
|
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
|
|
@@ -50,6 +50,8 @@ Requires-Dist: dlt==1.10.0
|
|
|
50
50
|
Requires-Dist: dnspython==2.7.0
|
|
51
51
|
Requires-Dist: duckdb-engine==0.17.0
|
|
52
52
|
Requires-Dist: duckdb==1.2.1
|
|
53
|
+
Requires-Dist: elastic-transport==8.17.1
|
|
54
|
+
Requires-Dist: elasticsearch==8.10.1
|
|
53
55
|
Requires-Dist: et-xmlfile==2.0.0
|
|
54
56
|
Requires-Dist: facebook-business==20.0.0
|
|
55
57
|
Requires-Dist: filelock==3.17.0
|
|
@@ -70,11 +72,14 @@ Requires-Dist: google-auth==2.38.0
|
|
|
70
72
|
Requires-Dist: google-cloud-bigquery-storage==2.24.0
|
|
71
73
|
Requires-Dist: google-cloud-bigquery==3.30.0
|
|
72
74
|
Requires-Dist: google-cloud-core==2.4.2
|
|
75
|
+
Requires-Dist: google-cloud-spanner==3.54.0
|
|
73
76
|
Requires-Dist: google-cloud-storage==3.1.0
|
|
74
77
|
Requires-Dist: google-crc32c==1.6.0
|
|
75
78
|
Requires-Dist: google-resumable-media==2.7.2
|
|
76
79
|
Requires-Dist: googleapis-common-protos==1.69.0
|
|
77
80
|
Requires-Dist: greenlet==3.2.2
|
|
81
|
+
Requires-Dist: grpc-google-iam-v1==0.14.2
|
|
82
|
+
Requires-Dist: grpc-interceptor==0.15.4
|
|
78
83
|
Requires-Dist: grpcio-status==1.62.3
|
|
79
84
|
Requires-Dist: grpcio==1.70.0
|
|
80
85
|
Requires-Dist: hdbcli==2.23.27
|
|
@@ -166,9 +171,11 @@ Requires-Dist: soupsieve==2.6
|
|
|
166
171
|
Requires-Dist: sqlalchemy-bigquery==1.12.1
|
|
167
172
|
Requires-Dist: sqlalchemy-hana==2.0.0
|
|
168
173
|
Requires-Dist: sqlalchemy-redshift==0.8.14
|
|
174
|
+
Requires-Dist: sqlalchemy-spanner==1.11.0
|
|
169
175
|
Requires-Dist: sqlalchemy2-stubs==0.0.2a38
|
|
170
176
|
Requires-Dist: sqlalchemy==1.4.52
|
|
171
177
|
Requires-Dist: sqlglot==26.12.1
|
|
178
|
+
Requires-Dist: sqlparse==0.5.3
|
|
172
179
|
Requires-Dist: stripe==10.7.0
|
|
173
180
|
Requires-Dist: tenacity==9.0.0
|
|
174
181
|
Requires-Dist: thrift==0.16.0
|
|
@@ -74,6 +74,7 @@ export default defineConfig({
|
|
|
74
74
|
{ text: "Databricks", link: "/supported-sources/databricks.md" },
|
|
75
75
|
{ text: "DuckDB", link: "/supported-sources/duckdb.md" },
|
|
76
76
|
{ text: "DynamoDB", link: "/supported-sources/dynamodb.md" },
|
|
77
|
+
{ text: "Elasticsearch", link: "/supported-sources/elasticsearch.md" },
|
|
77
78
|
{
|
|
78
79
|
text: "Google BigQuery",
|
|
79
80
|
link: "/supported-sources/bigquery.md",
|
|
@@ -137,6 +138,7 @@ export default defineConfig({
|
|
|
137
138
|
{ text: "Salesforce", link: "/supported-sources/salesforce.md" },
|
|
138
139
|
{ text: "Shopify", link: "/supported-sources/shopify.md" },
|
|
139
140
|
{ text: "Slack", link: "/supported-sources/slack.md" },
|
|
141
|
+
{ text: "Spanner", link: "/supported-sources/spanner.md" },
|
|
140
142
|
{ text: "Stripe", link: "/supported-sources/stripe.md" },
|
|
141
143
|
{ text: "TikTok Ads", link: "/supported-sources/tiktok-ads.md" },
|
|
142
144
|
{ text: "Zendesk", link: "/supported-sources/zendesk.md" },
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Elasticsearch
|
|
2
|
+
[Elasticsearch](https://www.elastic.co/elasticsearch) is a distributed, RESTful search and analytics engine designed for fast and scalable data retrieval.
|
|
3
|
+
|
|
4
|
+
ingestr supports Elasticsearch as a source.
|
|
5
|
+
|
|
6
|
+
## URI format
|
|
7
|
+
The URI format for Elasticsearch is as follows:
|
|
8
|
+
|
|
9
|
+
```plaintext
|
|
10
|
+
elasticsearch://username:password@host:port?secure=<secure>&verify_certs=<verify_certs>
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
URI parameters:
|
|
14
|
+
- `username`: The username used to authenticate with Elasticsearch.
|
|
15
|
+
- `password`: The password associated with the specified username.
|
|
16
|
+
- `host`: The host address of the Elasticsearch server.
|
|
17
|
+
- `port`: The port number used by the Elasticsearch server.
|
|
18
|
+
- `secure`: Enables HTTPS when set to true. By default, it is true.
|
|
19
|
+
- `verify_certs`: Verifies TLS certificates when set to true. By default, it is true.
|
|
20
|
+
|
|
21
|
+
Source Table
|
|
22
|
+
|
|
23
|
+
`<index-name>`: Fetches all available documents from the specified index.
|
|
24
|
+
|
|
25
|
+
```ingestr ingest \
|
|
26
|
+
--source-uri "elasticsearch://elastic:changeme@localhost:9200?secure=false&verify_certs=false" \
|
|
27
|
+
--source-table 'test-index' \
|
|
28
|
+
--dest-uri "duckdb:///users.duckdb" \
|
|
29
|
+
--dest-table 'dest.users_detail'
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
This command retrieves all documents from the test-index in Elasticsearch and copy them to the dest.users_detail table in DuckDB.
|
|
33
|
+
|
|
34
|
+
<img alt="ingestion_elasticsearch_img" src="../media/ingestion_elasticsearch_img.png" />
|
|
35
|
+
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Spanner
|
|
2
|
+
[Spanner](https://cloud.google.com/spanner) is a fully managed, scalable, and strongly consistent database service.
|
|
3
|
+
|
|
4
|
+
ingestr supports Spanner as a source.
|
|
5
|
+
|
|
6
|
+
## URI format
|
|
7
|
+
The URI format for Spanner is as follows:
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
```plaintext
|
|
11
|
+
spanner://?project_id=<project_id>&instance_id=<instance_id>&database=<database>&credentials_path=</path/to/service/account.json>
|
|
12
|
+
```
|
|
13
|
+
or
|
|
14
|
+
```plaintext
|
|
15
|
+
spanner://?project_id=<project_id>&instance_id=<instance_id>&database=<database>&credentials_base64=<base64_encoded_credentials>
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
URI parameters:
|
|
19
|
+
- `project_id`: Your Google Cloud project ID (e.g., "my-project-123")
|
|
20
|
+
- `instance_id`: The Spanner instance ID (e.g., "my-instance")
|
|
21
|
+
- `database`: The database name (e.g., "my-database")
|
|
22
|
+
- `credentials_path`: Path to your Google Cloud service account JSON file
|
|
23
|
+
- `credentials_base64`: Base64-encoded service account credentials (alternative to credentials_path)
|
|
24
|
+
|
|
25
|
+
Let's say we have the above credentials. Here's a sample command that will copy the data from Spanner (GoogleSQL) to DuckDB.
|
|
26
|
+
|
|
27
|
+
```sh
|
|
28
|
+
ingestr ingest \
|
|
29
|
+
--source-uri 'spanner://?project_id=id_123&instance_id=instance_123&database=db_123&credentials_path=./service_account.json' \
|
|
30
|
+
--source-table 'users' \
|
|
31
|
+
--dest-uri duckdb:///spanner.duckdb \
|
|
32
|
+
--dest-table 'dest.output'
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
<img alt="pipedrive_img" src="../media/spanner_ingestion.png"/>
|
|
37
|
+
|
|
38
|
+
> [!NOTE]
|
|
39
|
+
> Currently, only GoogleSQL databases are supported.
|
|
40
|
+
|
|
41
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
version = "v0.13.41"
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
from datetime import date, datetime
|
|
2
|
+
from typing import Any, Optional
|
|
3
|
+
|
|
4
|
+
import dlt
|
|
5
|
+
import pendulum
|
|
6
|
+
from dlt.common.time import ensure_pendulum_datetime
|
|
7
|
+
from pendulum import parse
|
|
8
|
+
|
|
9
|
+
from elasticsearch import Elasticsearch
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@dlt.source
|
|
13
|
+
def elasticsearch_source(
|
|
14
|
+
connection_url: str,
|
|
15
|
+
index: str,
|
|
16
|
+
verify_certs: bool,
|
|
17
|
+
incremental: Optional[dlt.sources.incremental] = None,
|
|
18
|
+
):
|
|
19
|
+
client = Elasticsearch(connection_url, verify_certs=verify_certs)
|
|
20
|
+
|
|
21
|
+
@dlt.resource(
|
|
22
|
+
name=index, primary_key="id", write_disposition="merge", incremental=incremental
|
|
23
|
+
)
|
|
24
|
+
def get_documents(incremental=incremental):
|
|
25
|
+
body = {"query": {"match_all": {}}}
|
|
26
|
+
|
|
27
|
+
if incremental:
|
|
28
|
+
start_value = incremental.last_value
|
|
29
|
+
range_filter = {"gte": start_value}
|
|
30
|
+
if incremental.end_value is not None:
|
|
31
|
+
range_filter["lt"] = incremental.end_value
|
|
32
|
+
body = {"query": {"range": {incremental.cursor_path: range_filter}}}
|
|
33
|
+
|
|
34
|
+
page = client.search(index=index, scroll="5m", size=5, body=body)
|
|
35
|
+
|
|
36
|
+
sid = page["_scroll_id"]
|
|
37
|
+
hits = page["hits"]["hits"]
|
|
38
|
+
|
|
39
|
+
if not hits:
|
|
40
|
+
return
|
|
41
|
+
|
|
42
|
+
# fetching first page (via .search)
|
|
43
|
+
for doc in hits:
|
|
44
|
+
doc_data = {"id": doc["_id"], **doc["_source"]}
|
|
45
|
+
if incremental:
|
|
46
|
+
doc_data[incremental.cursor_path] = convert_elasticsearch_objs(
|
|
47
|
+
doc_data[incremental.cursor_path]
|
|
48
|
+
)
|
|
49
|
+
yield doc_data
|
|
50
|
+
|
|
51
|
+
while True:
|
|
52
|
+
# fetching page 2 and other pages (via .scroll)
|
|
53
|
+
page = client.scroll(scroll_id=sid, scroll="5m")
|
|
54
|
+
sid = page["_scroll_id"]
|
|
55
|
+
hits = page["hits"]["hits"]
|
|
56
|
+
if not hits:
|
|
57
|
+
break
|
|
58
|
+
for doc in hits:
|
|
59
|
+
doc_data = {"id": doc["_id"], **doc["_source"]}
|
|
60
|
+
if incremental:
|
|
61
|
+
doc_data[incremental.cursor_path] = convert_elasticsearch_objs(
|
|
62
|
+
doc_data[incremental.cursor_path]
|
|
63
|
+
)
|
|
64
|
+
yield doc_data
|
|
65
|
+
|
|
66
|
+
client.clear_scroll(scroll_id=sid)
|
|
67
|
+
|
|
68
|
+
return get_documents
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def convert_elasticsearch_objs(value: Any) -> Any:
|
|
72
|
+
if isinstance(value, str):
|
|
73
|
+
parsed_date = parse(value, strict=False)
|
|
74
|
+
if parsed_date is not None:
|
|
75
|
+
if isinstance(
|
|
76
|
+
parsed_date,
|
|
77
|
+
(pendulum.DateTime, pendulum.Date, datetime, date, str, float, int),
|
|
78
|
+
):
|
|
79
|
+
return ensure_pendulum_datetime(parsed_date)
|
|
80
|
+
return value
|
|
@@ -28,6 +28,7 @@ from ingestr.src.sources import (
|
|
|
28
28
|
AsanaSource,
|
|
29
29
|
ChessSource,
|
|
30
30
|
DynamoDBSource,
|
|
31
|
+
ElasticsearchSource,
|
|
31
32
|
FacebookAdsSource,
|
|
32
33
|
FrankfurterSource,
|
|
33
34
|
FreshdeskSource,
|
|
@@ -78,6 +79,7 @@ SQL_SOURCE_SCHEMES = [
|
|
|
78
79
|
"clickhouse",
|
|
79
80
|
"databricks",
|
|
80
81
|
"db2",
|
|
82
|
+
"spanner",
|
|
81
83
|
]
|
|
82
84
|
|
|
83
85
|
|
|
@@ -153,6 +155,7 @@ class SourceDestinationFactory:
|
|
|
153
155
|
"frankfurter": FrankfurterSource,
|
|
154
156
|
"freshdesk": FreshdeskSource,
|
|
155
157
|
"phantombuster": PhantombusterSource,
|
|
158
|
+
"elasticsearch": ElasticsearchSource,
|
|
156
159
|
}
|
|
157
160
|
destinations: Dict[str, Type[DestinationProtocol]] = {
|
|
158
161
|
"bigquery": BigQueryDestination,
|
|
@@ -52,7 +52,10 @@ class SqlSource:
|
|
|
52
52
|
def dlt_source(self, uri: str, table: str, **kwargs):
|
|
53
53
|
table_fields = TableDefinition(dataset="custom", table="custom")
|
|
54
54
|
if not table.startswith("query:"):
|
|
55
|
-
|
|
55
|
+
if uri.startswith("spanner://"):
|
|
56
|
+
table_fields = TableDefinition(dataset="", table=table)
|
|
57
|
+
else:
|
|
58
|
+
table_fields = table_string_to_dataclass(table)
|
|
56
59
|
|
|
57
60
|
incremental = None
|
|
58
61
|
if kwargs.get("incremental_key"):
|
|
@@ -113,6 +116,45 @@ class SqlSource:
|
|
|
113
116
|
if uri.startswith("db2://"):
|
|
114
117
|
uri = uri.replace("db2://", "db2+ibm_db://")
|
|
115
118
|
|
|
119
|
+
if uri.startswith("spanner://"):
|
|
120
|
+
parsed_uri = urlparse(uri)
|
|
121
|
+
query_params = parse_qs(parsed_uri.query)
|
|
122
|
+
|
|
123
|
+
project_id_param = query_params.get("project_id")
|
|
124
|
+
instance_id_param = query_params.get("instance_id")
|
|
125
|
+
database_param = query_params.get("database")
|
|
126
|
+
|
|
127
|
+
cred_path = query_params.get("credentials_path")
|
|
128
|
+
cred_base64 = query_params.get("credentials_base64")
|
|
129
|
+
|
|
130
|
+
if not project_id_param or not instance_id_param or not database_param:
|
|
131
|
+
raise ValueError(
|
|
132
|
+
"project_id, instance_id and database are required in the URI to get data from Google Spanner"
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
project_id = project_id_param[0]
|
|
136
|
+
instance_id = instance_id_param[0]
|
|
137
|
+
database = database_param[0]
|
|
138
|
+
|
|
139
|
+
if not cred_path and not cred_base64:
|
|
140
|
+
raise ValueError(
|
|
141
|
+
"credentials_path or credentials_base64 is required in the URI to get data from Google Sheets"
|
|
142
|
+
)
|
|
143
|
+
if cred_path:
|
|
144
|
+
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = cred_path[0]
|
|
145
|
+
elif cred_base64:
|
|
146
|
+
credentials = json.loads(
|
|
147
|
+
base64.b64decode(cred_base64[0]).decode("utf-8")
|
|
148
|
+
)
|
|
149
|
+
temp = tempfile.NamedTemporaryFile(
|
|
150
|
+
mode="w", delete=False, suffix=".json"
|
|
151
|
+
)
|
|
152
|
+
json.dump(credentials, temp)
|
|
153
|
+
temp.close()
|
|
154
|
+
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = temp.name
|
|
155
|
+
|
|
156
|
+
uri = f"spanner+spanner:///projects/{project_id}/instances/{instance_id}/databases/{database}"
|
|
157
|
+
|
|
116
158
|
from dlt.common.libs.sql_alchemy import (
|
|
117
159
|
Engine,
|
|
118
160
|
MetaData,
|
|
@@ -2298,3 +2340,55 @@ class PhantombusterSource:
|
|
|
2298
2340
|
start_date=start_date,
|
|
2299
2341
|
end_date=end_date,
|
|
2300
2342
|
).with_resources(table_name)
|
|
2343
|
+
|
|
2344
|
+
|
|
2345
|
+
class ElasticsearchSource:
|
|
2346
|
+
def handles_incrementality(self) -> bool:
|
|
2347
|
+
return False
|
|
2348
|
+
|
|
2349
|
+
def dlt_source(self, uri: str, table: str, **kwargs):
|
|
2350
|
+
from ingestr.src.elasticsearch import elasticsearch_source
|
|
2351
|
+
|
|
2352
|
+
incremental = None
|
|
2353
|
+
if kwargs.get("incremental_key"):
|
|
2354
|
+
start_value = kwargs.get("interval_start")
|
|
2355
|
+
end_value = kwargs.get("interval_end")
|
|
2356
|
+
|
|
2357
|
+
incremental = dlt_incremental(
|
|
2358
|
+
kwargs.get("incremental_key", ""),
|
|
2359
|
+
initial_value=start_value,
|
|
2360
|
+
end_value=end_value,
|
|
2361
|
+
range_end="closed",
|
|
2362
|
+
range_start="closed",
|
|
2363
|
+
)
|
|
2364
|
+
|
|
2365
|
+
# elasticsearch://localhost:9200?secure=true&verify_certs=false
|
|
2366
|
+
parsed = urlparse(uri)
|
|
2367
|
+
|
|
2368
|
+
index = table
|
|
2369
|
+
if not index:
|
|
2370
|
+
raise ValueError(
|
|
2371
|
+
"Table name must be provided which is the index name in elasticsearch"
|
|
2372
|
+
)
|
|
2373
|
+
|
|
2374
|
+
query_params = parsed.query
|
|
2375
|
+
params = parse_qs(query_params)
|
|
2376
|
+
|
|
2377
|
+
secure = True
|
|
2378
|
+
if "secure" in params:
|
|
2379
|
+
secure = params["secure"][0].capitalize() == "True"
|
|
2380
|
+
|
|
2381
|
+
verify_certs = True
|
|
2382
|
+
if "verify_certs" in params:
|
|
2383
|
+
verify_certs = params["verify_certs"][0].capitalize() == "True"
|
|
2384
|
+
|
|
2385
|
+
scheme = "https" if secure else "http"
|
|
2386
|
+
netloc = parsed.netloc
|
|
2387
|
+
connection_url = f"{scheme}://{netloc}"
|
|
2388
|
+
|
|
2389
|
+
return elasticsearch_source(
|
|
2390
|
+
connection_url=connection_url,
|
|
2391
|
+
index=index,
|
|
2392
|
+
verify_certs=verify_certs,
|
|
2393
|
+
incremental=incremental,
|
|
2394
|
+
).with_resources(table)
|
|
@@ -48,4 +48,7 @@ clickhouse-sqlalchemy==0.2.7
|
|
|
48
48
|
zstd==1.5.6.5
|
|
49
49
|
ibm-db==3.2.6; platform_machine != "aarch64"
|
|
50
50
|
ibm-db-sa==0.4.1; platform_machine != "aarch64"
|
|
51
|
-
aiohttp>=3.11.15
|
|
51
|
+
aiohttp>=3.11.15
|
|
52
|
+
elasticsearch==8.10.1
|
|
53
|
+
sqlalchemy-spanner==1.11.0
|
|
54
|
+
google-cloud-spanner==3.54.0
|
|
@@ -16,7 +16,9 @@ aioitertools==0.12.0
|
|
|
16
16
|
aiosignal==1.3.2
|
|
17
17
|
# via aiohttp
|
|
18
18
|
alembic==1.15.1
|
|
19
|
-
# via
|
|
19
|
+
# via
|
|
20
|
+
# databricks-sql-connector
|
|
21
|
+
# sqlalchemy-spanner
|
|
20
22
|
annotated-types==0.7.0
|
|
21
23
|
# via pydantic
|
|
22
24
|
asana==3.2.3
|
|
@@ -51,6 +53,7 @@ cachetools==5.5.2
|
|
|
51
53
|
certifi==2025.1.31
|
|
52
54
|
# via
|
|
53
55
|
# clickhouse-connect
|
|
56
|
+
# elastic-transport
|
|
54
57
|
# requests
|
|
55
58
|
# snowflake-connector-python
|
|
56
59
|
cffi==1.17.1
|
|
@@ -104,6 +107,10 @@ duckdb==1.2.1
|
|
|
104
107
|
# duckdb-engine
|
|
105
108
|
duckdb-engine==0.17.0
|
|
106
109
|
# via -r requirements.in
|
|
110
|
+
elastic-transport==8.17.1
|
|
111
|
+
# via elasticsearch
|
|
112
|
+
elasticsearch==8.10.1
|
|
113
|
+
# via -r requirements.in
|
|
107
114
|
et-xmlfile==2.0.0
|
|
108
115
|
# via openpyxl
|
|
109
116
|
facebook-business==20.0.0
|
|
@@ -142,6 +149,7 @@ google-api-core==2.24.1
|
|
|
142
149
|
# google-cloud-bigquery
|
|
143
150
|
# google-cloud-bigquery-storage
|
|
144
151
|
# google-cloud-core
|
|
152
|
+
# google-cloud-spanner
|
|
145
153
|
# google-cloud-storage
|
|
146
154
|
# sqlalchemy-bigquery
|
|
147
155
|
google-api-python-client==2.130.0
|
|
@@ -171,7 +179,12 @@ google-cloud-bigquery-storage==2.24.0
|
|
|
171
179
|
google-cloud-core==2.4.2
|
|
172
180
|
# via
|
|
173
181
|
# google-cloud-bigquery
|
|
182
|
+
# google-cloud-spanner
|
|
174
183
|
# google-cloud-storage
|
|
184
|
+
google-cloud-spanner==3.54.0
|
|
185
|
+
# via
|
|
186
|
+
# -r requirements.in
|
|
187
|
+
# sqlalchemy-spanner
|
|
175
188
|
google-cloud-storage==3.1.0
|
|
176
189
|
# via gcsfs
|
|
177
190
|
google-crc32c==1.6.0
|
|
@@ -186,13 +199,21 @@ googleapis-common-protos==1.69.0
|
|
|
186
199
|
# via
|
|
187
200
|
# google-ads
|
|
188
201
|
# google-api-core
|
|
202
|
+
# grpc-google-iam-v1
|
|
189
203
|
# grpcio-status
|
|
190
204
|
greenlet==3.2.2
|
|
191
205
|
# via sqlalchemy
|
|
206
|
+
grpc-google-iam-v1==0.14.2
|
|
207
|
+
# via google-cloud-spanner
|
|
208
|
+
grpc-interceptor==0.15.4
|
|
209
|
+
# via google-cloud-spanner
|
|
192
210
|
grpcio==1.70.0
|
|
193
211
|
# via
|
|
194
212
|
# google-ads
|
|
195
213
|
# google-api-core
|
|
214
|
+
# googleapis-common-protos
|
|
215
|
+
# grpc-google-iam-v1
|
|
216
|
+
# grpc-interceptor
|
|
196
217
|
# grpcio-status
|
|
197
218
|
grpcio-status==1.62.3
|
|
198
219
|
# via
|
|
@@ -316,13 +337,16 @@ proto-plus==1.26.0
|
|
|
316
337
|
# google-analytics-data
|
|
317
338
|
# google-api-core
|
|
318
339
|
# google-cloud-bigquery-storage
|
|
340
|
+
# google-cloud-spanner
|
|
319
341
|
protobuf==4.25.6
|
|
320
342
|
# via
|
|
321
343
|
# google-ads
|
|
322
344
|
# google-analytics-data
|
|
323
345
|
# google-api-core
|
|
324
346
|
# google-cloud-bigquery-storage
|
|
347
|
+
# google-cloud-spanner
|
|
325
348
|
# googleapis-common-protos
|
|
349
|
+
# grpc-google-iam-v1
|
|
326
350
|
# grpcio-status
|
|
327
351
|
# proto-plus
|
|
328
352
|
psutil==6.1.1
|
|
@@ -488,16 +512,21 @@ sqlalchemy==1.4.52
|
|
|
488
512
|
# sqlalchemy-bigquery
|
|
489
513
|
# sqlalchemy-hana
|
|
490
514
|
# sqlalchemy-redshift
|
|
515
|
+
# sqlalchemy-spanner
|
|
491
516
|
sqlalchemy-bigquery==1.12.1
|
|
492
517
|
# via -r requirements.in
|
|
493
518
|
sqlalchemy-hana==2.0.0
|
|
494
519
|
# via -r requirements.in
|
|
495
520
|
sqlalchemy-redshift==0.8.14
|
|
496
521
|
# via -r requirements.in
|
|
522
|
+
sqlalchemy-spanner==1.11.0
|
|
523
|
+
# via -r requirements.in
|
|
497
524
|
sqlalchemy2-stubs==0.0.2a38
|
|
498
525
|
# via -r requirements.in
|
|
499
526
|
sqlglot==26.12.1
|
|
500
527
|
# via dlt
|
|
528
|
+
sqlparse==0.5.3
|
|
529
|
+
# via google-cloud-spanner
|
|
501
530
|
stripe==10.7.0
|
|
502
531
|
# via -r requirements.in
|
|
503
532
|
tenacity==9.0.0
|
|
@@ -553,6 +582,7 @@ urllib3==2.3.0
|
|
|
553
582
|
# botocore
|
|
554
583
|
# clickhouse-connect
|
|
555
584
|
# databricks-sql-connector
|
|
585
|
+
# elastic-transport
|
|
556
586
|
# pyairtable
|
|
557
587
|
# requests
|
|
558
588
|
# types-requests
|
|
@@ -16,7 +16,9 @@ aioitertools==0.12.0
|
|
|
16
16
|
aiosignal==1.3.2
|
|
17
17
|
# via aiohttp
|
|
18
18
|
alembic==1.15.2
|
|
19
|
-
# via
|
|
19
|
+
# via
|
|
20
|
+
# databricks-sql-connector
|
|
21
|
+
# sqlalchemy-spanner
|
|
20
22
|
annotated-types==0.7.0
|
|
21
23
|
# via pydantic
|
|
22
24
|
asana==3.2.3
|
|
@@ -51,6 +53,7 @@ cachetools==5.5.2
|
|
|
51
53
|
certifi==2025.1.31
|
|
52
54
|
# via
|
|
53
55
|
# clickhouse-connect
|
|
56
|
+
# elastic-transport
|
|
54
57
|
# requests
|
|
55
58
|
# snowflake-connector-python
|
|
56
59
|
cffi==1.17.1
|
|
@@ -104,6 +107,10 @@ duckdb==1.2.1
|
|
|
104
107
|
# duckdb-engine
|
|
105
108
|
duckdb-engine==0.17.0
|
|
106
109
|
# via -r requirements.in
|
|
110
|
+
elastic-transport==8.17.1
|
|
111
|
+
# via elasticsearch
|
|
112
|
+
elasticsearch==8.10.1
|
|
113
|
+
# via -r requirements.in
|
|
107
114
|
et-xmlfile==2.0.0
|
|
108
115
|
# via openpyxl
|
|
109
116
|
facebook-business==20.0.0
|
|
@@ -142,6 +149,7 @@ google-api-core==2.24.2
|
|
|
142
149
|
# google-cloud-bigquery
|
|
143
150
|
# google-cloud-bigquery-storage
|
|
144
151
|
# google-cloud-core
|
|
152
|
+
# google-cloud-spanner
|
|
145
153
|
# google-cloud-storage
|
|
146
154
|
# sqlalchemy-bigquery
|
|
147
155
|
google-api-python-client==2.130.0
|
|
@@ -171,7 +179,12 @@ google-cloud-bigquery-storage==2.24.0
|
|
|
171
179
|
google-cloud-core==2.4.3
|
|
172
180
|
# via
|
|
173
181
|
# google-cloud-bigquery
|
|
182
|
+
# google-cloud-spanner
|
|
174
183
|
# google-cloud-storage
|
|
184
|
+
google-cloud-spanner==3.54.0
|
|
185
|
+
# via
|
|
186
|
+
# -r requirements.in
|
|
187
|
+
# sqlalchemy-spanner
|
|
175
188
|
google-cloud-storage==3.1.0
|
|
176
189
|
# via gcsfs
|
|
177
190
|
google-crc32c==1.7.1
|
|
@@ -186,13 +199,21 @@ googleapis-common-protos==1.69.2
|
|
|
186
199
|
# via
|
|
187
200
|
# google-ads
|
|
188
201
|
# google-api-core
|
|
202
|
+
# grpc-google-iam-v1
|
|
189
203
|
# grpcio-status
|
|
190
204
|
greenlet==3.1.1
|
|
191
205
|
# via sqlalchemy
|
|
206
|
+
grpc-google-iam-v1==0.14.2
|
|
207
|
+
# via google-cloud-spanner
|
|
208
|
+
grpc-interceptor==0.15.4
|
|
209
|
+
# via google-cloud-spanner
|
|
192
210
|
grpcio==1.71.0
|
|
193
211
|
# via
|
|
194
212
|
# google-ads
|
|
195
213
|
# google-api-core
|
|
214
|
+
# googleapis-common-protos
|
|
215
|
+
# grpc-google-iam-v1
|
|
216
|
+
# grpc-interceptor
|
|
196
217
|
# grpcio-status
|
|
197
218
|
grpcio-status==1.62.3
|
|
198
219
|
# via
|
|
@@ -310,13 +331,16 @@ proto-plus==1.26.1
|
|
|
310
331
|
# google-analytics-data
|
|
311
332
|
# google-api-core
|
|
312
333
|
# google-cloud-bigquery-storage
|
|
334
|
+
# google-cloud-spanner
|
|
313
335
|
protobuf==4.25.6
|
|
314
336
|
# via
|
|
315
337
|
# google-ads
|
|
316
338
|
# google-analytics-data
|
|
317
339
|
# google-api-core
|
|
318
340
|
# google-cloud-bigquery-storage
|
|
341
|
+
# google-cloud-spanner
|
|
319
342
|
# googleapis-common-protos
|
|
343
|
+
# grpc-google-iam-v1
|
|
320
344
|
# grpcio-status
|
|
321
345
|
# proto-plus
|
|
322
346
|
psutil==6.1.1
|
|
@@ -481,16 +505,21 @@ sqlalchemy==1.4.52
|
|
|
481
505
|
# sqlalchemy-bigquery
|
|
482
506
|
# sqlalchemy-hana
|
|
483
507
|
# sqlalchemy-redshift
|
|
508
|
+
# sqlalchemy-spanner
|
|
484
509
|
sqlalchemy-bigquery==1.12.1
|
|
485
510
|
# via -r requirements.in
|
|
486
511
|
sqlalchemy-hana==2.0.0
|
|
487
512
|
# via -r requirements.in
|
|
488
513
|
sqlalchemy-redshift==0.8.14
|
|
489
514
|
# via -r requirements.in
|
|
515
|
+
sqlalchemy-spanner==1.11.0
|
|
516
|
+
# via -r requirements.in
|
|
490
517
|
sqlalchemy2-stubs==0.0.2a38
|
|
491
518
|
# via -r requirements.in
|
|
492
519
|
sqlglot==26.12.1
|
|
493
520
|
# via dlt
|
|
521
|
+
sqlparse==0.5.3
|
|
522
|
+
# via google-cloud-spanner
|
|
494
523
|
stripe==10.7.0
|
|
495
524
|
# via -r requirements.in
|
|
496
525
|
tenacity==9.0.0
|
|
@@ -549,6 +578,7 @@ urllib3==2.3.0
|
|
|
549
578
|
# botocore
|
|
550
579
|
# clickhouse-connect
|
|
551
580
|
# databricks-sql-connector
|
|
581
|
+
# elastic-transport
|
|
552
582
|
# pyairtable
|
|
553
583
|
# requests
|
|
554
584
|
# types-requests
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
version = "v0.13.39"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|