Skip to content

Commit

Permalink
Merge pull request #416 from python/feature/no-getitem-none
Browse files Browse the repository at this point in the history
Raise KeyError when requesting a metadata value that doesn't exist
  • Loading branch information
jaraco committed Dec 18, 2022
2 parents 7662a60 + 612603c commit 2d2cb83
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 0 deletions.
15 changes: 15 additions & 0 deletions CHANGES.rst
@@ -1,3 +1,18 @@
v6.0.0
======

* #371: When a key is missing from metadata, raise a ``KeyError``
instead of returning ``None``, matching the usual expectation for
mapping objects and also the protocol definition.

Projects should update to expect the ``KeyError`` or wrap the call
to replace a ``KeyError`` with a ``None`` return, e.g.::

try:
value = metadata(pkg)['Name']
except KeyError:
value = None

v5.1.0
======

Expand Down
14 changes: 14 additions & 0 deletions importlib_metadata/_adapters.py
Expand Up @@ -39,6 +39,20 @@ def __init__(self, *args, **kwargs):
def __iter__(self):
return super().__iter__()

def __getitem__(self, item):
"""
Prefer dict-like behavior for __getitem__ when keys are missing.
>>> msg = Message(email.message.Message())
>>> msg['thing']
Traceback (most recent call last):
...
KeyError: 'thing'
"""
res = super().__getitem__(item)
if res is None:
raise KeyError(item)
return res

def _repair_headers(self):
def redent(value):
"Correct for RFC822 indentation"
Expand Down
8 changes: 8 additions & 0 deletions tests/test_api.py
Expand Up @@ -141,6 +141,14 @@ def test_importlib_metadata_version(self):
resolved = version('importlib-metadata')
assert re.match(self.version_pattern, resolved)

def test_missing_key(self):
"""
Attempting to request missing metadata raises KeyError.
"""
md = metadata('distinfo-pkg')
with self.assertRaises(KeyError):
md['does-not-exist']

@staticmethod
def _test_files(files):
root = files[0].root
Expand Down

0 comments on commit 2d2cb83

Please sign in to comment.