Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-Beaker for openSUSE:Factory checked in at 2024-04-21 20:27:01 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-Beaker (Old) and /work/SRC/openSUSE:Factory/.python-Beaker.new.26366 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-Beaker" Sun Apr 21 20:27:01 2024 rev:34 rq:1169355 version:1.13.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-Beaker/python-Beaker.changes 2023-02-10 14:36:12.186237024 +0100 +++ /work/SRC/openSUSE:Factory/.python-Beaker.new.26366/python-Beaker.changes 2024-04-21 20:28:31.752669204 +0200 @@ -1,0 +2,8 @@ +Sat Apr 20 13:26:25 UTC 2024 - Dirk Müller <dmuel...@suse.com> + +- update to 1.13.0: + * Fix validation messages for validate_key and encrypt_key + * Added support for rediscluster via ext:redisclusternm + * Removed the need to install mock library to run tests + +------------------------------------------------------------------- Old: ---- 1.12.1.tar.gz New: ---- 1.13.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-Beaker.spec ++++++ --- /var/tmp/diff_new_pack.Tr3Na1/_old 2024-04-21 20:28:33.820745097 +0200 +++ /var/tmp/diff_new_pack.Tr3Na1/_new 2024-04-21 20:28:33.820745097 +0200 @@ -1,7 +1,7 @@ # # spec file for package python-Beaker # -# Copyright (c) 2023 SUSE LLC +# Copyright (c) 2024 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -17,7 +17,7 @@ Name: python-Beaker -Version: 1.12.1 +Version: 1.13.0 Release: 0 Summary: A Session and Caching library with WSGI Middleware License: BSD-3-Clause ++++++ 1.12.1.tar.gz -> 1.13.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/beaker-1.12.1/.github/workflows/runtests.yml new/beaker-1.13.0/.github/workflows/runtests.yml --- old/beaker-1.12.1/.github/workflows/runtests.yml 2023-02-04 18:17:01.000000000 +0100 +++ new/beaker-1.13.0/.github/workflows/runtests.yml 2024-04-11 22:27:23.000000000 +0200 @@ -26,6 +26,15 @@ uses: supercharge/redis-github-action@1.4.0 - name: Start MongoDB uses: supercharge/mongodb-github-action@1.8.0 + - uses: vishnudxb/redis-cluster@1.0.9 + with: + master1-port: 5000 + master2-port: 5001 + master3-port: 5002 + slave1-port: 5003 + slave2-port: 5004 + slave3-port: 5005 + sleep-duration: 5 - name: Test with pytest run: | pytest -vv diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/beaker-1.12.1/CHANGELOG new/beaker-1.13.0/CHANGELOG --- old/beaker-1.12.1/CHANGELOG 2023-02-04 18:17:01.000000000 +0100 +++ new/beaker-1.13.0/CHANGELOG 2024-04-11 22:27:23.000000000 +0200 @@ -1,3 +1,10 @@ +Release 1.13.0 (2024-04-11) +=========================== + +* Fix validation messages for validate_key and encrypt_key +* Added support for rediscluster via ext:redisclusternm +* Removed the need to install mock library to run tests + Release 1.12.1 (2023-01-04) =========================== diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/beaker-1.12.1/beaker/__init__.py new/beaker-1.13.0/beaker/__init__.py --- old/beaker-1.12.1/beaker/__init__.py 2023-02-04 18:17:01.000000000 +0100 +++ new/beaker-1.13.0/beaker/__init__.py 2024-04-11 22:27:23.000000000 +0200 @@ -1 +1 @@ -__version__ = '1.12.1' +__version__ = '1.13.0' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/beaker-1.12.1/beaker/cache.py new/beaker-1.13.0/beaker/cache.py --- old/beaker-1.12.1/beaker/cache.py 2023-02-04 18:17:01.000000000 +0100 +++ new/beaker-1.13.0/beaker/cache.py 2024-04-11 22:27:23.000000000 +0200 @@ -22,6 +22,7 @@ import beaker.ext.google as google import beaker.ext.mongodb as mongodb import beaker.ext.redisnm as redisnm +import beaker.ext.redisclusternm as redisclusternm from functools import wraps # Initialize the cache region dict @@ -126,7 +127,8 @@ 'ext:sqla': sqla.SqlaNamespaceManager, 'ext:google': google.GoogleNamespaceManager, 'ext:mongodb': mongodb.MongoNamespaceManager, - 'ext:redis': redisnm.RedisNamespaceManager + 'ext:redis': redisnm.RedisNamespaceManager, + 'ext:rediscluster': redisclusternm.RedisClusterNamespaceManager, }) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/beaker-1.12.1/beaker/docs/modules/rediscluster.rst new/beaker-1.13.0/beaker/docs/modules/rediscluster.rst --- old/beaker-1.12.1/beaker/docs/modules/rediscluster.rst 1970-01-01 01:00:00.000000000 +0100 +++ new/beaker-1.13.0/beaker/docs/modules/rediscluster.rst 2024-04-11 22:27:23.000000000 +0200 @@ -0,0 +1,10 @@ +:mod:`beaker.ext.redisclusternm` -- Redis cluster NameSpace Manager and Synchronizer +============================================================================== + +.. automodule:: beaker.ext.redisclusternm + +Module Contents +--------------- + +.. autoclass:: RedisClusterNamespaceManager +.. autoclass:: RedisClusterSynchronizer diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/beaker-1.12.1/beaker/ext/redisclusternm.py new/beaker-1.13.0/beaker/ext/redisclusternm.py --- old/beaker-1.12.1/beaker/ext/redisclusternm.py 1970-01-01 01:00:00.000000000 +0100 +++ new/beaker-1.13.0/beaker/ext/redisclusternm.py 2024-04-11 22:27:23.000000000 +0200 @@ -0,0 +1,100 @@ +import os +import threading +import time +import pickle + +from beaker.container import NamespaceManager + +try: + import redis +except ImportError: + redis = None + +from beaker.ext.redisnm import RedisNamespaceManager, RedisSynchronizer +from beaker._compat import string_type + + +class RedisClusterNamespaceManager(RedisNamespaceManager): + """Provides the :class:`.NamespaceManager` API over Redis cluster. + + Provided ``urls`` can be both multiple redis connection strings separated by a comma or + an already existing RedisCluster instance. + + Unlike a StrictRedis connection string, a RedisCluster one does not support + database indicators, it is zero by default. + + Example: `redis://node-1:7001,redis://node-2:7002` + + Additional options can be passed in kwargs (e.g. `username="redis", password="secure_password"`). + + The data will be stored into redis keys, with their name + starting with ``beaker_cache:``. + """ + + def __init__(self, namespace, urls, timeout=None, **kwargs): + super(RedisNamespaceManager, self).__init__(namespace) + self.lock_dir = None # Redis uses redis itself for locking. + self.timeout = timeout + self.nodes = [] + self.options = kwargs + + if redis is None: + raise RuntimeError('redis is not available') + + if isinstance(urls, string_type): + for url in urls.split(','): + url_options = redis.connection.parse_url(url) + if 'db' in url_options: + raise redis.exceptions.RedisClusterException( + "A ``db`` querystring option can only be 0 in cluster mode" + ) + self.nodes.append(redis.cluster.ClusterNode( + host=url_options.get('host'), + port=url_options.get('port') + )) + self.client = RedisClusterNamespaceManager.clients.get( + urls, redis.cluster.RedisCluster, startup_nodes=self.nodes, **kwargs + ) + else: + self.client = urls + + def get_creation_lock(self, key): + return RedisClusterSynchronizer(self._format_key(key), self.client, self.nodes, **self.options) + + +class RedisClusterSynchronizer(RedisSynchronizer): + """Synchronizer based on redis cluster. + + Provided ``urls`` can be both multiple redis connection strings separated by a comma or + an already existing RedisCluster instance. + + Unlike a StrictRedis connection string, a RedisCluster one does not support + database indicators, it is zero by default. + + Example: ``redis://node-1:7001,redis://node-2:7002, + + This Synchronizer only supports 1 reader or 1 writer at time, not concurrent readers. + """ + RELEASE_LOCK_LUA = """ + if redis.call('get', KEYS[1]) == ARGV[1] then + return redis.call('del', KEYS[1]) + else + return 0 + end + """ + + def __init__(self, identifier, urls, nodes=None, **kwargs): + super(RedisSynchronizer, self).__init__() + self.identifier = 'beaker_lock:%s' % identifier + if isinstance(urls, string_type): + self.client = RedisClusterNamespaceManager.clients.get( + urls, redis.cluster.RedisCluster, startup_nodes=nodes, **kwargs + ) + else: + self.client = urls + self._release_lock = self.client.register_script(self.RELEASE_LOCK_LUA) + + def do_release_write_lock(self): + identifier = self.identifier + owner_id = self._get_owner_id() + self._release_lock(keys=[identifier], args=[owner_id]) \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/beaker-1.12.1/beaker/util.py new/beaker-1.13.0/beaker/util.py --- old/beaker-1.12.1/beaker/util.py 2023-02-04 18:17:01.000000000 +0100 +++ new/beaker-1.13.0/beaker/util.py 2024-04-11 22:27:23.000000000 +0200 @@ -303,8 +303,8 @@ ('id', (str,), "Session id must be a string."), ('key', (str,), "Session key must be a string."), ('secret', (str, NoneType), "Session secret must be a string."), - ('validate_key', (str, NoneType), "Session encrypt_key must be a string."), - ('encrypt_key', (str, NoneType), "Session validate_key must be a string."), + ('validate_key', (str, NoneType), "Session validate_key must be a string."), + ('encrypt_key', (str, NoneType), "Session encrypt_key must be a string."), ('encrypt_nonce_bits', (int, NoneType), "Session encrypt_nonce_bits must be a number"), ('secure', (bool, NoneType), "Session secure must be a boolean."), ('httponly', (bool, NoneType), "Session httponly must be a boolean."), diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/beaker-1.12.1/setup.py new/beaker-1.13.0/setup.py --- old/beaker-1.12.1/setup.py 2023-02-04 18:17:01.000000000 +0100 +++ new/beaker-1.13.0/setup.py 2024-04-11 22:27:23.000000000 +0200 @@ -23,7 +23,7 @@ INSTALL_REQUIRES.append('funcsigs') -TESTS_REQUIRE = ['pytest', 'Mock', 'pycryptodome'] +TESTS_REQUIRE = ['pytest', 'pycryptodome'] if py_version == (2, 6): TESTS_REQUIRE.append('WebTest<2.0.24') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/beaker-1.12.1/tests/test_managers/test_ext_rediscluster.py new/beaker-1.13.0/tests/test_managers/test_ext_rediscluster.py --- old/beaker-1.12.1/tests/test_managers/test_ext_rediscluster.py 1970-01-01 01:00:00.000000000 +0100 +++ new/beaker-1.13.0/tests/test_managers/test_ext_rediscluster.py 2024-04-11 22:27:23.000000000 +0200 @@ -0,0 +1,16 @@ +from beaker.cache import Cache +from . import base + + +class TestRedis(base.CacheManagerBaseTests): + CACHE_ARGS = { + 'type': 'ext:rediscluster', + 'urls': 'redis://localhost:5000' + } + + def test_client_reuse(self): + cache1 = Cache('test1', **self.CACHE_ARGS) + cli1 = cache1.namespace.client + cache2 = Cache('test2', **self.CACHE_ARGS) + cli2 = cache2.namespace.client + self.assertTrue(cli1 is cli2) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/beaker-1.12.1/tests/test_memcached.py new/beaker-1.13.0/tests/test_memcached.py --- old/beaker-1.12.1/tests/test_memcached.py 2023-02-04 18:17:01.000000000 +0100 +++ new/beaker-1.13.0/tests/test_memcached.py 2024-04-11 22:27:23.000000000 +0200 @@ -1,7 +1,7 @@ # coding: utf-8 from beaker._compat import u_ -import mock +import unittest.mock from beaker.cache import Cache, CacheManager, util from beaker.middleware import CacheMiddleware, SessionMiddleware @@ -291,9 +291,9 @@ def test_dont_use_pylibmc_client(self): from beaker.ext.memcached import _load_client - load_mock = mock.Mock() + load_mock = unittest.mock.Mock() load_mock.return_value = _load_client('memcache') - with mock.patch('beaker.ext.memcached._load_client', load_mock): + with unittest.mock.patch('beaker.ext.memcached._load_client', load_mock): cache = Cache('test', data_dir='./cache', url=mc_url, type="ext:memcached") assert not isinstance(cache.namespace, memcached.PyLibMCNamespaceManager) assert isinstance(cache.namespace, memcached.MemcachedNamespaceManager)