From 94de9874d75a42d537daaa4b04b8355f271e1bec Mon Sep 17 00:00:00 2001 From: Shahadat Islam Koyel <179203101+ShahadatTest@users.noreply.github.com> Date: Tue, 27 Oct 2026 10:19:05 +0600 Subject: [PATCH 1/2] Preserve dictionary errors in case-insensitive mappings --- humanfriendly/case.py | 6 +++--- humanfriendly/tests.py | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/humanfriendly/case.py b/humanfriendly/case.py index 4c71857..5c5331b 100644 --- a/humanfriendly/case.py +++ b/humanfriendly/case.py @@ -74,9 +74,9 @@ def get(self, key, default=None): """Get the value of an existing item.""" return super(CaseInsensitiveDict, self).get(self.coerce_key(key), default) - def pop(self, key, default=None): + def pop(self, key, *default): """Remove an item from a case insensitive dictionary.""" - return super(CaseInsensitiveDict, self).pop(self.coerce_key(key), default) + return super(CaseInsensitiveDict, self).pop(self.coerce_key(key), *default) def setdefault(self, key, default=None): """Get the value of an existing item or add a new item.""" @@ -95,7 +95,7 @@ def update(self, other=None, **kw): elif other is not None: # Complain about unsupported values. msg = "'%s' object is not iterable" - type_name = type(value).__name__ + type_name = type(other).__name__ raise TypeError(msg % type_name) # Copy the keyword arguments (if any). for key, value in kw.items(): diff --git a/humanfriendly/tests.py b/humanfriendly/tests.py index 72dad99..5f1e24f 100644 --- a/humanfriendly/tests.py +++ b/humanfriendly/tests.py @@ -172,6 +172,20 @@ def test_case_insensitive_dict(self): obj['Existing_Key'] = 11 assert obj['existing_key'] == 11 + def test_case_insensitive_pop_missing(self): + """Preserve the distinction between a missing and an explicit default.""" + obj = CaseInsensitiveDict() + self.assertRaises(KeyError, obj.pop, 'Missing') + assert obj.pop('Missing', None) is None + sentinel = object() + assert obj.pop('Missing', sentinel) is sentinel + + def test_case_insensitive_update_invalid(self): + """Reject unsupported update sources with TypeError.""" + obj = CaseInsensitiveDict() + self.assertRaises(TypeError, obj.update, 42) + assert not obj + def test_case_insensitive_key(self): """Test the CaseInsensitiveKey class.""" # Test the __eq__() special method. From 9879cf630779c63167bfc54a5ebebd5163e2c8ed Mon Sep 17 00:00:00 2001 From: Shahadat Islam Koyel <179203101+ShahadatTest@users.noreply.github.com> Date: Tue, 27 Oct 2026 10:41:43 +0600 Subject: [PATCH 2/2] Preserve keyword defaults in case-insensitive pop --- humanfriendly/case.py | 8 ++++++-- humanfriendly/tests.py | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/humanfriendly/case.py b/humanfriendly/case.py index 5c5331b..010a5a0 100644 --- a/humanfriendly/case.py +++ b/humanfriendly/case.py @@ -33,6 +33,8 @@ # Public identifiers that require documentation. __all__ = ("CaseInsensitiveDict", "CaseInsensitiveKey") +_MISSING = object() + class CaseInsensitiveDict(collections.OrderedDict): @@ -74,9 +76,11 @@ def get(self, key, default=None): """Get the value of an existing item.""" return super(CaseInsensitiveDict, self).get(self.coerce_key(key), default) - def pop(self, key, *default): + def pop(self, key, default=_MISSING): """Remove an item from a case insensitive dictionary.""" - return super(CaseInsensitiveDict, self).pop(self.coerce_key(key), *default) + if default is _MISSING: + return super(CaseInsensitiveDict, self).pop(self.coerce_key(key)) + return super(CaseInsensitiveDict, self).pop(self.coerce_key(key), default) def setdefault(self, key, default=None): """Get the value of an existing item or add a new item.""" diff --git a/humanfriendly/tests.py b/humanfriendly/tests.py index 5f1e24f..a7a8375 100644 --- a/humanfriendly/tests.py +++ b/humanfriendly/tests.py @@ -177,6 +177,7 @@ def test_case_insensitive_pop_missing(self): obj = CaseInsensitiveDict() self.assertRaises(KeyError, obj.pop, 'Missing') assert obj.pop('Missing', None) is None + assert obj.pop('Missing', default=None) is None sentinel = object() assert obj.pop('Missing', sentinel) is sentinel