diff options
author | Chris Withers <chris@simplistix.co.uk> | 2010-02-23 17:17:08 +0000 |
---|---|---|
committer | Chris Withers <chris@simplistix.co.uk> | 2010-02-23 17:17:08 +0000 |
commit | 165eda57336afd2fcc205a07bed662e021c81861 (patch) | |
tree | ad9c82a235ec32f474832803b8c975a735c9cc1d | |
parent | da4d8dd69867f184347606284f1d4426facafe31 (diff) | |
download | sqlalchemy-165eda57336afd2fcc205a07bed662e021c81861.tar.gz |
a handy @classproperty decorator
-rw-r--r-- | lib/sqlalchemy/util.py | 10 | ||||
-rw-r--r-- | test/base/test_utils.py | 22 |
2 files changed, 32 insertions, 0 deletions
diff --git a/lib/sqlalchemy/util.py b/lib/sqlalchemy/util.py index 873243de1..97270004b 100644 --- a/lib/sqlalchemy/util.py +++ b/lib/sqlalchemy/util.py @@ -1639,3 +1639,13 @@ def _decorate_with_warning(func, wtype, message, docstring_header=None): decorated = warned(func) decorated.__doc__ = doc return decorated + +class classproperty(property): + """A decorator that behaves like @property except that operates + on classes rather than instances. + + This is helpful when you need to compute __table_args__ and/or + __mapper_args__ when using declarative.""" + def __get__(desc, self, cls): + return desc.fget(cls) + diff --git a/test/base/test_utils.py b/test/base/test_utils.py index e7e4116f7..035e4f268 100644 --- a/test/base/test_utils.py +++ b/test/base/test_utils.py @@ -980,3 +980,25 @@ class TestClassHierarchy(TestBase): eq_(set(util.class_hierarchy(A)), set((A, B, object))) # end Py2K + +class TestClassProperty(TestBase): + + def test_simple(self): + + from sqlalchemy.util import classproperty + + class A(object): + something = {'foo':1} + + class B(A): + + @classproperty + def something(cls): + d = dict(super(B,cls).something) + d.update({'bazz':2}) + return d + + eq_(B.something,{ + 'foo':1, + 'bazz':2, + }) |