)]}'
{"mistral/hacking/checks.py":[{"author":{"_account_id":6732,"name":"Lingxian Kong","email":"anlin.kong@gmail.com","username":"kong"},"change_message_id":"da4620f203794bf07f3f9584dfe079cc272acc41","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        \u0027error\u0027: \u0027_LE\u0027,"},{"line_number":100,"context_line":"        \u0027exception\u0027: \u0027_LE\u0027,"},{"line_number":101,"context_line":"        \u0027critical\u0027: \u0027_LC\u0027,"},{"line_number":102,"context_line":"    }"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def __init__(self, tree, filename):"},{"line_number":105,"context_line":"        super(CheckForLoggingIssues, self).__init__(tree, filename)"}],"source_content_type":"text/x-python","patch_set":7,"id":"da6ed579_c6bda103","line":102,"updated":"2016-01-18 11:18:50.000000000","message":"Mistral didn\u0027t adopt oslo.i18n yet, so what\u0027s the purpose of this dict here?","commit_id":"e3eabe09e012dfa0c85f80e212bca242c79c5d7c"},{"author":{"_account_id":6732,"name":"Lingxian Kong","email":"anlin.kong@gmail.com","username":"kong"},"change_message_id":"da4620f203794bf07f3f9584dfe079cc272acc41","unresolved":false,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        self.logger_names \u003d []"},{"line_number":108,"context_line":"        self.logger_module_names \u003d []"},{"line_number":109,"context_line":"        self.i18n_names \u003d {}"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        # NOTE(dstanek): this kinda accounts for scopes when talking"},{"line_number":112,"context_line":"        # about only leaf node in the graph"}],"source_content_type":"text/x-python","patch_set":7,"id":"da6ed579_cb05aa14","line":109,"updated":"2016-01-18 11:18:50.000000000","message":"How this variable is initialized?","commit_id":"e3eabe09e012dfa0c85f80e212bca242c79c5d7c"},{"author":{"_account_id":8592,"name":"Anastasia Kuznetsova","email":"akuznetsova@mirantis.com","username":"nastya-kuz"},"change_message_id":"56b9e241c7014d5468296794e881c2e7a80f5d53","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        if module_name in self.LOG_MODULES:"},{"line_number":121,"context_line":"            self.logger_module_names.append(alias.asname or alias.name)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def visit_Import(self, node):"},{"line_number":124,"context_line":"        for alias in node.names:"},{"line_number":125,"context_line":"            self._filter_imports(alias.name, alias)"},{"line_number":126,"context_line":"        return super(CheckForLoggingIssues, self).generic_visit(node)"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba63e191_81fc893f","line":123,"updated":"2016-01-19 10:39:24.000000000","message":"I would prefer to use one code style for method names: visit_Import -\u003e visit_import.","commit_id":"4f7955837560201b0807de6962634a91d6855c4e"},{"author":{"_account_id":8592,"name":"Anastasia Kuznetsova","email":"akuznetsova@mirantis.com","username":"nastya-kuz"},"change_message_id":"56b9e241c7014d5468296794e881c2e7a80f5d53","unresolved":false,"context_lines":[{"line_number":125,"context_line":"            self._filter_imports(alias.name, alias)"},{"line_number":126,"context_line":"        return super(CheckForLoggingIssues, self).generic_visit(node)"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    def visit_ImportFrom(self, node):"},{"line_number":129,"context_line":"        for alias in node.names:"},{"line_number":130,"context_line":"            full_name \u003d \u0027%s.%s\u0027 % (node.module, alias.name)"},{"line_number":131,"context_line":"            self._filter_imports(full_name, alias)"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba63e191_61f39574","line":128,"updated":"2016-01-19 10:39:24.000000000","message":"Ditto, visit_ImportFrom -\u003e visit_import_from","commit_id":"4f7955837560201b0807de6962634a91d6855c4e"},{"author":{"_account_id":8592,"name":"Anastasia Kuznetsova","email":"akuznetsova@mirantis.com","username":"nastya-kuz"},"change_message_id":"56b9e241c7014d5468296794e881c2e7a80f5d53","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        else:  # could be Subscript, Call or many more"},{"line_number":148,"context_line":"            return None"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    def visit_Assign(self, node):"},{"line_number":151,"context_line":"        \"\"\"Look for \u0027LOG \u003d logging.getLogger\u0027"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        This handles the simple case:"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba63e191_21ed9d8b","line":150,"updated":"2016-01-19 10:39:24.000000000","message":"ditto","commit_id":"4f7955837560201b0807de6962634a91d6855c4e"},{"author":{"_account_id":8592,"name":"Anastasia Kuznetsova","email":"akuznetsova@mirantis.com","username":"nastya-kuz"},"change_message_id":"56b9e241c7014d5468296794e881c2e7a80f5d53","unresolved":false,"context_lines":[{"line_number":196,"context_line":""},{"line_number":197,"context_line":"        return super(CheckForLoggingIssues, self).generic_visit(node)"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"    def visit_Call(self, node):"},{"line_number":200,"context_line":"        \"\"\"Look for the \u0027LOG.*\u0027 calls.\"\"\""},{"line_number":201,"context_line":"        # obj.method"},{"line_number":202,"context_line":"        if isinstance(node.func, ast.Attribute):"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba63e191_e1ff8532","line":199,"updated":"2016-01-19 10:39:24.000000000","message":"ditto","commit_id":"4f7955837560201b0807de6962634a91d6855c4e"},{"author":{"_account_id":18238,"name":"Hardik Parekh","email":"hardik.parekh047@gmail.com","username":"hparekh"},"change_message_id":"801637e1b21ca53d32f4f338db70da94d5a2ac3a","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"class CheckForLoggingIssues(BaseASTChecker):"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    USING_DEPRECATED_WARN \u003d \u0027K009 Using the deprecated Logger.warn\u0027"},{"line_number":94,"context_line":"    LOG_MODULES \u003d (\u0027logging\u0027, \u0027oslo_log.log\u0027)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def __init__(self, tree, filename):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a68dd71_fde841e4","line":93,"range":{"start_line":93,"start_character":29,"end_line":93,"end_character":67},"updated":"2016-01-22 05:49:49.000000000","message":"I am wonder about this code. In pep such code is used for following purpose \n    E***/W***: pep8 errors and warnings\n    F***: PyFlakes codes (see below)\n    C9**: McCabe complexity plugin mccabe\n    N8**: Naming Conventions plugin pep8-naming\nAs this code is copied from keystone K009 is used, where\nk stands for keystone, rule number 009.\nSo I think we should use M001 instead of K009.","commit_id":"ffe024cf321d72899f38a95238c7dfc59eaa8735"},{"author":{"_account_id":18238,"name":"Hardik Parekh","email":"hardik.parekh047@gmail.com","username":"hparekh"},"change_message_id":"801637e1b21ca53d32f4f338db70da94d5a2ac3a","unresolved":false,"context_lines":[{"line_number":116,"context_line":"                self.visit(value)"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def _filter_imports(self, module_name, alias):"},{"line_number":119,"context_line":"        \"\"\"Keeps lists of logging and i18n imports.\"\"\""},{"line_number":120,"context_line":"        if module_name in self.LOG_MODULES:"},{"line_number":121,"context_line":"            self.logger_module_names.append(alias.asname or alias.name)"},{"line_number":122,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9a68dd71_c06316db","line":119,"range":{"start_line":119,"start_character":38,"end_line":119,"end_character":43},"updated":"2016-01-22 05:49:49.000000000","message":"soft: should be removed","commit_id":"ffe024cf321d72899f38a95238c7dfc59eaa8735"},{"author":{"_account_id":18238,"name":"Hardik Parekh","email":"hardik.parekh047@gmail.com","username":"hparekh"},"change_message_id":"801637e1b21ca53d32f4f338db70da94d5a2ac3a","unresolved":false,"context_lines":[{"line_number":215,"context_line":"                self.add_error(msg, message\u003dself.USING_DEPRECATED_WARN)"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"            # must be a logger instance and one of the support logging methods"},{"line_number":218,"context_line":"            if (obj_name not in self.logger_names):"},{"line_number":219,"context_line":"                return super(CheckForLoggingIssues, self).generic_visit(node)"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"            # the call must have arguments"},{"line_number":222,"context_line":"            if not len(node.args):"},{"line_number":223,"context_line":"                return super(CheckForLoggingIssues, self).generic_visit(node)"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"        return super(CheckForLoggingIssues, self).generic_visit(node)"},{"line_number":226,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9a68dd71_5deb8db0","line":223,"range":{"start_line":218,"start_character":12,"end_line":223,"end_character":77},"updated":"2016-01-22 05:49:49.000000000","message":"We can combine this.","commit_id":"ffe024cf321d72899f38a95238c7dfc59eaa8735"},{"author":{"_account_id":18238,"name":"Hardik Parekh","email":"hardik.parekh047@gmail.com","username":"hparekh"},"change_message_id":"21a5fbae70deb5686dc05d07333ac026639377b8","unresolved":false,"context_lines":[{"line_number":216,"context_line":""},{"line_number":217,"context_line":"            # must be a logger instance and one of the support logging methods"},{"line_number":218,"context_line":"            # in addition, the call must have arguments"},{"line_number":219,"context_line":"            if (obj_name not in self.logger_names and not len(node.args)):"},{"line_number":220,"context_line":"                return super(CheckForLoggingIssues, self).generic_visit(node)"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"        return super(CheckForLoggingIssues, self).generic_visit(node)"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a68dd71_2b7093db","line":219,"range":{"start_line":219,"start_character":50,"end_line":219,"end_character":53},"updated":"2016-01-24 23:50:33.000000000","message":"in previous patch it was\nif (obj_name not in self.logger_names):\n   return super(CheckForLoggingIssues, self).generic_visit(node)\n\n# the call must have arguments\nif not len(node.args):\n    return super(CheckForLoggingIssues, self).generic_visit(node)\n\nSo I think you have to use \"or\" instead of \"and\".","commit_id":"f03e50806dd7f9c3cd74b257591cdc5bb8a88d8b"},{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"0ff229406d76d55abd37e40eac5cd77548db6b17","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"In order to make the review process faster and easier for core devs we are"},{"line_number":16,"context_line":"adding some Mistral specific pep8 checks. This will catch common errors"},{"line_number":17,"context_line":"so that core devs don\u0027t have to."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"There are two types of pep8 extensions. One is a function that takes either"},{"line_number":20,"context_line":"a physical or logical line. The physical or logical line is the first param"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a57f1b5_f1c7b261","line":17,"range":{"start_line":17,"start_character":29,"end_line":17,"end_character":31},"updated":"2016-02-12 20:35:32.000000000","message":"have to what?","commit_id":"2645b509769e7d64506cd427322a5aaec185dc19"},{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"0ff229406d76d55abd37e40eac5cd77548db6b17","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        self.logger_names \u003d []"},{"line_number":100,"context_line":"        self.logger_module_names \u003d []"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        # NOTE(dstanek): this kinda accounts for scopes when talking"},{"line_number":103,"context_line":"        # about only leaf node in the graph"},{"line_number":104,"context_line":"        self.assignments \u003d {}"},{"line_number":105,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"3a57f1b5_a3dfb138","line":102,"range":{"start_line":102,"start_character":15,"end_line":102,"end_character":22},"updated":"2016-02-12 20:35:32.000000000","message":"Who is dstanek? My guess is that it\u0027s all been copy-pasted from somewhere. If yes, could please point to the origin?","commit_id":"2645b509769e7d64506cd427322a5aaec185dc19"},{"author":{"_account_id":8592,"name":"Anastasia Kuznetsova","email":"akuznetsova@mirantis.com","username":"nastya-kuz"},"change_message_id":"5fa74582fdd40b5da0b0e4c9af029ba68b457aee","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def no_log_warn(logical_line):"},{"line_number":42,"context_line":"    if logical_line.startswith(\u0027LOG.warn(\u0027):"},{"line_number":43,"context_line":"        yield(0, \u0027M001 Use LOG.warning() rather than LOG.warn()\u0027)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"fa0719c6_9eb0a48d","line":42,"range":{"start_line":42,"start_character":20,"end_line":42,"end_character":44},"updated":"2016-03-21 12:50:39.000000000","message":"I think that this check should be more strict, probably you can use some regex here, also I suggest to add some unit tests","commit_id":"856deb4866285fe536a036f1630a4c2cad6fa66a"}],"mistral/tests/unit/core.py":[{"author":{"_account_id":18238,"name":"Hardik Parekh","email":"hardik.parekh047@gmail.com","username":"hparekh"},"change_message_id":"297a6d5d5de3cf3aa38f196c19080fcb3429844a","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from oslotest import mockpatch"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"class BaseTestCase(oslotest.BaseTestCase):"},{"line_number":23,"context_line":"    \"\"\"Light weight base test class."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    This is a placeholder that will eventually go away once the"}],"source_content_type":"text/x-python","patch_set":1,"id":"da6ed579_3cc0a44f","line":22,"range":{"start_line":22,"start_character":6,"end_line":22,"end_character":18},"updated":"2016-01-15 13:54:27.000000000","message":"We already have BaseTest and other base test in base.py\nPlease add this class to base.py\nand remove this file","commit_id":"3212df6ec740523c9632831dcf1a91962601e93a"}],"mistral/tests/unit/hacking/test_checks.py":[{"author":{"_account_id":8592,"name":"Anastasia Kuznetsova","email":"akuznetsova@mirantis.com","username":"nastya-kuz"},"change_message_id":"56b9e241c7014d5468296794e881c2e7a80f5d53","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        checker \u003d pep8.Checker(lines\u003dlines)"},{"line_number":46,"context_line":"        checker.check_all()"},{"line_number":47,"context_line":"        checker.report._deferred_print.sort()"},{"line_number":48,"context_line":"        return checker.report._deferred_print"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def assert_has_errors(self, code, expected_errors\u003dNone):"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba63e191_8181e991","line":47,"updated":"2016-01-19 10:39:24.000000000","message":"Please, add blank line before return statement","commit_id":"4f7955837560201b0807de6962634a91d6855c4e"},{"author":{"_account_id":8592,"name":"Anastasia Kuznetsova","email":"akuznetsova@mirantis.com","username":"nastya-kuz"},"change_message_id":"56b9e241c7014d5468296794e881c2e7a80f5d53","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        return checker.report._deferred_print"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def assert_has_errors(self, code, expected_errors\u003dNone):"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        # pull out the parts of the error that we\u0027ll match against"},{"line_number":53,"context_line":"        actual_errors \u003d (e[:3] for e in self.run_check(code))"},{"line_number":54,"context_line":"        # adjust line numbers to make the fixture data more readable."}],"source_content_type":"text/x-python","patch_set":8,"id":"ba63e191_21727de6","line":51,"updated":"2016-01-19 10:39:24.000000000","message":"Let\u0027s remove this extra blank line","commit_id":"4f7955837560201b0807de6962634a91d6855c4e"},{"author":{"_account_id":8592,"name":"Anastasia Kuznetsova","email":"akuznetsova@mirantis.com","username":"nastya-kuz"},"change_message_id":"56b9e241c7014d5468296794e881c2e7a80f5d53","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"class TestLoggingWithWarn(BaseLoggingCheck):"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def test(self):"},{"line_number":64,"context_line":"        data \u003d self.code_ex.assert_not_using_deprecated_warn"},{"line_number":65,"context_line":"        code \u003d self.code_ex.shared_imports + data[\u0027code\u0027]"},{"line_number":66,"context_line":"        errors \u003d data[\u0027expected_errors\u0027]"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba63e191_e12225b9","line":63,"updated":"2016-01-19 10:39:24.000000000","message":"\"test\" is not an informative name of the test","commit_id":"4f7955837560201b0807de6962634a91d6855c4e"},{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"0ff229406d76d55abd37e40eac5cd77548db6b17","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from mistral.tests.unit.ksfixtures import hacking as hacking_fixtures"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class BaseLoggingCheck(base.BaseTest):"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def setUp(self):"},{"line_number":26,"context_line":"        super(BaseLoggingCheck, self).setUp()"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a57f1b5_b14dba9b","line":23,"range":{"start_line":23,"start_character":6,"end_line":23,"end_character":22},"updated":"2016-02-12 20:35:32.000000000","message":"BaseLoggingCheck -\u003e BaseLoggingCheckTest","commit_id":"2645b509769e7d64506cd427322a5aaec185dc19"},{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"0ff229406d76d55abd37e40eac5cd77548db6b17","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def setUp(self):"},{"line_number":26,"context_line":"        super(BaseLoggingCheck, self).setUp()"},{"line_number":27,"context_line":"        self.code_ex \u003d self.useFixture(self.get_fixture())"},{"line_number":28,"context_line":"        self.addCleanup(delattr, self, \u0027code_ex\u0027)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def get_checker(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a57f1b5_11536e3a","line":27,"range":{"start_line":27,"start_character":13,"end_line":27,"end_character":20},"updated":"2016-02-12 20:35:32.000000000","message":"Soft: I\u0027d prefer to see a blank line after a call to a superclass.","commit_id":"2645b509769e7d64506cd427322a5aaec185dc19"},{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"0ff229406d76d55abd37e40eac5cd77548db6b17","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        return checker.report._deferred_print"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def assert_has_errors(self, code, expected_errors\u003dNone):"},{"line_number":50,"context_line":"        # pull out the parts of the error that we\u0027ll match against"},{"line_number":51,"context_line":"        actual_errors \u003d (e[:3] for e in self.run_check(code))"},{"line_number":52,"context_line":"        # adjust line numbers to make the fixture data more readable."},{"line_number":53,"context_line":"        import_lines \u003d len(self.code_ex.shared_imports.split(\u0027\\n\u0027)) - 1"}],"source_content_type":"text/x-python","patch_set":11,"id":"3a57f1b5_031d6565","line":50,"range":{"start_line":50,"start_character":10,"end_line":50,"end_character":66},"updated":"2016-02-12 20:35:32.000000000","message":"Several style things:\n* All comments and docstrings must be compliant with English grammer. Particularly starting with a capital and ending with a period\n* Please insert blank lines before line comments, otherwise they are not easy to read.\n* I\u0027d prefer to separate assertion blocks with blank lines (before and after them).","commit_id":"2645b509769e7d64506cd427322a5aaec185dc19"}],"mistral/tests/unit/ksfixtures/hacking.py":[{"author":{"_account_id":6732,"name":"Lingxian Kong","email":"anlin.kong@gmail.com","username":"kong"},"change_message_id":"da4620f203794bf07f3f9584dfe079cc272acc41","unresolved":false,"context_lines":[{"line_number":29,"context_line":"                from oslo_log import log as oslo_logging"},{"line_number":30,"context_line":"    \"\"\""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    examples \u003d ["},{"line_number":33,"context_line":"        {"},{"line_number":34,"context_line":"            \u0027code\u0027: \"\"\""},{"line_number":35,"context_line":"                # stdlib logging"}],"source_content_type":"text/x-python","patch_set":7,"id":"da6ed579_eb1c2ec3","line":32,"updated":"2016-01-18 11:18:50.000000000","message":"I don\u0027t see this variable is used anywhere.","commit_id":"e3eabe09e012dfa0c85f80e212bca242c79c5d7c"},{"author":{"_account_id":18238,"name":"Hardik Parekh","email":"hardik.parekh047@gmail.com","username":"hparekh"},"change_message_id":"801637e1b21ca53d32f4f338db70da94d5a2ac3a","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# NOTE(morganfainberg) This file shouldn\u0027t have flake8 run on it as it has"},{"line_number":14,"context_line":"# code examples that will fail normal CI pep8/flake8 tests. This is expected."},{"line_number":15,"context_line":"# The code has been moved here to ensure that proper tests occur on the"},{"line_number":16,"context_line":"# test_hacking_checks test cases."},{"line_number":17,"context_line":"# flake8: noqa"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import fixtures"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a68dd71_206f9293","line":16,"range":{"start_line":16,"start_character":3,"end_line":16,"end_character":21},"updated":"2016-01-22 05:49:49.000000000","message":"soft: hacking/test_checks","commit_id":"ffe024cf321d72899f38a95238c7dfc59eaa8735"},{"author":{"_account_id":8731,"name":"Renat Akhmerov","email":"renat.akhmerov@gmail.com","username":"rakhmerov"},"change_message_id":"0ff229406d76d55abd37e40eac5cd77548db6b17","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"3a57f1b5_238bc169","updated":"2016-02-12 20:35:32.000000000","message":"Where does \"ksfixtures\" come from? Why \"ks\"?","commit_id":"2645b509769e7d64506cd427322a5aaec185dc19"}],"mistral/tests/unit/test_hacking_checks.py":[{"author":{"_account_id":18238,"name":"Hardik Parekh","email":"hardik.parekh047@gmail.com","username":"hparekh"},"change_message_id":"297a6d5d5de3cf3aa38f196c19080fcb3429844a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"da6ed579_5f80ea8a","updated":"2016-01-15 13:54:27.000000000","message":"this file should be in\nmistral/tests/unit/hacking/test_checks.py","commit_id":"3212df6ec740523c9632831dcf1a91962601e93a"},{"author":{"_account_id":18238,"name":"Hardik Parekh","email":"hardik.parekh047@gmail.com","username":"hparekh"},"change_message_id":"297a6d5d5de3cf3aa38f196c19080fcb3429844a","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"class TestCheckForNonDebugLoggingIssues(BaseLoggingCheck):"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def test_for_translations(self):"},{"line_number":96,"context_line":"        for example in self.code_ex.examples:"},{"line_number":97,"context_line":"            code \u003d self.code_ex.shared_imports + example[\u0027code\u0027]"},{"line_number":98,"context_line":"            errors \u003d example[\u0027expected_errors\u0027]"}],"source_content_type":"text/x-python","patch_set":1,"id":"da6ed579_1c636043","line":95,"range":{"start_line":95,"start_character":8,"end_line":95,"end_character":29},"updated":"2016-01-15 13:54:27.000000000","message":"Why to create three different class ?\nBetter you have one class as they inherit from\nsame parent class BaseLoggingCheck and give functions \nsome meaning full name.","commit_id":"3212df6ec740523c9632831dcf1a91962601e93a"}]}
