Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
f45982d
feat: add v0.2.0 Production Hardening features (#56)
jaymyaka Feb 12, 2026
4b2355f
fix: add missing Readme.md and src/ to Docker build context
jaymyaka Feb 12, 2026
901ad1d
refactor: fix CD workflow and add semantic versioning (#59)
jaymyaka Feb 12, 2026
56ecc62
Merge remote-tracking branch 'origin/main' into dev
jaymyaka Feb 12, 2026
af4e070
chore: sync dev with main (workflow cleanup)
github-actions[bot] Feb 13, 2026
0f019fa
feat: v0.3.0 production hardening (#76)
jaymyaka Feb 15, 2026
829e5eb
fix: v0.3.1 Infrastructure Alignment (#78)
jaymyaka Feb 15, 2026
bcbed5c
feat: v0.4.0 — DEX Module Epics & Project-Wide Improvements (#79)
jaymyaka Feb 16, 2026
3464c5c
fix(v0.3.3): CD & Security Slack notification conditions
github-actions[bot] Feb 16, 2026
9312257
Potential fix for code scanning alert no. 132: Information exposure t…
jaymyaka Feb 16, 2026
8e9f116
fix: remove unused exception variable in auth middleware (F841)
github-actions[bot] Feb 16, 2026
34b65d8
refactor: single version source in pyproject.toml, fix release.yml gr…
github-actions[bot] Feb 16, 2026
df047e0
Merge remote-tracking branch 'origin/main' into dev
github-actions[bot] Feb 16, 2026
7e230f8
fix: copy LICENSE into Docker build context for Poetry Core
github-actions[bot] Feb 16, 2026
3cc5d49
chore: bump app and dataenginex package version to 0.3.4
github-actions[bot] Feb 20, 2026
d597c5e
fix: apply Ruff import-order fixes for CI lint
github-actions[bot] Feb 20, 2026
0731b49
chore: enforce import-order check in local and CI gates
github-actions[bot] Feb 20, 2026
d2a7135
Merge branch 'main' into dev
jaymyaka Feb 20, 2026
9cbe52c
fix: trigger pypi publish on release published events
github-actions[bot] Feb 20, 2026
f812128
fix: skip trusted publish on manual workflow dispatch
github-actions[bot] Feb 20, 2026
5b55b42
fix: use vars-based environments for pypi trusted publishing
github-actions[bot] Feb 20, 2026
1c7732a
chore: bump app and dataenginex package version to 0.3.5
github-actions[bot] Feb 20, 2026
6455e88
Merge branch 'main' into dev
jaymyaka Feb 20, 2026
23a4a66
chore: audit & governance setup + release automation matrix + health …
jaymyaka Feb 23, 2026
1b59c5b
fix: cd.yml - correct Trivy image reference construction (#100)
jaymyaka Feb 23, 2026
b7f63e4
fix: always push both latest and sha-<short_sha> tags for Docker imag…
jaymyaka Feb 23, 2026
9a0b09f
chore: add image pull/list step before Trivy scan for GHCR verificati…
jaymyaka Feb 23, 2026
0cb1dca
chore: bump actions/download-artifact to v7 and aquasecurity/trivy-ac…
jaymyaka Feb 23, 2026
b6720f7
Update image reference for Trivy vulnerability scanner
jaymyaka Feb 23, 2026
fdc9284
Simplify Trivy image reference in workflow
jaymyaka Feb 23, 2026
e04b7d9
Change IMAGE_NAME to 'thedataenginex/dex'
jaymyaka Feb 23, 2026
0bf2f79
Update IMAGE_NAME to use repository owner dynamically
jaymyaka Feb 23, 2026
fd01329
Merge branch 'main' into dev
jaymyaka Feb 23, 2026
be5c3e0
Refactor Docker image tagging in CD workflow
jaymyaka Feb 23, 2026
ce5b4b8
Fix repository owner extraction in CD workflow
jaymyaka Feb 24, 2026
25f796b
fix: compute lowercase image name for GitHub Container Registry
github-actions[bot] Feb 27, 2026
d3d08a9
Merge branch 'main' into dev
jaymyaka Feb 27, 2026
2f59d72
fix: add login step for GitHub Container Registry in CD workflow
github-actions[bot] Feb 27, 2026
974743e
fix: improve Slack notification error handling and ensure webhook is set
github-actions[bot] Feb 27, 2026
bb818ef
fix: harden CI/CD security and deployment workflows (#109)
jaymyaka Feb 28, 2026
77f6984
refactor: simplify to 2-env branch-based deployment (dev/prod)
jaymyaka Feb 28, 2026
07fabf1
chore: update dev image to sha-77f6984b [skip ci]
github-actions[bot] Feb 28, 2026
76349fc
merge: resolve main conflicts (keep 2-env dev model)
github-actions[bot] Feb 28, 2026
eca077a
fix: remove preview-deploy.yml and fix docs-pages enablement
github-actions[bot] Feb 28, 2026
7cd9669
chore: update dev image to sha-eca077ab [skip ci] (#116)
github-actions[bot] Feb 28, 2026
de539be
feat: clean public API surface & stabilize exports (#86) (#126)
jaymyaka Feb 28, 2026
1865b43
chore: update dev image to sha-de539bec [skip ci] (#127)
github-actions[bot] Feb 28, 2026
0b003e0
feat: P1-high issues #87 #88 #89 #92 #93 — storage, ML serving, drift…
jaymyaka Mar 2, 2026
4040e9b
chore: update dev image to sha-0b003e0e [skip ci] (#129)
github-actions[bot] Mar 2, 2026
b2ebaa3
merge: resolve main into dev for clean promotion
github-actions[bot] Mar 2, 2026
516f9ac
chore: update dev image to sha-b2ebaa36 [skip ci] (#131)
github-actions[bot] Mar 2, 2026
1f544c9
feat: CareerDEX v0.5.0 — domain extraction, plugin system, ML modules…
jaymyaka Mar 12, 2026
fdca631
merge: resolve main into dev for clean promotion to main
github-actions[bot] Mar 12, 2026
71057ce
fix: boost test coverage to 83%+ (feature → dev) (#140)
jaymyaka Mar 12, 2026
ddd741a
chore: apply lint fixes and add claude settings
github-actions[bot] Mar 14, 2026
82d3494
merge: resolve main into dev for clean promotion
github-actions[bot] Mar 14, 2026
5c049c3
chore: trigger CI
github-actions[bot] Mar 14, 2026
32815a6
fix: correct import order for ruff isort
github-actions[bot] Mar 14, 2026
455bd15
chore: ignore I001 in test_plugins.py due to CI environment discrepancy
github-actions[bot] Mar 14, 2026
2da9106
fix: resolve merge conflict in examples/04_ml_training.py
github-actions[bot] Mar 14, 2026
ff54101
chore: strip careerdex/weatherdex, flatten repo, add examples 07-10, …
github-actions[bot] Mar 14, 2026
be9c577
chore: remove api-collection/ and infra/, flatten monitoring to root
github-actions[bot] Mar 14, 2026
8ee9a08
chore: flatten repo structure, strip legacy tooling and stale docs
github-actions[bot] Mar 15, 2026
ad25b38
chore: restore dependabot.yml for pip and github-actions
github-actions[bot] Mar 15, 2026
d72ee2d
uv lock upgrade
github-actions[bot] Mar 15, 2026
d475471
chore: sync dev with main after flatten-workspace squash
jaymyaka Mar 15, 2026
73a0606
chore: sync main-to-dev fixes — gitleaks allowlist, pre-commit dep, t…
jaymyaka Mar 15, 2026
d5c9ace
chore: resolve dev←main merge conflict (keep pre-commit dep from dev)
github-actions[bot] Mar 15, 2026
fb7a242
fix: restore pypi-publish, release, and security workflows (#154)
jaymyaka Mar 15, 2026
5912d38
feat: RAG/LLM wiring + bump GitHub Actions to Node.js 24 (#156)
jaymyaka Mar 15, 2026
1621c8b
chore: resolve dev←main conflict (keep bumped action versions from dev)
github-actions[bot] Mar 15, 2026
03efc25
chore: bump to 0.6.1 — include RAG/LLM features missed in 0.6.0 publi…
jaymyaka Mar 15, 2026
c5f49de
fix: pin apache-airflow<3.0.0 to resolve 8 Dependabot security alerts…
jaymyaka Mar 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: astral-sh/setup-uv@v5
- uses: astral-sh/setup-uv@v7
with:
version: "latest"
- uses: actions/setup-python@v6
Expand All @@ -28,7 +28,7 @@ jobs:
needs: lint
steps:
- uses: actions/checkout@v6
- uses: astral-sh/setup-uv@v5
- uses: astral-sh/setup-uv@v7
with:
version: "latest"
- uses: actions/setup-python@v6
Expand All @@ -42,7 +42,7 @@ jobs:
needs: [lint, typecheck]
steps:
- uses: actions/checkout@v6
- uses: astral-sh/setup-uv@v5
- uses: astral-sh/setup-uv@v7
with:
version: "latest"
- uses: actions/setup-python@v6
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/pypi-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ jobs:

steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
fetch-depth: 0

Expand Down Expand Up @@ -145,10 +145,10 @@ jobs:
TAG: ${{ needs.detect-dataenginex-changes.outputs.current_tag }}

- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@v6

- name: Set up Python 3.12
uses: actions/setup-python@v5
uses: actions/setup-python@v6
with:
python-version: "3.12"

Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/release-dataenginex.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ jobs:
SLACK_WEBHOOK: ${{ env.SLACK_WEBHOOK }}

- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
fetch-depth: 0
token: ${{ secrets.GITHUB_TOKEN }}
Expand Down Expand Up @@ -123,7 +123,7 @@ jobs:

- name: Set up Python for SBOM generation
if: steps.check_tag.outputs.tag_exists == 'false'
uses: actions/setup-python@v5
uses: actions/setup-python@v6
with:
python-version: "3.12"

Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/security.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ jobs:
SLACK_WEBHOOK: ${{ env.SLACK_WEBHOOK }}
REF: ${{ github.ref_name }}

- uses: actions/checkout@v4
- uses: actions/checkout@v6
- name: Run Trivy repo security scan
uses: aquasecurity/trivy-action@0.35.0
with:
Expand Down Expand Up @@ -82,7 +82,7 @@ jobs:
matrix:
language: [ python, actions ]
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- name: Initialize CodeQL
uses: github/codeql-action/init@v4
with:
Expand Down
9 changes: 6 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [0.6.1] - 2026-03-15

### Added

- **Plugin system** — `DataEngineXPlugin` ABC, `PluginRegistry` with register/get/all/health_check_all, `discover()` for auto-loading plugins via `importlib.metadata` entry_points (`dataenginex.plugins` group)
- **Streamlit dashboard** — `BaseDashboard` and `DashboardConfig` (Pydantic) with 4 reusable panels: pipeline status, quality scores, model drift, alerts. Optional `dashboard` dependency group (`streamlit>=1.40.0`)
- **Coverage gate** — `--cov-fail-under=80` enforced in `test-cov-core` poe task
- **`SentenceTransformerEmbedder`** — thin wrapper over `sentence-transformers` (`all-MiniLM-L6-v2` default). Install via `uv add 'dataenginex[ml]'`. Implements the `embed_fn` protocol for `RAGPipeline`.
- **`RAGPipeline.answer(question, llm, ...)`** — full retrieve → augment → generate loop in one call. Combines `build_context` with any `LLMProvider.generate_with_context`.
- **GitHub Actions upgraded to Node.js 24** — `ci.yml`, `pypi-publish.yml`, `release-dataenginex.yml`, `security.yml` now use `actions/checkout@v6`, `actions/setup-python@v6`, `astral-sh/setup-uv@v7`.
- **`examples/05_rag_demo.py`** — end-to-end RAG demo with `--embed`, `--llm`, `--model` CLI flags; Ollama fallback to MockProvider; uses `RAGPipeline.answer()`.

## [0.6.0] - 2026-03-03

Expand Down
159 changes: 93 additions & 66 deletions examples/05_rag_demo.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,83 +2,110 @@

Demonstrates:
1. Creating an in-memory vector store backend
2. Ingesting sample documents into a RAG pipeline
3. Querying the pipeline to retrieve relevant context
4. Using the MockProvider to generate an LLM response with context
2. Embedding documents with SentenceTransformerEmbedder (or hash fallback)
3. Ingesting documents into the RAG pipeline
4. Using RAGPipeline.answer() for the full retrieve → augment → generate loop
5. Swapping providers: MockProvider for tests, OllamaProvider for production

Run::
Run with hash-based embeddings (no extra deps)::

uv run python examples/05_rag_demo.py

Run with real sentence-transformer embeddings::

uv sync --extra ml
uv run python examples/05_rag_demo.py --embed sentence-transformers

Run against a live Ollama instance::

uv run python examples/05_rag_demo.py --llm ollama --model qwen3-coder:30b-a3b-q4_K_M
"""

from __future__ import annotations

from dataenginex.ml.llm import MockProvider
from dataenginex.ml.vectorstore import InMemoryBackend, RAGPipeline
import argparse

from dataenginex.ml.llm import MockProvider, OllamaProvider
from dataenginex.ml.vectorstore import InMemoryBackend, RAGPipeline, SentenceTransformerEmbedder

DOCS = [
(
"DataEngineX is a data engineering and ML platform. "
"It provides quality gates, medallion architecture, "
"and model lifecycle management."
),
(
"The medallion architecture organises data into three layers: "
"Bronze (raw ingestion), Silver (cleaned and validated), "
"and Gold (business-ready aggregations)."
),
(
"DataEngineX examples demonstrate end-to-end pipelines. "
"Examples 07-10 cover API ingestion, PySpark ML, "
"feature engineering, and model analysis."
),
(
"The DataEngineX ML module provides ModelRegistry, DriftDetector, "
"RAGPipeline, and LLM provider adapters for production ML workflows."
),
(
"Quality gates in DataEngineX enforce data completeness, "
"consistency, and freshness checks before data moves "
"between medallion layers."
),
]

QUERIES = [
"What is the medallion architecture?",
"How does the model registry work?",
"What are quality gates?",
]


def build_pipeline(use_sentence_transformers: bool) -> RAGPipeline:
if use_sentence_transformers:
embedder = SentenceTransformerEmbedder()
return RAGPipeline(store=InMemoryBackend(dimension=384), embed_fn=embedder, dimension=384)
print("Using hash-based embeddings (install dataenginex[ml] for real embeddings)\n")
return RAGPipeline(store=InMemoryBackend(dimension=64), dimension=64)


def main() -> None:
"""Run the RAG demo pipeline."""
# 1. Set up components
backend = InMemoryBackend(dimension=64)
pipeline = RAGPipeline(store=backend, dimension=64)
llm = MockProvider(default_response="Based on the provided context, here is my answer.")

# 2. Prepare sample documents
texts = [
(
"DataEngineX is a data engineering and ML platform. "
"It provides quality gates, medallion architecture, "
"and model lifecycle management."
),
(
"The medallion architecture organises data into three layers: "
"Bronze (raw ingestion), Silver (cleaned and validated), "
"and Gold (business-ready aggregations)."
),
(
"DataEngineX examples demonstrate end-to-end pipelines. "
"Examples 07-10 cover API ingestion, PySpark ML, "
"feature engineering, and model analysis."
),
(
"The DataEngineX ML module provides ModelRegistry, DriftDetector, "
"RAGPipeline, and LLM provider adapters for production ML workflows."
),
(
"Quality gates in DataEngineX enforce data completeness, "
"consistency, and freshness checks before data moves "
"between medallion layers."
),
]
doc_ids = ["doc-1", "doc-2", "doc-3", "doc-4", "doc-5"]

# 3. Ingest documents into the RAG pipeline
parser = argparse.ArgumentParser()
parser.add_argument("--embed", choices=["hash", "sentence-transformers"], default="hash")
parser.add_argument("--llm", choices=["mock", "ollama"], default="mock")
parser.add_argument("--model", default="qwen3-coder:30b-a3b-q4_K_M")
args = parser.parse_args()

# 1. Build pipeline
pipeline = build_pipeline(use_sentence_transformers=args.embed == "sentence-transformers")

# 2. Ingest
print("=== Ingesting documents ===")
count = pipeline.ingest(texts, ids=doc_ids)
print(f"Ingested {count} documents into the vector store.\n")

# 4. Query the pipeline
queries = [
"What is the medallion architecture?",
"How does CareerDEX work?",
"What are quality gates?",
]

for query in queries:
print(f"--- Query: {query} ---")

# Retrieve relevant context
context = pipeline.build_context(query, top_k=2)
print(f"Retrieved context ({len(context)} chars):\n{context[:200]}...\n")

# Generate response using the LLM with retrieved context
response = llm.generate_with_context(question=query, context=context)
print(f"LLM Response: {response.text}\n")

# 5. Show call history
print(f"=== LLM was called {len(llm.call_history)} times ===")
print("Done!")
count = pipeline.ingest(DOCS)
print(f"Stored {count} documents\n")

# 3. Choose LLM provider
if args.llm == "ollama":
llm = OllamaProvider(model=args.model)
if not llm.is_available():
print(
f"Ollama not reachable or model '{args.model}' not loaded — falling back to mock\n"
)
llm = MockProvider() # type: ignore[assignment]
else:
llm = MockProvider() # type: ignore[assignment]

print(f"LLM provider: {llm.__class__.__name__}\n")

# 4. Full RAG loop via RAGPipeline.answer()
for query in QUERIES:
print(f"Q: {query}")
response = pipeline.answer(query, llm, top_k=2)
print(f"A: {response.text[:300]}")
print(f" tokens={response.total_tokens} finish={response.finish_reason}\n")

print("Done.")


if __name__ == "__main__":
Expand Down
12 changes: 10 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "dataenginex"
version = "0.6.0"
version = "0.6.1"
description = "DataEngineX - Core framework for data engineering projects"
authors = [
{name = "Jay", email = "jayapal.myaka99@gmail.com"}
Expand Down Expand Up @@ -52,7 +52,7 @@ dev = [
data = [
"pyspark>=4.1.1",
"databricks-cli",
"apache-airflow>=2.8.0",
"apache-airflow>=2.8.0,<3.0.0",
"requests>=2.32.0",
]
notebook = [
Expand Down Expand Up @@ -115,6 +115,14 @@ ignore_missing_imports = true
module = ["boto3.*", "google.auth.*", "google.cloud.*", "pyarrow.*"]
ignore_missing_imports = true

[[tool.mypy.overrides]]
module = ["sentence_transformers.*"]
ignore_missing_imports = true

[[tool.mypy.overrides]]
module = ["dataenginex.ml.vectorstore"]
warn_unused_ignores = false # sentence-transformers optional: ignore used in CI, unused when installed

[[tool.mypy.overrides]]
module = ["dataenginex.lakehouse.storage"]
warn_unused_ignores = false # pre-commit installs google-cloud-storage (ignore used), CI does not (ignore unused)
Expand Down
2 changes: 1 addition & 1 deletion src/dataenginex/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
try:
__version__ = version("dataenginex")
except PackageNotFoundError:
__version__ = "0.6.0"
__version__ = "0.6.1"

# Re-export core symbols that don't require optional dependencies
from dataenginex.core import DataLayer, MedallionArchitecture, QualityGate
Expand Down
Loading
Loading