diff --git a/grayskull/utils.py b/grayskull/utils.py index 44dff95c0..365ce13b5 100644 --- a/grayskull/utils.py +++ b/grayskull/utils.py @@ -130,8 +130,13 @@ def rm_duplicated_deps(all_requirements: Union[list, set, None]) -> Optional[lis if dep.strip().startswith(("{{", "<{")): new_reqs[dep] = dep continue - dep_name = re_split.split(dep.strip())[0].strip() + dep_name, *constrains = re_split.split(dep.strip()) + dep_name = dep_name.strip() + constrains = [ + c.strip() for c in constrains if c.strip() not in {"*", "*.*", "*.*.*"} + ] canonicalized = dep_name.replace("_", "-").lower() + constrains.insert(0, dep_name) if canonicalized in new_reqs: # In order to break ties deterministically, we prioritize the requirement # which is alphanumerically lowest. This happens to prioritize the "-" @@ -140,9 +145,9 @@ def rm_duplicated_deps(all_requirements: Union[list, set, None]) -> Optional[lis # keep "importlib-metadata" because it is alphabetically lower. previous_req = new_reqs[canonicalized] if len(dep) > len(previous_req) or "-" in dep_name: - new_reqs[canonicalized] = dep + new_reqs[canonicalized] = " ".join(constrains) else: - new_reqs[canonicalized] = dep + new_reqs[canonicalized] = " ".join(constrains) return list(new_reqs.values()) diff --git a/tests/test_utils.py b/tests/test_utils.py index a08757915..575f101b8 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -125,3 +125,9 @@ def test_rm_duplicated_deps(): assert rm_duplicated_deps([]) is None # my-crazy-pkg is preferred because "my-crazy-pkg" < "my_craZy-pkg": assert rm_duplicated_deps(["my_craZy-pkg", "my-crazy-pkg"]) == ["my-crazy-pkg"] + + +def test_rm_dupliate_deps_with_star(): + assert rm_duplicated_deps(["typing-extensions", "typing_extensions *"]) == [ + "typing_extensions" + ]