from __future__ import annotations from packaging.version import Version from typing import Optional def parse_version(version_str: str) -> Optional[Version]: try: return Version(version_str) except Exception: return None def compare_versions(v1: str, v2: str) -> int: parsed_v1 = parse_version(v1) parsed_v2 = parse_version(v2) if parsed_v1 is None or parsed_v2 is None: return 0 if parsed_v1 < parsed_v2: return -1 elif parsed_v1 > parsed_v2: return 1 return 0 def is_version_outdated(current: str, latest: str) -> bool: return compare_versions(current, latest) < 0 def extract_version_from_specifier(specifier: str) -> Optional[str]: if not specifier: return None operators = ["===", "==", ">=", "<=", "~=", "!=", ">", "<", "^", "~"] for op in operators: if specifier.startswith(op): return specifier[len(op):].strip() return specifier.strip()