Skip to content

Commit

Permalink
structures: little bit more general, lower-key-caching version of Cas…
Browse files Browse the repository at this point in the history
…eInsensitiveDict
  • Loading branch information
Gulácsi Tamás committed Jul 23, 2011
1 parent f408829 commit 04c456b
Showing 1 changed file with 25 additions and 6 deletions.
31 changes: 25 additions & 6 deletions requests/structures.py
Expand Up @@ -9,20 +9,39 @@
"""

class CaseInsensitiveDict(dict):
"""Case-insensitive Dictionary for :class:`Response <models.Response>` Headers.
"""Case-insensitive Dictionary
For example, ``headers['content-encoding']`` will return the
value of a ``'Content-Encoding'`` response header."""

def _lower_keys(self):
return map(str.lower, self.keys())
@property
def lower_keys(self):
if not hasattr(self, '_lower_keys') or not self._lower_keys:
self._lower_keys = dict((k.lower(), k) for k in self.iterkeys())
return self._lower_keys

def _clear_lower_keys(self):
if hasattr(self, '_lower_keys'):
self._lower_keys.clear()

def __contains__(self, key):
return key.lower() in self._lower_keys()
def __setitem__(self, key, value):
dict.__setitem__(self, key, value)
self._clear_lower_keys()

def __delitem__(self, key):
dict.__delitem__(self, key, value)
self._lower_keys.clear()

def __contains__(self, key):
return key.lower() in self.lower_keys

def __getitem__(self, key):
# We allow fall-through here, so values default to None
if key in self:
return self.items()[self._lower_keys().index(key.lower())][1]
return dict.__getitem__(self, self.lower_keys[key.lower()])

def get(self, key, default=None):
if key in self:
return self[key]
else:
return default

0 comments on commit 04c456b

Please sign in to comment.