Skip to content

Commit

Permalink
Message.__getitem__ now raises a KeyError on missing keys.
Browse files Browse the repository at this point in the history
Ref #371
  • Loading branch information
jaraco committed Jun 23, 2024
1 parent 32c14aa commit a970a49
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 28 deletions.
23 changes: 8 additions & 15 deletions importlib_metadata/_adapters.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,8 @@
import functools
import warnings
import re
import textwrap
import email.message

from ._text import FoldedCase
from ._compat import pypy_partial


# Do not remove prior to 2024-01-01 or Python 3.14
_warn = functools.partial(
warnings.warn,
"Implicit None on return values is deprecated and will raise KeyErrors.",
DeprecationWarning,
stacklevel=pypy_partial(2),
)


class Message(email.message.Message):
Expand Down Expand Up @@ -53,12 +41,17 @@ def __iter__(self):

def __getitem__(self, item):
"""
Warn users that a ``KeyError`` can be expected when a
missing key is supplied. Ref python/importlib_metadata#371.
Override parent behavior to typical dict behavior.
``email.message.Message`` will emit None values for missing
keys. Typical mappings, including this ``Message``, will raise
a key error for missing keys.
Ref python/importlib_metadata#371.
"""
res = super().__getitem__(item)
if res is None:
_warn()
raise KeyError(item)
return res

def _repair_headers(self):
Expand Down
1 change: 1 addition & 0 deletions newsfragments/371.removal.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Message.__getitem__ now raises a KeyError on missing keys.
17 changes: 4 additions & 13 deletions tests/test_api.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
import re
import textwrap
import unittest
import warnings
import importlib
import contextlib

from . import fixtures
from importlib_metadata import (
Expand All @@ -18,13 +16,6 @@
)


@contextlib.contextmanager
def suppress_known_deprecation():
with warnings.catch_warnings(record=True) as ctx:
warnings.simplefilter('default', category=DeprecationWarning)
yield ctx


class APITests(
fixtures.EggInfoPkg,
fixtures.EggInfoPkgPipInstalledNoToplevel,
Expand Down Expand Up @@ -157,13 +148,13 @@ def test_importlib_metadata_version(self):
resolved = version('importlib-metadata')
assert re.match(self.version_pattern, resolved)

def test_missing_key_legacy(self):
def test_missing_key(self):
"""
Requesting a missing key will still return None, but warn.
Requesting a missing key raises KeyError.
"""
md = metadata('distinfo-pkg')
with suppress_known_deprecation():
assert md['does-not-exist'] is None
with self.assertRaises(KeyError):
md['does-not-exist']

def test_get_key(self):
"""
Expand Down

0 comments on commit a970a49

Please sign in to comment.