diff --git a/news/6419.bugfix b/news/6419.bugfix new file mode 100644 index 000000000..057b81d17 --- /dev/null +++ b/news/6419.bugfix @@ -0,0 +1 @@ +Fix ``NameError`` when handling an invalid requirement. diff --git a/src/pip/_internal/req/constructors.py b/src/pip/_internal/req/constructors.py index 546d14b66..0f18b6a72 100644 --- a/src/pip/_internal/req/constructors.py +++ b/src/pip/_internal/req/constructors.py @@ -319,7 +319,7 @@ def install_req_from_req_string( try: req = Requirement(req_string) except InvalidRequirement: - raise InstallationError("Invalid requirement: '%s'" % req) + raise InstallationError("Invalid requirement: '%s'" % req_string) domains_not_allowed = [ PyPI.file_storage_domain, diff --git a/tests/unit/test_req_install.py b/tests/unit/test_req_install.py index 95ce4cf4c..66a84e1ba 100644 --- a/tests/unit/test_req_install.py +++ b/tests/unit/test_req_install.py @@ -4,6 +4,7 @@ import tempfile import pytest from pip._vendor.packaging.requirements import Requirement +from pip._internal.exceptions import InstallationError from pip._internal.req.constructors import ( install_req_from_line, install_req_from_req_string, ) @@ -49,6 +50,18 @@ class TestInstallRequirementBuildDirectory(object): class TestInstallRequirementFrom(object): + def test_install_req_from_string_invalid_requirement(self): + """ + Requirement strings that cannot be parsed by + packaging.requirements.Requirement raise an InstallationError. + """ + with pytest.raises(InstallationError) as excinfo: + install_req_from_req_string("http:/this/is/invalid") + + assert str(excinfo.value) == ( + "Invalid requirement: 'http:/this/is/invalid'" + ) + def test_install_req_from_string_without_comes_from(self): """ Test to make sure that install_req_from_string succeeds