[Checkins] SVN: z3c.caching/trunk/src/z3c/caching/ Expand tests and make re-registering a rule be a noop, not a replacement.

Matthew Wilkes matthew at matthewwilkes.co.uk
Mon Dec 28 13:08:08 EST 2009


Log message for revision 107223:
  Expand tests and make re-registering a rule be a noop, not a replacement.

Changed:
  U   z3c.caching/trunk/src/z3c/caching/registry.py
  U   z3c.caching/trunk/src/z3c/caching/tests/test_registry.py

-=-
Modified: z3c.caching/trunk/src/z3c/caching/registry.py
===================================================================
--- z3c.caching/trunk/src/z3c/caching/registry.py	2009-12-28 17:44:31 UTC (rev 107222)
+++ z3c.caching/trunk/src/z3c/caching/registry.py	2009-12-28 18:08:08 UTC (rev 107223)
@@ -6,7 +6,7 @@
 We will (ab)use the zope.component registries by registering a dummy adapter
 for the entity to a special ICacheRule interface and which will always return
 the ruleset id. """
-
+import warnings
 from zope.interface import implements
 from zope.component import adapts, getGlobalSiteManager
 from zope.component.interfaces import IComponents
@@ -29,9 +29,13 @@
         self.registry = registry
 
     def register(self, obj, rule):
-        def r(context):
-            return lambda r=rule:r
-        self.registry.registerAdapter(r, provided=ICacheRule, required=(obj,))
+        factory = lambda context: CacheRule(rule)
+        existing = self.directLookup(obj)
+        if existing is None:
+            # Only register if we haven't got thisw one already
+            self.registry.registerAdapter(factory, provided=ICacheRule, required=(obj,))
+        else:
+            warnings.warn("Ignoring attempted to register caching rule %s for %s.  %s is already registered." % (rule, `obj`, existing))
         return None
 
 
@@ -55,10 +59,19 @@
     def lookup(self, obj):
         ruler=ICacheRule(obj, None)
         if ruler is not None:
-            return ruler()
+            return ruler.id
         return None
 
+    def directLookup(self, obj):
+        """Find a rule _directly_ assigned to `obj`"""
+        for rule in self.registry.registeredAdapters():
+            if rule.provided != ICacheRule:
+                pass
+            if rule.required == (obj, ):
+                return rule.factory(None).id
+        return None
 
+
     __getitem__ = lookup
 
 # Set up RulesetRegistry as an adapter for component roots

Modified: z3c.caching/trunk/src/z3c/caching/tests/test_registry.py
===================================================================
--- z3c.caching/trunk/src/z3c/caching/tests/test_registry.py	2009-12-28 17:44:31 UTC (rev 107222)
+++ z3c.caching/trunk/src/z3c/caching/tests/test_registry.py	2009-12-28 18:08:08 UTC (rev 107223)
@@ -1,6 +1,7 @@
+from unittest import TestCase
+import warnings
 from zope.interface import Interface
 from zope.interface import implements
-from unittest import TestCase
 
 from z3c.caching.registry import getGlobalRulesetRegistry
 
@@ -21,6 +22,9 @@
 
     def setUp(self):
         self.registry = getGlobalRulesetRegistry()
+    
+    def tearDown(self):
+        self.registry.clear()
 
     def test_no_ruleset_returned_if_unregistered(self):
         self.failUnless(self.registry[None] is None)
@@ -34,10 +38,45 @@
         self.registry.register(ITestView, "frop")
         i=TestView()
         self.assertEqual(self.registry[i], "frop")
+    
+    def test_most_specific_interface_wins(self):
+        self.registry.register(ITestView, "frop")
+        self.registry.register(IMoreSpecificTestView, "fribble")
+        i=OtherTestView()
+        self.assertEqual(self.registry[i], "fribble")
+    
+    def test_direct_lookup_for_interface_works(self):
+        self.registry.register(ITestView, "frop")
+        self.assertEqual(self.registry.directLookup(ITestView), "frop")
 
+    def test_direct_lookup_for_daughter_fails(self):
+        self.registry.register(ITestView, "frop")
+        self.assertEqual(self.registry.directLookup(IMoreSpecificTestView), None)
+    
+    def test_registration_on_class_ignores_any_interface_relationship(self):
+        self.registry.register(TestView, "frop")
+        
+        i=OtherTestView()
+        self.assertEqual(self.registry[i], None)
+
+        i=TestView()
+        self.assertEqual(self.registry[i], "frop")
+
+    def test_registration_on_class_wins_over_interface_registration(self):
+        self.registry.register(ITestView, "frop")
+        self.registry.register(TestView, "fribble")
+        
+        i=TestView()
+        self.assertEqual(self.registry[i], "fribble")
+
     def test_ruleset_registered_twice(self):
         self.registry.register(ITestView, "frop")
+
+        # Hide the warning generated, that's for users, not tests.
+        warnings.simplefilter("ignore")
         self.registry.register(ITestView, "fribble")
+        warnings.simplefilter("default")
+
         i=TestView()
         self.assertEqual(self.registry[i], "frop")
 
@@ -56,3 +95,4 @@
         i = TestView()
         self.registry.clear()
         self.failUnless(self.registry[i] is None)
+    



More information about the checkins mailing list