Skip to content

Commit d4a777f

Browse files
committed
fix(cli): sync version with package metadata
1 parent 6321ff4 commit d4a777f

2 files changed

Lines changed: 51 additions & 5 deletions

File tree

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,17 @@
11
"""MCP server for Python standard library documentation."""
22

3-
__version__ = "0.1.0"
3+
import tomllib
4+
from importlib.metadata import PackageNotFoundError, version
5+
from pathlib import Path
6+
7+
8+
def _read_version() -> str:
9+
try:
10+
return version("mcp-server-python-docs")
11+
except PackageNotFoundError:
12+
pyproject_path = Path(__file__).resolve().parents[2] / "pyproject.toml"
13+
with pyproject_path.open("rb") as fh:
14+
return tomllib.load(fh)["project"]["version"]
15+
16+
17+
__version__ = _read_version()

tests/test_packaging.py

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@
55
"""
66
from __future__ import annotations
77

8+
import os
89
import shutil
910
import subprocess
1011
import sys
1112
import zipfile
13+
from importlib.metadata import version
1214
from pathlib import Path
1315

1416
import pytest
@@ -100,8 +102,37 @@ def test_required_deps_present(self):
100102
class TestVersionFlag:
101103
"""PKG-06: --version flag prints version."""
102104

105+
def test_module_version_matches_package_metadata(self):
106+
"""__version__ stays in sync with installed package metadata."""
107+
import mcp_server_python_docs
108+
109+
assert mcp_server_python_docs.__version__ == version("mcp-server-python-docs")
110+
111+
def test_source_tree_import_without_installed_metadata(self):
112+
"""Source-tree import falls back to pyproject.toml when metadata is absent."""
113+
env = os.environ.copy()
114+
env["PYTHONPATH"] = str(PROJECT_ROOT / "src")
115+
result = subprocess.run(
116+
[
117+
sys.executable,
118+
"-S",
119+
"-c",
120+
"import mcp_server_python_docs; print(mcp_server_python_docs.__version__)",
121+
],
122+
capture_output=True,
123+
text=True,
124+
timeout=10,
125+
env=env,
126+
)
127+
assert result.returncode == 0, (
128+
f"Source-tree import failed.\n"
129+
f"stdout: {result.stdout!r}\n"
130+
f"stderr: {result.stderr!r}"
131+
)
132+
assert result.stdout.strip() == version("mcp-server-python-docs")
133+
103134
def test_version_flag_output(self):
104-
"""--version prints 0.1.0."""
135+
"""--version prints the installed package metadata version."""
105136
result = subprocess.run(
106137
[sys.executable, "-m", "mcp_server_python_docs", "--version"],
107138
capture_output=True,
@@ -110,8 +141,9 @@ def test_version_flag_output(self):
110141
)
111142
# Version output goes to stderr due to stdio hygiene
112143
combined = result.stdout + result.stderr
113-
assert "0.1.0" in combined, (
114-
f"Expected '0.1.0' in output.\n"
144+
expected = version("mcp-server-python-docs")
145+
assert expected in combined, (
146+
f"Expected {expected!r} in output.\n"
115147
f"stdout: {result.stdout!r}\n"
116148
f"stderr: {result.stderr!r}"
117149
)
@@ -140,7 +172,7 @@ def test_module_runnable(self):
140172
)
141173
assert result.returncode == 0
142174
combined = result.stdout + result.stderr
143-
assert "0.1.0" in combined
175+
assert version("mcp-server-python-docs") in combined
144176

145177
def test_entry_point_module_exists(self):
146178
"""The entry-point module is importable."""

0 commit comments

Comments
 (0)