Skip to content

Commit

Permalink
- Added the :paramref:.AssociationProxy.info parameter to the
Browse files Browse the repository at this point in the history
:class:`.AssociationProxy` constructor, to suit the
:attr:`.AssociationProxy.info` accessor that was added in
🎫`2971`.  This is possible because :class:`.AssociationProxy`
is constructed explicitly, unlike a hybrid which is constructed
implicitly via the decorator syntax.
fixes #3551

(cherry picked from commit 9d08c6a)
  • Loading branch information
zzzeek committed Oct 9, 2015
1 parent abc805d commit b63229a
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 1 deletion.
12 changes: 12 additions & 0 deletions doc/build/changelog/changelog_10.rst
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions doc/build/orm/extensions/associationproxy.rst
Expand Up @@ -509,5 +509,6 @@ API Documentation
.. autoclass:: AssociationProxy
:members:
:undoc-members:
:inherited-members:

.. autodata:: ASSOCIATION_PROXY
9 changes: 8 additions & 1 deletion lib/sqlalchemy/ext/associationproxy.py
Expand Up @@ -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
Expand Down Expand Up @@ -138,6 +138,11 @@ def __init__(self, target_collection, attr, creator=None,
: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
Expand All @@ -150,6 +155,8 @@ def __init__(self, target_collection, attr, creator=None,
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):
Expand Down
20 changes: 20 additions & 0 deletions test/ext/test_associationproxy.py
Expand Up @@ -1593,3 +1593,23 @@ def test_update_multi_elem_varg(self):
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'})

0 comments on commit b63229a

Please sign in to comment.