From 392eae1b78650d31bf76bc0d0643512354441045 Mon Sep 17 00:00:00 2001 From: Jeremy Fleischman Date: Wed, 2 May 2018 10:03:05 -0700 Subject: [PATCH] When formatting a requirement, only lowercase its name. This fixes https://github.com/pypa/pipenv/issues/2113. This bug was introduced in as a band-aid fix to . Pipenv then copied that code in , and inherited this latent bug. Maybe the right fix is for pypa/packaging to lowercase the name? There's a comment here about normalizing the requirement's name, which might be what this is referring to. --- pipenv/patched/piptools/utils.py | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/pipenv/patched/piptools/utils.py b/pipenv/patched/piptools/utils.py index db8bb9b3ff..f3de3dd376 100644 --- a/pipenv/patched/piptools/utils.py +++ b/pipenv/patched/piptools/utils.py @@ -58,6 +58,36 @@ def make_install_requirement(name, version, extras, markers, constraint=False): constraint=constraint) +def _requirement_to_str_lowercase_name(requirement): + """ + Formats a packaging.requirements.Requirement with a lowercase name. + + This is simply a copy of + https://github.com/pypa/packaging/blob/16.8/packaging/requirements.py#L109-L124 + modified to lowercase the dependency name. + + Previously, we were invoking the original Requirement.__str__ method and + lowercasing the entire result, which would lowercase the name, *and* other, + important stuff that should not be lowercased (such as the marker). See + this issue for more information: https://github.com/pypa/pipenv/issues/2113. + """ + parts = [requirement.name.lower()] + + if requirement.extras: + parts.append("[{0}]".format(",".join(sorted(requirement.extras)))) + + if requirement.specifier: + parts.append(str(requirement.specifier)) + + if requirement.url: + parts.append("@ {0}".format(requirement.url)) + + if requirement.marker: + parts.append("; {0}".format(requirement.marker)) + + return "".join(parts) + + def format_requirement(ireq, marker=None): """ Generic formatter for pretty printing InstallRequirements to the terminal @@ -66,7 +96,7 @@ def format_requirement(ireq, marker=None): if ireq.editable: line = '-e {}'.format(ireq.link) else: - line = str(ireq.req).lower() + line = _requirement_to_str_lowercase_name(ireq.req) if marker: line = '{}; {}'.format(line, marker)