diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2014-08-02 14:22:25 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2014-08-02 14:22:25 -0400 |
commit | beaefd799dcc8954cbbbc9c8df9ede55cbee1e1c (patch) | |
tree | 7ecc71f8cb5dd01b3ec206bcdf31a647fa64c0e4 /lib/sqlalchemy/ext/declarative/api.py | |
parent | 32165f50209036a98959553e1c5e81537a091a15 (diff) | |
download | sqlalchemy-beaefd799dcc8954cbbbc9c8df9ede55cbee1e1c.tar.gz |
- poc fix for #3149
Diffstat (limited to 'lib/sqlalchemy/ext/declarative/api.py')
-rw-r--r-- | lib/sqlalchemy/ext/declarative/api.py | 41 |
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, |