[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