)]}'
{"neutron/db/standard_attr.py":[{"author":{"_account_id":25618,"name":"Paweł Suder","email":"pawel@suder.info","username":"SuderPawel"},"change_message_id":"4329169f3638a02a27b188520afad2130fdebe67","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        sub-resources need to be extended with the standard attr fields"},{"line_number":110,"context_line":"        (e.g. created_at/updated_at/etc)."},{"line_number":111,"context_line":"        \"\"\""},{"line_number":112,"context_line":"        if hasattr(cls, \u0027api_sub_resources\u0027):"},{"line_number":113,"context_line":"            return cls.api_sub_resources"},{"line_number":114,"context_line":"        else:"},{"line_number":115,"context_line":"            return []"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    @classmethod"},{"line_number":118,"context_line":"    def get_collection_resource_map(cls):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f6a8fd7_ba4892b2","line":115,"range":{"start_line":112,"start_character":8,"end_line":115,"end_character":21},"updated":"2018-04-26 07:25:07.000000000","message":"I would propose to use try .. except AttributeError: ..","commit_id":"5f211ca837ab5d57895ecb9424403ea21f5e9279"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"7ed36197d336b2727a9c819e6a6a321c8e0379d1","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        sub-resources need to be extended with the standard attr fields"},{"line_number":110,"context_line":"        (e.g. created_at/updated_at/etc)."},{"line_number":111,"context_line":"        \"\"\""},{"line_number":112,"context_line":"        if hasattr(cls, \u0027api_sub_resources\u0027):"},{"line_number":113,"context_line":"            return cls.api_sub_resources"},{"line_number":114,"context_line":"        else:"},{"line_number":115,"context_line":"            return []"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    @classmethod"},{"line_number":118,"context_line":"    def get_collection_resource_map(cls):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f6a8fd7_f18628bb","line":115,"range":{"start_line":112,"start_character":8,"end_line":115,"end_character":21},"in_reply_to":"9f6a8fd7_ba4892b2","updated":"2018-04-26 14:50:09.000000000","message":"Ah yes, why not!","commit_id":"5f211ca837ab5d57895ecb9424403ea21f5e9279"},{"author":{"_account_id":25618,"name":"Paweł Suder","email":"pawel@suder.info","username":"SuderPawel"},"change_message_id":"3dab00989d2464abc4a520eaf340252d6fd5fa6d","unresolved":false,"context_lines":[{"line_number":199,"context_line":"    rs_map[resource] \u003d subclass"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"def get_standard_attr_resource_model_map(include_resources\u003dTrue,"},{"line_number":203,"context_line":"                                         include_sub_resources\u003dTrue):"},{"line_number":204,"context_line":"    rs_map \u003d {}"},{"line_number":205,"context_line":"    for subclass in HasStandardAttributes.__subclasses__():"},{"line_number":206,"context_line":"        if include_resources:"}],"source_content_type":"text/x-python","patch_set":4,"id":"9f6a8fd7_2b697a8a","line":203,"range":{"start_line":202,"start_character":4,"end_line":203,"end_character":68},"updated":"2018-04-27 11:16:10.000000000","message":"BTW, I did a grep on master 40496c6d0749cf63f1458a46a8c69284135133d1\n\n  ➜  neutron git:(master) grep -r get_standard_attr_resource_model_map ./\n  .//neutron/tests/unit/db/test_standard_attr.py:        rs_map \u003d standard_attr.get_standard_attr_resource_model_map()\n  .//neutron/tests/unit/db/test_standard_attr.py:        rs_map \u003d standard_attr.get_standard_attr_resource_model_map()\n  .//neutron/tests/unit/db/test_standard_attr.py:            standard_attr.get_standard_attr_resource_model_map()\n  .//neutron/tests/unit/db/test_standard_attr.py:            set(standard_attr.get_standard_attr_resource_model_map().keys())\n  .//neutron/tests/unit/db/test_standard_attr.py:        mm \u003d standard_attr.get_standard_attr_resource_model_map()\n  .//neutron/extensions/revisions.py:        rs_map \u003d standard_attr.get_standard_attr_resource_model_map()\n  .//neutron/extensions/standardattrdescription.py:        rs_map \u003d standard_attr.get_standard_attr_resource_model_map()\n  .//neutron/extensions/timestamp.py:        rs_map \u003d standard_attr.get_standard_attr_resource_model_map()\n  .//neutron/db/standardattrdescription_db.py:        list(standard_attr.get_standard_attr_resource_model_map()))\n  .//neutron/db/standard_attr.py:def get_standard_attr_resource_model_map():\n  .//neutron/services/revisions/revision_plugin.py:        list(standard_attr.get_standard_attr_resource_model_map()))\n  .//neutron/services/revisions/revision_plugin.py:        mmap \u003d standard_attr.get_standard_attr_resource_model_map()\n  .//neutron/services/timestamp/timestamp_db.py:        rs_model_maps \u003d standard_attr.get_standard_attr_resource_model_map()\n  .//neutron/services/timestamp/timestamp_db.py:        list(standard_attr.get_standard_attr_resource_model_map()))\n  .//neutron/services/tag/tag_plugin.py:resource_model_map \u003d standard_attr.get_standard_attr_resource_model_map()\n\nNo-one uses (False, False) (it was not possible until this commit).","commit_id":"e14b2f64d7de00310c126db96a868b5c46c96ec1"},{"author":{"_account_id":25618,"name":"Paweł Suder","email":"pawel@suder.info","username":"SuderPawel"},"change_message_id":"723f8874529fc550961e5fcd3946b5f600e5b98a","unresolved":false,"context_lines":[{"line_number":202,"context_line":"def get_standard_attr_resource_model_map(include_resources\u003dTrue,"},{"line_number":203,"context_line":"                                         include_sub_resources\u003dTrue):"},{"line_number":204,"context_line":"    rs_map \u003d {}"},{"line_number":205,"context_line":"    for subclass in HasStandardAttributes.__subclasses__():"},{"line_number":206,"context_line":"        if include_resources:"},{"line_number":207,"context_line":"            for resource in subclass.get_api_collections():"},{"line_number":208,"context_line":"                _resource_model_map_helper(rs_map, resource, subclass)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9f6a8fd7_f5a4c1bb","line":205,"range":{"start_line":205,"start_character":4,"end_line":205,"end_character":59},"updated":"2018-04-27 09:39:56.000000000","message":"I am wondering if it is possible to check if both params are `include_resources` and `include_sub_resources` is set to `False` and return empty {} immediately without looping over subclasses.","commit_id":"e14b2f64d7de00310c126db96a868b5c46c96ec1"},{"author":{"_account_id":25618,"name":"Paweł Suder","email":"pawel@suder.info","username":"SuderPawel"},"change_message_id":"3dab00989d2464abc4a520eaf340252d6fd5fa6d","unresolved":false,"context_lines":[{"line_number":202,"context_line":"def get_standard_attr_resource_model_map(include_resources\u003dTrue,"},{"line_number":203,"context_line":"                                         include_sub_resources\u003dTrue):"},{"line_number":204,"context_line":"    rs_map \u003d {}"},{"line_number":205,"context_line":"    for subclass in HasStandardAttributes.__subclasses__():"},{"line_number":206,"context_line":"        if include_resources:"},{"line_number":207,"context_line":"            for resource in subclass.get_api_collections():"},{"line_number":208,"context_line":"                _resource_model_map_helper(rs_map, resource, subclass)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9f6a8fd7_0b903695","line":205,"range":{"start_line":205,"start_character":4,"end_line":205,"end_character":59},"in_reply_to":"9f6a8fd7_950c6595","updated":"2018-04-27 11:16:10.000000000","message":"Yeap, I noticed of that function is with (True, False) OR (False, True).","commit_id":"e14b2f64d7de00310c126db96a868b5c46c96ec1"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"bc0f23c50637e3800c1c767da1e85696917a2893","unresolved":false,"context_lines":[{"line_number":202,"context_line":"def get_standard_attr_resource_model_map(include_resources\u003dTrue,"},{"line_number":203,"context_line":"                                         include_sub_resources\u003dTrue):"},{"line_number":204,"context_line":"    rs_map \u003d {}"},{"line_number":205,"context_line":"    for subclass in HasStandardAttributes.__subclasses__():"},{"line_number":206,"context_line":"        if include_resources:"},{"line_number":207,"context_line":"            for resource in subclass.get_api_collections():"},{"line_number":208,"context_line":"                _resource_model_map_helper(rs_map, resource, subclass)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9f6a8fd7_950c6595","line":205,"range":{"start_line":205,"start_character":4,"end_line":205,"end_character":59},"in_reply_to":"9f6a8fd7_f5a4c1bb","updated":"2018-04-27 09:48:55.000000000","message":"We could, but I really don\u0027t see the point in adding this optimization, given that there is no codepath where we end up calling with False/False.","commit_id":"e14b2f64d7de00310c126db96a868b5c46c96ec1"}],"neutron/extensions/stdattrs_common.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"d9b70a6fd0ed4f5cde83cbda03e5e779ad1e13f9","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2019 Orange."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf659307_2f754164","line":1,"range":{"start_line":1,"start_character":16,"end_line":1,"end_character":20},"updated":"2018-04-13 19:29:53.000000000","message":"Can I borrow your time machine?","commit_id":"64fe6acf78ceb154517237122daa2f74b9eeb8a7"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"b7fb1110000bc632780bdfba261e319c9f212641","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2019 Orange."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f6a8fd7_96cb1d1d","line":1,"range":{"start_line":1,"start_character":16,"end_line":1,"end_character":20},"in_reply_to":"bf659307_2f754164","updated":"2018-04-20 13:29:41.000000000","message":":)\n\nwill fix !","commit_id":"64fe6acf78ceb154517237122daa2f74b9eeb8a7"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"6184cb81341cbbd1baefe7c9c95ff790e00d4a1f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"9f6a8fd7_7f29fae3","updated":"2018-04-20 13:06:10.000000000","message":"Seems a bit out of place for this helper function to be in its own extension file (neutron.extensions pkg), but perhaps that\u0027s just a personal preference.","commit_id":"5f211ca837ab5d57895ecb9424403ea21f5e9279"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"b7fb1110000bc632780bdfba261e319c9f212641","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"9f6a8fd7_5a1c44c0","in_reply_to":"9f6a8fd7_7f29fae3","updated":"2018-04-20 13:29:41.000000000","message":"Well, I didn\u0027t had a better idea.\nMost of the code related to extension stuff resulting from inheriting from the HasStandardAttributes DB model is under neutron/db/standard_attr.py so I could have put this method there.  \n\nBut since the method really is *not* related to DB stuff, and really related to extensions, I felt it wasn\u0027t a good fit. \n\nSince its used by a three extensions, I couldn\u0027t either put it in one of these...\n\nDon\u0027t hesitate to suggest something that you would find better, I don\u0027t mind moving it.","commit_id":"5f211ca837ab5d57895ecb9424403ea21f5e9279"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"6184cb81341cbbd1baefe7c9c95ff790e00d4a1f","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"def stdattrs_extended_resources(attributes):"},{"line_number":22,"context_line":"    r_map \u003d standard_attr.get_standard_attr_resource_model_map("},{"line_number":23,"context_line":"        include_resources\u003dTrue,"},{"line_number":24,"context_line":"        include_sub_resources\u003dFalse)"},{"line_number":25,"context_line":"    sr_map \u003d standard_attr.get_standard_attr_resource_model_map("},{"line_number":26,"context_line":"        include_resources\u003dFalse,"},{"line_number":27,"context_line":"        include_sub_resources\u003dTrue)"},{"line_number":28,"context_line":"    return dict(itertools.chain("},{"line_number":29,"context_line":"        {r: attributes for r in r_map}.items(),"},{"line_number":30,"context_line":"        {sr: {\u0027parameters\u0027: attributes} for sr in sr_map}.items()"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f6a8fd7_5f71960b","line":27,"range":{"start_line":22,"start_character":0,"end_line":27,"end_character":35},"updated":"2018-04-20 13:06:10.000000000","message":"It\u0027s probably obvious, but is there a reason get_standard_attr_resource_model_map() can\u0027t just be called once here with True, True as kwargs?","commit_id":"5f211ca837ab5d57895ecb9424403ea21f5e9279"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"b7fb1110000bc632780bdfba261e319c9f212641","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"def stdattrs_extended_resources(attributes):"},{"line_number":22,"context_line":"    r_map \u003d standard_attr.get_standard_attr_resource_model_map("},{"line_number":23,"context_line":"        include_resources\u003dTrue,"},{"line_number":24,"context_line":"        include_sub_resources\u003dFalse)"},{"line_number":25,"context_line":"    sr_map \u003d standard_attr.get_standard_attr_resource_model_map("},{"line_number":26,"context_line":"        include_resources\u003dFalse,"},{"line_number":27,"context_line":"        include_sub_resources\u003dTrue)"},{"line_number":28,"context_line":"    return dict(itertools.chain("},{"line_number":29,"context_line":"        {r: attributes for r in r_map}.items(),"},{"line_number":30,"context_line":"        {sr: {\u0027parameters\u0027: attributes} for sr in sr_map}.items()"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f6a8fd7_bab3200a","line":27,"range":{"start_line":22,"start_character":0,"end_line":27,"end_character":35},"in_reply_to":"9f6a8fd7_5f71960b","updated":"2018-04-20 13:29:41.000000000","message":"This method needs to return a differently shaped dict for resources and sub-resources (line 29 and 30).\n\n(this is the core motivation driving this change in fact)","commit_id":"5f211ca837ab5d57895ecb9424403ea21f5e9279"},{"author":{"_account_id":25618,"name":"Paweł Suder","email":"pawel@suder.info","username":"SuderPawel"},"change_message_id":"3dab00989d2464abc4a520eaf340252d6fd5fa6d","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"def stdattrs_extended_resources(attributes):"},{"line_number":22,"context_line":"    r_map \u003d standard_attr.get_standard_attr_resource_model_map("},{"line_number":23,"context_line":"        include_resources\u003dTrue,"},{"line_number":24,"context_line":"        include_sub_resources\u003dFalse)"},{"line_number":25,"context_line":"    sr_map \u003d standard_attr.get_standard_attr_resource_model_map("}],"source_content_type":"text/x-python","patch_set":4,"id":"9f6a8fd7_6bd8d27e","line":22,"range":{"start_line":22,"start_character":26,"end_line":22,"end_character":62},"updated":"2018-04-27 11:16:10.000000000","message":"First usage","commit_id":"e14b2f64d7de00310c126db96a868b5c46c96ec1"},{"author":{"_account_id":25618,"name":"Paweł Suder","email":"pawel@suder.info","username":"SuderPawel"},"change_message_id":"3dab00989d2464abc4a520eaf340252d6fd5fa6d","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    r_map \u003d standard_attr.get_standard_attr_resource_model_map("},{"line_number":23,"context_line":"        include_resources\u003dTrue,"},{"line_number":24,"context_line":"        include_sub_resources\u003dFalse)"},{"line_number":25,"context_line":"    sr_map \u003d standard_attr.get_standard_attr_resource_model_map("},{"line_number":26,"context_line":"        include_resources\u003dFalse,"},{"line_number":27,"context_line":"        include_sub_resources\u003dTrue)"},{"line_number":28,"context_line":"    return dict(itertools.chain("}],"source_content_type":"text/x-python","patch_set":4,"id":"9f6a8fd7_0be59638","line":25,"range":{"start_line":25,"start_character":27,"end_line":25,"end_character":63},"updated":"2018-04-27 11:16:10.000000000","message":"Second usage","commit_id":"e14b2f64d7de00310c126db96a868b5c46c96ec1"}]}
