)]}'
{"hacking/checks/except_checks.py":[{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"60545e13e831db5a509f00273a53d639e5dde4b0","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        if isinstance(node.func, ast.Attribute):"},{"line_number":148,"context_line":"            local_func_name \u003d node.func.attr"},{"line_number":149,"context_line":"        elif isinstance(node.func, ast.Name):"},{"line_number":150,"context_line":"            local_func_name \u003d node.func.id"},{"line_number":151,"context_line":"        else:"},{"line_number":152,"context_line":"            local_func_name \u003d None"},{"line_number":153,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5a8bc5a2_8aa4f308","line":150,"range":{"start_line":150,"start_character":12,"end_line":150,"end_character":27},"updated":"2016-09-28 09:25:22.000000000","message":"You want to match assertTrue(a\u003d\u003db)?","commit_id":"ee7359684f948d718c780b865dc532a4a816e3f4"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"3ba877d1c4e2ca45b6bbc2be28ec4ed0176f5bef","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        if isinstance(node.func, ast.Attribute):"},{"line_number":148,"context_line":"            local_func_name \u003d node.func.attr"},{"line_number":149,"context_line":"        elif isinstance(node.func, ast.Name):"},{"line_number":150,"context_line":"            local_func_name \u003d node.func.id"},{"line_number":151,"context_line":"        else:"},{"line_number":152,"context_line":"            local_func_name \u003d None"},{"line_number":153,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3a98d1f4_a503c475","line":150,"in_reply_to":"5a8bc5a2_8aa4f308","updated":"2016-09-28 13:25:06.000000000","message":"yep, but here I\u0027m just trying to determine the name of the function.","commit_id":"ee7359684f948d718c780b865dc532a4a816e3f4"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"60545e13e831db5a509f00273a53d639e5dde4b0","unresolved":false,"context_lines":[{"line_number":153,"context_line":""},{"line_number":154,"context_line":"        try:"},{"line_number":155,"context_line":"            if (local_func_name \u003d\u003d self.method_name and"},{"line_number":156,"context_line":"                len(node.args) \u003d\u003d 1 and"},{"line_number":157,"context_line":"                len(node.args[0].ops) \u003d\u003d 1 and"},{"line_number":158,"context_line":"                any(filter(lambda op: isinstance(node.args[0].ops[0], op),"},{"line_number":159,"context_line":"                           self.ops))):"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a8bc5a2_ea6497e6","line":156,"updated":"2016-09-28 09:25:22.000000000","message":"You want to match self.assertTrue(a\u003d\u003db) but not self.assertTrue(a\u003d\u003db, errmsg)? Why not?","commit_id":"ee7359684f948d718c780b865dc532a4a816e3f4"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"3ba877d1c4e2ca45b6bbc2be28ec4ed0176f5bef","unresolved":false,"context_lines":[{"line_number":153,"context_line":""},{"line_number":154,"context_line":"        try:"},{"line_number":155,"context_line":"            if (local_func_name \u003d\u003d self.method_name and"},{"line_number":156,"context_line":"                len(node.args) \u003d\u003d 1 and"},{"line_number":157,"context_line":"                len(node.args[0].ops) \u003d\u003d 1 and"},{"line_number":158,"context_line":"                any(filter(lambda op: isinstance(node.args[0].ops[0], op),"},{"line_number":159,"context_line":"                           self.ops))):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a98d1f4_25d174fc","line":156,"in_reply_to":"5a8bc5a2_ea6497e6","updated":"2016-09-28 13:25:06.000000000","message":"Because I forgot about the latter, which has never seemed really useful to me. I\u0027ll try to see how hard it is to add it :)","commit_id":"ee7359684f948d718c780b865dc532a4a816e3f4"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"60545e13e831db5a509f00273a53d639e5dde4b0","unresolved":false,"context_lines":[{"line_number":156,"context_line":"                len(node.args) \u003d\u003d 1 and"},{"line_number":157,"context_line":"                len(node.args[0].ops) \u003d\u003d 1 and"},{"line_number":158,"context_line":"                any(filter(lambda op: isinstance(node.args[0].ops[0], op),"},{"line_number":159,"context_line":"                           self.ops))):"},{"line_number":160,"context_line":"                self.error \u003d True"},{"line_number":161,"context_line":"        except AttributeError:"},{"line_number":162,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a8bc5a2_4a4cab76","line":159,"range":{"start_line":159,"start_character":32,"end_line":159,"end_character":35},"updated":"2016-09-28 09:25:22.000000000","message":"isinstance() accepts a tuple as the second parameter, so cast ops to a tuple in the constructor. This complex line can probably be simplified to a call to isinstance() ;-)","commit_id":"ee7359684f948d718c780b865dc532a4a816e3f4"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"29b947f013a3c5030d3b50c6231d41650bcc5b4a","unresolved":false,"context_lines":[{"line_number":156,"context_line":"                len(node.args) \u003d\u003d 1 and"},{"line_number":157,"context_line":"                len(node.args[0].ops) \u003d\u003d 1 and"},{"line_number":158,"context_line":"                any(filter(lambda op: isinstance(node.args[0].ops[0], op),"},{"line_number":159,"context_line":"                           self.ops))):"},{"line_number":160,"context_line":"                self.error \u003d True"},{"line_number":161,"context_line":"        except AttributeError:"},{"line_number":162,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a98d1f4_a5866414","line":159,"in_reply_to":"3a98d1f4_45f5a081","updated":"2016-10-04 13:06:21.000000000","message":"Done","commit_id":"ee7359684f948d718c780b865dc532a4a816e3f4"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"3ba877d1c4e2ca45b6bbc2be28ec4ed0176f5bef","unresolved":false,"context_lines":[{"line_number":156,"context_line":"                len(node.args) \u003d\u003d 1 and"},{"line_number":157,"context_line":"                len(node.args[0].ops) \u003d\u003d 1 and"},{"line_number":158,"context_line":"                any(filter(lambda op: isinstance(node.args[0].ops[0], op),"},{"line_number":159,"context_line":"                           self.ops))):"},{"line_number":160,"context_line":"                self.error \u003d True"},{"line_number":161,"context_line":"        except AttributeError:"},{"line_number":162,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a98d1f4_45f5a081","line":159,"in_reply_to":"5a8bc5a2_4a4cab76","updated":"2016-09-28 13:25:06.000000000","message":"Oh right, nice catch!","commit_id":"ee7359684f948d718c780b865dc532a4a816e3f4"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"60545e13e831db5a509f00273a53d639e5dde4b0","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        except AttributeError:"},{"line_number":162,"context_line":"            pass"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"        self.generic_visit(node)"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"@core.flake8ext"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a8bc5a2_e7085230","line":164,"range":{"start_line":164,"start_character":13,"end_line":164,"end_character":26},"updated":"2016-09-28 09:25:22.000000000","message":"You can start by calling generic_visit() at the top, so it will be safe to use directly return to exit quickly if the node doesn\u0027t match.","commit_id":"ee7359684f948d718c780b865dc532a4a816e3f4"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"29b947f013a3c5030d3b50c6231d41650bcc5b4a","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        except AttributeError:"},{"line_number":162,"context_line":"            pass"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"        self.generic_visit(node)"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"@core.flake8ext"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a98d1f4_c215269c","line":164,"in_reply_to":"3a98d1f4_6520dcf8","updated":"2016-10-04 13:06:21.000000000","message":"Done","commit_id":"ee7359684f948d718c780b865dc532a4a816e3f4"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"3ba877d1c4e2ca45b6bbc2be28ec4ed0176f5bef","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        except AttributeError:"},{"line_number":162,"context_line":"            pass"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"        self.generic_visit(node)"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"@core.flake8ext"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a98d1f4_6520dcf8","line":164,"in_reply_to":"5a8bc5a2_e7085230","updated":"2016-09-28 13:25:06.000000000","message":"OK.","commit_id":"ee7359684f948d718c780b865dc532a4a816e3f4"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"60545e13e831db5a509f00273a53d639e5dde4b0","unresolved":false,"context_lines":[{"line_number":185,"context_line":"        except ValueError:"},{"line_number":186,"context_line":"            continue"},{"line_number":187,"context_line":"        checker \u003d AssertTrueFalseChecker(method_name, [ast.Eq, ast.NotEq])"},{"line_number":188,"context_line":"        checker.visit(ast.parse(logical_line))"},{"line_number":189,"context_line":"        if checker.error:"},{"line_number":190,"context_line":"            yield start, \u0027H204: Use assert(Not)Equal()\u0027"},{"line_number":191,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5a8bc5a2_879eae05","line":188,"range":{"start_line":188,"start_character":16,"end_line":188,"end_character":21},"updated":"2016-09-28 09:25:22.000000000","message":"An ast visitor is expensive. I would suggest to only call it once, but pass a list (or set) of method names.","commit_id":"ee7359684f948d718c780b865dc532a4a816e3f4"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"29b947f013a3c5030d3b50c6231d41650bcc5b4a","unresolved":false,"context_lines":[{"line_number":185,"context_line":"        except ValueError:"},{"line_number":186,"context_line":"            continue"},{"line_number":187,"context_line":"        checker \u003d AssertTrueFalseChecker(method_name, [ast.Eq, ast.NotEq])"},{"line_number":188,"context_line":"        checker.visit(ast.parse(logical_line))"},{"line_number":189,"context_line":"        if checker.error:"},{"line_number":190,"context_line":"            yield start, \u0027H204: Use assert(Not)Equal()\u0027"},{"line_number":191,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3a98d1f4_65f0dcca","line":188,"in_reply_to":"3a98d1f4_c57d30e9","updated":"2016-10-04 13:06:21.000000000","message":"Done","commit_id":"ee7359684f948d718c780b865dc532a4a816e3f4"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"3ba877d1c4e2ca45b6bbc2be28ec4ed0176f5bef","unresolved":false,"context_lines":[{"line_number":185,"context_line":"        except ValueError:"},{"line_number":186,"context_line":"            continue"},{"line_number":187,"context_line":"        checker \u003d AssertTrueFalseChecker(method_name, [ast.Eq, ast.NotEq])"},{"line_number":188,"context_line":"        checker.visit(ast.parse(logical_line))"},{"line_number":189,"context_line":"        if checker.error:"},{"line_number":190,"context_line":"            yield start, \u0027H204: Use assert(Not)Equal()\u0027"},{"line_number":191,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3a98d1f4_c57d30e9","line":188,"in_reply_to":"5a8bc5a2_879eae05","updated":"2016-09-28 13:25:06.000000000","message":"OK, makes sense.","commit_id":"ee7359684f948d718c780b865dc532a4a816e3f4"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"33791c9b8e8de520e930e29656f05cf7fbd099a0","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        self.ops \u003d ops"},{"line_number":144,"context_line":"        self.error \u003d False"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    def visit_Call(self, node):"},{"line_number":147,"context_line":"        self.generic_visit(node)"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        if isinstance(node.func, ast.Attribute):"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a95cdbc_44262dcf","line":146,"range":{"start_line":146,"start_character":19,"end_line":146,"end_character":23},"updated":"2016-10-06 07:23:50.000000000","message":"Micro-optimization: you can do nothing here if error is already true:\n\n if errors:\n     # we already found an error, ignore further AST nodes\n     return True","commit_id":"a2f620820a7ffbc4b01e813e75dd12ce6f90c2bb"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"5f0024429777cc284c9de875038d38cdf7897f4b","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        self.ops \u003d ops"},{"line_number":144,"context_line":"        self.error \u003d False"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    def visit_Call(self, node):"},{"line_number":147,"context_line":"        self.generic_visit(node)"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        if isinstance(node.func, ast.Attribute):"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a95cdbc_f5fa4174","line":146,"in_reply_to":"1a95cdbc_44262dcf","updated":"2016-10-07 11:02:10.000000000","message":"Done","commit_id":"a2f620820a7ffbc4b01e813e75dd12ce6f90c2bb"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"33791c9b8e8de520e930e29656f05cf7fbd099a0","unresolved":false,"context_lines":[{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        if isinstance(node.func, ast.Attribute):"},{"line_number":150,"context_line":"            local_func_name \u003d node.func.attr"},{"line_number":151,"context_line":"        elif isinstance(node.func, ast.Name):"},{"line_number":152,"context_line":"            local_func_name \u003d node.func.id"},{"line_number":153,"context_line":"        else:"},{"line_number":154,"context_line":"            local_func_name \u003d None"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a95cdbc_070a6721","line":151,"range":{"start_line":151,"start_character":33,"end_line":151,"end_character":34},"updated":"2016-10-06 07:23:50.000000000","message":"Since hacking_assert_equal() only calls AssertTrueFalseChecker on lines containing \".assertTrue\", I don\u0027t think that it\u0027s worth it support the weird \"assertTrue(...)\" case (function call, versus \"self.assertTrue(...)\": method call).","commit_id":"a2f620820a7ffbc4b01e813e75dd12ce6f90c2bb"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"33791c9b8e8de520e930e29656f05cf7fbd099a0","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        elif isinstance(node.func, ast.Name):"},{"line_number":152,"context_line":"            local_func_name \u003d node.func.id"},{"line_number":153,"context_line":"        else:"},{"line_number":154,"context_line":"            local_func_name \u003d None"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        try:"},{"line_number":157,"context_line":"            if (local_func_name in self.method_names and"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a95cdbc_270da337","line":154,"updated":"2016-10-06 07:23:50.000000000","message":"You can simply \"return\" here to avoid useless checks below.","commit_id":"a2f620820a7ffbc4b01e813e75dd12ce6f90c2bb"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"5f0024429777cc284c9de875038d38cdf7897f4b","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        elif isinstance(node.func, ast.Name):"},{"line_number":152,"context_line":"            local_func_name \u003d node.func.id"},{"line_number":153,"context_line":"        else:"},{"line_number":154,"context_line":"            local_func_name \u003d None"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        try:"},{"line_number":157,"context_line":"            if (local_func_name in self.method_names and"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a95cdbc_d5eaa5ab","line":154,"in_reply_to":"1a95cdbc_270da337","updated":"2016-10-07 11:02:10.000000000","message":"So, I moved this code in a helper function.","commit_id":"a2f620820a7ffbc4b01e813e75dd12ce6f90c2bb"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"33791c9b8e8de520e930e29656f05cf7fbd099a0","unresolved":false,"context_lines":[{"line_number":157,"context_line":"            if (local_func_name in self.method_names and"},{"line_number":158,"context_line":"                    len(node.args) \u003d\u003d 1 and"},{"line_number":159,"context_line":"                    len(node.args[0].ops) \u003d\u003d 1 and"},{"line_number":160,"context_line":"                    isinstance(node.args[0].ops[0], tuple(self.ops))):"},{"line_number":161,"context_line":"                self.error \u003d True"},{"line_number":162,"context_line":"        except AttributeError:"},{"line_number":163,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a95cdbc_24484187","line":160,"range":{"start_line":160,"start_character":52,"end_line":160,"end_character":57},"updated":"2016-10-06 07:23:50.000000000","message":"You can cast to tuple in the constructor, I don\u0027t expect self.ops to be modified after the creation of the object. If you want to make sure that it\u0027s not modified, make the attribute private ;-)\n\n... Or always pass directly tuple to the constructor? :-)","commit_id":"a2f620820a7ffbc4b01e813e75dd12ce6f90c2bb"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"5f0024429777cc284c9de875038d38cdf7897f4b","unresolved":false,"context_lines":[{"line_number":157,"context_line":"            if (local_func_name in self.method_names and"},{"line_number":158,"context_line":"                    len(node.args) \u003d\u003d 1 and"},{"line_number":159,"context_line":"                    len(node.args[0].ops) \u003d\u003d 1 and"},{"line_number":160,"context_line":"                    isinstance(node.args[0].ops[0], tuple(self.ops))):"},{"line_number":161,"context_line":"                self.error \u003d True"},{"line_number":162,"context_line":"        except AttributeError:"},{"line_number":163,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a95cdbc_35c3c939","line":160,"in_reply_to":"1a95cdbc_24484187","updated":"2016-10-07 11:02:10.000000000","message":"Done","commit_id":"a2f620820a7ffbc4b01e813e75dd12ce6f90c2bb"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"33791c9b8e8de520e930e29656f05cf7fbd099a0","unresolved":false,"context_lines":[{"line_number":159,"context_line":"                    len(node.args[0].ops) \u003d\u003d 1 and"},{"line_number":160,"context_line":"                    isinstance(node.args[0].ops[0], tuple(self.ops))):"},{"line_number":161,"context_line":"                self.error \u003d True"},{"line_number":162,"context_line":"        except AttributeError:"},{"line_number":163,"context_line":"            pass"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a95cdbc_043c25e1","line":162,"updated":"2016-10-06 07:23:50.000000000","message":"Are you catching AttributeError on node.args[0].ops, if node.args[0] is not a comparison operator? Maybe add a comment to explain it.","commit_id":"a2f620820a7ffbc4b01e813e75dd12ce6f90c2bb"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"5f0024429777cc284c9de875038d38cdf7897f4b","unresolved":false,"context_lines":[{"line_number":159,"context_line":"                    len(node.args[0].ops) \u003d\u003d 1 and"},{"line_number":160,"context_line":"                    isinstance(node.args[0].ops[0], tuple(self.ops))):"},{"line_number":161,"context_line":"                self.error \u003d True"},{"line_number":162,"context_line":"        except AttributeError:"},{"line_number":163,"context_line":"            pass"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a95cdbc_f54de13e","line":162,"in_reply_to":"1a95cdbc_043c25e1","updated":"2016-10-07 11:02:10.000000000","message":"Removed the try/except :)","commit_id":"a2f620820a7ffbc4b01e813e75dd12ce6f90c2bb"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"33791c9b8e8de520e930e29656f05cf7fbd099a0","unresolved":false,"context_lines":[{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    methods \u003d [\u0027assertTrue\u0027, \u0027assertFalse\u0027]"},{"line_number":182,"context_line":"    for method in methods:"},{"line_number":183,"context_line":"        start \u003d logical_line.find(\u0027.%s\u0027 % method) + 1"},{"line_number":184,"context_line":"        if start !\u003d 0:"},{"line_number":185,"context_line":"            break"},{"line_number":186,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a95cdbc_6736cbe8","line":183,"range":{"start_line":183,"start_character":51,"end_line":183,"end_character":52},"updated":"2016-10-06 07:23:50.000000000","message":"the +1 is a little bit surprising and it doesn\u0027t seem useful since you don\u0027t use start below.\n\nif (\u0027.%s\u0027 % method) in logical_line:\n    break","commit_id":"a2f620820a7ffbc4b01e813e75dd12ce6f90c2bb"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"5f0024429777cc284c9de875038d38cdf7897f4b","unresolved":false,"context_lines":[{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    methods \u003d [\u0027assertTrue\u0027, \u0027assertFalse\u0027]"},{"line_number":182,"context_line":"    for method in methods:"},{"line_number":183,"context_line":"        start \u003d logical_line.find(\u0027.%s\u0027 % method) + 1"},{"line_number":184,"context_line":"        if start !\u003d 0:"},{"line_number":185,"context_line":"            break"},{"line_number":186,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a95cdbc_1a0c3a40","line":183,"in_reply_to":"1a95cdbc_6736cbe8","updated":"2016-10-07 11:02:10.000000000","message":"I *do* use start below, see the \"yield\" line :)","commit_id":"a2f620820a7ffbc4b01e813e75dd12ce6f90c2bb"}],"hacking/checks/other.py":[{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"66db252b2dbf6ee4e531fb6be9bd3cfcb5db430d","unresolved":false,"context_lines":[{"line_number":60,"context_line":"RE_ASSERT_LESS_EQUAL \u003d re.compile(r\"self.assertTrue(.*\u003c\u003d.*)\")"},{"line_number":61,"context_line":"RE_ASSERT_EQUAL \u003d re.compile(r\"self.assertTrue(.*\u003d\u003d.*)\")"},{"line_number":62,"context_line":"RE_ASSERT_NOT_EQUAL \u003d re.compile(r\"self.assertTrue(.*!\u003d.*)\")"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"@core.flake8ext"},{"line_number":66,"context_line":"@core.off_by_default"}],"source_content_type":"text/x-python","patch_set":1,"id":"9ad45d7e_a6c83656","line":63,"updated":"2016-08-11 16:07:00.000000000","message":"So  we might end up with some false positives, such as self.assertTrue(x \u003c y \u003c z), but this checker is disabled by default, and devs can use \"noqa\", so it might not be such a big deal. There might a better regexp, though.","commit_id":"546f19f4178446149897ce16ca4556f4b93dfe94"}]}
