Skip to content

Commit

Permalink
fix: better error message for invalid requirements
Browse files Browse the repository at this point in the history
Fix #106
  • Loading branch information
frostming committed Jul 8, 2022
1 parent 56b43b7 commit 814442b
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 5 deletions.
1 change: 1 addition & 0 deletions news/106.bugfix.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Throw a better error message when a malformed requirement is being parsed.
11 changes: 8 additions & 3 deletions pdm/pep517/metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -241,13 +241,18 @@ def license_files(self) -> Dict[str, List[str]]:
raise MetadataError("license-files", "Must specify 'paths' or 'globs'")
return rv

def _convert_dependencies(self, deps: List[str]) -> List[str]:
return list(filter(None, map(ensure_pep440_req, deps)))
def _convert_dependencies(
self, deps: List[str], field: str = "dependencies"
) -> List[str]:
return list(filter(None, (ensure_pep440_req(dep, field) for dep in deps)))

def _convert_optional_dependencies(
self, deps: Mapping[str, List[str]]
) -> Dict[str, List[str]]:
return {k: self._convert_dependencies(deps[k]) for k in deps}
return {
k: self._convert_dependencies(deps[k], "optional-dependencies")
for k in deps
}

dependencies: MetaField[List[str]] = MetaField(
"dependencies", _convert_dependencies
Expand Down
9 changes: 7 additions & 2 deletions pdm/pep517/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,9 @@

from pdm.pep517._vendor.packaging import tags
from pdm.pep517._vendor.packaging.markers import Marker
from pdm.pep517._vendor.packaging.requirements import Requirement
from pdm.pep517._vendor.packaging.requirements import InvalidRequirement, Requirement
from pdm.pep517._vendor.packaging.version import InvalidVersion, Version
from pdm.pep517.exceptions import MetadataError
from pdm.pep517.macosx_platform import calculate_macosx_platform_tag


Expand Down Expand Up @@ -184,11 +185,15 @@ def get_abi_tag() -> Optional[str]:
return None


def ensure_pep440_req(req: str) -> Optional[str]:
def ensure_pep440_req(req: str, field: str) -> Optional[str]:
"""Discard all non-PEP 440 requirements, e.g. editable VCS requirements."""

if req.strip().startswith("-e"):
return None
try:
Requirement(req)
except InvalidRequirement as e:
raise MetadataError(field, f"Invalid requirement {req!r}\n {e}") from e
return req


Expand Down
16 changes: 16 additions & 0 deletions tests/test_metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,22 @@ def test_invalid_license_identifier() -> None:
metadata.license_expression


def test_invalid_requirement_strings() -> None:
metadata = make_metadata(
{
"description": "test package",
"name": "demo",
"dependencies": ["+abc"],
"optional-dependencies": {"foo": ["foo&123"]},
}
)
with pytest.raises(ValueError):
metadata.dependencies

with pytest.raises(ValueError):
metadata.optional_dependencies


@pytest.mark.deprecation
@pytest.mark.parametrize(
"attr_name, field_name, value",
Expand Down

0 comments on commit 814442b

Please sign in to comment.