dataenginex 0.4.5__tar.gz → 0.4.6__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.
- {dataenginex-0.4.5 → dataenginex-0.4.6}/PKG-INFO +1 -1
- {dataenginex-0.4.5 → dataenginex-0.4.6}/pyproject.toml +1 -1
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/tools/builtin.py +22 -1
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/vectorstore.py +15 -3
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/connectors/dbt.py +9 -1
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_vectorstore_extended.py +9 -2
- {dataenginex-0.4.5 → dataenginex-0.4.6}/uv.lock +1 -1
- {dataenginex-0.4.5 → dataenginex-0.4.6}/.claude/commands/new-feature.md +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/.claude/commands/validate.md +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/.claude/settings.json +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/.env.template +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/.github/dependabot.yml +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/.github/labels.yml +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/.github/release-pr-template.md +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/.github/workflows/auto-pr.yml +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/.github/workflows/ci.yml +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/.github/workflows/docs-sync.yml +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/.github/workflows/release.yml +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/.github/workflows/security.yml +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/.gitignore +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/.gitleaks.toml +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/.pre-commit-config.yaml +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/.python-version +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/CHANGELOG.md +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/CLAUDE.md +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/CODEOWNERS +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/CODE_OF_CONDUCT.md +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/CONTRIBUTING.md +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/LICENSE +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/README.md +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/SECURITY.md +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/docker-compose.test.yml +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/adr/0000-template.md +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/adr/0001-medallion-architecture.md +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/api-reference/ai.md +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/api-reference/api.md +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/api-reference/config.md +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/api-reference/core.md +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/api-reference/data.md +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/api-reference/engine.md +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/api-reference/index.md +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/api-reference/lakehouse.md +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/api-reference/middleware.md +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/api-reference/ml.md +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/api-reference/orchestration.md +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/api-reference/plugins.md +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/api-reference/secops.md +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/api-reference/warehouse.md +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/architecture.md +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/ci-cd.md +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/contributing.md +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/development.md +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/index.md +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/observability.md +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/quickstart.md +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/release-notes.md +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/sdlc.md +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/docs/security-scanning.md +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/01_hello_pipeline.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/02_api_quickstart.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/03_quality_gate.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/04_ml_training.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/05_rag_demo.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/06_llm_quickstart.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/07_api_ingestion.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/08_spark_ml.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/09_feature_engineering.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/10_model_analysis.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/GUIDE.md +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/dashboard/dashboard_config.yaml +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/dashboard/run_dashboard.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/data/events.csv +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/data/users.csv +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/dex.yaml +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/ecommerce/data/customers.csv +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/ecommerce/data/orders.csv +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/ecommerce/data/products.csv +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/ecommerce/dex.yaml +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/ecommerce/run_all.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/examples/movies.csv +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/poe_tasks.toml +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/scripts/localstack/init.sh +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/README.md +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/RELEASE_NOTES.md +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/__init__.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/_json.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/__init__.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/agents/__init__.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/agents/builtin.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/llm.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/memory/__init__.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/memory/base.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/memory/episodic.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/memory/long_term.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/observability/__init__.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/observability/audit.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/observability/cost.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/observability/metrics.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/retrieval/__init__.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/retrieval/builtin.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/retrieval/graph.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/routing/__init__.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/routing/anthropic.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/routing/guarded.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/routing/ollama.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/routing/openai.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/routing/router.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/runtime/__init__.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/runtime/checkpoint.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/runtime/executor.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/runtime/sandbox.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/tools/__init__.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/workflows/__init__.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/workflows/conditions.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/workflows/dag.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ai/workflows/human_loop.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/api/__init__.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/api/errors.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/api/pagination.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/api/schemas.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/cli/__init__.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/cli/main.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/cli/run.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/cli/secops.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/cli/train.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/config/__init__.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/config/defaults.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/config/loader.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/config/schema.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/config/settings.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/core/__init__.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/core/exceptions.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/core/interfaces.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/core/medallion_architecture.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/core/quality.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/core/registry.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/core/schemas.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/core/validators.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/__init__.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/connectors/__init__.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/connectors/_utils.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/connectors/csv.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/connectors/delta.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/connectors/duckdb.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/connectors/http.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/connectors/parquet.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/connectors/rest.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/connectors/spark.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/connectors/sse.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/pipeline/__init__.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/pipeline/dag.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/pipeline/run_history.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/pipeline/runner.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/profiler.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/quality/__init__.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/quality/gates.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/quality/spark.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/registry.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/transforms/__init__.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/data/transforms/sql.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/engine.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/lakehouse/__init__.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/lakehouse/catalog.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/lakehouse/partitioning.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/lakehouse/storage.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/middleware/__init__.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/middleware/domain_metrics.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/middleware/logging_config.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/middleware/metrics.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ml/__init__.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ml/drift.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ml/features/__init__.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ml/features/builtin.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ml/metrics.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ml/mlflow_registry.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ml/registry.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ml/serving.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ml/serving_engine/__init__.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ml/serving_engine/builtin.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ml/tracking/__init__.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ml/tracking/builtin.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/ml/training.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/orchestration/__init__.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/orchestration/builtin.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/orchestration/scheduler.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/plugins/__init__.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/plugins/registry.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/py.typed +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/secops/__init__.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/secops/audit.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/secops/gate.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/secops/guard.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/secops/masking.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/secops/pii.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/store.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/warehouse/__init__.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/warehouse/lineage.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/warehouse/transforms.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/src/dataenginex/worker.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/__init__.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/conformance/__init__.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/conformance/test_connector.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/conformance/test_feature_store.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/conformance/test_tracker.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/conformance/test_transform.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/conftest.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/fixtures/__init__.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/fixtures/sample_data.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/fixtures/sample_jobs.csv +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/fixtures/sample_jobs.json +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/integration/__init__.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/integration/test_ai_integration.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/integration/test_cli_run.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/integration/test_config_cli.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/integration/test_lineage_integration.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/integration/test_ml_integration.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/integration/test_pipeline_e2e.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/integration/test_secops_integration.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/integration/test_storage_real.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/load/__init__.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/__init__.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_agent_runtime.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_ai_modules.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_api_pagination.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_api_schemas.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_api_validators.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_builtin_agent.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_builtin_feature_store.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_builtin_serving.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_builtin_tracker.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_cli_train.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_config_loader.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_config_schema.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_config_schema_extended.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_core_exceptions.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_core_interfaces.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_core_quality.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_core_registry.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_core_schemas_extended.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_csv_connector.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_data.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_dbt_connector.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_dex_engine.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_dex_store.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_domain_metrics.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_domain_metrics_wiring.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_drift_scheduler.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_duckdb_connector.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_guarded_provider.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_lakehouse.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_llm.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_llm_extended.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_llm_litellm_vllm.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_logging.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_medallion.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_medallion_extended.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_middleware_metrics.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_ml.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_parquet_connector.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_pipeline_dag.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_pipeline_runner.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_plugins.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_privacy_guard_wiring.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_quality_gates.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_quality_spark.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_retriever.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_retriever_graph.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_run_history.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_scheduler.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_secops.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_secops_engine_and_cli.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_secops_guard.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_spark_connector.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_spark_fixtures.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_sql_transforms.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_storage_abstraction.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_vectorstore.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_warehouse.py +0 -0
- {dataenginex-0.4.5 → dataenginex-0.4.6}/tests/unit/test_warehouse_transforms.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "dataenginex"
|
|
3
|
-
version = "0.4.
|
|
3
|
+
version = "0.4.6"
|
|
4
4
|
description = "DataEngineX — open-source, self-hosted, local-first Data + ML + AI workbench library"
|
|
5
5
|
authors = [{ name = "Jay", email = "jayapal.myaka99@gmail.com" }]
|
|
6
6
|
readme = "src/dataenginex/README.md"
|
|
@@ -29,13 +29,30 @@ logger = structlog.get_logger()
|
|
|
29
29
|
|
|
30
30
|
# ── SQL / lakehouse ────────────────────────────────────────────────────────────
|
|
31
31
|
|
|
32
|
+
# This tool is reachable from HTTP-exposed agent/native-call routes, so the SQL
|
|
33
|
+
# it runs must be treated as untrusted input. DuckDB's enable_external_access
|
|
34
|
+
# blocks filesystem/network access (read_csv/read_parquet/httpfs/ATTACH/etc.)
|
|
35
|
+
# for the connection it's set on; the statement-shape check below is a second,
|
|
36
|
+
# cheap layer against non-SELECT statements (COPY/INSTALL/PRAGMA/...).
|
|
37
|
+
_READ_ONLY_PREFIXES = ("SELECT", "WITH")
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def _require_read_only(sql: str) -> None:
|
|
41
|
+
stripped = sql.strip().lstrip("(").strip()
|
|
42
|
+
if ";" in stripped[:-1]: # allow a single optional trailing semicolon
|
|
43
|
+
raise ValueError("query tool only allows a single statement")
|
|
44
|
+
if not stripped.upper().startswith(_READ_ONLY_PREFIXES):
|
|
45
|
+
raise ValueError("query tool only allows read-only SELECT/WITH statements")
|
|
46
|
+
|
|
32
47
|
|
|
33
48
|
def _query_sql(sql: str, database: str = ":memory:") -> list[dict[str, Any]]:
|
|
34
|
-
"""Execute a SQL query via DuckDB and return results."""
|
|
49
|
+
"""Execute a read-only SQL query via DuckDB and return results."""
|
|
35
50
|
import duckdb
|
|
36
51
|
|
|
52
|
+
_require_read_only(sql)
|
|
37
53
|
conn = duckdb.connect(database)
|
|
38
54
|
try:
|
|
55
|
+
conn.execute("SET enable_external_access=false")
|
|
39
56
|
result = conn.execute(sql)
|
|
40
57
|
description = result.description or []
|
|
41
58
|
if not description:
|
|
@@ -52,6 +69,7 @@ def _make_lakehouse_query(lakehouse_dir: Path) -> Callable[[str], list[dict[str,
|
|
|
52
69
|
def _query_with_lakehouse(sql: str) -> list[dict[str, Any]]:
|
|
53
70
|
import duckdb
|
|
54
71
|
|
|
72
|
+
_require_read_only(sql)
|
|
55
73
|
conn = duckdb.connect(":memory:")
|
|
56
74
|
try:
|
|
57
75
|
for layer in ("bronze", "silver", "gold"):
|
|
@@ -65,6 +83,9 @@ def _make_lakehouse_query(lakehouse_dir: Path) -> Callable[[str], list[dict[str,
|
|
|
65
83
|
f"CREATE OR REPLACE VIEW {pf.stem}"
|
|
66
84
|
f" AS SELECT * FROM read_parquet('{safe}')"
|
|
67
85
|
)
|
|
86
|
+
# Lock the connection down to the views already registered above —
|
|
87
|
+
# untrusted `sql` below can no longer touch the filesystem/network.
|
|
88
|
+
conn.execute("SET enable_external_access=false")
|
|
68
89
|
result = conn.execute(sql)
|
|
69
90
|
description = result.description or []
|
|
70
91
|
if not description:
|
|
@@ -23,8 +23,8 @@ Example::
|
|
|
23
23
|
from __future__ import annotations
|
|
24
24
|
|
|
25
25
|
import abc
|
|
26
|
+
import hashlib
|
|
26
27
|
import math
|
|
27
|
-
import uuid
|
|
28
28
|
from dataclasses import dataclass, field
|
|
29
29
|
from typing import TYPE_CHECKING, Any
|
|
30
30
|
|
|
@@ -55,11 +55,20 @@ __all__ = [
|
|
|
55
55
|
class Document:
|
|
56
56
|
"""A text document with optional metadata and embedding."""
|
|
57
57
|
|
|
58
|
-
id: str =
|
|
58
|
+
id: str = ""
|
|
59
59
|
text: str = ""
|
|
60
60
|
metadata: dict[str, Any] = field(default_factory=dict)
|
|
61
61
|
embedding: list[float] = field(default_factory=list)
|
|
62
62
|
|
|
63
|
+
def __post_init__(self) -> None:
|
|
64
|
+
if not self.id:
|
|
65
|
+
# Content-hash id, not random: re-ingesting the same text upserts
|
|
66
|
+
# (overwrites) the existing entry instead of piling up a new
|
|
67
|
+
# random-id duplicate. InMemoryBackend has no eviction/cap, so a
|
|
68
|
+
# random id here means unbounded growth across repeated scheduled
|
|
69
|
+
# pipeline runs that re-ingest the same rows.
|
|
70
|
+
self.id = hashlib.sha256(self.text.encode("utf-8")).hexdigest()[:16]
|
|
71
|
+
|
|
63
72
|
|
|
64
73
|
@dataclass
|
|
65
74
|
class SearchResult:
|
|
@@ -447,7 +456,10 @@ class RAGPipeline:
|
|
|
447
456
|
Number of documents stored.
|
|
448
457
|
"""
|
|
449
458
|
meta = metadata or [{} for _ in texts]
|
|
450
|
-
|
|
459
|
+
# Content-hash ids by default (same scheme as Document.__post_init__)
|
|
460
|
+
# so re-ingesting identical text upserts instead of duplicating —
|
|
461
|
+
# see Document's docstring for why a random id here matters.
|
|
462
|
+
doc_ids = ids or [hashlib.sha256(t.encode("utf-8")).hexdigest()[:16] for t in texts]
|
|
451
463
|
|
|
452
464
|
docs: list[Document] = []
|
|
453
465
|
for doc_id, text, m in zip(doc_ids, texts, meta, strict=True):
|
|
@@ -73,6 +73,7 @@ class DbtConnector(BaseConnector):
|
|
|
73
73
|
target_database: str | None = None,
|
|
74
74
|
profiles_dir: str | None = None,
|
|
75
75
|
target: str = "dev",
|
|
76
|
+
timeout_s: float = 600,
|
|
76
77
|
**kwargs: Any,
|
|
77
78
|
) -> None:
|
|
78
79
|
if not _DBT_AVAILABLE:
|
|
@@ -84,6 +85,7 @@ class DbtConnector(BaseConnector):
|
|
|
84
85
|
)
|
|
85
86
|
self._profiles_dir = Path(profiles_dir) if profiles_dir else self._project_dir
|
|
86
87
|
self._target = target
|
|
88
|
+
self._timeout_s = timeout_s
|
|
87
89
|
|
|
88
90
|
def connect(self) -> None:
|
|
89
91
|
project_file = self._project_dir / "dbt_project.yml"
|
|
@@ -131,7 +133,13 @@ class DbtConnector(BaseConnector):
|
|
|
131
133
|
"--target",
|
|
132
134
|
self._target,
|
|
133
135
|
]
|
|
134
|
-
|
|
136
|
+
try:
|
|
137
|
+
proc = subprocess.run( # noqa: S603,S607
|
|
138
|
+
cmd, capture_output=True, text=True, timeout=self._timeout_s
|
|
139
|
+
)
|
|
140
|
+
except subprocess.TimeoutExpired as exc:
|
|
141
|
+
msg = f"dbt run timed out for model '{model}' after {self._timeout_s}s"
|
|
142
|
+
raise RuntimeError(msg) from exc
|
|
135
143
|
if proc.returncode != 0:
|
|
136
144
|
msg = f"dbt run failed for model '{model}':\n{proc.stdout}\n{proc.stderr}"
|
|
137
145
|
raise RuntimeError(msg)
|
|
@@ -20,10 +20,17 @@ class TestDocument:
|
|
|
20
20
|
d = Document(text="hello")
|
|
21
21
|
assert len(d.id) > 0
|
|
22
22
|
|
|
23
|
-
def
|
|
24
|
-
|
|
23
|
+
def test_ids_deterministic_by_content(self) -> None:
|
|
24
|
+
"""Ids are content-hash derived, not random — re-ingesting the same
|
|
25
|
+
text must upsert (same id), and distinct texts must not collide."""
|
|
26
|
+
assert Document(text="hello").id == Document(text="hello").id
|
|
27
|
+
ids = {Document(text=f"doc-{i}").id for i in range(50)}
|
|
25
28
|
assert len(ids) == 50
|
|
26
29
|
|
|
30
|
+
def test_explicit_id_not_overridden(self) -> None:
|
|
31
|
+
d = Document(id="custom-id", text="hello")
|
|
32
|
+
assert d.id == "custom-id"
|
|
33
|
+
|
|
27
34
|
def test_metadata_default_empty(self) -> None:
|
|
28
35
|
d = Document(text="x")
|
|
29
36
|
assert d.metadata == {}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|