Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-django-cacheops for
openSUSE:Factory checked in at 2023-05-10 16:18:10
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-django-cacheops (Old)
and /work/SRC/openSUSE:Factory/.python-django-cacheops.new.1533 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-django-cacheops"
Wed May 10 16:18:10 2023 rev:9 rq:1085792 version:7.0.1
Changes:
--------
---
/work/SRC/openSUSE:Factory/python-django-cacheops/python-django-cacheops.changes
2023-05-08 17:24:20.372714947 +0200
+++
/work/SRC/openSUSE:Factory/.python-django-cacheops.new.1533/python-django-cacheops.changes
2023-05-10 16:18:14.086871882 +0200
@@ -1,0 +2,8 @@
+Tue May 9 19:26:45 UTC 2023 - Dirk Müller <[email protected]>
+
+- update to 7.0.1:
+ * made it work with Redis 6.x and older again
+ * handle abstract models better
+ * some docs improvements
+
+-------------------------------------------------------------------
Old:
----
django-cacheops-7.0.tar.gz
New:
----
django-cacheops-7.0.1.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-django-cacheops.spec ++++++
--- /var/tmp/diff_new_pack.MoRD2j/_old 2023-05-10 16:18:14.606874958 +0200
+++ /var/tmp/diff_new_pack.MoRD2j/_new 2023-05-10 16:18:14.614875005 +0200
@@ -19,7 +19,7 @@
%define skip_python2 1
%define skip_python36 1
Name: python-django-cacheops
-Version: 7.0
+Version: 7.0.1
Release: 0
Summary: Django ORM cache with automatic granular event-driven
invalidation
License: BSD-3-Clause
++++++ django-cacheops-7.0.tar.gz -> django-cacheops-7.0.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-cacheops-7.0/CHANGELOG
new/django-cacheops-7.0.1/CHANGELOG
--- old/django-cacheops-7.0/CHANGELOG 2023-03-11 10:08:54.000000000 +0100
+++ new/django-cacheops-7.0.1/CHANGELOG 2023-05-09 09:41:55.000000000 +0200
@@ -1,3 +1,8 @@
+7.0.1
+- made it work with Redis 6.x and older again
+- handle abstract models better
+- some docs improvements
+
7.0
- support Django 4.2b and 5.0a
- added a new insideout mode
@@ -5,6 +10,7 @@
Backwards incompatible changes:
- dropped Python 3.5, 3.6 and Django 2.1, 2.2, 3.0 and 3.1 support
- removed CACHEOPS_LRU
+- removed CacheopsRedis, should inherit redis.Redis instead
6.2
- support Python 3.11 and Django 4.1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-cacheops-7.0/MANIFEST.in
new/django-cacheops-7.0.1/MANIFEST.in
--- old/django-cacheops-7.0/MANIFEST.in 2021-05-24 11:36:10.000000000 +0200
+++ new/django-cacheops-7.0.1/MANIFEST.in 2023-03-16 07:31:03.000000000
+0100
@@ -2,7 +2,7 @@
include README.rst
include CHANGELOG
include cacheops/lua/*
-include manage.py run_tests.py bench.py
+include manage.py bench.py
include requirements-test.txt
include tox.ini
recursive-include tests *.json
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-cacheops-7.0/PKG-INFO
new/django-cacheops-7.0.1/PKG-INFO
--- old/django-cacheops-7.0/PKG-INFO 2023-03-15 11:03:10.339889800 +0100
+++ new/django-cacheops-7.0.1/PKG-INFO 2023-05-09 09:49:47.681410600 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: django-cacheops
-Version: 7.0
+Version: 7.0.1
Summary: A slick ORM cache with automatic granular event-driven invalidation
for Django.
Home-page: http://github.com/Suor/django-cacheops
Author: Alexander Schepanovski
@@ -105,7 +105,7 @@
... # everything else is passed to
Sentinel()
}
- # Use your own redis client class, should be compatible or subclass
redis.StrictRedis
+ # Use your own redis client class, should be compatible or subclass
redis.Redis
CACHEOPS_CLIENT_CLASS = 'your.redis.ClientClass'
CACHEOPS = {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-cacheops-7.0/README.rst
new/django-cacheops-7.0.1/README.rst
--- old/django-cacheops-7.0/README.rst 2023-03-11 10:05:57.000000000 +0100
+++ new/django-cacheops-7.0.1/README.rst 2023-03-17 16:09:39.000000000
+0100
@@ -75,7 +75,7 @@
... # everything else is passed to
Sentinel()
}
- # Use your own redis client class, should be compatible or subclass
redis.StrictRedis
+ # Use your own redis client class, should be compatible or subclass
redis.Redis
CACHEOPS_CLIENT_CLASS = 'your.redis.ClientClass'
CACHEOPS = {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-cacheops-7.0/cacheops/__init__.py
new/django-cacheops-7.0.1/cacheops/__init__.py
--- old/django-cacheops-7.0/cacheops/__init__.py 2023-03-11
10:09:11.000000000 +0100
+++ new/django-cacheops-7.0.1/cacheops/__init__.py 2023-05-09
09:42:08.000000000 +0200
@@ -1,4 +1,4 @@
-__version__ = '7.0'
+__version__ = '7.0.1'
VERSION = tuple(map(int, __version__.split('.')))
from .simple import * # noqa
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-cacheops-7.0/cacheops/conf.py
new/django-cacheops-7.0.1/cacheops/conf.py
--- old/django-cacheops-7.0/cacheops/conf.py 2023-02-25 06:59:13.000000000
+0100
+++ new/django-cacheops-7.0.1/cacheops/conf.py 2023-05-05 13:51:50.000000000
+0200
@@ -96,7 +96,8 @@
"""
Returns cacheops profile for a model
"""
- # Django migrations these fake models, we don't want to cache them
+ assert not model._meta.abstract, "This should be handled by caller"
+ # Django migrations create lots of fake models, just skip them
if model.__module__ == '__fake__':
return None
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-cacheops-7.0/cacheops/lua/cache_thing.lua
new/django-cacheops-7.0.1/cacheops/lua/cache_thing.lua
--- old/django-cacheops-7.0/cacheops/lua/cache_thing.lua 2023-02-25
06:59:13.000000000 +0100
+++ new/django-cacheops-7.0.1/cacheops/lua/cache_thing.lua 2023-04-03
13:32:23.000000000 +0200
@@ -47,6 +47,16 @@
redis.call('sadd', conj_key, key)
-- NOTE: an invalidator should live longer than any key it references.
-- So we update its ttl on every key if needed.
+ -- REDIS_7
redis.call('expire', conj_key, timeout, 'gt')
+ -- /REDIS_7
+ -- REDIS_6
+ local conj_ttl = redis.call('ttl', conj_key)
+ if conj_ttl < timeout then
+ -- We set conj_key life with a margin over key life to call expire
rarer
+ -- And add few extra seconds to be extra safe
+ redis.call('expire', conj_key, timeout * 2 + 10)
+ end
+ -- /REDIS_6
end
end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/django-cacheops-7.0/cacheops/lua/cache_thing_insideout.lua
new/django-cacheops-7.0.1/cacheops/lua/cache_thing_insideout.lua
--- old/django-cacheops-7.0/cacheops/lua/cache_thing_insideout.lua
2023-02-25 06:58:23.000000000 +0100
+++ new/django-cacheops-7.0.1/cacheops/lua/cache_thing_insideout.lua
2023-04-03 13:31:30.000000000 +0200
@@ -19,7 +19,17 @@
table.insert(stamps, stamp)
-- NOTE: an invalidator should live longer than any key it references.
-- So we update its ttl on every key if needed.
+ -- REDIS_7
redis.call('expire', conj_key, timeout, 'gt')
+ -- /REDIS_7
+ -- REDIS_6
+ local conj_ttl = redis.call('ttl', conj_key)
+ if conj_ttl < timeout then
+ -- We set conj_key life with a margin over key life to call expire
rarer
+ -- And add few extra seconds to be extra safe
+ redis.call('expire', conj_key, timeout * 2 + 10)
+ end
+ -- /REDIS_6
end
-- Write data to cache along with a checksum of the stamps to see if any of
them changed
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-cacheops-7.0/cacheops/query.py
new/django-cacheops-7.0.1/cacheops/query.py
--- old/django-cacheops-7.0/cacheops/query.py 2023-03-11 10:02:52.000000000
+0100
+++ new/django-cacheops-7.0.1/cacheops/query.py 2023-05-05 13:51:50.000000000
+0200
@@ -393,13 +393,12 @@
if not hasattr(module, cls.__name__):
setattr(module, cls.__name__, cls)
- # This is probably still needed if models are created dynamically
+ # This is probably still needed if models are created dynamically or
imported late
def contribute_to_class(self, cls, name):
self._no_monkey.contribute_to_class(self, cls, name)
- # Django migrations create lots of fake models, just skip them
- # NOTE: we make it here rather then inside _install_cacheops()
+ # NOTE: we check it here rather then inside _install_cacheops()
# because we don't want @once_per() to hold refs to all of them.
- if cls.__module__ != '__fake__' and family_has_profile(cls):
+ if family_has_profile(cls):
self._install_cacheops(cls)
@skip_on_no_invalidation
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-cacheops-7.0/cacheops/redis.py
new/django-cacheops-7.0.1/cacheops/redis.py
--- old/django-cacheops-7.0/cacheops/redis.py 2023-02-25 06:59:13.000000000
+0100
+++ new/django-cacheops-7.0.1/cacheops/redis.py 2023-04-04 12:55:06.000000000
+0200
@@ -27,7 +27,7 @@
if settings.CACHEOPS_REDIS and settings.CACHEOPS_SENTINEL:
raise ImproperlyConfigured("CACHEOPS_REDIS and CACHEOPS_SENTINEL are
mutually exclusive")
- client_class = redis.StrictRedis
+ client_class = redis.Redis
if settings.CACHEOPS_CLIENT_CLASS:
client_class = import_string(settings.CACHEOPS_CLIENT_CLASS)
@@ -54,6 +54,7 @@
### Lua script loader
import os.path
+import re
@memoize
@@ -61,4 +62,14 @@
filename = os.path.join(os.path.dirname(__file__), 'lua/%s.lua' % name)
with open(filename) as f:
code = f.read()
+ if is_redis_7():
+ code = re.sub(r'REDIS_6.*?/REDIS_6', '', code, flags=re.S)
+ else:
+ code = re.sub(r'REDIS_7.*?/REDIS_7', '', code, flags=re.S)
return redis_client.register_script(code)
+
+
+@memoize
+def is_redis_7():
+ redis_version = redis_client.info('server')['redis_version']
+ return int(redis_version.split('.')[0]) >= 7
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-cacheops-7.0/cacheops/utils.py
new/django-cacheops-7.0.1/cacheops/utils.py
--- old/django-cacheops-7.0/cacheops/utils.py 2023-03-02 15:50:46.000000000
+0100
+++ new/django-cacheops-7.0.1/cacheops/utils.py 2023-05-05 13:51:50.000000000
+0200
@@ -9,22 +9,24 @@
from .conf import model_profile
-def get_concrete_model(model):
+def get_table_model(model):
return next((b for b in model.__mro__ if issubclass(b, models.Model) and b
is not models.Model
and not b._meta.proxy and not b._meta.abstract), None)
def model_family(model):
"""
- Returns a list of all proxy models, including subclasess, superclasses and
siblings.
+ The family is models sharing a database table, events on one should affect
each other.
+
+ We simply collect a list of all proxy models, including subclasess,
superclasses and siblings.
+ Two descendants of an abstract model are not family - they cannot affect
each other.
"""
def class_tree(cls):
return [cls] + lmapcat(class_tree, cls.__subclasses__())
# NOTE: we also list multitable submodels here, we just don't care.
# Cacheops doesn't support them anyway.
- # NOTE: when this is called in Manager.contribute_to_class()
- # ._meta.concrete_model might still be None
- return class_tree(model._meta.concrete_model or get_concrete_model(model)
or model)
+ table_model = get_table_model(model)
+ return class_tree(table_model) if table_model else []
@memoize
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/django-cacheops-7.0/django_cacheops.egg-info/PKG-INFO
new/django-cacheops-7.0.1/django_cacheops.egg-info/PKG-INFO
--- old/django-cacheops-7.0/django_cacheops.egg-info/PKG-INFO 2023-03-15
11:03:10.000000000 +0100
+++ new/django-cacheops-7.0.1/django_cacheops.egg-info/PKG-INFO 2023-05-09
09:49:47.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: django-cacheops
-Version: 7.0
+Version: 7.0.1
Summary: A slick ORM cache with automatic granular event-driven invalidation
for Django.
Home-page: http://github.com/Suor/django-cacheops
Author: Alexander Schepanovski
@@ -105,7 +105,7 @@
... # everything else is passed to
Sentinel()
}
- # Use your own redis client class, should be compatible or subclass
redis.StrictRedis
+ # Use your own redis client class, should be compatible or subclass
redis.Redis
CACHEOPS_CLIENT_CLASS = 'your.redis.ClientClass'
CACHEOPS = {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-cacheops-7.0/setup.py
new/django-cacheops-7.0.1/setup.py
--- old/django-cacheops-7.0/setup.py 2023-03-11 10:09:49.000000000 +0100
+++ new/django-cacheops-7.0.1/setup.py 2023-05-09 09:42:03.000000000 +0200
@@ -7,7 +7,7 @@
setup(
name='django-cacheops',
- version='7.0',
+ version='7.0.1',
author='Alexander Schepanovski',
author_email='[email protected]',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-cacheops-7.0/tests/models.py
new/django-cacheops-7.0.1/tests/models.py
--- old/django-cacheops-7.0/tests/models.py 2023-03-11 10:02:54.000000000
+0100
+++ new/django-cacheops-7.0.1/tests/models.py 2023-05-05 13:51:50.000000000
+0200
@@ -307,3 +307,8 @@
setattr(self, '_get_private_data', curry(sum, [1, 2, 3, 4]))
name = models.CharField(max_length=255)
+
+
+class Abs(models.Model):
+ class Meta:
+ abstract = True
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-cacheops-7.0/tests/test_extras.py
new/django-cacheops-7.0.1/tests/test_extras.py
--- old/django-cacheops-7.0/tests/test_extras.py 2021-05-24
11:36:10.000000000 +0200
+++ new/django-cacheops-7.0.1/tests/test_extras.py 2023-05-05
13:51:50.000000000 +0200
@@ -6,7 +6,7 @@
from cacheops.signals import cache_read, cache_invalidated
from .utils import BaseTestCase, make_inc
-from .models import Post, Category, Local, DbAgnostic, DbBinded
+from .models import Post, Category, Local, DbAgnostic, DbBinded, Abs
class SettingsTests(TestCase):
@@ -104,7 +104,7 @@
def second_thread():
def _target():
try:
- with before('redis.StrictRedis.brpoplpush', lambda *a,
**kw: locked.set()):
+ with before('redis.Redis.brpoplpush', lambda *a, **kw:
locked.set()):
results.append(func())
except Exception:
locked.set()
@@ -183,3 +183,9 @@
with self.assertNumQueries(1, using='slave'):
list(DbBinded.objects.cache().using('slave'))
+
+
+def test_abstract_family():
+ from cacheops.utils import model_family
+
+ assert model_family(Abs) == []
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-cacheops-7.0/tests/tests.py
new/django-cacheops-7.0.1/tests/tests.py
--- old/django-cacheops-7.0/tests/tests.py 2023-02-27 05:15:02.000000000
+0100
+++ new/django-cacheops-7.0.1/tests/tests.py 2023-05-05 13:51:50.000000000
+0200
@@ -961,6 +961,13 @@
with self.assertRaises(NonCachedMedia.DoesNotExist):
MediaProxy.objects.cache().get(title=media.title)
+ def test_siblings(self):
+ list(VideoProxy.objects.cache())
+ NonCachedVideoProxy.objects.create(title='Pulp Fiction')
+
+ with self.assertNumQueries(1):
+ list(VideoProxy.objects.cache())
+
def test_proxy_caching(self):
video = Video.objects.create(title='Pulp Fiction')
self.assertEqual(type(Video.objects.cache().get(pk=video.pk)),