Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
33 changes: 33 additions & 0 deletions scripts/validate_manifest.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import importlib
import inspect
import itertools
import json
import re
import sys
import textwrap
Expand Down Expand Up @@ -3726,12 +3727,30 @@ def _parse_check_op(argv: list[str]) -> str | None:
return None


def _parse_json_output(argv: list[str]) -> str | None:
"""Parse ``--json-output <path>`` from argv."""
for i, arg in enumerate(argv):
if arg == "--json-output":
if i + 1 >= len(argv) or argv[i + 1].startswith("-"):
print("ERROR: --json-output requires a path argument")
sys.exit(2)
return argv[i + 1]
if arg.startswith("--json-output="):
value = arg.split("=", 1)[1]
if not value or value.startswith("-"):
print("ERROR: --json-output requires a path argument")
sys.exit(2)
return value
return None


def main() -> int:
import os

verbose = "--verbose" in sys.argv or "-v" in sys.argv
levels = _parse_levels(sys.argv)
check_op = _parse_check_op(sys.argv)
json_output = _parse_json_output(sys.argv)
strict_parity = (
"--strict" in sys.argv
or os.environ.get("MANIFEST_STRICT_BLOCKING", "") == "1"
Expand All @@ -3756,6 +3775,20 @@ def main() -> int:
strict_parity=strict_parity,
)

if json_output:
payload = {
"ok": not errors,
"error_count": len(errors),
"warning_count": len(warnings),
"errors": errors,
"warnings": warnings,
"levels": sorted(levels) if levels else "all",
"check_op": check_op,
"strict_parity": strict_parity,
}
Path(json_output).write_text(json.dumps(payload, indent=2), encoding="utf-8")
print(f"Wrote JSON manifest report to {json_output}")

if warnings:
print(f"\n{len(warnings)} warning(s):")
for w in warnings:
Expand Down
9 changes: 9 additions & 0 deletions tests/test_validate_manifest_json_output.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from scripts import validate_manifest


def test_parse_json_output_accepts_equals_form():
assert validate_manifest._parse_json_output(["x", "--json-output=out.json"]) == "out.json"


def test_parse_json_output_accepts_separate_value():
assert validate_manifest._parse_json_output(["x", "--json-output", "out.json"]) == "out.json"
Loading