From c2dec6cd05ab30483eb966850f25d94a4c7e27c1 Mon Sep 17 00:00:00 2001 From: Oleksandr Pavlyk <21087696+oleksandr-pavlyk@users.noreply.github.com> Date: Thu, 25 Jun 2026 13:14:26 -0500 Subject: [PATCH] Tighten nvbench-compare argument parsing Let argparse derive the program name from the actual invocation instead of hardcoding nvbench_compare, so help and error output match the installed nvbench-compare entry point. Declare comparison inputs as explicit positional arguments and use parse_args() instead of parse_known_args(). This preserves --dump-config without input files while rejecting unknown options through argparse rather than treating typoed flags as JSON paths. Add regression coverage for rejecting an unknown CLI option. --- python/scripts/nvbench_compare.py | 6 ++++-- python/test/test_nvbench_compare.py | 13 +++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/python/scripts/nvbench_compare.py b/python/scripts/nvbench_compare.py index 7dadcf5..1217bdc 100644 --- a/python/scripts/nvbench_compare.py +++ b/python/scripts/nvbench_compare.py @@ -2960,7 +2960,7 @@ def main() -> int: The number of detected regressions is reported in the summary output. """ help_text = "%(prog)s [reference.json compare.json | reference_dir/ compare_dir/]" - parser = argparse.ArgumentParser(prog="nvbench_compare", usage=help_text) + parser = argparse.ArgumentParser(usage=help_text) parser.add_argument( "--ignore-devices", dest="ignore_devices", @@ -3054,8 +3054,10 @@ def main() -> int: action=OrderedBenchmarkFilterAction, help="Filter by benchmark name (can repeat)", ) + parser.add_argument("files_or_dirs", nargs="*") - args, files_or_dirs = parser.parse_known_args() + args = parser.parse_args() + files_or_dirs = args.files_or_dirs try: comparison_preset, comparison_thresholds = resolve_comparison_thresholds( args.preset, args.config diff --git a/python/test/test_nvbench_compare.py b/python/test/test_nvbench_compare.py index a9ea5b6..96e4a67 100644 --- a/python/test/test_nvbench_compare.py +++ b/python/test/test_nvbench_compare.py @@ -1969,6 +1969,19 @@ def test_main_dump_config_merges_config_and_cli_preset( assert "sample_coverage = 0.93" in output +def test_main_rejects_unknown_options(monkeypatch, nvbench_compare): + monkeypatch.setattr( + sys, + "argv", + ["nvbench_compare", "--dispaly", "explain", "ref.json", "cmp.json"], + ) + + with pytest.raises(SystemExit) as exc_info: + nvbench_compare.main() + + assert exc_info.value.code == 2 + + def test_main_prints_bulk_debug_python_to_stdout(monkeypatch, capsys, nvbench_compare): devices = [{"id": 0, "name": "Test GPU"}] root = {