diff options
author | Andy McCurdy <andy@andymccurdy.com> | 2019-05-23 15:26:12 -0700 |
---|---|---|
committer | Andy McCurdy <andy@andymccurdy.com> | 2019-05-28 16:17:40 -0700 |
commit | e5eaf56f0775f19594087aec9045e609414e20bf (patch) | |
tree | c25290f3b62830a599f8c490370be56649528d00 | |
parent | 904d651c505a9a54cd41da33d9ebd20339c48ee7 (diff) | |
download | redis-py-e5eaf56f0775f19594087aec9045e609414e20bf.tar.gz |
case insensitive response callbacks.
this change allows users to call client.execute_command('info') or
client.execute_command('INFO') and get the same parsed result.
Fixes #1168
-rwxr-xr-x | redis/client.py | 30 | ||||
-rw-r--r-- | tests/test_commands.py | 3 |
2 files changed, 32 insertions, 1 deletions
diff --git a/redis/client.py b/redis/client.py index 6ae868b..b87fcf6 100755 --- a/redis/client.py +++ b/redis/client.py @@ -68,6 +68,33 @@ def dict_merge(*dicts): return merged +class CaseInsensitiveDict(dict): + "Case insensitive dict implementation. Assumes string keys only." + + def __init__(self, data): + for k, v in iteritems(data): + self[k.upper()] = v + + def __contains__(self, k): + return super(CaseInsensitiveDict, self).__contains__(k.upper()) + + def __delitem__(self, k): + super(CaseInsensitiveDict, self).__delitem__(k.upper()) + + def __getitem__(self, k): + return super(CaseInsensitiveDict, self).__getitem__(k.upper()) + + def get(self, k, default=None): + return super(CaseInsensitiveDict, self).get(k.upper(), default) + + def __setitem__(self, k, v): + super(CaseInsensitiveDict, self).__setitem__(k.upper(), v) + + def update(self, data): + data = CaseInsensitiveDict(data) + super(CaseInsensitiveDict, self).update(data) + + def parse_debug_object(response): "Parse the results of Redis's DEBUG OBJECT command into a Python dict" # The 'type' of the object is the first item in the response, but isn't @@ -663,7 +690,8 @@ class Redis(object): connection_pool = ConnectionPool(**kwargs) self.connection_pool = connection_pool - self.response_callbacks = self.__class__.RESPONSE_CALLBACKS.copy() + self.response_callbacks = CaseInsensitiveDict( + self.__class__.RESPONSE_CALLBACKS) def __repr__(self): return "%s<%s>" % (type(self).__name__, repr(self.connection_pool)) diff --git a/tests/test_commands.py b/tests/test_commands.py index 33f78d5..0815427 100644 --- a/tests/test_commands.py +++ b/tests/test_commands.py @@ -54,6 +54,9 @@ class TestResponseCallbacks(object): r['a'] = 'foo' assert r['a'] == 'static' + def test_case_insensitive_command_names(self, r): + assert r.response_callbacks['del'] == r.response_callbacks['DEL'] + class TestRedisCommands(object): |