[Checkins] SVN: z3c.caching/trunk/src/z3c/caching/ Add a means of enumerating the rule set ids

Martin Aspeli optilude at gmx.net
Wed Dec 30 22:10:01 EST 2009


Log message for revision 107424:
  Add a means of enumerating the rule set ids

Changed:
  U   z3c.caching/trunk/src/z3c/caching/interfaces.py
  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/interfaces.py
===================================================================
--- z3c.caching/trunk/src/z3c/caching/interfaces.py	2009-12-31 02:44:28 UTC (rev 107423)
+++ z3c.caching/trunk/src/z3c/caching/interfaces.py	2009-12-31 03:09:59 UTC (rev 107424)
@@ -16,12 +16,18 @@
     def unregister(obj):
         """Remove any prior rule registration attached to obj in this 
         registry. N.B. registries are hierarchical, a parent may still 
-        provide rules."""
+        provide rules.
+        """
     
     def clear():
-        """Remove all rule registrations in this registry."""
+        """Remove all rule registrations in this registry.
+        """
     
     def lookup(obj):
         """Return the id of the rule associated with `obj`.  If no rule has 
         been registered `None` is returned.
-        """
\ No newline at end of file
+        """
+    
+    def enumerate():
+        """Return a sequence of all unique registered rule set ids (strings)
+        """

Modified: z3c.caching/trunk/src/z3c/caching/registry.py
===================================================================
--- z3c.caching/trunk/src/z3c/caching/registry.py	2009-12-31 02:44:28 UTC (rev 107423)
+++ z3c.caching/trunk/src/z3c/caching/registry.py	2009-12-31 03:09:59 UTC (rev 107424)
@@ -25,6 +25,7 @@
     but only returns the pre-specified cache rule."""
     def CacheRuleFactory(context):
         return CacheRule(rule)
+    CacheRuleFactory.id = rule
     return CacheRuleFactory
 
 class RulesetRegistry(object):
@@ -41,7 +42,7 @@
         factory = get_context_to_cacherule_adapter_factory(rule)
         existing = self.directLookup(obj)
         if existing is None:
-            # Only register if we haven't got thisw one already
+            # Only register if we haven't got this 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))
@@ -70,7 +71,16 @@
         if ruler is not None:
             return ruler.id
         return None
-
+    
+    def enumerate(self):
+        seen = set()
+        for reg in self.registry.registeredAdapters():
+            if reg.provided != ICacheRule:
+                continue
+            if reg.factory.id not in seen:
+                yield reg.factory.id
+            seen.add(reg.factory.id)
+    
     def directLookup(self, obj):
         """Find a rule _directly_ assigned to `obj`"""
         for rule in self.registry.registeredAdapters():
@@ -80,7 +90,6 @@
                 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-31 02:44:28 UTC (rev 107423)
+++ z3c.caching/trunk/src/z3c/caching/tests/test_registry.py	2009-12-31 03:09:59 UTC (rev 107424)
@@ -96,6 +96,15 @@
         self.registry.clear()
         self.failUnless(self.registry[i] is None)
     
+    def test_enumerate(self):
+        self.registry.register(ITestView, "rule1")
+        self.registry.register(IMoreSpecificTestView, "rule2")
+        self.registry.register(OtherTestView, "rule2")
+        self.assertEqual(set(['rule1', 'rule2']), set(self.registry.enumerate()))
+    
+    def test_enumerate_empty(self):
+        self.assertEqual(set([]), set(self.registry.enumerate()))
+    
 def test_suite():
     import unittest
     return unittest.defaultTestLoader.loadTestsFromName(__name__)



More information about the checkins mailing list