From f2e9c39bb2d91ed57e92d55e82feb70daade6b2a Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Sat, 17 Dec 2022 17:22:14 -0500 Subject: [PATCH 1/3] Add test capturing that a missing key raises a KeyError. Ref #371. --- tests/test_api.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/test_api.py b/tests/test_api.py index f65287a5..a9c1f194 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -141,6 +141,15 @@ def test_importlib_metadata_version(self): resolved = version('importlib-metadata') assert re.match(self.version_pattern, resolved) + @__import__('pytest').mark.xfail(reason="not implemented #371") + 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 From 19fa35a5dec5b1cc2b6883581f17c80f6d7c9b97 Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Sat, 19 Mar 2022 15:33:08 -0400 Subject: [PATCH 2/3] When requesting an item from metadata, if it's not present, raise a KeyError. Fixes #371. --- importlib_metadata/_adapters.py | 14 ++++++++++++++ tests/test_api.py | 1 - 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/importlib_metadata/_adapters.py b/importlib_metadata/_adapters.py index aa460d3e..c8576cd9 100644 --- a/importlib_metadata/_adapters.py +++ b/importlib_metadata/_adapters.py @@ -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" diff --git a/tests/test_api.py b/tests/test_api.py index a9c1f194..d3ae8144 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -141,7 +141,6 @@ def test_importlib_metadata_version(self): resolved = version('importlib-metadata') assert re.match(self.version_pattern, resolved) - @__import__('pytest').mark.xfail(reason="not implemented #371") def test_missing_key(self): """ Attempting to request missing metadata raises KeyError. From 612603cc75acf896f2774cb4b67193279281b104 Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Sat, 17 Dec 2022 17:33:54 -0500 Subject: [PATCH 3/3] Update changelog. --- CHANGES.rst | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index cf7dcf16..4a03eb0b 100644 --- a/CHANGES.rst +++ b/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 ======