From a8cdc7d6cdd9ba02f5f59d21c6dd2b5b85a7bb0b Mon Sep 17 00:00:00 2001 From: Rupayon Haldar Date: Thu, 11 Jun 2026 23:08:20 -0400 Subject: [PATCH 1/3] Add CLI version flag --- src/modelinfo/cli.py | 15 +++++++++++++++ tests/test_cli.py | 12 ++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 tests/test_cli.py diff --git a/src/modelinfo/cli.py b/src/modelinfo/cli.py index 474bfd3..8fb7d3d 100644 --- a/src/modelinfo/cli.py +++ b/src/modelinfo/cli.py @@ -2,8 +2,10 @@ import json import os import sys +from importlib.metadata import PackageNotFoundError, version from typing import Sequence +from modelinfo import __version__ from modelinfo.architecture import identify_architecture_name from modelinfo.calculator import calculate_footprint from modelinfo.parsers.gguf import parse_gguf_header @@ -12,6 +14,13 @@ from modelinfo.ui import console, print_model_info, print_compare_info +def package_version() -> str: + try: + return version("modelinfo-cli") + except PackageNotFoundError: + return __version__ + + def parse_args(argv: Sequence[str] | None = None) -> argparse.Namespace: parser = argparse.ArgumentParser( prog="modelinfo", @@ -72,6 +81,12 @@ def parse_args(argv: Sequence[str] | None = None) -> argparse.Namespace: default=0.9, help="vLLM gpu_memory_utilization ratio (default 0.9). Reserves 10 percent for PyTorch context.", ) + parser.add_argument( + "-v", + "--version", + action="version", + version=f"%(prog)s {package_version()}", + ) return parser.parse_args(argv) diff --git a/tests/test_cli.py b/tests/test_cli.py new file mode 100644 index 0000000..1a29100 --- /dev/null +++ b/tests/test_cli.py @@ -0,0 +1,12 @@ +import pytest + +from modelinfo import __version__ +from modelinfo.cli import parse_args + + +def test_version_flag_prints_installed_version(capsys): + with pytest.raises(SystemExit) as exc_info: + parse_args(["--version"]) + + assert exc_info.value.code == 0 + assert f"modelinfo {__version__}" in capsys.readouterr().out From 7b9d1fb634523a72b085c8a42990dc1e9958275b Mon Sep 17 00:00:00 2001 From: Felipe Arce Date: Sat, 13 Jun 2026 00:46:05 -0400 Subject: [PATCH 2/3] fix: defer importlib.metadata import for faster startup --- src/modelinfo/cli.py | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/src/modelinfo/cli.py b/src/modelinfo/cli.py index 8fb7d3d..35c0028 100644 --- a/src/modelinfo/cli.py +++ b/src/modelinfo/cli.py @@ -2,10 +2,7 @@ import json import os import sys -from importlib.metadata import PackageNotFoundError, version from typing import Sequence - -from modelinfo import __version__ from modelinfo.architecture import identify_architecture_name from modelinfo.calculator import calculate_footprint from modelinfo.parsers.gguf import parse_gguf_header @@ -14,11 +11,26 @@ from modelinfo.ui import console, print_model_info, print_compare_info -def package_version() -> str: - try: - return version("modelinfo-cli") - except PackageNotFoundError: - return __version__ +class VersionAction(argparse.Action): + def __init__(self, option_strings, dest=argparse.SUPPRESS, default=argparse.SUPPRESS, help="show program's version number and exit"): + super().__init__( + option_strings=option_strings, + dest=dest, + default=default, + nargs=0, + help=help, + ) + + def __call__(self, parser, namespace, values, option_string=None): + from importlib.metadata import PackageNotFoundError, version + from modelinfo import __version__ + + try: + ver = version("modelinfo-cli") + except PackageNotFoundError: + ver = __version__ + + parser.exit(message=f"{parser.prog} {ver}\n") def parse_args(argv: Sequence[str] | None = None) -> argparse.Namespace: @@ -84,8 +96,7 @@ def parse_args(argv: Sequence[str] | None = None) -> argparse.Namespace: parser.add_argument( "-v", "--version", - action="version", - version=f"%(prog)s {package_version()}", + action=VersionAction, ) return parser.parse_args(argv) From d8f791a1c2b7a7a2f8cdc1c83d33155847053b95 Mon Sep 17 00:00:00 2001 From: Felipe Arce Date: Sat, 13 Jun 2026 01:02:21 -0400 Subject: [PATCH 3/3] fix: print version to stdout instead of stderr --- src/modelinfo/cli.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/modelinfo/cli.py b/src/modelinfo/cli.py index 35c0028..18aa340 100644 --- a/src/modelinfo/cli.py +++ b/src/modelinfo/cli.py @@ -30,7 +30,8 @@ def __call__(self, parser, namespace, values, option_string=None): except PackageNotFoundError: ver = __version__ - parser.exit(message=f"{parser.prog} {ver}\n") + print(f"{parser.prog} {ver}") + parser.exit() def parse_args(argv: Sequence[str] | None = None) -> argparse.Namespace: