Merge branch 'flake8'

See #1226.
This commit is contained in:
Florian Bruhin 2016-01-22 19:45:51 +01:00
commit c8408c6a5f
41 changed files with 135 additions and 118 deletions

View File

@ -44,7 +44,7 @@ docstring-min-length=3
[FORMAT]
max-line-length=79
ignore-long-lines=(<?https?://|^# Copyright 201\d)
ignore-long-lines=(<?https?://|^# Copyright 201\d|# (pylint|flake8): disable=)
expected-line-ending-format=LF
[SIMILARITIES]

View File

@ -17,9 +17,7 @@ env:
- TESTENV=misc
- TESTENV=vulture
- TESTENV=pep257
- TESTENV=pyflakes
- TESTENV=pep8
- TESTENV=mccabe
- TESTENV=flake8
- TESTENV=pyroma
- TESTENV=check-manifest
- TESTENV=pylint
@ -57,11 +55,7 @@ matrix:
- os: osx
env: TESTENV=pep257
- os: osx
env: TESTENV=pyflakes
- os: osx
env: TESTENV=pep8
- os: osx
env: TESTENV=mccabe
env: TESTENV=flake8
- os: osx
env: TESTENV=pyroma
- os: osx

View File

@ -14,19 +14,6 @@ markers =
skip: Always skipped test.
pyqt531_or_newer: Needs PyQt 5.3.1 or newer.
xfail_norun: xfail the test with out running it
flakes-ignore =
UnusedImport
UnusedVariable
resources.py ALL
pep8ignore =
E265 # Block comment should start with '#'
E501 # Line too long
E402 # module level import not at top of file
E266 # too many leading '#' for block comment
W503 # line break before binary operator
resources.py ALL
.hypothesis/* ALL
mccabe-complexity = 12
qt_log_level_fail = WARNING
qt_log_ignore =
^SpellCheck: .*

View File

@ -84,7 +84,7 @@ def dirbrowser_html(path):
except OSError as e:
html = jinja.env.get_template('error.html').render(
title="Error while reading directory",
url='file://%s' % path,
url='file://{}'.format(path),
error=str(e),
icon='')
return html.encode('UTF-8', errors='xmlcharrefreplace')

View File

@ -30,7 +30,8 @@ class FixedDataNetworkReply(QNetworkReply):
"""QNetworkReply subclass for fixed data."""
def __init__(self, request, fileData, mimeType, parent=None):
def __init__(self, request, fileData, mimeType, # flake8: disable=N803
parent=None):
"""Constructor.
Args:

View File

@ -49,7 +49,7 @@ attr_chars = string.ascii_letters + string.digits + attr_chars_nonalnum
# RFC 5987 gives this alternative construction of the token character class
token_chars = attr_chars + "*'%"
token_chars = attr_chars + "*'%" # flake8: disable=S001
# Definitions from https://tools.ietf.org/html/rfc2616#section-2.2

View File

@ -79,8 +79,8 @@ def get_window(via_ipc, force_window=False, force_tab=False,
if open_target not in ('tab-silent', 'tab-bg-silent'):
window_to_raise = window
if window_to_raise is not None:
window_to_raise.setWindowState(window.windowState() &
~Qt.WindowMinimized | Qt.WindowActive)
window_to_raise.setWindowState(
window.windowState() & ~Qt.WindowMinimized | Qt.WindowActive)
window_to_raise.raise_()
window_to_raise.activateWindow()
QApplication.instance().alert(window_to_raise)

View File

@ -1,5 +1,7 @@
# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et:
# Copyright 2014-2016 Florian Bruhin (The-Compiler) <mail@qutebrowser.org>
#
# This file is part of qutebrowser.
#
# qutebrowser is free software: you can redistribute it and/or modify

View File

@ -100,7 +100,7 @@ def _get_environment_vars():
for key, value in os.environ.items():
for m in masks:
if fnmatch.fnmatch(key, m):
info.append('%s = %s' % (key, value))
info.append('{} = {}'.format(key, value))
return '\n'.join(sorted(info))

View File

@ -22,7 +22,7 @@
import os
import sys
import bdb
import pdb
import pdb # flake8: disable=T002
import signal
import functools
import faulthandler

View File

@ -1,5 +1,7 @@
# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et:
# Copyright 2014-2016 Florian Bruhin (The-Compiler) <mail@qutebrowser.org>
#
# This file is part of qutebrowser.
#
# qutebrowser is free software: you can redistribute it and/or modify

View File

@ -86,9 +86,9 @@ class Saveable:
(not config.get(*self._config_opt)) and
(not explicit) and (not force)):
if not silent:
log.save.debug("Not saving {} because autosaving has been "
log.save.debug("Not saving {name} because autosaving has been "
"disabled by {cfg[0]} -> {cfg[1]}.".format(
self._name, cfg=self._config_opt))
name=self._name, cfg=self._config_opt))
return
do_save = self._dirty or (self._save_on_exit and is_exit) or force
if not silent:

View File

@ -274,7 +274,7 @@ def qt_message_handler(msg_type, context, msg):
# PNGs in Qt with broken color profile
# https://bugreports.qt.io/browse/QTBUG-39788
'libpng warning: iCCP: Not recognizing known sRGB profile that has '
'been edited', # noqa
'been edited', # flake8: disable=E131
'libpng warning: iCCP: known incorrect sRGB profile',
# Hopefully harmless warning
'OpenType support missing for script ',
@ -312,7 +312,7 @@ def qt_message_handler(msg_type, context, msg):
'libpng warning: iCCP: known incorrect sRGB profile',
# https://bugreports.qt.io/browse/QTBUG-47154
'virtual void QSslSocketBackendPrivate::transmit() SSLRead failed '
'with: -9805', # noqa
'with: -9805', # flake8: disable=E131
]
# Messages which will trigger an exception immediately

View File

@ -217,9 +217,9 @@ def _has_explicit_scheme(url):
# after the scheme delimiter. Since we don't know of any URIs
# using this and want to support e.g. searching for scoped C++
# symbols, we treat this as not an URI anyways.
return (url.isValid() and url.scheme()
and not url.path().startswith(' ')
and not url.path().startswith(':'))
return (url.isValid() and url.scheme() and
not url.path().startswith(' ') and
not url.path().startswith(':'))
def is_special_url(url):

View File

@ -65,6 +65,7 @@ def check_setup(executable):
print("Checking setup...")
subprocess.check_call([executable, '-c', 'import PyQt5'])
subprocess.check_call([executable, '-c', 'import sip'])
subprocess.check_call([executable, '--version'])
if 'APPVEYOR' in os.environ:
@ -115,6 +116,14 @@ elif TRAVIS_OS == 'linux':
print("apt-get install...")
apt_get(['install'] + pkgs)
if TESTENV == 'flake8':
print("apt-get update...")
apt_get(['update'])
# We need an up-to-date Python because of:
# https://github.com/google/yapf/issues/46
print("Updating Python...")
apt_get(['install', '-t', 'trusty-updates', 'python3.4'])
if TESTENV == 'eslint':
subprocess.check_call(['sudo', 'npm', 'install', '-g', 'eslint'])
else:

View File

@ -41,7 +41,8 @@ class ConfigChecker(checkers.BaseChecker):
__implements__ = interfaces.IAstroidChecker
name = 'config'
msgs = {
'E0000': ('"%s -> %s" is no valid config option.', 'bad-config-call',
'E0000': ('"%s -> %s" is no valid config option.', # flake8: disable=S001
'bad-config-call',
None),
}
priority = -1

View File

@ -128,8 +128,8 @@ def report(items):
for item in sorted(items, key=lambda e: (e.file.lower(), e.lineno)):
relpath = os.path.relpath(item.file)
path = relpath if not relpath.startswith('..') else item.file
output.append("%s:%d: Unused %s '%s'" % (path, item.lineno, item.typ,
item))
output.append("{}:{}: Unused {} '{}'".format(path, item.lineno,
item.typ, item))
return output

View File

@ -72,7 +72,8 @@ class UsageFormatter(argparse.HelpFormatter):
result = "'{}'".format(action.metavar)
elif action.choices is not None:
choice_strs = [str(choice) for choice in action.choices]
result = '{%s}' % ','.join('*{}*'.format(e) for e in choice_strs)
result = ('{' + ','.join('*{}*'.format(e) for e in choice_strs) +
'}')
else:
result = "'{}'".format(default_metavar)

44
setup.cfg Normal file
View File

@ -0,0 +1,44 @@
[flake8]
exclude = .venv,.hypothesis,.git,__pycache__,resources.py
# E128: continuation line under-indented for visual indent
# E226: missing whitespace around arithmetic operator
# E265: Block comment should start with '#'
# E501: Line too long
# E402: module level import not at top of file
# E266: too many leading '#' for block comment
# F401: Unused import
# N802: function name should be lowercase
# L101: The __init__ method of classes must not have a docstring
# L102: A docstring was incorrectly formatted.
# L103: A test docstring must not start with any form of the words "test", ...
# L201: Container literals must have a trailing comma
# L202: print is not allowed except for debugging.
# L203: pdb and compatible modules are not allowed except for debugging.
# L204: Implicit string literal concatenation is only allowed if every string
# being concatenated is parenthesize
# L207: pass is only necessary in non-optional suites containing no other
# statements.
# L302: The line was too long.
# P101: format string does contain unindexed parameters
# P102: docstring does contain unindexed parameters
# P103: other string does contain unindexed parameters
# D001: found assert_ replace it with assertTrue
ignore =
E128,E226,E265,E501,E402,E266,
F401,
N802,
L101,L102,L103,L201,L202,L203,L204,L207,L302,
P101,P102,P103,
D001
max-complexity = 12
putty-ignore =
/# pylint: disable=invalid-name/ : +N801,N806
/# pragma: no mccabe/ : +C901
/# flake8: disable=E131/ : +E131
/# flake8: disable=N803/ : +N803
/# flake8: disable=T002/ : +T002
/# flake8: disable=F841/ : +F841
/# flake8: disable=S001/ : +S001
copyright-check = True
copyright-regexp = # Copyright [\d-]+ .*
copyright-min-file-size = 110

View File

@ -76,8 +76,7 @@ def _apply_platform_markers(item):
continue
if 'reason' in marker.kwargs:
reason = '{}: {}'.format(default_reason,
marker.kwargs['reason'])
reason = '{}: {}'.format(default_reason, marker.kwargs['reason'])
del marker.kwargs['reason']
else:
reason = default_reason + '.'
@ -388,8 +387,10 @@ def py_proc():
"""Get a python executable and args list which executes the given code."""
if getattr(sys, 'frozen', False):
pytest.skip("Can't be run when frozen")
def func(code):
return (sys.executable, ['-c', textwrap.dedent(code.strip('\n'))])
return func

View File

@ -66,7 +66,6 @@ def partial_compare(val1, val2, *, indent=0):
print_i("|---- to ----", indent)
print_i(pprint.pformat(val2), indent + 1)
if val2 is Ellipsis:
print_i("Ignoring ellipsis comparison", indent, error=True)
return True

View File

@ -44,6 +44,7 @@ def wait_for_prompt(quteproc):
quteproc.wait_for(message='Entering mode KeyMode.* (reason: question '
'asked)')
@bdd.then("no prompt should be shown")
def no_prompt_shown(quteproc):
quteproc.ensure_not_logged(message='Entering mode KeyMode.* (reason: '

View File

@ -88,7 +88,7 @@ def test_quteprocess_quitting(qtbot, quteproc_process):
'category': 'init',
'module': 'earlyinit',
'function': 'init_log',
'line': 280,
'line': 280,
'message': 'Log initialized.',
'expected': False,
}
@ -122,10 +122,10 @@ def test_quteprocess_quitting(qtbot, quteproc_process):
}
),
(
'00:00:00 WARNING qt qxcbxsettings:"QXcbXSettings::'
'QXcbXSettings(QXcbScreen*)":233 '
'QXcbXSettings::QXcbXSettings(QXcbScreen*) Failed to get selection '
'owner for XSETTINGS_S atom ',
'00:00:00 WARNING qt qxcbxsettings:"QXcbXSettings::'
'QXcbXSettings(QXcbScreen*)":233 '
'QXcbXSettings::QXcbXSettings(QXcbScreen*) Failed to get selection '
'owner for XSETTINGS_S atom ',
{
'module': 'qxcbxsettings',
'function': 'QXcbXSettings::QXcbXSettings(QXcbScreen*)',

View File

@ -52,11 +52,11 @@ def test_httpbin(httpbin, qtbot, path, content, expected):
@pytest.mark.parametrize('line, verb, path, equal', [
({'verb': 'GET', 'path': '/', 'status': 200}, 'GET', '/', True),
({'verb': 'GET', 'path': '/foo/', 'status': 200}, 'GET', '/foo', True),
({'verb': 'GET', 'path': '/', 'status': 200}, 'GET', '/', True),
({'verb': 'GET', 'path': '/foo/', 'status': 200}, 'GET', '/foo', True),
({'verb': 'GET', 'path': '/', 'status': 200}, 'GET', '/foo', False),
({'verb': 'POST', 'path': '/', 'status': 200}, 'GET', '/', False),
({'verb': 'GET', 'path': '/', 'status': 200}, 'GET', '/foo', False),
({'verb': 'POST', 'path': '/', 'status': 200}, 'GET', '/', False),
])
def test_expected_request(httpbin, line, verb, path, equal):
expected = httpbin.ExpectedRequest(verb, path)

View File

@ -29,7 +29,6 @@ from PyQt5.QtCore import QUrl
from qutebrowser.browser import http
class TestNoContentDisposition:
"""Test parse_content_disposition with no Content-Disposition header."""

View File

@ -100,7 +100,7 @@ def test_cache_size_leq_max_cache_size(config_stub, tmpdir):
preload_cache(disk_cache, 'http://bar.net')
assert disk_cache.expire() < limit
# Add a threshold to the limit due to unforseeable Qt internals
assert disk_cache.cacheSize() < limit+100
assert disk_cache.cacheSize() < limit + 100
def test_cache_size_deactivated(config_stub, tmpdir):
@ -249,7 +249,6 @@ def test_cache_deactivated_insert_data(config_stub, tmpdir):
assert deactivated_cache.insert(device) is None
def test_cache_remove_data(config_stub, tmpdir):
"""Test if a previously inserted entry can be removed from the cache."""
config_stub.data = {

View File

@ -27,6 +27,7 @@ import pytest
from qutebrowser.browser import mhtml
@pytest.fixture(autouse=True)
def patch_uuid(monkeypatch):
monkeypatch.setattr("uuid.uuid4", lambda: "UUID")

View File

@ -82,6 +82,7 @@ def objects():
signal_filter.create(signaller.cur_statusbar_message, tab))
return Objects(signal_filter=signal_filter, signaller=signaller)
@pytest.yield_fixture
def tabbed_browser(win_registry):
tb = FakeTabbedBrowser()

View File

@ -42,8 +42,8 @@ ITEMS = [
# From https://github.com/OtterBrowser/otter-browser/issues/709#issuecomment-74749471
Item(QUrl('http://github.com/OtterBrowser/24/134/2344/otter-browser/'
'issues/709/'),
'Page not found | github',
user_data={'zoom': 149, 'scroll-pos': QPoint(0, 0)}),
'Page not found | github',
user_data={'zoom': 149, 'scroll-pos': QPoint(0, 0)}),
Item(QUrl('https://mail.google.com/mail/u/0/#label/some+label/'
'234lkjsd0932lkjf884jqwerdf4'),
'"some label" - email@gmail.com - Gmail"',

View File

@ -67,7 +67,7 @@ def get_webelem(geometry=None, frame=None, null=False, style=None,
elem.hasAttribute.side_effect = lambda k: k in attribute_dict
elem.attribute.side_effect = lambda k: attribute_dict.get(k, '')
elem.setAttribute.side_effect = (lambda k, v:
operator.setitem(attribute_dict, k, v))
operator.setitem(attribute_dict, k, v))
elem.removeAttribute.side_effect = attribute_dict.pop
elem.attributeNames.return_value = list(attribute_dict)
@ -112,7 +112,7 @@ class SelectionAndFilterTests:
('<a href="foo" />', [webelem.Group.all, webelem.Group.links,
webelem.Group.prevnext, webelem.Group.url]),
('<a href="javascript://foo" />', [webelem.Group.all,
webelem.Group.url]),
webelem.Group.url]),
('<area />', [webelem.Group.all]),
('<area href="foo" />', [webelem.Group.all, webelem.Group.links,

View File

@ -77,7 +77,6 @@ class TestCheckExclusive:
assert str(excinfo.value) == "Only one of -x/-y/-z can be given!"
class TestRegister:
# pylint: disable=unused-variable

View File

@ -97,7 +97,7 @@ class TestConfigParser:
def test_invalid_value_interpolated(self, objects):
"""Test setting an invalid interpolated value."""
objects.cp.read_dict({'general': {'ignore-case': 'smart',
'wrap-search': '${ignore-case}'}})
'wrap-search': '${ignore-case}'}})
objects.cfg._from_cp(objects.cp)
with pytest.raises(configexc.ValidationError):
objects.cfg._validate_all()
@ -105,7 +105,7 @@ class TestConfigParser:
def test_interpolation(self, objects):
"""Test setting an interpolated value."""
objects.cp.read_dict({'general': {'ignore-case': 'false',
'wrap-search': '${ignore-case}'}})
'wrap-search': '${ignore-case}'}})
objects.cfg._from_cp(objects.cp)
assert not objects.cfg.get('general', 'ignore-case')
assert not objects.cfg.get('general', 'wrap-search')

View File

@ -362,7 +362,7 @@ class TestList:
def test_validate_valid(self, klass, val):
klass(none_ok=True).validate(val)
@pytest.mark.parametrize('val', ['', 'foo,,bar',])
@pytest.mark.parametrize('val', ['', 'foo,,bar'])
def test_validate_invalid(self, klass, val):
with pytest.raises(configexc.ValidationError):
klass().validate(val)
@ -1036,7 +1036,6 @@ class TestFont:
font_xfail = pytest.mark.xfail(reason='FIXME: #103')
@pytest.fixture(params=[configtypes.Font, configtypes.QtFont])
def klass(self, request):
return request.param

View File

@ -37,8 +37,9 @@ def test_python2():
"""Run checkpyver with python 2."""
try:
proc = subprocess.Popen(['python2', checkpyver.__file__,
'--no-err-windows'], stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
'--no-err-windows'],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
stdout, stderr = proc.communicate()
except FileNotFoundError:
pytest.skip("python2 not found")

View File

@ -329,10 +329,10 @@ class TestListen:
file_mode_ok = file_stat.st_mode & 0o777 == 0o700
dir_mode_ok = dir_stat.st_mode & 0o777 == 0o700
print('sockdir: {} / owner {} / mode {:o}'.format(sockdir,
dir_stat.st_uid, dir_stat.st_mode))
print('sockfile: {} / owner {} / mode {:o}'.format(sockfile,
file_stat.st_uid, file_stat.st_mode))
print('sockdir: {} / owner {} / mode {:o}'.format(
sockdir, dir_stat.st_uid, dir_stat.st_mode))
print('sockfile: {} / owner {} / mode {:o}'.format(
sockfile, file_stat.st_uid, file_stat.st_mode))
assert file_owner_ok or dir_owner_ok
assert file_mode_ok or dir_mode_ok
@ -831,8 +831,8 @@ class TestSendOrListen:
'title: Error while connecting to running instance!',
'pre_text: ',
'post_text: Maybe another instance is running but frozen?',
'exception text: Error while listening to IPC server: Error '
'string (error 4)',
('exception text: Error while listening to IPC server: Error '
'string (error 4)'),
]
assert caplog.records[0].msg == '\n'.join(error_msgs)

View File

@ -38,6 +38,7 @@ from qutebrowser.commands import cmdexc
pytestmark = pytest.mark.qt_log_ignore('QIODevice::read.*: device not open',
extend=True)
@pytest.fixture
def sess_man():
"""Fixture providing a SessionManager with no session dir."""
@ -246,7 +247,7 @@ class TestSaveTab:
items = [
Item(url=QUrl('http://www.example.com/'), title='Test title',
active=True),
active=True),
Item(url=QUrl('http://www.example.com/'), title='Test title',
user_data={'zoom': factor}),
]

View File

@ -239,7 +239,6 @@ class TestGetAllObjects:
def __repr__(self):
return '<{}>'.format(self._name)
def test_get_all_objects(self, stubs, monkeypatch):
# pylint: disable=unused-variable
widgets = [self.Object('Widget 1'), self.Object('Widget 2')]
@ -248,8 +247,8 @@ class TestGetAllObjects:
root = QObject()
o1 = self.Object('Object 1', root)
o2 = self.Object('Object 2', o1)
o3 = self.Object('Object 3', root)
o2 = self.Object('Object 2', o1) # flake8: disable=F841
o3 = self.Object('Object 3', root) # flake8: disable=F841
expected = textwrap.dedent("""
Qt widgets - 2 objects:

View File

@ -532,6 +532,7 @@ def test_same_domain(are_same, url1, url2):
assert urlutils.same_domain(QUrl(url1), QUrl(url2)) == are_same
assert urlutils.same_domain(QUrl(url2), QUrl(url1)) == are_same
@pytest.mark.parametrize('url1, url2', [
('http://example.com', ''),
('', 'http://example.com'),
@ -618,7 +619,7 @@ class TestIncDecNumber:
after decrementing."""
with pytest.raises(urlutils.IncDecError):
urlutils.incdec_number(QUrl('http://example.com/page_0.html'),
'decrement')
'decrement')
def test_invalid_url(self):
"""Test if incdec_number rejects an invalid URL."""

View File

@ -530,7 +530,6 @@ def test_parse_single_key(keystr, expected):
assert utils._parse_single_key(keystr) == expected
@pytest.mark.parametrize('keystr, expected', [
('<Control-x>', [utils.KeyInfo(Qt.Key_X, Qt.ControlModifier, '')]),
('x', [utils.KeyInfo(Qt.Key_X, Qt.NoModifier, 'x')]),

View File

@ -44,7 +44,7 @@ def test_name(enum):
def test_unknown(enum):
"""Test invalid values which should raise an AttributeError."""
with pytest.raises(AttributeError):
_ = enum.three
_ = enum.three # flake8: disable=F841
def test_start():

54
tox.ini
View File

@ -4,7 +4,7 @@
# and then run "tox" from this directory.
[tox]
envlist = py34,py35,misc,vulture,pep257,pyflakes,pep8,mccabe,pylint,pyroma,check-manifest
envlist = py34,py35,misc,vulture,pep257,flake8,pylint,pyroma,check-manifest
[testenv]
# https://bitbucket.org/hpk42/tox/issue/246/ - only needed for Windows though
@ -147,50 +147,26 @@ deps = pep257==0.7.0
# D402: First line should not be function's signature (false-positives)
commands = {envpython} -m pep257 scripts tests qutebrowser --ignore=D102,D103,D104,D105,D209,D211,D402 '--match=(?!resources|test_*).*\.py'
[testenv:pyflakes]
basepython = python3
# https://github.com/fschulze/pytest-flakes/issues/6
setenv = LANG=en_US.UTF-8
passenv =
deps =
-r{toxinidir}/requirements.txt
apipkg==1.4
execnet==1.4.1
py==1.4.31
pyflakes==1.0.0
pytest==2.8.5
pytest-flakes==1.0.1
commands =
{envpython} -m py.test -q --flakes --ignore=tests --noconftest
[testenv:pep8]
[testenv:flake8]
basepython = python3
passenv =
deps =
-r{toxinidir}/requirements.txt
apipkg==1.4
execnet==1.4.1
pep8==1.7
py==1.4.31
pytest==2.8.5
pytest-pep8==1.0.6
commands =
{envpython} -m py.test -q --pep8 --ignore=tests --noconftest
[testenv:mccabe]
basepython = python3
passenv =
deps =
-r{toxinidir}/requirements.txt
apipkg==1.4
execnet==1.4.1
flake8==2.5.1
flake8-debugger==1.4.0
pep8-naming==0.3.3
flake8-putty==0.2.0
ebb-lint==0.4.3
flake8-copyright==0.1
mccabe==0.3.1
py==1.4.31
pytest==2.8.5
pytest-mccabe==0.1
pep8==1.7.0
pyflakes==1.0.0
flake8-string-format==0.2.1
flake8-deprecated==0.2
flake8-mock==0.2
flake8-pep3101==0.2
commands =
{envpython} -m py.test -q --mccabe --ignore=tests --noconftest
{envpython} -m flake8
[testenv:pyroma]
basepython = python3