From 4595f846937e87a90be89dadace22c50b9b7308d Mon Sep 17 00:00:00 2001 From: Marius van Niekerk Date: Thu, 10 Feb 2022 11:53:23 -0500 Subject: [PATCH] Allow somewhat malformed version specifiers in conda env files --- conda_lock/src_parser/environment_yaml.py | 8 ++++++-- conda_lock/src_parser/meta_yaml.py | 1 + conda_lock/src_parser/pyproject_toml.py | 6 +++++- tests/gdal/environment.yml | 3 ++- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/conda_lock/src_parser/environment_yaml.py b/conda_lock/src_parser/environment_yaml.py index 9adc5f038..af7362b83 100644 --- a/conda_lock/src_parser/environment_yaml.py +++ b/conda_lock/src_parser/environment_yaml.py @@ -12,10 +12,14 @@ from .pyproject_toml import parse_python_requirement +_whitespace = re.compile(r"\s+") +_conda_package_pattern = re.compile(r"^(?P[A-Za-z0-9_-]+)\s?(?P.*)?$") + + def parse_conda_requirement(req: str) -> Tuple[str, str]: - match = re.match(r"^(?P[A-Za-z0-9_-]+)\s?(?P.*)?$", req) + match = _conda_package_pattern.match(req) if match: - return match.group("name"), match.group("version") + return match.group("name"), _whitespace.sub("", match.group("version")) else: raise ValueError(f"Can't parse conda spec from '{req}'") diff --git a/conda_lock/src_parser/meta_yaml.py b/conda_lock/src_parser/meta_yaml.py index 236f181f5..f22d4635e 100644 --- a/conda_lock/src_parser/meta_yaml.py +++ b/conda_lock/src_parser/meta_yaml.py @@ -139,6 +139,7 @@ def add_spec(spec: str, category: str): manager="conda", optional=category != "main", category=category, + normalize_name=False, ) dep.selectors.platform = [platform] depenencies.append(dep) diff --git a/conda_lock/src_parser/pyproject_toml.py b/conda_lock/src_parser/pyproject_toml.py index cf4e2b318..d9a13e865 100644 --- a/conda_lock/src_parser/pyproject_toml.py +++ b/conda_lock/src_parser/pyproject_toml.py @@ -243,6 +243,7 @@ def parse_python_requirement( manager: Literal["conda", "pip"] = "conda", optional: bool = False, category: str = "main", + normalize_name: bool = True, ) -> Dependency: """Parse a requirements.txt like requirement to a conda spec""" requirement_specifier = requirement.split(";")[0].strip() @@ -253,7 +254,10 @@ def parse_python_requirement( collapsed_version = ",".join("".join(spec) for spec in parsed_req.specs) conda_version = poetry_version_to_conda_version(collapsed_version) - conda_dep_name = normalize_pypi_name(name) + if normalize_name: + conda_dep_name = normalize_pypi_name(name) + else: + conda_dep_name = name extras = list(parsed_req.extras) if parsed_req.url: # type: ignore[attr-defined] diff --git a/tests/gdal/environment.yml b/tests/gdal/environment.yml index 343d2eec0..58efbe4bf 100644 --- a/tests/gdal/environment.yml +++ b/tests/gdal/environment.yml @@ -2,7 +2,8 @@ channels: - conda-forge - defaults dependencies: - - python >=3.7,<3.8 + # purposefully using a badly formatted environment.yaml here + - python >= 3.7, < 3.8 - gdal - pip: - toolz \ No newline at end of file