[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