[IMP] test_pylint: check for badly written try/except

This commit is contained in:
Christophe Simonis
2017-08-07 15:02:56 +02:00
parent 9882f24313
commit 0ebe59f5d0
2 changed files with 58 additions and 3 deletions
@@ -0,0 +1,44 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tokenize
from pylint import checkers, interfaces
class PEP3110TokenChecker(checkers.BaseTokenChecker):
__implements__ = interfaces.ITokenChecker
name = 'python3'
enabled = False
msgs = {
'E3110': ('Python 3 uses `as` instead of comma token to catch exceptions',
'no-comma-exception',
'See http://www.python.org/dev/peps/pep-3110/',
{'maxversion': (3, 0)}),
}
def process_tokens(self, tokens):
comma_found = in_except = False
pcount = 0
for tok_type, token, start, _, _ in tokens:
if tok_type == tokenize.NAME and token == 'except':
in_except = True
comma_found = False
pcount = 0
elif tok_type == tokenize.OP and in_except:
if token == '(':
pcount += 1
elif token == ')':
pcount -= 1
elif token == ',' and pcount == 0:
comma_found = True
if token == ':':
if in_except and comma_found:
self.add_message('no-comma-exception', line=start[0])
comma_found = in_except = False
pcount = 0
def register(linter):
linter.register_checker(PEP3110TokenChecker(linter))
+14 -3
View File
@@ -8,13 +8,14 @@ except ImportError:
pylint = None
import subprocess
from distutils.version import LooseVersion
from os import devnull
import os
from os.path import join
from odoo.tests.common import TransactionCase
from odoo import tools
from odoo.modules import get_modules, get_module_path
HERE = os.path.dirname(os.path.realpath(__file__))
_logger = logging.getLogger(__name__)
@@ -54,6 +55,8 @@ class TestPyLint(TransactionCase):
'old-raise-syntax',
'raising-string',
'unpacking-in-except',
'no-comma-exception',
]
BAD_FUNCTIONS = [
@@ -115,13 +118,21 @@ class TestPyLint(TransactionCase):
'--enable=%s' % ','.join(self.ENABLED_CODES),
'--reports=n',
"--msg-template='{msg} ({msg_id}) at {path}:{line}'",
'--load-plugins=pylint.extensions.bad_builtin',
'--load-plugins=pylint.extensions.bad_builtin,_odoo_checkers',
'--bad-functions=%s' % ','.join(self.BAD_FUNCTIONS),
'--deprecated-modules=%s' % ','.join(self.BAD_MODULES)
]
pypath = HERE + os.pathsep + os.environ.get('PYTHONPATH', '')
env = dict(os.environ, PYTHONPATH=pypath)
try:
process = subprocess.Popen(['pylint'] + options + paths, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
pylint_bin = tools.which('pylint')
process = subprocess.Popen(
[pylint_bin] + options + paths,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
env=env,
)
except (OSError, IOError):
self._skip_test('pylint executable not found in the path')
else: