From 8d4f8db4ccad2043a8127c216345e8d6bafec739 Mon Sep 17 00:00:00 2001 From: Hadrien David Date: Thu, 5 Jun 2014 17:38:57 -0400 Subject: [PATCH 1/3] In ext.sqlalchemy: Increment new and deleted entities and table identities. --- CHANGES.rst | 4 ++-- pyramid_caching/ext/sqlalchemy.py | 13 +++++++++---- .../tests/unittests/test_sqlalchemy_extension.py | 10 +++++++--- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index e053016..81bafad 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -14,8 +14,8 @@ Development ----- * Breaking changes: ``cache_factory`` keyword arguments ``depends_on`` is a - list of callables which receiving request as only argument. Callables return - the dependency to be identified by cache manager. + list of callables which receiving request as positional argument. Callables + return the dependency to be identified by cache manager. * Add arguments ``predicates`` to ``cache_factory`` which permits to add predicates to cache key used for the view (useful for query strings). diff --git a/pyramid_caching/ext/sqlalchemy.py b/pyramid_caching/ext/sqlalchemy.py index 1a7c74a..f3165ea 100644 --- a/pyramid_caching/ext/sqlalchemy.py +++ b/pyramid_caching/ext/sqlalchemy.py @@ -56,16 +56,21 @@ def identify(entity): return registry.queryAdapter(entity, IIdentityInspector) def on_before_commit(session): - identities = [] + identities = set() + + for entity in session.new: + identities.add(entity.__tablename__) for entity in session.dirty: - identities.append(entity.__tablename__) - identities.append(identify(entity)) + identities.add(entity.__tablename__) + identities.add(identify(entity)) for entity in session.deleted: - identities.append(identify(entity)) + identities.add(entity.__tablename__) + identities.add(identify(entity)) def after_commit(session): + for identity in identities: try: versioner.incr(identity) diff --git a/pyramid_caching/tests/unittests/test_sqlalchemy_extension.py b/pyramid_caching/tests/unittests/test_sqlalchemy_extension.py index 121ac05..8b67f52 100644 --- a/pyramid_caching/tests/unittests/test_sqlalchemy_extension.py +++ b/pyramid_caching/tests/unittests/test_sqlalchemy_extension.py @@ -57,7 +57,7 @@ def test_create_entity(self): u = User(name='bob', address='123 street') Session.add(u) Session.commit() - self.assertEqual(self.key_versioner.incr_keys, []) + self.assertEqual(self.key_versioner.incr_keys, ['users']) def test_modify_entity(self): u = User(name='joe', address='123 street') @@ -84,7 +84,11 @@ def __call__(self, entity): class DummyKeyVersioner: def __init__(self): - self.incr_keys = [] + self._incr_keys = set() def incr(self, key): - self.incr_keys.append(key) + self._incr_keys.add(key) + + @property + def incr_keys(self): + return list(self._incr_keys) From 889abe6671d4725a6a1f2042571ad0e9a21d4801 Mon Sep 17 00:00:00 2001 From: Hadrien David Date: Thu, 5 Jun 2014 17:39:09 -0400 Subject: [PATCH 2/3] update changelog --- CHANGES.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 81bafad..2925b26 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,3 +1,4 @@ + Changelog ========= @@ -10,6 +11,8 @@ Development * Introspectables * Content negociation: we should add content type in cache key. +* In ext.sqlalchemy: Increment new and deleted entities and table identities. + 0.1.2 ----- From 340c297a49b2bf3d008020cc74095dd9ce5519ce Mon Sep 17 00:00:00 2001 From: Hadrien David Date: Thu, 5 Jun 2014 17:46:01 -0400 Subject: [PATCH 3/3] Add a test when deleting an entity --- .../tests/unittests/test_sqlalchemy_extension.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/pyramid_caching/tests/unittests/test_sqlalchemy_extension.py b/pyramid_caching/tests/unittests/test_sqlalchemy_extension.py index 8b67f52..482fc02 100644 --- a/pyramid_caching/tests/unittests/test_sqlalchemy_extension.py +++ b/pyramid_caching/tests/unittests/test_sqlalchemy_extension.py @@ -31,6 +31,10 @@ def setUp(self): self.config = Configurator(settings={ 'caching.enabled': True, }) + + Session.add(User(name='hadrien', address='down the hill')) + Session.commit() + register_sqla_session_caching_hook(self.config, Session) self.config.registry.registerAdapter(DummyIdentityInspector(), required=[User], @@ -67,6 +71,13 @@ def test_modify_entity(self): Session.commit() self.assertEqual(self.key_versioner.incr_keys, ['users', 'users:joe']) + def test_delete_entity(self): + user = Session.query(User).filter_by(name='hadrien').first() + Session.delete(user) + Session.commit() + self.assertEqual(self.key_versioner.incr_keys, + ['users', 'users:hadrien']) + class User(object): __tablename__ = 'users'