.. changelog::
: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
"""
+ @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
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
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'
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)
"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(