From a1a56ce5193f8e673adf56d4ad6b13d6fa46f9b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bern=C3=A1t=20G=C3=A1bor?= Date: Tue, 3 Jan 2023 20:41:56 -0800 Subject: [PATCH] fix docstring MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Bernát Gábor --- .../python/virtual_env/package/util.py | 61 ++++++++++--------- 1 file changed, 33 insertions(+), 28 deletions(-) diff --git a/src/tox/tox_env/python/virtual_env/package/util.py b/src/tox/tox_env/python/virtual_env/package/util.py index ec8990cf5f..c591aad2f8 100644 --- a/src/tox/tox_env/python/virtual_env/package/util.py +++ b/src/tox/tox_env/python/virtual_env/package/util.py @@ -1,6 +1,7 @@ from __future__ import annotations from copy import deepcopy +from typing import Optional, Set, cast from packaging.markers import Variable # type: ignore[attr-defined] from packaging.requirements import Requirement @@ -29,37 +30,41 @@ def dependencies_with_extras(deps: list[Requirement], extras: set[str], package_ def extract_extra_markers(deps: list[Requirement]) -> list[tuple[Requirement, set[str | None]]]: - # extras might show up as markers, move them into extras property + """ + Extract extra markers from dependencies. + + :param deps: the dependencies + :return: a list of requirement, extras set + """ result: list[tuple[Requirement, set[str | None]]] = [] for req in deps: - req = deepcopy(req) - markers: list[str | tuple[Variable, Variable, Variable]] = getattr(req.marker, "_markers", []) or [] - new_markers: list[str | tuple[Variable, Variable, Variable]] = [] + result.append((req, _extract_extra_markers(req))) + return result - def _is_extra_marker(_marker: str | tuple[Variable, Variable, Variable]) -> bool: - return ( - isinstance(_marker, tuple) - and len(_marker) == 3 - and _marker[0].value == "extra" - and _marker[1].value == "==" - ) - extra_markers = set() - marker = markers.pop(0) if markers else None - while marker: - if _is_extra_marker(marker): - extra_markers.add(marker[2].value) # type: ignore - if new_markers and new_markers[-1] in ("and", "or"): - del new_markers[-1] - marker = markers.pop(0) if markers else None - if marker in ("and", "or"): - marker = markers.pop(0) if markers else None - else: - new_markers.append(marker) +def _extract_extra_markers(req: Requirement) -> set[str | None]: + req = deepcopy(req) + markers: list[str | tuple[Variable, Variable, Variable]] = getattr(req.marker, "_markers", []) or [] + new_markers: list[str | tuple[Variable, Variable, Variable]] = [] + extra_markers: set[str] = set() # markers that have a key of extra + marker = markers.pop(0) if markers else None + while marker: + if _is_extra_marker(marker): + extra_markers.add(marker[2].value) # type: ignore + if new_markers and new_markers[-1] in ("and", "or"): + del new_markers[-1] + marker = markers.pop(0) if markers else None + if marker in ("and", "or"): marker = markers.pop(0) if markers else None - if new_markers: - req.marker._markers = new_markers # type: ignore else: - req.marker = None - result.append((req, extra_markers or {None})) - return result + new_markers.append(marker) + marker = markers.pop(0) if markers else None + if new_markers: + req.marker._markers = new_markers # type: ignore + else: + req.marker = None + return cast(Set[Optional[str]], extra_markers) or {None} + + +def _is_extra_marker(_marker: str | tuple[Variable, Variable, Variable]) -> bool: + return isinstance(_marker, tuple) and len(_marker) == 3 and _marker[0].value == "extra" and _marker[1].value == "=="