81 lines
2.7 KiB
Python
81 lines
2.7 KiB
Python
from pathlib import Path
|
|
|
|
from packaging.requirements import Requirement
|
|
from packaging.version import Version
|
|
import tomlkit
|
|
|
|
|
|
PROJECT_ROOT = Path(__file__).resolve().parents[1]
|
|
|
|
|
|
def _pyproject() -> dict[str, object]:
|
|
return tomlkit.parse((PROJECT_ROOT / "pyproject.toml").read_text(encoding="utf-8"))
|
|
|
|
|
|
def _project_metadata() -> dict[str, object]:
|
|
return _pyproject()["project"]
|
|
|
|
|
|
def _requirements(entries: object) -> dict[str, Requirement]:
|
|
assert isinstance(entries, list)
|
|
requirements = (Requirement(str(entry)) for entry in entries)
|
|
return {requirement.name: requirement for requirement in requirements}
|
|
|
|
|
|
def _assert_safe_floor(
|
|
requirement: Requirement,
|
|
vulnerable: str,
|
|
fixed: str,
|
|
) -> None:
|
|
assert Version(vulnerable) not in requirement.specifier
|
|
assert Version(fixed) in requirement.specifier
|
|
|
|
|
|
def test_python_support_matches_maintained_runtime_line() -> None:
|
|
project = _project_metadata()
|
|
|
|
assert project["requires-python"] == ">=3.10"
|
|
assert "Programming Language :: Python :: 3.9" not in project["classifiers"]
|
|
assert "Programming Language :: Python :: 3.14" in project["classifiers"]
|
|
|
|
|
|
def test_license_uses_current_packaging_metadata() -> None:
|
|
document = _pyproject()
|
|
project = document["project"]
|
|
assert isinstance(project, dict)
|
|
build_system = document["build-system"]
|
|
assert isinstance(build_system, dict)
|
|
build_requirements = _requirements(build_system["requires"])
|
|
|
|
assert project["license"] == "MIT"
|
|
assert all(
|
|
not str(classifier).startswith("License ::")
|
|
for classifier in project["classifiers"]
|
|
)
|
|
assert Version("77.0.3") in build_requirements["setuptools"].specifier
|
|
|
|
|
|
def test_dependency_floors_exclude_known_vulnerable_releases() -> None:
|
|
project = _project_metadata()
|
|
runtime = _requirements(project["dependencies"])
|
|
optional = project["optional-dependencies"]
|
|
assert isinstance(optional, dict)
|
|
development = _requirements(optional["dev"])
|
|
|
|
_assert_safe_floor(runtime["requests"], "2.32.5", "2.33.0")
|
|
_assert_safe_floor(runtime["aiohttp"], "3.13.5", "3.14.1")
|
|
_assert_safe_floor(runtime["urllib3"], "2.6.3", "2.7.0")
|
|
_assert_safe_floor(runtime["cryptography"], "41.0.0", "48.0.1")
|
|
_assert_safe_floor(development["pytest"], "8.4.2", "9.0.3")
|
|
|
|
|
|
def test_async_test_runner_supports_pytest_nine() -> None:
|
|
project = _project_metadata()
|
|
optional = project["optional-dependencies"]
|
|
assert isinstance(optional, dict)
|
|
development = _requirements(optional["dev"])
|
|
|
|
requirement = development["pytest-asyncio"]
|
|
assert Version("1.3.0") not in requirement.specifier
|
|
assert Version("1.4.0") in requirement.specifier
|