)]}'
{"manila/hacking/checks.py":[{"author":{"_account_id":11047,"name":"Mark Sturdevant","email":"mark.sturdevant@ibm.com","username":"markstur"},"change_message_id":"691642209fcc1021f2d050d5e20e2a6a96813894","unresolved":false,"context_lines":[{"line_number":172,"context_line":"                return super(CheckLoggingFormatArgs, self).generic_visit(node)"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"            # obj must be a logger instance and method must be a log helper"},{"line_number":175,"context_line":"            if (obj_name !\u003d \u0027LOG\u0027"},{"line_number":176,"context_line":"                    or method_name not in self.LOG_METHODS):"},{"line_number":177,"context_line":"                return super(CheckLoggingFormatArgs, self).generic_visit(node)"},{"line_number":178,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_8c111407","line":175,"range":{"start_line":175,"start_character":16,"end_line":175,"end_character":33},"updated":"2016-05-26 04:05:28.000000000","message":"awesome. I just learned I can bypass hacking by using a name other than LOG. :)  Probably should be improved with type checking instead of name checking (extra credit?). I see this is consistent with earlier checks. It could merge as-is and be improved later.","commit_id":"be1056563cab0f6804c42fcb4b1624d7aea48620"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"08f55713ad526bdc9bedfb872af8081de7ecb7c1","unresolved":false,"context_lines":[{"line_number":172,"context_line":"                return super(CheckLoggingFormatArgs, self).generic_visit(node)"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"            # obj must be a logger instance and method must be a log helper"},{"line_number":175,"context_line":"            if (obj_name !\u003d \u0027LOG\u0027"},{"line_number":176,"context_line":"                    or method_name not in self.LOG_METHODS):"},{"line_number":177,"context_line":"                return super(CheckLoggingFormatArgs, self).generic_visit(node)"},{"line_number":178,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_fc7fa414","line":175,"range":{"start_line":175,"start_character":16,"end_line":175,"end_character":33},"in_reply_to":"bab6814e_8c111407","updated":"2016-05-26 10:10:09.000000000","message":"I think that this is actually pretty hard to do with an Abstract Syntax Checker.  If we had semantic information, we could check that isinstance(this_object, logging.Logger).  But all we have is the name of the object.\n\nAny ideas?","commit_id":"be1056563cab0f6804c42fcb4b1624d7aea48620"}],"manila/tests/test_hacking.py":[{"author":{"_account_id":11865,"name":"Clinton Knight","email":"cknight@netapp.com","username":"cknight"},"change_message_id":"24f94eb7e200c6d7014457fce14d9f2ffc30927a","unresolved":false,"context_lines":[{"line_number":129,"context_line":"    def _assert_has_no_errors(self, code, checker, filename\u003dNone):"},{"line_number":130,"context_line":"        self._assert_has_errors(code, checker, filename\u003dfilename)"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    def test_logging_format_args(self):"},{"line_number":133,"context_line":"        checker \u003d checks.CheckLoggingFormatArgs"},{"line_number":134,"context_line":"        code \u003d \"\"\""},{"line_number":135,"context_line":"               import logging"}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_ce77b839","line":132,"range":{"start_line":132,"start_character":8,"end_line":132,"end_character":32},"updated":"2016-05-25 13:15:40.000000000","message":"This method is really several tests.  Can you split it up?  And you could use DDT for the one that uses all LOG_METHODS.","commit_id":"9063ae526f290f5204972c16f18fd10b65b928b0"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"4ee09ab24670080696e20d262beec92f28660049","unresolved":false,"context_lines":[{"line_number":129,"context_line":"    def _assert_has_no_errors(self, code, checker, filename\u003dNone):"},{"line_number":130,"context_line":"        self._assert_has_errors(code, checker, filename\u003dfilename)"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    def test_logging_format_args(self):"},{"line_number":133,"context_line":"        checker \u003d checks.CheckLoggingFormatArgs"},{"line_number":134,"context_line":"        code \u003d \"\"\""},{"line_number":135,"context_line":"               import logging"}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_df4f60bc","line":132,"range":{"start_line":132,"start_character":8,"end_line":132,"end_character":32},"in_reply_to":"bab6814e_ce77b839","updated":"2016-05-25 13:55:50.000000000","message":"Good idea.","commit_id":"9063ae526f290f5204972c16f18fd10b65b928b0"},{"author":{"_account_id":11047,"name":"Mark Sturdevant","email":"mark.sturdevant@ibm.com","username":"markstur"},"change_message_id":"93a5fdcec03d940fcac56e7656f4d1c3e5111ec7","unresolved":false,"context_lines":[{"line_number":131,"context_line":"    def _assert_has_no_errors(self, code, checker, filename\u003dNone):"},{"line_number":132,"context_line":"        self._assert_has_errors(code, checker, filename\u003dfilename)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def test_logging_format_args_single_argument(self):"},{"line_number":135,"context_line":"        checker \u003d checks.CheckLoggingFormatArgs"},{"line_number":136,"context_line":"        code \u003d \"\"\""},{"line_number":137,"context_line":"               import logging"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_317f9fac","line":134,"range":{"start_line":134,"start_character":33,"end_line":134,"end_character":48},"updated":"2016-05-26 03:53:19.000000000","message":"this name is wrong now. Test is for varying args.","commit_id":"be1056563cab0f6804c42fcb4b1624d7aea48620"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"08f55713ad526bdc9bedfb872af8081de7ecb7c1","unresolved":false,"context_lines":[{"line_number":131,"context_line":"    def _assert_has_no_errors(self, code, checker, filename\u003dNone):"},{"line_number":132,"context_line":"        self._assert_has_errors(code, checker, filename\u003dfilename)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def test_logging_format_args_single_argument(self):"},{"line_number":135,"context_line":"        checker \u003d checks.CheckLoggingFormatArgs"},{"line_number":136,"context_line":"        code \u003d \"\"\""},{"line_number":137,"context_line":"               import logging"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_99cdca33","line":134,"range":{"start_line":134,"start_character":33,"end_line":134,"end_character":48},"in_reply_to":"bab6814e_317f9fac","updated":"2016-05-26 10:10:09.000000000","message":"You are right, Thanks.","commit_id":"be1056563cab0f6804c42fcb4b1624d7aea48620"},{"author":{"_account_id":11047,"name":"Mark Sturdevant","email":"mark.sturdevant@ibm.com","username":"markstur"},"change_message_id":"93a5fdcec03d940fcac56e7656f4d1c3e5111ec7","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        self._assert_has_no_errors(code, checker)"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    @ddt.data(*checks.CheckLoggingFormatArgs.LOG_METHODS)"},{"line_number":147,"context_line":"    def test_logging_bad_format_multiple_arguments(self, log_method):"},{"line_number":148,"context_line":"        checker \u003d checks.CheckLoggingFormatArgs"},{"line_number":149,"context_line":"        code \u003d \"\"\""},{"line_number":150,"context_line":"               import logging"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_b141cf65","line":147,"range":{"start_line":147,"start_character":32,"end_line":147,"end_character":50},"updated":"2016-05-26 03:53:19.000000000","message":"apparently this is confusing. Test is for tuple arg.","commit_id":"be1056563cab0f6804c42fcb4b1624d7aea48620"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"08f55713ad526bdc9bedfb872af8081de7ecb7c1","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        self._assert_has_no_errors(code, checker)"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    @ddt.data(*checks.CheckLoggingFormatArgs.LOG_METHODS)"},{"line_number":147,"context_line":"    def test_logging_bad_format_multiple_arguments(self, log_method):"},{"line_number":148,"context_line":"        checker \u003d checks.CheckLoggingFormatArgs"},{"line_number":149,"context_line":"        code \u003d \"\"\""},{"line_number":150,"context_line":"               import logging"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_b9efee85","line":147,"range":{"start_line":147,"start_character":32,"end_line":147,"end_character":50},"in_reply_to":"bab6814e_b141cf65","updated":"2016-05-26 10:10:09.000000000","message":"Yeah, another bad name :(","commit_id":"be1056563cab0f6804c42fcb4b1624d7aea48620"},{"author":{"_account_id":11047,"name":"Mark Sturdevant","email":"mark.sturdevant@ibm.com","username":"markstur"},"change_message_id":"93a5fdcec03d940fcac56e7656f4d1c3e5111ec7","unresolved":false,"context_lines":[{"line_number":161,"context_line":"               import logging"},{"line_number":162,"context_line":"               LOG \u003d logging.getLogger()"},{"line_number":163,"context_line":"               LOG.log(logging.DEBUG, \"Volume %s caught fire and is at %d\""},{"line_number":164,"context_line":"                       \" degrees C and climbing.\", (\u0027volume1\u0027, 500))"},{"line_number":165,"context_line":"               \"\"\""},{"line_number":166,"context_line":"        self._assert_has_errors(code, checker,"},{"line_number":167,"context_line":"                                expected_errors\u003d[(4, 37, \u0027M310\u0027)])"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_f15fd73e","line":164,"range":{"start_line":164,"start_character":51,"end_line":164,"end_character":67},"updated":"2016-05-26 03:53:19.000000000","message":"this tuple test is covered above. Does this test add any value?","commit_id":"be1056563cab0f6804c42fcb4b1624d7aea48620"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"08f55713ad526bdc9bedfb872af8081de7ecb7c1","unresolved":false,"context_lines":[{"line_number":161,"context_line":"               import logging"},{"line_number":162,"context_line":"               LOG \u003d logging.getLogger()"},{"line_number":163,"context_line":"               LOG.log(logging.DEBUG, \"Volume %s caught fire and is at %d\""},{"line_number":164,"context_line":"                       \" degrees C and climbing.\", (\u0027volume1\u0027, 500))"},{"line_number":165,"context_line":"               \"\"\""},{"line_number":166,"context_line":"        self._assert_has_errors(code, checker,"},{"line_number":167,"context_line":"                                expected_errors\u003d[(4, 37, \u0027M310\u0027)])"}],"source_content_type":"text/x-python","patch_set":2,"id":"bab6814e_999b0a18","line":164,"range":{"start_line":164,"start_character":51,"end_line":164,"end_character":67},"in_reply_to":"bab6814e_f15fd73e","updated":"2016-05-26 10:10:09.000000000","message":"Well it\u0027s supposed to show that the tuple check works even with this more involved logging syntax.  I\u0027m inclined to remove it though unless one of the reviewers thinks it should come back with a more targeted name.","commit_id":"be1056563cab0f6804c42fcb4b1624d7aea48620"}]}
