diff --git a/pyproject.toml b/pyproject.toml index fed706aa..3ad9e2d1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -74,12 +74,7 @@ extend-select = [ "W" ] ignore = [ - "B009", - "B015", - "B018", "B027", - "B028", - "B904", "N818", "RUF003", "RUF012", diff --git a/src/packaging/_elffile.py b/src/packaging/_elffile.py index f7a02180..25f4282c 100644 --- a/src/packaging/_elffile.py +++ b/src/packaging/_elffile.py @@ -48,8 +48,8 @@ def __init__(self, f: IO[bytes]) -> None: try: ident = self._read("16B") - except struct.error: - raise ELFInvalid("unable to parse identification") + except struct.error as e: + raise ELFInvalid("unable to parse identification") from e magic = bytes(ident[:4]) if magic != b"\x7fELF": raise ELFInvalid(f"invalid magic: {magic!r}") @@ -67,11 +67,11 @@ def __init__(self, f: IO[bytes]) -> None: (2, 1): ("HHIQQQIHHH", ">IIQQQQQQ", (0, 2, 5)), # 64-bit MSB. }[(self.capacity, self.encoding)] - except KeyError: + except KeyError as e: raise ELFInvalid( f"unrecognized capacity ({self.capacity}) or " f"encoding ({self.encoding})" - ) + ) from e try: ( diff --git a/src/packaging/_manylinux.py b/src/packaging/_manylinux.py index 08f651fb..61339a6f 100644 --- a/src/packaging/_manylinux.py +++ b/src/packaging/_manylinux.py @@ -164,6 +164,7 @@ def _parse_glibc_version(version_str: str) -> tuple[int, int]: f"Expected glibc version with 2 components major.minor," f" got: {version_str}", RuntimeWarning, + stacklevel=2, ) return -1, -1 return int(m.group("major")), int(m.group("minor")) diff --git a/src/packaging/metadata.py b/src/packaging/metadata.py index e01ef0a5..873c9011 100644 --- a/src/packaging/metadata.py +++ b/src/packaging/metadata.py @@ -1,5 +1,6 @@ from __future__ import annotations +import builtins import email.feedparser import email.header import email.message @@ -21,9 +22,9 @@ T = typing.TypeVar("T") -try: - ExceptionGroup -except NameError: # pragma: no cover +if "ExceptionGroup" in builtins.__dict__: # pragma: no cover + ExceptionGroup = ExceptionGroup +else: # pragma: no cover class ExceptionGroup(Exception): """A minimal implementation of :external:exc:`ExceptionGroup` from Python 3.11. @@ -42,9 +43,6 @@ def __init__(self, message: str, exceptions: list[Exception]) -> None: def __repr__(self) -> str: return f"{self.__class__.__name__}({self.message!r}, {self.exceptions!r})" -else: # pragma: no cover - ExceptionGroup = ExceptionGroup - class InvalidMetadata(ValueError): """A metadata field contains invalid data.""" @@ -224,8 +222,8 @@ def _get_payload(msg: email.message.Message, source: bytes | str) -> str: bpayload: bytes = msg.get_payload(decode=True) try: return bpayload.decode("utf8", "strict") - except UnicodeDecodeError: - raise ValueError("payload in an invalid encoding") + except UnicodeDecodeError as exc: + raise ValueError("payload in an invalid encoding") from exc # The various parse_FORMAT functions here are intended to be as lenient as @@ -535,7 +533,7 @@ def _process_name(self, value: str) -> str: except utils.InvalidName as exc: raise self._invalid_metadata( f"{value!r} is invalid for {{field}}", cause=exc - ) + ) from exc else: return value @@ -547,7 +545,7 @@ def _process_version(self, value: str) -> version_module.Version: except version_module.InvalidVersion as exc: raise self._invalid_metadata( f"{value!r} is invalid for {{field}}", cause=exc - ) + ) from exc def _process_summary(self, value: str) -> str: """Check the field contains no newlines.""" @@ -608,7 +606,7 @@ def _process_provides_extra( except utils.InvalidName as exc: raise self._invalid_metadata( f"{name!r} is invalid for {{field}}", cause=exc - ) + ) from exc else: return normalized_names @@ -618,7 +616,7 @@ def _process_requires_python(self, value: str) -> specifiers.SpecifierSet: except specifiers.InvalidSpecifier as exc: raise self._invalid_metadata( f"{value!r} is invalid for {{field}}", cause=exc - ) + ) from exc def _process_requires_dist( self, @@ -629,7 +627,9 @@ def _process_requires_dist( for req in value: reqs.append(requirements.Requirement(req)) except requirements.InvalidRequirement as exc: - raise self._invalid_metadata(f"{req!r} is invalid for {{field}}", cause=exc) + raise self._invalid_metadata( + f"{req!r} is invalid for {{field}}", cause=exc + ) from exc else: return reqs diff --git a/tests/test_metadata.py b/tests/test_metadata.py index 7362d62f..dc3f79bd 100644 --- a/tests/test_metadata.py +++ b/tests/test_metadata.py @@ -427,7 +427,7 @@ def test_invalid_metadata_version(self, version): meta = metadata.Metadata.from_raw({"metadata_version": version}, validate=False) with pytest.raises(metadata.InvalidMetadata): - meta.metadata_version + meta.metadata_version # noqa: B018 def test_valid_version(self): version_str = "1.2.3" @@ -437,7 +437,7 @@ def test_valid_version(self): def test_missing_version(self): meta = metadata.Metadata.from_raw({}, validate=False) with pytest.raises(metadata.InvalidMetadata) as exc_info: - meta.version + meta.version # noqa: B018 assert exc_info.value.field == "version" def test_invalid_version(self): @@ -456,7 +456,7 @@ def test_invalid_summary(self): ) with pytest.raises(metadata.InvalidMetadata) as exc_info: - meta.summary + meta.summary # noqa: B018 assert exc_info.value.field == "summary" def test_valid_name(self): @@ -506,7 +506,7 @@ def test_invalid_description_content_type(self, content_type): ) with pytest.raises(metadata.InvalidMetadata): - meta.description_content_type + meta.description_content_type # noqa: B018 def test_keywords(self): keywords = ["hello", "world"] @@ -602,14 +602,14 @@ def test_invalid_dynamic_value(self): meta = metadata.Metadata.from_raw({"dynamic": dynamic}, validate=False) with pytest.raises(metadata.InvalidMetadata): - meta.dynamic + meta.dynamic # noqa: B018 @pytest.mark.parametrize("field_name", ["name", "version", "metadata-version"]) def test_disallowed_dynamic(self, field_name): meta = metadata.Metadata.from_raw({"dynamic": [field_name]}, validate=False) with pytest.raises(metadata.InvalidMetadata): - meta.dynamic + meta.dynamic # noqa: B018 @pytest.mark.parametrize( "field_name",