@@ -157,38 +157,48 @@ def from_json(cls, json_dict: Dict) -> Size:
157157 return cls (json_dict ["SizeInBytes" ], json_dict ["HumaneSize" ])
158158
159159
160+ # todo: https://issues.hibernatingrhinos.com/issue/RDBC-686
160161class CaseInsensitiveDict (dict , Generic [_TKey , _TVal ]):
161162 @classmethod
162- def _k (cls , key ):
163+ def _lower_if_str (cls , key ):
163164 return key .lower () if isinstance (key , str ) else key
164165
165166 def __init__ (self , * args , ** kwargs ):
166167 super (CaseInsensitiveDict , self ).__init__ (* args , ** kwargs )
168+ self ._original_values : Dict [_TKey , _TKey ] = {}
167169 self ._convert_keys ()
168170
169- def __getitem__ (self , key ) -> Tuple [_TKey , _TVal ]:
170- return super (CaseInsensitiveDict , self ).__getitem__ (self .__class__ ._k (key ))
171+ def _convert_key_back (self , lowered_key : _TKey ) -> _TKey :
172+ return self ._original_values [lowered_key ]
173+
174+ def _convert_item_back (self , item : Tuple [_TKey , _TVal ]) -> Tuple [_TKey , _TVal ]:
175+ return self ._convert_key_back (item [0 ]), item [1 ]
176+
177+ def __getitem__ (self , key ) -> _TVal :
178+ return super (CaseInsensitiveDict , self ).__getitem__ (self .__class__ ._lower_if_str (key ))
171179
172180 def __setitem__ (self , key , value ):
173- super (CaseInsensitiveDict , self ).__setitem__ (self .__class__ ._k (key ), value )
181+ adjusted_key = self .__class__ ._lower_if_str (key )
182+ self ._original_values [adjusted_key ] = key
183+ super (CaseInsensitiveDict , self ).__setitem__ (adjusted_key , value )
174184
175185 def __delitem__ (self , key ):
176- return super (CaseInsensitiveDict , self ).__delitem__ (self .__class__ ._k (key ))
186+ return super (CaseInsensitiveDict , self ).__delitem__ (self .__class__ ._lower_if_str (key ))
177187
178188 def __contains__ (self , key ):
179- return super (CaseInsensitiveDict , self ).__contains__ (self .__class__ ._k (key ))
189+ return super (CaseInsensitiveDict , self ).__contains__ (self .__class__ ._lower_if_str (key ))
180190
181- def pop (self , key , * args , ** kwargs ) -> Tuple [ _TKey , _TVal ] :
182- return super (CaseInsensitiveDict , self ).pop (self .__class__ ._k (key ), * args , ** kwargs )
191+ def pop (self , key , * args , ** kwargs ) -> _TVal :
192+ return super (CaseInsensitiveDict , self ).pop (self .__class__ ._lower_if_str (key ), * args , ** kwargs )
183193
184194 def remove (self , key , * args , ** kwargs ) -> Optional [_TVal ]:
185195 return self .pop (key , * args , ** kwargs ) if key in self else None
186196
187197 def get (self , key , * args , ** kwargs ) -> _TVal :
188- return super (CaseInsensitiveDict , self ).get (self .__class__ ._k (key ), * args , ** kwargs )
198+ return super (CaseInsensitiveDict , self ).get (self .__class__ ._lower_if_str (key ), * args , ** kwargs )
189199
190200 def setdefault (self , key , * args , ** kwargs ):
191- return super (CaseInsensitiveDict , self ).setdefault (self .__class__ ._k (key ), * args , ** kwargs )
201+ return super (CaseInsensitiveDict , self ).setdefault (self .__class__ ._lower_if_str (key ), * args , ** kwargs )
192202
193203 def update (self , e = None , ** f ):
194204 super (CaseInsensitiveDict , self ).update (self .__class__ (e ))
@@ -199,6 +209,9 @@ def _convert_keys(self):
199209 v = super (CaseInsensitiveDict , self ).pop (k )
200210 self .__setitem__ (k , v )
201211
212+ def keys (self ) -> List [_TKey ]:
213+ return list (self ._original_values .values ())
214+
202215
203216class CaseInsensitiveSet (set ):
204217 @classmethod
0 commit comments