)]}'
{"lower-constraints.txt":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"91300696a956d35862408776c0bf61106b37ed2f","unresolved":false,"context_lines":[{"line_number":80,"context_line":"rfc3986\u003d\u003d0.3.1"},{"line_number":81,"context_line":"Routes\u003d\u003d2.3.1"},{"line_number":82,"context_line":"setproctitle\u003d\u003d1.1.10"},{"line_number":83,"context_line":"six\u003d\u003d1.10.0"},{"line_number":84,"context_line":"snowballstemmer\u003d\u003d1.2.1"},{"line_number":85,"context_line":"Sphinx\u003d\u003d1.6.2"},{"line_number":86,"context_line":"sphinxcontrib-websupport\u003d\u003d1.0.1"}],"source_content_type":"text/plain","patch_set":1,"id":"3fa7e38b_f76d43cb","side":"PARENT","line":83,"updated":"2020-01-18 17:15:11.000000000","message":"we cannot drop six from lower-constraints.txt now as at least oslo.utils still uses six.","commit_id":"1d9d6d7bf5095efe96191741a93f37446ca4d1a4"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"ce2884d5e75bcb2a160de9bc0b965834fb35e301","unresolved":false,"context_lines":[{"line_number":80,"context_line":"rfc3986\u003d\u003d0.3.1"},{"line_number":81,"context_line":"Routes\u003d\u003d2.3.1"},{"line_number":82,"context_line":"setproctitle\u003d\u003d1.1.10"},{"line_number":83,"context_line":"six\u003d\u003d1.10.0"},{"line_number":84,"context_line":"snowballstemmer\u003d\u003d1.2.1"},{"line_number":85,"context_line":"Sphinx\u003d\u003d1.6.2"},{"line_number":86,"context_line":"sphinxcontrib-websupport\u003d\u003d1.0.1"}],"source_content_type":"text/plain","patch_set":1,"id":"3fa7e38b_a1d545ba","side":"PARENT","line":83,"in_reply_to":"3fa7e38b_97cbaf49","updated":"2020-01-20 07:34:52.000000000","message":"n my understanding, we need to cover nested dependencies in our lower-constraints.txt. lower-constraints cannot be inherited. If we don\u0027t cover nested libraries (six from oslo.utils in this case) in our l-c, the latest release of a library. This potentially causes a breakage by a change in a nested library or using a latest nested library (which usually happens after stable branches are cut). \nIf you need a wide consensus, I can send a mail to openstack-discuss.","commit_id":"1d9d6d7bf5095efe96191741a93f37446ca4d1a4"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"4b4942c945a1e205987f9abc31b77281e460c875","unresolved":false,"context_lines":[{"line_number":80,"context_line":"rfc3986\u003d\u003d0.3.1"},{"line_number":81,"context_line":"Routes\u003d\u003d2.3.1"},{"line_number":82,"context_line":"setproctitle\u003d\u003d1.1.10"},{"line_number":83,"context_line":"six\u003d\u003d1.10.0"},{"line_number":84,"context_line":"snowballstemmer\u003d\u003d1.2.1"},{"line_number":85,"context_line":"Sphinx\u003d\u003d1.6.2"},{"line_number":86,"context_line":"sphinxcontrib-websupport\u003d\u003d1.0.1"}],"source_content_type":"text/plain","patch_set":1,"id":"3fa7e38b_fc0c42ec","side":"PARENT","line":83,"in_reply_to":"3fa7e38b_a1d545ba","updated":"2020-01-20 08:37:37.000000000","message":"Of course you can send a mail and thanks for this.\n\nBut as I commented, if we need to limit a lower version we should limit the directly imported library version; in this case, oslo.utils.\n\nBTW, lower oslo.utils version (3.30.0), limits six to \u003e\u003d1.10.0.","commit_id":"1d9d6d7bf5095efe96191741a93f37446ca4d1a4"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e24324c05fbb53c0ae1fdcf63f3ded344216f554","unresolved":false,"context_lines":[{"line_number":80,"context_line":"rfc3986\u003d\u003d0.3.1"},{"line_number":81,"context_line":"Routes\u003d\u003d2.3.1"},{"line_number":82,"context_line":"setproctitle\u003d\u003d1.1.10"},{"line_number":83,"context_line":"six\u003d\u003d1.10.0"},{"line_number":84,"context_line":"snowballstemmer\u003d\u003d1.2.1"},{"line_number":85,"context_line":"Sphinx\u003d\u003d1.6.2"},{"line_number":86,"context_line":"sphinxcontrib-websupport\u003d\u003d1.0.1"}],"source_content_type":"text/plain","patch_set":1,"id":"3fa7e38b_97cbaf49","side":"PARENT","line":83,"in_reply_to":"3fa7e38b_f76d43cb","updated":"2020-01-18 19:39:44.000000000","message":"But any library should take care of its own imports. In this case, oslo.utils requires at least 1.10.0 [1].\n\nIf this project is not using a library, it can\u0027t enforce the version of a nested one (there could be some exceptions).\n\n[1] https://github.com/openstack/oslo.utils/blob/master/lower-constraints.txt#L38","commit_id":"1d9d6d7bf5095efe96191741a93f37446ca4d1a4"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"b4e45942b0ee68f977c3ce5ca872278ebb8b2dc3","unresolved":false,"context_lines":[{"line_number":80,"context_line":"rfc3986\u003d\u003d0.3.1"},{"line_number":81,"context_line":"Routes\u003d\u003d2.3.1"},{"line_number":82,"context_line":"setproctitle\u003d\u003d1.1.10"},{"line_number":83,"context_line":"six\u003d\u003d1.10.0"},{"line_number":84,"context_line":"snowballstemmer\u003d\u003d1.2.1"},{"line_number":85,"context_line":"Sphinx\u003d\u003d1.6.2"},{"line_number":86,"context_line":"sphinxcontrib-websupport\u003d\u003d1.0.1"}],"source_content_type":"text/plain","patch_set":1,"id":"3fa7e38b_05cea28e","side":"PARENT","line":83,"in_reply_to":"3fa7e38b_fc0c42ec","updated":"2020-01-20 10:51:57.000000000","message":"Okay, I will send a mail to the mailing to confirm what is the right solution. It looks like we have opposite opinons on what libraries should be covered in lower-constraints.txt. I believe we need to cover six in l-c at the current situation, so I just +1 to this patch. Feel free to +2/W if other reviewers believe it should be dropped from l-c.","commit_id":"1d9d6d7bf5095efe96191741a93f37446ca4d1a4"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"1cffcfda2fc3a6f21784ce2e19710b91734f02ae","unresolved":false,"context_lines":[{"line_number":80,"context_line":"rfc3986\u003d\u003d0.3.1"},{"line_number":81,"context_line":"Routes\u003d\u003d2.3.1"},{"line_number":82,"context_line":"setproctitle\u003d\u003d1.1.10"},{"line_number":83,"context_line":"six\u003d\u003d1.10.0"},{"line_number":84,"context_line":"snowballstemmer\u003d\u003d1.2.1"},{"line_number":85,"context_line":"Sphinx\u003d\u003d1.6.2"},{"line_number":86,"context_line":"sphinxcontrib-websupport\u003d\u003d1.0.1"}],"source_content_type":"text/plain","patch_set":2,"id":"3fa7e38b_0c99e6cd","side":"PARENT","line":83,"updated":"2020-01-20 18:01:43.000000000","message":"technically you don\u0027t need to do this, just updating requirements.txt - there\u0027s a lot of libraries here neutron-lib doesn\u0027t use","commit_id":"1d9d6d7bf5095efe96191741a93f37446ca4d1a4"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"35b4099d115ebc269a239b4c6fe34e2a46e738ed","unresolved":false,"context_lines":[{"line_number":80,"context_line":"rfc3986\u003d\u003d0.3.1"},{"line_number":81,"context_line":"Routes\u003d\u003d2.3.1"},{"line_number":82,"context_line":"setproctitle\u003d\u003d1.1.10"},{"line_number":83,"context_line":"six\u003d\u003d1.10.0"},{"line_number":84,"context_line":"snowballstemmer\u003d\u003d1.2.1"},{"line_number":85,"context_line":"Sphinx\u003d\u003d1.6.2"},{"line_number":86,"context_line":"sphinxcontrib-websupport\u003d\u003d1.0.1"}],"source_content_type":"text/plain","patch_set":2,"id":"3fa7e38b_86ffd101","side":"PARENT","line":83,"in_reply_to":"3fa7e38b_0c99e6cd","updated":"2020-01-22 13:15:09.000000000","message":"Yes, but because we are not using this library anymore, there is no reason to set a limit in this project for a library not needed/used.","commit_id":"1d9d6d7bf5095efe96191741a93f37446ca4d1a4"}],"neutron_lib/api/validators/__init__.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"1cffcfda2fc3a6f21784ce2e19710b91734f02ae","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from oslo_utils import netutils"},{"line_number":23,"context_line":"from oslo_utils import strutils"},{"line_number":24,"context_line":"from oslo_utils import uuidutils"},{"line_number":25,"context_line":"import six"},{"line_number":26,"context_line":"from webob import exc"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"from neutron_lib._i18n import _"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_ec7eca6b","line":25,"updated":"2020-01-20 18:01:43.000000000","message":"This can/should be removed","commit_id":"865b26d6ba9e42ac9f81c2ac2cade62919dec0a2"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"35b4099d115ebc269a239b4c6fe34e2a46e738ed","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from oslo_utils import netutils"},{"line_number":23,"context_line":"from oslo_utils import strutils"},{"line_number":24,"context_line":"from oslo_utils import uuidutils"},{"line_number":25,"context_line":"import six"},{"line_number":26,"context_line":"from webob import exc"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"from neutron_lib._i18n import _"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_e61d6577","line":25,"in_reply_to":"3fa7e38b_ec7eca6b","updated":"2020-01-22 13:15:09.000000000","message":"Done","commit_id":"865b26d6ba9e42ac9f81c2ac2cade62919dec0a2"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"bb1feba8b21a9a3fcaa3b2ea22a4b23e38ba9a05","unresolved":false,"context_lines":[{"line_number":228,"context_line":"        the given max_len. Otherwise a human readable message indicating why"},{"line_number":229,"context_line":"        the data is invalid."},{"line_number":230,"context_line":"    \"\"\""},{"line_number":231,"context_line":"    if not isinstance(data, six.string_types):"},{"line_number":232,"context_line":"        msg \u003d _(\"\u0027%s\u0027 is not a valid string\") % data"},{"line_number":233,"context_line":"        LOG.debug(msg)"},{"line_number":234,"context_line":"        return msg"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_8864e9e7","line":231,"range":{"start_line":231,"start_character":28,"end_line":231,"end_character":44},"updated":"2020-01-20 11:35:43.000000000","message":"this can be removed as well","commit_id":"865b26d6ba9e42ac9f81c2ac2cade62919dec0a2"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"35b4099d115ebc269a239b4c6fe34e2a46e738ed","unresolved":false,"context_lines":[{"line_number":228,"context_line":"        the given max_len. Otherwise a human readable message indicating why"},{"line_number":229,"context_line":"        the data is invalid."},{"line_number":230,"context_line":"    \"\"\""},{"line_number":231,"context_line":"    if not isinstance(data, six.string_types):"},{"line_number":232,"context_line":"        msg \u003d _(\"\u0027%s\u0027 is not a valid string\") % data"},{"line_number":233,"context_line":"        LOG.debug(msg)"},{"line_number":234,"context_line":"        return msg"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_a623edba","line":231,"range":{"start_line":231,"start_character":28,"end_line":231,"end_character":44},"in_reply_to":"3fa7e38b_8864e9e7","updated":"2020-01-22 13:15:09.000000000","message":"Done","commit_id":"865b26d6ba9e42ac9f81c2ac2cade62919dec0a2"}],"neutron_lib/fixture.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"91300696a956d35862408776c0bf61106b37ed2f","unresolved":false,"context_lines":[{"line_number":384,"context_line":"                return self.mock_open(name, *args, **kwargs)"},{"line_number":385,"context_line":"            return self._orig_open(name, *args, **kwargs)"},{"line_number":386,"context_line":""},{"line_number":387,"context_line":"        self._patch \u003d mock.patch(\u0027__builtin__.open\u0027, new\u003dreplacement_open)"},{"line_number":388,"context_line":"        self._patch.start()"},{"line_number":389,"context_line":"        self.addCleanup(self._patch.stop)"},{"line_number":390,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_d79fe7b0","line":387,"range":{"start_line":387,"start_character":34,"end_line":387,"end_character":45},"updated":"2020-01-18 17:15:11.000000000","message":"six.moves.builtins is an alias of \u0027builtins\u0027 in python3.\n\nhttps://six.readthedocs.io/#module-six.moves","commit_id":"1074e67ea55980b8a6265b714f2fb518d0df7bae"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e24324c05fbb53c0ae1fdcf63f3ded344216f554","unresolved":false,"context_lines":[{"line_number":384,"context_line":"                return self.mock_open(name, *args, **kwargs)"},{"line_number":385,"context_line":"            return self._orig_open(name, *args, **kwargs)"},{"line_number":386,"context_line":""},{"line_number":387,"context_line":"        self._patch \u003d mock.patch(\u0027__builtin__.open\u0027, new\u003dreplacement_open)"},{"line_number":388,"context_line":"        self._patch.start()"},{"line_number":389,"context_line":"        self.addCleanup(self._patch.stop)"},{"line_number":390,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_b7c6eb40","line":387,"range":{"start_line":387,"start_character":34,"end_line":387,"end_character":45},"in_reply_to":"3fa7e38b_d79fe7b0","updated":"2020-01-18 19:39:44.000000000","message":"I read this exact doc and I took the incorrect one...","commit_id":"1074e67ea55980b8a6265b714f2fb518d0df7bae"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"f32138acad680e93f2ab4721bcca1bdb22c273f6","unresolved":false,"context_lines":[{"line_number":384,"context_line":"                return self.mock_open(name, *args, **kwargs)"},{"line_number":385,"context_line":"            return self._orig_open(name, *args, **kwargs)"},{"line_number":386,"context_line":""},{"line_number":387,"context_line":"        self._patch \u003d mock.patch(\u0027builtin.open\u0027, new\u003dreplacement_open)"},{"line_number":388,"context_line":"        self._patch.start()"},{"line_number":389,"context_line":"        self.addCleanup(self._patch.stop)"},{"line_number":390,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_e20ed18d","line":387,"range":{"start_line":387,"start_character":34,"end_line":387,"end_character":41},"updated":"2020-01-20 20:31:12.000000000","message":"s/builtins, right?  At least that\u0027s what my Octavia change was.","commit_id":"865b26d6ba9e42ac9f81c2ac2cade62919dec0a2"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"35b4099d115ebc269a239b4c6fe34e2a46e738ed","unresolved":false,"context_lines":[{"line_number":384,"context_line":"                return self.mock_open(name, *args, **kwargs)"},{"line_number":385,"context_line":"            return self._orig_open(name, *args, **kwargs)"},{"line_number":386,"context_line":""},{"line_number":387,"context_line":"        self._patch \u003d mock.patch(\u0027builtin.open\u0027, new\u003dreplacement_open)"},{"line_number":388,"context_line":"        self._patch.start()"},{"line_number":389,"context_line":"        self.addCleanup(self._patch.stop)"},{"line_number":390,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_61007f01","line":387,"range":{"start_line":387,"start_character":34,"end_line":387,"end_character":41},"in_reply_to":"3fa7e38b_949cf4be","updated":"2020-01-22 13:15:09.000000000","message":"This is the second time I need to change this. I need to pay much more attention when coding.\n\nThanks!","commit_id":"865b26d6ba9e42ac9f81c2ac2cade62919dec0a2"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"5f60aefc2127133572be2f218d92002399d941fd","unresolved":false,"context_lines":[{"line_number":384,"context_line":"                return self.mock_open(name, *args, **kwargs)"},{"line_number":385,"context_line":"            return self._orig_open(name, *args, **kwargs)"},{"line_number":386,"context_line":""},{"line_number":387,"context_line":"        self._patch \u003d mock.patch(\u0027builtin.open\u0027, new\u003dreplacement_open)"},{"line_number":388,"context_line":"        self._patch.start()"},{"line_number":389,"context_line":"        self.addCleanup(self._patch.stop)"},{"line_number":390,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_949cf4be","line":387,"range":{"start_line":387,"start_character":34,"end_line":387,"end_character":41},"in_reply_to":"3fa7e38b_e20ed18d","updated":"2020-01-21 05:44:53.000000000","message":"Good catch. \"builtins\" is the right one.","commit_id":"865b26d6ba9e42ac9f81c2ac2cade62919dec0a2"}],"neutron_lib/hacking/checks.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"91300696a956d35862408776c0bf61106b37ed2f","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        message describe the check validation failure."},{"line_number":133,"context_line":"    \"\"\""},{"line_number":134,"context_line":"    if re.search(r\"\\bxrange\\s*\\(\", logical_line):"},{"line_number":135,"context_line":"        yield(0, \"N525: Do not use xrange. Use range for large loops.\")"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"def check_no_basestring(logical_line):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_f7a223fb","line":135,"range":{"start_line":135,"start_character":53,"end_line":135,"end_character":68},"updated":"2020-01-18 17:15:11.000000000","message":"I think this check is no longer needed as xrange does not exist in python3.","commit_id":"1074e67ea55980b8a6265b714f2fb518d0df7bae"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e24324c05fbb53c0ae1fdcf63f3ded344216f554","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        message describe the check validation failure."},{"line_number":133,"context_line":"    \"\"\""},{"line_number":134,"context_line":"    if re.search(r\"\\bxrange\\s*\\(\", logical_line):"},{"line_number":135,"context_line":"        yield(0, \"N525: Do not use xrange. Use range for large loops.\")"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"def check_no_basestring(logical_line):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_77d073f5","line":135,"range":{"start_line":135,"start_character":53,"end_line":135,"end_character":68},"in_reply_to":"3fa7e38b_f7a223fb","updated":"2020-01-18 19:39:44.000000000","message":"You are right: xrange does not exist. This test is not needed anymore.","commit_id":"1074e67ea55980b8a6265b714f2fb518d0df7bae"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"bb1feba8b21a9a3fcaa3b2ea22a4b23e38ba9a05","unresolved":false,"context_lines":[{"line_number":133,"context_line":"    \"\"\""},{"line_number":134,"context_line":"    if re.search(r\"\\bbasestring\\b\", logical_line):"},{"line_number":135,"context_line":"        msg \u003d (\"N526: basestring is not Python3-compatible, use \""},{"line_number":136,"context_line":"               \"six.string_types instead.\")"},{"line_number":137,"context_line":"        yield(0, msg)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_e8547dff","line":136,"range":{"start_line":136,"start_character":16,"end_line":136,"end_character":40},"updated":"2020-01-20 11:35:43.000000000","message":"nit: Based on this:\nhttps://docs.python.org/3/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit\n\nThis text should be \"..., use str instead.\"","commit_id":"865b26d6ba9e42ac9f81c2ac2cade62919dec0a2"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"35b4099d115ebc269a239b4c6fe34e2a46e738ed","unresolved":false,"context_lines":[{"line_number":133,"context_line":"    \"\"\""},{"line_number":134,"context_line":"    if re.search(r\"\\bbasestring\\b\", logical_line):"},{"line_number":135,"context_line":"        msg \u003d (\"N526: basestring is not Python3-compatible, use \""},{"line_number":136,"context_line":"               \"six.string_types instead.\")"},{"line_number":137,"context_line":"        yield(0, msg)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_c6094932","line":136,"range":{"start_line":136,"start_character":16,"end_line":136,"end_character":40},"in_reply_to":"3fa7e38b_3a62c9a8","updated":"2020-01-22 13:15:09.000000000","message":"Indeed, this tests is not needed anymore.","commit_id":"865b26d6ba9e42ac9f81c2ac2cade62919dec0a2"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"2013ccedb232c6947520a8081597bd4074bed984","unresolved":false,"context_lines":[{"line_number":133,"context_line":"    \"\"\""},{"line_number":134,"context_line":"    if re.search(r\"\\bbasestring\\b\", logical_line):"},{"line_number":135,"context_line":"        msg \u003d (\"N526: basestring is not Python3-compatible, use \""},{"line_number":136,"context_line":"               \"six.string_types instead.\")"},{"line_number":137,"context_line":"        yield(0, msg)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_3a62c9a8","line":136,"range":{"start_line":136,"start_character":16,"end_line":136,"end_character":40},"in_reply_to":"3fa7e38b_5493dca4","updated":"2020-01-21 08:59:16.000000000","message":"perhaps that\u0027s the cleanest solution.","commit_id":"865b26d6ba9e42ac9f81c2ac2cade62919dec0a2"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"5f60aefc2127133572be2f218d92002399d941fd","unresolved":false,"context_lines":[{"line_number":133,"context_line":"    \"\"\""},{"line_number":134,"context_line":"    if re.search(r\"\\bbasestring\\b\", logical_line):"},{"line_number":135,"context_line":"        msg \u003d (\"N526: basestring is not Python3-compatible, use \""},{"line_number":136,"context_line":"               \"six.string_types instead.\")"},{"line_number":137,"context_line":"        yield(0, msg)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_5493dca4","line":136,"range":{"start_line":136,"start_character":16,"end_line":136,"end_character":40},"in_reply_to":"3fa7e38b_e8547dff","updated":"2020-01-21 05:44:53.000000000","message":"Can\u0027t we drop this test too? We can now assume python3 and basestring does not exist in python3, so it would be an error without this check.","commit_id":"865b26d6ba9e42ac9f81c2ac2cade62919dec0a2"}],"neutron_lib/placement/client.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"91300696a956d35862408776c0bf61106b37ed2f","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import functools"},{"line_number":17,"context_line":"import re"},{"line_number":18,"context_line":"import time"},{"line_number":19,"context_line":"from urllib.parse import urlencode"},{"line_number":20,"context_line":"import uuid"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import requests"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_97a96fdf","line":19,"updated":"2020-01-18 17:15:11.000000000","message":"we usually use a module-level import.\n\n from urllib import parse","commit_id":"1074e67ea55980b8a6265b714f2fb518d0df7bae"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e24324c05fbb53c0ae1fdcf63f3ded344216f554","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import functools"},{"line_number":17,"context_line":"import re"},{"line_number":18,"context_line":"import time"},{"line_number":19,"context_line":"from urllib.parse import urlencode"},{"line_number":20,"context_line":"import uuid"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import requests"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_d7fa8775","line":19,"in_reply_to":"3fa7e38b_97a96fdf","updated":"2020-01-18 19:39:44.000000000","message":"Yes, I did a 1-to-1 conversion. But as you said, we usually import the whole module, not single functions or classes.","commit_id":"1074e67ea55980b8a6265b714f2fb518d0df7bae"}],"neutron_lib/tests/unit/hacking/test_checks.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"91300696a956d35862408776c0bf61106b37ed2f","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        self.assertLinePasses(f, \u0027# with contextlib.nested():\u0027, \u0027\u0027)"},{"line_number":88,"context_line":"        self.assertLinePasses(f, \u0027print(\"with contextlib.nested():\")\u0027, \u0027\u0027)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def test_check_python3_xrange(self):"},{"line_number":91,"context_line":"        f \u003d checks.check_python3_xrange"},{"line_number":92,"context_line":"        self.assertLineFails(f, \u0027a \u003d xrange(1000)\u0027)"},{"line_number":93,"context_line":"        self.assertLineFails(f, \u0027b \u003dxrange   (   42 )\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_57b3f74e","line":90,"updated":"2020-01-18 17:15:11.000000000","message":"As I commented in the hacking check, xrange no longer exists, so this test can be dropped.","commit_id":"1074e67ea55980b8a6265b714f2fb518d0df7bae"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e24324c05fbb53c0ae1fdcf63f3ded344216f554","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        self.assertLinePasses(f, \u0027# with contextlib.nested():\u0027, \u0027\u0027)"},{"line_number":88,"context_line":"        self.assertLinePasses(f, \u0027print(\"with contextlib.nested():\")\u0027, \u0027\u0027)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def test_check_python3_xrange(self):"},{"line_number":91,"context_line":"        f \u003d checks.check_python3_xrange"},{"line_number":92,"context_line":"        self.assertLineFails(f, \u0027a \u003d xrange(1000)\u0027)"},{"line_number":93,"context_line":"        self.assertLineFails(f, \u0027b \u003dxrange   (   42 )\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_37043b7d","line":90,"in_reply_to":"3fa7e38b_57b3f74e","updated":"2020-01-18 19:39:44.000000000","message":"Done","commit_id":"1074e67ea55980b8a6265b714f2fb518d0df7bae"}]}
