From dfce027c57a3424436ab05025d827a06e1cb8304 Mon Sep 17 00:00:00 2001 From: Chester Curme Date: Mon, 3 Feb 2025 13:22:53 -0500 Subject: [PATCH] update get_min_versions --- .github/scripts/get_min_versions.py | 35 ++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/.github/scripts/get_min_versions.py b/.github/scripts/get_min_versions.py index f16ee8e314c..089363fc732 100644 --- a/.github/scripts/get_min_versions.py +++ b/.github/scripts/get_min_versions.py @@ -1,3 +1,4 @@ +from collections import defaultdict import sys from typing import Optional @@ -95,6 +96,23 @@ def get_minimum_version(package_name: str, spec_string: str) -> Optional[str]: return str(min(valid_versions)) if valid_versions else None +def _check_python_version_from_requirement( + requirement: Requirement, python_version: str +) -> bool: + if not requirement.marker: + return True + else: + marker_str = str(requirement.marker) + if "python_full_version" in marker_str: + python_version_str = "".join( + char + for char in marker_str + if char.isdigit() or char in (".", "<", ">", "=", ",") + ) + return check_python_version(python_version, python_version_str) + return True + + def get_min_version_from_toml( toml_path: str, versions_for: str, @@ -106,10 +124,10 @@ def get_min_version_from_toml( with open(toml_path, "rb") as file: toml_data = tomllib.load(file) - dependencies = {} + dependencies = defaultdict(list) for dep in toml_data["project"]["dependencies"]: requirement = Requirement(dep) - dependencies[requirement.name] = requirement + dependencies[requirement.name].append(requirement) # Initialize a dictionary to store the minimum versions min_versions = {} @@ -124,14 +142,11 @@ def get_min_version_from_toml( if lib in dependencies: if include and lib not in include: continue - requirement = dependencies[lib] - # TODO: fix this - # if requirement.marker and not requirement.marker.evaluate( - # {"python_version": python_version} - # ): - # continue - # Get the version string - version_string = str(requirement.specifier) + requirements = dependencies[lib] + for requirement in requirements: + if _check_python_version_from_requirement(requirement, python_version): + version_string = str(requirement.specifier) + break # Use parse_version to get the minimum supported version from version_string min_version = get_minimum_version(lib, version_string)