ingestr 0.13.39__tar.gz → 0.13.40__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.40}/PKG-INFO +3 -1
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/.vitepress/config.mjs +1 -0
- ingestr-0.13.40/docs/media/ingestion_elasticsearch_img.png +0 -0
- ingestr-0.13.40/docs/supported-sources/elasticsearch.md +35 -0
- ingestr-0.13.40/ingestr/src/buildinfo.py +1 -0
- ingestr-0.13.40/ingestr/src/elasticsearch/__init__.py +80 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/factory.py +2 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/sources.py +50 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/requirements.in +2 -1
- {ingestr-0.13.39 → ingestr-0.13.40}/requirements.txt +6 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/requirements_arm64.txt +6 -0
- ingestr-0.13.39/ingestr/src/buildinfo.py +0 -1
- {ingestr-0.13.39 → ingestr-0.13.40}/.dockerignore +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/.githooks/pre-commit-hook.sh +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/.github/workflows/deploy-docs.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/.github/workflows/release.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/.github/workflows/secrets-scan.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/.github/workflows/tests.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/.gitignore +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/.gitleaksignore +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/.python-version +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/.vale.ini +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/Dockerfile +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/LICENSE.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/Makefile +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/README.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/.vitepress/theme/custom.css +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/.vitepress/theme/index.js +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/commands/example-uris.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/commands/ingest.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/getting-started/core-concepts.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/getting-started/incremental-loading.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/getting-started/quickstart.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/getting-started/telemetry.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/index.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/media/applovin_max.png +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/media/athena.png +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/media/clickhouse_img.png +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/media/freshdesk_ingestion.png +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/media/github.png +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/media/google_analytics_realtime_report.png +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/media/googleanalytics.png +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/media/kinesis.bigquery.png +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/media/linkedin_ads.png +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/media/personio.png +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/media/personio_duckdb.png +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/media/phantombuster.png +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/media/pipedrive.png +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/media/stripe_postgres.png +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/media/tiktok.png +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/adjust.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/airtable.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/applovin.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/applovin_max.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/appsflyer.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/appstore.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/asana.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/athena.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/bigquery.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/chess.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/clickhouse.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/csv.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/custom_queries.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/databricks.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/db2.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/duckdb.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/dynamodb.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/facebook-ads.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/frankfurter.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/freshdesk.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/gcs.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/github.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/google-ads.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/google_analytics.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/gorgias.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/gsheets.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/hubspot.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/kafka.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/kinesis.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/klaviyo.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/linkedin_ads.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/mongodb.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/mssql.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/mysql.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/notion.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/oracle.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/personio.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/phantombuster.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/pipedrive.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/postgres.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/redshift.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/s3.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/salesforce.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/sap-hana.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/shopify.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/slack.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/snowflake.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/sqlite.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/stripe.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/tiktok-ads.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/supported-sources/zendesk.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/tutorials/load-kinesis-bigquery.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/tutorials/load-personio-duckdb.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/docs/tutorials/load-stripe-postgres.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/conftest.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/main.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/.gitignore +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/adjust/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/adjust/adjust_helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/airtable/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/applovin/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/applovin_max/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/appsflyer/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/appsflyer/client.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/appstore/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/appstore/client.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/appstore/errors.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/appstore/models.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/appstore/resources.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/arrow/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/asana_source/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/asana_source/helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/asana_source/settings.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/blob.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/chess/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/chess/helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/chess/settings.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/collector/spinner.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/destinations.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/dynamodb/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/errors.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/facebook_ads/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/facebook_ads/exceptions.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/facebook_ads/helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/facebook_ads/settings.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/filesystem/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/filesystem/helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/filesystem/readers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/filters.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/frankfurter/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/frankfurter/helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/freshdesk/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/freshdesk/freshdesk_client.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/freshdesk/settings.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/github/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/github/helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/github/queries.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/github/settings.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/google_ads/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/google_ads/field.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/google_ads/metrics.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/google_ads/predicates.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/google_ads/reports.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/google_analytics/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/google_analytics/helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/google_sheets/README.md +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/google_sheets/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/gorgias/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/gorgias/helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/hubspot/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/hubspot/helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/hubspot/settings.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/kafka/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/kafka/helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/kinesis/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/kinesis/helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/klaviyo/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/klaviyo/client.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/klaviyo/helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/linkedin_ads/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/linkedin_ads/helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/loader.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/mongodb/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/mongodb/helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/notion/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/notion/helpers/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/notion/helpers/client.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/notion/helpers/database.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/notion/settings.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/partition.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/personio/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/personio/helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/phantombuster/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/phantombuster/client.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/pipedrive/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/pipedrive/helpers/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/pipedrive/helpers/custom_fields_munger.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/pipedrive/helpers/pages.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/pipedrive/settings.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/pipedrive/typing.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/resource.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/salesforce/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/salesforce/helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/shopify/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/shopify/exceptions.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/shopify/helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/shopify/settings.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/slack/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/slack/helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/slack/settings.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/sql_database/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/sql_database/callbacks.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/stripe_analytics/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/stripe_analytics/helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/stripe_analytics/settings.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/table_definition.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/telemetry/event.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/testdata/fakebqcredentials.json +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/tiktok_ads/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/time.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/version.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/zendesk/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/zendesk/helpers/__init__.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/zendesk/helpers/credentials.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/src/zendesk/settings.py +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/testdata/.gitignore +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/testdata/create_replace.csv +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/testdata/delete_insert_expected.csv +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/testdata/delete_insert_part1.csv +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/testdata/delete_insert_part2.csv +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/testdata/merge_expected.csv +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/testdata/merge_part1.csv +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/ingestr/testdata/merge_part2.csv +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/package-lock.json +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/package.json +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/pyproject.toml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/requirements-dev.txt +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/resources/demo.gif +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/resources/demo.tape +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/resources/ingestr.svg +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/AMPM.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Acronyms.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Colons.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Contractions.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/DateFormat.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Ellipses.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/EmDash.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Exclamation.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/FirstPerson.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Gender.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/GenderBias.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/HeadingPunctuation.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Headings.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Latin.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/LyHyphens.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/OptionalPlurals.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Ordinal.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/OxfordComma.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Parens.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Passive.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Periods.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Quotes.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Ranges.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Semicolons.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Slang.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Spacing.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Spelling.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Units.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/We.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/Will.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/WordList.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/meta.json +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/styles/Google/vocab.txt +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/styles/bruin/Ingestr.yml +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/styles/config/vocabularies/bruin/accept.txt +0 -0
- {ingestr-0.13.39 → ingestr-0.13.40}/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.40
|
|
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
|
|
@@ -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",
|
|
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 @@
|
|
|
1
|
+
version = "v0.13.40"
|
|
@@ -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,
|
|
@@ -153,6 +154,7 @@ class SourceDestinationFactory:
|
|
|
153
154
|
"frankfurter": FrankfurterSource,
|
|
154
155
|
"freshdesk": FreshdeskSource,
|
|
155
156
|
"phantombuster": PhantombusterSource,
|
|
157
|
+
"elasticsearch": ElasticsearchSource,
|
|
156
158
|
}
|
|
157
159
|
destinations: Dict[str, Type[DestinationProtocol]] = {
|
|
158
160
|
"bigquery": BigQueryDestination,
|
|
@@ -2298,3 +2298,53 @@ class PhantombusterSource:
|
|
|
2298
2298
|
start_date=start_date,
|
|
2299
2299
|
end_date=end_date,
|
|
2300
2300
|
).with_resources(table_name)
|
|
2301
|
+
|
|
2302
|
+
|
|
2303
|
+
class ElasticsearchSource:
|
|
2304
|
+
def handles_incrementality(self) -> bool:
|
|
2305
|
+
return False
|
|
2306
|
+
|
|
2307
|
+
def dlt_source(self, uri: str, table: str, **kwargs):
|
|
2308
|
+
from ingestr.src.elasticsearch import elasticsearch_source
|
|
2309
|
+
|
|
2310
|
+
incremental = None
|
|
2311
|
+
if kwargs.get("incremental_key"):
|
|
2312
|
+
start_value = kwargs.get("interval_start")
|
|
2313
|
+
end_value = kwargs.get("interval_end")
|
|
2314
|
+
|
|
2315
|
+
incremental = dlt_incremental(
|
|
2316
|
+
kwargs.get("incremental_key", ""),
|
|
2317
|
+
initial_value=start_value,
|
|
2318
|
+
end_value=end_value,
|
|
2319
|
+
range_end="closed",
|
|
2320
|
+
range_start="closed",
|
|
2321
|
+
)
|
|
2322
|
+
|
|
2323
|
+
# elasticsearch://localhost:9200?secure=true&verify_certs=false
|
|
2324
|
+
parsed = urlparse(uri)
|
|
2325
|
+
|
|
2326
|
+
index = table
|
|
2327
|
+
if not index:
|
|
2328
|
+
raise ValueError("Table name must be provided which is the index name in elasticsearch")
|
|
2329
|
+
|
|
2330
|
+
query_params = parsed.query
|
|
2331
|
+
params = parse_qs(query_params)
|
|
2332
|
+
|
|
2333
|
+
secure = True
|
|
2334
|
+
if "secure" in params:
|
|
2335
|
+
secure = params["secure"][0].capitalize() == "True"
|
|
2336
|
+
|
|
2337
|
+
verify_certs = True
|
|
2338
|
+
if "verify_certs" in params:
|
|
2339
|
+
verify_certs = params["verify_certs"][0].capitalize() == "True"
|
|
2340
|
+
|
|
2341
|
+
scheme = "https" if secure else "http"
|
|
2342
|
+
netloc = parsed.netloc
|
|
2343
|
+
connection_url = f"{scheme}://{netloc}"
|
|
2344
|
+
|
|
2345
|
+
return elasticsearch_source(
|
|
2346
|
+
connection_url=connection_url,
|
|
2347
|
+
index=index,
|
|
2348
|
+
verify_certs=verify_certs,
|
|
2349
|
+
incremental=incremental,
|
|
2350
|
+
).with_resources(table)
|
|
@@ -51,6 +51,7 @@ cachetools==5.5.2
|
|
|
51
51
|
certifi==2025.1.31
|
|
52
52
|
# via
|
|
53
53
|
# clickhouse-connect
|
|
54
|
+
# elastic-transport
|
|
54
55
|
# requests
|
|
55
56
|
# snowflake-connector-python
|
|
56
57
|
cffi==1.17.1
|
|
@@ -104,6 +105,10 @@ duckdb==1.2.1
|
|
|
104
105
|
# duckdb-engine
|
|
105
106
|
duckdb-engine==0.17.0
|
|
106
107
|
# via -r requirements.in
|
|
108
|
+
elastic-transport==8.17.1
|
|
109
|
+
# via elasticsearch
|
|
110
|
+
elasticsearch==8.10.1
|
|
111
|
+
# via -r requirements.in
|
|
107
112
|
et-xmlfile==2.0.0
|
|
108
113
|
# via openpyxl
|
|
109
114
|
facebook-business==20.0.0
|
|
@@ -553,6 +558,7 @@ urllib3==2.3.0
|
|
|
553
558
|
# botocore
|
|
554
559
|
# clickhouse-connect
|
|
555
560
|
# databricks-sql-connector
|
|
561
|
+
# elastic-transport
|
|
556
562
|
# pyairtable
|
|
557
563
|
# requests
|
|
558
564
|
# types-requests
|
|
@@ -51,6 +51,7 @@ cachetools==5.5.2
|
|
|
51
51
|
certifi==2025.1.31
|
|
52
52
|
# via
|
|
53
53
|
# clickhouse-connect
|
|
54
|
+
# elastic-transport
|
|
54
55
|
# requests
|
|
55
56
|
# snowflake-connector-python
|
|
56
57
|
cffi==1.17.1
|
|
@@ -104,6 +105,10 @@ duckdb==1.2.1
|
|
|
104
105
|
# duckdb-engine
|
|
105
106
|
duckdb-engine==0.17.0
|
|
106
107
|
# via -r requirements.in
|
|
108
|
+
elastic-transport==8.17.1
|
|
109
|
+
# via elasticsearch
|
|
110
|
+
elasticsearch==8.10.1
|
|
111
|
+
# via -r requirements.in
|
|
107
112
|
et-xmlfile==2.0.0
|
|
108
113
|
# via openpyxl
|
|
109
114
|
facebook-business==20.0.0
|
|
@@ -549,6 +554,7 @@ urllib3==2.3.0
|
|
|
549
554
|
# botocore
|
|
550
555
|
# clickhouse-connect
|
|
551
556
|
# databricks-sql-connector
|
|
557
|
+
# elastic-transport
|
|
552
558
|
# pyairtable
|
|
553
559
|
# requests
|
|
554
560
|
# 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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|