完善通用求解器回归与前端交互
- 引入因果坐标内核、热流体恢复和递进长时回归\n- 完善正交连线、线桥、视图保持与结果曲线缩放\n- 补充依赖约束、CI、测试基线和北京时间更新日志
This commit is contained in:
1 parent
143e8dd309
commit
b435daecf2
65 files changed
+172271
-701
No files matched your search
@@ -0,0 +1,105 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from importlib import metadata
|
||||
import os
|
||||
from pathlib import Path
|
||||
import re
|
||||
import sys
|
||||
import unittest
|
||||
|
||||
|
||||
REPOSITORY_ROOT = Path(__file__).resolve().parents[1]
|
||||
REQUIREMENTS_PATH = REPOSITORY_ROOT / "requirements.txt"
|
||||
CONSTRAINTS_PATH = (
|
||||
REPOSITORY_ROOT / "constraints" / "python312-direct.txt"
|
||||
)
|
||||
PYTHON_VERSION_PATH = REPOSITORY_ROOT / ".python-version"
|
||||
VERIFY_ENVIRONMENT_VARIABLE = "SYSTEM_SIMULATION_VERIFY_LOCKED_ENV"
|
||||
|
||||
REFERENCE_DIRECT_VERSIONS = {
|
||||
"fastapi": "0.141.1",
|
||||
"lxml": "6.1.1",
|
||||
"numpy": "2.5.2",
|
||||
"pydantic": "2.13.4",
|
||||
"scipy": "1.18.0",
|
||||
"uvicorn": "0.52.3",
|
||||
}
|
||||
|
||||
|
||||
def _active_lines(path: Path) -> tuple[str, ...]:
|
||||
return tuple(
|
||||
line
|
||||
for raw_line in path.read_text(encoding="utf-8").splitlines()
|
||||
if (line := raw_line.strip()) and not line.startswith("#")
|
||||
)
|
||||
|
||||
|
||||
def _normalized_name(requirement: str) -> str:
|
||||
match = re.match(r"[A-Za-z0-9_.-]+", requirement)
|
||||
if match is None:
|
||||
raise AssertionError(f"Invalid requirement line: {requirement!r}")
|
||||
return match.group(0).lower().replace("_", "-")
|
||||
|
||||
|
||||
def _constraint_versions() -> dict[str, str]:
|
||||
result: dict[str, str] = {}
|
||||
for line in _active_lines(CONSTRAINTS_PATH):
|
||||
parts = line.split("==")
|
||||
if len(parts) != 2 or not all(parts):
|
||||
raise AssertionError(
|
||||
f"Direct constraint must be an exact package pin: {line!r}"
|
||||
)
|
||||
name, version = parts
|
||||
normalized = _normalized_name(name)
|
||||
if normalized in result:
|
||||
raise AssertionError(f"Duplicate direct constraint: {normalized}")
|
||||
result[normalized] = version
|
||||
return result
|
||||
|
||||
|
||||
class DependencyConstraintContractTests(unittest.TestCase):
|
||||
def test_python_reference_version_is_explicit(self) -> None:
|
||||
self.assertEqual(
|
||||
PYTHON_VERSION_PATH.read_text(encoding="utf-8").strip(),
|
||||
"3.12.3",
|
||||
)
|
||||
|
||||
def test_requirements_remain_ranges_and_declare_every_direct_package(
|
||||
self,
|
||||
) -> None:
|
||||
requirements = _active_lines(REQUIREMENTS_PATH)
|
||||
names = {_normalized_name(line) for line in requirements}
|
||||
|
||||
self.assertEqual(names, set(REFERENCE_DIRECT_VERSIONS))
|
||||
self.assertTrue(all("==" not in line for line in requirements))
|
||||
|
||||
def test_reference_constraints_pin_only_direct_cross_platform_packages(
|
||||
self,
|
||||
) -> None:
|
||||
self.assertEqual(_constraint_versions(), REFERENCE_DIRECT_VERSIONS)
|
||||
self.assertTrue(
|
||||
{
|
||||
"httptools",
|
||||
"pyyaml",
|
||||
"uvloop",
|
||||
"watchfiles",
|
||||
"websockets",
|
||||
}.isdisjoint(_constraint_versions())
|
||||
)
|
||||
|
||||
@unittest.skipUnless(
|
||||
os.getenv(VERIFY_ENVIRONMENT_VARIABLE, "").strip().lower()
|
||||
in {"1", "true", "yes", "on"},
|
||||
f"Set {VERIFY_ENVIRONMENT_VARIABLE}=1 to verify installed versions.",
|
||||
)
|
||||
def test_installed_environment_matches_reference_constraints(self) -> None:
|
||||
self.assertEqual(sys.version_info[:3], (3, 12, 3))
|
||||
installed = {
|
||||
name: metadata.version(name)
|
||||
for name in REFERENCE_DIRECT_VERSIONS
|
||||
}
|
||||
self.assertEqual(installed, REFERENCE_DIRECT_VERSIONS)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in new issue
Block a user