Hello community,

here is the log from the commit of package python-fakeredis for 
openSUSE:Factory checked in at 2019-09-13 15:03:02
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-fakeredis (Old)
 and      /work/SRC/openSUSE:Factory/.python-fakeredis.new.7948 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-fakeredis"

Fri Sep 13 15:03:02 2019 rev:3 rq:730624 version:1.0.5

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-fakeredis/python-fakeredis.changes        
2019-08-22 10:55:56.973671082 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-fakeredis.new.7948/python-fakeredis.changes  
    2019-09-13 15:04:40.153265016 +0200
@@ -1,0 +2,6 @@
+Fri Sep 13 07:55:04 UTC 2019 - Tomáš Chvátal <tchva...@suse.com>
+
+- Update to 1.0.5:
+  * No upstream changelog
+
+-------------------------------------------------------------------

Old:
----
  fakeredis-1.0.4.tar.gz

New:
----
  fakeredis-1.0.5.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-fakeredis.spec ++++++
--- /var/tmp/diff_new_pack.LdFRRQ/_old  2019-09-13 15:04:40.649264911 +0200
+++ /var/tmp/diff_new_pack.LdFRRQ/_new  2019-09-13 15:04:40.649264911 +0200
@@ -18,7 +18,7 @@
 
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
 Name:           python-fakeredis
-Version:        1.0.4
+Version:        1.0.5
 Release:        0
 Summary:        Fake implementation of redis API for testing purposes
 License:        BSD-3-Clause AND MIT
@@ -37,7 +37,6 @@
 Suggests:       python-lupa
 BuildArch:      noarch
 # SECTION test requirements
-# bug in https://github.com/jamesls/fakeredis/issues/235
 BuildRequires:  %{python_module future}
 BuildRequires:  %{python_module lupa}
 BuildRequires:  %{python_module redis}

++++++ fakeredis-1.0.4.tar.gz -> fakeredis-1.0.5.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fakeredis-1.0.4/PKG-INFO new/fakeredis-1.0.5/PKG-INFO
--- old/fakeredis-1.0.4/PKG-INFO        2019-08-14 11:55:44.000000000 +0200
+++ new/fakeredis-1.0.5/PKG-INFO        2019-09-05 11:51:08.000000000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: fakeredis
-Version: 1.0.4
+Version: 1.0.5
 Summary: Fake implementation of redis API for testing purposes.
 Home-page: https://github.com/jamesls/fakeredis
 Author: James Saryerwinnie
@@ -233,7 +233,6 @@
          * object
          * restore
          * touch
-         * unlink
          * wait
         
         
@@ -381,6 +380,12 @@
         Revision history
         ================
         
+        1.0.5
+        -----
+        - `#247 <https://github.com/jamesls/fakeredis/pull/247>`_ Support 
NX/XX/CH flags in ZADD command
+        - `#250 <https://github.com/jamesls/fakeredis/pull/250>`_ Implement 
UNLINK command
+        - `#252 <https://github.com/jamesls/fakeredis/pull/252>`_ Fix 
implementation of ZSCAN
+        
         1.0.4
         -----
         - `#240 <https://github.com/jamesls/fakeredis/issues/240>`_ `#242 
<https://github.com/jamesls/fakeredis/issues/242>`_ Support for ``redis==3.3``
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fakeredis-1.0.4/README.rst 
new/fakeredis-1.0.5/README.rst
--- old/fakeredis-1.0.4/README.rst      2019-08-14 11:31:28.000000000 +0200
+++ new/fakeredis-1.0.5/README.rst      2019-09-05 11:38:09.000000000 +0200
@@ -223,7 +223,6 @@
  * object
  * restore
  * touch
- * unlink
  * wait
 
 
@@ -371,6 +370,12 @@
 Revision history
 ================
 
