mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Switch to using flake8 to check for errors
This commit is contained in:
parent
5a4e046f98
commit
47fb117828
@ -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
4
setup.cfg
Normal 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
|
@ -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):
|
||||||
|
@ -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')
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user