ingestr 0.13.91__tar.gz → 0.13.93__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.91 → ingestr-0.13.93}/.github/workflows/tests.yml +6 -1
- {ingestr-0.13.91 → ingestr-0.13.93}/Dockerfile +26 -12
- {ingestr-0.13.91 → ingestr-0.13.93}/PKG-INFO +2 -2
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/salesforce.md +3 -3
- ingestr-0.13.93/ingestr/src/buildinfo.py +1 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/mongodb/helpers.py +124 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/smartsheets/__init__.py +32 -4
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/sources.py +12 -7
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/tests/unit/test_smartsheets.py +1 -4
- {ingestr-0.13.91 → ingestr-0.13.93}/requirements.in +1 -1
- {ingestr-0.13.91 → ingestr-0.13.93}/requirements.txt +1 -1
- {ingestr-0.13.91 → ingestr-0.13.93}/requirements_arm64.txt +1 -1
- ingestr-0.13.91/ingestr/src/buildinfo.py +0 -1
- {ingestr-0.13.91 → ingestr-0.13.93}/.dlt/config.toml +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/.dockerignore +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/.githooks/pre-commit-hook.sh +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/.github/workflows/deploy-docs.yml +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/.github/workflows/release.yml +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/.github/workflows/secrets-scan.yml +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/.gitignore +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/.gitleaksignore +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/.python-version +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/.vale.ini +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/LICENSE.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/Makefile +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/README.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/.vitepress/config.mjs +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/.vitepress/theme/custom.css +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/.vitepress/theme/index.js +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/commands/example-uris.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/commands/ingest.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/getting-started/core-concepts.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/getting-started/data-masking.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/getting-started/incremental-loading.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/getting-started/quickstart.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/getting-started/telemetry.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/index.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/media/applovin_max.png +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/media/athena.png +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/media/clickhouse_img.png +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/media/clickup_ingestion.png +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/media/cratedb-destination.png +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/media/cratedb-source.png +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/media/freshdesk_ingestion.png +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/media/gcp_spanner_ingestion.png +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/media/github.png +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/media/google_analytics_realtime_report.png +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/media/googleanalytics.png +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/media/ingestion_elasticsearch_img.png +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/media/kinesis.bigquery.png +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/media/linear.png +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/media/linkedin_ads.png +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/media/mixpanel_ingestion.png +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/media/personio.png +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/media/personio_duckdb.png +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/media/phantombuster.png +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/media/pipedrive.png +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/media/quickbook_ingestion.png +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/media/sftp.png +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/media/stripe_postgres.png +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/media/tiktok.png +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/media/wise_ingestion.png +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/media/zoom_ingestion.png +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/adjust.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/airtable.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/applovin.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/applovin_max.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/appsflyer.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/appstore.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/asana.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/athena.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/attio.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/bigquery.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/chess.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/clickhouse.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/clickup.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/cratedb.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/csv.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/custom_queries.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/databricks.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/db2.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/duckdb.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/dynamodb.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/elasticsearch.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/facebook-ads.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/fluxx.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/frankfurter.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/freshdesk.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/gcs.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/github.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/google-ads.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/google_analytics.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/gorgias.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/gsheets.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/hubspot.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/influxdb.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/isoc-pulse.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/kafka.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/kinesis.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/klaviyo.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/linear.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/linkedin_ads.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/mixpanel.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/mongodb.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/motherduck.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/mssql.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/mysql.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/notion.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/oracle.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/personio.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/phantombuster.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/pinterest.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/pipedrive.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/postgres.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/quickbooks.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/redshift.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/revenuecat.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/s3.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/sap-hana.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/sftp.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/shopify.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/slack.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/smartsheets.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/snowflake.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/solidgate.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/spanner.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/sqlite.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/stripe.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/tiktok-ads.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/trustpilot.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/wise.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/zendesk.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/supported-sources/zoom.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/tutorials/load-kinesis-bigquery.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/tutorials/load-personio-duckdb.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/docs/tutorials/load-stripe-postgres.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/conftest.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/main.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/.gitignore +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/adjust/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/adjust/adjust_helpers.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/airtable/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/applovin/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/applovin_max/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/appsflyer/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/appsflyer/client.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/appstore/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/appstore/client.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/appstore/errors.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/appstore/models.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/appstore/resources.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/arrow/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/asana_source/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/asana_source/helpers.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/asana_source/settings.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/attio/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/attio/helpers.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/blob.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/chess/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/chess/helpers.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/chess/settings.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/clickup/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/clickup/helpers.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/collector/spinner.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/destinations.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/dynamodb/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/elasticsearch/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/errors.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/facebook_ads/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/facebook_ads/exceptions.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/facebook_ads/helpers.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/facebook_ads/settings.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/facebook_ads/utils.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/factory.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/filesystem/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/filesystem/helpers.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/filesystem/readers.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/filters.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/fluxx/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/fluxx/helpers.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/frankfurter/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/frankfurter/helpers.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/freshdesk/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/freshdesk/freshdesk_client.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/freshdesk/settings.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/github/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/github/helpers.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/github/queries.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/github/settings.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/google_ads/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/google_ads/field.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/google_ads/metrics.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/google_ads/predicates.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/google_ads/reports.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/google_analytics/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/google_analytics/helpers.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/google_sheets/README.md +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/google_sheets/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/google_sheets/helpers/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/google_sheets/helpers/api_calls.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/google_sheets/helpers/data_processing.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/gorgias/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/gorgias/helpers.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/http_client.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/hubspot/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/hubspot/helpers.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/hubspot/settings.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/influxdb/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/influxdb/client.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/isoc_pulse/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/kafka/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/kafka/helpers.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/kinesis/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/kinesis/helpers.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/klaviyo/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/klaviyo/client.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/klaviyo/helpers.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/linear/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/linear/helpers.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/linkedin_ads/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/linkedin_ads/dimension_time_enum.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/linkedin_ads/helpers.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/loader.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/masking.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/mixpanel/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/mixpanel/client.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/mongodb/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/notion/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/notion/helpers/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/notion/helpers/client.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/notion/helpers/database.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/notion/settings.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/partition.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/personio/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/personio/helpers.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/phantombuster/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/phantombuster/client.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/pinterest/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/pipedrive/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/pipedrive/helpers/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/pipedrive/helpers/custom_fields_munger.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/pipedrive/helpers/pages.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/pipedrive/settings.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/pipedrive/typing.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/quickbooks/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/resource.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/revenuecat/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/revenuecat/helpers.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/salesforce/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/salesforce/helpers.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/shopify/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/shopify/exceptions.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/shopify/helpers.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/shopify/settings.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/slack/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/slack/helpers.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/slack/settings.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/solidgate/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/solidgate/helpers.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/sql_database/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/sql_database/callbacks.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/stripe_analytics/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/stripe_analytics/helpers.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/stripe_analytics/settings.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/table_definition.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/telemetry/event.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/testdata/fakebqcredentials.json +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/tiktok_ads/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/tiktok_ads/tiktok_helpers.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/time.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/trustpilot/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/trustpilot/client.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/version.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/wise/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/wise/client.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/zendesk/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/zendesk/helpers/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/zendesk/helpers/api_helpers.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/zendesk/helpers/credentials.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/zendesk/helpers/talk_api.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/zendesk/settings.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/zoom/__init__.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/src/zoom/helpers.py +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/testdata/.gitignore +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/testdata/create_replace.csv +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/testdata/delete_insert_expected.csv +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/testdata/delete_insert_part1.csv +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/testdata/delete_insert_part2.csv +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/testdata/merge_expected.csv +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/testdata/merge_part1.csv +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/ingestr/testdata/merge_part2.csv +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/package-lock.json +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/package.json +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/pyproject.toml +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/requirements-dev.txt +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/resources/demo.gif +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/resources/demo.tape +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/resources/ingestr.svg +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/styles/Google/AMPM.yml +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/styles/Google/Acronyms.yml +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/styles/Google/Colons.yml +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/styles/Google/Contractions.yml +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/styles/Google/DateFormat.yml +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/styles/Google/Ellipses.yml +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/styles/Google/EmDash.yml +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/styles/Google/Exclamation.yml +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/styles/Google/FirstPerson.yml +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/styles/Google/Gender.yml +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/styles/Google/GenderBias.yml +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/styles/Google/HeadingPunctuation.yml +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/styles/Google/Headings.yml +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/styles/Google/Latin.yml +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/styles/Google/LyHyphens.yml +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/styles/Google/OptionalPlurals.yml +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/styles/Google/Ordinal.yml +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/styles/Google/OxfordComma.yml +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/styles/Google/Parens.yml +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/styles/Google/Passive.yml +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/styles/Google/Periods.yml +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/styles/Google/Quotes.yml +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/styles/Google/Ranges.yml +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/styles/Google/Semicolons.yml +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/styles/Google/Slang.yml +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/styles/Google/Spacing.yml +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/styles/Google/Spelling.yml +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/styles/Google/Units.yml +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/styles/Google/We.yml +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/styles/Google/Will.yml +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/styles/Google/WordList.yml +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/styles/Google/meta.json +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/styles/Google/vocab.txt +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/styles/bruin/Ingestr.yml +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/styles/config/vocabularies/bruin/accept.txt +0 -0
- {ingestr-0.13.91 → ingestr-0.13.93}/test.env.template +0 -0
|
@@ -19,7 +19,12 @@ jobs:
|
|
|
19
19
|
# I tried running stuff on macOS but it was too slow and unreliable.
|
|
20
20
|
# I also tried windows runners but couldn't get Docker to work there, so I gave up.
|
|
21
21
|
os: [ubuntu-latest]
|
|
22
|
-
python-version: [
|
|
22
|
+
python-version: [
|
|
23
|
+
'3.10',
|
|
24
|
+
'3.11',
|
|
25
|
+
'3.12',
|
|
26
|
+
'3.13',
|
|
27
|
+
]
|
|
23
28
|
runs-on: ${{ matrix.os }}
|
|
24
29
|
steps:
|
|
25
30
|
- uses: actions/checkout@v4
|
|
@@ -1,14 +1,27 @@
|
|
|
1
1
|
FROM python:3.11-slim-trixie
|
|
2
2
|
|
|
3
|
+
# Guidelines that have been followed.
|
|
4
|
+
# - https://hynek.me/articles/docker-uv/
|
|
5
|
+
|
|
6
|
+
# Install the `uv` package manager.
|
|
7
|
+
# Security-conscious organizations should package/review uv themselves.
|
|
8
|
+
COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv
|
|
9
|
+
|
|
10
|
+
# - Tell uv to byte-compile packages for faster application startups.
|
|
11
|
+
# - Silence uv complaining about not being able to use hard links.
|
|
12
|
+
# - Prevent uv from accidentally downloading isolated Python builds.
|
|
13
|
+
# - Install packages into the system Python environment.
|
|
14
|
+
ENV \
|
|
15
|
+
UV_COMPILE_BYTECODE=1 \
|
|
16
|
+
UV_LINK_MODE=copy \
|
|
17
|
+
UV_PYTHON_DOWNLOADS=never \
|
|
18
|
+
UV_SYSTEM_PYTHON=1
|
|
19
|
+
|
|
3
20
|
WORKDIR /app
|
|
4
21
|
|
|
5
|
-
COPY ./requirements.txt /app/requirements.txt
|
|
6
|
-
COPY ./requirements_arm64.txt /app/requirements_arm64.txt
|
|
7
|
-
RUN if [ "$(uname -m)" = "aarch64" ]; then \
|
|
8
|
-
cp /app/requirements_arm64.txt /app/requirements.txt; \
|
|
9
|
-
fi
|
|
10
22
|
|
|
11
|
-
#
|
|
23
|
+
# Install all prerequisites.
|
|
24
|
+
|
|
12
25
|
RUN \
|
|
13
26
|
export ACCEPT_EULA='Y' && \
|
|
14
27
|
# Install build dependencies
|
|
@@ -28,17 +41,18 @@ RUN \
|
|
|
28
41
|
sed 's/Driver=psql/Driver=\/usr\/lib\/x86_64-linux-gnu\/odbc\/psql/;s/CommLog=1/CommLog=0/' /etc/odbcinst.ini > /tmp/temp.ini && \
|
|
29
42
|
mv -f /tmp/temp.ini /etc/odbcinst.ini
|
|
30
43
|
|
|
31
|
-
ENV VIRTUAL_ENV=/usr/local
|
|
32
|
-
ADD --chmod=755 https://astral.sh/uv/install.sh /install.sh
|
|
33
|
-
RUN /install.sh && rm /install.sh
|
|
34
44
|
|
|
35
|
-
|
|
45
|
+
# Install application.
|
|
36
46
|
|
|
47
|
+
# Copy sources and activate platform-specific requirements file.
|
|
37
48
|
COPY . /app
|
|
38
49
|
RUN if [ "$(uname -m)" = "aarch64" ]; then \
|
|
39
50
|
cp /app/requirements_arm64.txt /app/requirements.txt; \
|
|
40
51
|
fi
|
|
41
52
|
|
|
42
|
-
|
|
53
|
+
# Install all required packages and the application.
|
|
54
|
+
RUN uv pip install --requirement requirements.txt pyodbc .
|
|
55
|
+
|
|
43
56
|
|
|
44
|
-
|
|
57
|
+
# Ready.
|
|
58
|
+
ENTRYPOINT ["ingestr"]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ingestr
|
|
3
|
-
Version: 0.13.
|
|
3
|
+
Version: 0.13.93
|
|
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
|
|
@@ -47,7 +47,7 @@ Requires-Dist: databricks-sqlalchemy==1.0.2
|
|
|
47
47
|
Requires-Dist: dataclasses-json==0.6.7
|
|
48
48
|
Requires-Dist: decorator==5.2.1
|
|
49
49
|
Requires-Dist: deprecation==2.1.0
|
|
50
|
-
Requires-Dist: dlt-cratedb==0.0.
|
|
50
|
+
Requires-Dist: dlt-cratedb==0.0.2
|
|
51
51
|
Requires-Dist: dlt==1.11.0
|
|
52
52
|
Requires-Dist: dnspython==2.7.0
|
|
53
53
|
Requires-Dist: duckdb-engine==0.17.0
|
|
@@ -14,7 +14,7 @@ URI parameters:
|
|
|
14
14
|
- `username` is your Salesforce account username.
|
|
15
15
|
- `password` is your Salesforce account password.
|
|
16
16
|
- `token` is your Salesforce security token.
|
|
17
|
-
- `domain` is your Salesforce instance domain.
|
|
17
|
+
- `domain` is your Salesforce instance domain (for example, `login`, `test`, or `your-domain.my`). Do **not** include `.salesforce.com`.
|
|
18
18
|
|
|
19
19
|
You can obtain your security token by logging into your Salesforce account and navigating to the user settings under "Reset My Security Token."
|
|
20
20
|
|
|
@@ -28,14 +28,14 @@ Let's say:
|
|
|
28
28
|
* Your Salesforce username is `user`.
|
|
29
29
|
* Your password is `password123`.
|
|
30
30
|
* Your security token is `fake_token`.
|
|
31
|
-
* Your domain is `
|
|
31
|
+
* Your domain is `your-domain.my`.
|
|
32
32
|
* You want to ingest `account` data from your salesforce account
|
|
33
33
|
* You want to save this data in a duckdb database `sf.db` under the table `public.account`
|
|
34
34
|
|
|
35
35
|
You can run the following command to achieve this:
|
|
36
36
|
```sh
|
|
37
37
|
ingestr ingest \
|
|
38
|
-
--source-uri "salesforce://?username=user&password=password123&token=fake_token&domain=
|
|
38
|
+
--source-uri "salesforce://?username=user&password=password123&token=fake_token&domain=your-domain.my" \
|
|
39
39
|
--source-table "account" \
|
|
40
40
|
--dest-uri "duckdb:///sf.db" \
|
|
41
41
|
--dest-table "public.account"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
version = "v0.13.93"
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"""Mongo database source helpers"""
|
|
2
2
|
|
|
3
|
+
import re
|
|
3
4
|
from itertools import islice
|
|
4
5
|
from typing import (
|
|
5
6
|
TYPE_CHECKING,
|
|
@@ -866,4 +867,127 @@ class MongoDbCollectionResourceConfiguration(BaseConfiguration):
|
|
|
866
867
|
projection: Optional[Union[Mapping[str, Any], Iterable[str]]] = dlt.config.value
|
|
867
868
|
|
|
868
869
|
|
|
870
|
+
def convert_mongo_shell_to_extended_json(query_string: str) -> str:
|
|
871
|
+
"""
|
|
872
|
+
Convert MongoDB shell syntax to MongoDB Extended JSON v2 format.
|
|
873
|
+
|
|
874
|
+
This function handles common MongoDB shell constructs like ISODate, ObjectId,
|
|
875
|
+
NumberLong, NumberDecimal, etc. and converts them to their Extended JSON equivalents
|
|
876
|
+
that can be parsed by bson.json_util.
|
|
877
|
+
|
|
878
|
+
Args:
|
|
879
|
+
query_string: A string containing MongoDB shell syntax
|
|
880
|
+
|
|
881
|
+
Returns:
|
|
882
|
+
A string with MongoDB Extended JSON v2 format
|
|
883
|
+
|
|
884
|
+
Examples:
|
|
885
|
+
>>> convert_mongo_shell_to_extended_json('ISODate("2010-01-01T00:00:00.000Z")')
|
|
886
|
+
'{"$date": "2010-01-01T00:00:00.000Z"}'
|
|
887
|
+
|
|
888
|
+
>>> convert_mongo_shell_to_extended_json('ObjectId("507f1f77bcf86cd799439011")')
|
|
889
|
+
'{"$oid": "507f1f77bcf86cd799439011"}'
|
|
890
|
+
"""
|
|
891
|
+
converted = query_string
|
|
892
|
+
|
|
893
|
+
# Convert ISODate("...") to {"$date": "..."}
|
|
894
|
+
# Pattern matches ISODate("2010-01-01T00:00:00.000+0000") or similar
|
|
895
|
+
converted = re.sub(
|
|
896
|
+
r'ISODate\("([^"]+)"\)',
|
|
897
|
+
r'{"$date": "\1"}',
|
|
898
|
+
converted
|
|
899
|
+
)
|
|
900
|
+
|
|
901
|
+
# Convert ObjectId("...") to {"$oid": "..."}
|
|
902
|
+
converted = re.sub(
|
|
903
|
+
r'ObjectId\("([^"]+)"\)',
|
|
904
|
+
r'{"$oid": "\1"}',
|
|
905
|
+
converted
|
|
906
|
+
)
|
|
907
|
+
|
|
908
|
+
# Convert NumberLong(...) to {"$numberLong": "..."}
|
|
909
|
+
# Note: NumberLong can have quotes or not: NumberLong(123) or NumberLong("123")
|
|
910
|
+
converted = re.sub(
|
|
911
|
+
r'NumberLong\("([^"]+)"\)',
|
|
912
|
+
r'{"$numberLong": "\1"}',
|
|
913
|
+
converted
|
|
914
|
+
)
|
|
915
|
+
converted = re.sub(
|
|
916
|
+
r'NumberLong\(([^)]+)\)',
|
|
917
|
+
r'{"$numberLong": "\1"}',
|
|
918
|
+
converted
|
|
919
|
+
)
|
|
920
|
+
|
|
921
|
+
# Convert NumberInt(...) to {"$numberInt": "..."}
|
|
922
|
+
converted = re.sub(
|
|
923
|
+
r'NumberInt\("([^"]+)"\)',
|
|
924
|
+
r'{"$numberInt": "\1"}',
|
|
925
|
+
converted
|
|
926
|
+
)
|
|
927
|
+
converted = re.sub(
|
|
928
|
+
r'NumberInt\(([^)]+)\)',
|
|
929
|
+
r'{"$numberInt": "\1"}',
|
|
930
|
+
converted
|
|
931
|
+
)
|
|
932
|
+
|
|
933
|
+
# Convert NumberDecimal("...") to {"$numberDecimal": "..."}
|
|
934
|
+
converted = re.sub(
|
|
935
|
+
r'NumberDecimal\("([^"]+)"\)',
|
|
936
|
+
r'{"$numberDecimal": "\1"}',
|
|
937
|
+
converted
|
|
938
|
+
)
|
|
939
|
+
|
|
940
|
+
# Convert Timestamp(..., ...) to {"$timestamp": {"t": ..., "i": ...}}
|
|
941
|
+
# Timestamp(1234567890, 1) -> {"$timestamp": {"t": 1234567890, "i": 1}}
|
|
942
|
+
converted = re.sub(
|
|
943
|
+
r'Timestamp\((\d+),\s*(\d+)\)',
|
|
944
|
+
r'{"$timestamp": {"t": \1, "i": \2}}',
|
|
945
|
+
converted
|
|
946
|
+
)
|
|
947
|
+
|
|
948
|
+
# Convert BinData(..., "...") to {"$binary": {"base64": "...", "subType": "..."}}
|
|
949
|
+
converted = re.sub(
|
|
950
|
+
r'BinData\((\d+),\s*"([^"]+)"\)',
|
|
951
|
+
r'{"$binary": {"base64": "\2", "subType": "\1"}}',
|
|
952
|
+
converted
|
|
953
|
+
)
|
|
954
|
+
|
|
955
|
+
# Convert MinKey() to {"$minKey": 1}
|
|
956
|
+
converted = re.sub(
|
|
957
|
+
r'MinKey\(\)',
|
|
958
|
+
r'{"$minKey": 1}',
|
|
959
|
+
converted
|
|
960
|
+
)
|
|
961
|
+
|
|
962
|
+
# Convert MaxKey() to {"$maxKey": 1}
|
|
963
|
+
converted = re.sub(
|
|
964
|
+
r'MaxKey\(\)',
|
|
965
|
+
r'{"$maxKey": 1}',
|
|
966
|
+
converted
|
|
967
|
+
)
|
|
968
|
+
|
|
969
|
+
# Convert UUID("...") to {"$uuid": "..."}
|
|
970
|
+
converted = re.sub(
|
|
971
|
+
r'UUID\("([^"]+)"\)',
|
|
972
|
+
r'{"$uuid": "\1"}',
|
|
973
|
+
converted
|
|
974
|
+
)
|
|
975
|
+
|
|
976
|
+
# Convert DBRef("collection", "id") to {"$ref": "collection", "$id": "id"}
|
|
977
|
+
converted = re.sub(
|
|
978
|
+
r'DBRef\("([^"]+)",\s*"([^"]+)"\)',
|
|
979
|
+
r'{"$ref": "\1", "$id": "\2"}',
|
|
980
|
+
converted
|
|
981
|
+
)
|
|
982
|
+
|
|
983
|
+
# Convert Code("...") to {"$code": "..."}
|
|
984
|
+
converted = re.sub(
|
|
985
|
+
r'Code\("([^"]+)"\)',
|
|
986
|
+
r'{"$code": "\1"}',
|
|
987
|
+
converted
|
|
988
|
+
)
|
|
989
|
+
|
|
990
|
+
return converted
|
|
991
|
+
|
|
992
|
+
|
|
869
993
|
__source_name__ = "mongodb"
|
|
@@ -3,6 +3,22 @@ from typing import Iterable
|
|
|
3
3
|
import dlt
|
|
4
4
|
import smartsheet # type: ignore
|
|
5
5
|
from dlt.extract import DltResource
|
|
6
|
+
from smartsheet.models.enums import ColumnType # type: ignore
|
|
7
|
+
from smartsheet.models.sheet import Sheet # type: ignore
|
|
8
|
+
|
|
9
|
+
TYPE_MAPPING = {
|
|
10
|
+
ColumnType.TEXT_NUMBER: "text",
|
|
11
|
+
ColumnType.DATE: "date",
|
|
12
|
+
ColumnType.DATETIME: "timestamp",
|
|
13
|
+
ColumnType.CONTACT_LIST: "text",
|
|
14
|
+
ColumnType.CHECKBOX: "bool",
|
|
15
|
+
ColumnType.PICKLIST: "text",
|
|
16
|
+
ColumnType.DURATION: "text",
|
|
17
|
+
ColumnType.PREDECESSOR: "text",
|
|
18
|
+
ColumnType.ABSTRACT_DATETIME: "timestamp",
|
|
19
|
+
ColumnType.MULTI_CONTACT_LIST: "text",
|
|
20
|
+
ColumnType.MULTI_PICKLIST: "text",
|
|
21
|
+
}
|
|
6
22
|
|
|
7
23
|
|
|
8
24
|
@dlt.source
|
|
@@ -34,21 +50,33 @@ def smartsheet_source(
|
|
|
34
50
|
)
|
|
35
51
|
sheet_name = sheet_details.name
|
|
36
52
|
resource_name = f"sheet_{sheet_name.replace(' ', '_').lower()}"
|
|
53
|
+
sheet = smartsheet_client.Sheets.get_sheet(sheet_id_int)
|
|
37
54
|
|
|
38
55
|
yield dlt.resource(
|
|
39
|
-
_get_sheet_data(
|
|
56
|
+
_get_sheet_data(sheet),
|
|
40
57
|
name=resource_name,
|
|
58
|
+
columns=_generate_type_hints(sheet),
|
|
41
59
|
write_disposition="replace",
|
|
42
60
|
)
|
|
43
61
|
|
|
44
62
|
|
|
45
|
-
def _get_sheet_data(
|
|
63
|
+
def _get_sheet_data(sheet: Sheet):
|
|
46
64
|
"""Helper function to get all rows from a sheet."""
|
|
47
|
-
|
|
48
|
-
# Transform rows to a list of dictionaries
|
|
65
|
+
|
|
49
66
|
column_titles = [col.title for col in sheet.columns]
|
|
50
67
|
for row in sheet.rows:
|
|
51
68
|
row_data = {"_row_id": row.id}
|
|
52
69
|
for i, cell in enumerate(row.cells):
|
|
53
70
|
row_data[column_titles[i]] = cell.value
|
|
54
71
|
yield row_data
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def _generate_type_hints(sheet: Sheet):
|
|
75
|
+
return {
|
|
76
|
+
col.title: {
|
|
77
|
+
"data_type": TYPE_MAPPING.get(col.type.value),
|
|
78
|
+
"nullable": True,
|
|
79
|
+
}
|
|
80
|
+
for col in sheet.columns
|
|
81
|
+
if col.type.value in TYPE_MAPPING
|
|
82
|
+
}
|
|
@@ -427,14 +427,19 @@ class MongoDbSource:
|
|
|
427
427
|
if ":" in table:
|
|
428
428
|
collection_name, query_json = table.split(":", 1)
|
|
429
429
|
|
|
430
|
-
# Parse
|
|
430
|
+
# Parse the query using MongoDB's extended JSON parser
|
|
431
|
+
# First, convert MongoDB shell syntax to Extended JSON format
|
|
432
|
+
from bson import json_util
|
|
433
|
+
from ingestr.src.mongodb.helpers import convert_mongo_shell_to_extended_json
|
|
434
|
+
|
|
435
|
+
# Convert MongoDB shell constructs to Extended JSON v2 format
|
|
436
|
+
converted_query = convert_mongo_shell_to_extended_json(query_json)
|
|
437
|
+
|
|
431
438
|
try:
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
query
|
|
435
|
-
|
|
436
|
-
raise ValueError(f"Invalid JSON query format: {e}")
|
|
437
|
-
|
|
439
|
+
query = json_util.loads(converted_query)
|
|
440
|
+
except Exception as e:
|
|
441
|
+
raise ValueError(f"Invalid MongoDB query format: {e}")
|
|
442
|
+
|
|
438
443
|
# Validate that it's a list for aggregation pipeline
|
|
439
444
|
if not isinstance(query, list):
|
|
440
445
|
raise ValueError(
|
|
@@ -84,7 +84,6 @@ class TestSmartsheetSource(unittest.TestCase):
|
|
|
84
84
|
list(source)
|
|
85
85
|
|
|
86
86
|
def test_get_sheet_data(self):
|
|
87
|
-
mock_smartsheet_client_instance = MagicMock()
|
|
88
87
|
mock_sheet = Sheet(
|
|
89
88
|
{
|
|
90
89
|
"id": 456,
|
|
@@ -121,15 +120,13 @@ class TestSmartsheetSource(unittest.TestCase):
|
|
|
121
120
|
],
|
|
122
121
|
}
|
|
123
122
|
)
|
|
124
|
-
mock_smartsheet_client_instance.Sheets.get_sheet.return_value = mock_sheet
|
|
125
123
|
|
|
126
|
-
data_generator = _get_sheet_data(
|
|
124
|
+
data_generator = _get_sheet_data(mock_sheet)
|
|
127
125
|
data = list(data_generator)
|
|
128
126
|
|
|
129
127
|
self.assertEqual(len(data), 2)
|
|
130
128
|
self.assertEqual(data[0], {"_row_id": 201, "ID": 1, "Value": "Alpha"})
|
|
131
129
|
self.assertEqual(data[1], {"_row_id": 202, "ID": 2, "Value": "Beta"})
|
|
132
|
-
mock_smartsheet_client_instance.Sheets.get_sheet.assert_called_once_with(456)
|
|
133
130
|
|
|
134
131
|
|
|
135
132
|
if __name__ == "__main__":
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
version = "v0.13.91"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|