A dict-like structure that accepts strings or bytes as keys and allows case-insensitive lookups.
| 100 | |
| 101 | |
| 102 | class CaseInsensitiveDict(collections.UserDict[str | bytes, Any]): |
| 103 | """A dict-like structure that accepts strings or bytes |
| 104 | as keys and allows case-insensitive lookups. |
| 105 | """ |
| 106 | |
| 107 | def __init__(self, *args: Any, **kwargs: Any) -> None: |
| 108 | self._keys: dict[str | bytes, Any] = {} |
| 109 | super().__init__(*args, **kwargs) |
| 110 | |
| 111 | def __getitem__(self, key: str | bytes) -> Any: |
| 112 | normalized_key = self._normkey(key) |
| 113 | return super().__getitem__(self._keys[normalized_key.lower()]) |
| 114 | |
| 115 | def __setitem__(self, key: str | bytes, value: Any) -> None: |
| 116 | normalized_key = self._normkey(key) |
| 117 | try: |
| 118 | lower_key = self._keys[normalized_key.lower()] |
| 119 | del self[lower_key] |
| 120 | except KeyError: |
| 121 | pass |
| 122 | super().__setitem__(normalized_key, self._normvalue(value)) |
| 123 | self._keys[normalized_key.lower()] = normalized_key |
| 124 | |
| 125 | def __delitem__(self, key: str | bytes) -> None: |
| 126 | normalized_key = self._normkey(key) |
| 127 | stored_key = self._keys.pop(normalized_key.lower()) |
| 128 | super().__delitem__(stored_key) |
| 129 | |
| 130 | def __contains__(self, key: str | bytes) -> bool: # type: ignore[override] |
| 131 | normalized_key = self._normkey(key) |
| 132 | return normalized_key.lower() in self._keys |
| 133 | |
| 134 | def __repr__(self) -> str: |
| 135 | return f"<{self.__class__.__name__}: {super().__repr__()}>" |
| 136 | |
| 137 | def _normkey(self, key: str | bytes) -> str | bytes: |
| 138 | return key |
| 139 | |
| 140 | def _normvalue(self, value: Any) -> Any: |
| 141 | return value |
| 142 | |
| 143 | |
| 144 | class LocalCache(OrderedDict[_KT, _VT]): |
no outgoing calls
no test coverage detected