)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"b186ca81f736993a0f39bae6d14e55659a41a6ba","unresolved":false,"context_lines":[{"line_number":13,"context_line":"See the oslo i18n guideline."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"* http://docs.openstack.org/developer/oslo.i18n/guidelines.html"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: I901dcbfbd53d5d19db651473d2891bc8e8a59710"},{"line_number":18,"context_line":"Related-Bug: #1596829"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"bacf61ea_9abf1ccf","line":16,"updated":"2016-08-02 11:53:21.000000000","message":"This hacking is already implemented in Neutron so it\u0027s possible that we remove the duplicate code from Neutron later. Could you add the description?","commit_id":"5e033d232270cb3babfa526add1bbdbfe827804b"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"2491f748e8e0854a71976bd8caaf9f0bc9bcb00a","unresolved":false,"context_lines":[{"line_number":13,"context_line":"See the oslo i18n guideline."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"* http://docs.openstack.org/developer/oslo.i18n/guidelines.html"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: I901dcbfbd53d5d19db651473d2891bc8e8a59710"},{"line_number":18,"context_line":"Related-Bug: #1596829"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"bacf61ea_d3531a6b","line":16,"in_reply_to":"bacf61ea_13be52ff","updated":"2016-08-03 00:41:26.000000000","message":"\u003e The same can be said of other checks.\n\nExactly. So Gary put the description into his migration patch[1].\n\n[1]: https://github.com/openstack/neutron-lib/commit/b82347d5354e06d2497af66c8034db249bcdba47","commit_id":"5e033d232270cb3babfa526add1bbdbfe827804b"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"c006b5af6c87edf096bb3d1994d2ee0e0bc87525","unresolved":false,"context_lines":[{"line_number":13,"context_line":"See the oslo i18n guideline."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"* http://docs.openstack.org/developer/oslo.i18n/guidelines.html"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: I901dcbfbd53d5d19db651473d2891bc8e8a59710"},{"line_number":18,"context_line":"Related-Bug: #1596829"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"bacf61ea_13be52ff","line":16,"in_reply_to":"bacf61ea_9abf1ccf","updated":"2016-08-03 00:27:56.000000000","message":"The same can be said of other checks. So IMO, it is not necessary to describe it in this commit only.","commit_id":"5e033d232270cb3babfa526add1bbdbfe827804b"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"afc0a1ef9944ad54b0a18730003c28b1d41296b9","unresolved":false,"context_lines":[{"line_number":13,"context_line":"See the oslo i18n guideline."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"* http://docs.openstack.org/developer/oslo.i18n/guidelines.html"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: I901dcbfbd53d5d19db651473d2891bc8e8a59710"},{"line_number":18,"context_line":"Related-Bug: #1596829"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"bacf61ea_19aaf319","line":16,"in_reply_to":"bacf61ea_d3531a6b","updated":"2016-08-03 02:42:30.000000000","message":"Done","commit_id":"5e033d232270cb3babfa526add1bbdbfe827804b"}],"neutron_lib/hacking/checks.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"8cc819e30cfa2f3b98b25a7d2ba33f247a0ade4e","unresolved":false,"context_lines":[{"line_number":36,"context_line":"namespace_imports_from_dot \u003d re.compile(r\"from[\\s]+([\\w]+)[.]\")"},{"line_number":37,"context_line":"namespace_imports_from_root \u003d re.compile(r\"from[\\s]+([\\w]+)[\\s]+import[\\s]+\")"},{"line_number":38,"context_line":"contextlib_nested \u003d re.compile(r\"^\\s*with (contextlib\\.)?nested\\(\")"},{"line_number":39,"context_line":"log_string_interpolation \u003d re.compile(r\".*LOG\\.(error|warning|info\""},{"line_number":40,"context_line":"                                      r\"|critical|exception|debug)\""},{"line_number":41,"context_line":"                                      r\"\\([^,]*%[^,]*[,)]\")"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"dada55a8_e4b1c102","line":39,"updated":"2016-07-26 12:50:26.000000000","message":"this should be added in https://github.com/openstack/neutron-lib/blob/master/neutron_lib/hacking/translation_checks.py","commit_id":"b0c3733125c370cf0cc5abe26891efb3ca9f15d2"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"72e1fc4ebe283f740ba2fcb076837dc0f34f640b","unresolved":false,"context_lines":[{"line_number":36,"context_line":"namespace_imports_from_dot \u003d re.compile(r\"from[\\s]+([\\w]+)[.]\")"},{"line_number":37,"context_line":"namespace_imports_from_root \u003d re.compile(r\"from[\\s]+([\\w]+)[\\s]+import[\\s]+\")"},{"line_number":38,"context_line":"contextlib_nested \u003d re.compile(r\"^\\s*with (contextlib\\.)?nested\\(\")"},{"line_number":39,"context_line":"log_string_interpolation \u003d re.compile(r\".*LOG\\.(error|warning|info\""},{"line_number":40,"context_line":"                                      r\"|critical|exception|debug)\""},{"line_number":41,"context_line":"                                      r\"\\([^,]*%[^,]*[,)]\")"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_4a63e1dc","line":39,"in_reply_to":"bacf61ea_eb3acde6","updated":"2016-07-28 11:02:10.000000000","message":"Done","commit_id":"b0c3733125c370cf0cc5abe26891efb3ca9f15d2"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"3a0e345cc25d312b53568d236cd1289fb7ed6bcc","unresolved":false,"context_lines":[{"line_number":36,"context_line":"namespace_imports_from_dot \u003d re.compile(r\"from[\\s]+([\\w]+)[.]\")"},{"line_number":37,"context_line":"namespace_imports_from_root \u003d re.compile(r\"from[\\s]+([\\w]+)[\\s]+import[\\s]+\")"},{"line_number":38,"context_line":"contextlib_nested \u003d re.compile(r\"^\\s*with (contextlib\\.)?nested\\(\")"},{"line_number":39,"context_line":"log_string_interpolation \u003d re.compile(r\".*LOG\\.(error|warning|info\""},{"line_number":40,"context_line":"                                      r\"|critical|exception|debug)\""},{"line_number":41,"context_line":"                                      r\"\\([^,]*%[^,]*[,)]\")"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_eb3acde6","line":39,"in_reply_to":"dada55a8_639ab063","updated":"2016-07-27 14:35:06.000000000","message":"+1: IMHO this should go into the translation_checks","commit_id":"b0c3733125c370cf0cc5abe26891efb3ca9f15d2"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"8c3898bf2ca3dfe229d0326be3a0f762a50f40fa","unresolved":false,"context_lines":[{"line_number":36,"context_line":"namespace_imports_from_dot \u003d re.compile(r\"from[\\s]+([\\w]+)[.]\")"},{"line_number":37,"context_line":"namespace_imports_from_root \u003d re.compile(r\"from[\\s]+([\\w]+)[\\s]+import[\\s]+\")"},{"line_number":38,"context_line":"contextlib_nested \u003d re.compile(r\"^\\s*with (contextlib\\.)?nested\\(\")"},{"line_number":39,"context_line":"log_string_interpolation \u003d re.compile(r\".*LOG\\.(error|warning|info\""},{"line_number":40,"context_line":"                                      r\"|critical|exception|debug)\""},{"line_number":41,"context_line":"                                      r\"\\([^,]*%[^,]*[,)]\")"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"dada55a8_639ab063","line":39,"in_reply_to":"dada55a8_7f371cff","updated":"2016-07-27 12:11:54.000000000","message":"Agree with Gary, I think it is related to (the deferring of) translation. Would be better to co-locate it there, IMHO.","commit_id":"b0c3733125c370cf0cc5abe26891efb3ca9f15d2"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"147c6449febbb79e474ac6cf979e910947d3bae4","unresolved":false,"context_lines":[{"line_number":36,"context_line":"namespace_imports_from_dot \u003d re.compile(r\"from[\\s]+([\\w]+)[.]\")"},{"line_number":37,"context_line":"namespace_imports_from_root \u003d re.compile(r\"from[\\s]+([\\w]+)[\\s]+import[\\s]+\")"},{"line_number":38,"context_line":"contextlib_nested \u003d re.compile(r\"^\\s*with (contextlib\\.)?nested\\(\")"},{"line_number":39,"context_line":"log_string_interpolation \u003d re.compile(r\".*LOG\\.(error|warning|info\""},{"line_number":40,"context_line":"                                      r\"|critical|exception|debug)\""},{"line_number":41,"context_line":"                                      r\"\\([^,]*%[^,]*[,)]\")"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"dada55a8_7f371cff","line":39,"in_reply_to":"dada55a8_e4b1c102","updated":"2016-07-26 13:19:37.000000000","message":"This check is not related with \u0027translation\u0027(i18n).\nSo it should be added in this file.","commit_id":"b0c3733125c370cf0cc5abe26891efb3ca9f15d2"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"3a0e345cc25d312b53568d236cd1289fb7ed6bcc","unresolved":false,"context_lines":[{"line_number":168,"context_line":"    if noqa:"},{"line_number":169,"context_line":"        return"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    if \u0027neutron_lib/tests/\u0027 in filename:"},{"line_number":172,"context_line":"        return"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    if log_string_interpolation.match(logical_line):"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_4bf9594d","line":171,"range":{"start_line":171,"start_character":8,"end_line":171,"end_character":26},"updated":"2016-07-27 14:35:06.000000000","message":"I think this should just be /tests/ as consumers running this check in their project will want the tests packages skipped as well.\n\nEX: https://github.com/openstack/neutron-lib/blob/master/neutron_lib/hacking/translation_checks.py#L48","commit_id":"b0c3733125c370cf0cc5abe26891efb3ca9f15d2"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"72e1fc4ebe283f740ba2fcb076837dc0f34f640b","unresolved":false,"context_lines":[{"line_number":168,"context_line":"    if noqa:"},{"line_number":169,"context_line":"        return"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    if \u0027neutron_lib/tests/\u0027 in filename:"},{"line_number":172,"context_line":"        return"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    if log_string_interpolation.match(logical_line):"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_6aa065f5","line":171,"range":{"start_line":171,"start_character":8,"end_line":171,"end_character":26},"in_reply_to":"bacf61ea_4bf9594d","updated":"2016-07-28 11:02:10.000000000","message":"Done","commit_id":"b0c3733125c370cf0cc5abe26891efb3ca9f15d2"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"3a0e345cc25d312b53568d236cd1289fb7ed6bcc","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        return"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    if log_string_interpolation.match(logical_line):"},{"line_number":175,"context_line":"        yield(0, msg)"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"def factory(register):"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_eb43ed6a","line":175,"range":{"start_line":175,"start_character":14,"end_line":175,"end_character":15},"updated":"2016-07-27 14:35:06.000000000","message":"If possible it would be nice to to return the index of the offending \u0027%\u0027 so that the tox output is prettier and more easily understood.","commit_id":"b0c3733125c370cf0cc5abe26891efb3ca9f15d2"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"72e1fc4ebe283f740ba2fcb076837dc0f34f640b","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        return"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    if log_string_interpolation.match(logical_line):"},{"line_number":175,"context_line":"        yield(0, msg)"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"def factory(register):"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_caa51105","line":175,"range":{"start_line":175,"start_character":14,"end_line":175,"end_character":15},"in_reply_to":"bacf61ea_eb43ed6a","updated":"2016-07-28 11:02:10.000000000","message":"Done","commit_id":"b0c3733125c370cf0cc5abe26891efb3ca9f15d2"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"40f37a79f43041c1a0543c837bc91048bf22ee1f","unresolved":false,"context_lines":[{"line_number":198,"context_line":"                  translation_checks.check_log_warn_deprecated,"},{"line_number":199,"context_line":"                  translation_checks.check_raised_localized_exceptions,"},{"line_number":200,"context_line":"                  check_no_eventlet_imports,"},{"line_number":201,"context_line":"                  translation_checks.check_delayed_string_interpolation])"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"_LIB_PROJECT_CHECKS \u003d ALL_CHECKS"},{"line_number":204,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"9ad45d7e_4015e299","line":201,"range":{"start_line":201,"start_character":71,"end_line":201,"end_character":73},"updated":"2016-08-11 15:56:41.000000000","message":"nit: Could you add a comma and newline before \"])\"? It will make diff simple when some change is made in future.\n\n  ...._string_interpolation,\n  ])","commit_id":"1c384e9c394bec031fb31cd7868b1dd956bbd3d0"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"04a1c5fa74c34440b51a203ff1a3fb4f8f100507","unresolved":false,"context_lines":[{"line_number":198,"context_line":"                  translation_checks.check_log_warn_deprecated,"},{"line_number":199,"context_line":"                  translation_checks.check_raised_localized_exceptions,"},{"line_number":200,"context_line":"                  check_no_eventlet_imports,"},{"line_number":201,"context_line":"                  translation_checks.check_delayed_string_interpolation])"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"_LIB_PROJECT_CHECKS \u003d ALL_CHECKS"},{"line_number":204,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"3ac371cc_3afffe35","line":201,"range":{"start_line":201,"start_character":71,"end_line":201,"end_character":73},"in_reply_to":"9ad45d7e_4015e299","updated":"2016-08-15 01:05:12.000000000","message":"The master code was changed by another patch.\nSo now it is unnecessary to do it.","commit_id":"1c384e9c394bec031fb31cd7868b1dd956bbd3d0"}],"neutron_lib/hacking/translation_checks.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"40f37a79f43041c1a0543c837bc91048bf22ee1f","unresolved":false,"context_lines":[{"line_number":45,"context_line":"             for level, hint in _all_log_levels.items()))"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"_log_string_interpolation \u003d re.compile(r\".*LOG\\.(error|warning|info\""},{"line_number":49,"context_line":"                                       r\"|critical|exception|debug)\""},{"line_number":50,"context_line":"                                       r\"\\([^,]*%[^,]*[,)]\")"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"def _translation_is_not_expected(filename):"}],"source_content_type":"text/x-python","patch_set":11,"id":"9ad45d7e_0bdb0b1c","line":50,"range":{"start_line":48,"start_character":39,"end_line":50,"end_character":59},"updated":"2016-08-11 15:56:41.000000000","message":"nit: If you start the regular expression in a new line, you don\u0027t need line breaks. I think it improves the readability.\n\n  ... \u003d re.compile(\n      r\".*LOG\\.(error|warning|...\")","commit_id":"1c384e9c394bec031fb31cd7868b1dd956bbd3d0"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"04a1c5fa74c34440b51a203ff1a3fb4f8f100507","unresolved":false,"context_lines":[{"line_number":45,"context_line":"             for level, hint in _all_log_levels.items()))"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"_log_string_interpolation \u003d re.compile(r\".*LOG\\.(error|warning|info\""},{"line_number":49,"context_line":"                                       r\"|critical|exception|debug)\""},{"line_number":50,"context_line":"                                       r\"\\([^,]*%[^,]*[,)]\")"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"def _translation_is_not_expected(filename):"}],"source_content_type":"text/x-python","patch_set":11,"id":"3ac371cc_da94eae9","line":50,"range":{"start_line":48,"start_character":39,"end_line":50,"end_character":59},"in_reply_to":"9ad45d7e_0bdb0b1c","updated":"2016-08-15 01:05:12.000000000","message":"Done","commit_id":"1c384e9c394bec031fb31cd7868b1dd956bbd3d0"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"98554655c9ff958bfcf80d3c85d0422e433d8e43","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        return"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    if _log_string_interpolation.match(logical_line):"},{"line_number":118,"context_line":"        yield(logical_line.index(\u0027%\u0027), msg)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3ac371cc_ddc4cb93","line":118,"updated":"2016-08-15 14:13:06.000000000","message":"nit: yield is not a function, so it is better to have a space after yield. However, looking at this module, we have mixed usage of both (yield with space and without space) :-(   We can clean up later.","commit_id":"eb32fd4fbd0c16b51efb91f2385ab3f2243fcd48"}],"neutron_lib/tests/unit/hacking/test_checks.py":[{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"3a0e345cc25d312b53568d236cd1289fb7ed6bcc","unresolved":false,"context_lines":[{"line_number":202,"context_line":"                              \u0027neutron_lib/db/utils.py\u0027, None)"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"        # check a file in neutron/tests"},{"line_number":205,"context_line":"        self.assertLinePasses(f, \u0027LOG.error(_LE(\"xxxxxxxxxxxxxxx\") % value)\u0027,"},{"line_number":206,"context_line":"                              \u0027neutron_lib/tests/unit/test_neutron_lib.py\u0027,"},{"line_number":207,"context_line":"                              None)"},{"line_number":208,"context_line":"        # check code including \u0027noqa\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_4ec5e759","line":205,"updated":"2016-07-27 14:35:06.000000000","message":"Can we please add a test with multiple variables (thus requiring a \u0027%\u0027 in the string). e.g.\n\n\nself.assertLinePasses(f, \"LOG.warning(\u0027_(\u0027some message: \"\n                         \"v1\u003d%(v1)s v2\u003d%(v2)s\u0027) % \"\n                         \"{\u0027v1\u0027: v1, \u0027v2\u0027: v2}\u0027)\",\n                      \u0027neutron_lib/db/utils.py\u0027, None)","commit_id":"b0c3733125c370cf0cc5abe26891efb3ca9f15d2"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"72e1fc4ebe283f740ba2fcb076837dc0f34f640b","unresolved":false,"context_lines":[{"line_number":202,"context_line":"                              \u0027neutron_lib/db/utils.py\u0027, None)"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"        # check a file in neutron/tests"},{"line_number":205,"context_line":"        self.assertLinePasses(f, \u0027LOG.error(_LE(\"xxxxxxxxxxxxxxx\") % value)\u0027,"},{"line_number":206,"context_line":"                              \u0027neutron_lib/tests/unit/test_neutron_lib.py\u0027,"},{"line_number":207,"context_line":"                              None)"},{"line_number":208,"context_line":"        # check code including \u0027noqa\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_aa737db0","line":205,"in_reply_to":"bacf61ea_4ec5e759","updated":"2016-07-28 11:02:10.000000000","message":"O.K.\nI have added that case in PS2.\nBut in \u0027logical_line\u0027, contents of strings replaced with \"xxx\" of same length.","commit_id":"b0c3733125c370cf0cc5abe26891efb3ca9f15d2"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"ed7e7277738b9bd173c9037bf68256510d47da8b","unresolved":false,"context_lines":[{"line_number":203,"context_line":"            \u0027neutron_lib/db/utils.py\u0027, None)"},{"line_number":204,"context_line":"        self.assertLinePasses(f, \"LOG.warning(msg, \u0027xxxxx\u0027)\","},{"line_number":205,"context_line":"                              \u0027neutron_lib/db/utils.py\u0027, None)"},{"line_number":206,"context_line":"        self.assertLinePasses(f, \"LOG.info(_LI(\u0027xxxxxxxxxxxxxxxxxxxxxxxx\""},{"line_number":207,"context_line":"                                 \"xxxxxxxxx\u0027), {\u0027xx\u0027: v1, \u0027xx\u0027: v2})\","},{"line_number":208,"context_line":"                              \u0027neutron_lib/db/utils.py\u0027, None)"},{"line_number":209,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bacf61ea_313539da","line":206,"range":{"start_line":206,"start_character":48,"end_line":206,"end_character":72},"updated":"2016-07-28 13:18:17.000000000","message":"Wasn\u0027t the expectation of boden to have a test that passes, but has % in the string itself?","commit_id":"b8cf1c45141d0e0bca1908a4d61d3e92ac1669d3"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"e1d0d5bcd33ce40cb29b1440a63676a2a865ad12","unresolved":false,"context_lines":[{"line_number":203,"context_line":"            \u0027neutron_lib/db/utils.py\u0027, None)"},{"line_number":204,"context_line":"        self.assertLinePasses(f, \"LOG.warning(msg, \u0027xxxxx\u0027)\","},{"line_number":205,"context_line":"                              \u0027neutron_lib/db/utils.py\u0027, None)"},{"line_number":206,"context_line":"        self.assertLinePasses(f, \"LOG.info(_LI(\u0027xxxxxxxxxxxxxxxxxxxxxxxx\""},{"line_number":207,"context_line":"                                 \"xxxxxxxxx\u0027), {\u0027xx\u0027: v1, \u0027xx\u0027: v2})\","},{"line_number":208,"context_line":"                              \u0027neutron_lib/db/utils.py\u0027, None)"},{"line_number":209,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bacf61ea_4ccd9a5c","line":206,"range":{"start_line":206,"start_character":48,"end_line":206,"end_character":72},"in_reply_to":"bacf61ea_0b939650","updated":"2016-07-28 22:22:31.000000000","message":"Sorry I still don\u0027t quite get it; maybe I need to dig a bit deeper to understand the \u0027xxx\u0027 replacement.\n\n\nI see an existing logical_line check [1], that uses non \u0027xxx\u0027 strings to test [2] so I\u0027m a bit confused.\n\n\n\n[1] https://github.com/openstack/neutron-lib/blob/master/neutron_lib/hacking/translation_checks.py#L46\n[2] https://github.com/openstack/neutron-lib/blob/master/neutron_lib/tests/unit/hacking/test_checks.py#L130","commit_id":"b8cf1c45141d0e0bca1908a4d61d3e92ac1669d3"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"1c60742f157b2c7e95598bbc28012457d2b686bc","unresolved":false,"context_lines":[{"line_number":203,"context_line":"            \u0027neutron_lib/db/utils.py\u0027, None)"},{"line_number":204,"context_line":"        self.assertLinePasses(f, \"LOG.warning(msg, \u0027xxxxx\u0027)\","},{"line_number":205,"context_line":"                              \u0027neutron_lib/db/utils.py\u0027, None)"},{"line_number":206,"context_line":"        self.assertLinePasses(f, \"LOG.info(_LI(\u0027xxxxxxxxxxxxxxxxxxxxxxxx\""},{"line_number":207,"context_line":"                                 \"xxxxxxxxx\u0027), {\u0027xx\u0027: v1, \u0027xx\u0027: v2})\","},{"line_number":208,"context_line":"                              \u0027neutron_lib/db/utils.py\u0027, None)"},{"line_number":209,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bacf61ea_912b4530","line":206,"range":{"start_line":206,"start_character":48,"end_line":206,"end_character":72},"in_reply_to":"bacf61ea_313539da","updated":"2016-07-28 13:24:34.000000000","message":"In \u0027logical_line\u0027, contents of strings replaced with \"xxx\" of same length.(And then it is checked.)","commit_id":"b8cf1c45141d0e0bca1908a4d61d3e92ac1669d3"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"6edab3806e2bce4adb8bfef18926b502520a4138","unresolved":false,"context_lines":[{"line_number":203,"context_line":"            \u0027neutron_lib/db/utils.py\u0027, None)"},{"line_number":204,"context_line":"        self.assertLinePasses(f, \"LOG.warning(msg, \u0027xxxxx\u0027)\","},{"line_number":205,"context_line":"                              \u0027neutron_lib/db/utils.py\u0027, None)"},{"line_number":206,"context_line":"        self.assertLinePasses(f, \"LOG.info(_LI(\u0027xxxxxxxxxxxxxxxxxxxxxxxx\""},{"line_number":207,"context_line":"                                 \"xxxxxxxxx\u0027), {\u0027xx\u0027: v1, \u0027xx\u0027: v2})\","},{"line_number":208,"context_line":"                              \u0027neutron_lib/db/utils.py\u0027, None)"},{"line_number":209,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bacf61ea_e4caba19","line":206,"range":{"start_line":206,"start_character":48,"end_line":206,"end_character":72},"in_reply_to":"bacf61ea_912b4530","updated":"2016-07-28 15:29:14.000000000","message":"What I wanted to see tested, was the use of a valid \u0027%\u0027 in the string.\n\nFor example:\n\n\nself.assertLinePasses(f, \"LOG.info(_LI(\u0027up by 10%\u0027)\",\n                      \u0027neutron_lib/db/utils.py\u0027, None)\n\n\nIt should be valid to use a \u0027%\u0027 in the message right? Assuming yes, the regex to test the line needs to be smart enough to determine when the \u0027%\u0027 is used for interpolation or not.","commit_id":"b8cf1c45141d0e0bca1908a4d61d3e92ac1669d3"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"afd2e022e97693e40e2ef6cc9e4a459e5e73024b","unresolved":false,"context_lines":[{"line_number":203,"context_line":"            \u0027neutron_lib/db/utils.py\u0027, None)"},{"line_number":204,"context_line":"        self.assertLinePasses(f, \"LOG.warning(msg, \u0027xxxxx\u0027)\","},{"line_number":205,"context_line":"                              \u0027neutron_lib/db/utils.py\u0027, None)"},{"line_number":206,"context_line":"        self.assertLinePasses(f, \"LOG.info(_LI(\u0027xxxxxxxxxxxxxxxxxxxxxxxx\""},{"line_number":207,"context_line":"                                 \"xxxxxxxxx\u0027), {\u0027xx\u0027: v1, \u0027xx\u0027: v2})\","},{"line_number":208,"context_line":"                              \u0027neutron_lib/db/utils.py\u0027, None)"},{"line_number":209,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bacf61ea_0b939650","line":206,"range":{"start_line":206,"start_character":48,"end_line":206,"end_character":72},"in_reply_to":"bacf61ea_e4caba19","updated":"2016-07-28 17:30:46.000000000","message":"The target to check is \u0027logical_line\u0027.\nThe \u0027logical_line\u0027 is created by replacing contents of strings in original line with \"xxx\" of same length.\n\nFor example,\nOriginal line: LOG.info(_LI(\u0027up by 10%\u0027)\nLoginal_line: LOG.info(_LI(\u0027xxxxxxxxx\u0027)\n\nThen \u0027logical_line\u0027 is checked.","commit_id":"b8cf1c45141d0e0bca1908a4d61d3e92ac1669d3"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"ac82467d60bc11459c61f6bb0253a810c4ac7b46","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from neutron_lib.hacking import translation_checks as tc"},{"line_number":23,"context_line":"from neutron_lib.tests import _base as base"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"CREATE_DUMMY_MATCH_OBJECT \u003d re.compile(\u0027a\u0027)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class HackingTestCase(base.BaseTestCase):"}],"source_content_type":"text/x-python","patch_set":9,"id":"bacf61ea_ec70a342","line":25,"updated":"2016-08-04 14:10:17.000000000","message":"We don\u0027t need a global for this, please put it in the test method.","commit_id":"4f2f30c40195ee608205cbc53618e9e3116f835b"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"ae07eb3acb0e227db72f62df6dcbbc36562d6778","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from neutron_lib.hacking import translation_checks as tc"},{"line_number":23,"context_line":"from neutron_lib.tests import _base as base"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"CREATE_DUMMY_MATCH_OBJECT \u003d re.compile(\u0027a\u0027)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class HackingTestCase(base.BaseTestCase):"}],"source_content_type":"text/x-python","patch_set":9,"id":"bacf61ea_a02cd502","line":25,"in_reply_to":"bacf61ea_ec70a342","updated":"2016-08-04 22:20:46.000000000","message":"Done","commit_id":"4f2f30c40195ee608205cbc53618e9e3116f835b"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"40f37a79f43041c1a0543c837bc91048bf22ee1f","unresolved":false,"context_lines":[{"line_number":302,"context_line":"        # check code including \u0027noqa\u0027"},{"line_number":303,"context_line":"        self.assertLinePasses(f, \u0027LOG.error(_LE(\"xxxxxxxxxxxxxxx\") % value)\u0027,"},{"line_number":304,"context_line":"                              \u0027neutron_lib/db/utils.py\u0027,"},{"line_number":305,"context_line":"                              dummy_noqa)"}],"source_content_type":"text/x-python","patch_set":11,"id":"9ad45d7e_4b634342","line":305,"range":{"start_line":305,"start_character":30,"end_line":305,"end_character":40},"updated":"2016-08-11 15:56:41.000000000","message":"I think passing \"noqa\" is enough. I don\u0027t understand why re.search() is required as dummy_noqa.","commit_id":"1c384e9c394bec031fb31cd7868b1dd956bbd3d0"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a13a716c0883ea9d01d07500efd9015eff5bbafb","unresolved":false,"context_lines":[{"line_number":302,"context_line":"        # check code including \u0027noqa\u0027"},{"line_number":303,"context_line":"        self.assertLinePasses(f, \u0027LOG.error(_LE(\"xxxxxxxxxxxxxxx\") % value)\u0027,"},{"line_number":304,"context_line":"                              \u0027neutron_lib/db/utils.py\u0027,"},{"line_number":305,"context_line":"                              dummy_noqa)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3ac371cc_7d7317b2","line":305,"range":{"start_line":305,"start_character":30,"end_line":305,"end_character":40},"in_reply_to":"3ac371cc_9a9392fa","updated":"2016-08-15 14:09:42.000000000","message":"Thanks for clarification. I thought \u0027noqa\u0027 is just a boolean value and there it is enough to pass something evaluated as True. According to your reply, it looks okay.","commit_id":"1c384e9c394bec031fb31cd7868b1dd956bbd3d0"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"04a1c5fa74c34440b51a203ff1a3fb4f8f100507","unresolved":false,"context_lines":[{"line_number":302,"context_line":"        # check code including \u0027noqa\u0027"},{"line_number":303,"context_line":"        self.assertLinePasses(f, \u0027LOG.error(_LE(\"xxxxxxxxxxxxxxx\") % value)\u0027,"},{"line_number":304,"context_line":"                              \u0027neutron_lib/db/utils.py\u0027,"},{"line_number":305,"context_line":"                              dummy_noqa)"}],"source_content_type":"text/x-python","patch_set":11,"id":"3ac371cc_9a9392fa","line":305,"range":{"start_line":305,"start_character":30,"end_line":305,"end_character":40},"in_reply_to":"9ad45d7e_4b634342","updated":"2016-08-15 01:05:12.000000000","message":"If \u0027# noqa\u0027 is in logical line, _sre.SRE_Match object is passed to the check method.\nSo IMO, it is better to pass an _sre.SRE_Match object.","commit_id":"1c384e9c394bec031fb31cd7868b1dd956bbd3d0"}]}
