From a3ae8f98b185673439fcb78b8c3b6d84bc65799f Mon Sep 17 00:00:00 2001 From: devin huang <290318189+devinhuang2001@users.noreply.github.com> Date: Mon, 9 Nov 2026 15:46:48 +0800 Subject: [PATCH] fix(gaudi): default the plugin version when metadata has no Version `get_gaudi_sw_version` only assigns `gaudi_version` inside the `if` that checks for a truthy `Version` field. When `metadata("habana-torch-plugin")` succeeds but reports no `Version` (or an empty one), the function falls through to `return gaudi_version` with nothing bound: UnboundLocalError: cannot access local variable 'gaudi_version' The lookup also runs at import time via `GAUDI_SW_VER = get_gaudi_sw_version()`, so that payload makes `import bitsandbytes` fail outright instead of simply reporting an unknown Gaudi version. Initialize the variable to None so the error case degrades to "version unknown". Signed-off-by: devin huang <290318189+devinhuang2001@users.noreply.github.com> --- bitsandbytes/backends/utils.py | 1 + tests/test_gaudi_version.py | 46 ++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 tests/test_gaudi_version.py diff --git a/bitsandbytes/backends/utils.py b/bitsandbytes/backends/utils.py index a63e59a99..703402ce1 100644 --- a/bitsandbytes/backends/utils.py +++ b/bitsandbytes/backends/utils.py @@ -79,6 +79,7 @@ def get_gaudi_sw_version(): """ Returns the installed version of Gaudi SW. """ + gaudi_version = None try: # if we find the spec, examine the installed version plugin_metadata = metadata("habana-torch-plugin") diff --git a/tests/test_gaudi_version.py b/tests/test_gaudi_version.py new file mode 100644 index 000000000..95b846af4 --- /dev/null +++ b/tests/test_gaudi_version.py @@ -0,0 +1,46 @@ +""" +Regression tests for the optional Gaudi plugin version lookup. + +``get_gaudi_sw_version`` runs at import time (``GAUDI_SW_VER``), so a metadata +payload without a ``Version`` key must resolve to ``None`` instead of raising. +""" + +from importlib.metadata import PackageNotFoundError + +from packaging import version +import pytest + +from bitsandbytes.backends import utils + + +def _metadata_returning(mapping): + def _get(_name): + return mapping + + return _get + + +def test_version_is_none_when_package_is_missing(monkeypatch): + def missing(_name): + raise PackageNotFoundError("habana-torch-plugin") + + monkeypatch.setattr(utils, "metadata", missing) + assert utils.get_gaudi_sw_version() is None + + +@pytest.mark.parametrize( + "package_metadata", + [ + {}, + {"Name": "habana-torch-plugin"}, + {"Version": ""}, + ], +) +def test_version_is_none_when_metadata_has_no_version(monkeypatch, package_metadata): + monkeypatch.setattr(utils, "metadata", _metadata_returning(package_metadata)) + assert utils.get_gaudi_sw_version() is None + + +def test_version_is_parsed_from_metadata(monkeypatch): + monkeypatch.setattr(utils, "metadata", _metadata_returning({"Version": "1.21.0"})) + assert utils.get_gaudi_sw_version() == version.parse("1.21.0")