diff --git a/.travis.yml b/.travis.yml index f5db6cac09e05c..287c6337cbda4d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -87,7 +87,7 @@ matrix: apt: packages: - libnss3-tools - env: JOB=wpt_integration TOXENV=py27 SCRIPT=tools/ci/ci_wpt.sh + env: JOB=wpt_integration TOXENV=py27,py27-flake8 SCRIPT=tools/ci/ci_wpt.sh exclude: - env: # exclude empty env from the top-level above allow_failures: diff --git a/tools/ci/check_stability.py b/tools/ci/check_stability.py index 169962a55e6f2c..322a52140a205b 100644 --- a/tools/ci/check_stability.py +++ b/tools/ci/check_stability.py @@ -132,11 +132,6 @@ def get_sha1(): return git("rev-parse", "HEAD").strip() -def install_wptrunner(): - """Install wptrunner.""" - call("pip", "install", wptrunner_root) - - def deepen_checkout(user): """Convert from a shallow checkout to a full one""" fetch_args = [user, "+refs/heads/*:refs/remotes/origin/*"] diff --git a/tools/ci/ci_tools_unittest.sh b/tools/ci/ci_tools_unittest.sh index 6c74a2512441dc..7a54d85ff0aa50 100755 --- a/tools/ci/ci_tools_unittest.sh +++ b/tools/ci/ci_tools_unittest.sh @@ -16,6 +16,7 @@ fi if [[ $(./wpt test-jobs --includes wptrunner_unittest; echo $?) -eq 0 ]]; then if [ $TOXENV == "py27" ] || [ $TOXENV == "pypy" ]; then + TOXENV="$TOXENV,py27-flake8" cd tools/wptrunner tox fi diff --git a/tools/manifest/XMLParser.py b/tools/manifest/XMLParser.py index 5ceeb0b5f72719..523f544b7c4e83 100644 --- a/tools/manifest/XMLParser.py +++ b/tools/manifest/XMLParser.py @@ -70,8 +70,8 @@ def _data(self, text): def _end(self, tag): return self._target.end(_fixname(tag)) - def _external(self, context, base, systemId, publicId): - if publicId in { + def _external(self, context, base, system_id, public_id): + if public_id in { "-//W3C//DTD XHTML 1.0 Transitional//EN", "-//W3C//DTD XHTML 1.1//EN", "-//W3C//DTD XHTML 1.0 Strict//EN", diff --git a/tools/manifest/manifest.py b/tools/manifest/manifest.py index b153798d6f96b0..e466e6ff56ae3b 100644 --- a/tools/manifest/manifest.py +++ b/tools/manifest/manifest.py @@ -2,7 +2,7 @@ import os import re from collections import defaultdict -from six import iteritems, itervalues, viewkeys +from six import iteritems, itervalues, viewkeys, string_types from .item import ManualTest, WebdriverSpecTest, Stub, RefTestNode, RefTest, TestharnessTest, SupportFile, ConformanceCheckerTest, VisualTest from .log import get_logger @@ -20,14 +20,6 @@ class ManifestVersionMismatch(ManifestError): pass -def sourcefile_items(args): - tests_root, url_base, rel_path, status = args - source_file = SourceFile(tests_root, - rel_path, - url_base) - return rel_path, source_file.manifest_items() - - class Manifest(object): def __init__(self, url_base="/"): assert url_base is not None @@ -221,7 +213,7 @@ def load(tests_root, manifest): logger = get_logger() # "manifest" is a path or file-like object. - if isinstance(manifest, basestring): + if isinstance(manifest, string_types): if os.path.exists(manifest): logger.debug("Opening manifest at %s" % manifest) else: diff --git a/tools/runner/report.py b/tools/runner/report.py index f4b3fa71661a74..952df08b805989 100644 --- a/tools/runner/report.py +++ b/tools/runner/report.py @@ -1,3 +1,5 @@ +# flake8: noqa + from __future__ import print_function import argparse diff --git a/tools/sslutils/base.py b/tools/sslutils/base.py index e78e1385c7be08..237ae5f23ccf1f 100644 --- a/tools/sslutils/base.py +++ b/tools/sslutils/base.py @@ -1,9 +1,3 @@ -def get_logger(name="ssl"): - logger = structured.get_default_logger(name) - if logger is None: - logger = structured.structuredlog.StructuredLogger(name) - return logger - class NoSSLEnvironment(object): ssl_enabled = False diff --git a/tools/tox.ini b/tools/tox.ini index b154c471d6f18d..159a934eb1a6ba 100644 --- a/tools/tox.ini +++ b/tools/tox.ini @@ -3,8 +3,12 @@ envlist = py27,py36,pypy skipsdist=True [testenv] +# flake8 versions should be kept in sync across tools/tox.ini, tools/wpt/tox.ini, and tools/wptrunner/tox.ini deps = - flake8 + flake8==3.5.0 + pycodestyle==2.3.1 + pyflakes==1.6.0 + pep8-naming==0.4.1 pytest pytest-cov mock @@ -19,6 +23,28 @@ passenv = HYPOTHESIS_PROFILE [flake8] -ignore = E128,E129,E221,E226,E231,E251,E265,E302,E303,E305,E402,E901,F401,F821,F841 +# flake8 config should be kept in sync across tools/tox.ini, tools/wpt/tox.ini, and tools/wptrunner/tox.ini +select = E,W,F,N +# E128: continuation line under-indented for visual indent +# E129: visually indented line with same indent as next logical line +# E221: multiple spaces before operator +# E226: missing whitespace around arithmetic operator +# E231: missing whitespace after ‘,’, ‘;’, or ‘:’ +# E251: unexpected spaces around keyword / parameter equals +# E265: block comment should start with ‘# ‘ +# E302: expected 2 blank lines, found 0 +# E303: too many blank lines (3) +# E305: expected 2 blank lines after end of function or class +# E402: module level import not at top of file +# E731: do not assign a lambda expression, use a def +# E901: SyntaxError or IndentationError +# W601: .has_key() is deprecated, use ‘in’ +# F401: module imported but unused +# F403: ‘from module import *’ used; unable to detect undefined names +# F405: name may be undefined, or defined from star imports: module +# F841: local variable name is assigned to but never used +# N801: class names should use CapWords convention +# N802: function name should be lowercase +ignore = E128,E129,E221,E226,E231,E251,E265,E302,E303,E305,E402,E731,E901,W601,F401,F403,F405,F841,N801,N802 max-line-length = 141 exclude = .tox,html5lib,third_party/py,third_party/pytest,third_party/funcsigs,third_party/attrs,third_party/pluggy/,pywebsocket,six,_venv,webencodings,wptserve/docs,wptserve/tests/functional/docroot/,wpt,wptrunner diff --git a/tools/webdriver/webdriver/client.py b/tools/webdriver/webdriver/client.py index ec7d6deccbacf0..622c5fce76acc2 100644 --- a/tools/webdriver/webdriver/client.py +++ b/tools/webdriver/webdriver/client.py @@ -4,6 +4,8 @@ import protocol import transport +from six import string_types + from mozlog import get_default_logger logger = get_default_logger() @@ -313,7 +315,7 @@ def __setitem__(self, name, value): cookie = {"name": name, "value": None} - if isinstance(name, (str, unicode)): + if isinstance(name, string_types): cookie["value"] = value elif hasattr(value, "value"): cookie["value"] = value.value diff --git a/tools/webdriver/webdriver/protocol.py b/tools/webdriver/webdriver/protocol.py index 80f358c8b0ad8d..ea0c793accbda6 100644 --- a/tools/webdriver/webdriver/protocol.py +++ b/tools/webdriver/webdriver/protocol.py @@ -16,7 +16,7 @@ def default(self, obj): return [self.default(x) for x in obj] elif isinstance(obj, webdriver.Element): return {webdriver.Element.identifier: obj.id} - return super(ProtocolEncoder, self).default(obj) + return super(Encoder, self).default(obj) class Decoder(json.JSONDecoder): diff --git a/tools/webdriver/webdriver/servo.py b/tools/webdriver/webdriver/servo.py deleted file mode 100644 index 2e0b722ababe41..00000000000000 --- a/tools/webdriver/webdriver/servo.py +++ /dev/null @@ -1,18 +0,0 @@ -class ServoExtensionCommands(object): - def __init__(self, session): - self.session = session - - @command - def get_prefs(self, *prefs): - body = {"prefs": list(prefs)} - return self.session.send_command("POST", "servo/prefs/get", body) - - @command - def set_prefs(self, prefs): - body = {"prefs": prefs} - return self.session.send_command("POST", "servo/prefs/set", body) - - @command - def reset_prefs(self, *prefs): - body = {"prefs": list(prefs)} - return self.session.send_command("POST", "servo/prefs/reset", body) diff --git a/tools/webdriver/webdriver/transport.py b/tools/webdriver/webdriver/transport.py index b198b194b38b23..d62271fe957caa 100644 --- a/tools/webdriver/webdriver/transport.py +++ b/tools/webdriver/webdriver/transport.py @@ -4,6 +4,7 @@ import error +from six import text_type """Implements HTTP transport for the WebDriver wire protocol.""" @@ -135,7 +136,7 @@ def send(self, except ValueError: raise ValueError("Failed to encode request body as JSON:\n" "%s" % json.dumps(body, indent=2)) - if isinstance(payload, unicode): + if isinstance(payload, text_type): payload = body.encode("utf-8") if headers is None: diff --git a/tools/wpt/browser.py b/tools/wpt/browser.py index 44cad5f04b212b..c6cc38afd67c00 100644 --- a/tools/wpt/browser.py +++ b/tools/wpt/browser.py @@ -4,9 +4,12 @@ import re import shutil import stat +import subprocess +import sys from abc import ABCMeta, abstractmethod from ConfigParser import RawConfigParser from distutils.spawn import find_executable +from io import BytesIO from utils import call, get, untar, unzip diff --git a/tools/wpt/install.py b/tools/wpt/install.py index 408744a4a405c2..d779651c990e2b 100644 --- a/tools/wpt/install.py +++ b/tools/wpt/install.py @@ -39,8 +39,3 @@ def install(name, component, destination): subclass = getattr(browser, name.title()) sys.stdout.write('Now installing %s %s...\n' % (name, component)) getattr(subclass(), method)(dest=destination) - - -if __name__ == '__main__': - args = parser.parse_args() - run(None, **vars(args)) diff --git a/tools/wpt/markdown.py b/tools/wpt/markdown.py index 87018910ac1f69..494dc2a3081fba 100644 --- a/tools/wpt/markdown.py +++ b/tools/wpt/markdown.py @@ -1,3 +1,5 @@ +from .stability import is_inconsistent + def format_comment_title(product): """Produce a Markdown-formatted string based on a given "product"--a string containing a browser identifier optionally followed by a colon and a diff --git a/tools/wpt/tox.ini b/tools/wpt/tox.ini index 5836a52ffa9dcd..02c8f6a51cefea 100644 --- a/tools/wpt/tox.ini +++ b/tools/wpt/tox.ini @@ -1,10 +1,9 @@ [tox] -envlist = py27 +envlist = py27,py27-flake8 skipsdist=True [testenv] deps = - flake8 pytest pytest-cov hypothesis @@ -14,8 +13,40 @@ deps = commands = pytest --cov - flake8 + +[testenv:py27-flake8] +# flake8 versions should be kept in sync across tools/tox.ini, tools/wpt/tox.ini, and tools/wptrunner/tox.ini +deps = + flake8==3.5.0 + pycodestyle==2.3.1 + pyflakes==1.6.0 + pep8-naming==0.4.1 + +commands = + flake8 [flake8] -ignore = E128,E129,E221,E226,E231,E251,E265,E302,E303,E305,E402,E901,F401,F821,F841 +# flake8 config should be kept in sync across tools/tox.ini, tools/wpt/tox.ini, and tools/wptrunner/tox.ini +select = E,W,F,N +# E128: continuation line under-indented for visual indent +# E129: visually indented line with same indent as next logical line +# E221: multiple spaces before operator +# E226: missing whitespace around arithmetic operator +# E231: missing whitespace after ‘,’, ‘;’, or ‘:’ +# E251: unexpected spaces around keyword / parameter equals +# E265: block comment should start with ‘# ‘ +# E302: expected 2 blank lines, found 0 +# E303: too many blank lines (3) +# E305: expected 2 blank lines after end of function or class +# E402: module level import not at top of file +# E731: do not assign a lambda expression, use a def +# E901: SyntaxError or IndentationError +# W601: .has_key() is deprecated, use ‘in’ +# F401: module imported but unused +# F403: ‘from module import *’ used; unable to detect undefined names +# F405: name may be undefined, or defined from star imports: module +# F841: local variable name is assigned to but never used +# N801: class names should use CapWords convention +# N802: function name should be lowercase +ignore = E128,E129,E221,E226,E231,E251,E265,E302,E303,E305,E402,E731,E901,W601,F401,F403,F405,F841,N801,N802 max-line-length = 141 diff --git a/tools/wpt/utils.py b/tools/wpt/utils.py index e1f4cd4bb5c75d..e8edc0be493731 100644 --- a/tools/wpt/utils.py +++ b/tools/wpt/utils.py @@ -27,7 +27,7 @@ def set_if_none(self, value = value() if not value: if err_fn is not None: - return err_fn(kwargs, "Failed to find %s" % desc) + return err_fn(self, "Failed to find %s" % desc) else: return self[name] = value diff --git a/tools/wpt/virtualenv.py b/tools/wpt/virtualenv.py index e15f129176c1c4..b8454c979c2c4b 100644 --- a/tools/wpt/virtualenv.py +++ b/tools/wpt/virtualenv.py @@ -1,4 +1,5 @@ import os +import shutil import sys import logging from distutils.spawn import find_executable diff --git a/tools/wptrunner/docs/conf.py b/tools/wptrunner/docs/conf.py index 0c717f56536b9d..b58f313e946aa9 100644 --- a/tools/wptrunner/docs/conf.py +++ b/tools/wptrunner/docs/conf.py @@ -186,22 +186,22 @@ # -- Options for LaTeX output --------------------------------------------- latex_elements = { -# The paper size ('letterpaper' or 'a4paper'). -#'papersize': 'letterpaper', + # The paper size ('letterpaper' or 'a4paper'). + #'papersize': 'letterpaper', -# The font size ('10pt', '11pt' or '12pt'). -#'pointsize': '10pt', + # The font size ('10pt', '11pt' or '12pt'). + #'pointsize': '10pt', -# Additional stuff for the LaTeX preamble. -#'preamble': '', + # Additional stuff for the LaTeX preamble. + #'preamble': '', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - ('index', 'wptrunner.tex', u'wptrunner Documentation', - u'James Graham', 'manual'), + ('index', 'wptrunner.tex', u'wptrunner Documentation', + u'James Graham', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of @@ -244,9 +244,9 @@ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - ('index', 'wptrunner', u'wptrunner Documentation', - u'James Graham', 'wptrunner', 'One line description of project.', - 'Miscellaneous'), + ('index', 'wptrunner', u'wptrunner Documentation', + u'James Graham', 'wptrunner', 'One line description of project.', + 'Miscellaneous'), ] # Documents to append as an appendix to all manuals. diff --git a/tools/wptrunner/setup.py b/tools/wptrunner/setup.py index 7ec189fefd9aee..dc3048e259775c 100644 --- a/tools/wptrunner/setup.py +++ b/tools/wptrunner/setup.py @@ -59,7 +59,7 @@ include_package_data=True, data_files=[("requirements", requirements_files)], install_requires=deps - ) + ) if "install" in sys.argv: path = os.path.relpath(os.path.join(sys.prefix, "requirements"), os.curdir) diff --git a/tools/wptrunner/test/test.py b/tools/wptrunner/test/test.py index 034e317bd52f08..622934a42b0cc0 100644 --- a/tools/wptrunner/test/test.py +++ b/tools/wptrunner/test/test.py @@ -156,7 +156,8 @@ def main(): run(config, args) except Exception: if args.pdb: - import pdb, traceback + import pdb + import traceback print traceback.format_exc() pdb.post_mortem() else: diff --git a/tools/wptrunner/tox.ini b/tools/wptrunner/tox.ini index 790970409f3602..6088c1460bbabc 100644 --- a/tools/wptrunner/tox.ini +++ b/tools/wptrunner/tox.ini @@ -2,7 +2,7 @@ xfail_strict=true [tox] -envlist = {py27,pypy}-{base,b2g,chrome,firefox,servo} +envlist = {py27,pypy}-{base,b2g,chrome,firefox,servo},py27-flake8 [testenv] deps = @@ -15,3 +15,40 @@ deps = servo: -r{toxinidir}/requirements_servo.txt commands = pytest --cov + +[testenv:py27-flake8] +# flake8 versions should be kept in sync across tools/tox.ini, tools/wpt/tox.ini, and tools/wptrunner/tox.ini +deps = + flake8==3.5.0 + pycodestyle==2.3.1 + pyflakes==1.6.0 + pep8-naming==0.4.1 + +commands = + flake8 + +[flake8] +# flake8 config should be kept in sync across tools/tox.ini, tools/wpt/tox.ini, and tools/wptrunner/tox.ini +select = E,W,F,N +# E128: continuation line under-indented for visual indent +# E129: visually indented line with same indent as next logical line +# E221: multiple spaces before operator +# E226: missing whitespace around arithmetic operator +# E231: missing whitespace after ‘,’, ‘;’, or ‘:’ +# E251: unexpected spaces around keyword / parameter equals +# E265: block comment should start with ‘# ‘ +# E302: expected 2 blank lines, found 0 +# E303: too many blank lines (3) +# E305: expected 2 blank lines after end of function or class +# E402: module level import not at top of file +# E731: do not assign a lambda expression, use a def +# E901: SyntaxError or IndentationError +# W601: .has_key() is deprecated, use ‘in’ +# F401: module imported but unused +# F403: ‘from module import *’ used; unable to detect undefined names +# F405: name may be undefined, or defined from star imports: module +# F841: local variable name is assigned to but never used +# N801: class names should use CapWords convention +# N802: function name should be lowercase +ignore = E128,E129,E221,E226,E231,E251,E265,E302,E303,E305,E402,E731,E901,W601,F401,F403,F405,F841,N801,N802 +max-line-length = 141 diff --git a/tools/wptrunner/wptrunner/browsers/firefox.py b/tools/wptrunner/wptrunner/browsers/firefox.py index b324bccd91e2a4..6d1f58d3791624 100644 --- a/tools/wptrunner/wptrunner/browsers/firefox.py +++ b/tools/wptrunner/wptrunner/browsers/firefox.py @@ -96,15 +96,15 @@ def executor_kwargs(test_type, server_config, cache_manager, run_info_data, executor_kwargs["reftest_internal"] = kwargs["reftest_internal"] executor_kwargs["reftest_screenshot"] = kwargs["reftest_screenshot"] if test_type == "wdspec": - fxOptions = {} + options = {} if kwargs["binary"]: - fxOptions["binary"] = kwargs["binary"] + options["binary"] = kwargs["binary"] if kwargs["binary_args"]: - fxOptions["args"] = kwargs["binary_args"] - fxOptions["prefs"] = { + options["args"] = kwargs["binary_args"] + options["prefs"] = { "network.dns.localDomains": ",".join(hostnames) } - capabilities["moz:firefoxOptions"] = fxOptions + capabilities["moz:firefoxOptions"] = options if kwargs["certutil_binary"] is None: capabilities["acceptInsecureCerts"] = True if capabilities: @@ -364,7 +364,7 @@ def setup_ssl(self): env[env_var] = (os.path.pathsep.join([certutil_dir, env[env_var]]) if env_var in env else certutil_dir).encode( - sys.getfilesystemencoding() or 'utf-8', 'replace') + sys.getfilesystemencoding() or 'utf-8', 'replace') def certutil(*args): cmd = [self.certutil_binary] + list(args) diff --git a/tools/wptrunner/wptrunner/browsers/ie.py b/tools/wptrunner/wptrunner/browsers/ie.py index 553372f390e745..13f5827194de3b 100644 --- a/tools/wptrunner/wptrunner/browsers/ie.py +++ b/tools/wptrunner/wptrunner/browsers/ie.py @@ -28,10 +28,10 @@ def executor_kwargs(test_type, server_config, cache_manager, run_info_data, **kwargs): from selenium.webdriver import DesiredCapabilities - ieOptions = {} - ieOptions["requireWindowFocus"] = True + options = {} + options["requireWindowFocus"] = True capabilities = {} - capabilities["se:ieOptions"] = ieOptions + capabilities["se:ieOptions"] = options executor_kwargs = base_executor_kwargs(test_type, server_config, cache_manager, **kwargs) executor_kwargs["close_after_done"] = True @@ -51,7 +51,7 @@ class InternetExplorerBrowser(Browser): def __init__(self, logger, webdriver_binary, webdriver_args=None): Browser.__init__(self, logger) - self.server = InterentExplorerDriverServer(self.logger, + self.server = InternetExplorerDriverServer(self.logger, binary=webdriver_binary, args=webdriver_args) self.webdriver_host = "localhost" diff --git a/tools/wptrunner/wptrunner/environment.py b/tools/wptrunner/wptrunner/environment.py index 874595cbff3f03..711534180dc69c 100644 --- a/tools/wptrunner/wptrunner/environment.py +++ b/tools/wptrunner/wptrunner/environment.py @@ -61,7 +61,7 @@ def get_ssl_kwargs(**kwargs): elif kwargs["ssl_type"] == "pregenerated": args = {"host_key_path": kwargs["host_key_path"], "host_cert_path": kwargs["host_cert_path"], - "ca_cert_path": kwargs["ca_cert_path"]} + "ca_cert_path": kwargs["ca_cert_path"]} else: args = {} return args diff --git a/tools/wptrunner/wptrunner/executors/base.py b/tools/wptrunner/wptrunner/executors/base.py index d87e4ab9924f3a..7178b2e28c374a 100644 --- a/tools/wptrunner/wptrunner/executors/base.py +++ b/tools/wptrunner/wptrunner/executors/base.py @@ -13,7 +13,7 @@ # Extra timeout to use after internal test timeout at which the harness # should force a timeout -extra_timeout = 5 # seconds +extra_timeout = 5 # seconds def executor_kwargs(test_type, server_config, cache_manager, **kwargs): @@ -67,8 +67,8 @@ def __call__(self, test, result): (result_url, test.url)) harness_result = test.result_cls(self.harness_codes[status], message) return (harness_result, - [test.subtest_result_cls(name, self.test_codes[status], message, stack) - for name, status, message, stack in subtest_results]) + [test.subtest_result_cls(st_name, self.test_codes[st_status], st_message, st_stack) + for st_name, st_status, st_message, st_stack in subtest_results]) testharness_result_converter = TestharnessResultConverter() @@ -124,7 +124,7 @@ def __init__(self, browser, server_config, timeout_multiplier=1, self.debug_info = debug_info self.last_environment = {"protocol": "http", "prefs": {}} - self.protocol = None # This must be set in subclasses + self.protocol = None # This must be set in subclasses @property def logger(self): diff --git a/tools/wptrunner/wptrunner/executors/executormarionette.py b/tools/wptrunner/wptrunner/executors/executormarionette.py index 2d0dc914d10566..30930c3c2f9259 100644 --- a/tools/wptrunner/wptrunner/executors/executormarionette.py +++ b/tools/wptrunner/wptrunner/executors/executormarionette.py @@ -304,7 +304,7 @@ def __init__(self, logger, func, protocol, url, timeout): self.result_flag = threading.Event() def run(self): - index = self.url.rfind("/storage/"); + index = self.url.rfind("/storage/") if index != -1: # Clear storage self.protocol.clear_origin(self.url) @@ -503,7 +503,7 @@ def screenshot(self, test, viewport_size, dpi): assert viewport_size is None assert dpi is None - timeout = self.timeout_multiplier * test.timeout if self.debug_info is None else None + timeout = self.timeout_multiplier * test.timeout if self.debug_info is None else None test_url = self.test_url(test) diff --git a/tools/wptrunner/wptrunner/executors/executorselenium.py b/tools/wptrunner/wptrunner/executors/executorselenium.py index 2e84ab6fd65dd6..f905fac81e10ec 100644 --- a/tools/wptrunner/wptrunner/executors/executorselenium.py +++ b/tools/wptrunner/wptrunner/executors/executorselenium.py @@ -51,7 +51,7 @@ def setup(self, runner): self.webdriver = webdriver.Remote(command_executor=RemoteConnection(self.url.strip("/"), resolve_ip=False), desired_capabilities=self.capabilities) - except: + except Exception: self.logger.warning( "Connecting to Selenium failed:\n%s" % traceback.format_exc()) else: @@ -64,7 +64,7 @@ def setup(self, runner): else: try: self.after_connect() - except: + except Exception: print >> sys.stderr, traceback.format_exc() self.logger.warning( "Failed to connect to navigate initial page") @@ -76,7 +76,7 @@ def teardown(self): self.logger.debug("Hanging up on Selenium session") try: self.webdriver.quit() - except: + except Exception: pass del self.webdriver @@ -103,7 +103,7 @@ def load_runner(self, protocol): def wait(self): while True: try: - self.webdriver.execute_async_script(""); + self.webdriver.execute_async_script("") except exceptions.TimeoutException: pass except (socket.timeout, exceptions.NoSuchWindowException, @@ -220,7 +220,7 @@ def do_testharness(self, webdriver, url, timeout): win_s = webdriver.execute_script("return window['%s'];" % self.window_id) win_obj = json.loads(win_s) test_window = win_obj["window-fcc6-11e5-b4f8-330a88ab9d7f"] - except: + except Exception: after = webdriver.window_handles if len(after) == 2: test_window = next(iter(set(after) - set([parent]))) diff --git a/tools/wptrunner/wptrunner/executors/executorservo.py b/tools/wptrunner/wptrunner/executors/executorservo.py index 33ff10df9287c5..ca8ec8a7eb5abf 100644 --- a/tools/wptrunner/wptrunner/executors/executorservo.py +++ b/tools/wptrunner/wptrunner/executors/executorservo.py @@ -28,7 +28,7 @@ pytestrunner = None webdriver = None -extra_timeout = 5 # seconds +extra_timeout = 5 # seconds hosts_text = """127.0.0.1 web-platform.test 127.0.0.1 www.web-platform.test diff --git a/tools/wptrunner/wptrunner/executors/executorservodriver.py b/tools/wptrunner/wptrunner/executors/executorservodriver.py index af09da6f1788db..ed7afaf1028b8b 100644 --- a/tools/wptrunner/wptrunner/executors/executorservodriver.py +++ b/tools/wptrunner/wptrunner/executors/executorservodriver.py @@ -43,7 +43,7 @@ def setup(self, runner): self.session = webdriver.Session(self.host, self.port, extension=webdriver.servo.ServoCommandExtensions) self.session.start() - except: + except Exception: self.logger.warning( "Connecting with WebDriver failed:\n%s" % traceback.format_exc()) else: @@ -60,7 +60,7 @@ def teardown(self): self.logger.debug("Hanging up on WebDriver session") try: self.session.end() - except: + except Exception: pass def is_alive(self): diff --git a/tools/wptrunner/wptrunner/manifestupdate.py b/tools/wptrunner/wptrunner/manifestupdate.py index fd3f82aeb113a9..1d3c173928f03f 100644 --- a/tools/wptrunner/wptrunner/manifestupdate.py +++ b/tools/wptrunner/wptrunner/manifestupdate.py @@ -247,8 +247,8 @@ def coalesce_expected(self, stability=None): boolean_properties=self.root.boolean_properties) except ConditionError as e: if stability is not None: - self.set("disabled", stability or "unstable", e.cond.children[0]) - self.new_disabled = True + self.set("disabled", stability or "unstable", e.cond.children[0]) + self.new_disabled = True else: print "Conflicting test results for %s, cannot update" % self.root.test_path return diff --git a/tools/wptrunner/wptrunner/metadata.py b/tools/wptrunner/wptrunner/metadata.py index 923ac7907335c4..9c31e4279ef660 100644 --- a/tools/wptrunner/wptrunner/metadata.py +++ b/tools/wptrunner/wptrunner/metadata.py @@ -355,7 +355,7 @@ def load_expected(test_manifest, metadata_path, test_path, tests, property_order # Remove expected data for tests that no longer exist for test in expected_manifest.iterchildren(): - if not test.id in tests_by_id: + if test.id not in tests_by_id: test.remove() # Add tests that don't have expected data diff --git a/tools/wptrunner/wptrunner/stability.py b/tools/wptrunner/wptrunner/stability.py index 6eb060485c2cae..e1709c5749a433 100644 --- a/tools/wptrunner/wptrunner/stability.py +++ b/tools/wptrunner/wptrunner/stability.py @@ -274,6 +274,6 @@ def check_stability(logger, repeat_loop=10, repeat_restart=5, chaos_mode=True, m write_summary(logger, step_results, "FAIL") return 1 - step_results.append((desc, "PASS")) + step_results.append((desc, "PASS")) write_summary(logger, step_results, "PASS") diff --git a/tools/wptrunner/wptrunner/testloader.py b/tools/wptrunner/wptrunner/testloader.py index 0eb78bb884f6d3..199ed6c2666868 100644 --- a/tools/wptrunner/wptrunner/testloader.py +++ b/tools/wptrunner/wptrunner/testloader.py @@ -93,7 +93,7 @@ def __init__(self, path): for i, (test_type, test_path, tests) in enumerate(manifest_items): test_dir = tuple(os.path.split(test_path)[0].split(os.path.sep)[:3]) - if not test_dir in by_dir: + if test_dir not in by_dir: by_dir[test_dir] = PathData(test_dir) data = by_dir[test_dir] @@ -261,7 +261,7 @@ def popleft(self): return self.paths.popleft() @property - def badness(self_): + def badness(self_): # noqa: N805 """Badness metric for this chunk""" return self._badness(self_.time) @@ -587,6 +587,7 @@ def __init__(self, test_queue): self.current_metadata = None @abstractmethod + # noqa: N805 #@classmethod (doesn't compose with @abstractmethod) def make_queue(cls, tests, **kwargs): pass diff --git a/tools/wptrunner/wptrunner/testrunner.py b/tools/wptrunner/wptrunner/testrunner.py index 75f4825f95255c..85ffbe3741ab26 100644 --- a/tools/wptrunner/wptrunner/testrunner.py +++ b/tools/wptrunner/wptrunner/testrunner.py @@ -195,7 +195,7 @@ def init(self): self.logger.debug("Starting browser with settings %r" % self.browser_settings) self.browser.start(**self.browser_settings) self.browser_pid = self.browser.pid() - except: + except Exception: self.logger.warning("Failure during init %s" % traceback.format_exc()) if self.init_timer is not None: self.init_timer.cancel() @@ -566,7 +566,7 @@ def test_ended(self, test, results): expected = test.expected() status = file_result.status if file_result.status != "EXTERNAL-TIMEOUT" else "TIMEOUT" - if file_result.status in ("TIMEOUT", "EXTERNAL-TIMEOUT"): + if file_result.status in ("TIMEOUT", "EXTERNAL-TIMEOUT"): if self.browser.check_for_crashes(): status = "CRASH" @@ -585,8 +585,8 @@ def test_ended(self, test, results): restart_before_next = (test.restart_after or file_result.status in ("CRASH", "EXTERNAL-TIMEOUT") or - ((subtest_unexpected or is_unexpected) - and self.restart_on_unexpected)) + ((subtest_unexpected or is_unexpected) and + self.restart_on_unexpected)) if (self.pause_after_test or (self.pause_on_unexpected and (subtest_unexpected or is_unexpected))): @@ -689,7 +689,7 @@ def cleanup(self): break else: if cmd == "log": - self.log(*data) + self.log(*data) else: self.logger.warning("%r: %r" % (cmd, data)) while True: diff --git a/tools/wptrunner/wptrunner/tests/test_hosts.py b/tools/wptrunner/wptrunner/tests/test_hosts.py index 808b81606aeb51..e7d41f3b42081a 100644 --- a/tools/wptrunner/wptrunner/tests/test_hosts.py +++ b/tools/wptrunner/wptrunner/tests/test_hosts.py @@ -42,15 +42,13 @@ def test_alignment(self): 192.168.1.1 another_host another_alias ""","""127.0.0.1 localhost alias 192.168.1.1 another_host another_alias -""" -) +""") def test_multiple_same_name(self): # The semantics are that we overwrite earlier entries with the same name self.do_test("""127.0.0.1 \tlocalhost alias 192.168.1.1 localhost another_alias""","""192.168.1.1 localhost another_alias -""" -) +""") if __name__ == "__main__": unittest.main() diff --git a/tools/wptrunner/wptrunner/update/__init__.py b/tools/wptrunner/wptrunner/update/__init__.py index 497cb34ad0cb2e..99dac6bcccca7e 100644 --- a/tools/wptrunner/wptrunner/update/__init__.py +++ b/tools/wptrunner/wptrunner/update/__init__.py @@ -44,4 +44,3 @@ def main(): assert structuredlog.get_default_logger() is not None success = run_update(logger, **args) sys.exit(0 if success else 1) - diff --git a/tools/wptrunner/wptrunner/update/sync.py b/tools/wptrunner/wptrunner/update/sync.py index c1bff8543498a1..f2660e5a33ec3a 100644 --- a/tools/wptrunner/wptrunner/update/sync.py +++ b/tools/wptrunner/wptrunner/update/sync.py @@ -109,7 +109,7 @@ def create(self, state): state.sync["branch"], state.local_branch) sync_path = os.path.abspath(sync_tree.root) - if not sync_path in sys.path: + if sync_path not in sys.path: from update import setup_paths setup_paths(sync_path) diff --git a/tools/wptrunner/wptrunner/update/tree.py b/tools/wptrunner/wptrunner/update/tree.py index 01df0b4f94a33f..279ddba1f6f3d6 100644 --- a/tools/wptrunner/wptrunner/update/tree.py +++ b/tools/wptrunner/wptrunner/update/tree.py @@ -75,7 +75,7 @@ def is_type(cls, path=None): kwargs["repo"] = path try: hg("root", **kwargs) - except: + except Exception: return False return True @@ -155,7 +155,7 @@ def is_type(cls, path=None): kwargs["repo"] = path try: git("rev-parse", "--show-toplevel", **kwargs) - except: + except Exception: return False return True @@ -305,8 +305,8 @@ def clean(self): def paths(self): """List paths in the tree""" - repo_paths = [self.root] + [os.path.join(self.root, path) - for path in self.submodules()] + repo_paths = [self.root] + [os.path.join(self.root, path) + for path in self.submodules()] rv = [] diff --git a/tools/wptrunner/wptrunner/vcs.py b/tools/wptrunner/wptrunner/vcs.py index 16d53afc8be624..a51312d3937a05 100644 --- a/tools/wptrunner/wptrunner/vcs.py +++ b/tools/wptrunner/wptrunner/vcs.py @@ -15,7 +15,7 @@ def inner(command, *args, **kwargs): repo = kwargs.pop("repo", None) log_error = kwargs.pop("log_error", True) if kwargs: - raise TypeError, kwargs + raise TypeError(kwargs) args = list(args) diff --git a/tools/wptrunner/wptrunner/webdriver_server.py b/tools/wptrunner/wptrunner/webdriver_server.py index fc853bfb97e63c..79d8681c42873c 100644 --- a/tools/wptrunner/wptrunner/webdriver_server.py +++ b/tools/wptrunner/wptrunner/webdriver_server.py @@ -72,7 +72,7 @@ def _run(self, block): "Waiting for server to become accessible: %s" % self.url) try: wait_for_service((self.host, self.port)) - except: + except Exception: self.logger.error( "WebDriver HTTP server was not accessible " "within the timeout:\n%s" % traceback.format_exc()) @@ -125,8 +125,6 @@ def make_command(self): class ChromeDriverServer(WebDriverServer): - default_base_path = "/" - def __init__(self, logger, binary="chromedriver", port=None, base_path="", args=None): WebDriverServer.__init__( @@ -138,8 +136,6 @@ def make_command(self): cmd_arg("url-base", self.base_path) if self.base_path else ""] + self._args class EdgeDriverServer(WebDriverServer): - default_base_path = "/" - def __init__(self, logger, binary="microsoftwebdriver.exe", port=None, base_path="", args=None): WebDriverServer.__init__( @@ -157,17 +153,6 @@ def __init__(self, logger, binary="operadriver", port=None, self, logger, binary, port=port, base_path=base_path, args=args) -class EdgeDriverServer(WebDriverServer): - def __init__(self, logger, binary="MicrosoftWebDriver.exe", port=None, - base_path="", host="localhost", args=None): - WebDriverServer.__init__( - self, logger, binary, host=host, port=port, args=args) - - def make_command(self): - return [self.binary, - "--port=%s" % str(self.port)] + self._args - - class InternetExplorerDriverServer(WebDriverServer): def __init__(self, logger, binary="IEDriverServer.exe", port=None, base_path="", host="localhost", args=None): diff --git a/tools/wptrunner/wptrunner/wptcommandline.py b/tools/wptrunner/wptrunner/wptcommandline.py index b232462d915ab5..ad18e424cd5635 100644 --- a/tools/wptrunner/wptrunner/wptcommandline.py +++ b/tools/wptrunner/wptrunner/wptcommandline.py @@ -28,7 +28,7 @@ def require_arg(kwargs, name, value_func=None): if value_func is None: value_func = lambda x: x is not None - if not name in kwargs or not value_func(kwargs[name]): + if name not in kwargs or not value_func(kwargs[name]): print >> sys.stderr, "Missing required argument %s" % name sys.exit(1) @@ -97,7 +97,8 @@ def create_parser(product_choices=None): test_selection_group.add_argument("--skip-timeout", action="store_true", help="Skip tests that are expected to time out") test_selection_group.add_argument("--tag", action="append", dest="tags", - help="Labels applied to tests to include in the run. Labels starting dir: are equivalent to top-level directories.") + help="Labels applied to tests to include in the run. " + "Labels starting dir: are equivalent to top-level directories.") debugging_group = parser.add_argument_group("Debugging") debugging_group.add_argument('--debugger', const="__default__", nargs="?", @@ -479,7 +480,8 @@ def create_parser_update(product_choices=None): help="Don't create a VCS commit containing the changes.") parser.add_argument("--sync", dest="sync", action="store_true", default=False, help="Sync the tests with the latest from upstream (implies --patch)") - parser.add_argument("--ignore-existing", action="store_true", help="When updating test results only consider results from the logfiles provided, not existing expectations.") + parser.add_argument("--ignore-existing", action="store_true", + help="When updating test results only consider results from the logfiles provided, not existing expectations.") parser.add_argument("--stability", nargs="?", action="store", const="unstable", default=None, help=("Reason for disabling tests. When updating test results, disable tests that have " "inconsistent results across many runs with the given reason.")) diff --git a/tools/wptrunner/wptrunner/wptmanifest/tests/test_serializer.py b/tools/wptrunner/wptrunner/wptmanifest/tests/test_serializer.py index 6db2cbbbb477b4..6908ea4c1e020d 100644 --- a/tools/wptrunner/wptrunner/wptmanifest/tests/test_serializer.py +++ b/tools/wptrunner/wptrunner/wptmanifest/tests/test_serializer.py @@ -211,15 +211,15 @@ def test_escape_11(self): """) def test_atom_1(self): - self.compare(r"""key: @True + self.compare(r"""key: @True """) def test_atom_2(self): - self.compare(r"""key: @False + self.compare(r"""key: @False """) def test_atom_3(self): - self.compare(r"""key: @Reset + self.compare(r"""key: @Reset """) def test_atom_4(self): diff --git a/tools/wptrunner/wptrunner/wptmanifest/tests/test_tokenizer.py b/tools/wptrunner/wptrunner/wptmanifest/tests/test_tokenizer.py index 88176c5a169052..a64ce0c7bb7d8d 100644 --- a/tools/wptrunner/wptrunner/wptmanifest/tests/test_tokenizer.py +++ b/tools/wptrunner/wptrunner/wptmanifest/tests/test_tokenizer.py @@ -145,8 +145,7 @@ def test_key_14(self): (token_types.string, r"\nb")]) def test_list_0(self): - self.compare( -""" + self.compare(""" key: []""", [(token_types.string, "key"), (token_types.separator, ":"), @@ -154,8 +153,7 @@ def test_list_0(self): (token_types.list_end, "]")]) def test_list_1(self): - self.compare( -""" + self.compare(""" key: [a, "b"]""", [(token_types.string, "key"), (token_types.separator, ":"), @@ -165,8 +163,7 @@ def test_list_1(self): (token_types.list_end, "]")]) def test_list_2(self): - self.compare( -""" + self.compare(""" key: [a, b]""", [(token_types.string, "key"), @@ -177,8 +174,7 @@ def test_list_2(self): (token_types.list_end, "]")]) def test_list_3(self): - self.compare( -""" + self.compare(""" key: [a, #b] c]""", [(token_types.string, "key"), @@ -199,18 +195,16 @@ def test_list_5(self): c]""") def test_list_6(self): - self.compare( -"""key: [a , b]""", - [(token_types.string, "key"), - (token_types.separator, ":"), - (token_types.list_start, "["), - (token_types.string, "a"), - (token_types.string, "b"), - (token_types.list_end, "]")]) + self.compare("""key: [a , b]""", + [(token_types.string, "key"), + (token_types.separator, ":"), + (token_types.list_start, "["), + (token_types.string, "a"), + (token_types.string, "b"), + (token_types.list_end, "]")]) def test_expr_0(self): - self.compare( -""" + self.compare(""" key: if cond == 1: value""", [(token_types.string, "key"), @@ -224,8 +218,7 @@ def test_expr_0(self): (token_types.string, "value")]) def test_expr_1(self): - self.compare( -""" + self.compare(""" key: if cond == 1: value1 value2""", @@ -241,8 +234,7 @@ def test_expr_1(self): (token_types.string, "value2")]) def test_expr_2(self): - self.compare( -""" + self.compare(""" key: if cond=="1": value""", [(token_types.string, "key"), @@ -256,8 +248,7 @@ def test_expr_2(self): (token_types.string, "value")]) def test_expr_3(self): - self.compare( -""" + self.compare(""" key: if cond==1.1: value""", [(token_types.string, "key"), @@ -271,8 +262,7 @@ def test_expr_3(self): (token_types.string, "value")]) def test_expr_4(self): - self.compare( - """ + self.compare(""" key: if cond==1.1 and cond2 == "a": value""", [(token_types.string, "key"), @@ -290,8 +280,7 @@ def test_expr_4(self): (token_types.string, "value")]) def test_expr_5(self): - self.compare( -""" + self.compare(""" key: if (cond==1.1 ): value""", [(token_types.string, "key"), @@ -307,8 +296,7 @@ def test_expr_5(self): (token_types.string, "value")]) def test_expr_6(self): - self.compare( -""" + self.compare(""" key: if "\\ttest": value""", [(token_types.string, "key"), @@ -322,27 +310,26 @@ def test_expr_6(self): def test_expr_7(self): with self.assertRaises(parser.ParseError): self.tokenize( -""" + """ key: if 1A: value""") def test_expr_8(self): with self.assertRaises(parser.ParseError): self.tokenize( -""" + """ key: if 1a: value""") def test_expr_9(self): with self.assertRaises(parser.ParseError): self.tokenize( -""" + """ key: if 1.1.1: value""") def test_expr_10(self): - self.compare( -""" + self.compare(""" key: if 1.: value""", [(token_types.string, "key"), diff --git a/tools/wptrunner/wptrunner/wptrunner.py b/tools/wptrunner/wptrunner/wptrunner.py index 637cbe57b6f458..6677902a49a66b 100644 --- a/tools/wptrunner/wptrunner/wptrunner.py +++ b/tools/wptrunner/wptrunner/wptrunner.py @@ -307,7 +307,8 @@ def main(): return start(**kwargs) except Exception: if kwargs["pdb"]: - import pdb, traceback + import pdb + import traceback print traceback.format_exc() pdb.post_mortem() else: diff --git a/tools/wptrunner/wptrunner/wpttest.py b/tools/wptrunner/wptrunner/wpttest.py index d283e854205d58..9f4c1bed135536 100644 --- a/tools/wptrunner/wptrunner/wpttest.py +++ b/tools/wptrunner/wptrunner/wpttest.py @@ -356,7 +356,7 @@ def from_manifest(cls, return node def update_metadata(self, metadata): - if not "url_count" in metadata: + if "url_count" not in metadata: metadata["url_count"] = defaultdict(int) for reference, _ in self.references: # We assume a naive implementation in which a url with multiple diff --git a/tools/wptserve/wptserve/pipes.py b/tools/wptserve/wptserve/pipes.py index 7203815b70ce42..b71c8afa309148 100644 --- a/tools/wptserve/wptserve/pipes.py +++ b/tools/wptserve/wptserve/pipes.py @@ -6,6 +6,7 @@ import uuid from cStringIO import StringIO +from six import text_type def resolve_content(response): return b"".join(item for item in response.iter_content(read_file=True)) @@ -276,18 +277,18 @@ def slice(request, response, start, end=None): class ReplacementTokenizer(object): - def ident(scanner, token): + def ident(self, token): return ("ident", token) - def index(scanner, token): + def index(self, token): token = token[1:-1] try: token = int(token) except ValueError: - token = unicode(token, "utf8") + token = token.decode('utf8') return ("index", token) - def var(scanner, token): + def var(self, token): token = token[:-1] return ("var", token) @@ -425,7 +426,7 @@ def config_replacement(match): #Should possibly support escaping for other contexts e.g. script #TODO: read the encoding of the response - return escape_func(unicode(value)).encode("utf-8") + return escape_func(text_type(value)).encode("utf-8") template_regexp = re.compile(r"{{([^}]*)}}") new_content = template_regexp.sub(config_replacement, content) diff --git a/tools/wptserve/wptserve/response.py b/tools/wptserve/wptserve/response.py index 50ff00dde9440e..20b7b42699621e 100644 --- a/tools/wptserve/wptserve/response.py +++ b/tools/wptserve/wptserve/response.py @@ -9,6 +9,8 @@ from .constants import response_codes from .logger import get_logger +from six import string_types, binary_type, text_type + missing = object() class Response(object): @@ -400,7 +402,7 @@ def write_default_headers(self): if name.lower() not in self._headers_seen: self.write_header(name, f()) - if (type(self._response.content) in (str, unicode) and + if (isinstance(self._response.content, string_types) and "content-length" not in self._headers_seen): #Would be nice to avoid double-encoding here self.write_header("Content-Length", len(self.encode(self._response.content))) @@ -457,9 +459,9 @@ def write_content_file(self, data): def encode(self, data): """Convert unicode to bytes according to response.encoding.""" - if isinstance(data, str): + if isinstance(data, binary_type): return data - elif isinstance(data, unicode): + elif isinstance(data, text_type): return data.encode(self._response.encoding) else: raise ValueError diff --git a/tools/wptserve/wptserve/server.py b/tools/wptserve/wptserve/server.py index 2a83bd8097ef2d..f9ed238624b511 100644 --- a/tools/wptserve/wptserve/server.py +++ b/tools/wptserve/wptserve/server.py @@ -110,14 +110,15 @@ class WebTestServer(ThreadingMixIn, BaseHTTPServer.HTTPServer): # Ensure that we don't hang on shutdown waiting for requests daemon_threads = True - def __init__(self, server_address, RequestHandlerClass, router, rewriter, bind_hostname, + def __init__(self, server_address, request_handler_cls, + router, rewriter, bind_hostname, config=None, use_ssl=False, key_file=None, certificate=None, encrypt_after_connect=False, latency=None, **kwargs): """Server for HTTP(s) Requests :param server_address: tuple of (server_name, port) - :param RequestHandlerClass: BaseHTTPRequestHandler-like class to use for + :param request_handler_cls: BaseHTTPRequestHandler-like class to use for handling requests. :param router: Router instance to use for matching requests to handler @@ -161,7 +162,7 @@ def __init__(self, server_address, RequestHandlerClass, router, rewriter, bind_h hostname_port = ("",server_address[1]) #super doesn't work here because BaseHTTPServer.HTTPServer is old-style - BaseHTTPServer.HTTPServer.__init__(self, hostname_port, RequestHandlerClass, **kwargs) + BaseHTTPServer.HTTPServer.__init__(self, hostname_port, request_handler_cls, **kwargs) if config is not None: Server.config = config