[Checkins] SVN: megrok.rdb/trunk/src/megrok/rdb/ add a new rdb.tableargs directive. This lets the user set

Martijn Faassen faassen at infrae.com
Mon Oct 27 22:53:05 EDT 2008


Log message for revision 92647:
  add a new rdb.tableargs directive. This lets the user set 
  __table_args__ in a nicer way, allowing both keyword arguments
  as well as non-keyword arguments.
  

Changed:
  U   megrok.rdb/trunk/src/megrok/rdb/__init__.py
  U   megrok.rdb/trunk/src/megrok/rdb/directive.py
  U   megrok.rdb/trunk/src/megrok/rdb/meta.py
  A   megrok.rdb/trunk/src/megrok/rdb/tests/tableargs.py
  U   megrok.rdb/trunk/src/megrok/rdb/tests/test_rdb.py

-=-
Modified: megrok.rdb/trunk/src/megrok/rdb/__init__.py
===================================================================
--- megrok.rdb/trunk/src/megrok/rdb/__init__.py	2008-10-28 02:06:18 UTC (rev 92646)
+++ megrok.rdb/trunk/src/megrok/rdb/__init__.py	2008-10-28 02:53:04 UTC (rev 92647)
@@ -1,6 +1,7 @@
 from megrok.rdb.components import Model, Container, QueryContainer
 from megrok.rdb.schema import Fields
-from megrok.rdb.directive import key, metadata, tablename, reflected
+from megrok.rdb.directive import (key, metadata, tablename, reflected,
+                                  tableargs)
 from megrok.rdb.setup import setupDatabase
 from megrok.rdb.interfaces import IDatabaseSetupEvent
 from megrok.rdb.prop import locatedproperty

Modified: megrok.rdb/trunk/src/megrok/rdb/directive.py
===================================================================
--- megrok.rdb/trunk/src/megrok/rdb/directive.py	2008-10-28 02:06:18 UTC (rev 92646)
+++ megrok.rdb/trunk/src/megrok/rdb/directive.py	2008-10-28 02:53:04 UTC (rev 92647)
@@ -21,3 +21,15 @@
     scope = CLASS_OR_MODULE
     store = ONCE
 
+class tableargs(Directive):
+    scope = CLASS
+    store = ONCE
+    default = None
+
+    def factory(self, *args, **kw):
+        if args:
+            return args + (kw,)
+        elif kw:
+            return kw
+        else:
+            return None

Modified: megrok.rdb/trunk/src/megrok/rdb/meta.py
===================================================================
--- megrok.rdb/trunk/src/megrok/rdb/meta.py	2008-10-28 02:06:18 UTC (rev 92646)
+++ megrok.rdb/trunk/src/megrok/rdb/meta.py	2008-10-28 02:53:04 UTC (rev 92647)
@@ -13,9 +13,13 @@
     martian.directive(rdb.tablename, get_default=default_tablename)
     martian.directive(rdb.metadata)
     martian.directive(rdb.reflected)
+    martian.directive(rdb.tableargs)
     
-    def execute(self, class_, tablename, metadata, reflected, **kw):
+    def execute(self, class_, tablename, metadata, reflected, tableargs, **kw):
         class_.__tablename__ = tablename
+        if tableargs is not None:
+            class_.__table_args__ = tableargs
+        
         if reflected:
             if not hasattr(metadata, '_reflected_registry'):
                 metadata._reflected_registry = {}

Added: megrok.rdb/trunk/src/megrok/rdb/tests/tableargs.py
===================================================================
--- megrok.rdb/trunk/src/megrok/rdb/tests/tableargs.py	                        (rev 0)
+++ megrok.rdb/trunk/src/megrok/rdb/tests/tableargs.py	2008-10-28 02:53:04 UTC (rev 92647)
@@ -0,0 +1,68 @@
+import unittest
+
+from megrok import rdb
+
+import grok.testing
+
+from sqlalchemy import Column
+from sqlalchemy.types import Integer
+from sqlalchemy.schema import ForeignKeyConstraint
+
+class TableArgs(unittest.TestCase):
+    def setUp(self):
+        grok.testing.grok('megrok.rdb.meta')
+
+    def test_no_tableargs(self):
+        class MyClass(rdb.Model):
+            rdb.metadata(rdb.MetaData())
+            id = Column(Integer, primary_key=True)
+            
+        grok.testing.grok_component('MyClass', MyClass)
+        self.assert_(not hasattr(MyClass, '__table_args__'))
+    
+    def test_empty_tableargs(self):
+        class MyClass(rdb.Model):
+            rdb.metadata(rdb.MetaData())
+            id = Column(Integer, primary_key=True)
+            rdb.tableargs()
+    
+        grok.testing.grok_component('MyClass', MyClass)
+        self.assert_(not hasattr(MyClass, '__table_args__'))
+
+    def test_non_keyword_tableargs(self):
+        class MyClass(rdb.Model):
+            rdb.metadata(rdb.MetaData())
+            rdb.tableargs(ForeignKeyConstraint(['id'], ['whah.id']))
+            id = Column(Integer, primary_key=True)
+            
+        grok.testing.grok_component('MyClass', MyClass)
+        arg, kw = MyClass.__table_args__
+        self.assert_(isinstance(arg, ForeignKeyConstraint))
+        self.assertEquals({}, kw)
+
+    def test_keyword_tableargs(self):
+        class MyClass(rdb.Model):
+            rdb.metadata(rdb.MetaData())
+            rdb.tableargs(schema='bar')
+            id = Column(Integer, primary_key=True)
+            
+        grok.testing.grok_component('MyClass', MyClass)
+        self.assertEquals({'schema': 'bar'}, MyClass.__table_args__)
+
+    def test_both_tableargs(self):
+        class MyClass(rdb.Model):
+            rdb.metadata(rdb.MetaData())
+            rdb.tableargs(ForeignKeyConstraint(['id'], ['whah.id']),
+                          schema='bar')
+            id = Column(Integer, primary_key=True)
+            
+        grok.testing.grok_component('MyClass', MyClass)
+        arg = MyClass.__table_args__[:-1]
+        kw = MyClass.__table_args__[-1]
+        self.assertEquals(1, len(arg))
+        self.assert_(isinstance(arg[0], ForeignKeyConstraint))
+        self.assertEquals({'schema': 'bar'}, kw)
+        
+def suite():
+    return unittest.makeSuite(TableArgs)
+

Modified: megrok.rdb/trunk/src/megrok/rdb/tests/test_rdb.py
===================================================================
--- megrok.rdb/trunk/src/megrok/rdb/tests/test_rdb.py	2008-10-28 02:06:18 UTC (rev 92646)
+++ megrok.rdb/trunk/src/megrok/rdb/tests/test_rdb.py	2008-10-28 02:53:04 UTC (rev 92647)
@@ -8,6 +8,8 @@
     
 from z3c.saconfig.interfaces import IEngineFactory, IScopedSession
 
+from megrok.rdb.tests import tableargs
+
 def moduleSetUp(test):
     # using zope.testing.module.setUp to work around
     # __module__ being '__builtin__' by default
@@ -58,4 +60,5 @@
         '../schema.txt',
         optionflags=optionflags,
         ))
+    suite.addTest(tableargs.suite())
     return suite



More information about the Checkins mailing list