fix:解析预发布版版本号

This commit is contained in:
SengokuCola
2026-05-09 21:10:12 +08:00
parent 5a692c2faf
commit 1247482dd4
4 changed files with 42 additions and 1140 deletions

View File

@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project] [project]
name = "MaiBot" name = "MaiBot"
version = "1.0.0" version = "1.0.0-pre.16"
description = "MaiCore 是一个基于大语言模型的可交互智能体" description = "MaiCore 是一个基于大语言模型的可交互智能体"
requires-python = ">=3.12" requires-python = ">=3.12"
dependencies = [ dependencies = [

View File

@@ -1169,6 +1169,8 @@ class TestVersionComparator:
assert VersionComparator.normalize_version("0.8.0-snapshot.1") == "0.8.0" assert VersionComparator.normalize_version("0.8.0-snapshot.1") == "0.8.0"
assert VersionComparator.normalize_version("1.2") == "1.2.0" assert VersionComparator.normalize_version("1.2") == "1.2.0"
assert VersionComparator.normalize_version("1.0.0rc16") == "1.0.0"
assert VersionComparator.normalize_version("1.0.0-pre.16") == "1.0.0"
assert VersionComparator.normalize_version("") == "0.0.0" assert VersionComparator.normalize_version("") == "0.0.0"
def test_compare(self): def test_compare(self):

View File

@@ -47,6 +47,15 @@ class VersionComparator:
return "0.0.0" return "0.0.0"
normalized = re.sub(r"-snapshot\.\d+", "", str(version).strip()) normalized = re.sub(r"-snapshot\.\d+", "", str(version).strip())
try:
parsed_version = Version(normalized)
parts = [str(part) for part in parsed_version.release[:3]]
while len(parts) < 3:
parts.append("0")
return ".".join(parts)
except InvalidVersion:
pass
if not re.match(r"^\d+(\.\d+){0,2}$", normalized): if not re.match(r"^\d+(\.\d+){0,2}$", normalized):
return "0.0.0" return "0.0.0"
@@ -132,6 +141,17 @@ class VersionComparator:
""" """
return bool(_SEMVER_PATTERN.fullmatch(str(version or "").strip())) return bool(_SEMVER_PATTERN.fullmatch(str(version or "").strip()))
@staticmethod
def is_valid_project_version(version: str) -> bool:
"""判断主程序或 SDK 的项目版本号是否可被解析。
``pyproject.toml`` 遵循 Python 包版本规范,允许 ``1.0.0rc16`` 或
``1.0.0-pre.16`` 这类预发布版本;兼容性比较时只取其 release 部分。
"""
normalized = VersionComparator.normalize_version(version)
return normalized != "0.0.0" or str(version or "").strip() == "0.0.0"
class _StrictManifestModel(BaseModel): class _StrictManifestModel(BaseModel):
"""Manifest 解析使用的严格基类模型。""" """Manifest 解析使用的严格基类模型。"""
@@ -1030,7 +1050,7 @@ class ManifestValidator:
return "" return ""
raw_version = str(project_data.get("version", "") or "").strip() raw_version = str(project_data.get("version", "") or "").strip()
if VersionComparator.is_valid_semver(raw_version): if VersionComparator.is_valid_project_version(raw_version):
return raw_version return raw_version
return "" return ""
@@ -1047,7 +1067,7 @@ class ManifestValidator:
""" """
try: try:
raw_version = importlib_metadata.version("maibot-plugin-sdk") raw_version = importlib_metadata.version("maibot-plugin-sdk")
if VersionComparator.is_valid_semver(raw_version): if VersionComparator.is_valid_project_version(raw_version):
return raw_version return raw_version
except importlib_metadata.PackageNotFoundError: except importlib_metadata.PackageNotFoundError:
pass pass
@@ -1064,7 +1084,7 @@ class ManifestValidator:
return "" return ""
raw_version = str(project_data.get("version", "") or "").strip() raw_version = str(project_data.get("version", "") or "").strip()
if VersionComparator.is_valid_semver(raw_version): if VersionComparator.is_valid_project_version(raw_version):
return raw_version return raw_version
return "" return ""

1152
uv.lock generated

File diff suppressed because it is too large Load Diff