Static analysis, dependency intelligence, and risk scoring for Airflow DAGs and dbt projects.
Not to be confused with PyDBTGuard or PyBeamGuard: PyAirflowTester validates Airflow DAGs (and dbt runs); PyDBTGuard analyzes dbt manifests; PyBeamGuard analyzes Beam/Dataflow pipelines.
Part of the Mullassery open-source family. These tools have similar names — here is the short version of who does what:
| If you need to… | Use |
|---|---|
| Build a repository's dependency graph and match it against vulnerability advisories (Python, Rust, Node, containers) | PyDeepMesh |
| Understand why a Python dependency exists, who added it, and whether it is actually used | PyDependencyCheck |
| Statically analyze a dbt project (risky tests, test blast radius, cost) | PyDBTGuard |
| Statically analyze Apache Beam / Dataflow pipelines (cost, hot keys, reliability) | PyBeamGuard |
| Validate Airflow DAGs and dbt runs | PyAirflowTester |
| Simulate cascading-failure blast radius across infrastructure, data pipelines, and AI systems | PyBlastRadius |
| Check the quality of the data itself at runtime (schema, drift, anomalies) | StatGuardian |
| Discover devices, services, and vulnerabilities on a network | PyNetworkIntel |
| Discover and score API security risk (real traffic, agent/MCP, Cedar policy) | PyAPICheck |
| Trace and root-cause AI agent failures | PyAgentHound |
| Diagnose RAG retrieval failures | PyVectorHound |
| Orchestrate local, dependency-aware tasks (DAG scheduler + content-addressed cache) | PyTaskWireCheck |
PyAirflowTester helps you catch reliability and security issues before deployment by statically analyzing Airflow DAGs, dbt manifests, and airflow.cfg. It builds a unified dependency graph to understand blast radius and impact, computes aggregate risk scores, and exports findings in formats suitable for CI (including SARIF for GitHub code scanning).
- Static analysis: 33 rules covering DAGs, dbt manifests, and Airflow configuration (secrets, SLAs, cycles, config issues, etc.).
- Unified dependency graph: Combines Airflow DAG edges with dbt lineage from
manifest.json. - Impact & blast radius: Understand what breaks downstream if a node changes.
- Risk scoring: Aggregate 0-100 risk score with filtering by severity.
- CI-friendly: JSON, HTML, and SARIF output for GitHub code scanning.
- Web dashboard: Optional FastAPI/uvicorn dashboard (
serve) to visualize graph and findings. - Library API: Dependency intelligence primitives for programmatic use (impact, blast radius, risk, observability helpers).
- CI gating: Fail builds on critical findings or low risk scores.
- Pre-deployment checks: Assess blast radius before changing high-impact nodes.
- Security reviews: Catch hardcoded secrets, risky configs, and missing guardrails.
- dbt + Airflow alignment: See end-to-end dependencies across orchestration and transformation.
- Technical debt tracking: Identify orphans, cycles, and untested/high-importance nodes.
- Not a live runtime correlator: The
Analyzer/connectpath for correlating against live Airflow metadata or dbt run history is explicitly stubbed (AnalyzerNotImplementedError). - Not a test runner: It analyzes structure and metadata, not executes DAGs or dbt tests.
- Pure Python by default: A Rust core exists in
src/but is not wired into the CLI and not shipped; building it is optional. - Alpha maturity: v0.5.2 - core scanning, graph analysis, and scoring are working; runtime correlation is planned.
Version 0.5.2. Core commands (scan, score, rules, dependency ..., serve) are functional. The runtime correlation feature is stubbed (not implemented). See ROADMAP_HONEST.md for details.
pip install pyairflowtesterWith web dashboard:
pip install "pyairflowtester[web]"From source:
git clone https://github.com/mullassery/pyairflowtester.git
cd pyairflowtester
pip install -e ".[dev]"Requires Python 3.10+.
# Scan current directory for DAGs, dbt, airflow.cfg
pyairflowtester scan . --dags dags/ --dbt dbt/ --airflow-cfg airflow.cfg
# Get aggregate risk score
pyairflowtester score . --dags dags/
# List all rules
pyairflowtester rules
# Build dependency graph and analyze blast radius
pyairflowtester dependency build --dags dags/ --dbt-manifest dbt/target/manifest.json
pyairflowtester dependency blast-radius -n dag_my_dag
# Launch web dashboard
pyairflowtester serve --port 8080from pyairflowtester.dependency_intelligence import (
UnifiedGraphBuilder,
ImpactAnalysisEngine,
BlastRadiusEngine,
)
graph = UnifiedGraphBuilder.build_unified_graph(
dag_files=["dags/my_dag.py"],
dbt_manifest="dbt/target/manifest.json",
)
impact = ImpactAnalysisEngine(graph).analyze("dag_my_dag")
print(f"Impact score: {impact.impact_score:.1%}, impacted: {len(impact.impacted_nodes)}")
blast = BlastRadiusEngine(graph).analyze(["dag_my_dag"])
print(f"Blast radius: {blast.blast_radius} nodes, deployable: {blast.deployable}")- ROADMAP_HONEST.md - Known limitations and planned work
- Contributing
- Security policy
- Code of conduct
- Changelog
Licensed under the Apache License, Version 2.0. See LICENSE for details.