Switch to using flake8 to check for errors

This commit is contained in:
Kovid Goyal 2013-04-09 12:30:24 +05:30
parent 5a4e046f98
commit 47fb117828
5 changed files with 18 additions and 45 deletions

View File

@ -1,6 +1,3 @@
" Project wide builtins
let $PYFLAKES_BUILTINS = "_,dynamic_property,__,P,I,lopen,icu_lower,icu_upper,icu_title,ngettext"
" Include directories for C++ modules " Include directories for C++ modules
let g:syntastic_cpp_include_dirs = [ let g:syntastic_cpp_include_dirs = [
\'/usr/include/python2.7', \'/usr/include/python2.7',

4
setup.cfg Normal file
View File

@ -0,0 +1,4 @@
[flake8]
max-line-length = 160
builtins = _,dynamic_property,__,P,I,lopen,icu_lower,icu_upper,icu_title,ngettext
ignore = E12,E221,E301,E302,E304,E401,W391

View File

@ -22,40 +22,12 @@ class Message:
self.filename, self.lineno, self.msg = filename, lineno, msg self.filename, self.lineno, self.msg = filename, lineno, msg
def __str__(self): def __str__(self):
return '%s:%s: %s'%(self.filename, self.lineno, self.msg) return '%s:%s: %s' % (self.filename, self.lineno, self.msg)
def check_for_python_errors(code_string, filename):
import _ast
# First, compile into an AST and handle syntax errors.
try:
tree = compile(code_string, filename, "exec", _ast.PyCF_ONLY_AST)
except (SyntaxError, IndentationError) as value:
msg = value.args[0]
(lineno, offset, text) = value.lineno, value.offset, value.text
# If there's an encoding problem with the file, the text is None.
if text is None:
# Avoid using msg, since for the only known case, it contains a
# bogus message that claims the encoding the file declared was
# unknown.
msg = "%s: problem decoding source" % filename
return [Message(filename, lineno, msg)]
else:
checker = __import__('pyflakes.checker').checker
# Okay, it's syntactically valid. Now check it.
w = checker.Checker(tree, filename)
w.messages.sort(lambda a, b: cmp(a.lineno, b.lineno))
return [Message(x.filename, x.lineno, x.message%x.message_args) for x in
w.messages]
class Check(Command): class Check(Command):
description = 'Check for errors in the calibre source code' description = 'Check for errors in the calibre source code'
BUILTINS = ['_', '__', 'dynamic_property', 'I', 'P', 'lopen', 'icu_lower',
'icu_upper', 'icu_title', 'ngettext']
CACHE = '.check-cache.pickle' CACHE = '.check-cache.pickle'
def get_files(self, cache): def get_files(self, cache):
@ -65,8 +37,8 @@ class Check(Command):
mtime = os.stat(y).st_mtime mtime = os.stat(y).st_mtime
if cache.get(y, 0) == mtime: if cache.get(y, 0) == mtime:
continue continue
if (f.endswith('.py') and f not in ('feedparser.py', if (f.endswith('.py') and f not in (
'pyparsing.py', 'markdown.py') and 'feedparser.py', 'pyparsing.py', 'markdown.py') and
'prs500/driver.py' not in y): 'prs500/driver.py' not in y):
yield y, mtime yield y, mtime
if f.endswith('.coffee'): if f.endswith('.coffee'):
@ -79,21 +51,18 @@ class Check(Command):
if f.endswith('.recipe') and cache.get(f, 0) != mtime: if f.endswith('.recipe') and cache.get(f, 0) != mtime:
yield f, mtime yield f, mtime
def run(self, opts): def run(self, opts):
cache = {} cache = {}
if os.path.exists(self.CACHE): if os.path.exists(self.CACHE):
cache = cPickle.load(open(self.CACHE, 'rb')) cache = cPickle.load(open(self.CACHE, 'rb'))
builtins = list(set_builtins(self.BUILTINS))
for f, mtime in self.get_files(cache): for f, mtime in self.get_files(cache):
self.info('\tChecking', f) self.info('\tChecking', f)
errors = False errors = False
ext = os.path.splitext(f)[1] ext = os.path.splitext(f)[1]
if ext in {'.py', '.recipe'}: if ext in {'.py', '.recipe'}:
w = check_for_python_errors(open(f, 'rb').read(), f) p = subprocess.Popen(['flake8', '--ignore=E,W', f])
if w: if p.wait() != 0:
errors = True errors = True
self.report_errors(w)
else: else:
from calibre.utils.serve_coffee import check_coffeescript from calibre.utils.serve_coffee import check_coffeescript
try: try:
@ -106,8 +75,6 @@ class Check(Command):
self.j(self.SRC, '../session.vim'), '-f', f]) self.j(self.SRC, '../session.vim'), '-f', f])
raise SystemExit(1) raise SystemExit(1)
cache[f] = mtime cache[f] = mtime
for x in builtins:
delattr(__builtin__, x)
cPickle.dump(cache, open(self.CACHE, 'wb'), -1) cPickle.dump(cache, open(self.CACHE, 'wb'), -1)
wn_path = os.path.expanduser('~/work/servers/src/calibre_servers/main') wn_path = os.path.expanduser('~/work/servers/src/calibre_servers/main')
if os.path.exists(wn_path): if os.path.exists(wn_path):

View File

@ -9,6 +9,11 @@ __docformat__ = 'restructuredtext en'
import unittest, os, argparse import unittest, os, argparse
try:
import init_calibre # noqa
except ImportError:
pass
def find_tests(): def find_tests():
return unittest.defaultTestLoader.discover(os.path.dirname(os.path.abspath(__file__)), pattern='*.py') return unittest.defaultTestLoader.discover(os.path.dirname(os.path.abspath(__file__)), pattern='*.py')