Turn a rejected rendering into an assertion instead of an exit (#3037)

This commit is contained in:
fzyzcjy
2026-09-26 20:27:04 +08:00
committed by GitHub
parent 7ed1bf04dd
commit 26deee7e7f
+8 -1
View File
@@ -108,7 +108,7 @@ def render_cli_argv(
continue
argv.extend(render(name, value))
parsed = from_parsed(make_parser().parse_args(argv))
parsed = from_parsed(_parse_without_exiting(make_parser(), argv))
mismatch = _describe_mismatch(parsed, expected_obj, uncompared_fields=uncompared_fields)
assert not mismatch, f"cli argv roundtrip mismatch on {mismatch}"
return argv
@@ -129,6 +129,13 @@ def _record_field_names(record) -> tuple[str, ...]:
return tuple(field.name for field in msgspec.structs.fields(record))
def _parse_without_exiting(parser: argparse.ArgumentParser, argv: list[str]) -> argparse.Namespace:
try:
return parser.parse_args(argv)
except SystemExit as exiting:
raise AssertionError(f"the argument parser rejects the rendered {shlex.join(argv)}") from exiting
def _describe_mismatch(parsed: _ArgsT, wanted: _ArgsT, *, uncompared_fields: frozenset[str]) -> str:
return ", ".join(
f"{name}: parsed {getattr(parsed, name)!r} != wanted {getattr(wanted, name)!r}"