+1.0.5
+-----
+- `#247 <https://github.com/jamesls/fakeredis/pull/247>`_ Support NX/XX/CH 
flags in ZADD command
+- `#250 <https://github.com/jamesls/fakeredis/pull/250>`_ Implement UNLINK 
command
+- `#252 <https://github.com/jamesls/fakeredis/pull/252>`_ Fix implementation 
of ZSCAN
+
 1.0.4
 -----
 - `#240 <https://github.com/jamesls/fakeredis/issues/240>`_ `#242 
<https://github.com/jamesls/fakeredis/issues/242>`_ Support for ``redis==3.3``
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fakeredis-1.0.4/fakeredis/__init__.py 
new/fakeredis-1.0.5/fakeredis/__init__.py
--- old/fakeredis-1.0.4/fakeredis/__init__.py   2019-08-14 11:30:05.000000000 
+0200
+++ new/fakeredis-1.0.5/fakeredis/__init__.py   2019-09-05 11:38:17.000000000 
+0200
@@ -1,4 +1,4 @@
 from ._server import FakeServer, FakeRedis, FakeStrictRedis, FakeConnection   
# noqa: F401
 
 
-__version__ = '1.0.4'
+__version__ = '1.0.5'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fakeredis-1.0.4/fakeredis/_server.py 
new/fakeredis-1.0.5/fakeredis/_server.py
--- old/fakeredis-1.0.4/fakeredis/_server.py    2019-08-14 11:07:24.000000000 
+0200
+++ new/fakeredis-1.0.5/fakeredis/_server.py    2019-09-05 11:34:50.000000000 
+0200
@@ -47,6 +47,7 @@
 SRC_DST_SAME_MSG = "source and destination objects are the same"
 NO_KEY_MSG = "no such key"
 INDEX_ERROR_MSG = "index out of range"
+ZADD_NX_XX_ERROR_MSG = "ZADD allows either 'nx' or 'xx', not both"
 ZUNIONSTORE_KEYS_MSG = "at least 1 input key is needed for 
ZUNIONSTORE/ZINTERSTORE"
 WRONG_ARGS_MSG = "wrong number of arguments for '{}' command"
 UNKNOWN_COMMAND_MSG = "unknown command '{}'"
@@ -869,7 +870,8 @@
         if pattern is not None:
             regex = compile_pattern(pattern)
             for val in itertools.islice(data, cursor, result_cursor):
-                if regex.match(val):
+                compare_val = val[0] if isinstance(val, tuple) else val
+                if regex.match(compare_val):
                     result_data.append(val)
         else:
             result_data = data[cursor:result_cursor]
@@ -911,8 +913,7 @@
     # Key commands
     # TODO: lots
 
-    @command((Key(),), (Key(),), name='del')
-    def del_(self, *keys):
+    def _delete(self, *keys):
         ans = 0
         done = set()
         for key in keys:
@@ -922,6 +923,14 @@
                 ans += 1
         return ans
 
+    @command((Key(),), (Key(),), name='del')
+    def del_(self, *keys):
+        return self._delete(*keys)
+
+    @command((Key(),), (Key(),), name='unlink')
+    def unlink(self, *keys):
+        return self._delete(*keys)
+
     @command((Key(),), (Key(),))
     def exists(self, *keys):
         ret = 0
@@ -1895,19 +1904,55 @@
 
     @command((Key(ZSet), bytes, bytes), (bytes,))
     def zadd(self, key, *args):
-        # TODO: handle NX, XX, CH, INCR
+        # TODO: handle INCR
         zset = key.value
-        if len(args) % 2 != 0:
+
+        i = 0
+        ch = False
+        nx = False
+        xx = False
+        while i < len(args):
+            if casematch(args[i], b'ch'):
+                ch = True
+                i += 1
+            elif casematch(args[i], b'nx'):
+                nx = True
+                i += 1
+            elif casematch(args[i], b'xx'):
+                xx = True
+                i += 1
+            else:
+                # First argument not matching flags indicates the start of
+                # score pairs.
+                break
+
+        if nx and xx:
+            raise redis.ResponseError(ZADD_NX_XX_ERROR_MSG)
+
+        elements = args[i:]
+        if not elements or len(elements) % 2 != 0:
             raise redis.ResponseError(SYNTAX_ERROR_MSG)
