summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/ext/declarative/api.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2014-08-02 14:22:25 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2014-08-02 14:22:25 -0400
commitbeaefd799dcc8954cbbbc9c8df9ede55cbee1e1c (patch)
tree7ecc71f8cb5dd01b3ec206bcdf31a647fa64c0e4 /lib/sqlalchemy/ext/declarative/api.py
parent32165f50209036a98959553e1c5e81537a091a15 (diff)
downloadsqlalchemy-beaefd799dcc8954cbbbc9c8df9ede55cbee1e1c.tar.gz
- poc fix for #3149
Diffstat (limited to 'lib/sqlalchemy/ext/declarative/api.py')
-rw-r--r--lib/sqlalchemy/ext/declarative/api.py41
1 files changed, 40 insertions, 1 deletions
diff --git a/lib/sqlalchemy/ext/declarative/api.py b/lib/sqlalchemy/ext/declarative/api.py
index daf8bffb5..251b06fed 100644
--- a/lib/sqlalchemy/ext/declarative/api.py
+++ b/lib/sqlalchemy/ext/declarative/api.py
@@ -13,7 +13,7 @@ from ...orm import synonym as _orm_synonym, mapper,\
interfaces, properties
from ...orm.util import polymorphic_union
from ...orm.base import _mapper_or_none
-from ...util import OrderedDict
+from ...util import OrderedDict, classproperty
from ... import exc
import weakref
@@ -164,6 +164,45 @@ class declared_attr(interfaces._MappedAttribute, property):
def __get__(desc, self, cls):
return desc.fget(cls)
+ @classproperty
+ def column(cls):
+ return _declared_column
+
+ @classproperty
+ def property(cls):
+ return _declared_property
+
+ defer_defer_defer = False
+
+
+class _memoized_declared_attr(declared_attr):
+ def __init__(self, fget, cascading=False):
+ super(_memoized_declared_attr, self).__init__(fget)
+ self.reg = weakref.WeakKeyDictionary()
+ self._cascading = cascading
+
+ def __get__(desc, self, cls):
+ if desc.defer_defer_defer:
+ return desc
+ elif cls in desc.reg:
+ return desc.reg[cls]
+ else:
+ desc.reg[cls] = obj = desc.fget(cls)
+ return obj
+
+ @classproperty
+ def cascading(cls):
+ return lambda decorated: cls(decorated, cascading=True)
+
+
+class _declared_column(_memoized_declared_attr):
+ pass
+
+
+class _declared_property(_memoized_declared_attr):
+ defer_defer_defer = True
+
+
def declarative_base(bind=None, metadata=None, mapper=None, cls=object,
name='Base', constructor=_declarative_constructor,