From 4b6f4c0ade63be5d2232549983f62c626c7ee219 Mon Sep 17 00:00:00 2001 From: bret barker Date: Thu, 27 Mar 2014 12:06:40 -0400 Subject: [PATCH 1/3] fix #49 - convert member to string in zscore and zrank --- mockredis/sortedset.py | 6 ++++-- mockredis/tests/test_zset.py | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/mockredis/sortedset.py b/mockredis/sortedset.py index acfd7a8..6d5d399 100644 --- a/mockredis/sortedset.py +++ b/mockredis/sortedset.py @@ -34,7 +34,7 @@ def __len__(self): return len(self._members) def __contains__(self, member): - return member in self._members + return str(member) in self._members def __str__(self): return self.__repr__() @@ -93,6 +93,7 @@ def remove(self, member): """ Identical to __delitem__, but returns whether a member was removed. """ + member = str(member) if member not in self: return False score = self._members[member] @@ -106,12 +107,13 @@ def score(self, member): Identical to __getitem__, but returns None instead of raising KeyError if member is not found. """ - return self._members.get(member) + return self._members.get(str(member)) def rank(self, member): """ Get the rank (index of a member). """ + member = str(member) score = self._members.get(member) if score is None: return None diff --git a/mockredis/tests/test_zset.py b/mockredis/tests/test_zset.py index e61137c..cb5f7c4 100644 --- a/mockredis/tests/test_zset.py +++ b/mockredis/tests/test_zset.py @@ -140,6 +140,13 @@ def test_zscore(self): self.redis.zadd(key, "one", 1.0) eq_(1.0, self.redis.zscore(key, "one")) + def test_zscore_int_member(self): + key = "zset" + eq_(None, self.redis.zscore(key, 1)) + + self.redis.zadd(key, 1, 1.0) + eq_(1.0, self.redis.zscore(key, 1)) + def test_zrank(self): key = "zset" eq_(None, self.redis.zrank(key, "two")) @@ -149,6 +156,15 @@ def test_zrank(self): eq_(0, self.redis.zrank(key, "one")) eq_(1, self.redis.zrank(key, "two")) + def test_zrank_int_member(self): + key = "zset" + eq_(None, self.redis.zrank(key, 2)) + + self.redis.zadd(key, "one", 1.0) + self.redis.zadd(key, 2, 2.0) + eq_(0, self.redis.zrank(key, "one")) + eq_(1, self.redis.zrank(key, 2)) + def test_zcount(self): key = "zset" eq_(0, self.redis.zcount(key, "-inf", "inf")) From fb3be72ea01b04f1438e012fb957ebd6909456cc Mon Sep 17 00:00:00 2001 From: Jesse Myers Date: Tue, 27 May 2014 16:12:35 -0700 Subject: [PATCH 2/3] Bump version on new release branch --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 966383f..35947c6 100755 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ from setuptools import setup, find_packages # Match releases to redis-py versions -__version__ = '2.9.0.7' +__version__ = '2.9.0.8' # Jenkins will replace __build__ with a unique value. __build__ = '' From 92f7acb169c13988aeb2b60c8c9ef32072925edd Mon Sep 17 00:00:00 2001 From: bret barker Date: Tue, 3 Jun 2014 11:20:52 -0400 Subject: [PATCH 3/3] fix #58, don't cast to string first if score_cast_func == float to avoid truncation of the decimal --- mockredis/client.py | 6 +++++- mockredis/tests/test_zset.py | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/mockredis/client.py b/mockredis/client.py index 69d0b67..e37e5d8 100644 --- a/mockredis/client.py +++ b/mockredis/client.py @@ -1309,7 +1309,11 @@ def _range_func(self, withscores, score_cast_func): Return a suitable function from (score, member) """ if withscores: - return lambda score_member: (score_member[1], score_cast_func(str(score_member[0]))) + if score_cast_func == float: + # don't cast to string first or it will truncate the float, see #58 + return lambda score_member: (score_member[1], score_cast_func(score_member[0])) + else: + return lambda score_member: (score_member[1], score_cast_func(str(score_member[0]))) else: return lambda score_member: score_member[1] diff --git a/mockredis/tests/test_zset.py b/mockredis/tests/test_zset.py index cb5f7c4..16a422a 100644 --- a/mockredis/tests/test_zset.py +++ b/mockredis/tests/test_zset.py @@ -147,6 +147,13 @@ def test_zscore_int_member(self): self.redis.zadd(key, 1, 1.0) eq_(1.0, self.redis.zscore(key, 1)) + def test_zscore_float_member(self): + key = "zset" + eq_(None, self.redis.zscore(key, 1)) + + self.redis.zadd(key, 1, 1.2345678901234) + eq_(1.2345678901234, self.redis.zscore(key, 1)) + def test_zrank(self): key = "zset" eq_(None, self.redis.zrank(key, "two")) @@ -313,6 +320,14 @@ def test_zremrangebyscore(self): eq_([], self.redis.zrange(key, 0, -1)) eq_([], self.redis.keys("*")) + def test_zrange_float_scores(self): + """ + Make sure zrange doesn't truncate our floats, see #58 + """ + key = "zset" + self.redis.zadd(key, "long", 1.2345678901234) + eq_([("long", 1.2345678901234)], self.redis.zrange(key, 0, -1, withscores=True)) + def test_zunionstore_no_keys(self): key = "zset"