-        items = []
         # Parse all scores first, before updating
-        for i in range(0, len(args), 2):
-            score = Float.decode(args[i])
-            items.append((score, args[i + 1]))
+        items = [
+            (Float.decode(elements[j]), elements[j + 1])
+            for j in range(0, len(elements), 2)
+        ]
         old_len = len(zset)
-        for item in items:
-            if zset.add(item[1], item[0]):
-                key.updated()
+        changed_items = 0
+
+        for item_score, item_name in items:
+            if (
+                (not nx or item_name not in zset)
+                and (not xx or item_name in zset)
+            ):
+                if zset.add(item_name, item_score):
+                    changed_items += 1
+
+        if changed_items:
+            key.updated()
+
+        if ch:
+            return changed_items
         return len(zset) - old_len
 
     @command((Key(ZSet),))
@@ -2053,7 +2098,12 @@
 
     @command((Key(ZSet), Int), (bytes, bytes))
     def zscan(self, key, cursor, *args):
-        return self._scan(key.value.items, cursor, *args)
+        new_cursor, ans = self._scan(key.value.items(), cursor, *args)
+        flat = []
+        for (key, score) in ans:
+            flat.append(key)
+            flat.append(Float.encode(score, False))
+        return [new_cursor, flat]
 
     @command((Key(ZSet), bytes))
     def zscore(self, key, member):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fakeredis-1.0.4/fakeredis.egg-info/PKG-INFO 
new/fakeredis-1.0.5/fakeredis.egg-info/PKG-INFO
--- old/fakeredis-1.0.4/fakeredis.egg-info/PKG-INFO     2019-08-14 
11:55:44.000000000 +0200
+++ new/fakeredis-1.0.5/fakeredis.egg-info/PKG-INFO     2019-09-05 
11:51:08.000000000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: fakeredis
-Version: 1.0.4
+Version: 1.0.5
 Summary: Fake implementation of redis API for testing purposes.
 Home-page: https://github.com/jamesls/fakeredis
 Author: James Saryerwinnie
@@ -233,7 +233,6 @@
          * object
          * restore
          * touch
-         * unlink
          * wait
         
         
@@ -381,6 +380,12 @@
         Revision history
         ================
         
