From: Chris Withers Date: Tue, 23 Feb 2010 17:17:08 +0000 (+0000) Subject: a handy @classproperty decorator X-Git-Tag: rel_0_6beta2~139 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=165eda57336afd2fcc205a07bed662e021c81861;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git a handy @classproperty decorator --- diff --git a/lib/sqlalchemy/util.py b/lib/sqlalchemy/util.py index 873243de16..97270004b5 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 e7e4116f72..035e4f2682 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, + })