[Checkins] SVN: grokapps/rdbexample/trunk/megrok.rdb/src/megrok/rdb/ Implement a sensible default keyfunct, a rdb.key directive and a grokker to prevent rdb.key and keyfunc both being available on a rdb.Container

Jasper Spaans jspaans at thehealthagency.com
Sat May 3 10:34:00 EDT 2008


Log message for revision 86222:
  Implement a sensible default keyfunct, a rdb.key directive and a grokker to prevent rdb.key and keyfunc both being available on a rdb.Container

Changed:
  U   grokapps/rdbexample/trunk/megrok.rdb/src/megrok/rdb/__init__.py
  U   grokapps/rdbexample/trunk/megrok.rdb/src/megrok/rdb/components.py
  A   grokapps/rdbexample/trunk/megrok.rdb/src/megrok/rdb/directive.py
  A   grokapps/rdbexample/trunk/megrok.rdb/src/megrok/rdb/meta.py
  A   grokapps/rdbexample/trunk/megrok.rdb/src/megrok/rdb/meta.zcml

-=-
Modified: grokapps/rdbexample/trunk/megrok.rdb/src/megrok/rdb/__init__.py
===================================================================
--- grokapps/rdbexample/trunk/megrok.rdb/src/megrok/rdb/__init__.py	2008-05-03 14:33:16 UTC (rev 86221)
+++ grokapps/rdbexample/trunk/megrok.rdb/src/megrok/rdb/__init__.py	2008-05-03 14:34:00 UTC (rev 86222)
@@ -4,6 +4,8 @@
 from megrok.rdb.schema import Fields
 from megrok.rdb.db import Database
 
+from megrok.rdb.directive import key
+
 import collective.lead.interfaces
 
 

Modified: grokapps/rdbexample/trunk/megrok.rdb/src/megrok/rdb/components.py
===================================================================
--- grokapps/rdbexample/trunk/megrok.rdb/src/megrok/rdb/components.py	2008-05-03 14:33:16 UTC (rev 86221)
+++ grokapps/rdbexample/trunk/megrok.rdb/src/megrok/rdb/components.py	2008-05-03 14:34:00 UTC (rev 86222)
@@ -20,9 +20,22 @@
                 raise TypeError('%r is an invalid keyword argument for %s' %
                                 (k, type(self).__name__))
             setattr(self, k, kwargs[k])
-    
+
+def default_keyfunc(node):
+    primary_keys = node.__table__.primary_key.keys()
+    if len(primary_keys) == 1:
+        return getattr(node, primary_keys[0])
+    else:
+        raise RuntimeError("don't know how to do keying with composite primary keys")
+
 class Container(Context, MappedCollection):
     implements(IContainer)
 
     def __init__(self, *args, **kw):
-        MappedCollection.__init__(self, keyfunc=lambda node:node.id)
+        if hasattr(self, '__rdb_key__'):
+            keyfunc = lambda node:getattr(node, self.__rdb_key__)
+        elif hasattr(self, 'keyfunc'):
+            keyfunc = self.keyfunc
+        else:
+            keyfunc = default_keyfunc
+        MappedCollection.__init__(self, keyfunc=keyfunc)

Added: grokapps/rdbexample/trunk/megrok.rdb/src/megrok/rdb/directive.py
===================================================================
--- grokapps/rdbexample/trunk/megrok.rdb/src/megrok/rdb/directive.py	                        (rev 0)
+++ grokapps/rdbexample/trunk/megrok.rdb/src/megrok/rdb/directive.py	2008-05-03 14:34:00 UTC (rev 86222)
@@ -0,0 +1,11 @@
+from martian.directive import (OnceDirective, SingleTextDirective,
+                               SingleValue,
+                               ClassDirectiveContext)
+
+class RdbKeyDirective(SingleTextDirective, OnceDirective):
+    """
+    Directive that accepts a string to be used as the lookup key
+    """
+    pass
+
+key = RdbKeyDirective('rdb.key', ClassDirectiveContext())


Property changes on: grokapps/rdbexample/trunk/megrok.rdb/src/megrok/rdb/directive.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: grokapps/rdbexample/trunk/megrok.rdb/src/megrok/rdb/meta.py
===================================================================
--- grokapps/rdbexample/trunk/megrok.rdb/src/megrok/rdb/meta.py	                        (rev 0)
+++ grokapps/rdbexample/trunk/megrok.rdb/src/megrok/rdb/meta.py	2008-05-03 14:34:00 UTC (rev 86222)
@@ -0,0 +1,15 @@
+import martian
+from martian.error import GrokError
+
+import megrok.rdb
+
+class ContainerGrokker(martian.ClassGrokker):
+    component_class = megrok.rdb.Container
+
+    def grok(self, name, factory, module_info, config, **kw):
+        if hasattr(factory, 'keyfunc') and hasattr(factory, '__rdb_key__'):
+            raise GrokError(
+                "It is not allowed to specify a custom 'keyfunc' method "
+                "for rdb.Container %r, when a rdb.key directive has also "
+                "been given." % factory, factory)
+        return True


Property changes on: grokapps/rdbexample/trunk/megrok.rdb/src/megrok/rdb/meta.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: grokapps/rdbexample/trunk/megrok.rdb/src/megrok/rdb/meta.zcml
===================================================================
--- grokapps/rdbexample/trunk/megrok.rdb/src/megrok/rdb/meta.zcml	                        (rev 0)
+++ grokapps/rdbexample/trunk/megrok.rdb/src/megrok/rdb/meta.zcml	2008-05-03 14:34:00 UTC (rev 86222)
@@ -0,0 +1,9 @@
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    xmlns:meta="http://namespaces.zope.org/meta"
+    xmlns:grok="http://namespaces.zope.org/grok">
+
+  <!-- Load the grokkers -->
+  <grok:grok package=".meta" />
+
+</configure>



More information about the Checkins mailing list