+        1.0.5
+        -----
+        - `#247 <https://github.com/jamesls/fakeredis/pull/247>`_ Support 
NX/XX/CH flags in ZADD command
+        - `#250 <https://github.com/jamesls/fakeredis/pull/250>`_ Implement 
UNLINK command
+        - `#252 <https://github.com/jamesls/fakeredis/pull/252>`_ Fix 
implementation of ZSCAN
+        
         1.0.4
         -----
         - `#240 <https://github.com/jamesls/fakeredis/issues/240>`_ `#242 
<https://github.com/jamesls/fakeredis/issues/242>`_ Support for ``redis==3.3``
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fakeredis-1.0.4/setup.py new/fakeredis-1.0.5/setup.py
--- old/fakeredis-1.0.4/setup.py        2019-08-14 11:30:03.000000000 +0200
+++ new/fakeredis-1.0.5/setup.py        2019-09-05 11:50:42.000000000 +0200
@@ -5,7 +5,7 @@
 
 setup(
     name='fakeredis',
-    version='1.0.4',
+    version='1.0.5',
     description="Fake implementation of redis API for testing purposes.",
     long_description=open(os.path.join(os.path.dirname(__file__),
                                        'README.rst')).read(),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fakeredis-1.0.4/test_fakeredis.py 
new/fakeredis-1.0.5/test_fakeredis.py
--- old/fakeredis-1.0.4/test_fakeredis.py       2019-08-14 11:11:33.000000000 
+0200
+++ new/fakeredis-1.0.5/test_fakeredis.py       2019-09-05 11:34:50.000000000 
+0200
@@ -1,5 +1,6 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
+from collections import namedtuple
 from time import sleep, time
 from redis.exceptions import ResponseError
 import inspect
@@ -26,6 +27,9 @@
 REDIS3 = int(redis.__version__.split('.')[0]) >= 3
 
 
+UpdateCommand = namedtuple('UpdateCommand', 'input expected_return_value 
expected_state')
+
+
 def redis_must_be_running(cls):
     # This can probably be improved.  This will determines
     # at import time if the tests should be run, but we probably
@@ -104,9 +108,9 @@
             self.redis.response_callbacks = response_callbacks
 
     # Wrap some redis commands to abstract differences between redis-py 2 and 
3.
-    def zadd(self, key, d):
+    def zadd(self, key, d, *args, **kwargs):
         if REDIS3:
-            return self.redis.zadd(key, d)
+            return self.redis.zadd(key, d, *args, **kwargs)
         else:
             return self.redis.zadd(key, **d)
 
@@ -1806,6 +1810,129 @@
         self.assertEqual(self.redis.zrange('foo', 1, 1),
                          [b'two'])
 
+    @redis3_only
+    def test_zadd_with_nx(self):
+        self.zadd('foo', {'four': 4.0, 'three': 3.0})
+
+        updates = [
+            UpdateCommand(
+                input={'four': 2.0, 'three': 1.0},
+                expected_return_value=0,
+                expected_state=[(b'four', 4.0), (b'three', 3.0)]),
+            UpdateCommand(
+                input={'four': 2.0, 'three': 1.0, 'zero': 0.0},
+                expected_return_value=1,
+                expected_state=[(b'four', 4.0), (b'three', 3.0), (b'zero', 
0.0)]),
+            UpdateCommand(
+                input={'two': 2.0, 'one': 1.0},
+                expected_return_value=2,
+                expected_state=[(b'four', 4.0), (b'three', 3.0), (b'two', 
2.0), (b'one', 1.0), (b'zero', 0.0)]),
+        ]
+
+        for update in updates:
+            self.assertEqual(self.zadd('foo', update.input, nx=True), 
update.expected_return_value)
+            self.assertItemsEqual(self.redis.zrange('foo', 0, -1, 
withscores=True), update.expected_state)
+
+    @redis3_only
+    def test_zadd_with_ch(self):
+        self.zadd('foo', {'four': 4.0, 'three': 3.0})
+
+        updates = [
+            UpdateCommand(
+                input={'four': 4.0, 'three': 1.0},
+                expected_return_value=1,
+                expected_state=[(b'four', 4.0), (b'three', 1.0)]),
+            UpdateCommand(
+                input={'four': 4.0, 'three': 3.0, 'zero': 0.0},
+                expected_return_value=2,
+                expected_state=[(b'four', 4.0), (b'three', 3.0), (b'zero', 
0.0)]),
+            UpdateCommand(
+                input={'two': 2.0, 'one': 1.0},
+                expected_return_value=2,
+                expected_state=[(b'four', 4.0), (b'three', 3.0), (b'two', 
2.0), (b'one', 1.0), (b'zero', 0.0)]),
+        ]
+
+        for update in updates:
+            self.assertEqual(self.zadd('foo', update.input, ch=True), 
update.expected_return_value)
+            self.assertItemsEqual(self.redis.zrange('foo', 0, -1, 
withscores=True), update.expected_state)
+
+    @redis3_only
+    def test_zadd_with_xx(self):
+        self.zadd('foo', {'four': 4.0, 'three': 3.0})
+
+        updates = [
+            UpdateCommand(
+                input={'four': 2.0, 'three': 1.0},
+                expected_return_value=0,
+                expected_state=[(b'four', 2.0), (b'three', 1.0)]),
+            UpdateCommand(
+                input={'four': 4.0, 'three': 3.0, 'zero': 0.0},
+                expected_return_value=0,
+                expected_state=[(b'four', 4.0), (b'three', 3.0)]),
+            UpdateCommand(
+                input={'two': 2.0, 'one': 1.0},
+                expected_return_value=0,
+                expected_state=[(b'four', 4.0), (b'three', 3.0)]),
+        ]
+
+        for update in updates:
+            self.assertEqual(self.zadd('foo', update.input, xx=True), 
update.expected_return_value)
+            self.assertItemsEqual(self.redis.zrange('foo', 0, -1, 
withscores=True), update.expected_state)
+
+    @redis3_only
+    def test_zadd_with_nx_and_xx(self):
+        self.zadd('foo', {'four': 4.0, 'three': 3.0})
+        with self.assertRaises(redis.DataError):
+            self.zadd('foo', {'four': -4.0, 'three': -3.0}, nx=True, xx=True)
+        with self.assertRaises(redis.DataError):
+            self.zadd('foo', {'four': -4.0, 'three': -3.0}, nx=True, xx=True, 
ch=True)
+
+    @redis3_only
+    def test_zadd_with_nx_and_ch(self):
+        self.zadd('foo', {'four': 4.0, 'three': 3.0})
+
+        updates = [
+            UpdateCommand(
+                input={'four': 2.0, 'three': 1.0},
+                expected_return_value=0,
+                expected_state=[(b'four', 4.0), (b'three', 3.0)]),
+            UpdateCommand(
+                input={'four': 2.0, 'three': 1.0, 'zero': 0.0},
+                expected_return_value=1,
+                expected_state=[(b'four', 4.0), (b'three', 3.0), (b'zero', 
0.0)]),
+            UpdateCommand(
+                input={'two': 2.0, 'one': 1.0},
+                expected_return_value=2,
+                expected_state=[(b'four', 4.0), (b'three', 3.0), (b'two', 
2.0), (b'one', 1.0), (b'zero', 0.0)]),
+        ]
+
+        for update in updates:
+            self.assertEqual(self.zadd('foo', update.input, nx=True, ch=True), 
update.expected_return_value)
+            self.assertItemsEqual(self.redis.zrange('foo', 0, -1, 
withscores=True), update.expected_state)
+
+    @redis3_only
+    def test_zadd_with_xx_and_ch(self):
+        self.zadd('foo', {'four': 4.0, 'three': 3.0})
+
+        updates = [
+            UpdateCommand(
+                input={'four': 2.0, 'three': 1.0},
+                expected_return_value=2,
+                expected_state=[(b'four', 2.0), (b'three', 1.0)]),
+            UpdateCommand(
+                input={'four': 4.0, 'three': 3.0, 'zero': 0.0},
+                expected_return_value=2,
+                expected_state=[(b'four', 4.0), (b'three', 3.0)]),
+            UpdateCommand(
+                input={'two': 2.0, 'one': 1.0},
+                expected_return_value=0,
+                expected_state=[(b'four', 4.0), (b'three', 3.0)]),
+        ]
+
+        for update in updates:
+            self.assertEqual(self.zadd('foo', update.input, xx=True, ch=True), 
update.expected_return_value)
+            self.assertItemsEqual(self.redis.zrange('foo', 0, -1, 
withscores=True), update.expected_state)
+
     def test_zrange_same_score(self):
         self.zadd('foo', {'two_a': 2})
         self.zadd('foo', {'two_b': 2})
@@ -3472,6 +3599,27 @@
         self.assertIn(b'key:17', results)
         self.assertEqual(2, len(results))
 
+    def test_zscan(self):
+        # Setup the data
+        name = 'zscan-test'
+        for ix in range(20):
+            self.zadd(name, {'key:%s' % ix: ix})
+        expected = dict(self.redis.zrange(name, 0, -1, withscores=True))
+
+        # Test the basic version
+        results = {}
+        for key, val in self.redis.zscan_iter(name, count=6):
+            results[key] = val
+        self.assertEqual(expected, results)
+
+        # Now test that the MATCH functionality works
+        results = {}
+        cursor = '0'
+        while cursor != 0:
+            cursor, data = self.redis.zscan(name, cursor, match='*7', count=6)
+            results.update(data)
+        self.assertEqual(results, {b'key:7': 7.0, b'key:17': 17.0})
+
     @attr('slow')
     def test_set_ex_should_expire_value(self):
         self.redis.set('foo', 'bar')
@@ -4016,6 +4164,12 @@
         result = script(args=[42])
         self.assertEqual(result, b'42')
 
+    @redis3_only
+    def test_unlink(self):
+        self.redis.set('foo', 'bar')
+        self.redis.unlink('foo')
+        self.assertIsNone(self.redis.get('foo'))
+
 
 class TestFakeRedis(unittest.TestCase):
     decode_responses = False
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fakeredis-1.0.4/test_fakeredis_hypothesis.py 
new/fakeredis-1.0.5/test_fakeredis_hypothesis.py
--- old/fakeredis-1.0.4/test_fakeredis_hypothesis.py    2019-08-14 
11:00:30.000000000 +0200
+++ new/fakeredis-1.0.5/test_fakeredis_hypothesis.py    2019-08-26 
08:55:35.000000000 +0200
@@ -155,7 +155,7 @@
 
 # TODO: all expiry-related commands
 common_commands = (
-    commands(st.sampled_from(['del', 'persist', 'type']), keys)
+    commands(st.sampled_from(['del', 'persist', 'type', 'unlink']), keys)
     | commands(st.just('exists'), st.lists(keys))
     | commands(st.just('keys'), st.just('*'))
     # Disabled for now due to redis giving wrong answers
@@ -279,8 +279,10 @@
     commands(st.just('zadd'), keys, st.lists(st.tuples(scores, fields), 
min_size=1))
 )
 zset_commands = (
-    # TODO: test xx, nx, ch, incr
-    commands(st.just('zadd'), keys, st.lists(st.tuples(scores, fields)))
+    # TODO: test incr
+    commands(st.just('zadd'), keys, st.none() | st.just('nx'),
+             st.none() | st.just('xx'), st.none() | st.just('ch'),
+             st.lists(st.tuples(scores, fields)))
     | commands(st.just('zcard'), keys)
     | commands(st.just('zcount'), keys, score_tests, score_tests)
     | commands(st.just('zincrby'), keys, scores, fields)
@@ -306,8 +308,10 @@
     commands(st.just('zadd'), keys, st.lists(st.tuples(st.just(0), fields), 
min_size=1))
 )
 zset_no_score_commands = (
-    # TODO: test xx, nx, ch, incr
-    commands(st.just('zadd'), keys, st.lists(st.tuples(st.just(0), fields)))
+    # TODO: test incr
+    commands(st.just('zadd'), keys, st.none() | st.just('nx'),
+             st.none() | st.just('xx'), st.none() | st.just('ch'),
+             st.lists(st.tuples(st.just(0), fields)))
     | commands(st.just('zlexcount'), keys, string_tests, string_tests)
     | commands(st.sampled_from(['zrangebylex', 'zrevrangebylex']),
                keys, string_tests, string_tests,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fakeredis-1.0.4/tox.ini new/fakeredis-1.0.5/tox.ini
--- old/fakeredis-1.0.4/tox.ini 2019-01-24 10:47:02.000000000 +0100
+++ new/fakeredis-1.0.5/tox.ini 2019-08-14 12:08:41.000000000 +0200
@@ -1,5 +1,6 @@
 [tox]
-envlist = py27,py34,py35,py36,py3.7
+envlist =
+    py{27,34,35,36,37,py}
 
 [testenv]
 usedevelop = True


Reply via email to