)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"9085caa8362be7ebe602c66150a2ac7505667139","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Rodolfo Alonso Hernandez \u003cralonsoh@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2019-10-29 17:02:13 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[WIP] Do not inherit from built-in \"dict\""},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Closes-Bug: #1849980"},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3fa7e38b_6efe1c06","line":7,"range":{"start_line":7,"start_character":6,"end_line":7,"end_character":41},"updated":"2019-10-29 17:18:53.000000000","message":"Interesting changes.\n\nEven if you\u0027re still in WIP I give some feedbacks.\n\nI suppose you plan to update the commit message to reflect the issue described in the given LP below.\n\nIt can be useful for other developers to give the root cause of these changes through a simple `git log`","commit_id":"3b1274ca77fa353867f75db5b5bc34aa2c336304"}],"neutron/agent/linux/dhcp.py":[{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"7fe0282f5a2fff3b96f49e7b617c59fdaf9786bc","unresolved":false,"context_lines":[{"line_number":64,"context_line":"DHCP_OPT_CLIENT_ID_NUM \u003d 61"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class DictModel(collections.abc.Mapping):"},{"line_number":68,"context_line":"    \"\"\"Convert dict into an object that provides attribute access to values.\"\"\""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    __slots__ \u003d [\u0027_dictmodel_internal_storage\u0027]"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_57f00592","line":67,"range":{"start_line":67,"start_character":32,"end_line":67,"end_character":39},"updated":"2019-11-11 11:38:44.000000000","message":"More a question: shouldn\u0027t it be MutableMapping?","commit_id":"2808af09535af32072ae6cd45d5dfa0774e1a2b0"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"6ca986748958c6aaf20973c53d4c03e59aa4f85c","unresolved":false,"context_lines":[{"line_number":64,"context_line":"DHCP_OPT_CLIENT_ID_NUM \u003d 61"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class DictModel(collections.abc.Mapping):"},{"line_number":68,"context_line":"    \"\"\"Convert dict into an object that provides attribute access to values.\"\"\""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    __slots__ \u003d [\u0027_dictmodel_internal_storage\u0027]"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_99bc52dc","line":67,"range":{"start_line":67,"start_character":32,"end_line":67,"end_character":39},"in_reply_to":"3fa7e38b_57f00592","updated":"2019-11-13 17:18:08.000000000","message":"You are right: this is a dict and we could need the mutable methods that MutableMapping inherits.","commit_id":"2808af09535af32072ae6cd45d5dfa0774e1a2b0"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"3e43f60fbdb38ccfde6055a6504ac24c5b42b2ce","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                 self._dictmodel_internal_storage.items()]"},{"line_number":121,"context_line":"        return \u0027, \u0027.join(sorted(pairs))"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def __getitem__(self, name):"},{"line_number":124,"context_line":"        return self._dictmodel_internal_storage[name]"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def __setitem__(self, name, value):"},{"line_number":127,"context_line":"        self._dictmodel_internal_storage[name] \u003d value"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    def __iter__(self):"},{"line_number":130,"context_line":"        return iter(self._dictmodel_internal_storage)"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    def __len__(self):"},{"line_number":133,"context_line":"        return len(self._dictmodel_internal_storage)"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    def __copy__(self):"},{"line_number":136,"context_line":"        return type(self)(self)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def __deepcopy__(self, memo):"},{"line_number":139,"context_line":"        # result \u003d type(self)(self)"},{"line_number":140,"context_line":"        # memo[id(self)] \u003d result"},{"line_number":141,"context_line":"        # return result"},{"line_number":142,"context_line":"        cls \u003d self.__class__"},{"line_number":143,"context_line":"        result \u003d cls.__new__(cls)"},{"line_number":144,"context_line":"        memo[id(self)] \u003d result"},{"line_number":145,"context_line":"        result._dictmodel_internal_storage \u003d copy.deepcopy("},{"line_number":146,"context_line":"            self._dictmodel_internal_storage)"},{"line_number":147,"context_line":"        return result"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"class NetModel(DictModel):"}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_8dc3a28a","line":147,"range":{"start_line":123,"start_character":0,"end_line":147,"end_character":21},"updated":"2019-11-14 10:08:00.000000000","message":"based on https://docs.python.org/3/library/collections.abc.html You must have __getitem__, __setitem__, __delitem__, __iter__, __len__, and based on my trial __getattr__ (perhaps __setattr__ as well) is something that is not needed (I got AttributeError: \u0027super\u0027 object has no attribute \u0027__getattr__ at least in unit tests)","commit_id":"7bd3b8169b106d5e83e68d81793ec8625c228786"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"89ebbab65023a7ccffc56a5933acea64fbee825e","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                 self._dictmodel_internal_storage.items()]"},{"line_number":121,"context_line":"        return \u0027, \u0027.join(sorted(pairs))"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def __getitem__(self, name):"},{"line_number":124,"context_line":"        return self._dictmodel_internal_storage[name]"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def __setitem__(self, name, value):"},{"line_number":127,"context_line":"        self._dictmodel_internal_storage[name] \u003d value"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    def __iter__(self):"},{"line_number":130,"context_line":"        return iter(self._dictmodel_internal_storage)"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    def __len__(self):"},{"line_number":133,"context_line":"        return len(self._dictmodel_internal_storage)"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    def __copy__(self):"},{"line_number":136,"context_line":"        return type(self)(self)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def __deepcopy__(self, memo):"},{"line_number":139,"context_line":"        # result \u003d type(self)(self)"},{"line_number":140,"context_line":"        # memo[id(self)] \u003d result"},{"line_number":141,"context_line":"        # return result"},{"line_number":142,"context_line":"        cls \u003d self.__class__"},{"line_number":143,"context_line":"        result \u003d cls.__new__(cls)"},{"line_number":144,"context_line":"        memo[id(self)] \u003d result"},{"line_number":145,"context_line":"        result._dictmodel_internal_storage \u003d copy.deepcopy("},{"line_number":146,"context_line":"            self._dictmodel_internal_storage)"},{"line_number":147,"context_line":"        return result"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"class NetModel(DictModel):"}],"source_content_type":"text/x-python","patch_set":8,"id":"3fa7e38b_90ac15ef","line":147,"range":{"start_line":123,"start_character":0,"end_line":147,"end_character":21},"in_reply_to":"3fa7e38b_8dc3a28a","updated":"2019-11-14 11:03:35.000000000","message":"The one I\u0027m missing is delitem.","commit_id":"7bd3b8169b106d5e83e68d81793ec8625c228786"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f27bebc4d1f358081b0c796aeca3eea503459b13","unresolved":false,"context_lines":[{"line_number":49,"context_line":"else:"},{"line_number":50,"context_line":"    # NOTE(ralonsoh): still needed in neutron-grenade jobs, to be removed soon."},{"line_number":51,"context_line":"    import UserDict"},{"line_number":52,"context_line":"    _UserDict \u003d UserDict.DictMixin"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_f23a9fca","line":52,"updated":"2019-11-25 21:54:36.000000000","message":"I think we already removed py2 neutron-grenade job so maybe we don\u0027t need it anymore?","commit_id":"697bb301fb22400e2931d5d418041e5864893064"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"ac0d08e74130e7e0875a4645ee4edbeb00cdbc1b","unresolved":false,"context_lines":[{"line_number":49,"context_line":"else:"},{"line_number":50,"context_line":"    # NOTE(ralonsoh): still needed in neutron-grenade jobs, to be removed soon."},{"line_number":51,"context_line":"    import UserDict"},{"line_number":52,"context_line":"    _UserDict \u003d UserDict.DictMixin"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_19fbd77b","line":52,"in_reply_to":"3fa7e38b_f23a9fca","updated":"2019-11-26 15:56:39.000000000","message":"Yes, I\u0027ll remove this. I still had problems with py2 in dhcp agents.","commit_id":"697bb301fb22400e2931d5d418041e5864893064"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f27bebc4d1f358081b0c796aeca3eea503459b13","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        return type(self)(self)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def __deepcopy__(self, memo):"},{"line_number":152,"context_line":"        # result \u003d type(self)(self)"},{"line_number":153,"context_line":"        # memo[id(self)] \u003d result"},{"line_number":154,"context_line":"        # return result"},{"line_number":155,"context_line":"        cls \u003d self.__class__"},{"line_number":156,"context_line":"        result \u003d cls.__new__(cls)"},{"line_number":157,"context_line":"        memo[id(self)] \u003d result"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_924fab68","line":154,"range":{"start_line":152,"start_character":8,"end_line":154,"end_character":23},"updated":"2019-11-25 21:54:36.000000000","message":"is this comment needed?","commit_id":"697bb301fb22400e2931d5d418041e5864893064"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"ac0d08e74130e7e0875a4645ee4edbeb00cdbc1b","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        return type(self)(self)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def __deepcopy__(self, memo):"},{"line_number":152,"context_line":"        # result \u003d type(self)(self)"},{"line_number":153,"context_line":"        # memo[id(self)] \u003d result"},{"line_number":154,"context_line":"        # return result"},{"line_number":155,"context_line":"        cls \u003d self.__class__"},{"line_number":156,"context_line":"        result \u003d cls.__new__(cls)"},{"line_number":157,"context_line":"        memo[id(self)] \u003d result"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_99d587e9","line":154,"range":{"start_line":152,"start_character":8,"end_line":154,"end_character":23},"in_reply_to":"3fa7e38b_924fab68","updated":"2019-11-26 15:56:39.000000000","message":"Ups!","commit_id":"697bb301fb22400e2931d5d418041e5864893064"}]}
