dataenginex 0.8.6__tar.gz → 0.10.0__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.8.6 → dataenginex-0.10.0}/.claude/commands/new-feature.md +1 -1
- {dataenginex-0.8.6 → dataenginex-0.10.0}/.claude/commands/validate.md +4 -4
- dataenginex-0.10.0/.claude/settings.json +71 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/.env.template +72 -72
- {dataenginex-0.8.6 → dataenginex-0.10.0}/.github/ISSUE_TEMPLATE/config.yml +5 -5
- {dataenginex-0.8.6 → dataenginex-0.10.0}/.github/dependabot.yml +12 -12
- {dataenginex-0.8.6/docs → dataenginex-0.10.0/.github}/release-pr-template.md +3 -3
- dataenginex-0.10.0/.github/workflows/auto-pr-dev-to-main.yml +15 -0
- dataenginex-0.10.0/.github/workflows/auto-pr-to-dev.yml +16 -0
- dataenginex-0.10.0/.github/workflows/ci.yml +47 -0
- dataenginex-0.10.0/.github/workflows/claude.yml +23 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/.github/workflows/docker-build-push.yml +6 -6
- dataenginex-0.10.0/.github/workflows/docs-notify.yml +18 -0
- dataenginex-0.10.0/.github/workflows/enforce-dev-to-main.yml +11 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/.github/workflows/pypi-publish.yml +9 -9
- dataenginex-0.10.0/.github/workflows/release-dex.yml +150 -0
- dataenginex-0.10.0/.github/workflows/release-please.yml +16 -0
- dataenginex-0.10.0/.github/workflows/security.yml +17 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/.gitignore +8 -0
- dataenginex-0.10.0/.python-version +1 -0
- dataenginex-0.10.0/.release-please-manifest.json +3 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/CHANGELOG.md +21 -0
- dataenginex-0.10.0/CLAUDE.md +59 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/Dockerfile +6 -13
- dataenginex-0.10.0/PKG-INFO +116 -0
- dataenginex-0.10.0/README.md +157 -0
- dataenginex-0.10.0/docs/architecture.md +150 -0
- dataenginex-0.8.6/docs/CI_CD.md → dataenginex-0.10.0/docs/ci-cd.md +36 -37
- dataenginex-0.8.6/docs/CONTRIBUTING.md → dataenginex-0.10.0/docs/contributing.md +11 -9
- dataenginex-0.8.6/docs/DEVELOPMENT.md → dataenginex-0.10.0/docs/development.md +13 -15
- {dataenginex-0.8.6 → dataenginex-0.10.0}/docs/index.md +3 -3
- dataenginex-0.8.6/docs/OBSERVABILITY.md → dataenginex-0.10.0/docs/observability.md +19 -19
- dataenginex-0.10.0/docs/quickstart.md +85 -0
- dataenginex-0.8.6/docs/SDLC.md → dataenginex-0.10.0/docs/sdlc.md +4 -4
- dataenginex-0.10.0/docs/superpowers/plans/2026-03-21-phase-0-foundation.md +2242 -0
- dataenginex-0.10.0/docs/superpowers/plans/2026-03-22-dataenginex-1.0-master-plan.md +490 -0
- dataenginex-0.10.0/docs/superpowers/plans/2026-03-22-phase-1-data-layer.md +2016 -0
- dataenginex-0.10.0/docs/superpowers/plans/2026-03-22-phase-6a-dex-engine-integration.md +2235 -0
- dataenginex-0.10.0/docs/superpowers/plans/2026-03-22-phase-6b-dex-studio-redesign.md +2050 -0
- dataenginex-0.10.0/docs/superpowers/plans/2026-03-23-careerdex-example.md +1006 -0
- dataenginex-0.10.0/docs/superpowers/plans/2026-03-23-dex-studio-direct-import.md +1645 -0
- dataenginex-0.10.0/docs/superpowers/plans/2026-03-24-dex-naming-architecture-dry.md +1093 -0
- dataenginex-0.10.0/docs/superpowers/plans/2026-03-28-unified-docs-and-tooling.md +2137 -0
- dataenginex-0.10.0/docs/superpowers/specs/2026-03-21-dataenginex-v2-system-redesign.md +853 -0
- dataenginex-0.10.0/docs/superpowers/specs/2026-03-22-phase-6-integration-design.md +596 -0
- dataenginex-0.10.0/docs/superpowers/specs/2026-03-23-dex-studio-direct-import-design.md +469 -0
- dataenginex-0.10.0/docs/superpowers/specs/2026-03-24-dex-naming-architecture-dry-design.md +412 -0
- dataenginex-0.10.0/docs/superpowers/specs/2026-03-28-unified-docs-and-tooling-design.md +683 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/examples/02_api_quickstart.py +28 -10
- {dataenginex-0.8.6 → dataenginex-0.10.0}/examples/07_api_ingestion.py +2 -1
- {dataenginex-0.8.6 → dataenginex-0.10.0}/examples/08_spark_ml.py +3 -1
- {dataenginex-0.8.6 → dataenginex-0.10.0}/examples/09_feature_engineering.py +3 -1
- {dataenginex-0.8.6 → dataenginex-0.10.0}/examples/10_model_analysis.py +3 -1
- {dataenginex-0.8.6 → dataenginex-0.10.0}/examples/dashboard/dashboard_config.yaml +1 -1
- {dataenginex-0.8.6 → dataenginex-0.10.0}/examples/dashboard/run_dashboard.py +1 -1
- dataenginex-0.10.0/examples/dex.yaml +82 -0
- dataenginex-0.10.0/examples/movies.csv +9 -0
- dataenginex-0.10.0/poe_tasks.toml +168 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/pyproject.toml +21 -6
- dataenginex-0.10.0/release-please-config.json +23 -0
- dataenginex-0.10.0/src/dataenginex/README.md +63 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/__init__.py +1 -1
- dataenginex-0.10.0/src/dataenginex/ai/__init__.py +13 -0
- dataenginex-0.10.0/src/dataenginex/ai/agents/__init__.py +12 -0
- dataenginex-0.10.0/src/dataenginex/ai/agents/builtin.py +159 -0
- dataenginex-0.10.0/src/dataenginex/ai/retrieval/__init__.py +11 -0
- dataenginex-0.10.0/src/dataenginex/ai/retrieval/builtin.py +184 -0
- dataenginex-0.10.0/src/dataenginex/ai/tools/__init__.py +57 -0
- dataenginex-0.10.0/src/dataenginex/ai/tools/builtin.py +64 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/api/auth.py +182 -181
- dataenginex-0.10.0/src/dataenginex/api/factory.py +228 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/api/rate_limit.py +131 -130
- dataenginex-0.10.0/src/dataenginex/api/routers/ai.py +121 -0
- dataenginex-0.10.0/src/dataenginex/api/routers/data.py +130 -0
- dataenginex-0.10.0/src/dataenginex/api/routers/health.py +26 -0
- dataenginex-0.10.0/src/dataenginex/api/routers/ml.py +149 -0
- dataenginex-0.10.0/src/dataenginex/api/routers/pipelines.py +64 -0
- dataenginex-0.10.0/src/dataenginex/api/routers/root.py +25 -0
- dataenginex-0.10.0/src/dataenginex/api/routers/system.py +48 -0
- dataenginex-0.10.0/src/dataenginex/api/schemas.py +141 -0
- dataenginex-0.10.0/src/dataenginex/cli/__init__.py +3 -0
- dataenginex-0.10.0/src/dataenginex/cli/main.py +101 -0
- dataenginex-0.10.0/src/dataenginex/cli/run.py +72 -0
- dataenginex-0.10.0/src/dataenginex/cli/serve.py +48 -0
- dataenginex-0.10.0/src/dataenginex/cli/train.py +181 -0
- dataenginex-0.10.0/src/dataenginex/config/__init__.py +13 -0
- dataenginex-0.10.0/src/dataenginex/config/defaults.py +30 -0
- dataenginex-0.10.0/src/dataenginex/config/loader.py +196 -0
- dataenginex-0.10.0/src/dataenginex/config/schema.py +280 -0
- dataenginex-0.10.0/src/dataenginex/core/exceptions.py +101 -0
- dataenginex-0.10.0/src/dataenginex/core/interfaces.py +232 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/core/medallion_architecture.py +485 -484
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/core/quality.py +3 -1
- dataenginex-0.10.0/src/dataenginex/core/registry.py +109 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/dashboard/app.py +7 -5
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/dashboard/panels.py +7 -5
- dataenginex-0.10.0/src/dataenginex/data/__init__.py +61 -0
- dataenginex-0.10.0/src/dataenginex/data/connectors/__init__.py +30 -0
- dataenginex-0.10.0/src/dataenginex/data/connectors/csv.py +92 -0
- dataenginex-0.10.0/src/dataenginex/data/connectors/duckdb.py +98 -0
- dataenginex-0.8.6/src/dataenginex/data/connectors.py → dataenginex-0.10.0/src/dataenginex/data/connectors/legacy.py +364 -363
- dataenginex-0.10.0/src/dataenginex/data/pipeline/__init__.py +15 -0
- dataenginex-0.10.0/src/dataenginex/data/pipeline/dag.py +67 -0
- dataenginex-0.10.0/src/dataenginex/data/pipeline/run_history.py +88 -0
- dataenginex-0.10.0/src/dataenginex/data/pipeline/runner.py +287 -0
- dataenginex-0.10.0/src/dataenginex/data/quality/__init__.py +7 -0
- dataenginex-0.10.0/src/dataenginex/data/quality/gates.py +192 -0
- dataenginex-0.10.0/src/dataenginex/data/quality/spark.py +90 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/data/registry.py +161 -160
- dataenginex-0.10.0/src/dataenginex/data/transforms/__init__.py +10 -0
- dataenginex-0.10.0/src/dataenginex/data/transforms/sql.py +146 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/lakehouse/catalog.py +172 -169
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/lakehouse/storage.py +57 -56
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/middleware/logging_config.py +35 -56
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/ml/drift.py +1 -1
- dataenginex-0.10.0/src/dataenginex/ml/features/__init__.py +11 -0
- dataenginex-0.10.0/src/dataenginex/ml/features/builtin.py +116 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/ml/llm.py +13 -21
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/ml/mlflow_registry.py +5 -3
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/ml/registry.py +187 -182
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/ml/scheduler.py +21 -19
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/ml/serving.py +164 -163
- dataenginex-0.10.0/src/dataenginex/ml/serving_engine/__init__.py +12 -0
- dataenginex-0.10.0/src/dataenginex/ml/serving_engine/builtin.py +83 -0
- dataenginex-0.10.0/src/dataenginex/ml/tracking/__init__.py +11 -0
- dataenginex-0.10.0/src/dataenginex/ml/tracking/builtin.py +146 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/ml/training.py +365 -364
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/ml/vectorstore.py +13 -11
- dataenginex-0.10.0/src/dataenginex/orchestration/__init__.py +10 -0
- dataenginex-0.10.0/src/dataenginex/orchestration/builtin.py +101 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/plugins/__init__.py +7 -1
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/plugins/registry.py +20 -8
- dataenginex-0.10.0/src/dataenginex/secops/audit.py +258 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/warehouse/lineage.py +204 -188
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/warehouse/transforms.py +244 -243
- dataenginex-0.10.0/tests/conformance/test_connector.py +38 -0
- dataenginex-0.10.0/tests/conformance/test_feature_store.py +42 -0
- dataenginex-0.10.0/tests/conformance/test_tracker.py +57 -0
- dataenginex-0.10.0/tests/conformance/test_transform.py +23 -0
- dataenginex-0.10.0/tests/integration/test_cli_run.py +102 -0
- dataenginex-0.10.0/tests/integration/test_config_cli.py +108 -0
- dataenginex-0.10.0/tests/integration/test_full_app.py +89 -0
- dataenginex-0.10.0/tests/integration/test_pipeline_e2e.py +63 -0
- dataenginex-0.10.0/tests/load/__init__.py +0 -0
- dataenginex-0.10.0/tests/unit/test_agent_runtime.py +73 -0
- dataenginex-0.10.0/tests/unit/test_ai_router.py +96 -0
- dataenginex-0.10.0/tests/unit/test_api_auth.py +100 -0
- dataenginex-0.10.0/tests/unit/test_api_factory.py +167 -0
- dataenginex-0.10.0/tests/unit/test_api_pagination.py +83 -0
- dataenginex-0.10.0/tests/unit/test_api_rate_limit.py +86 -0
- dataenginex-0.10.0/tests/unit/test_api_schemas.py +53 -0
- dataenginex-0.10.0/tests/unit/test_api_validators.py +110 -0
- dataenginex-0.10.0/tests/unit/test_builtin_agent.py +41 -0
- dataenginex-0.10.0/tests/unit/test_builtin_feature_store.py +60 -0
- dataenginex-0.10.0/tests/unit/test_builtin_serving.py +95 -0
- dataenginex-0.10.0/tests/unit/test_builtin_tracker.py +75 -0
- dataenginex-0.10.0/tests/unit/test_cli_train.py +96 -0
- dataenginex-0.10.0/tests/unit/test_config_loader.py +152 -0
- dataenginex-0.10.0/tests/unit/test_config_schema.py +99 -0
- dataenginex-0.10.0/tests/unit/test_core_exceptions.py +47 -0
- dataenginex-0.10.0/tests/unit/test_core_interfaces.py +127 -0
- dataenginex-0.10.0/tests/unit/test_core_registry.py +78 -0
- dataenginex-0.10.0/tests/unit/test_csv_connector.py +32 -0
- dataenginex-0.10.0/tests/unit/test_data_router.py +95 -0
- dataenginex-0.10.0/tests/unit/test_duckdb_connector.py +39 -0
- dataenginex-0.10.0/tests/unit/test_ml_router.py +122 -0
- dataenginex-0.10.0/tests/unit/test_pipeline_dag.py +45 -0
- dataenginex-0.10.0/tests/unit/test_pipeline_runner.py +104 -0
- dataenginex-0.10.0/tests/unit/test_quality_gates.py +105 -0
- dataenginex-0.10.0/tests/unit/test_quality_spark.py +93 -0
- dataenginex-0.10.0/tests/unit/test_retriever.py +81 -0
- dataenginex-0.10.0/tests/unit/test_run_history.py +56 -0
- dataenginex-0.10.0/tests/unit/test_scheduler.py +56 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/tests/unit/test_secops.py +53 -0
- dataenginex-0.10.0/tests/unit/test_sql_transforms.py +90 -0
- dataenginex-0.10.0/tests/unit/test_system_router.py +65 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/uv.lock +302 -1474
- dataenginex-0.8.6/.claude/settings.json +0 -8
- dataenginex-0.8.6/.github/workflows/ci.yml +0 -71
- dataenginex-0.8.6/.github/workflows/claude.yml +0 -49
- dataenginex-0.8.6/.github/workflows/enforce-dev-to-main.yml +0 -20
- dataenginex-0.8.6/.github/workflows/release-dataenginex.yml +0 -233
- dataenginex-0.8.6/.github/workflows/security.yml +0 -169
- dataenginex-0.8.6/CLAUDE.md +0 -119
- dataenginex-0.8.6/PKG-INFO +0 -122
- dataenginex-0.8.6/README.md +0 -208
- dataenginex-0.8.6/docs/ARCHITECTURE.md +0 -305
- dataenginex-0.8.6/docs/docs-hub.md +0 -103
- dataenginex-0.8.6/docs/quickstart.md +0 -62
- dataenginex-0.8.6/mkdocs.yml +0 -61
- dataenginex-0.8.6/netlify.toml +0 -11
- dataenginex-0.8.6/poe_tasks.toml +0 -165
- dataenginex-0.8.6/src/dataenginex/README.md +0 -72
- dataenginex-0.8.6/src/dataenginex/data/__init__.py +0 -33
- dataenginex-0.8.6/src/dataenginex/secops/audit.py +0 -154
- {dataenginex-0.8.6 → dataenginex-0.10.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/.github/labels.yml +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/.github/workflows/label-sync.yml +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/.gitleaks.toml +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/.pre-commit-config.yaml +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/CODEOWNERS +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/CONTRIBUTING.md +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/LICENSE +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/docker-compose.test.yml +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/docs/adr/0000-template.md +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/docs/adr/0001-medallion-architecture.md +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/docs/api-reference/api.md +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/docs/api-reference/core.md +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/docs/api-reference/dashboard.md +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/docs/api-reference/data.md +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/docs/api-reference/index.md +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/docs/api-reference/lakehouse.md +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/docs/api-reference/middleware.md +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/docs/api-reference/ml.md +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/docs/api-reference/plugins.md +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/docs/api-reference/warehouse.md +0 -0
- /dataenginex-0.8.6/docs/RELEASE_NOTES.md → /dataenginex-0.10.0/docs/release-notes.md +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/docs/roadmap/project-roadmap.csv +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/docs/roadmap/project-roadmap.json +0 -0
- /dataenginex-0.8.6/docs/SECURITY_SCANNING.md → /dataenginex-0.10.0/docs/security-scanning.md +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/examples/01_hello_pipeline.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/examples/03_quality_gate.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/examples/04_ml_training.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/examples/05_rag_demo.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/examples/06_llm_quickstart.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/examples/GUIDE.md +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/scripts/GUIDE.md +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/scripts/localstack/create-buckets.sh +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/scripts/promote.sh +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/sonar-project.properties +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/RELEASE_NOTES.md +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/api/__init__.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/api/errors.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/api/health.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/api/pagination.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/api/routers/__init__.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/core/__init__.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/core/schemas.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/core/validators.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/dashboard/__init__.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/data/profiler.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/lakehouse/__init__.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/lakehouse/partitioning.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/middleware/__init__.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/middleware/metrics.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/middleware/metrics_middleware.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/middleware/request_logging.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/middleware/tracing.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/ml/__init__.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/ml/metrics.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/py.typed +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/secops/__init__.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/secops/gate.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/secops/masking.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/secops/pii.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/src/dataenginex/warehouse/__init__.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/tasks/findings.md +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/tasks/lessons.md +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/tests/__init__.py +0 -0
- {dataenginex-0.8.6/tests/load → dataenginex-0.10.0/tests/conformance}/__init__.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/tests/conftest.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/tests/fixtures/__init__.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/tests/fixtures/sample_data.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/tests/fixtures/sample_jobs.csv +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/tests/fixtures/sample_jobs.json +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/tests/integration/__init__.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/tests/integration/test_storage_real.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/tests/unit/__init__.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/tests/unit/test_data.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/tests/unit/test_drift_scheduler.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/tests/unit/test_errors.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/tests/unit/test_health.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/tests/unit/test_lakehouse.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/tests/unit/test_llm.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/tests/unit/test_logging.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/tests/unit/test_medallion.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/tests/unit/test_metrics.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/tests/unit/test_middleware.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/tests/unit/test_ml.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/tests/unit/test_plugins.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/tests/unit/test_spark_fixtures.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/tests/unit/test_storage_abstraction.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/tests/unit/test_tracing.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/tests/unit/test_vectorstore.py +0 -0
- {dataenginex-0.8.6 → dataenginex-0.10.0}/tests/unit/test_warehouse.py +0 -0
|
@@ -14,7 +14,7 @@ Steps:
|
|
|
14
14
|
- Quality gate → `src/dataenginex/quality/`
|
|
15
15
|
- Plugin hook → `src/dataenginex/plugins/` — entry-point based discovery
|
|
16
16
|
- Framework util → `src/dataenginex/core/`
|
|
17
|
-
1. **Implement** — Follow existing patterns. `from __future__ import annotations` at top. structlog
|
|
17
|
+
1. **Implement** — Follow existing patterns. `from __future__ import annotations` at top. `structlog` only (no loguru, no print). Use `BackendRegistry` for new pluggable subsystems.
|
|
18
18
|
1. **Test** — Unit tests in `tests/unit/`, integration tests in `tests/integration/` (live uvicorn). `asyncio_mode = "auto"` — no `@pytest.mark.asyncio` needed.
|
|
19
19
|
1. **Validate** — Run `/validate` (dex version — includes real server step)
|
|
20
20
|
1. **Update** — Mark complete in `tasks/todo.md`; update `TODO.md` if relevant
|
|
@@ -25,10 +25,10 @@ Run the full DEX validation pipeline in order. Stop and report on first failure.
|
|
|
25
25
|
```bash
|
|
26
26
|
uv run python examples/02_api_quickstart.py &
|
|
27
27
|
sleep 2
|
|
28
|
-
curl -sf http://localhost:
|
|
29
|
-
curl -sf http://localhost:
|
|
30
|
-
curl -sf http://localhost:
|
|
31
|
-
curl -sf -X POST http://localhost:
|
|
28
|
+
curl -sf http://localhost:17000/health | python -m json.tool
|
|
29
|
+
curl -sf http://localhost:17000/ | python -m json.tool
|
|
30
|
+
curl -sf http://localhost:17000/metrics | head -20
|
|
31
|
+
curl -sf -X POST http://localhost:17000/echo -H "Content-Type: application/json" -d '{"message":"test"}' | python -m json.tool
|
|
32
32
|
```
|
|
33
33
|
|
|
34
34
|
Check response **bodies** — not just status codes. Kill the server after.
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"autoUpdatesChannel": "latest",
|
|
3
|
+
"statusLine": {
|
|
4
|
+
"type": "command",
|
|
5
|
+
"command": "b=$(git branch --show-current 2>/dev/null); [ -n \"$b\" ] && echo \"[$b]\" || echo \"\"",
|
|
6
|
+
"padding": 2
|
|
7
|
+
},
|
|
8
|
+
"permissions": {
|
|
9
|
+
"defaultMode": "default",
|
|
10
|
+
"allow": [
|
|
11
|
+
"Read",
|
|
12
|
+
"Edit",
|
|
13
|
+
"Bash(uv run poe *)",
|
|
14
|
+
"Bash(uv run uvicorn *)",
|
|
15
|
+
"Bash(uv run python *)",
|
|
16
|
+
"Bash(uv run *)",
|
|
17
|
+
"Bash(uv lock *)",
|
|
18
|
+
"Bash(uv sync *)",
|
|
19
|
+
"Bash(curl *)",
|
|
20
|
+
"Bash(git status)",
|
|
21
|
+
"Bash(git status *)",
|
|
22
|
+
"Bash(git diff *)",
|
|
23
|
+
"Bash(git log *)",
|
|
24
|
+
"Bash(git branch *)",
|
|
25
|
+
"Bash(git add *)",
|
|
26
|
+
"Bash(git fetch *)",
|
|
27
|
+
"Bash(ls *)",
|
|
28
|
+
"Bash(pwd)",
|
|
29
|
+
"Bash(which *)",
|
|
30
|
+
"Bash(wc *)",
|
|
31
|
+
"Bash(echo *)",
|
|
32
|
+
"Bash(python -c *)",
|
|
33
|
+
"Bash(python3 *)",
|
|
34
|
+
"Bash(gh pr *)",
|
|
35
|
+
"Bash(gh issue *)",
|
|
36
|
+
"Bash(gh release *)",
|
|
37
|
+
"Bash(gh run *)",
|
|
38
|
+
"Bash(gh api *)",
|
|
39
|
+
"Bash(llmfit *)",
|
|
40
|
+
"Bash(npx -y @upstash/context7-mcp*)"
|
|
41
|
+
],
|
|
42
|
+
"deny": [
|
|
43
|
+
"Bash(git commit *)",
|
|
44
|
+
"Bash(git push *)",
|
|
45
|
+
"Bash(rm -rf *)",
|
|
46
|
+
"Bash(git push --force*)",
|
|
47
|
+
"Bash(git reset --hard*)",
|
|
48
|
+
"Bash(pip install*)",
|
|
49
|
+
"Bash(sudo *)",
|
|
50
|
+
"Bash(chmod 777*)",
|
|
51
|
+
"Bash(curl * | bash*)"
|
|
52
|
+
]
|
|
53
|
+
},
|
|
54
|
+
"hooks": {
|
|
55
|
+
"UserPromptSubmit": [
|
|
56
|
+
{
|
|
57
|
+
"matcher": "",
|
|
58
|
+
"hooks": [
|
|
59
|
+
{
|
|
60
|
+
"type": "prompt",
|
|
61
|
+
"prompt": "Classify this task as 'simple' (data lookup, quick questions, simple edits — use haiku for speed/cost), 'moderate' (implementation, debugging, refactoring — use sonnet for balance), or 'complex' (architecture, multi-file design, research — use opus for reasoning). Based on the user message below, respond with ONLY the word: haiku, sonnet, or opus. User message: $ARGUMENTS",
|
|
62
|
+
"statusMessage": "Analyzing task complexity...",
|
|
63
|
+
"model": "claude-haiku-4-5-20251001"
|
|
64
|
+
}
|
|
65
|
+
]
|
|
66
|
+
}
|
|
67
|
+
]
|
|
68
|
+
},
|
|
69
|
+
"alwaysThinkingEnabled": false,
|
|
70
|
+
"cleanupPeriodDays": 7
|
|
71
|
+
}
|
|
@@ -1,73 +1,73 @@
|
|
|
1
|
-
# =============================================================================
|
|
2
|
-
# DataEngineX — Environment Configuration Template
|
|
3
|
-
# =============================================================================
|
|
4
|
-
# Copy to .env and fill in values for your environment.
|
|
5
|
-
# NEVER commit secrets to version control — use a secret manager in production.
|
|
6
|
-
# =============================================================================
|
|
7
|
-
|
|
8
|
-
# -- Application -------------------------------------------------------------
|
|
9
|
-
APP_NAME=dataenginex
|
|
10
|
-
ENVIRONMENT=dev
|
|
11
|
-
|
|
12
|
-
# -- Logging -----------------------------------------------------------------
|
|
13
|
-
LOG_LEVEL=INFO
|
|
14
|
-
# "json" for structured JSON output, "console" for human-readable
|
|
15
|
-
LOG_FORMAT=console
|
|
16
|
-
|
|
17
|
-
# -- API Server --------------------------------------------------------------
|
|
18
|
-
HOST=0.0.0.0
|
|
19
|
-
PORT=
|
|
20
|
-
|
|
21
|
-
# -- Authentication (JWT) ----------------------------------------------------
|
|
22
|
-
# Set to "true" to enforce Bearer-token auth on protected endpoints
|
|
23
|
-
DEX_AUTH_ENABLED=false
|
|
24
|
-
# HMAC-SHA256 secret — generate with: python -c "import secrets; print(secrets.token_urlsafe(64))"
|
|
25
|
-
DEX_JWT_SECRET=
|
|
26
|
-
DEX_JWT_ALGORITHM=HS256
|
|
27
|
-
# Token TTL in minutes
|
|
28
|
-
DEX_JWT_TTL_MINUTES=60
|
|
29
|
-
|
|
30
|
-
# -- Rate Limiting -----------------------------------------------------------
|
|
31
|
-
# Set to "true" to enable per-IP token-bucket rate limiting
|
|
32
|
-
DEX_RATE_LIMIT_ENABLED=false
|
|
33
|
-
DEX_RATE_LIMIT_RPM=60
|
|
34
|
-
DEX_RATE_LIMIT_BURST=10
|
|
35
|
-
|
|
36
|
-
# -- Observability / Tracing ------------------------------------------------
|
|
37
|
-
# OpenTelemetry collector endpoint (leave blank to disable OTLP export)
|
|
38
|
-
OTLP_ENDPOINT=
|
|
39
|
-
ENABLE_CONSOLE_TRACES=false
|
|
40
|
-
|
|
41
|
-
# -- Database ----------------------------------------------------------------
|
|
42
|
-
DB_DRIVER=
|
|
43
|
-
DB_SERVER=
|
|
44
|
-
DB_NAME=
|
|
45
|
-
DB_USER=
|
|
46
|
-
DB_PASSWORD=
|
|
47
|
-
|
|
48
|
-
# -- Databricks --------------------------------------------------------------
|
|
49
|
-
DATABRICKS_HOST=
|
|
50
|
-
DATABRICKS_CLIENT_ID=
|
|
51
|
-
DATABRICKS_SECRET=
|
|
52
|
-
|
|
53
|
-
# -- External APIs -----------------------------------------------------------
|
|
54
|
-
OPENWEATHER_API_KEY=
|
|
55
|
-
|
|
56
|
-
# -- GitHub App (CI/CD webhooks) ---------------------------------------------
|
|
57
|
-
GITHUB_PRIVATE_KEY=
|
|
58
|
-
GITHUB_APP_IDENTIFIER=
|
|
59
|
-
GITHUB_WEBHOOK_SECRET=
|
|
60
|
-
GITHUB_PERSONAL_ACCESS_TOKEN=
|
|
61
|
-
|
|
62
|
-
# -- MCP Servers -------------------------------------------------------------
|
|
63
|
-
# GitHub MCP uses GITHUB_PERSONAL_ACCESS_TOKEN above.
|
|
64
|
-
CLOUDFLARE_API_TOKEN=
|
|
65
|
-
CLOUDFLARE_ACCOUNT_ID=
|
|
66
|
-
POSTGRES_CONNECTION_STRING=
|
|
67
|
-
|
|
68
|
-
# -- Notifications -----------------------------------------------------------
|
|
69
|
-
SLACK_WEBHOOK_URL=
|
|
70
|
-
|
|
71
|
-
# -- Grafana (docker-compose local dev) --------------------------------------
|
|
72
|
-
GF_SECURITY_ADMIN_USER=admin
|
|
1
|
+
# =============================================================================
|
|
2
|
+
# DataEngineX — Environment Configuration Template
|
|
3
|
+
# =============================================================================
|
|
4
|
+
# Copy to .env and fill in values for your environment.
|
|
5
|
+
# NEVER commit secrets to version control — use a secret manager in production.
|
|
6
|
+
# =============================================================================
|
|
7
|
+
|
|
8
|
+
# -- Application -------------------------------------------------------------
|
|
9
|
+
APP_NAME=dataenginex
|
|
10
|
+
ENVIRONMENT=dev
|
|
11
|
+
|
|
12
|
+
# -- Logging -----------------------------------------------------------------
|
|
13
|
+
LOG_LEVEL=INFO
|
|
14
|
+
# "json" for structured JSON output, "console" for human-readable
|
|
15
|
+
LOG_FORMAT=console
|
|
16
|
+
|
|
17
|
+
# -- API Server --------------------------------------------------------------
|
|
18
|
+
HOST=0.0.0.0
|
|
19
|
+
PORT=17000
|
|
20
|
+
|
|
21
|
+
# -- Authentication (JWT) ----------------------------------------------------
|
|
22
|
+
# Set to "true" to enforce Bearer-token auth on protected endpoints
|
|
23
|
+
DEX_AUTH_ENABLED=false
|
|
24
|
+
# HMAC-SHA256 secret — generate with: python -c "import secrets; print(secrets.token_urlsafe(64))"
|
|
25
|
+
DEX_JWT_SECRET=
|
|
26
|
+
DEX_JWT_ALGORITHM=HS256
|
|
27
|
+
# Token TTL in minutes
|
|
28
|
+
DEX_JWT_TTL_MINUTES=60
|
|
29
|
+
|
|
30
|
+
# -- Rate Limiting -----------------------------------------------------------
|
|
31
|
+
# Set to "true" to enable per-IP token-bucket rate limiting
|
|
32
|
+
DEX_RATE_LIMIT_ENABLED=false
|
|
33
|
+
DEX_RATE_LIMIT_RPM=60
|
|
34
|
+
DEX_RATE_LIMIT_BURST=10
|
|
35
|
+
|
|
36
|
+
# -- Observability / Tracing ------------------------------------------------
|
|
37
|
+
# OpenTelemetry collector endpoint (leave blank to disable OTLP export)
|
|
38
|
+
OTLP_ENDPOINT=
|
|
39
|
+
ENABLE_CONSOLE_TRACES=false
|
|
40
|
+
|
|
41
|
+
# -- Database ----------------------------------------------------------------
|
|
42
|
+
DB_DRIVER=
|
|
43
|
+
DB_SERVER=
|
|
44
|
+
DB_NAME=
|
|
45
|
+
DB_USER=
|
|
46
|
+
DB_PASSWORD=
|
|
47
|
+
|
|
48
|
+
# -- Databricks --------------------------------------------------------------
|
|
49
|
+
DATABRICKS_HOST=
|
|
50
|
+
DATABRICKS_CLIENT_ID=
|
|
51
|
+
DATABRICKS_SECRET=
|
|
52
|
+
|
|
53
|
+
# -- External APIs -----------------------------------------------------------
|
|
54
|
+
OPENWEATHER_API_KEY=
|
|
55
|
+
|
|
56
|
+
# -- GitHub App (CI/CD webhooks) ---------------------------------------------
|
|
57
|
+
GITHUB_PRIVATE_KEY=
|
|
58
|
+
GITHUB_APP_IDENTIFIER=
|
|
59
|
+
GITHUB_WEBHOOK_SECRET=
|
|
60
|
+
GITHUB_PERSONAL_ACCESS_TOKEN=
|
|
61
|
+
|
|
62
|
+
# -- MCP Servers -------------------------------------------------------------
|
|
63
|
+
# GitHub MCP uses GITHUB_PERSONAL_ACCESS_TOKEN above.
|
|
64
|
+
CLOUDFLARE_API_TOKEN=
|
|
65
|
+
CLOUDFLARE_ACCOUNT_ID=
|
|
66
|
+
POSTGRES_CONNECTION_STRING=
|
|
67
|
+
|
|
68
|
+
# -- Notifications -----------------------------------------------------------
|
|
69
|
+
SLACK_WEBHOOK_URL=
|
|
70
|
+
|
|
71
|
+
# -- Grafana (docker-compose local dev) --------------------------------------
|
|
72
|
+
GF_SECURITY_ADMIN_USER=admin
|
|
73
73
|
GF_SECURITY_ADMIN_PASSWORD=admin
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
blank_issues_enabled: false
|
|
2
2
|
contact_links:
|
|
3
3
|
- name: Security Policy
|
|
4
|
-
url: https://github.com/TheDataEngineX/
|
|
4
|
+
url: https://github.com/TheDataEngineX/dataenginex/blob/main/SECURITY.md
|
|
5
5
|
about: Report vulnerabilities responsibly using the security policy
|
|
6
6
|
- name: Support Guide
|
|
7
|
-
url: https://github.com/TheDataEngineX/
|
|
7
|
+
url: https://github.com/TheDataEngineX/dataenginex/blob/main/SUPPORT.md
|
|
8
8
|
about: Find the right channel for help, bugs, and feature proposals
|
|
9
9
|
- name: Questions and Ideas (GitHub Discussions)
|
|
10
|
-
url: https://github.com/TheDataEngineX/
|
|
10
|
+
url: https://github.com/TheDataEngineX/dataenginex/discussions
|
|
11
11
|
about: Use Discussions for Q&A, design brainstorming, and early proposals
|
|
12
12
|
- name: Organization Projects
|
|
13
13
|
url: https://github.com/orgs/TheDataEngineX/projects
|
|
14
14
|
about: Track roadmap status, milestones, and planning boards
|
|
15
15
|
- name: Documentation
|
|
16
|
-
url: https://github.com/TheDataEngineX/
|
|
16
|
+
url: https://github.com/TheDataEngineX/dataenginex/blob/main/docs/docs-hub.md
|
|
17
17
|
about: Check the documentation for guides and runbooks
|
|
18
18
|
- name: SDLC Guide
|
|
19
|
-
url: https://github.com/TheDataEngineX/
|
|
19
|
+
url: https://github.com/TheDataEngineX/dataenginex/blob/main/docs/SDLC.md
|
|
20
20
|
about: Review the development lifecycle and workflow
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
version: 2
|
|
2
|
-
updates:
|
|
3
|
-
- package-ecosystem: pip
|
|
4
|
-
directory: "/"
|
|
5
|
-
schedule:
|
|
6
|
-
interval: weekly
|
|
7
|
-
target-branch: dev
|
|
8
|
-
- package-ecosystem: github-actions
|
|
9
|
-
directory: "/"
|
|
10
|
-
schedule:
|
|
11
|
-
interval: weekly
|
|
12
|
-
target-branch: dev
|
|
1
|
+
version: 2
|
|
2
|
+
updates:
|
|
3
|
+
- package-ecosystem: pip
|
|
4
|
+
directory: "/"
|
|
5
|
+
schedule:
|
|
6
|
+
interval: weekly
|
|
7
|
+
target-branch: dev
|
|
8
|
+
- package-ecosystem: github-actions
|
|
9
|
+
directory: "/"
|
|
10
|
+
schedule:
|
|
11
|
+
interval: weekly
|
|
12
|
+
target-branch: dev
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
# Release PR Template
|
|
2
2
|
|
|
3
|
-
Use this template whenever opening a release PR (`dev → main`). Reference `
|
|
3
|
+
Use this template whenever opening a release PR (`dev → main`). Reference `release-notes.md` and verify QA steps before merging.
|
|
4
4
|
|
|
5
5
|
## Summary
|
|
6
6
|
|
|
7
7
|
- Describe what changed (e.g., alerts, APIs, docs).
|
|
8
|
-
- Link to the release note: [
|
|
8
|
+
- Link to the release note: [release-notes.md](release-notes.md).
|
|
9
9
|
- Note any rollout considerations (e.g., Alertmanager rules, Docker image tag).
|
|
10
10
|
|
|
11
11
|
## Verification
|
|
@@ -13,7 +13,7 @@ Use this template whenever opening a release PR (`dev → main`). Reference `REL
|
|
|
13
13
|
- `uv run poe lint`
|
|
14
14
|
- `./.venv/bin/pytest -v`
|
|
15
15
|
- `docker compose build`
|
|
16
|
-
- Reload Prometheus/Alertmanager (see `
|
|
16
|
+
- Reload Prometheus/Alertmanager (see `observability.md` → "Reloading Alert Rules").
|
|
17
17
|
|
|
18
18
|
## QA Checklist
|
|
19
19
|
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
name: Auto PR — feature → dev
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- 'feature/**'
|
|
7
|
+
- 'fix/**'
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: write
|
|
11
|
+
pull-requests: write
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
auto-pr:
|
|
15
|
+
uses: TheDataEngineX/.github/.github/workflows/auto-pr-to-dev.yml@main
|
|
16
|
+
secrets: inherit
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main, dev]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main, dev]
|
|
8
|
+
workflow_dispatch:
|
|
9
|
+
|
|
10
|
+
permissions:
|
|
11
|
+
contents: read
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
quality:
|
|
15
|
+
name: Code Quality
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
steps:
|
|
18
|
+
- uses: actions/checkout@v6
|
|
19
|
+
- uses: astral-sh/setup-uv@v7
|
|
20
|
+
with:
|
|
21
|
+
version: "latest"
|
|
22
|
+
python-version: "3.13"
|
|
23
|
+
- run: uv sync --group ml
|
|
24
|
+
env:
|
|
25
|
+
UV_PROJECT_ENVIRONMENT: .venv
|
|
26
|
+
- run: uv run poe quality
|
|
27
|
+
|
|
28
|
+
test:
|
|
29
|
+
name: Tests
|
|
30
|
+
runs-on: ubuntu-latest
|
|
31
|
+
needs: quality
|
|
32
|
+
steps:
|
|
33
|
+
- uses: actions/checkout@v6
|
|
34
|
+
- uses: astral-sh/setup-uv@v7
|
|
35
|
+
with:
|
|
36
|
+
version: "latest"
|
|
37
|
+
python-version: "3.13"
|
|
38
|
+
- run: uv sync --group ml
|
|
39
|
+
env:
|
|
40
|
+
UV_PROJECT_ENVIRONMENT: .venv
|
|
41
|
+
- run: uv run poe test-cov-core
|
|
42
|
+
- uses: codecov/codecov-action@v6
|
|
43
|
+
with:
|
|
44
|
+
flags: dataenginex
|
|
45
|
+
fail_ci_if_error: false
|
|
46
|
+
env:
|
|
47
|
+
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
name: Claude Code
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
issue_comment:
|
|
5
|
+
types: [created]
|
|
6
|
+
pull_request_review_comment:
|
|
7
|
+
types: [created]
|
|
8
|
+
issues:
|
|
9
|
+
types: [opened, assigned]
|
|
10
|
+
pull_request_review:
|
|
11
|
+
types: [submitted]
|
|
12
|
+
|
|
13
|
+
permissions:
|
|
14
|
+
contents: read
|
|
15
|
+
pull-requests: read
|
|
16
|
+
issues: read
|
|
17
|
+
actions: read
|
|
18
|
+
id-token: write
|
|
19
|
+
|
|
20
|
+
jobs:
|
|
21
|
+
claude:
|
|
22
|
+
uses: TheDataEngineX/.github/.github/workflows/claude.yml@main
|
|
23
|
+
secrets: inherit
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# Build and push Docker image to GitHub Container Registry (GHCR)
|
|
2
|
-
# Triggers on merge to main — publishes ghcr.io/thedataenginex/
|
|
2
|
+
# Triggers on merge to main — publishes ghcr.io/thedataenginex/dataenginex:<version>
|
|
3
3
|
|
|
4
4
|
name: Docker Build & Push
|
|
5
5
|
|
|
@@ -34,26 +34,26 @@ jobs:
|
|
|
34
34
|
|
|
35
35
|
- name: Docker metadata
|
|
36
36
|
id: meta
|
|
37
|
-
uses: docker/metadata-action@
|
|
37
|
+
uses: docker/metadata-action@v6
|
|
38
38
|
with:
|
|
39
|
-
images: ghcr.io/thedataenginex/
|
|
39
|
+
images: ghcr.io/thedataenginex/dataenginex
|
|
40
40
|
tags: |
|
|
41
41
|
type=raw,value=${{ steps.version.outputs.version }}
|
|
42
42
|
type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' }}
|
|
43
43
|
type=sha,prefix=sha-
|
|
44
44
|
|
|
45
45
|
- name: Set up Docker Buildx
|
|
46
|
-
uses: docker/setup-buildx-action@
|
|
46
|
+
uses: docker/setup-buildx-action@v4
|
|
47
47
|
|
|
48
48
|
- name: Log in to GHCR
|
|
49
|
-
uses: docker/login-action@
|
|
49
|
+
uses: docker/login-action@v4
|
|
50
50
|
with:
|
|
51
51
|
registry: ghcr.io
|
|
52
52
|
username: ${{ github.actor }}
|
|
53
53
|
password: ${{ secrets.GITHUB_TOKEN }}
|
|
54
54
|
|
|
55
55
|
- name: Build and push
|
|
56
|
-
uses: docker/build-push-action@
|
|
56
|
+
uses: docker/build-push-action@v7
|
|
57
57
|
with:
|
|
58
58
|
context: .
|
|
59
59
|
push: true
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
name: Notify Docs
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
paths: ['docs/**', 'src/**/**.py']
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
notify:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
steps:
|
|
12
|
+
- uses: peter-evans/repository-dispatch@v3
|
|
13
|
+
with:
|
|
14
|
+
token: ${{ secrets.DOCS_DISPATCH_TOKEN }}
|
|
15
|
+
repository: TheDataEngineX/docs
|
|
16
|
+
event-type: docs-update
|
|
17
|
+
client-payload: >-
|
|
18
|
+
{"repo": "${{ github.repository }}", "ref": "${{ github.sha }}"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# DataEngineX PyPI Publishing
|
|
2
|
-
# Triggered
|
|
2
|
+
# Triggered when release-please creates a GitHub Release (tag: vX.Y.Z).
|
|
3
3
|
# Detects if src/dataenginex/ actually changed since previous dataenginex tag, then publishes.
|
|
4
4
|
|
|
5
5
|
name: PyPI Publish
|
|
@@ -11,7 +11,7 @@ on:
|
|
|
11
11
|
workflow_dispatch:
|
|
12
12
|
inputs:
|
|
13
13
|
tag:
|
|
14
|
-
description: "Tag to publish (e.g.,
|
|
14
|
+
description: "Tag to publish (e.g., v0.8.7)"
|
|
15
15
|
required: false
|
|
16
16
|
type: string
|
|
17
17
|
|
|
@@ -55,7 +55,7 @@ jobs:
|
|
|
55
55
|
|
|
56
56
|
CURRENT_TAG="${RELEASE_TAG:-${DISPATCH_TAG:-}}"
|
|
57
57
|
if [[ -z "${CURRENT_TAG}" ]]; then
|
|
58
|
-
CURRENT_TAG="$(git tag --list '
|
|
58
|
+
CURRENT_TAG="$(git tag --list 'v[0-9]*' --sort=-version:refname | head -n 1 || true)"
|
|
59
59
|
fi
|
|
60
60
|
|
|
61
61
|
if [[ -z "${CURRENT_TAG}" ]]; then
|
|
@@ -65,8 +65,8 @@ jobs:
|
|
|
65
65
|
|
|
66
66
|
echo "current_tag=${CURRENT_TAG}" >> "$GITHUB_OUTPUT"
|
|
67
67
|
|
|
68
|
-
STABLE_REGEX='^
|
|
69
|
-
ANY_SEMVER_REGEX='^
|
|
68
|
+
STABLE_REGEX='^v[0-9]+\.[0-9]+\.[0-9]+$'
|
|
69
|
+
ANY_SEMVER_REGEX='^v[0-9]+\.[0-9]+\.[0-9]+([.-][0-9A-Za-z.-]+)?$'
|
|
70
70
|
|
|
71
71
|
if [[ "${CURRENT_TAG}" =~ $STABLE_REGEX ]]; then
|
|
72
72
|
echo "approved_tag=true" >> "$GITHUB_OUTPUT"
|
|
@@ -79,13 +79,13 @@ jobs:
|
|
|
79
79
|
exit 1
|
|
80
80
|
fi
|
|
81
81
|
|
|
82
|
-
TAG_VERSION="${CURRENT_TAG#
|
|
82
|
+
TAG_VERSION="${CURRENT_TAG#v}"
|
|
83
83
|
if [[ "$EVENT_NAME" == "release" && "$TAG_VERSION" != "$PACKAGE_VERSION" ]]; then
|
|
84
84
|
echo "Release tag (${CURRENT_TAG}) does not match pyproject.toml version (${PACKAGE_VERSION})."
|
|
85
85
|
exit 1
|
|
86
86
|
fi
|
|
87
87
|
|
|
88
|
-
PREVIOUS_TAG="$(git tag --list '
|
|
88
|
+
PREVIOUS_TAG="$(git tag --list 'v[0-9]*' --sort=-version:refname | grep -Fxv "${CURRENT_TAG}" | head -n 1 || true)"
|
|
89
89
|
echo "previous_tag=${PREVIOUS_TAG}" >> "$GITHUB_OUTPUT"
|
|
90
90
|
|
|
91
91
|
if [[ -z "${PREVIOUS_TAG}" ]]; then
|
|
@@ -252,7 +252,7 @@ jobs:
|
|
|
252
252
|
} else if (dataenginexChanged === 'false') {
|
|
253
253
|
reason = `No changes in src/dataenginex/ since ${previousTag}`;
|
|
254
254
|
} else if (approvedTag === 'false') {
|
|
255
|
-
reason = `Tag ${currentTag} is not a stable release (requires
|
|
255
|
+
reason = `Tag ${currentTag} is not a stable release (requires vMAJOR.MINOR.PATCH)`;
|
|
256
256
|
}
|
|
257
257
|
|
|
258
258
|
try {
|
|
@@ -286,5 +286,5 @@ jobs:
|
|
|
286
286
|
elif [[ "${{ needs.detect-dataenginex-changes.outputs.dataenginex_changed }}" == "false" ]]; then
|
|
287
287
|
echo "Skipping TestPyPI/PyPI publish: no changes in src/dataenginex/ since previous tag ${{ needs.detect-dataenginex-changes.outputs.previous_tag }}."
|
|
288
288
|
elif [[ "${{ needs.detect-dataenginex-changes.outputs.approved_tag }}" == "false" ]]; then
|
|
289
|
-
echo "Published to TestPyPI only: tag ${{ needs.detect-dataenginex-changes.outputs.current_tag }} is not an approved stable tag (requires
|
|
289
|
+
echo "Published to TestPyPI only: tag ${{ needs.detect-dataenginex-changes.outputs.current_tag }} is not an approved stable tag (requires vMAJOR.MINOR.PATCH)."
|
|
290
290
|
fi
|