From d823d08abee91df519eee3f503178fe0dd5eb141 Mon Sep 17 00:00:00 2001 From: "Mr. Senko" Date: Mon, 25 Jun 2018 16:31:58 +0300 Subject: [PATCH] Add linter for raw SQL, refs #36 --- kiwi_lint/__init__.py | 2 ++ kiwi_lint/raw_sql.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 kiwi_lint/raw_sql.py diff --git a/kiwi_lint/__init__.py b/kiwi_lint/__init__.py index 4ec77e144f..4ad83ce2db 100644 --- a/kiwi_lint/__init__.py +++ b/kiwi_lint/__init__.py @@ -6,9 +6,11 @@ from .dunder_attributes import DunderClassAttributeChecker from .list_comprehension import ListComprehensionChecker from .docstring import DocstringChecker +from .raw_sql import RawSQLChecker def register(linter): linter.register_checker(DunderClassAttributeChecker(linter)) linter.register_checker(ListComprehensionChecker(linter)) linter.register_checker(DocstringChecker(linter)) + linter.register_checker(RawSQLChecker(linter)) diff --git a/kiwi_lint/raw_sql.py b/kiwi_lint/raw_sql.py new file mode 100644 index 0000000000..e93f32a3b7 --- /dev/null +++ b/kiwi_lint/raw_sql.py @@ -0,0 +1,28 @@ +# Copyright (c) 2018 Alexander Todorov + +# Licensed under the GPL 2.0: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html + +import astroid + +from pylint import interfaces +from pylint import checkers +from pylint.checkers import utils + + +class RawSQLChecker(checkers.BaseChecker): + __implements__ = (interfaces.IAstroidChecker,) + + name = 'raw-sql-checker' + + msgs = {'R4431': ('Avoid using raw SQL', + 'avoid-raw-sql', + 'Avoid raw SQL, use Django ORM queries instead')} + + @utils.check_messages('avoid-raw-sql') + def visit_attribute(self, node): + # looking for .extra(select={}) patterns + if node.attrname == 'extra' and isinstance(node.parent, astroid.Call): + for keyword in node.parent.keywords: + if keyword.arg == 'select': + self.add_message('avoid-raw-sql', node=node) + break