Metadata-Version: 2.4
Name: crml-lang
Version: 1.2.1
Summary: CRML language/spec models, schema validator, and YAML IO
Author: Zeron Research Labs
Project-URL: Homepage, https://github.com/Faux16/crml
Project-URL: Repository, https://github.com/Faux16/crml
Project-URL: Documentation, https://faux16.github.io/crml/
Classifier: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Requires-Python: >=3.9
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: pyyaml
Requires-Dist: jsonschema
Requires-Dist: pydantic
Provides-Extra: dev
Requires-Dist: pytest; extra == "dev"
Provides-Extra: xlsx
Requires-Dist: openpyxl>=3.1; extra == "xlsx"
Provides-Extra: oscal
Requires-Dist: compliance-trestle<4,>=3; extra == "oscal"
Dynamic: license-file

# crml-lang

Language/spec package for CRML.

- Pydantic models for CRML documents
- Bundled JSON Schema + structured validator
- YAML load/dump helpers (`CRScenario`, `CRPortfolio`)

## Quickstart

Validate a scenario document:

```python
from crml_lang import validate

report = validate("examples/scenarios/data-breach-simple.yaml", source_kind="path")
print(report.ok)
```

Load and work with typed models:

```python
from crml_lang import CRScenario

scenario = CRScenario.load_from_yaml("examples/scenarios/data-breach-simple.yaml")
print(scenario.meta.name)
```

Bundle a portfolio (inline referenced scenarios/packs into a self-contained artifact):

```python
from crml_lang import bundle_portfolio

report = bundle_portfolio("examples/portfolios/portfolio.yaml", source_kind="path")
print(report.ok)

bundle = report.bundle
assert bundle is not None
```

Bundle from in-memory models (no filesystem access required):

```python
from crml_lang import CRPortfolio, CRScenario, bundle_portfolio

portfolio = CRPortfolio.load_from_yaml("examples/portfolios/portfolio.yaml")
scenario = CRScenario.load_from_yaml("examples/scenarios/data-breach-simple.yaml")

report = bundle_portfolio(
	portfolio,
	source_kind="model",
	scenarios={"s1": scenario},
)
print(report.ok)
```

Plan a portfolio (deterministic engine pipeline step):

```python
from crml_engine.pipeline import plan_portfolio

plan = plan_portfolio("examples/portfolios/portfolio.yaml", source_kind="path")
print(plan.ok)
```
