Initial schemas and validation with extension workplan

This commit is contained in:
2026-05-03 22:12:46 +02:00
parent b96b1fb745
commit 8c9129c371
15 changed files with 1025 additions and 2 deletions

View File

@@ -9,6 +9,7 @@ import click
import yaml
from markitect_tool.core import parse_markdown_file
from markitect_tool.schema import load_schema_file, validate_markdown_file, validate_schema
@click.group()
@@ -40,5 +41,66 @@ def parse(file: Path, output_format: str) -> None:
click.echo(json.dumps(data, indent=2, ensure_ascii=False))
@main.command()
@click.argument("file", type=click.Path(exists=True, dir_okay=False, path_type=Path))
@click.option(
"--schema",
"schema_file",
required=True,
type=click.Path(exists=True, dir_okay=False, path_type=Path),
)
@click.option(
"--format",
"output_format",
type=click.Choice(["json", "yaml", "text"], case_sensitive=False),
default="text",
show_default=True,
)
def validate(file: Path, schema_file: Path, output_format: str) -> None:
"""Validate a Markdown file against a Markdown schema file."""
result = validate_markdown_file(file, schema_file)
_emit_result(result.to_dict(), output_format)
raise click.exceptions.Exit(0 if result.valid else 1)
@main.group()
def schema() -> None:
"""Work with Markdown schema files."""
@schema.command("validate")
@click.argument("schema_file", type=click.Path(exists=True, dir_okay=False, path_type=Path))
@click.option(
"--format",
"output_format",
type=click.Choice(["json", "yaml", "text"], case_sensitive=False),
default="text",
show_default=True,
)
def schema_validate(schema_file: Path, output_format: str) -> None:
"""Validate that a Markdown schema contains a well-formed JSON Schema."""
loaded = load_schema_file(schema_file)
result = validate_schema(loaded.schema)
data = result.to_dict() | {"schema_path": str(schema_file)}
_emit_result(data, output_format)
raise click.exceptions.Exit(0 if result.valid else 1)
def _emit_result(data: dict, output_format: str) -> None:
if output_format == "json":
click.echo(json.dumps(data, indent=2, ensure_ascii=False))
elif output_format == "yaml":
click.echo(yaml.safe_dump(data, sort_keys=False))
else:
if data.get("valid"):
click.echo("valid")
else:
click.echo("invalid")
for violation in data.get("violations", []):
click.echo(f"- {violation['path']}: {violation['message']}")
if __name__ == "__main__":
main()