travis, flake colored output
This commit is contained in:
parent
46921dcd87
commit
b154c6d997
47
.travis.yml
47
.travis.yml
@ -22,7 +22,7 @@ env:
|
|||||||
- PYTHON=2.7 QT=pyside TEST=standard
|
- PYTHON=2.7 QT=pyside TEST=standard
|
||||||
- PYTHON=3.2 QT=pyqt TEST=standard
|
- PYTHON=3.2 QT=pyqt TEST=standard
|
||||||
- PYTHON=3.2 QT=pyside TEST=standard
|
- PYTHON=3.2 QT=pyside TEST=standard
|
||||||
- PYTHON=3.2 QT=pyqt5 TEST=standard
|
#- PYTHON=3.2 QT=pyqt5 TEST=standard
|
||||||
|
|
||||||
|
|
||||||
before_install:
|
before_install:
|
||||||
@ -118,33 +118,66 @@ before_script:
|
|||||||
- export PATH=/home/travis/bin:$PATH
|
- export PATH=/home/travis/bin:$PATH
|
||||||
- which python
|
- which python
|
||||||
- python --version
|
- python --version
|
||||||
|
# Help color output from each test
|
||||||
|
- RESET='\033[0m';
|
||||||
|
RED='\033[00;31m';
|
||||||
|
GREEN='\033[00;32m';
|
||||||
|
YELLOW='\033[00;33m';
|
||||||
|
BLUE='\033[00;34m';
|
||||||
|
PURPLE='\033[00;35m';
|
||||||
|
CYAN='\033[00;36m';
|
||||||
|
WHITE='\033[00;37m';
|
||||||
|
start_test() {
|
||||||
|
echo -e "${BLUE}======== Starting $1 ========${RESET}";
|
||||||
|
};
|
||||||
|
check_output() {
|
||||||
|
ret=$?;
|
||||||
|
if [ $ret == 0 ]; then
|
||||||
|
echo -e "${GREEN}>>>>>> $1 passed <<<<<<${RESET}";
|
||||||
|
else
|
||||||
|
echo -e "${RED}>>>>>> $1 FAILED <<<<<<${RESET}";
|
||||||
|
fi;
|
||||||
|
return $ret;
|
||||||
|
};
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- PGDIR=`pwd`
|
|
||||||
|
|
||||||
# Run unit tests
|
# Run unit tests
|
||||||
- PYTHONPATH=. ${PYTEST} pyqtgraph/
|
- start_test "unit tests";
|
||||||
|
PYTHONPATH=. ${PYTEST} pyqtgraph/
|
||||||
|
check_output "unit tests";
|
||||||
|
|
||||||
|
|
||||||
# check line endings
|
# check line endings
|
||||||
- if [ "${TEST}" == "extra" ]; then
|
- if [ "${TEST}" == "extra" ]; then
|
||||||
|
start_test "line ending check";
|
||||||
! find ./ -name "*.py" | xargs file | grep CRLF &&
|
! find ./ -name "*.py" | xargs file | grep CRLF &&
|
||||||
! find ./ -name "*.rst" | xargs file | grep CRLF;
|
! find ./ -name "*.rst" | xargs file | grep CRLF;
|
||||||
|
check_output "line ending check";
|
||||||
fi;
|
fi;
|
||||||
|
|
||||||
# Check for style issues
|
# Check for style issues
|
||||||
- if [ "${TEST}" == "extra" ]; then
|
- if [ "${TEST}" == "extra" ]; then
|
||||||
|
start_test "style check";
|
||||||
python setup.py style;
|
python setup.py style;
|
||||||
|
check_output "style check";
|
||||||
fi;
|
fi;
|
||||||
|
|
||||||
# Check install works
|
# Check install works
|
||||||
- sudo python${PYTHON} setup.py --quiet install
|
- start_test "install test";
|
||||||
|
sudo python${PYTHON} setup.py --quiet install;
|
||||||
|
check_output "install test";
|
||||||
|
|
||||||
# Check double-install fails
|
# Check double-install fails
|
||||||
# Note the bash -c is because travis strips off the ! otherwise.
|
# Note the bash -c is because travis strips off the ! otherwise.
|
||||||
- bash -c "! sudo python${PYTHON} setup.py --quiet install"
|
- start_test "double install test";
|
||||||
|
bash -c "! sudo python${PYTHON} setup.py --quiet install"
|
||||||
|
check_output "double install test";
|
||||||
|
|
||||||
# Check we can import pg
|
# Check we can import pg
|
||||||
- echo "import sys; print(sys.path)" | python
|
- start_test "import test";
|
||||||
- cd /; echo "import pyqtgraph.examples" | python
|
echo "import sys; print(sys.path)" | python;
|
||||||
|
cd /; echo "import pyqtgraph.examples" | python;
|
||||||
|
check_output "import test";
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
import os, sys, re
|
import os, sys, re
|
||||||
try:
|
try:
|
||||||
from subprocess import check_output
|
from subprocess import check_output
|
||||||
@ -15,21 +16,192 @@ except ImportError:
|
|||||||
raise ex
|
raise ex
|
||||||
return output
|
return output
|
||||||
|
|
||||||
FLAKE_TESTS = ("E101,E111,E112,E113,E122,E125,E133,E223,E224,"
|
# Paths that are checked for style by flake and flake_diff
|
||||||
"E242,E273,E274,E304,E502,E703,E901,E902,"
|
FLAKE_CHECK_PATHS = ['pyqtgraph', 'examples', 'tools']
|
||||||
"W191,W601,W602,W603,W604")
|
|
||||||
|
# Flake style checks -- mandatory, recommended, optional
|
||||||
|
# See: http://pep8.readthedocs.org/en/1.4.6/intro.html
|
||||||
|
# and https://flake8.readthedocs.org/en/2.0/warnings.html
|
||||||
|
FLAKE_MANDATORY = set([
|
||||||
|
'E101', # indentation contains mixed spaces and tabs
|
||||||
|
'E112', # expected an indented block
|
||||||
|
'E122', # continuation line missing indentation or outdented
|
||||||
|
'E125', # continuation line does not distinguish itself from next line
|
||||||
|
'E133', # closing bracket is missing indentation
|
||||||
|
|
||||||
|
'E223', # tab before operator
|
||||||
|
'E224', # tab after operator
|
||||||
|
'E242', # tab after ‘,’
|
||||||
|
'E273', # tab after keyword
|
||||||
|
'E274', # tab before keyword
|
||||||
|
|
||||||
|
'E901', # SyntaxError or IndentationError
|
||||||
|
'E902', # IOError
|
||||||
|
|
||||||
|
'W191', # indentation contains tabs
|
||||||
|
|
||||||
|
'W601', # .has_key() is deprecated, use ‘in’
|
||||||
|
'W602', # deprecated form of raising exception
|
||||||
|
'W603', # ‘<>’ is deprecated, use ‘!=’
|
||||||
|
'W604', # backticks are deprecated, use ‘repr()’
|
||||||
|
])
|
||||||
|
|
||||||
|
FLAKE_RECOMMENDED = set([
|
||||||
|
'E124', # closing bracket does not match visual indentation
|
||||||
|
'E231', # missing whitespace after ‘,’
|
||||||
|
|
||||||
|
'E211', # whitespace before ‘(‘
|
||||||
|
'E261', # at least two spaces before inline comment
|
||||||
|
'E271', # multiple spaces after keyword
|
||||||
|
'E272', # multiple spaces before keyword
|
||||||
|
'E304', # blank lines found after function decorator
|
||||||
|
|
||||||
|
'F401', # module imported but unused
|
||||||
|
'F402', # import module from line N shadowed by loop variable
|
||||||
|
'F403', # ‘from module import *’ used; unable to detect undefined names
|
||||||
|
'F404', # future import(s) name after other statements
|
||||||
|
|
||||||
|
'E501', # line too long (82 > 79 characters)
|
||||||
|
'E502', # the backslash is redundant between brackets
|
||||||
|
|
||||||
|
'E702', # multiple statements on one line (semicolon)
|
||||||
|
'E703', # statement ends with a semicolon
|
||||||
|
'E711', # comparison to None should be ‘if cond is None:’
|
||||||
|
'E712', # comparison to True should be ‘if cond is True:’ or ‘if cond:’
|
||||||
|
'E721', # do not compare types, use ‘isinstance()’
|
||||||
|
|
||||||
|
'F811', # redefinition of unused name from line N
|
||||||
|
'F812', # list comprehension redefines name from line N
|
||||||
|
'F821', # undefined name name
|
||||||
|
'F822', # undefined name name in __all__
|
||||||
|
'F823', # local variable name ... referenced before assignment
|
||||||
|
'F831', # duplicate argument name in function definition
|
||||||
|
'F841', # local variable name is assigned to but never used
|
||||||
|
|
||||||
|
'W292', # no newline at end of file
|
||||||
|
|
||||||
|
])
|
||||||
|
|
||||||
|
FLAKE_OPTIONAL = set([
|
||||||
|
'E121', # continuation line indentation is not a multiple of four
|
||||||
|
'E123', # closing bracket does not match indentation of opening bracket
|
||||||
|
'E126', # continuation line over-indented for hanging indent
|
||||||
|
'E127', # continuation line over-indented for visual indent
|
||||||
|
'E128', # continuation line under-indented for visual indent
|
||||||
|
|
||||||
|
'E201', # whitespace after ‘(‘
|
||||||
|
'E202', # whitespace before ‘)’
|
||||||
|
'E203', # whitespace before ‘:’
|
||||||
|
'E221', # multiple spaces before operator
|
||||||
|
'E222', # multiple spaces after operator
|
||||||
|
'E225', # missing whitespace around operator
|
||||||
|
'E227', # missing whitespace around bitwise or shift operator
|
||||||
|
'E226', # missing whitespace around arithmetic operator
|
||||||
|
'E228', # missing whitespace around modulo operator
|
||||||
|
'E241', # multiple spaces after ‘,’
|
||||||
|
'E251', # unexpected spaces around keyword / parameter equals
|
||||||
|
'E262', # inline comment should start with ‘# ‘
|
||||||
|
|
||||||
|
'E301', # expected 1 blank line, found 0
|
||||||
|
'E302', # expected 2 blank lines, found 0
|
||||||
|
'E303', # too many blank lines (3)
|
||||||
|
|
||||||
|
'E401', # multiple imports on one line
|
||||||
|
|
||||||
|
'E701', # multiple statements on one line (colon)
|
||||||
|
|
||||||
|
'W291', # trailing whitespace
|
||||||
|
'W293', # blank line contains whitespace
|
||||||
|
|
||||||
|
'W391', # blank line at end of file
|
||||||
|
])
|
||||||
|
|
||||||
|
FLAKE_IGNORE = set([
|
||||||
|
# 111 and 113 are ignored because they appear to be broken.
|
||||||
|
'E111', # indentation is not a multiple of four
|
||||||
|
'E113', # unexpected indentation
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
#def checkStyle():
|
||||||
|
#try:
|
||||||
|
#out = check_output(['flake8', '--select=%s' % FLAKE_TESTS, '--statistics', 'pyqtgraph/'])
|
||||||
|
#ret = 0
|
||||||
|
#print("All style checks OK.")
|
||||||
|
#except Exception as e:
|
||||||
|
#out = e.output
|
||||||
|
#ret = e.returncode
|
||||||
|
#print(out.decode('utf-8'))
|
||||||
|
#return ret
|
||||||
|
|
||||||
|
|
||||||
def checkStyle():
|
def checkStyle():
|
||||||
try:
|
""" Run flake8, checking only lines that are modified since the last
|
||||||
out = check_output(['flake8', '--select=%s' % FLAKE_TESTS, '--statistics', 'pyqtgraph/'])
|
git commit. """
|
||||||
|
test = [ 1,2,3 ]
|
||||||
|
|
||||||
|
# First check _all_ code against mandatory error codes
|
||||||
|
print('flake8: check all code against mandatory error set...')
|
||||||
|
errors = ','.join(FLAKE_MANDATORY)
|
||||||
|
cmd = ['flake8', '--select=' + errors] + FLAKE_CHECK_PATHS
|
||||||
|
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE)
|
||||||
|
#ret = proc.wait()
|
||||||
|
output = proc.stdout.read().decode('utf-8')
|
||||||
|
ret = proc.wait()
|
||||||
|
printFlakeOutput(output)
|
||||||
|
|
||||||
|
# Next check new code with optional error codes
|
||||||
|
print('flake8: check new code against recommended error set...')
|
||||||
|
diff = subprocess.check_output(['git', 'diff'])
|
||||||
|
proc = subprocess.Popen(['flake8', '--diff', #'--show-source',
|
||||||
|
'--ignore=' + errors],
|
||||||
|
stdin=subprocess.PIPE,
|
||||||
|
stdout=subprocess.PIPE)
|
||||||
|
proc.stdin.write(diff)
|
||||||
|
proc.stdin.close()
|
||||||
|
output = proc.stdout.read().decode('utf-8')
|
||||||
|
ret |= printFlakeOutput(output)
|
||||||
|
|
||||||
|
if ret == 0:
|
||||||
|
print('flake8 test passed.')
|
||||||
|
else:
|
||||||
|
print('flake8 test failed: %d' % ret)
|
||||||
|
sys.exit(ret)
|
||||||
|
|
||||||
|
|
||||||
|
def printFlakeOutput(text):
|
||||||
|
""" Print flake output, colored by error category.
|
||||||
|
Return 2 if there were any mandatory errors,
|
||||||
|
1 if only recommended / optional errors, and
|
||||||
|
0 if only optional errors.
|
||||||
|
"""
|
||||||
ret = 0
|
ret = 0
|
||||||
print("All style checks OK.")
|
gotError = False
|
||||||
except Exception as e:
|
for line in text.split('\n'):
|
||||||
out = e.output
|
m = re.match(r'[^\:]+\:\d+\:\d+\: (\w+) .*', line)
|
||||||
ret = e.returncode
|
if m is None:
|
||||||
print(out.decode('utf-8'))
|
print(line)
|
||||||
|
else:
|
||||||
|
gotError = True
|
||||||
|
error = m.group(1)
|
||||||
|
if error in FLAKE_MANDATORY:
|
||||||
|
print("\033[0;31m" + line + "\033[0m")
|
||||||
|
ret |= 2
|
||||||
|
elif error in FLAKE_RECOMMENDED:
|
||||||
|
print("\033[0;33m" + line + "\033[0m")
|
||||||
|
#ret |= 1
|
||||||
|
elif error in FLAKE_OPTIONAL:
|
||||||
|
print("\033[0;32m" + line + "\033[0m")
|
||||||
|
elif error in FLAKE_IGNORE:
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
print("\033[0;36m" + line + "\033[0m")
|
||||||
|
if not gotError:
|
||||||
|
print(" [ no errors ]\n")
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def unitTests():
|
def unitTests():
|
||||||
try:
|
try:
|
||||||
if sys.version[0] == '3':
|
if sys.version[0] == '3':
|
||||||
|
Loading…
Reference in New Issue
Block a user