Skip to content

Commit

Permalink
For now inline the implementation until it can be linked. Ref #1673.
Browse files Browse the repository at this point in the history
  • Loading branch information
jaraco committed Dec 17, 2017
1 parent 49473bf commit 3bcefda
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 4 deletions.
65 changes: 62 additions & 3 deletions cherrypy/lib/httputil.py
Expand Up @@ -22,8 +22,6 @@
from six.moves import range
from six.moves.BaseHTTPServer import BaseHTTPRequestHandler

import jaraco.collections

from cherrypy._cpcompat import ntob, ntou
from cherrypy._cpcompat import text_or_bytes
from cherrypy._cpcompat import unquote_qs
Expand Down Expand Up @@ -379,7 +377,68 @@ def parse_query_string(query_string, keep_blank_values=True, encoding='utf-8'):
return pm


class CaseInsensitiveDict(jaraco.collections.KeyTransformingDict):
####
# Inlined from jaraco.collections 1.5.2
# Ref #1673
class KeyTransformingDict(dict):
"""
A dict subclass that transforms the keys before they're used.
Subclasses may override the default transform_key to customize behavior.
"""
@staticmethod
def transform_key(key):
return key

def __init__(self, *args, **kargs):
super(KeyTransformingDict, self).__init__()
# build a dictionary using the default constructs
d = dict(*args, **kargs)
# build this dictionary using transformed keys.
for item in d.items():
self.__setitem__(*item)

def __setitem__(self, key, val):
key = self.transform_key(key)
super(KeyTransformingDict, self).__setitem__(key, val)

def __getitem__(self, key):
key = self.transform_key(key)
return super(KeyTransformingDict, self).__getitem__(key)

def __contains__(self, key):
key = self.transform_key(key)
return super(KeyTransformingDict, self).__contains__(key)

def __delitem__(self, key):
key = self.transform_key(key)
return super(KeyTransformingDict, self).__delitem__(key)

def get(self, key, *args, **kwargs):
key = self.transform_key(key)
return super(KeyTransformingDict, self).get(key, *args, **kwargs)

def setdefault(self, key, *args, **kwargs):
key = self.transform_key(key)
return super(KeyTransformingDict, self).setdefault(
key, *args, **kwargs)

def pop(self, key, *args, **kwargs):
key = self.transform_key(key)
return super(KeyTransformingDict, self).pop(key, *args, **kwargs)

def matching_key_for(self, key):
"""
Given a key, return the actual key stored in self that matches.
Raise KeyError if the key isn't found.
"""
try:
return next(e_key for e_key in self.keys() if e_key == key)
except StopIteration:
raise KeyError(key)
####


class CaseInsensitiveDict(KeyTransformingDict):

"""A case-insensitive dict subclass.
Expand Down
1 change: 0 additions & 1 deletion setup.py
Expand Up @@ -60,7 +60,6 @@
'six>=1.11.0',
'cheroot>=5.8.3',
'portend>=2.1.1',
'jaraco.collections',
]

extras_require = {
Expand Down

0 comments on commit 3bcefda

Please sign in to comment.