[Repoze-dev] Repoze CVS: __init__.py tests.py

Chris McDonough chrism at agendaless.com
Thu Sep 13 15:33:28 UTC 2007


Update of /home/repoze/cvs/filters/repoze.tm/repoze/tm
In directory laguna.palladion.com:/tmp/cvs-serv18088/filters/repoze.tm/repoze/tm

Modified Files:
	__init__.py tests.py 
Log Message:
Provide a better API for registering callbacks that should be invoked
at transaction end.


Index: tests.py
===================================================================
RCS file: /home/repoze/cvs/filters/repoze.tm/repoze/tm/tests.py,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -u -d -r1.1.1.1 -r1.2
--- tests.py	10 Sep 2007 22:39:56 -0000	1.1.1.1
+++ tests.py	13 Sep 2007 15:33:26 -0000	1.2
@@ -7,51 +7,102 @@
         from repoze.tm import TM
         return TM
 
-    def _makeOne(self, *arg, **kw):
-        return self._getTargetClass()(*arg, **kw)
+    def _makeOne(self, app, endregistrations=None):
+        from repoze.tm import after_end
+        if endregistrations:
+            after_end.register(*endregistrations)
+        return self._getTargetClass()(app)
 
     def test_committed(self):
         resource = DummyResource()
         app = DummyApplication(resource)
         tm = self._makeOne(app)
-        cleanup = {1:1}
-        result = tm({'tm.cleanup':cleanup}, None)
+        result = tm({}, None)
         self.assertEqual(result, ['hello'])
         self.assertEqual(resource.committed, True)
         self.assertEqual(resource.aborted, False)
-        self.assertEqual(cleanup, {})
 
     def test_aborted_via_doom(self):
         resource = DummyResource()
         app = DummyApplication(resource, doom=True)
         tm = self._makeOne(app)
-        cleanup = {1:1}
-        result = tm({'tm.cleanup':cleanup}, None)
+        result = tm({}, None)
         self.assertEqual(result, ['hello'])
         self.assertEqual(transaction.isDoomed(), False)
         self.assertEqual(resource.committed, False)
         self.assertEqual(resource.aborted, True)
-        self.assertEqual(cleanup, {})
 
     def test_aborted_via_exception(self):
         resource = DummyResource()
         app = DummyApplication(resource, exception=True)
         tm = self._makeOne(app)
-        cleanup = {1:1}
-        self.assertRaises(ValueError, tm, {'tm.cleanup':cleanup}, None)
+        self.assertRaises(ValueError, tm, {}, None)
         self.assertEqual(resource.committed, False)
         self.assertEqual(resource.aborted, True)
-        self.assertEqual(cleanup, {})
         
     def test_aborted_via_exception_and_doom(self):
         resource = DummyResource()
         app = DummyApplication(resource, exception=True, doom=True)
         tm = self._makeOne(app)
-        cleanup = {1:1}
-        self.assertRaises(ValueError, tm, {'tm.cleanup':cleanup}, None)
+        self.assertRaises(ValueError, tm, {}, None)
         self.assertEqual(resource.committed, False)
         self.assertEqual(resource.aborted, True)
-        self.assertEqual(cleanup, {})
+
+    def test_cleanup_on_commit(self):
+        dummycalled = []
+        def dummy():
+            dummycalled.append(True)
+        env = {}
+        resource = DummyResource()
+        app = DummyApplication(resource, exception=False, doom=False)
+        tm = self._makeOne(app, (dummy, env))
+        tm(env, None)
+        self.assertEqual(resource.committed, True)
+        self.assertEqual(resource.aborted, False)
+        self.assertEqual(dummycalled, [True])
+        
+    def test_cleanup_on_abort(self):
+        dummycalled = []
+        def dummy():
+            dummycalled.append(True)
+        env = {}
+        resource = DummyResource()
+        app = DummyApplication(resource, exception=True, doom=False)
+        tm = self._makeOne(app, (dummy, env))
+        self.assertRaises(ValueError, tm, env, None)
+        self.assertEqual(resource.committed, False)
+        self.assertEqual(resource.aborted, True)
+        self.assertEqual(dummycalled, [True])
+
+class TestAfterEnd(unittest.TestCase):
+    def _getTargetClass(self):
+        from repoze.tm import AfterEnd
+        return AfterEnd
+
+    def _makeOne(self):
+        return self._getTargetClass()()
+
+    def test_register(self):
+        registry = self._makeOne()
+        func = lambda *x: None
+        environ = {}
+        registry.register(func, environ)
+        self.assertEqual(environ[registry.key], [func])
+
+    def test_unregister_exists(self):
+        registry = self._makeOne()
+        func = lambda *x: None
+        environ = {}
+        registry.register(func, environ)
+        registry.unregister(func, environ)
+        self.assertEqual(environ[registry.key], [])
+        
+    def test_unregister_notexists(self):
+        registry = self._makeOne()
+        func = lambda *x: None
+        environ = {registry.key:[None]}
+        registry.unregister(func, environ)
+        self.assertEqual(environ[registry.key], [None])
 
 class DummyApplication:
     def __init__(self, resource, doom=False, exception=False):

Index: __init__.py
===================================================================
RCS file: /home/repoze/cvs/filters/repoze.tm/repoze/tm/__init__.py,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -u -d -r1.1.1.1 -r1.2
--- __init__.py	10 Sep 2007 22:39:56 -0000	1.1.1.1
+++ __init__.py	13 Sep 2007 15:33:26 -0000	1.2
@@ -21,16 +21,36 @@
 
     def commit(self, environ):
         transaction.commit()
-        self.cleanup(environ)
+        after_end.cleanup(environ)
 
     def abort(self, environ):
         transaction.abort()
-        self.cleanup(environ)
+        after_end.cleanup(environ)
+
+# Callback registry API helper class
+class AfterEnd:
+    key = 'repoze.tm.afterend'
+    def register(self, func, environ):
+        cleanup = environ.setdefault(self.key, [])
+        cleanup.append(func)
+
+    def unregister(self, func, environ):
+        cleanup = environ.get(self.key, [])
+        new = []
+        for f in cleanup:
+            if f is func:
+                continue
+            new.append(f)
+        environ[self.key] = new
 
     def cleanup(self, environ):
-        cleanup = environ.get('tm.cleanup', None)
-        if cleanup is not None:
-            cleanup.clear()
+        for func in environ.setdefault(self.key, []):
+            func()
+        del environ[self.key]
 
+# singleton, importable by other modules
+after_end = AfterEnd()
+    
 def make_tm(app, global_conf):
     return TM(app)
+

_______________________________________________
Repoze-dev mailing list
Repoze-dev at lists.repoze.org
http://lists.repoze.org/mailman/listinfo/repoze-dev



More information about the Repoze-dev mailing list