)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"1c070509a2c5374f571dc7e1bbdf6866bcd88b19","unresolved":false,"context_lines":[{"line_number":15,"context_line":"[1]https://github.com/sqlalchemy/sqlalchemy/commit/6446e0dfd3e3bb60754bad81c4d52345733d94e3"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: Ieba1a0315b4588841210078fa13f99f3d5275426"},{"line_number":18,"context_line":"Closes-Bug: #1824178"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3fce034c_39922ff8","line":18,"updated":"2019-04-12 12:15:29.000000000","message":"Does it make sense to add a quick release note to this patch showing a fix for this bug for tracking purposes??","commit_id":"33039540ec2a607d07245a54a98b51dff057abf1"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"87c4b87a27f0867493113eda96fd68136845bc0d","unresolved":false,"context_lines":[{"line_number":15,"context_line":"[1]https://github.com/sqlalchemy/sqlalchemy/commit/6446e0dfd3e3bb60754bad81c4d52345733d94e3"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: Ieba1a0315b4588841210078fa13f99f3d5275426"},{"line_number":18,"context_line":"Closes-Bug: #1824178"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3fce034c_f37d6d1c","line":18,"in_reply_to":"3fce034c_39922ff8","updated":"2019-04-16 17:22:32.000000000","message":"Done","commit_id":"33039540ec2a607d07245a54a98b51dff057abf1"}],"neutron_lib/db/model_query.py":[{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"f4f7c43c654d20430cd712554b22e010daa52ffc","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                if not value:"},{"line_number":188,"context_line":"                    query \u003d query.filter(sql.false())"},{"line_number":189,"context_line":"                    return query"},{"line_number":190,"context_line":"                if isinstance(column, AssociationProxyInstance):"},{"line_number":191,"context_line":"                    # association proxies don\u0027t support in_ so we have to"},{"line_number":192,"context_line":"                    # do multiple equals matches"},{"line_number":193,"context_line":"                    query \u003d query.filter("}],"source_content_type":"text/x-python","patch_set":1,"id":"3fce034c_bd75c0fc","line":190,"updated":"2019-04-11 13:01:05.000000000","message":"how about, \"if not hasattr(column, \"in_\")\" ?  good old duck typing.  Association proxy in 1.3 supports in_(), should be more efficient than an OR of lots of separate comparisons since I think each of these will generate an EXISTS.","commit_id":"33039540ec2a607d07245a54a98b51dff057abf1"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"87c4b87a27f0867493113eda96fd68136845bc0d","unresolved":false,"context_lines":[{"line_number":181,"context_line":"                    query \u003d query.filter(sql.false())"},{"line_number":182,"context_line":"                    return query"},{"line_number":183,"context_line":"                if not hasattr(column, \u0027in_\u0027):"},{"line_number":184,"context_line":"                    # NOTE(ralonsoh): since SQLAlchemy\u003d\u003d1.3.0, a column is an"},{"line_number":185,"context_line":"                    # AssociationProxyInstance and inherits in_() method from"},{"line_number":186,"context_line":"                    # ColumnOperators."},{"line_number":187,"context_line":"                    # association proxies don\u0027t support in_ so we have to"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fce034c_91ef3aaf","line":184,"updated":"2019-04-16 17:22:32.000000000","message":"This is not working, but I don\u0027t know where exactly","commit_id":"23f233adcc9c98bf94b89d7fda116f6def8406c5"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"b397df866eb80b03b744d5c4e260f2f679954164","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                if not value:"},{"line_number":188,"context_line":"                    query \u003d query.filter(sql.false())"},{"line_number":189,"context_line":"                    return query"},{"line_number":190,"context_line":"                if isinstance(column, AssociationProxyInstance):"},{"line_number":191,"context_line":"                    # association proxies don\u0027t support in_ so we have to"},{"line_number":192,"context_line":"                    # do multiple equals matches"},{"line_number":193,"context_line":"                    query \u003d query.filter("}],"source_content_type":"text/x-python","patch_set":4,"id":"3fce034c_5c03290e","line":190,"updated":"2019-04-16 17:32:20.000000000","message":"Michael, I\u0027ll implement your suggestion in PS1 once I solve the problems found in http://logs.openstack.org/84/651584/3/check/tempest-full/fc84d56/","commit_id":"b6e95f3159b7adabc496bd8adf6e4e5116fdbe9e"}],"neutron_lib/db/utils.py":[{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"f4f7c43c654d20430cd712554b22e010daa52ffc","unresolved":false,"context_lines":[{"line_number":154,"context_line":"    :returns: A new dict who\u0027s keys are columns in model or are association"},{"line_number":155,"context_line":"        proxies of the model."},{"line_number":156,"context_line":"    \"\"\""},{"line_number":157,"context_line":"    columns \u003d [c.name for c in model.__table__.columns]"},{"line_number":158,"context_line":"    return dict((k, v) for (k, v) in"},{"line_number":159,"context_line":"                data.items() if k in columns or"},{"line_number":160,"context_line":"                isinstance(getattr(model, k, None), AssociationProxyInstance))"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fce034c_1d009434","line":157,"updated":"2019-04-11 13:01:05.000000000","message":"this whole thing, how about:\n\n    from sqlalchemy import inspect\n    mapper \u003d inspect(model)\n    return dict((k, v) for (k, v) in\n                data.items() if k in             \n                mapper.all_orm_descriptors)\n\nThis will also give you relationships, synonyms, composites and hybrids.   I\u0027m not sure where this dictionary comes from or how it would have a particular key in it otherwise.\n\nIf you want to filter out the relationships you can use:\n\n    insp \u003d inspect(model)\n    non_relationships \u003d set(\n       insp.all_orm_descriptors.keys()\n    ).difference(insp.relationships.keys())","commit_id":"33039540ec2a607d07245a54a98b51dff057abf1"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"87c4b87a27f0867493113eda96fd68136845bc0d","unresolved":false,"context_lines":[{"line_number":154,"context_line":"    :returns: A new dict who\u0027s keys are columns in model or are association"},{"line_number":155,"context_line":"        proxies of the model."},{"line_number":156,"context_line":"    \"\"\""},{"line_number":157,"context_line":"    columns \u003d [c.name for c in model.__table__.columns]"},{"line_number":158,"context_line":"    return dict((k, v) for (k, v) in"},{"line_number":159,"context_line":"                data.items() if k in columns or"},{"line_number":160,"context_line":"                isinstance(getattr(model, k, None), AssociationProxyInstance))"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fce034c_47127b0b","line":157,"in_reply_to":"3fce034c_1d009434","updated":"2019-04-16 17:22:32.000000000","message":"Actually this is a more elegant way to retrieve the model columns and at the same time we remove the dependency of this \"ugly\" conditional import.","commit_id":"33039540ec2a607d07245a54a98b51dff057abf1"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2a0702a44063f87008e51217a5bc1ff97e94bdd8","unresolved":false,"context_lines":[{"line_number":155,"context_line":"    \"\"\""},{"line_number":156,"context_line":"    mapper \u003d sqlalchemy.inspect(model)"},{"line_number":157,"context_line":"    columns \u003d set(c.name for c in mapper.columns)"},{"line_number":158,"context_line":"    columns.union(d.value_attr for d in mapper.all_orm_descriptors"},{"line_number":159,"context_line":"                  if d.extension_type is ASSOCIATION_PROXY)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    # RAH: to remove"}],"source_content_type":"text/x-python","patch_set":10,"id":"ffb9cba7_a10570c4","line":158,"range":{"start_line":158,"start_character":12,"end_line":158,"end_character":17},"updated":"2019-04-24 09:21:16.000000000","message":"OK, I need to relearn Python.... this MUST be \"update\"","commit_id":"c3760eabbb9d85e3857fe7fa3568e7df1a162204"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"dac3429db5131f9f263c773fd5b601aa26831cdf","unresolved":false,"context_lines":[{"line_number":15,"context_line":"from oslo_db import exception as db_exc"},{"line_number":16,"context_line":"from oslo_utils import excutils"},{"line_number":17,"context_line":"import sqlalchemy"},{"line_number":18,"context_line":"from sqlalchemy.ext.associationproxy import ASSOCIATION_PROXY"},{"line_number":19,"context_line":"from sqlalchemy.orm import exc"},{"line_number":20,"context_line":"from sqlalchemy.orm import properties"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"ffb9cba7_a498f7bf","line":18,"updated":"2019-04-25 22:21:40.000000000","message":"huh.  nice find.  forgot all about that","commit_id":"a0b39121cdf3ae338e68fefdf4491bd9788120aa"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"dac3429db5131f9f263c773fd5b601aa26831cdf","unresolved":false,"context_lines":[{"line_number":151,"context_line":"    \"\"\""},{"line_number":152,"context_line":"    mapper \u003d sqlalchemy.inspect(model)"},{"line_number":153,"context_line":"    columns \u003d set(c.name for c in mapper.columns)"},{"line_number":154,"context_line":"    columns.update(d.value_attr for d in mapper.all_orm_descriptors"},{"line_number":155,"context_line":"                   if d.extension_type is ASSOCIATION_PROXY)"},{"line_number":156,"context_line":"    return dict((k, v) for (k, v)"},{"line_number":157,"context_line":"                in data.items() if k in columns)"}],"source_content_type":"text/x-python","patch_set":11,"id":"ffb9cba7_e4410f0d","line":154,"updated":"2019-04-25 22:21:40.000000000","message":"OK, I should maybe document value_attr and make it part of public API tests....however, if d.value_attr itself points to another association proxy, then you aren\u0027t getting the column here.  If you instead refer to d.remote_attr, you will get the remote Column object, *if* this association proxy refers to a scalar column (and not a scalar relationship or a collection relationship), for which you can use c.name.   That will also handle chains of association proxies.    I\u0027m also going to update the docstirngs on those a bit.","commit_id":"a0b39121cdf3ae338e68fefdf4491bd9788120aa"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"55a2c15bfb64a6be9c2e0f746a59845e3054cee7","unresolved":false,"context_lines":[{"line_number":151,"context_line":"    \"\"\""},{"line_number":152,"context_line":"    mapper \u003d sqlalchemy.inspect(model)"},{"line_number":153,"context_line":"    columns \u003d set(c.name for c in mapper.columns)"},{"line_number":154,"context_line":"    columns.update(d.value_attr for d in mapper.all_orm_descriptors"},{"line_number":155,"context_line":"                   if d.extension_type is ASSOCIATION_PROXY)"},{"line_number":156,"context_line":"    return dict((k, v) for (k, v)"},{"line_number":157,"context_line":"                in data.items() if k in columns)"}],"source_content_type":"text/x-python","patch_set":11,"id":"ffb9cba7_850023ad","line":154,"in_reply_to":"ffb9cba7_57ee68ed","updated":"2019-04-29 14:25:08.000000000","message":"That\u0027s the issue that\u0027s fixed by AssociationProxyInstance.   The \"owning_class\" concept only worked for the first class that the AssociationProxy was exposed towards, and if the proxy were never accessed as a descriptor, as you are doing in your example above, it has no idea what its \"owning_class\" should be, so has no way to know it should be referring towards Port.   Using SQLAlchemy 1.2, the proxy can only answer your request if it has had the chance to see what its parent class is supposed to be:\n\n\t\u003e\u003e\u003e import sqlalchemy\n\t\u003e\u003e\u003e sqlalchemy.__version__\n\t\u00271.2.8\u0027\n\t\u003e\u003e\u003e from neutron.db import models_v2 \n\t\u003e\u003e\u003e from sqlalchemy import inspect \n\t\u003e\u003e\u003e m\u003dinspect(models_v2.Port)\n\t\u003e\u003e\u003e m.all_orm_descriptors.created_at.attr\n\t# ...\n\tAttributeError: \u0027NoneType\u0027 object has no attribute \u0027standard_attr\u0027\n\nNow let\u0027s access the proxy as a Python descriptor:\n\n\t\u003e\u003e\u003e models_v2.Port.created_at\n\tAssociationProxy(\u0027standard_attr\u0027, \u0027created_at\u0027)\n\nNow \"owning_class\" is there and .attr works:\n\n\t\u003e\u003e\u003e m.all_orm_descriptors.created_at.attr\n\t(\u003csqlalchemy.orm.attributes.InstrumentedAttribute object at 0x7f75c492b1a8\u003e, \u003csqlalchemy.orm.attributes.InstrumentedAttribute object at 0x7f75c498a0a0\u003e)\n\nIn 1.3, this implicitness is removed, all the special attributes like .attr and .remote_attr are gone from the top level association proxy descriptor:\n\n\t\u003e\u003e\u003e import sqlalchemy\n\t\u003e\u003e\u003e sqlalchemy.__version__\n\t\u00271.3.3\u0027\n\t\u003e\u003e\u003e from neutron.db import models_v2 \n\t\u003e\u003e\u003e from sqlalchemy import inspect \n\t\u003e\u003e\u003e m\u003dinspect(models_v2.Port)\n\t\u003e\u003e\u003e m.all_orm_descriptors.created_at.attr\n\tAttributeError: \u0027AssociationProxy\u0027 object has no attribute \u0027attr\u0027\n\nyou instead have to give the proxy specific context for what it is you want to do:\n\n\t\u003e\u003e\u003e m.all_orm_descriptors.created_at.for_class(models_v2.Port).attr\n\t(\u003csqlalchemy.orm.attributes.InstrumentedAttribute object at 0x7f52e4546258\u003e, \u003csqlalchemy.orm.attributes.InstrumentedAttribute object at 0x7f52e452c150\u003e)\n\nfor_class() is documented at: https://docs.sqlalchemy.org/en/13/orm/extensions/associationproxy.html?highlight\u003dfor_class#sqlalchemy.ext.associationproxy.AssociationProxy.for_class","commit_id":"a0b39121cdf3ae338e68fefdf4491bd9788120aa"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"ad3fa93d24ee8a5dd58530171b0eaf770abf7ccd","unresolved":false,"context_lines":[{"line_number":151,"context_line":"    \"\"\""},{"line_number":152,"context_line":"    mapper \u003d sqlalchemy.inspect(model)"},{"line_number":153,"context_line":"    columns \u003d set(c.name for c in mapper.columns)"},{"line_number":154,"context_line":"    columns.update(d.value_attr for d in mapper.all_orm_descriptors"},{"line_number":155,"context_line":"                   if d.extension_type is ASSOCIATION_PROXY)"},{"line_number":156,"context_line":"    return dict((k, v) for (k, v)"},{"line_number":157,"context_line":"                in data.items() if k in columns)"}],"source_content_type":"text/x-python","patch_set":11,"id":"ffb9cba7_57ee68ed","line":154,"in_reply_to":"ffb9cba7_845053d6","updated":"2019-04-29 07:50:45.000000000","message":"Neutron doesn\u0027t nest relationships or collections in association proxies.\n\nAlso I think AssociationProxyInstance (or AssociationProxy in previous versions) should fix property .remote_attr. An object property should not fail regardless of the object type:\n\n\nfrom neutron.db import models_v2\nfrom sqlalchemy import inspect\nm\u003dinspect(models_v2.Port)\na\u003dlist(m.all_orm_descriptors)[3]\n\n\na\nAssociationProxy(\u0027standard_attr\u0027, \u0027created_at\u0027)\n\n\ntype(a)\n\u003cclass \u0027sqlalchemy.ext.associationproxy.AssociationProxy\u0027\u003e\n\n\na.attr\nTraceback (most recent call last):\n  File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\n  File \"/usr/local/lib/python3.6/dist-packages/sqlalchemy/ext/associationproxy.py\", line 225, in attr\n    return (self.local_attr, self.remote_attr)\n  File \"/usr/local/lib/python3.6/dist-packages/sqlalchemy/ext/associationproxy.py\", line 205, in local_attr\n    return getattr(self.owning_class, self.target_collection)\nAttributeError: \u0027NoneType\u0027 object has no attribute \u0027standard_attr\u0027","commit_id":"a0b39121cdf3ae338e68fefdf4491bd9788120aa"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"01a609b1e0cf5fcaf61a0806b02579a0b1134e42","unresolved":false,"context_lines":[{"line_number":151,"context_line":"    \"\"\""},{"line_number":152,"context_line":"    mapper \u003d sqlalchemy.inspect(model)"},{"line_number":153,"context_line":"    columns \u003d set(c.name for c in mapper.columns)"},{"line_number":154,"context_line":"    columns.update(d.value_attr for d in mapper.all_orm_descriptors"},{"line_number":155,"context_line":"                   if d.extension_type is ASSOCIATION_PROXY)"},{"line_number":156,"context_line":"    return dict((k, v) for (k, v)"},{"line_number":157,"context_line":"                in data.items() if k in columns)"}],"source_content_type":"text/x-python","patch_set":11,"id":"ffb9cba7_9efdd4b2","line":154,"in_reply_to":"ffb9cba7_850023ad","updated":"2019-04-29 17:51:28.000000000","message":"So I need two implementations, one for \u003e1.3 and another one for \u003c1.3, something I was trying to avoid.\n\nAs I said, what we are retrieving here are the \"standard_attrs\". In Neutron we don\u0027t have nested association proxies. If any in the future, this should be handled here, and probably at this point the min version of sqlalchemy will be 1.3; that means we\u0027ll need only one implementation.\n\nBTW, how I retrieve in first place the name of the attribute? How do I know \"created_at\" is the name I\u0027m looking for? Because this exactly what I\u0027m searching: those column names from the association proxies, nothing else.","commit_id":"a0b39121cdf3ae338e68fefdf4491bd9788120aa"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"c923b34bfdbbf05afbdadca33915fa4e710998de","unresolved":false,"context_lines":[{"line_number":151,"context_line":"    \"\"\""},{"line_number":152,"context_line":"    mapper \u003d sqlalchemy.inspect(model)"},{"line_number":153,"context_line":"    columns \u003d set(c.name for c in mapper.columns)"},{"line_number":154,"context_line":"    columns.update(d.value_attr for d in mapper.all_orm_descriptors"},{"line_number":155,"context_line":"                   if d.extension_type is ASSOCIATION_PROXY)"},{"line_number":156,"context_line":"    return dict((k, v) for (k, v)"},{"line_number":157,"context_line":"                in data.items() if k in columns)"}],"source_content_type":"text/x-python","patch_set":11,"id":"ffb9cba7_de6b4c1b","line":154,"in_reply_to":"ffb9cba7_9efdd4b2","updated":"2019-04-29 18:21:32.000000000","message":"if as you said you don\u0027t have nested association proxies then you can use value_attr.\n\nif you want remote_attr here you can pull it from the class:\n\n   getattr(model, key).remote_attr\n\nwhere \"key\" is from all_orm_descriptors.keys()\n\nor use the descriptor directly:\n\n    \u003e\u003e\u003e m.all_orm_descriptors.created_at.__get__(None, models_v2.Port).remote_attr\n    \u003csqlalchemy.orm.attributes.InstrumentedAttribute object at 0x7fd63844c150\u003e\n\n\nthat will avoid the error in 1.2 and also works in 1.3, both of these are standard Python descriptor forms.\n\nWhy exactly is any of this logic needed in the first place?   It shouldn\u0027t normally be necessary to manually resolve the association proxy, which is why this use case is awkward.   It ideally behaves like any other mapped attribute.","commit_id":"a0b39121cdf3ae338e68fefdf4491bd9788120aa"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f73727d58807f5604d1581b3a4ecc435aa54bfce","unresolved":false,"context_lines":[{"line_number":151,"context_line":"    \"\"\""},{"line_number":152,"context_line":"    mapper \u003d sqlalchemy.inspect(model)"},{"line_number":153,"context_line":"    columns \u003d set(c.name for c in mapper.columns)"},{"line_number":154,"context_line":"    columns.update(d.value_attr for d in mapper.all_orm_descriptors"},{"line_number":155,"context_line":"                   if d.extension_type is ASSOCIATION_PROXY)"},{"line_number":156,"context_line":"    return dict((k, v) for (k, v)"},{"line_number":157,"context_line":"                in data.items() if k in columns)"}],"source_content_type":"text/x-python","patch_set":11,"id":"ffb9cba7_30d96cf2","line":154,"in_reply_to":"ffb9cba7_de6b4c1b","updated":"2019-04-30 09:22:21.000000000","message":"Thank you for the information!\n\nHere we need to retrieve only the OVO columns (instrumented attributes) and the association proxies, but not the relationships (e.g.: in Network, we don\u0027t need \"subnets\", \"dhcp_agents\", \"networkRBAC\", etc). Only those parameters valid to filter in the table.","commit_id":"a0b39121cdf3ae338e68fefdf4491bd9788120aa"},{"author":{"_account_id":11816,"name":"mike_mp@zzzcomputing.com","display_name":"Mike Bayer","email":"mike_mp@zzzcomputing.com","username":"zzzeek","status":"Red Hat"},"change_message_id":"13747701297ed9ce73974f3f7086695921a5aa77","unresolved":false,"context_lines":[{"line_number":151,"context_line":"    \"\"\""},{"line_number":152,"context_line":"    mapper \u003d sqlalchemy.inspect(model)"},{"line_number":153,"context_line":"    columns \u003d set(c.name for c in mapper.columns)"},{"line_number":154,"context_line":"    columns.update(d.value_attr for d in mapper.all_orm_descriptors"},{"line_number":155,"context_line":"                   if d.extension_type is ASSOCIATION_PROXY)"},{"line_number":156,"context_line":"    return dict((k, v) for (k, v)"},{"line_number":157,"context_line":"                in data.items() if k in columns)"}],"source_content_type":"text/x-python","patch_set":11,"id":"ffb9cba7_845053d6","line":154,"in_reply_to":"ffb9cba7_e4410f0d","updated":"2019-04-25 22:23:06.000000000","message":"clarification, \"d.remote_attr.expression\" gives you the Column, if that\u0027s what the proxy refers towards.","commit_id":"a0b39121cdf3ae338e68fefdf4491bd9788120aa"}],"releasenotes/notes/sqlalchemy-1-3-0-b0a2b15b10ae526f.yaml":[{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"5cfeaf52f0381cb07bdba04535ebb4c8ba071dda","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"other:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Since `commit \u003chttps://github.com/sqlalchemy/sqlalchemy/commit/6446e0dfd3e3bb60754bad81c4d52345733d94e3\u003e`_,"},{"line_number":5,"context_line":"    an AssociationProxy proxy instance is an AssociationProxyInstance"},{"line_number":6,"context_line":"    derivative object. In order to import versions SQLAlchemy\u003e\u003d1.3.x, we need"},{"line_number":7,"context_line":"    to handle both implementations."}],"source_content_type":"text/x-yaml","patch_set":11,"id":"ffb9cba7_5493f84f","line":4,"range":{"start_line":4,"start_character":27,"end_line":4,"end_character":33},"updated":"2019-04-25 13:37:31.000000000","message":"Nit: use opendev based URLs.","commit_id":"a0b39121cdf3ae338e68fefdf4491bd9788120aa"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"ef8f7c09e7268c4814ebb5a3832537004523f606","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"other:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Since `commit \u003chttps://github.com/sqlalchemy/sqlalchemy/commit/6446e0dfd3e3bb60754bad81c4d52345733d94e3\u003e`_,"},{"line_number":5,"context_line":"    an AssociationProxy proxy instance is an AssociationProxyInstance"},{"line_number":6,"context_line":"    derivative object. In order to import versions SQLAlchemy\u003e\u003d1.3.x, we need"},{"line_number":7,"context_line":"    to handle both implementations."}],"source_content_type":"text/x-yaml","patch_set":11,"id":"ffb9cba7_43c81821","line":4,"range":{"start_line":4,"start_character":27,"end_line":4,"end_character":33},"in_reply_to":"ffb9cba7_5493f84f","updated":"2019-04-25 16:55:40.000000000","message":"SQLalchemy is not in opendev","commit_id":"a0b39121cdf3ae338e68fefdf4491bd9788120aa"}]}
