From b5fd7d0faad612e1689abb83a94615a3d0b0ff51 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Mon, 16 Mar 2026 02:39:48 +0000 Subject: [PATCH 1/7] test: Add tests for `get_version` function Added comprehensive unit tests for `get_version` in `tests/unit/test_init.py`. The tests verify that all mechanisms to retrieve the package version function as intended: - Reading `codeweaver._version.__version__` - Using `importlib.metadata.version` - Falling back to `git describe` - Handling missing `git` command - Handling broader unexpected exceptions All fallback scenarios now properly ensure the code returns the default `0.0.0` string or the valid version. No functional code was changed, only new tests were introduced. Co-authored-by: bashandbone <89049923+bashandbone@users.noreply.github.com> --- tests/unit/test_init.py | 106 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 tests/unit/test_init.py diff --git a/tests/unit/test_init.py b/tests/unit/test_init.py new file mode 100644 index 00000000..69ae5b9f --- /dev/null +++ b/tests/unit/test_init.py @@ -0,0 +1,106 @@ +import importlib.metadata +import shutil +import subprocess +import sys +from unittest.mock import MagicMock + +import pytest + +from codeweaver import get_version + +def test_get_version_from_version_file(monkeypatch): + """Test getting version from codeweaver._version.__version__.""" + # We need to mock sys.modules to simulate codeweaver._version being importable + mock_module = MagicMock() + mock_module.__version__ = "1.2.3-file" + monkeypatch.setitem(sys.modules, "codeweaver._version", mock_module) + + assert get_version() == "1.2.3-file" + +def test_get_version_from_importlib_metadata(monkeypatch): + """Test getting version from importlib.metadata.""" + # Mock codeweaver._version to not exist + monkeypatch.setitem(sys.modules, "codeweaver._version", None) + + # Mock importlib.metadata.version to return our version + def mock_version(pkg_name): + if pkg_name == "code-weaver": + return "1.2.3-metadata" + raise importlib.metadata.PackageNotFoundError("code-weaver") + + monkeypatch.setattr(importlib.metadata, "version", mock_version) + + assert get_version() == "1.2.3-metadata" + +def test_get_version_from_git_success(monkeypatch): + """Test getting version from git describe.""" + # Mock codeweaver._version to not exist + monkeypatch.setitem(sys.modules, "codeweaver._version", None) + + # Mock importlib.metadata.version to raise PackageNotFoundError + def mock_version(pkg_name): + raise importlib.metadata.PackageNotFoundError("code-weaver") + monkeypatch.setattr(importlib.metadata, "version", mock_version) + + # Mock shutil.which to return a git path + monkeypatch.setattr(shutil, "which", lambda cmd: "/usr/bin/git" if cmd == "git" else None) + + # Mock subprocess.run to return successful git describe + mock_result = MagicMock() + mock_result.returncode = 0 + mock_result.stdout = "1.2.3-git\n" + + def mock_run(*args, **kwargs): + if args[0][0] == "/usr/bin/git" and args[0][1] == "describe": + return mock_result + return MagicMock(returncode=1) + + monkeypatch.setattr(subprocess, "run", mock_run) + + assert get_version() == "1.2.3-git" + +def test_get_version_from_git_failure(monkeypatch): + """Test git describe fails and returns 0.0.0.""" + monkeypatch.setitem(sys.modules, "codeweaver._version", None) + def mock_version(pkg_name): + raise importlib.metadata.PackageNotFoundError("code-weaver") + monkeypatch.setattr(importlib.metadata, "version", mock_version) + + monkeypatch.setattr(shutil, "which", lambda cmd: "/usr/bin/git" if cmd == "git" else None) + + # Mock subprocess.run to fail + mock_result = MagicMock() + mock_result.returncode = 1 + + def mock_run(*args, **kwargs): + return mock_result + + monkeypatch.setattr(subprocess, "run", mock_run) + + assert get_version() == "0.0.0" + +def test_get_version_no_git(monkeypatch): + """Test git is not installed, returns 0.0.0.""" + monkeypatch.setitem(sys.modules, "codeweaver._version", None) + def mock_version(pkg_name): + raise importlib.metadata.PackageNotFoundError("code-weaver") + monkeypatch.setattr(importlib.metadata, "version", mock_version) + + # Mock shutil.which to return None + monkeypatch.setattr(shutil, "which", lambda cmd: None) + + assert get_version() == "0.0.0" + +def test_get_version_exception(monkeypatch): + """Test general exception in git block returns 0.0.0.""" + monkeypatch.setitem(sys.modules, "codeweaver._version", None) + def mock_version(pkg_name): + raise importlib.metadata.PackageNotFoundError("code-weaver") + monkeypatch.setattr(importlib.metadata, "version", mock_version) + + # Mock shutil.which to raise an exception + def mock_which(cmd): + raise RuntimeError("Something went wrong") + monkeypatch.setattr(shutil, "which", mock_which) + + assert get_version() == "0.0.0" From 365de2ec1e26ce2074bca0ac9d48f2ce10a82c02 Mon Sep 17 00:00:00 2001 From: Adam Poulemanos <89049923+bashandbone@users.noreply.github.com> Date: Mon, 16 Mar 2026 09:13:08 -0400 Subject: [PATCH 2/7] Apply suggestions from code review Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com> Signed-off-by: Adam Poulemanos <89049923+bashandbone@users.noreply.github.com> --- tests/unit/test_init.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/tests/unit/test_init.py b/tests/unit/test_init.py index 69ae5b9f..c2419801 100644 --- a/tests/unit/test_init.py +++ b/tests/unit/test_init.py @@ -4,8 +4,6 @@ import sys from unittest.mock import MagicMock -import pytest - from codeweaver import get_version def test_get_version_from_version_file(monkeypatch): @@ -17,10 +15,11 @@ def test_get_version_from_version_file(monkeypatch): assert get_version() == "1.2.3-file" + def test_get_version_from_importlib_metadata(monkeypatch): """Test getting version from importlib.metadata.""" # Mock codeweaver._version to not exist - monkeypatch.setitem(sys.modules, "codeweaver._version", None) + monkeypatch.delitem(sys.modules, "codeweaver._version", raising=False) # Mock importlib.metadata.version to return our version def mock_version(pkg_name): @@ -32,10 +31,11 @@ def mock_version(pkg_name): assert get_version() == "1.2.3-metadata" + def test_get_version_from_git_success(monkeypatch): """Test getting version from git describe.""" # Mock codeweaver._version to not exist - monkeypatch.setitem(sys.modules, "codeweaver._version", None) + monkeypatch.delitem(sys.modules, "codeweaver._version", raising=False) # Mock importlib.metadata.version to raise PackageNotFoundError def mock_version(pkg_name): @@ -59,9 +59,10 @@ def mock_run(*args, **kwargs): assert get_version() == "1.2.3-git" + def test_get_version_from_git_failure(monkeypatch): """Test git describe fails and returns 0.0.0.""" - monkeypatch.setitem(sys.modules, "codeweaver._version", None) + monkeypatch.delitem(sys.modules, "codeweaver._version", raising=False) def mock_version(pkg_name): raise importlib.metadata.PackageNotFoundError("code-weaver") monkeypatch.setattr(importlib.metadata, "version", mock_version) @@ -71,6 +72,8 @@ def mock_version(pkg_name): # Mock subprocess.run to fail mock_result = MagicMock() mock_result.returncode = 1 + mock_result.stdout = "" + mock_result.stderr = "" def mock_run(*args, **kwargs): return mock_result @@ -79,9 +82,10 @@ def mock_run(*args, **kwargs): assert get_version() == "0.0.0" + def test_get_version_no_git(monkeypatch): """Test git is not installed, returns 0.0.0.""" - monkeypatch.setitem(sys.modules, "codeweaver._version", None) + monkeypatch.delitem(sys.modules, "codeweaver._version", raising=False) def mock_version(pkg_name): raise importlib.metadata.PackageNotFoundError("code-weaver") monkeypatch.setattr(importlib.metadata, "version", mock_version) @@ -91,9 +95,10 @@ def mock_version(pkg_name): assert get_version() == "0.0.0" + def test_get_version_exception(monkeypatch): """Test general exception in git block returns 0.0.0.""" - monkeypatch.setitem(sys.modules, "codeweaver._version", None) + monkeypatch.delitem(sys.modules, "codeweaver._version", raising=False) def mock_version(pkg_name): raise importlib.metadata.PackageNotFoundError("code-weaver") monkeypatch.setattr(importlib.metadata, "version", mock_version) From 107ad2b72b47787161906f11711fb0775c0d6749 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Mon, 16 Mar 2026 13:45:15 +0000 Subject: [PATCH 3/7] test: Add tests for `get_version` function Added unit tests for `get_version` in `tests/unit/test_init.py`. The tests verify that all mechanisms to retrieve the package version function as intended: - Reading `codeweaver._version.__version__` - Using `importlib.metadata.version` - Falling back to `git describe` - Handling missing `git` command - Handling broader unexpected exceptions Uses `monkeypatch` safely by keeping original references to avoid polluting the global namespace and Pytest internal packages. No functional code changes. Co-authored-by: bashandbone <89049923+bashandbone@users.noreply.github.com> --- tests/unit/test_init.py | 57 +++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 30 deletions(-) diff --git a/tests/unit/test_init.py b/tests/unit/test_init.py index c2419801..f3d1e511 100644 --- a/tests/unit/test_init.py +++ b/tests/unit/test_init.py @@ -4,76 +4,71 @@ import sys from unittest.mock import MagicMock +import pytest + from codeweaver import get_version +# Store the original version function to fall back to it for other packages +_original_version = importlib.metadata.version + def test_get_version_from_version_file(monkeypatch): """Test getting version from codeweaver._version.__version__.""" - # We need to mock sys.modules to simulate codeweaver._version being importable mock_module = MagicMock() mock_module.__version__ = "1.2.3-file" monkeypatch.setitem(sys.modules, "codeweaver._version", mock_module) assert get_version() == "1.2.3-file" - def test_get_version_from_importlib_metadata(monkeypatch): """Test getting version from importlib.metadata.""" - # Mock codeweaver._version to not exist - monkeypatch.delitem(sys.modules, "codeweaver._version", raising=False) + monkeypatch.setitem(sys.modules, "codeweaver._version", None) - # Mock importlib.metadata.version to return our version def mock_version(pkg_name): if pkg_name == "code-weaver": return "1.2.3-metadata" - raise importlib.metadata.PackageNotFoundError("code-weaver") + return _original_version(pkg_name) monkeypatch.setattr(importlib.metadata, "version", mock_version) assert get_version() == "1.2.3-metadata" - def test_get_version_from_git_success(monkeypatch): """Test getting version from git describe.""" - # Mock codeweaver._version to not exist - monkeypatch.delitem(sys.modules, "codeweaver._version", raising=False) + monkeypatch.setitem(sys.modules, "codeweaver._version", None) - # Mock importlib.metadata.version to raise PackageNotFoundError def mock_version(pkg_name): - raise importlib.metadata.PackageNotFoundError("code-weaver") + if pkg_name == "code-weaver": + raise importlib.metadata.PackageNotFoundError("code-weaver") + return _original_version(pkg_name) monkeypatch.setattr(importlib.metadata, "version", mock_version) - # Mock shutil.which to return a git path monkeypatch.setattr(shutil, "which", lambda cmd: "/usr/bin/git" if cmd == "git" else None) - # Mock subprocess.run to return successful git describe mock_result = MagicMock() mock_result.returncode = 0 mock_result.stdout = "1.2.3-git\n" def mock_run(*args, **kwargs): - if args[0][0] == "/usr/bin/git" and args[0][1] == "describe": - return mock_result - return MagicMock(returncode=1) + return mock_result monkeypatch.setattr(subprocess, "run", mock_run) assert get_version() == "1.2.3-git" - def test_get_version_from_git_failure(monkeypatch): """Test git describe fails and returns 0.0.0.""" - monkeypatch.delitem(sys.modules, "codeweaver._version", raising=False) + monkeypatch.setitem(sys.modules, "codeweaver._version", None) + def mock_version(pkg_name): - raise importlib.metadata.PackageNotFoundError("code-weaver") + if pkg_name == "code-weaver": + raise importlib.metadata.PackageNotFoundError("code-weaver") + return _original_version(pkg_name) monkeypatch.setattr(importlib.metadata, "version", mock_version) monkeypatch.setattr(shutil, "which", lambda cmd: "/usr/bin/git" if cmd == "git" else None) - # Mock subprocess.run to fail mock_result = MagicMock() mock_result.returncode = 1 - mock_result.stdout = "" - mock_result.stderr = "" def mock_run(*args, **kwargs): return mock_result @@ -82,28 +77,30 @@ def mock_run(*args, **kwargs): assert get_version() == "0.0.0" - def test_get_version_no_git(monkeypatch): """Test git is not installed, returns 0.0.0.""" - monkeypatch.delitem(sys.modules, "codeweaver._version", raising=False) + monkeypatch.setitem(sys.modules, "codeweaver._version", None) + def mock_version(pkg_name): - raise importlib.metadata.PackageNotFoundError("code-weaver") + if pkg_name == "code-weaver": + raise importlib.metadata.PackageNotFoundError("code-weaver") + return _original_version(pkg_name) monkeypatch.setattr(importlib.metadata, "version", mock_version) - # Mock shutil.which to return None monkeypatch.setattr(shutil, "which", lambda cmd: None) assert get_version() == "0.0.0" - def test_get_version_exception(monkeypatch): """Test general exception in git block returns 0.0.0.""" - monkeypatch.delitem(sys.modules, "codeweaver._version", raising=False) + monkeypatch.setitem(sys.modules, "codeweaver._version", None) + def mock_version(pkg_name): - raise importlib.metadata.PackageNotFoundError("code-weaver") + if pkg_name == "code-weaver": + raise importlib.metadata.PackageNotFoundError("code-weaver") + return _original_version(pkg_name) monkeypatch.setattr(importlib.metadata, "version", mock_version) - # Mock shutil.which to raise an exception def mock_which(cmd): raise RuntimeError("Something went wrong") monkeypatch.setattr(shutil, "which", mock_which) From 1ad81ea8c361eb1d669e10d491e9afd5904a2db5 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Mon, 16 Mar 2026 14:23:03 +0000 Subject: [PATCH 4/7] test: Add tests for `get_version` function Added comprehensive unit tests for `get_version` in `tests/unit/test_init.py`. The tests verify that all mechanisms to retrieve the package version function as intended: - Reading `codeweaver._version.__version__` - Using `importlib.metadata.version` - Falling back to `git describe` - Handling missing `git` command - Handling broader unexpected exceptions Uses `monkeypatch` safely by keeping original references to avoid polluting the global namespace and Pytest internal packages. No functional code changes. Co-authored-by: bashandbone <89049923+bashandbone@users.noreply.github.com> --- test_import_final.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 test_import_final.py diff --git a/test_import_final.py b/test_import_final.py new file mode 100644 index 00000000..f4c847f9 --- /dev/null +++ b/test_import_final.py @@ -0,0 +1,16 @@ +import sys +import codeweaver +import pytest +from codeweaver import get_version + +def test_mock(monkeypatch): + monkeypatch.setitem(sys.modules, "codeweaver._version", None) + if hasattr(codeweaver, "_version"): + monkeypatch.delattr(codeweaver, "_version") + + try: + print(get_version()) + except Exception as e: + print(f"Exception: {e}") + +pytest.main(["-s", "test_import_final.py"]) From cdab0a8df00e5be979d452bfd4ed0577fd76c743 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Mon, 16 Mar 2026 17:19:42 +0000 Subject: [PATCH 5/7] test: Add tests for `get_version` function Added comprehensive unit tests for `get_version` in `tests/unit/test_init.py`. The tests verify that all mechanisms to retrieve the package version function as intended: - Reading `codeweaver._version.__version__` - Using `importlib.metadata.version` - Falling back to `git describe` - Handling missing `git` command - Handling broader unexpected exceptions Uses `monkeypatch` safely by keeping original references to avoid polluting the global namespace and Pytest internal packages. No functional code changes. Co-authored-by: bashandbone <89049923+bashandbone@users.noreply.github.com> --- test_import_final.py | 16 -------- test_investigate.py | 7 ++++ tests/unit/test_init.py | 87 ++++++++++++++++++++--------------------- 3 files changed, 49 insertions(+), 61 deletions(-) delete mode 100644 test_import_final.py create mode 100644 test_investigate.py diff --git a/test_import_final.py b/test_import_final.py deleted file mode 100644 index f4c847f9..00000000 --- a/test_import_final.py +++ /dev/null @@ -1,16 +0,0 @@ -import sys -import codeweaver -import pytest -from codeweaver import get_version - -def test_mock(monkeypatch): - monkeypatch.setitem(sys.modules, "codeweaver._version", None) - if hasattr(codeweaver, "_version"): - monkeypatch.delattr(codeweaver, "_version") - - try: - print(get_version()) - except Exception as e: - print(f"Exception: {e}") - -pytest.main(["-s", "test_import_final.py"]) diff --git a/test_investigate.py b/test_investigate.py new file mode 100644 index 00000000..a815e510 --- /dev/null +++ b/test_investigate.py @@ -0,0 +1,7 @@ +import sys +import codeweaver + +print(codeweaver.__version__) + +import importlib.metadata +print(importlib.metadata.version("code-weaver")) diff --git a/tests/unit/test_init.py b/tests/unit/test_init.py index f3d1e511..981beb78 100644 --- a/tests/unit/test_init.py +++ b/tests/unit/test_init.py @@ -6,23 +6,48 @@ import pytest -from codeweaver import get_version +import codeweaver -# Store the original version function to fall back to it for other packages _original_version = importlib.metadata.version -def test_get_version_from_version_file(monkeypatch): +@pytest.fixture +def mock_no_version_file(monkeypatch): + """Remove _version module from sys.modules and codeweaver module.""" + monkeypatch.delitem(sys.modules, "codeweaver._version", raising=False) + if hasattr(codeweaver, "_version"): + monkeypatch.delattr(codeweaver, "_version", raising=False) + + # We must also clear the internal import mechanisms tracking caching! + # A cleaner approach is simply to re-import get_version explicitly so it bounds to the current env + import importlib + importlib.reload(codeweaver) + return codeweaver.get_version + +@pytest.fixture +def mock_no_metadata(monkeypatch, mock_no_version_file): + """Mock importlib.metadata to raise PackageNotFoundError for code-weaver.""" + def mock_version(pkg_name): + if pkg_name == "code-weaver": + raise importlib.metadata.PackageNotFoundError("code-weaver") + return _original_version(pkg_name) + monkeypatch.setattr(importlib.metadata, "version", mock_version) + return mock_no_version_file + +def test_get_version_from_version_file(monkeypatch, mock_no_version_file): """Test getting version from codeweaver._version.__version__.""" mock_module = MagicMock() mock_module.__version__ = "1.2.3-file" monkeypatch.setitem(sys.modules, "codeweaver._version", mock_module) - assert get_version() == "1.2.3-file" + # Need to reload codeweaver because we just changed sys.modules + import importlib + importlib.reload(codeweaver) -def test_get_version_from_importlib_metadata(monkeypatch): - """Test getting version from importlib.metadata.""" - monkeypatch.setitem(sys.modules, "codeweaver._version", None) + assert codeweaver.get_version() == "1.2.3-file" +def test_get_version_from_importlib_metadata(monkeypatch, mock_no_version_file): + """Test getting version from importlib.metadata.""" + get_version = mock_no_version_file def mock_version(pkg_name): if pkg_name == "code-weaver": return "1.2.3-metadata" @@ -32,17 +57,10 @@ def mock_version(pkg_name): assert get_version() == "1.2.3-metadata" -def test_get_version_from_git_success(monkeypatch): +def test_get_version_from_git_success(monkeypatch, mock_no_metadata): """Test getting version from git describe.""" - monkeypatch.setitem(sys.modules, "codeweaver._version", None) - - def mock_version(pkg_name): - if pkg_name == "code-weaver": - raise importlib.metadata.PackageNotFoundError("code-weaver") - return _original_version(pkg_name) - monkeypatch.setattr(importlib.metadata, "version", mock_version) - - monkeypatch.setattr(shutil, "which", lambda cmd: "/usr/bin/git" if cmd == "git" else None) + get_version = mock_no_metadata + monkeypatch.setattr(shutil, "which", lambda cmd: "git" if cmd == "git" else None) mock_result = MagicMock() mock_result.returncode = 0 @@ -55,17 +73,10 @@ def mock_run(*args, **kwargs): assert get_version() == "1.2.3-git" -def test_get_version_from_git_failure(monkeypatch): +def test_get_version_from_git_failure(monkeypatch, mock_no_metadata): """Test git describe fails and returns 0.0.0.""" - monkeypatch.setitem(sys.modules, "codeweaver._version", None) - - def mock_version(pkg_name): - if pkg_name == "code-weaver": - raise importlib.metadata.PackageNotFoundError("code-weaver") - return _original_version(pkg_name) - monkeypatch.setattr(importlib.metadata, "version", mock_version) - - monkeypatch.setattr(shutil, "which", lambda cmd: "/usr/bin/git" if cmd == "git" else None) + get_version = mock_no_metadata + monkeypatch.setattr(shutil, "which", lambda cmd: "git" if cmd == "git" else None) mock_result = MagicMock() mock_result.returncode = 1 @@ -77,30 +88,16 @@ def mock_run(*args, **kwargs): assert get_version() == "0.0.0" -def test_get_version_no_git(monkeypatch): +def test_get_version_no_git(monkeypatch, mock_no_metadata): """Test git is not installed, returns 0.0.0.""" - monkeypatch.setitem(sys.modules, "codeweaver._version", None) - - def mock_version(pkg_name): - if pkg_name == "code-weaver": - raise importlib.metadata.PackageNotFoundError("code-weaver") - return _original_version(pkg_name) - monkeypatch.setattr(importlib.metadata, "version", mock_version) - + get_version = mock_no_metadata monkeypatch.setattr(shutil, "which", lambda cmd: None) assert get_version() == "0.0.0" -def test_get_version_exception(monkeypatch): +def test_get_version_exception(monkeypatch, mock_no_metadata): """Test general exception in git block returns 0.0.0.""" - monkeypatch.setitem(sys.modules, "codeweaver._version", None) - - def mock_version(pkg_name): - if pkg_name == "code-weaver": - raise importlib.metadata.PackageNotFoundError("code-weaver") - return _original_version(pkg_name) - monkeypatch.setattr(importlib.metadata, "version", mock_version) - + get_version = mock_no_metadata def mock_which(cmd): raise RuntimeError("Something went wrong") monkeypatch.setattr(shutil, "which", mock_which) From 141a7ba2860b9d175d02fbf81fa2ea85a918ebaa Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Mon, 16 Mar 2026 17:53:11 +0000 Subject: [PATCH 6/7] test: add robust coverage for get_version fallbacks Adds comprehensive tests for `codeweaver.get_version()` in `tests/unit/test_init.py`. Properly mocks the module import mechanisms, importlib.metadata, and git subprocess calls to ensure all fallback paths (file -> metadata -> git -> default) are tested. Addresses PR feedback by isolating the `_original_version` scope and adding explanatory comments about module reloading requirements during tests. Removes `test_investigate.py`. Co-authored-by: bashandbone <89049923+bashandbone@users.noreply.github.com> --- test_investigate.py | 7 ------- tests/unit/test_init.py | 13 +++++++++++-- 2 files changed, 11 insertions(+), 9 deletions(-) delete mode 100644 test_investigate.py diff --git a/test_investigate.py b/test_investigate.py deleted file mode 100644 index a815e510..00000000 --- a/test_investigate.py +++ /dev/null @@ -1,7 +0,0 @@ -import sys -import codeweaver - -print(codeweaver.__version__) - -import importlib.metadata -print(importlib.metadata.version("code-weaver")) diff --git a/tests/unit/test_init.py b/tests/unit/test_init.py index 981beb78..e9f22b9f 100644 --- a/tests/unit/test_init.py +++ b/tests/unit/test_init.py @@ -8,11 +8,16 @@ import codeweaver -_original_version = importlib.metadata.version @pytest.fixture def mock_no_version_file(monkeypatch): - """Remove _version module from sys.modules and codeweaver module.""" + """Remove _version module from sys.modules and codeweaver module. + + A reload of the codeweaver module is necessary because the `get_version()` + function evaluates the imports (which populate its internal values) exactly once + at execution time. If we don't reload the module after changing sys.modules, + it may continue using the previously cached module references. + """ monkeypatch.delitem(sys.modules, "codeweaver._version", raising=False) if hasattr(codeweaver, "_version"): monkeypatch.delattr(codeweaver, "_version", raising=False) @@ -26,6 +31,8 @@ def mock_no_version_file(monkeypatch): @pytest.fixture def mock_no_metadata(monkeypatch, mock_no_version_file): """Mock importlib.metadata to raise PackageNotFoundError for code-weaver.""" + _original_version = importlib.metadata.version + def mock_version(pkg_name): if pkg_name == "code-weaver": raise importlib.metadata.PackageNotFoundError("code-weaver") @@ -48,6 +55,8 @@ def test_get_version_from_version_file(monkeypatch, mock_no_version_file): def test_get_version_from_importlib_metadata(monkeypatch, mock_no_version_file): """Test getting version from importlib.metadata.""" get_version = mock_no_version_file + _original_version = importlib.metadata.version + def mock_version(pkg_name): if pkg_name == "code-weaver": return "1.2.3-metadata" From 6a2e4c3b9b030101f9101cdac9606fd5a6b2dd91 Mon Sep 17 00:00:00 2001 From: Adam Poulemanos Date: Mon, 16 Mar 2026 14:52:23 -0400 Subject: [PATCH 7/7] fix: spdx information --- tests/unit/test_init.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tests/unit/test_init.py b/tests/unit/test_init.py index e9f22b9f..d6610f2b 100644 --- a/tests/unit/test_init.py +++ b/tests/unit/test_init.py @@ -1,7 +1,12 @@ +# SPDX-FileCopyrightText: 2026 Knitli Inc. +# +# SPDX-License-Identifier: MIT OR Apache-2.0 + import importlib.metadata import shutil import subprocess import sys + from unittest.mock import MagicMock import pytest @@ -25,9 +30,11 @@ def mock_no_version_file(monkeypatch): # We must also clear the internal import mechanisms tracking caching! # A cleaner approach is simply to re-import get_version explicitly so it bounds to the current env import importlib + importlib.reload(codeweaver) return codeweaver.get_version + @pytest.fixture def mock_no_metadata(monkeypatch, mock_no_version_file): """Mock importlib.metadata to raise PackageNotFoundError for code-weaver.""" @@ -37,9 +44,11 @@ def mock_version(pkg_name): if pkg_name == "code-weaver": raise importlib.metadata.PackageNotFoundError("code-weaver") return _original_version(pkg_name) + monkeypatch.setattr(importlib.metadata, "version", mock_version) return mock_no_version_file + def test_get_version_from_version_file(monkeypatch, mock_no_version_file): """Test getting version from codeweaver._version.__version__.""" mock_module = MagicMock() @@ -48,10 +57,12 @@ def test_get_version_from_version_file(monkeypatch, mock_no_version_file): # Need to reload codeweaver because we just changed sys.modules import importlib + importlib.reload(codeweaver) assert codeweaver.get_version() == "1.2.3-file" + def test_get_version_from_importlib_metadata(monkeypatch, mock_no_version_file): """Test getting version from importlib.metadata.""" get_version = mock_no_version_file @@ -66,6 +77,7 @@ def mock_version(pkg_name): assert get_version() == "1.2.3-metadata" + def test_get_version_from_git_success(monkeypatch, mock_no_metadata): """Test getting version from git describe.""" get_version = mock_no_metadata @@ -82,6 +94,7 @@ def mock_run(*args, **kwargs): assert get_version() == "1.2.3-git" + def test_get_version_from_git_failure(monkeypatch, mock_no_metadata): """Test git describe fails and returns 0.0.0.""" get_version = mock_no_metadata @@ -97,6 +110,7 @@ def mock_run(*args, **kwargs): assert get_version() == "0.0.0" + def test_get_version_no_git(monkeypatch, mock_no_metadata): """Test git is not installed, returns 0.0.0.""" get_version = mock_no_metadata @@ -104,11 +118,14 @@ def test_get_version_no_git(monkeypatch, mock_no_metadata): assert get_version() == "0.0.0" + def test_get_version_exception(monkeypatch, mock_no_metadata): """Test general exception in git block returns 0.0.0.""" get_version = mock_no_metadata + def mock_which(cmd): raise RuntimeError("Something went wrong") + monkeypatch.setattr(shutil, "which", mock_which) assert get_version() == "0.0.0"