From: Mike Bayer Date: Fri, 9 Oct 2015 22:01:43 +0000 (-0400) Subject: - Added the :paramref:`.AssociationProxy.info` parameter to the X-Git-Tag: rel_1_1_0b1~84^2~70^2~79 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9d08c6abc21dcf3d832897d38aaba84aeaa14fa6;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - Added the :paramref:`.AssociationProxy.info` parameter to the :class:`.AssociationProxy` constructor, to suit the :attr:`.AssociationProxy.info` accessor that was added in :ticket:`2971`. This is possible because :class:`.AssociationProxy` is constructed explicitly, unlike a hybrid which is constructed implicitly via the decorator syntax. fixes #3551 --- diff --git a/doc/build/changelog/changelog_10.rst b/doc/build/changelog/changelog_10.rst index a3b3e0092c..b6a944a1e9 100644 --- a/doc/build/changelog/changelog_10.rst +++ b/doc/build/changelog/changelog_10.rst @@ -18,6 +18,18 @@ .. changelog:: :version: 1.0.9 + .. change:: + :tags: feature, ext + :versions: 1.1.0b1 + :tickets: 3551 + + Added the :paramref:`.AssociationProxy.info` parameter to the + :class:`.AssociationProxy` constructor, to suit the + :attr:`.AssociationProxy.info` accessor that was added in + :ticket:`2971`. This is possible because :class:`.AssociationProxy` + is constructed explicitly, unlike a hybrid which is constructed + implicitly via the decorator syntax. + .. change:: :tags: bug, oracle :versions: 1.1.0b1 diff --git a/doc/build/orm/extensions/associationproxy.rst b/doc/build/orm/extensions/associationproxy.rst index 6fc57e30cc..7e7b1f9de4 100644 --- a/doc/build/orm/extensions/associationproxy.rst +++ b/doc/build/orm/extensions/associationproxy.rst @@ -509,5 +509,6 @@ API Documentation .. autoclass:: AssociationProxy :members: :undoc-members: + :inherited-members: .. autodata:: ASSOCIATION_PROXY diff --git a/lib/sqlalchemy/ext/associationproxy.py b/lib/sqlalchemy/ext/associationproxy.py index d837aab520..29064ef27b 100644 --- a/lib/sqlalchemy/ext/associationproxy.py +++ b/lib/sqlalchemy/ext/associationproxy.py @@ -94,7 +94,7 @@ class AssociationProxy(interfaces.InspectionAttrInfo): def __init__(self, target_collection, attr, creator=None, getset_factory=None, proxy_factory=None, - proxy_bulk_set=None): + proxy_bulk_set=None, info=None): """Construct a new :class:`.AssociationProxy`. The :func:`.association_proxy` function is provided as the usual @@ -138,6 +138,11 @@ class AssociationProxy(interfaces.InspectionAttrInfo): :param proxy_bulk_set: Optional, use with proxy_factory. See the _set() method for details. + :param info: optional, will be assigned to + :attr:`.AssociationProxy.info` if present. + + .. versionadded:: 1.0.9 + """ self.target_collection = target_collection self.value_attr = attr @@ -150,6 +155,8 @@ class AssociationProxy(interfaces.InspectionAttrInfo): self.key = '_%s_%s_%s' % ( type(self).__name__, target_collection, id(self)) self.collection_class = None + if info: + self.info = info @property def remote_attr(self): diff --git a/test/ext/test_associationproxy.py b/test/ext/test_associationproxy.py index 8fb335b064..98e40b11ee 100644 --- a/test/ext/test_associationproxy.py +++ b/test/ext/test_associationproxy.py @@ -1593,3 +1593,23 @@ class DictOfTupleUpdateTest(fixtures.TestBase): a1.elements.update, (("B", 3), 'elem2'), (("C", 4), "elem3") ) + + +class InfoTest(fixtures.TestBase): + def test_constructor(self): + assoc = association_proxy('a', 'b', info={'some_assoc': 'some_value'}) + eq_(assoc.info, {"some_assoc": "some_value"}) + + def test_empty(self): + assoc = association_proxy('a', 'b') + eq_(assoc.info, {}) + + def test_via_cls(self): + class Foob(object): + assoc = association_proxy('a', 'b') + + eq_(Foob.assoc.info, {}) + + Foob.assoc.info["foo"] = 'bar' + + eq_(Foob.assoc.info, {'foo': 'bar'})