Metadata-Version: 2.4
Name: semantic-risk-engine
Version: 0.1.0
Summary: Detect semantic SQL changes and estimate deterministic risk.
License: MIT
Project-URL: Source Code, https://github.com/badaadata/semantic-risk-engine
Project-URL: Bug Tracker, https://github.com/badaadata/semantic-risk-engine/issues
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Topic :: Database
Requires-Python: >=3.11
Description-Content-Type: text/markdown
Requires-Dist: pydantic<3.0,>=2.0
Requires-Dist: sqlglot<31.0,>=25.0
Requires-Dist: typer<1.0,>=0.9
Provides-Extra: dbt
Requires-Dist: pyyaml<7.0,>=6.0; extra == "dbt"
Requires-Dist: requests<3.0,>=2.28; extra == "dbt"
Provides-Extra: api
Requires-Dist: fastapi<1.0,>=0.111; extra == "api"
Requires-Dist: uvicorn[standard]<1.0,>=0.29; extra == "api"
Requires-Dist: slowapi>=0.1.9; extra == "api"
Requires-Dist: sqlalchemy<3.0,>=2.0; extra == "api"
Requires-Dist: bcrypt<5.0,>=4.1; extra == "api"
Requires-Dist: python-dotenv<2.0,>=1.0; extra == "api"
Requires-Dist: pydantic-settings<3.0,>=2.0; extra == "api"
Requires-Dist: psycopg[binary]<4.0,>=3.1; extra == "api"

# Semantic Risk Engine

Detect semantic SQL changes and compute deterministic risk classifications.

## Installation

```bash
pip install semantic-risk-engine
# or with uv
uv add semantic-risk-engine
```

## Python API quickstart

```python
from semantic_engine import DiffEngine, RiskEngine

old_sql = "SELECT id, name FROM users WHERE active = 1"
new_sql = "SELECT id FROM users"

diff = DiffEngine().diff(old_sql, new_sql, dialect="snowflake")
report = RiskEngine().compute_risk(diff)

for item in report.high:
    print(f"HIGH: {item.change.identifier}")
    print(f"  {item.reason}")
```

For type annotations, import from `semantic_engine.models`:

```python
from semantic_engine.models import SemanticDiff, RiskReport, RiskItem, Change
```

## How it works

SQL is parsed into a sqlglot AST and extracted into a normalized SemanticModel (tables, joins,
columns, filters, aggregations, window functions, CTEs, subqueries). Two SemanticModels are
diffed to produce a SemanticDiff — a structured list of semantic changes. Each change is
classified into HIGH / MEDIUM / LOW / INFO risk based on data-contract impact rules. No query
execution, no database connections — pure static analysis.

## CLI

```bash
semantic-risk-engine diff old.sql new.sql
semantic-risk-engine diff old.sql new.sql --dialect bigquery
```

Options:

- `--dialect` — sqlglot dialect name (default: `snowflake`)

## Dialect support

The `dialect` parameter defaults to `"snowflake"` and accepts any sqlglot dialect string, for
example `"bigquery"`, `"spark"`, `"duckdb"`, `"postgres"`. Output expressions are rendered in
the specified dialect.

## Development

Run tests:

```bash
uv run pytest
```

Run one test file:

```bash
uv run pytest tests/test_diff_engine.py
```

Lint:

```bash
uv run ruff check .
uv run ruff format --check .
```

See [CONTRIBUTING.md](CONTRIBUTING.md) for contribution guidelines.
