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" 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__ = ''