diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2014-08-13 19:20:44 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2014-08-13 19:20:44 -0400 |
commit | ea85c7053dc9532a95fd487628768fdfc1ca5c30 (patch) | |
tree | cb4daf1166a5ef4a6dcf4d3c05da1a97882233df | |
parent | 44d21de457424f5623362474325aa6e5d3fe9e6d (diff) | |
download | sqlalchemy-ea85c7053dc9532a95fd487628768fdfc1ca5c30.tar.gz |
- The :meth:`.InspectionAttr.info` collection is now moved down to
:class:`.InspectionAttr`, where in addition to being available
on all :class:`.MapperProperty` objects, it is also now available
on hybrid properties, association proxies, when accessed via
:attr:`.Mapper.all_orm_descriptors`.
fixes #2971
-rw-r--r-- | doc/build/changelog/changelog_10.rst | 10 | ||||
-rw-r--r-- | lib/sqlalchemy/orm/base.py | 26 | ||||
-rw-r--r-- | lib/sqlalchemy/orm/interfaces.py | 22 | ||||
-rw-r--r-- | test/ext/test_hybrid.py | 18 |
4 files changed, 54 insertions, 22 deletions
diff --git a/doc/build/changelog/changelog_10.rst b/doc/build/changelog/changelog_10.rst index 20023af44..c59d7c912 100644 --- a/doc/build/changelog/changelog_10.rst +++ b/doc/build/changelog/changelog_10.rst @@ -17,6 +17,16 @@ :version: 1.0.0 .. change:: + :tags: orm, feature + :tickets: 2971 + + The :meth:`.InspectionAttr.info` collection is now moved down to + :class:`.InspectionAttr`, where in addition to being available + on all :class:`.MapperProperty` objects, it is also now available + on hybrid properties, association proxies, when accessed via + :attr:`.Mapper.all_orm_descriptors`. + + .. change:: :tags: sql, feature :tickets: 3027 :pullrequest: bitbucket:29 diff --git a/lib/sqlalchemy/orm/base.py b/lib/sqlalchemy/orm/base.py index 3097b8590..3390ceec4 100644 --- a/lib/sqlalchemy/orm/base.py +++ b/lib/sqlalchemy/orm/base.py @@ -488,6 +488,32 @@ class InspectionAttr(object): """ + @util.memoized_property + def info(self): + """Info dictionary associated with the object, allowing user-defined + data to be associated with this :class:`.InspectionAttr`. + + The dictionary is generated when first accessed. Alternatively, + it can be specified as a constructor argument to the + :func:`.column_property`, :func:`.relationship`, or :func:`.composite` + functions. + + .. versionadded:: 0.8 Added support for .info to all + :class:`.MapperProperty` subclasses. + + .. versionchanged:: 1.0.0 :attr:`.InspectionAttr.info` moved + from :class:`.MapperProperty` so that it can apply to a wider + variety of ORM and extension constructs. + + .. seealso:: + + :attr:`.QueryableAttribute.info` + + :attr:`.SchemaItem.info` + + """ + return {} + class _MappedAttribute(object): """Mixin for attributes which should be replaced by mapper-assigned diff --git a/lib/sqlalchemy/orm/interfaces.py b/lib/sqlalchemy/orm/interfaces.py index 2dfaf6243..49ec99ce4 100644 --- a/lib/sqlalchemy/orm/interfaces.py +++ b/lib/sqlalchemy/orm/interfaces.py @@ -109,28 +109,6 @@ class MapperProperty(_MappedAttribute, InspectionAttr): def instrument_class(self, mapper): # pragma: no-coverage raise NotImplementedError() - @util.memoized_property - def info(self): - """Info dictionary associated with the object, allowing user-defined - data to be associated with this :class:`.MapperProperty`. - - The dictionary is generated when first accessed. Alternatively, - it can be specified as a constructor argument to the - :func:`.column_property`, :func:`.relationship`, or :func:`.composite` - functions. - - .. versionadded:: 0.8 Added support for .info to all - :class:`.MapperProperty` subclasses. - - .. seealso:: - - :attr:`.QueryableAttribute.info` - - :attr:`.SchemaItem.info` - - """ - return {} - _configure_started = False _configure_finished = False diff --git a/test/ext/test_hybrid.py b/test/ext/test_hybrid.py index e7f392a33..b895d2fb2 100644 --- a/test/ext/test_hybrid.py +++ b/test/ext/test_hybrid.py @@ -5,6 +5,7 @@ from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.ext import hybrid from sqlalchemy.testing import eq_, AssertsCompiledSQL, assert_raises_message from sqlalchemy.testing import fixtures +from sqlalchemy import inspect class PropertyComparatorTest(fixtures.TestBase, AssertsCompiledSQL): __dialect__ = 'default' @@ -140,6 +141,14 @@ class PropertyExpressionTest(fixtures.TestBase, AssertsCompiledSQL): return A, B + def test_info(self): + A = self._fixture() + inspect(A).all_orm_descriptors.value.info["some key"] = "some value" + eq_( + inspect(A).all_orm_descriptors.value.info, + {"some key": "some value"} + ) + def test_set_get(self): A = self._fixture() a1 = A(value=5) @@ -267,6 +276,15 @@ class MethodExpressionTest(fixtures.TestBase, AssertsCompiledSQL): "foo(a.value, :foo_1) + :foo_2" ) + def test_info(self): + A = self._fixture() + inspect(A).all_orm_descriptors.value.info["some key"] = "some value" + eq_( + inspect(A).all_orm_descriptors.value.info, + {"some key": "some value"} + ) + + def test_aliased_expression(self): A = self._fixture() self.assert_compile( |