Bug 1471629 - [wpt] Update pytest to version 3.6.2. draft
authorHenrik Skupin <mail@hskupin.info>
Thu, 28 Jun 2018 09:40:32 +0200
changeset 811776 815b8f7d78cebcec3058a9ef514349315c03d508
parent 811775 4bb930e8212083307ce90380b9ec21c6e1938b05
child 811777 899227105ef93546bd9f80393dbc7bb129e506db
push id114419
push userbmo:hskupin@gmail.com
push dateThu, 28 Jun 2018 08:51:00 +0000
bugs1471629
milestone63.0a1
Bug 1471629 - [wpt] Update pytest to version 3.6.2. MozReview-Commit-ID: JY1T0T7W4Ex
testing/web-platform/tests/tools/localpaths.py
testing/web-platform/tests/tools/third_party/pytest/.coveragerc
testing/web-platform/tests/tools/third_party/pytest/.github/PULL_REQUEST_TEMPLATE.md
testing/web-platform/tests/tools/third_party/pytest/.gitignore
testing/web-platform/tests/tools/third_party/pytest/.pre-commit-config.yaml
testing/web-platform/tests/tools/third_party/pytest/.travis.yml
testing/web-platform/tests/tools/third_party/pytest/AUTHORS
testing/web-platform/tests/tools/third_party/pytest/CHANGELOG.rst
testing/web-platform/tests/tools/third_party/pytest/CONTRIBUTING.rst
testing/web-platform/tests/tools/third_party/pytest/HOWTORELEASE.rst
testing/web-platform/tests/tools/third_party/pytest/README.rst
testing/web-platform/tests/tools/third_party/pytest/_pytest/__init__.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/_argcomplete.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/_code/__init__.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/_code/_py2traceback.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/_code/code.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/_code/source.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/assertion/__init__.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/assertion/rewrite.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/assertion/truncate.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/assertion/util.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/cacheprovider.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/capture.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/compat.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/config.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/debugging.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/deprecated.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/doctest.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/fixtures.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/freeze_support.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/helpconfig.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/hookspec.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/junitxml.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/logging.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/main.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/mark.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/monkeypatch.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/nodes.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/nose.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/outcomes.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/pastebin.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/pytester.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/python.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/python_api.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/recwarn.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/resultlog.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/runner.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/setuponly.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/setupplan.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/skipping.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/terminal.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/tmpdir.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/unittest.py
testing/web-platform/tests/tools/third_party/pytest/_pytest/warnings.py
testing/web-platform/tests/tools/third_party/pytest/appveyor.yml
testing/web-platform/tests/tools/third_party/pytest/bench/bench.py
testing/web-platform/tests/tools/third_party/pytest/bench/bench_argcomplete.py
testing/web-platform/tests/tools/third_party/pytest/bench/empty.py
testing/web-platform/tests/tools/third_party/pytest/bench/manyparam.py
testing/web-platform/tests/tools/third_party/pytest/bench/skip.py
testing/web-platform/tests/tools/third_party/pytest/changelog/2920.bugfix
testing/web-platform/tests/tools/third_party/pytest/changelog/2949.trivial
testing/web-platform/tests/tools/third_party/pytest/changelog/2956.bugfix
testing/web-platform/tests/tools/third_party/pytest/changelog/2957.bugfix
testing/web-platform/tests/tools/third_party/pytest/changelog/2963.doc
testing/web-platform/tests/tools/third_party/pytest/changelog/2971.bugfix
testing/web-platform/tests/tools/third_party/pytest/changelog/2984.bugfix
testing/web-platform/tests/tools/third_party/pytest/changelog/README.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/_templates/globaltoc.html
testing/web-platform/tests/tools/third_party/pytest/doc/en/_templates/links.html
testing/web-platform/tests/tools/third_party/pytest/doc/en/_themes/flask/theme.conf
testing/web-platform/tests/tools/third_party/pytest/doc/en/_themes/flask_theme_support.py
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/index.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.0.3.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.1.1.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.1.2.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.1.3.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.2.1.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.2.2.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.2.4.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.3.0.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.3.1.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.3.2.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.3.3.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.3.4.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.3.5.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.4.0.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.4.1.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.4.2.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.5.0.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.5.1.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.5.2.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.6.1.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.6.2.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.6.3.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.7.0.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.7.2.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.8.3.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.8.7.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.9.0.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.9.1.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.0.0.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.0.1.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.0.2.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.0.3.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.0.4.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.0.5.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.0.6.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.0.7.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.1.1.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.1.2.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.1.3.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.2.1.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.2.2.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.2.3.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.2.4.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.2.5.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.3.1.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.3.2.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.4.0.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.4.1.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.4.2.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.5.0.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.5.1.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.6.0.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.6.1.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.6.2.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/assert.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/backwards-compatibility.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/bash-completion.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/builtin.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/cache.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/capture.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/check_sphinx.py
testing/web-platform/tests/tools/third_party/pytest/doc/en/conf.py
testing/web-platform/tests/tools/third_party/pytest/doc/en/contact.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/contents.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/customize.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/development_guide.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/doctest.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/example/assertion/failure_demo.py
testing/web-platform/tests/tools/third_party/pytest/doc/en/example/assertion/global_testmodule_config/conftest.py
testing/web-platform/tests/tools/third_party/pytest/doc/en/example/assertion/global_testmodule_config/test_hello.py
testing/web-platform/tests/tools/third_party/pytest/doc/en/example/assertion/global_testmodule_config/test_hello_world.py
testing/web-platform/tests/tools/third_party/pytest/doc/en/example/assertion/test_failures.py
testing/web-platform/tests/tools/third_party/pytest/doc/en/example/assertion/test_setup_flow_example.py
testing/web-platform/tests/tools/third_party/pytest/doc/en/example/attic.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/example/costlysetup/conftest.py
testing/web-platform/tests/tools/third_party/pytest/doc/en/example/costlysetup/sub1/__init__.py
testing/web-platform/tests/tools/third_party/pytest/doc/en/example/costlysetup/sub1/test_quick.py
testing/web-platform/tests/tools/third_party/pytest/doc/en/example/costlysetup/sub2/__init__.py
testing/web-platform/tests/tools/third_party/pytest/doc/en/example/costlysetup/sub2/test_two.py
testing/web-platform/tests/tools/third_party/pytest/doc/en/example/costlysetup/sub_a/__init__.py
testing/web-platform/tests/tools/third_party/pytest/doc/en/example/costlysetup/sub_a/test_quick.py
testing/web-platform/tests/tools/third_party/pytest/doc/en/example/costlysetup/sub_b/__init__.py
testing/web-platform/tests/tools/third_party/pytest/doc/en/example/costlysetup/sub_b/test_two.py
testing/web-platform/tests/tools/third_party/pytest/doc/en/example/markers.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/example/multipython.py
testing/web-platform/tests/tools/third_party/pytest/doc/en/example/nonpython.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/example/nonpython/conftest.py
testing/web-platform/tests/tools/third_party/pytest/doc/en/example/parametrize.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/example/py2py3/conftest.py
testing/web-platform/tests/tools/third_party/pytest/doc/en/example/py2py3/test_py2.py
testing/web-platform/tests/tools/third_party/pytest/doc/en/example/py2py3/test_py3.py
testing/web-platform/tests/tools/third_party/pytest/doc/en/example/pythoncollection.py
testing/web-platform/tests/tools/third_party/pytest/doc/en/example/pythoncollection.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/example/reportingdemo.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/example/simple.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/example/special.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/example/xfail_demo.py
testing/web-platform/tests/tools/third_party/pytest/doc/en/faq.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/fixture.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/funcarg_compare.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/funcargs.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/genapi.py
testing/web-platform/tests/tools/third_party/pytest/doc/en/getting-started.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/goodpractices.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/index.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/links.inc
testing/web-platform/tests/tools/third_party/pytest/doc/en/logging.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/mark.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/monkeypatch.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/nose.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/parametrize.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/plugins.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/projects.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/proposals/parametrize_with_fixtures.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/reference.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/requirements.txt
testing/web-platform/tests/tools/third_party/pytest/doc/en/skipping.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/talks.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/test/attic.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/test/config.html
testing/web-platform/tests/tools/third_party/pytest/doc/en/test/dist.html
testing/web-platform/tests/tools/third_party/pytest/doc/en/test/extend.html
testing/web-platform/tests/tools/third_party/pytest/doc/en/test/index.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/test/mission.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/test/plugin/cov.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/test/plugin/coverage.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/test/plugin/django.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/test/plugin/figleaf.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/test/plugin/helpconfig.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/test/plugin/index.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/test/plugin/links.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/test/plugin/nose.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/test/plugin/oejskit.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/test/plugin/terminal.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/test/plugin/xdist.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/test/test.html
testing/web-platform/tests/tools/third_party/pytest/doc/en/tmpdir.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/unittest.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/usage.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/warnings.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/writing_plugins.rst
testing/web-platform/tests/tools/third_party/pytest/doc/en/xunit_setup.rst
testing/web-platform/tests/tools/third_party/pytest/extra/get_issues.py
testing/web-platform/tests/tools/third_party/pytest/pyproject.toml
testing/web-platform/tests/tools/third_party/pytest/pytest.py
testing/web-platform/tests/tools/third_party/pytest/scripts/check-rst.py
testing/web-platform/tests/tools/third_party/pytest/setup.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/__init__.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/_argcomplete.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/_code/__init__.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/_code/_py2traceback.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/_code/code.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/_code/source.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/assertion/__init__.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/assertion/rewrite.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/assertion/truncate.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/assertion/util.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/cacheprovider.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/capture.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/compat.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/config/__init__.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/config/argparsing.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/config/exceptions.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/config/findpaths.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/debugging.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/deprecated.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/doctest.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/fixtures.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/freeze_support.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/helpconfig.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/hookspec.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/junitxml.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/logging.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/main.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/mark/__init__.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/mark/evaluate.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/mark/legacy.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/mark/structures.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/monkeypatch.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/nodes.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/nose.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/outcomes.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/pastebin.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/pytester.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/python.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/python_api.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/recwarn.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/resultlog.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/runner.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/setuponly.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/setupplan.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/skipping.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/terminal.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/tmpdir.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/unittest.py
testing/web-platform/tests/tools/third_party/pytest/src/_pytest/warnings.py
testing/web-platform/tests/tools/third_party/pytest/src/pytest.py
testing/web-platform/tests/tools/third_party/pytest/tasks/__init__.py
testing/web-platform/tests/tools/third_party/pytest/tasks/generate.py
testing/web-platform/tests/tools/third_party/pytest/tasks/release.minor.rst
testing/web-platform/tests/tools/third_party/pytest/tasks/release.patch.rst
testing/web-platform/tests/tools/third_party/pytest/tasks/requirements.txt
testing/web-platform/tests/tools/third_party/pytest/testing/acceptance_test.py
testing/web-platform/tests/tools/third_party/pytest/testing/code/test_code.py
testing/web-platform/tests/tools/third_party/pytest/testing/code/test_excinfo.py
testing/web-platform/tests/tools/third_party/pytest/testing/code/test_source.py
testing/web-platform/tests/tools/third_party/pytest/testing/code/test_source_multiline_block.py
testing/web-platform/tests/tools/third_party/pytest/testing/deprecated_test.py
testing/web-platform/tests/tools/third_party/pytest/testing/freeze/.gitignore
testing/web-platform/tests/tools/third_party/pytest/testing/freeze/create_executable.py
testing/web-platform/tests/tools/third_party/pytest/testing/freeze/runtests_script.py
testing/web-platform/tests/tools/third_party/pytest/testing/freeze/tests/test_trivial.py
testing/web-platform/tests/tools/third_party/pytest/testing/freeze/tox_run.py
testing/web-platform/tests/tools/third_party/pytest/testing/logging/test_fixture.py
testing/web-platform/tests/tools/third_party/pytest/testing/logging/test_formatter.py
testing/web-platform/tests/tools/third_party/pytest/testing/logging/test_reporting.py
testing/web-platform/tests/tools/third_party/pytest/testing/python/approx.py
testing/web-platform/tests/tools/third_party/pytest/testing/python/collect.py
testing/web-platform/tests/tools/third_party/pytest/testing/python/fixture.py
testing/web-platform/tests/tools/third_party/pytest/testing/python/integration.py
testing/web-platform/tests/tools/third_party/pytest/testing/python/metafunc.py
testing/web-platform/tests/tools/third_party/pytest/testing/python/raises.py
testing/web-platform/tests/tools/third_party/pytest/testing/python/setup_only.py
testing/web-platform/tests/tools/third_party/pytest/testing/python/setup_plan.py
testing/web-platform/tests/tools/third_party/pytest/testing/python/show_fixtures_per_test.py
testing/web-platform/tests/tools/third_party/pytest/testing/python/test_deprecations.py
testing/web-platform/tests/tools/third_party/pytest/testing/test_argcomplete.py
testing/web-platform/tests/tools/third_party/pytest/testing/test_assertion.py
testing/web-platform/tests/tools/third_party/pytest/testing/test_assertrewrite.py
testing/web-platform/tests/tools/third_party/pytest/testing/test_cache.py
testing/web-platform/tests/tools/third_party/pytest/testing/test_cacheprovider.py
testing/web-platform/tests/tools/third_party/pytest/testing/test_capture.py
testing/web-platform/tests/tools/third_party/pytest/testing/test_collection.py
testing/web-platform/tests/tools/third_party/pytest/testing/test_compat.py
testing/web-platform/tests/tools/third_party/pytest/testing/test_config.py
testing/web-platform/tests/tools/third_party/pytest/testing/test_conftest.py
testing/web-platform/tests/tools/third_party/pytest/testing/test_doctest.py
testing/web-platform/tests/tools/third_party/pytest/testing/test_entry_points.py
testing/web-platform/tests/tools/third_party/pytest/testing/test_helpconfig.py
testing/web-platform/tests/tools/third_party/pytest/testing/test_junitxml.py
testing/web-platform/tests/tools/third_party/pytest/testing/test_mark.py
testing/web-platform/tests/tools/third_party/pytest/testing/test_modimport.py
testing/web-platform/tests/tools/third_party/pytest/testing/test_monkeypatch.py
testing/web-platform/tests/tools/third_party/pytest/testing/test_nodes.py
testing/web-platform/tests/tools/third_party/pytest/testing/test_nose.py
testing/web-platform/tests/tools/third_party/pytest/testing/test_parseopt.py
testing/web-platform/tests/tools/third_party/pytest/testing/test_pastebin.py
testing/web-platform/tests/tools/third_party/pytest/testing/test_pdb.py
testing/web-platform/tests/tools/third_party/pytest/testing/test_pluginmanager.py
testing/web-platform/tests/tools/third_party/pytest/testing/test_pytester.py
testing/web-platform/tests/tools/third_party/pytest/testing/test_recwarn.py
testing/web-platform/tests/tools/third_party/pytest/testing/test_resultlog.py
testing/web-platform/tests/tools/third_party/pytest/testing/test_runner.py
testing/web-platform/tests/tools/third_party/pytest/testing/test_runner_xunit.py
testing/web-platform/tests/tools/third_party/pytest/testing/test_session.py
testing/web-platform/tests/tools/third_party/pytest/testing/test_skipping.py
testing/web-platform/tests/tools/third_party/pytest/testing/test_terminal.py
testing/web-platform/tests/tools/third_party/pytest/testing/test_tmpdir.py
testing/web-platform/tests/tools/third_party/pytest/testing/test_unittest.py
testing/web-platform/tests/tools/third_party/pytest/testing/test_warnings.py
testing/web-platform/tests/tools/third_party/pytest/tox.ini
--- a/testing/web-platform/tests/tools/localpaths.py
+++ b/testing/web-platform/tests/tools/localpaths.py
@@ -10,11 +10,11 @@ sys.path.insert(0, os.path.join(here, "h
 sys.path.insert(0, os.path.join(here, "wptserve"))
 sys.path.insert(0, os.path.join(here, "pywebsocket"))
 sys.path.insert(0, os.path.join(here, "third_party", "atomicwrites"))
 sys.path.insert(0, os.path.join(here, "third_party", "attrs", "src"))
 sys.path.insert(0, os.path.join(here, "third_party", "funcsigs"))
 sys.path.insert(0, os.path.join(here, "third_party", "more-itertools"))
 sys.path.insert(0, os.path.join(here, "third_party", "pluggy"))
 sys.path.insert(0, os.path.join(here, "third_party", "py"))
-sys.path.insert(0, os.path.join(here, "third_party", "pytest"))
+sys.path.insert(0, os.path.join(here, "third_party", "pytest", "src"))
 sys.path.insert(0, os.path.join(here, "webdriver"))
 sys.path.insert(0, os.path.join(here, "wptrunner"))
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/tools/third_party/pytest/.coveragerc
@@ -0,0 +1,4 @@
+[run]
+omit =
+    # standlonetemplate is read dynamically and tested by test_genscript
+    *standalonetemplate.py
--- a/testing/web-platform/tests/tools/third_party/pytest/.github/PULL_REQUEST_TEMPLATE.md
+++ b/testing/web-platform/tests/tools/third_party/pytest/.github/PULL_REQUEST_TEMPLATE.md
@@ -1,15 +1,14 @@
 Thanks for submitting a PR, your contribution is really appreciated!
 
-Here's a quick checklist that should be present in PRs:
+Here's a quick checklist that should be present in PRs (you can delete this text from the final description, this is
+just a guideline):
 
-- [ ] Add a new news fragment into the changelog folder
-  * name it `$issue_id.$type` for example (588.bug)
-  * if you don't have an issue_id change it to the pr id after creating the pr
-  * ensure type is one of `removal`, `feature`, `bugfix`, `vendor`, `doc` or `trivial`
-  * Make sure to use full sentences with correct case and punctuation, for example: "Fix issue with non-ascii contents in doctest text files."
-- [ ] Target: for `bugfix`, `vendor`, `doc` or `trivial` fixes, target `master`; for removals or features target `features`;
-- [ ] Make sure to include reasonable tests for your change if necessary
+- [ ] Create a new changelog file in the `changelog` folder, with a name like `<ISSUE NUMBER>.<TYPE>.rst`. See [changelog/README.rst](/changelog/README.rst) for details.
+- [ ] Target the `master` branch for bug fixes, documentation updates and trivial changes.
+- [ ] Target the `features` branch for new features and removals/deprecations.
+- [ ] Include documentation when adding new features.
+- [ ] Include new tests or update existing tests when applicable.
 
-Unless your change is a trivial or a documentation fix (e.g.,  a typo or reword of a small section) please:
+Unless your change is trivial or a small documentation fix (e.g.,  a typo or reword of a small section) please:
 
-- [ ] Add yourself to `AUTHORS`, in alphabetical order;
+- [ ] Add yourself to `AUTHORS` in alphabetical order;
--- a/testing/web-platform/tests/tools/third_party/pytest/.gitignore
+++ b/testing/web-platform/tests/tools/third_party/pytest/.gitignore
@@ -14,26 +14,27 @@ include/
 *.pyo
 *.swp
 *.class
 *.orig
 *~
 .hypothesis/
 
 # autogenerated
-_pytest/_version.py
+src/_pytest/_version.py
 # setuptools
 .eggs/
 
 doc/*/_build
 build/
 dist/
 *.egg-info
 issue/
 env/
 .env/
 3rdparty/
 .tox
 .cache
+.pytest_cache
 .coverage
 .ropeproject
 .idea
 .hypothesis
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/tools/third_party/pytest/.pre-commit-config.yaml
@@ -0,0 +1,36 @@
+exclude: doc/en/example/py2py3/test_py2.py
+repos:
+-   repo: https://github.com/ambv/black
+    rev: 18.4a4
+    hooks:
+    -   id: black
+        args: [--safe, --quiet]
+        language_version: python3.6
+-   repo: https://github.com/asottile/blacken-docs
+    rev: v0.1.1
+    hooks:
+    -   id: blacken-docs
+        additional_dependencies: [black==18.5b1]
+        language_version: python3.6
+-   repo: https://github.com/pre-commit/pre-commit-hooks
+    rev: v1.2.3
+    hooks:
+    -   id: trailing-whitespace
+    -   id: end-of-file-fixer
+    -   id: check-yaml
+    -   id: debug-statements
+        exclude: _pytest/debugging.py
+    -   id: flake8
+-   repo: https://github.com/asottile/pyupgrade
+    rev: v1.2.0
+    hooks:
+    - id: pyupgrade
+-   repo: local
+    hooks:
+    -   id: rst
+        name: rst
+        entry: rst-lint --encoding utf-8
+        files: ^(CHANGELOG.rst|HOWTORELEASE.rst|README.rst|changelog/.*)$
+        language: python
+        additional_dependencies: [pygments, restructuredtext_lint]
+        python_version: python3.6
--- a/testing/web-platform/tests/tools/third_party/pytest/.travis.yml
+++ b/testing/web-platform/tests/tools/third_party/pytest/.travis.yml
@@ -1,22 +1,24 @@
 sudo: false
 language: python
+stages:
+- linting
+- test
+- deploy
 python:
   - '3.6'
-# command to install dependencies
 install:
   - pip install --upgrade --pre tox
-# # command to run tests
 env:
   matrix:
     # coveralls is not listed in tox's envlist, but should run in travis
     - TOXENV=coveralls
     # note: please use "tox --listenvs" to populate the build matrix below
-    - TOXENV=linting
+    # please remove the linting env in all cases
     - TOXENV=py27
     - TOXENV=py34
     - TOXENV=py36
     - TOXENV=py27-pexpect
     - TOXENV=py27-xdist
     - TOXENV=py27-trial
     - TOXENV=py27-numpy
     - TOXENV=py27-pluggymaster
@@ -24,33 +26,58 @@ env:
     - TOXENV=py36-xdist
     - TOXENV=py36-trial
     - TOXENV=py36-numpy
     - TOXENV=py36-pluggymaster
     - TOXENV=py27-nobyte
     - TOXENV=doctesting
     - TOXENV=docs
 
-matrix:
+jobs:
   include:
     - env: TOXENV=pypy
       python: 'pypy-5.4'
     - env: TOXENV=py35
       python: '3.5'
     - env: TOXENV=py35-freeze
       python: '3.5'
     - env: TOXENV=py37
       python: 'nightly'
-  allow_failures:
-    - env: TOXENV=py37
-      python: 'nightly'
+
+    - stage: deploy
+      python: '3.6'
+      env:
+      install: pip install -U setuptools setuptools_scm
+      script: skip
+      deploy:
+        provider: pypi
+        user: nicoddemus
+        distributions: sdist bdist_wheel
+        skip_upload_docs: true
+        password:
+          secure: xanTgTUu6XDQVqB/0bwJQXoDMnU5tkwZc5koz6mBkkqZhKdNOi2CLoC1XhiSZ+ah24l4V1E0GAqY5kBBcy9d7NVe4WNg4tD095LsHw+CRU6/HCVIFfyk2IZ+FPAlguesCcUiJSXOrlBF+Wj68wEvLoK7EoRFbJeiZ/f91Ww1sbtDlqXABWGHrmhPJL5Wva7o7+wG7JwJowqdZg1pbQExsCc7b53w4v2RBu3D6TJaTAzHiVsW+nUSI67vKI/uf+cR/OixsTfy37wlHgSwihYmrYLFls3V0bSpahCim3bCgMaFZx8S8xrdgJ++PzBCof2HeflFKvW+VCkoYzGEG4NrTWJoNz6ni4red9GdvfjGH3YCjAKS56h9x58zp2E5rpsb/kVq5/45xzV+dq6JRuhQ1nJWjBC6fSKAc/bfwnuFK3EBxNLkvBssLHvsNjj5XG++cB8DdS9wVGUqjpoK4puaXUWFqy4q3S9F86HEsKNgExtieA9qNx+pCIZVs6JCXZNjr0I5eVNzqJIyggNgJG6RyravsU35t9Zd9doL5g4Y7UKmAGTn1Sz24HQ4sMQgXdm2SyD8gEK5je4tlhUvfGtDvMSlstq71kIn9nRpFnqB6MFlbYSEAZmo8dGbCquoUc++6Rum208wcVbrzzVtGlXB/Ow9AbFMYeAGA0+N/K1e59c=
+        on:
+          tags: true
+          repo: pytest-dev/pytest
+    - stage: linting
+      python: '3.6'
+      env:
+      install:
+      - pip install pre-commit
+      - pre-commit install-hooks
+      script:
+      - pre-commit run --all-files
 
 script: tox --recreate
 
 notifications:
   irc:
     channels:
       - "chat.freenode.net#pytest"
     on_success: change
     on_failure: change
     skip_join: true
   email:
     - pytest-commit@python.org
+cache:
+    directories:
+        - $HOME/.cache/pip
+        - $HOME/.cache/pre-commit
--- a/testing/web-platform/tests/tools/third_party/pytest/AUTHORS
+++ b/testing/web-platform/tests/tools/third_party/pytest/AUTHORS
@@ -1,48 +1,57 @@
 Holger Krekel, holger at merlinux eu
 merlinux GmbH, Germany, office at merlinux eu
 
 Contributors include::
 
+Aaron Coleman
 Abdeali JK
 Abhijeet Kasurde
 Ahn Ki-Wook
+Alan Velasco
 Alexander Johnson
 Alexei Kozlenok
 Anatoly Bubenkoff
+Anders Hovmöller
 Andras Tim
 Andreas Zeidler
 Andrzej Ostrowski
 Andy Freeland
 Anthon van der Neut
+Anthony Shaw
 Anthony Sottile
 Antony Lee
 Armin Rigo
+Aron Coyle
 Aron Curzon
+Aviral Verma
 Aviv Palivoda
 Barney Gale
 Ben Webb
 Benjamin Peterson
 Bernard Pratz
 Bob Ippolito
 Brian Dorsey
+Brian Maissy
 Brian Okken
 Brianna Laugher
 Bruno Oliveira
 Cal Leeming
 Carl Friedrich Bolz
+Carlos Jenkins
 Ceridwen
 Charles Cloud
 Charnjit SiNGH (CCSJ)
 Chris Lamb
 Christian Boelsen
 Christian Theunert
 Christian Tismer
 Christopher Gilling
+Cyrus Maden
 Daniel Grana
 Daniel Hahler
 Daniel Nuri
 Daniel Wandschneider
 Danielle Jenkins
 Dave Hunt
 David Díaz-Barquero
 David Mohr
@@ -68,40 +77,47 @@ Floris Bruynooghe
 Gabriel Reis
 George Kussumoto
 Georgy Dyuldin
 Graham Horler
 Greg Price
 Grig Gheorghiu
 Grigorii Eremeev (budulianin)
 Guido Wesdorp
+Guoqiang Zhang
 Harald Armin Massa
+Henk-Jaap Wagenaar
 Hugo van Kemenade
 Hui Wang (coldnight)
 Ian Bicking
+Ian Lesperance
 Jaap Broekhuizen
 Jan Balster
 Janne Vanhala
 Jason R. Coombs
 Javier Domingo Cansino
 Javier Romero
+Jeff Rackauckas
 Jeff Widman
 John Eddie Ayson
 John Towler
 Jon Sonesen
 Jonas Obrist
 Jordan Guymon
 Jordan Moldow
+Jordan Speicher
 Joshua Bronson
 Jurko Gospodnetić
 Justyna Janczyszyn
 Kale Kundert
 Katarzyna Jachim
+Katerina Koukiou
 Kevin Cox
 Kodi B. Arfer
+Kostis Anagnostopoulos
 Lawrence Mitchell
 Lee Kamentsky
 Lev Maximov
 Llandy Riveron Del Risco
 Loic Esteve
 Lukas Bednar
 Luke Murphy
 Maciek Fijalkowski
@@ -126,32 +142,36 @@ Maxim Filipenko
 mbyt
 Michael Aquilina
 Michael Birtwell
 Michael Droettboom
 Michael Seifert
 Michal Wajszczuk
 Mihai Capotă
 Mike Lundy
+Miro Hrončok
 Nathaniel Waisbrot
 Ned Batchelder
 Neven Mundar
 Nicolas Delaby
 Oleg Pidsadnyi
+Oleg Sushchenko
 Oliver Bestwalter
 Omar Kohl
 Omer Hadari
 Patrick Hayes
 Paweł Adamczak
+Pedro Algarvio
 Pieter Mulder
 Piotr Banaszkiewicz
 Punyashloka Biswal
 Quentin Pradet
 Ralf Schmitt
 Ran Benita
+Raphael Castaneda
 Raphael Pierzina
 Raquel Alegre
 Ravi Chandra
 Roberto Polli
 Romain Dorgueil
 Roman Bolshakov
 Ronny Pfannschmidt
 Ross Lawley
@@ -168,22 +188,26 @@ Stefan Zimmermann
 Stefano Taschini
 Steffen Allner
 Stephan Obermann
 Tarcisio Fischer
 Tareq Alayan
 Ted Xiao
 Thomas Grainger
 Thomas Hisch
+Tim Strazny
 Tom Dalton
 Tom Viner
 Trevor Bekolay
 Tyler Goodlet
+Tzu-ping Chung
 Vasily Kuznetsov
 Victor Uriarte
 Vidar T. Fauske
 Vitaly Lashmanov
 Vlad Dragos
+William Lee
 Wouter van Ackooy
 Xuan Luong
 Xuecong Liao
 Zoltán Máté
 Roland Puntaier
+Allan Feldman
--- a/testing/web-platform/tests/tools/third_party/pytest/CHANGELOG.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/CHANGELOG.rst
@@ -1,18 +1,707 @@
-.. 
+..
     You should *NOT* be adding new change log entries to this file, this
     file is managed by towncrier. You *may* edit previous change logs to
     fix problems like typo corrections or such.
     To add a new change log entry, please see
     https://pip.pypa.io/en/latest/development/#adding-a-news-entry
     we named the news folder changelog
 
 .. towncrier release notes start
 
+Pytest 3.6.2 (2018-06-20)
+=========================
+
+Bug Fixes
+---------
+
+- Fix regression in ``Node.add_marker`` by extracting the mark object of a
+  ``MarkDecorator``. (`#3555
+  <https://github.com/pytest-dev/pytest/issues/3555>`_)
+
+- Warnings without ``location`` were reported as ``None``. This is corrected to
+  now report ``<undetermined location>``. (`#3563
+  <https://github.com/pytest-dev/pytest/issues/3563>`_)
+
+- Continue to call finalizers in the stack when a finalizer in a former scope
+  raises an exception. (`#3569
+  <https://github.com/pytest-dev/pytest/issues/3569>`_)
+
+- Fix encoding error with `print` statements in doctests (`#3583
+  <https://github.com/pytest-dev/pytest/issues/3583>`_)
+
+
+Improved Documentation
+----------------------
+
+- Add documentation for the ``--strict`` flag. (`#3549
+  <https://github.com/pytest-dev/pytest/issues/3549>`_)
+
+
+Trivial/Internal Changes
+------------------------
+
+- Update old quotation style to parens in fixture.rst documentation. (`#3525
+  <https://github.com/pytest-dev/pytest/issues/3525>`_)
+
+- Improve display of hint about ``--fulltrace`` with ``KeyboardInterrupt``.
+  (`#3545 <https://github.com/pytest-dev/pytest/issues/3545>`_)
+
+- pytest's testsuite is no longer runnable through ``python setup.py test`` --
+  instead invoke ``pytest`` or ``tox`` directly. (`#3552
+  <https://github.com/pytest-dev/pytest/issues/3552>`_)
+
+- Fix typo in documentation (`#3567
+  <https://github.com/pytest-dev/pytest/issues/3567>`_)
+
+
+Pytest 3.6.1 (2018-06-05)
+=========================
+
+Bug Fixes
+---------
+
+- Fixed a bug where stdout and stderr were logged twice by junitxml when a test
+  was marked xfail. (`#3491
+  <https://github.com/pytest-dev/pytest/issues/3491>`_)
+
+- Fix ``usefixtures`` mark applyed to unittest tests by correctly instantiating
+  ``FixtureInfo``. (`#3498
+  <https://github.com/pytest-dev/pytest/issues/3498>`_)
+
+- Fix assertion rewriter compatibility with libraries that monkey patch
+  ``file`` objects. (`#3503
+  <https://github.com/pytest-dev/pytest/issues/3503>`_)
+
+
+Improved Documentation
+----------------------
+
+- Added a section on how to use fixtures as factories to the fixture
+  documentation. (`#3461 <https://github.com/pytest-dev/pytest/issues/3461>`_)
+
+
+Trivial/Internal Changes
+------------------------
+
+- Enable caching for pip/pre-commit in order to reduce build time on
+  travis/appveyor. (`#3502
+  <https://github.com/pytest-dev/pytest/issues/3502>`_)
+
+- Switch pytest to the src/ layout as we already suggested it for good practice
+  - now we implement it as well. (`#3513
+  <https://github.com/pytest-dev/pytest/issues/3513>`_)
+
+- Fix if in tests to support 3.7.0b5, where a docstring handling in AST got
+  reverted. (`#3530 <https://github.com/pytest-dev/pytest/issues/3530>`_)
+
+- Remove some python2.5 compatibility code. (`#3529
+  <https://github.com/pytest-dev/pytest/issues/3529>`_)
+
+
+Pytest 3.6.0 (2018-05-23)
+=========================
+
+Features
+--------
+
+- Revamp the internals of the ``pytest.mark`` implementation with correct per
+  node handling which fixes a number of long standing bugs caused by the old
+  design. This introduces new ``Node.iter_markers(name)`` and
+  ``Node.get_closest_mark(name)`` APIs. Users are **strongly encouraged** to
+  read the `reasons for the revamp in the docs
+  <https://docs.pytest.org/en/latest/mark.html#marker-revamp-and-iteration>`_,
+  or jump over to details about `updating existing code to use the new APIs
+  <https://docs.pytest.org/en/latest/mark.html#updating-code>`_. (`#3317
+  <https://github.com/pytest-dev/pytest/issues/3317>`_)
+
+- Now when ``@pytest.fixture`` is applied more than once to the same function a
+  ``ValueError`` is raised. This buggy behavior would cause surprising problems
+  and if was working for a test suite it was mostly by accident. (`#2334
+  <https://github.com/pytest-dev/pytest/issues/2334>`_)
+
+- Support for Python 3.7's builtin ``breakpoint()`` method, see `Using the
+  builtin breakpoint function
+  <https://docs.pytest.org/en/latest/usage.html#breakpoint-builtin>`_ for
+  details. (`#3180 <https://github.com/pytest-dev/pytest/issues/3180>`_)
+
+- ``monkeypatch`` now supports a ``context()`` function which acts as a context
+  manager which undoes all patching done within the ``with`` block. (`#3290
+  <https://github.com/pytest-dev/pytest/issues/3290>`_)
+
+- The ``--pdb`` option now causes KeyboardInterrupt to enter the debugger,
+  instead of stopping the test session. On python 2.7, hitting CTRL+C again
+  exits the debugger. On python 3.2 and higher, use CTRL+D. (`#3299
+  <https://github.com/pytest-dev/pytest/issues/3299>`_)
+
+- pytest not longer changes the log level of the root logger when the
+  ``log-level`` parameter has greater numeric value than that of the level of
+  the root logger, which makes it play better with custom logging configuration
+  in user code. (`#3307 <https://github.com/pytest-dev/pytest/issues/3307>`_)
+
+
+Bug Fixes
+---------
+
+- A rare race-condition which might result in corrupted ``.pyc`` files on
+  Windows has been hopefully solved. (`#3008
+  <https://github.com/pytest-dev/pytest/issues/3008>`_)
+
+- Also use iter_marker for discovering the marks applying for marker
+  expressions from the cli to avoid the bad data from the legacy mark storage.
+  (`#3441 <https://github.com/pytest-dev/pytest/issues/3441>`_)
+
+- When showing diffs of failed assertions where the contents contain only
+  whitespace, escape them using ``repr()`` first to make it easy to spot the
+  differences. (`#3443 <https://github.com/pytest-dev/pytest/issues/3443>`_)
+
+
+Improved Documentation
+----------------------
+
+- Change documentation copyright year to a range which auto-updates itself each
+  time it is published. (`#3303
+  <https://github.com/pytest-dev/pytest/issues/3303>`_)
+
+
+Trivial/Internal Changes
+------------------------
+
+- ``pytest`` now depends on the `python-atomicwrites
+  <https://github.com/untitaker/python-atomicwrites>`_ library. (`#3008
+  <https://github.com/pytest-dev/pytest/issues/3008>`_)
+
+- Update all pypi.python.org URLs to pypi.org. (`#3431
+  <https://github.com/pytest-dev/pytest/issues/3431>`_)
+
+- Detect `pytest_` prefixed hooks using the internal plugin manager since
+  ``pluggy`` is deprecating the ``implprefix`` argument to ``PluginManager``.
+  (`#3487 <https://github.com/pytest-dev/pytest/issues/3487>`_)
+
+- Import ``Mapping`` and ``Sequence`` from ``_pytest.compat`` instead of
+  directly from ``collections`` in ``python_api.py::approx``. Add ``Mapping``
+  to ``_pytest.compat``, import it from ``collections`` on python 2, but from
+  ``collections.abc`` on Python 3 to avoid a ``DeprecationWarning`` on Python
+  3.7 or newer. (`#3497 <https://github.com/pytest-dev/pytest/issues/3497>`_)
+
+
+Pytest 3.5.1 (2018-04-23)
+=========================
+
+
+Bug Fixes
+---------
+
+- Reset ``sys.last_type``, ``sys.last_value`` and ``sys.last_traceback`` before
+  each test executes. Those attributes are added by pytest during the test run
+  to aid debugging, but were never reset so they would create a leaking
+  reference to the last failing test's frame which in turn could never be
+  reclaimed by the garbage collector. (`#2798
+  <https://github.com/pytest-dev/pytest/issues/2798>`_)
+
+- ``pytest.raises`` now raises ``TypeError`` when receiving an unknown keyword
+  argument. (`#3348 <https://github.com/pytest-dev/pytest/issues/3348>`_)
+
+- ``pytest.raises`` now works with exception classes that look like iterables.
+  (`#3372 <https://github.com/pytest-dev/pytest/issues/3372>`_)
+
+
+Improved Documentation
+----------------------
+
+- Fix typo in ``caplog`` fixture documentation, which incorrectly identified
+  certain attributes as methods. (`#3406
+  <https://github.com/pytest-dev/pytest/issues/3406>`_)
+
+
+Trivial/Internal Changes
+------------------------
+
+- Added a more indicative error message when parametrizing a function whose
+  argument takes a default value. (`#3221
+  <https://github.com/pytest-dev/pytest/issues/3221>`_)
+
+- Remove internal ``_pytest.terminal.flatten`` function in favor of
+  ``more_itertools.collapse``. (`#3330
+  <https://github.com/pytest-dev/pytest/issues/3330>`_)
+
+- Import some modules from ``collections.abc`` instead of ``collections`` as
+  the former modules trigger ``DeprecationWarning`` in Python 3.7. (`#3339
+  <https://github.com/pytest-dev/pytest/issues/3339>`_)
+
+- record_property is no longer experimental, removing the warnings was
+  forgotten. (`#3360 <https://github.com/pytest-dev/pytest/issues/3360>`_)
+
+- Mention in documentation and CLI help that fixtures with leading ``_`` are
+  printed by ``pytest --fixtures`` only if the ``-v`` option is added. (`#3398
+  <https://github.com/pytest-dev/pytest/issues/3398>`_)
+
+
+Pytest 3.5.0 (2018-03-21)
+=========================
+
+Deprecations and Removals
+-------------------------
+
+- ``record_xml_property`` fixture is now deprecated in favor of the more
+  generic ``record_property``. (`#2770
+  <https://github.com/pytest-dev/pytest/issues/2770>`_)
+
+- Defining ``pytest_plugins`` is now deprecated in non-top-level conftest.py
+  files, because they "leak" to the entire directory tree. (`#3084
+  <https://github.com/pytest-dev/pytest/issues/3084>`_)
+
+
+Features
+--------
+
+- New ``--show-capture`` command-line option that allows to specify how to
+  display captured output when tests fail: ``no``, ``stdout``, ``stderr``,
+  ``log`` or ``all`` (the default). (`#1478
+  <https://github.com/pytest-dev/pytest/issues/1478>`_)
+
+- New ``--rootdir`` command-line option to override the rules for discovering
+  the root directory. See `customize
+  <https://docs.pytest.org/en/latest/customize.html>`_ in the documentation for
+  details. (`#1642 <https://github.com/pytest-dev/pytest/issues/1642>`_)
+
+- Fixtures are now instantiated based on their scopes, with higher-scoped
+  fixtures (such as ``session``) being instantiated first than lower-scoped
+  fixtures (such as ``function``). The relative order of fixtures of the same
+  scope is kept unchanged, based in their declaration order and their
+  dependencies. (`#2405 <https://github.com/pytest-dev/pytest/issues/2405>`_)
+
+- ``record_xml_property`` renamed to ``record_property`` and is now compatible
+  with xdist, markers and any reporter. ``record_xml_property`` name is now
+  deprecated. (`#2770 <https://github.com/pytest-dev/pytest/issues/2770>`_)
+
+- New ``--nf``, ``--new-first`` options: run new tests first followed by the
+  rest of the tests, in both cases tests are also sorted by the file modified
+  time, with more recent files coming first. (`#3034
+  <https://github.com/pytest-dev/pytest/issues/3034>`_)
+
+- New ``--last-failed-no-failures`` command-line option that allows to specify
+  the behavior of the cache plugin's ```--last-failed`` feature when no tests
+  failed in the last run (or no cache was found): ``none`` or ``all`` (the
+  default). (`#3139 <https://github.com/pytest-dev/pytest/issues/3139>`_)
+
+- New ``--doctest-continue-on-failure`` command-line option to enable doctests
+  to show multiple failures for each snippet, instead of stopping at the first
+  failure. (`#3149 <https://github.com/pytest-dev/pytest/issues/3149>`_)
+
+- Captured log messages are added to the ``<system-out>`` tag in the generated
+  junit xml file if the ``junit_logging`` ini option is set to ``system-out``.
+  If the value of this ini option is ``system-err``, the logs are written to
+  ``<system-err>``. The default value for ``junit_logging`` is ``no``, meaning
+  captured logs are not written to the output file. (`#3156
+  <https://github.com/pytest-dev/pytest/issues/3156>`_)
+
+- Allow the logging plugin to handle ``pytest_runtest_logstart`` and
+  ``pytest_runtest_logfinish`` hooks when live logs are enabled. (`#3189
+  <https://github.com/pytest-dev/pytest/issues/3189>`_)
+
+- Passing `--log-cli-level` in the command-line now automatically activates
+  live logging. (`#3190 <https://github.com/pytest-dev/pytest/issues/3190>`_)
+
+- Add command line option ``--deselect`` to allow deselection of individual
+  tests at collection time. (`#3198
+  <https://github.com/pytest-dev/pytest/issues/3198>`_)
+
+- Captured logs are printed before entering pdb. (`#3204
+  <https://github.com/pytest-dev/pytest/issues/3204>`_)
+
+- Deselected item count is now shown before tests are run, e.g. ``collected X
+  items / Y deselected``. (`#3213
+  <https://github.com/pytest-dev/pytest/issues/3213>`_)
+
+- The builtin module ``platform`` is now available for use in expressions in
+  ``pytest.mark``. (`#3236
+  <https://github.com/pytest-dev/pytest/issues/3236>`_)
+
+- The *short test summary info* section now is displayed after tracebacks and
+  warnings in the terminal. (`#3255
+  <https://github.com/pytest-dev/pytest/issues/3255>`_)
+
+- New ``--verbosity`` flag to set verbosity level explicitly. (`#3296
+  <https://github.com/pytest-dev/pytest/issues/3296>`_)
+
+- ``pytest.approx`` now accepts comparing a numpy array with a scalar. (`#3312
+  <https://github.com/pytest-dev/pytest/issues/3312>`_)
+
+
+Bug Fixes
+---------
+
+- Suppress ``IOError`` when closing the temporary file used for capturing
+  streams in Python 2.7. (`#2370
+  <https://github.com/pytest-dev/pytest/issues/2370>`_)
+
+- Fixed ``clear()`` method on ``caplog`` fixture which cleared ``records``, but
+  not the ``text`` property. (`#3297
+  <https://github.com/pytest-dev/pytest/issues/3297>`_)
+
+- During test collection, when stdin is not allowed to be read, the
+  ``DontReadFromStdin`` object still allow itself to be iterable and resolved
+  to an iterator without crashing. (`#3314
+  <https://github.com/pytest-dev/pytest/issues/3314>`_)
+
+
+Improved Documentation
+----------------------
+
+- Added a `reference <https://docs.pytest.org/en/latest/reference.html>`_ page
+  to the docs. (`#1713 <https://github.com/pytest-dev/pytest/issues/1713>`_)
+
+
+Trivial/Internal Changes
+------------------------
+
+- Change minimum requirement of ``attrs`` to ``17.4.0``. (`#3228
+  <https://github.com/pytest-dev/pytest/issues/3228>`_)
+
+- Renamed example directories so all tests pass when ran from the base
+  directory. (`#3245 <https://github.com/pytest-dev/pytest/issues/3245>`_)
+
+- Internal ``mark.py`` module has been turned into a package. (`#3250
+  <https://github.com/pytest-dev/pytest/issues/3250>`_)
+
+- ``pytest`` now depends on the `more-itertools
+  <https://github.com/erikrose/more-itertools>`_ package. (`#3265
+  <https://github.com/pytest-dev/pytest/issues/3265>`_)
+
+- Added warning when ``[pytest]`` section is used in a ``.cfg`` file passed
+  with ``-c`` (`#3268 <https://github.com/pytest-dev/pytest/issues/3268>`_)
+
+- ``nodeids`` can now be passed explicitly to ``FSCollector`` and ``Node``
+  constructors. (`#3291 <https://github.com/pytest-dev/pytest/issues/3291>`_)
+
+- Internal refactoring of ``FormattedExcinfo`` to use ``attrs`` facilities and
+  remove old support code for legacy Python versions. (`#3292
+  <https://github.com/pytest-dev/pytest/issues/3292>`_)
+
+- Refactoring to unify how verbosity is handled internally. (`#3296
+  <https://github.com/pytest-dev/pytest/issues/3296>`_)
+
+- Internal refactoring to better integrate with argparse. (`#3304
+  <https://github.com/pytest-dev/pytest/issues/3304>`_)
+
+- Fix a python example when calling a fixture in doc/en/usage.rst (`#3308
+  <https://github.com/pytest-dev/pytest/issues/3308>`_)
+
+
+Pytest 3.4.2 (2018-03-04)
+=========================
+
+Bug Fixes
+---------
+
+- Removed progress information when capture option is ``no``. (`#3203
+  <https://github.com/pytest-dev/pytest/issues/3203>`_)
+
+- Refactor check of bindir from ``exists`` to ``isdir``. (`#3241
+  <https://github.com/pytest-dev/pytest/issues/3241>`_)
+
+- Fix ``TypeError`` issue when using ``approx`` with a ``Decimal`` value.
+  (`#3247 <https://github.com/pytest-dev/pytest/issues/3247>`_)
+
+- Fix reference cycle generated when using the ``request`` fixture. (`#3249
+  <https://github.com/pytest-dev/pytest/issues/3249>`_)
+
+- ``[tool:pytest]`` sections in ``*.cfg`` files passed by the ``-c`` option are
+  now properly recognized. (`#3260
+  <https://github.com/pytest-dev/pytest/issues/3260>`_)
+
+
+Improved Documentation
+----------------------
+
+- Add logging plugin to plugins list. (`#3209
+  <https://github.com/pytest-dev/pytest/issues/3209>`_)
+
+
+Trivial/Internal Changes
+------------------------
+
+- Fix minor typo in fixture.rst (`#3259
+  <https://github.com/pytest-dev/pytest/issues/3259>`_)
+
+
+Pytest 3.4.1 (2018-02-20)
+=========================
+
+Bug Fixes
+---------
+
+- Move import of ``doctest.UnexpectedException`` to top-level to avoid possible
+  errors when using ``--pdb``. (`#1810
+  <https://github.com/pytest-dev/pytest/issues/1810>`_)
+
+- Added printing of captured stdout/stderr before entering pdb, and improved a
+  test which was giving false negatives about output capturing. (`#3052
+  <https://github.com/pytest-dev/pytest/issues/3052>`_)
+
+- Fix ordering of tests using parametrized fixtures which can lead to fixtures
+  being created more than necessary. (`#3161
+  <https://github.com/pytest-dev/pytest/issues/3161>`_)
+
+- Fix bug where logging happening at hooks outside of "test run" hooks would
+  cause an internal error. (`#3184
+  <https://github.com/pytest-dev/pytest/issues/3184>`_)
+
+- Detect arguments injected by ``unittest.mock.patch`` decorator correctly when
+  pypi ``mock.patch`` is installed and imported. (`#3206
+  <https://github.com/pytest-dev/pytest/issues/3206>`_)
+
+- Errors shown when a ``pytest.raises()`` with ``match=`` fails are now cleaner
+  on what happened: When no exception was raised, the "matching '...'" part got
+  removed as it falsely implies that an exception was raised but it didn't
+  match. When a wrong exception was raised, it's now thrown (like
+  ``pytest.raised()`` without ``match=`` would) instead of complaining about
+  the unmatched text. (`#3222
+  <https://github.com/pytest-dev/pytest/issues/3222>`_)
+
+- Fixed output capture handling in doctests on macOS. (`#985
+  <https://github.com/pytest-dev/pytest/issues/985>`_)
+
+
+Improved Documentation
+----------------------
+
+- Add Sphinx parameter docs for ``match`` and ``message`` args to
+  ``pytest.raises``. (`#3202
+  <https://github.com/pytest-dev/pytest/issues/3202>`_)
+
+
+Trivial/Internal Changes
+------------------------
+
+- pytest has changed the publication procedure and is now being published to
+  PyPI directly from Travis. (`#3060
+  <https://github.com/pytest-dev/pytest/issues/3060>`_)
+
+- Rename ``ParameterSet._for_parameterize()`` to ``_for_parametrize()`` in
+  order to comply with the naming convention. (`#3166
+  <https://github.com/pytest-dev/pytest/issues/3166>`_)
+
+- Skip failing pdb/doctest test on mac. (`#985
+  <https://github.com/pytest-dev/pytest/issues/985>`_)
+
+
+Pytest 3.4.0 (2018-01-30)
+=========================
+
+Deprecations and Removals
+-------------------------
+
+- All pytest classes now subclass ``object`` for better Python 2/3 compatibility.
+  This should not affect user code except in very rare edge cases. (`#2147
+  <https://github.com/pytest-dev/pytest/issues/2147>`_)
+
+
+Features
+--------
+
+- Introduce ``empty_parameter_set_mark`` ini option to select which mark to
+  apply when ``@pytest.mark.parametrize`` is given an empty set of parameters.
+  Valid options are ``skip`` (default) and ``xfail``. Note that it is planned
+  to change the default to ``xfail`` in future releases as this is considered
+  less error prone. (`#2527
+  <https://github.com/pytest-dev/pytest/issues/2527>`_)
+
+- **Incompatible change**: after community feedback the `logging
+  <https://docs.pytest.org/en/latest/logging.html>`_ functionality has
+  undergone some changes. Please consult the `logging documentation
+  <https://docs.pytest.org/en/latest/logging.html#incompatible-changes-in-pytest-3-4>`_
+  for details. (`#3013 <https://github.com/pytest-dev/pytest/issues/3013>`_)
+
+- Console output falls back to "classic" mode when capturing is disabled (``-s``),
+  otherwise the output gets garbled to the point of being useless. (`#3038
+  <https://github.com/pytest-dev/pytest/issues/3038>`_)
+
+- New `pytest_runtest_logfinish
+  <https://docs.pytest.org/en/latest/writing_plugins.html#_pytest.hookspec.pytest_runtest_logfinish>`_
+  hook which is called when a test item has finished executing, analogous to
+  `pytest_runtest_logstart
+  <https://docs.pytest.org/en/latest/writing_plugins.html#_pytest.hookspec.pytest_runtest_start>`_.
+  (`#3101 <https://github.com/pytest-dev/pytest/issues/3101>`_)
+
+- Improve performance when collecting tests using many fixtures. (`#3107
+  <https://github.com/pytest-dev/pytest/issues/3107>`_)
+
+- New ``caplog.get_records(when)`` method which provides access to the captured
+  records for the ``"setup"``, ``"call"`` and ``"teardown"``
+  testing stages. (`#3117 <https://github.com/pytest-dev/pytest/issues/3117>`_)
+
+- New fixture ``record_xml_attribute`` that allows modifying and inserting
+  attributes on the ``<testcase>`` xml node in JUnit reports. (`#3130
+  <https://github.com/pytest-dev/pytest/issues/3130>`_)
+
+- The default cache directory has been renamed from ``.cache`` to
+  ``.pytest_cache`` after community feedback that the name ``.cache`` did not
+  make it clear that it was used by pytest. (`#3138
+  <https://github.com/pytest-dev/pytest/issues/3138>`_)
+
+- Colorize the levelname column in the live-log output. (`#3142
+  <https://github.com/pytest-dev/pytest/issues/3142>`_)
+
+
+Bug Fixes
+---------
+
+- Fix hanging pexpect test on MacOS by using flush() instead of wait().
+  (`#2022 <https://github.com/pytest-dev/pytest/issues/2022>`_)
+
+- Fix restoring Python state after in-process pytest runs with the
+  ``pytester`` plugin; this may break tests using multiple inprocess
+  pytest runs if later ones depend on earlier ones leaking global interpreter
+  changes. (`#3016 <https://github.com/pytest-dev/pytest/issues/3016>`_)
+
+- Fix skipping plugin reporting hook when test aborted before plugin setup
+  hook. (`#3074 <https://github.com/pytest-dev/pytest/issues/3074>`_)
+
+- Fix progress percentage reported when tests fail during teardown. (`#3088
+  <https://github.com/pytest-dev/pytest/issues/3088>`_)
+
+- **Incompatible change**: ``-o/--override`` option no longer eats all the
+  remaining options, which can lead to surprising behavior: for example,
+  ``pytest -o foo=1 /path/to/test.py`` would fail because ``/path/to/test.py``
+  would be considered as part of the ``-o`` command-line argument. One
+  consequence of this is that now multiple configuration overrides need
+  multiple ``-o`` flags: ``pytest -o foo=1 -o bar=2``. (`#3103
+  <https://github.com/pytest-dev/pytest/issues/3103>`_)
+
+
+Improved Documentation
+----------------------
+
+- Document hooks (defined with ``historic=True``) which cannot be used with
+  ``hookwrapper=True``. (`#2423
+  <https://github.com/pytest-dev/pytest/issues/2423>`_)
+
+- Clarify that warning capturing doesn't change the warning filter by default.
+  (`#2457 <https://github.com/pytest-dev/pytest/issues/2457>`_)
+
+- Clarify a possible confusion when using pytest_fixture_setup with fixture
+  functions that return None. (`#2698
+  <https://github.com/pytest-dev/pytest/issues/2698>`_)
+
+- Fix the wording of a sentence on doctest flags used in pytest. (`#3076
+  <https://github.com/pytest-dev/pytest/issues/3076>`_)
+
+- Prefer ``https://*.readthedocs.io`` over ``http://*.rtfd.org`` for links in
+  the documentation. (`#3092
+  <https://github.com/pytest-dev/pytest/issues/3092>`_)
+
+- Improve readability (wording, grammar) of Getting Started guide (`#3131
+  <https://github.com/pytest-dev/pytest/issues/3131>`_)
+
+- Added note that calling pytest.main multiple times from the same process is
+  not recommended because of import caching. (`#3143
+  <https://github.com/pytest-dev/pytest/issues/3143>`_)
+
+
+Trivial/Internal Changes
+------------------------
+
+- Show a simple and easy error when keyword expressions trigger a syntax error
+  (for example, ``"-k foo and import"`` will show an error that you can not use
+  the ``import`` keyword in expressions). (`#2953
+  <https://github.com/pytest-dev/pytest/issues/2953>`_)
+
+- Change parametrized automatic test id generation to use the ``__name__``
+  attribute of functions instead of the fallback argument name plus counter.
+  (`#2976 <https://github.com/pytest-dev/pytest/issues/2976>`_)
+
+- Replace py.std with stdlib imports. (`#3067
+  <https://github.com/pytest-dev/pytest/issues/3067>`_)
+
+- Corrected 'you' to 'your' in logging docs. (`#3129
+  <https://github.com/pytest-dev/pytest/issues/3129>`_)
+
+
+Pytest 3.3.2 (2017-12-25)
+=========================
+
+Bug Fixes
+---------
+
+- pytester: ignore files used to obtain current user metadata in the fd leak
+  detector. (`#2784 <https://github.com/pytest-dev/pytest/issues/2784>`_)
+
+- Fix **memory leak** where objects returned by fixtures were never destructed
+  by the garbage collector. (`#2981
+  <https://github.com/pytest-dev/pytest/issues/2981>`_)
+
+- Fix conversion of pyargs to filename to not convert symlinks on Python 2. (`#2985
+  <https://github.com/pytest-dev/pytest/issues/2985>`_)
+
+- ``PYTEST_DONT_REWRITE`` is now checked for plugins too rather than only for
+  test modules. (`#2995 <https://github.com/pytest-dev/pytest/issues/2995>`_)
+
+
+Improved Documentation
+----------------------
+
+- Add clarifying note about behavior of multiple parametrized arguments (`#3001
+  <https://github.com/pytest-dev/pytest/issues/3001>`_)
+
+
+Trivial/Internal Changes
+------------------------
+
+- Code cleanup. (`#3015 <https://github.com/pytest-dev/pytest/issues/3015>`_,
+  `#3021 <https://github.com/pytest-dev/pytest/issues/3021>`_)
+
+- Clean up code by replacing imports and references of `_ast` to `ast`. (`#3018
+  <https://github.com/pytest-dev/pytest/issues/3018>`_)
+
+
+Pytest 3.3.1 (2017-12-05)
+=========================
+
+Bug Fixes
+---------
+
+- Fix issue about ``-p no:<plugin>`` having no effect. (`#2920
+  <https://github.com/pytest-dev/pytest/issues/2920>`_)
+
+- Fix regression with warnings that contained non-strings in their arguments in
+  Python 2. (`#2956 <https://github.com/pytest-dev/pytest/issues/2956>`_)
+
+- Always escape null bytes when setting ``PYTEST_CURRENT_TEST``. (`#2957
+  <https://github.com/pytest-dev/pytest/issues/2957>`_)
+
+- Fix ``ZeroDivisionError`` when using the ``testmon`` plugin when no tests
+  were actually collected. (`#2971
+  <https://github.com/pytest-dev/pytest/issues/2971>`_)
+
+- Bring back ``TerminalReporter.writer`` as an alias to
+  ``TerminalReporter._tw``. This alias was removed by accident in the ``3.3.0``
+  release. (`#2984 <https://github.com/pytest-dev/pytest/issues/2984>`_)
+
+- The ``pytest-capturelog`` plugin is now also blacklisted, avoiding errors when
+  running pytest with it still installed. (`#3004
+  <https://github.com/pytest-dev/pytest/issues/3004>`_)
+
+
+Improved Documentation
+----------------------
+
+- Fix broken link to plugin ``pytest-localserver``. (`#2963
+  <https://github.com/pytest-dev/pytest/issues/2963>`_)
+
+
+Trivial/Internal Changes
+------------------------
+
+- Update github "bugs" link in ``CONTRIBUTING.rst`` (`#2949
+  <https://github.com/pytest-dev/pytest/issues/2949>`_)
+
+
 Pytest 3.3.0 (2017-11-23)
 =========================
 
 Deprecations and Removals
 -------------------------
 
 - Pytest no longer supports Python **2.6** and **3.3**. Those Python versions
   are EOL for some time now and incur maintenance and compatibility costs on
@@ -63,17 +752,17 @@ Features
 
 - Now pytest displays the total progress percentage while running tests. The
   previous output style can be set by configuring the ``console_output_style``
   setting to ``classic``. (`#2657 <https://github.com/pytest-dev/pytest/issues/2657>`_)
 
 - Match ``warns`` signature to ``raises`` by adding ``match`` keyword. (`#2708
   <https://github.com/pytest-dev/pytest/issues/2708>`_)
 
-- Pytest now captures and displays output from the standard `logging` module.
+- Pytest now captures and displays output from the standard ``logging`` module.
   The user can control the logging level to be captured by specifying options
   in ``pytest.ini``, the command line and also during individual tests using
   markers. Also, a ``caplog`` fixture is available that enables users to test
   the captured log during specific tests (similar to ``capsys`` for example).
   For more information, please see the `logging docs
   <https://docs.pytest.org/en/latest/logging.html>`_. This feature was
   introduced by merging the popular `pytest-catchlog
   <https://pypi.org/project/pytest-catchlog/>`_ plugin, thanks to `Thomas Hisch
@@ -110,20 +799,20 @@ Bug Fixes
 - Resume output capturing after ``capsys/capfd.disabled()`` context manager.
   (`#1993 <https://github.com/pytest-dev/pytest/issues/1993>`_)
 
 - ``pytest_fixture_setup`` and ``pytest_fixture_post_finalizer`` hooks are now
   called for all ``conftest.py`` files. (`#2124
   <https://github.com/pytest-dev/pytest/issues/2124>`_)
 
 - If an exception happens while loading a plugin, pytest no longer hides the
-  original traceback. In python2 it will show the original traceback with a new
-  message that explains in which plugin. In python3 it will show 2 canonized
+  original traceback. In Python 2 it will show the original traceback with a new
+  message that explains in which plugin. In Python 3 it will show 2 canonized
   exceptions, the original exception while loading the plugin in addition to an
-  exception that PyTest throws about loading a plugin. (`#2491
+  exception that pytest throws about loading a plugin. (`#2491
   <https://github.com/pytest-dev/pytest/issues/2491>`_)
 
 - ``capsys`` and ``capfd`` can now be used by other fixtures. (`#2709
   <https://github.com/pytest-dev/pytest/issues/2709>`_)
 
 - Internal ``pytester`` plugin properly encodes ``bytes`` arguments to
   ``utf-8``. (`#2738 <https://github.com/pytest-dev/pytest/issues/2738>`_)
 
@@ -688,29 +1377,29 @@ Changes
 * Change junitxml.py to produce reports that comply with Junitxml schema.
   If the same test fails with failure in call and then errors in teardown
   we split testcase element into two, one containing the error and the other
   the failure. (`#2228`_) Thanks to `@kkoukiou`_ for the PR.
 
 * Testcase reports with a ``url`` attribute will now properly write this to junitxml.
   Thanks `@fushi`_ for the PR (`#1874`_).
 
-* Remove common items from dict comparision output when verbosity=1. Also update
+* Remove common items from dict comparison output when verbosity=1. Also update
   the truncation message to make it clearer that pytest truncates all
   assertion messages if verbosity < 2 (`#1512`_).
   Thanks `@mattduck`_ for the PR
 
 * ``--pdbcls`` no longer implies ``--pdb``. This makes it possible to use
   ``addopts=--pdbcls=module.SomeClass`` on ``pytest.ini``. Thanks `@davidszotten`_ for
   the PR (`#1952`_).
 
 * fix `#2013`_: turn RecordedWarning into ``namedtuple``,
   to give it a comprehensible repr while preventing unwarranted modification.
 
-* fix `#2208`_: ensure a iteration limit for _pytest.compat.get_real_func.
+* fix `#2208`_: ensure an iteration limit for _pytest.compat.get_real_func.
   Thanks `@RonnyPfannschmidt`_ for the report and PR.
 
 * Hooks are now verified after collection is complete, rather than right after loading installed plugins. This
   makes it easy to write hooks for plugins which will be loaded during collection, for example using the
   ``pytest_plugins`` special variable (`#1821`_).
   Thanks `@nicoddemus`_ for the PR.
 
 * Modify ``pytest_make_parametrize_id()`` hook to accept ``argname`` as an
@@ -804,17 +1493,17 @@ 3.0.7 (2017-03-14)
 ==================
 
 
 * Fix issue in assertion rewriting breaking due to modules silently discarding
   other modules when importing fails
   Notably, importing the ``anydbm`` module is fixed. (`#2248`_).
   Thanks `@pfhayes`_ for the PR.
 
-* junitxml: Fix problematic case where system-out tag occured twice per testcase
+* junitxml: Fix problematic case where system-out tag occurred twice per testcase
   element in the XML report. Thanks `@kkoukiou`_ for the PR.
 
 * Fix regression, pytest now skips unittest correctly if run with ``--pdb``
   (`#2137`_). Thanks to `@gst`_ for the report and `@mbyt`_ for the PR.
 
 * Ignore exceptions raised from descriptors (e.g. properties) during Python test collection (`#2234`_).
   Thanks to `@bluetech`_.
 
@@ -2400,17 +3089,17 @@ 2.6.1 (2014-08-07)
 
 - fix integration of pytest with unittest.mock.patch decorator when
   it uses the "new" argument.  Thanks Nicolas Delaby for test and PR.
 
 - fix issue with detecting conftest files if the arguments contain
   "::" node id specifications (copy pasted from "-v" output)
 
 - fix issue544 by only removing "@NUM" at the end of "::" separated parts
-  and if the part has an ".py" extension
+  and if the part has a ".py" extension
 
 - don't use py.std import helper, rather import things directly.
   Thanks Bruno Oliveira.
 
 2.6
 ===
 
 - Cache exceptions from fixtures according to their scope (issue 467).
@@ -2671,17 +3360,17 @@ 2.5.0 (2013-12-12)
 
 - avoid one surprising case of marker malfunction/confusion::
 
       @pytest.mark.some(lambda arg: ...)
       def test_function():
 
   would not work correctly because pytest assumes @pytest.mark.some
   gets a function to be decorated already.  We now at least detect if this
-  arg is an lambda and thus the example will work.  Thanks Alex Gaynor
+  arg is a lambda and thus the example will work.  Thanks Alex Gaynor
   for bringing it up.
 
 - xfail a test on pypy that checks wrong encoding/ascii (pypy does
   not error out). fixes issue385.
 
 - internally make varnames() deal with classes's __init__,
   although it's not needed by pytest itself atm.  Also
   fix caching.  Fixes issue376.
@@ -2984,17 +3673,17 @@ 2.3.5 (2013-04-30)
 2.3.4 (2012-11-20)
 ==================
 
 - yielded test functions will now have autouse-fixtures active but
   cannot accept fixtures as funcargs - it's anyway recommended to
   rather use the post-2.0 parametrize features instead of yield, see:
   http://pytest.org/latest/example/parametrize.html
 - fix autouse-issue where autouse-fixtures would not be discovered
-  if defined in a a/conftest.py file and tests in a/tests/test_some.py
+  if defined in an a/conftest.py file and tests in a/tests/test_some.py
 - fix issue226 - LIFO ordering for fixture teardowns
 - fix issue224 - invocations with >256 char arguments now work
 - fix issue91 - add/discuss package/directory level setups in example
 - allow to dynamically define markers via
   item.keywords[...]=assignment integrating with "-m" option
 - make "-k" accept an expressions the same as with "-m" so that one
   can write: -k "name1 or name2" etc.  This is a slight incompatibility
   if you used special syntax like "TestClass.test_method" which you now
@@ -3554,17 +4243,17 @@ 1.3.2 (2010-07-08)
 - fix terminal writing on win32/python2.4
 - py.process.cmdexec() now tries harder to return properly encoded unicode objects
   on all python versions
 - install plain py.test/py.which scripts also for Jython, this helps to
   get canonical script paths in virtualenv situations
 - make path.bestrelpath(path) return ".", note that when calling
   X.bestrelpath the assumption is that X is a directory.
 - make initial conftest discovery ignore "--" prefixed arguments
-- fix resultlog plugin when used in an multicpu/multihost xdist situation
+- fix resultlog plugin when used in a multicpu/multihost xdist situation
   (thanks Jakub Gustak)
 - perform distributed testing related reporting in the xdist-plugin
   rather than having dist-related code in the generic py.test
   distribution
 - fix homedir detection on Windows
 - ship distribute_setup.py version 0.6.13
 
 1.3.1 (2010-05-25)
--- a/testing/web-platform/tests/tools/third_party/pytest/CONTRIBUTING.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/CONTRIBUTING.rst
@@ -43,30 +43,28 @@ If you can write a demonstration test th
 fix the bug itself.
 
 
 .. _fixbugs:
 
 Fix bugs
 --------
 
-Look through the GitHub issues for bugs.  Here is a filter you can use:
-https://github.com/pytest-dev/pytest/labels/type%3A%20bug
+Look through the `GitHub issues for bugs <https://github.com/pytest-dev/pytest/labels/type:%20bug>`_.
 
 :ref:`Talk <contact>` to developers to find out how you can fix specific bugs.
 
 Don't forget to check the issue trackers of your favourite plugins, too!
 
 .. _writeplugins:
 
 Implement features
 ------------------
 
-Look through the GitHub issues for enhancements.  Here is a filter you can use:
-https://github.com/pytest-dev/pytest/labels/enhancement
+Look through the `GitHub issues for enhancements <https://github.com/pytest-dev/pytest/labels/type:%20enhancement>`_.
 
 :ref:`Talk <contact>` to developers to find out how you can implement specific
 features.
 
 Write documentation
 -------------------
 
 Pytest could always use more documentation.  What exactly is needed?
@@ -136,17 +134,17 @@ If no contributor strongly objects and t
 transferred to the ``pytest-dev`` organisation.
 
 Here's a rundown of how a repository transfer usually proceeds
 (using a repository named ``joedoe/pytest-xyz`` as example):
 
 * ``joedoe`` transfers repository ownership to ``pytest-dev`` administrator ``calvin``.
 * ``calvin`` creates ``pytest-xyz-admin`` and ``pytest-xyz-developers`` teams, inviting ``joedoe`` to both as **maintainer**.
 * ``calvin`` transfers repository to ``pytest-dev`` and configures team access:
-  
+
   - ``pytest-xyz-admin`` **admin** access;
   - ``pytest-xyz-developers`` **write** access;
 
 The ``pytest-dev/Contributors`` team has write access to all projects, and
 every project administrator is in it. We recommend that each plugin has at least three
 people who have the right to release to PyPI.
 
 Repository owners can rest assured that no ``pytest-dev`` administrator will ever make
@@ -159,31 +157,32 @@ As stated, the objective is to share mai
 .. _pull-requests:
 
 Preparing Pull Requests
 -----------------------
 
 Short version
 ~~~~~~~~~~~~~
 
-#. Fork the repository;
-#. Target ``master`` for bugfixes and doc changes;
+#. Fork the repository.
+#. Enable and install `pre-commit <https://pre-commit.com>`_ to ensure style-guides and code checks are followed.
+#. Target ``master`` for bugfixes and doc changes.
 #. Target ``features`` for new features or functionality changes.
-#. Follow **PEP-8**. There's a ``tox`` command to help fixing it: ``tox -e fix-lint``.
+#. Follow **PEP-8** for naming and `black <https://github.com/ambv/black>`_ for formatting.
 #. Tests are run using ``tox``::
 
     tox -e linting,py27,py36
 
    The test environments above are usually enough to cover most cases locally.
 
 #. Write a ``changelog`` entry: ``changelog/2574.bugfix``, use issue id number
    and one of ``bugfix``, ``removal``, ``feature``, ``vendor``, ``doc`` or
    ``trivial`` for the issue type.
 #. Unless your change is a trivial or a documentation fix (e.g., a typo or reword of a small section) please
-   add yourself to the ``AUTHORS`` file, in alphabetical order;
+   add yourself to the ``AUTHORS`` file, in alphabetical order.
 
 
 Long version
 ~~~~~~~~~~~~
 
 What is a "pull request"?  It informs the project's core developers about the
 changes you want to review and merge.  Pull requests are stored on
 `GitHub servers <https://github.com/pytest-dev/pytest/pulls>`_.
@@ -199,30 +198,40 @@ Here is a simple overview, with pytest-s
    fine to use ``pytest`` as your fork repository name because it will live
    under your user.
 
 #. Clone your fork locally using `git <https://git-scm.com/>`_ and create a branch::
 
     $ git clone git@github.com:YOUR_GITHUB_USERNAME/pytest.git
     $ cd pytest
     # now, to fix a bug create your own branch off "master":
-    
+
         $ git checkout -b your-bugfix-branch-name master
 
     # or to instead add a feature create your own branch off "features":
-    
+
         $ git checkout -b your-feature-branch-name features
 
-   Given we have "major.minor.micro" version numbers, bugfixes will usually 
-   be released in micro releases whereas features will be released in 
+   Given we have "major.minor.micro" version numbers, bugfixes will usually
+   be released in micro releases whereas features will be released in
    minor releases and incompatible changes in major releases.
 
    If you need some help with Git, follow this quick start
    guide: https://git.wiki.kernel.org/index.php/QuickStart
 
+#. Install `pre-commit <https://pre-commit.com>`_ and its hook on the pytest repo::
+
+     $ pip install --user pre-commit
+     $ pre-commit install
+
+   Afterwards ``pre-commit`` will run whenever you commit.
+
+   https://pre-commit.com/ is a framework for managing and maintaining multi-language pre-commit hooks
+   to ensure code-style and code formatting is consistent.
+
 #. Install tox
 
    Tox is used to run all the tests and will automatically setup virtualenvs
    to run the tests in.
    (will implicitly use http://www.virtualenv.org/en/latest/)::
 
     $ pip install tox
 
@@ -231,35 +240,30 @@ Here is a simple overview, with pytest-s
    You need to have Python 2.7 and 3.6 available in your system.  Now
    running tests is as simple as issuing this command::
 
     $ tox -e linting,py27,py36
 
    This command will run tests via the "tox" tool against Python 2.7 and 3.6
    and also perform "lint" coding-style checks.
 
-#. You can now edit your local working copy. Please follow PEP-8.
-
-   You can now make the changes you want and run the tests again as necessary.
-
-   If you have too much linting errors, try running::
-
-    $ tox -e fix-lint
-
-   To fix pep8 related errors.
+#. You can now edit your local working copy and run the tests again as necessary. Please follow PEP-8 for naming.
 
    You can pass different options to ``tox``. For example, to run tests on Python 2.7 and pass options to pytest
    (e.g. enter pdb on failure) to pytest you can do::
 
     $ tox -e py27 -- --pdb
 
    Or to only run tests in a particular test module on Python 3.6::
 
     $ tox -e py36 -- testing/test_config.py
 
+
+   When committing, ``pre-commit`` will re-format the files if necessary.
+
 #. Commit and push once your tests pass and you are happy with your change(s)::
 
     $ git commit -a -m "<commit message>"
     $ git push -u
 
 #. Create a new changelog entry in ``changelog``. The file should be named ``<issueid>.<type>``,
    where *issueid* is the number of the issue related to the change and *type* is one of
    ``bugfix``, ``removal``, ``feature``, ``vendor``, ``doc`` or ``trivial``.
@@ -271,8 +275,20 @@ Here is a simple overview, with pytest-s
     head-fork: YOUR_GITHUB_USERNAME/pytest
     compare: your-branch-name
 
     base-fork: pytest-dev/pytest
     base: master          # if it's a bugfix
     base: features        # if it's a feature
 
 
+Joining the Development Team
+----------------------------
+
+Anyone who has successfully seen through a pull request which did not
+require any extra work from the development team to merge will
+themselves gain commit access if they so wish (if we forget to ask please send a friendly
+reminder).  This does not mean your workflow to contribute changes,
+everyone goes through the same pull-request-and-review process and
+no-one merges their own pull requests unless already approved.  It does however mean you can
+participate in the development process more fully since you can merge
+pull requests from other contributors yourself after having reviewed
+them.
--- a/testing/web-platform/tests/tools/third_party/pytest/HOWTORELEASE.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/HOWTORELEASE.rst
@@ -7,59 +7,43 @@ taking a lot of time to make a new one.
 
 .. important::
 
     pytest releases must be prepared on **Linux** because the docs and examples expect
     to be executed in that platform.
 
 #. Install development dependencies in a virtual environment with::
 
-    pip3 install -r tasks/requirements.txt
+    pip3 install -U -r tasks/requirements.txt
 
 #. Create a branch ``release-X.Y.Z`` with the version for the release.
 
    * **patch releases**: from the latest ``master``;
 
    * **minor releases**: from the latest ``features``; then merge with the latest ``master``;
 
    Ensure your are in a clean work tree.
 
-#. Generate docs, changelog, announcements and upload a package to
-   your ``devpi`` staging server::
+#. Generate docs, changelog, announcements and a **local** tag::
 
-     invoke generate.pre-release <VERSION> <DEVPI USER> --password <DEVPI PASSWORD>
-
-   If ``--password`` is not given, it is assumed the user is already logged in ``devpi``.
-   If you don't have an account, please ask for one.
+     invoke generate.pre-release <VERSION>
 
 #. Open a PR for this branch targeting ``master``.
 
-#. Test the package
+#. After all tests pass and the PR has been approved, publish to PyPI by pushing the tag::
 
-   * **Manual method**
-
-     Run from multiple machines::
+     git push git@github.com:pytest-dev/pytest.git <VERSION>
 
-       devpi use https://devpi.net/USER/dev
-       devpi test pytest==VERSION
+   Wait for the deploy to complete, then make sure it is `available on PyPI <https://pypi.org/project/pytest>`_.
 
-     Check that tests pass for relevant combinations with::
-
-       devpi list pytest
+#. Send an email announcement with the contents from::
 
-   * **CI servers**
+     doc/en/announce/release-<VERSION>.rst
 
-     Configure a repository as per-instructions on
-     devpi-cloud-test_ to test the package on Travis_ and AppVeyor_.
-     All test environments should pass.
+   To the following mailing lists:
 
-#. Publish to PyPI::
+   * pytest-dev@python.org (all releases)
+   * python-announce-list@python.org (all releases)
+   * testing-in-python@lists.idyll.org (only major/minor releases)
 
-      invoke generate.publish-release <VERSION> <DEVPI USER> <PYPI_NAME>
-
-   where PYPI_NAME is the name of pypi.python.org as configured in your ``~/.pypirc``
-   file `for devpi <http://doc.devpi.net/latest/quickstart-releaseprocess.html?highlight=pypirc#devpi-push-releasing-to-an-external-index>`_.
+   And announce it on `Twitter <https://twitter.com/>`_ with the ``#pytest`` hashtag.
 
 #. After a minor/major release, merge ``release-X.Y.Z`` into ``master`` and push (or open a PR).
-
-.. _devpi-cloud-test: https://github.com/obestwalter/devpi-cloud-test
-.. _AppVeyor: https://www.appveyor.com/
-.. _Travis: https://travis-ci.org
--- a/testing/web-platform/tests/tools/third_party/pytest/README.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/README.rst
@@ -1,44 +1,51 @@
 .. image:: http://docs.pytest.org/en/latest/_static/pytest1.png
    :target: http://docs.pytest.org
    :align: center
    :alt: pytest
 
 ------
 
 .. image:: https://img.shields.io/pypi/v/pytest.svg
-    :target: https://pypi.python.org/pypi/pytest
+    :target: https://pypi.org/project/pytest/
 
-.. image:: https://anaconda.org/conda-forge/pytest/badges/version.svg
+.. image:: https://img.shields.io/conda/vn/conda-forge/pytest.svg
     :target: https://anaconda.org/conda-forge/pytest
 
 .. image:: https://img.shields.io/pypi/pyversions/pytest.svg
-    :target: https://pypi.python.org/pypi/pytest
+    :target: https://pypi.org/project/pytest/
 
 .. image:: https://img.shields.io/coveralls/pytest-dev/pytest/master.svg
     :target: https://coveralls.io/r/pytest-dev/pytest
 
 .. image:: https://travis-ci.org/pytest-dev/pytest.svg?branch=master
     :target: https://travis-ci.org/pytest-dev/pytest
 
 .. image:: https://ci.appveyor.com/api/projects/status/mrgbjaua7t33pg6b?svg=true
     :target: https://ci.appveyor.com/project/pytestbot/pytest
 
+.. image:: https://img.shields.io/badge/code%20style-black-000000.svg
+  :target: https://github.com/ambv/black
+
+.. image:: https://www.codetriage.com/pytest-dev/pytest/badges/users.svg
+    :target: https://www.codetriage.com/pytest-dev/pytest
+
 The ``pytest`` framework makes it easy to write small tests, yet
 scales to support complex functional testing for applications and libraries.
 
 An example of a simple test:
 
 .. code-block:: python
 
     # content of test_sample.py
     def inc(x):
         return x + 1
 
+
     def test_answer():
         assert inc(3) == 5
 
 
 To execute it::
 
     $ pytest
     ============================= test session starts =============================
deleted file mode 100644
--- a/testing/web-platform/tests/tools/third_party/pytest/_pytest/config.py
+++ /dev/null
@@ -1,1400 +0,0 @@
-""" command line options, ini-file and conftest.py processing. """
-from __future__ import absolute_import, division, print_function
-import argparse
-import shlex
-import traceback
-import types
-import warnings
-
-import six
-import py
-# DON't import pytest here because it causes import cycle troubles
-import sys
-import os
-import _pytest._code
-import _pytest.hookspec  # the extension point definitions
-import _pytest.assertion
-from pluggy import PluginManager, HookimplMarker, HookspecMarker
-from _pytest.compat import safe_str
-
-hookimpl = HookimplMarker("pytest")
-hookspec = HookspecMarker("pytest")
-
-# pytest startup
-#
-
-
-class ConftestImportFailure(Exception):
-    def __init__(self, path, excinfo):
-        Exception.__init__(self, path, excinfo)
-        self.path = path
-        self.excinfo = excinfo
-
-    def __str__(self):
-        etype, evalue, etb = self.excinfo
-        formatted = traceback.format_tb(etb)
-        # The level of the tracebacks we want to print is hand crafted :(
-        return repr(evalue) + '\n' + ''.join(formatted[2:])
-
-
-def main(args=None, plugins=None):
-    """ return exit code, after performing an in-process test run.
-
-    :arg args: list of command line arguments.
-
-    :arg plugins: list of plugin objects to be auto-registered during
-                  initialization.
-    """
-    try:
-        try:
-            config = _prepareconfig(args, plugins)
-        except ConftestImportFailure as e:
-            tw = py.io.TerminalWriter(sys.stderr)
-            for line in traceback.format_exception(*e.excinfo):
-                tw.line(line.rstrip(), red=True)
-            tw.line("ERROR: could not load %s\n" % (e.path), red=True)
-            return 4
-        else:
-            try:
-                return config.hook.pytest_cmdline_main(config=config)
-            finally:
-                config._ensure_unconfigure()
-    except UsageError as e:
-        for msg in e.args:
-            sys.stderr.write("ERROR: %s\n" % (msg,))
-        return 4
-
-
-class cmdline:  # compatibility namespace
-    main = staticmethod(main)
-
-
-class UsageError(Exception):
-    """ error in pytest usage or invocation"""
-
-
-class PrintHelp(Exception):
-    """Raised when pytest should print it's help to skip the rest of the
-    argument parsing and validation."""
-    pass
-
-
-def filename_arg(path, optname):
-    """ Argparse type validator for filename arguments.
-
-    :path: path of filename
-    :optname: name of the option
-    """
-    if os.path.isdir(path):
-        raise UsageError("{0} must be a filename, given: {1}".format(optname, path))
-    return path
-
-
-def directory_arg(path, optname):
-    """Argparse type validator for directory arguments.
-
-    :path: path of directory
-    :optname: name of the option
-    """
-    if not os.path.isdir(path):
-        raise UsageError("{0} must be a directory, given: {1}".format(optname, path))
-    return path
-
-
-default_plugins = (
-    "mark main terminal runner python fixtures debugging unittest capture skipping "
-    "tmpdir monkeypatch recwarn pastebin helpconfig nose assertion "
-    "junitxml resultlog doctest cacheprovider freeze_support "
-    "setuponly setupplan warnings logging").split()
-
-
-builtin_plugins = set(default_plugins)
-builtin_plugins.add("pytester")
-
-
-def get_config():
-    # subsequent calls to main will create a fresh instance
-    pluginmanager = PytestPluginManager()
-    config = Config(pluginmanager)
-    for spec in default_plugins:
-        pluginmanager.import_plugin(spec)
-    return config
-
-
-def get_plugin_manager():
-    """
-    Obtain a new instance of the
-    :py:class:`_pytest.config.PytestPluginManager`, with default plugins
-    already loaded.
-
-    This function can be used by integration with other tools, like hooking
-    into pytest to run tests into an IDE.
-    """
-    return get_config().pluginmanager
-
-
-def _prepareconfig(args=None, plugins=None):
-    warning = None
-    if args is None:
-        args = sys.argv[1:]
-    elif isinstance(args, py.path.local):
-        args = [str(args)]
-    elif not isinstance(args, (tuple, list)):
-        if not isinstance(args, str):
-            raise ValueError("not a string or argument list: %r" % (args,))
-        args = shlex.split(args, posix=sys.platform != "win32")
-        from _pytest import deprecated
-        warning = deprecated.MAIN_STR_ARGS
-    config = get_config()
-    pluginmanager = config.pluginmanager
-    try:
-        if plugins:
-            for plugin in plugins:
-                if isinstance(plugin, six.string_types):
-                    pluginmanager.consider_pluginarg(plugin)
-                else:
-                    pluginmanager.register(plugin)
-        if warning:
-            config.warn('C1', warning)
-        return pluginmanager.hook.pytest_cmdline_parse(
-            pluginmanager=pluginmanager, args=args)
-    except BaseException:
-        config._ensure_unconfigure()
-        raise
-
-
-class PytestPluginManager(PluginManager):
-    """
-    Overwrites :py:class:`pluggy.PluginManager <pluggy.PluginManager>` to add pytest-specific
-    functionality:
-
-    * loading plugins from the command line, ``PYTEST_PLUGIN`` env variable and
-      ``pytest_plugins`` global variables found in plugins being loaded;
-    * ``conftest.py`` loading during start-up;
-    """
-
-    def __init__(self):
-        super(PytestPluginManager, self).__init__("pytest", implprefix="pytest_")
-        self._conftest_plugins = set()
-
-        # state related to local conftest plugins
-        self._path2confmods = {}
-        self._conftestpath2mod = {}
-        self._confcutdir = None
-        self._noconftest = False
-        self._duplicatepaths = set()
-
-        self.add_hookspecs(_pytest.hookspec)
-        self.register(self)
-        if os.environ.get('PYTEST_DEBUG'):
-            err = sys.stderr
-            encoding = getattr(err, 'encoding', 'utf8')
-            try:
-                err = py.io.dupfile(err, encoding=encoding)
-            except Exception:
-                pass
-            self.trace.root.setwriter(err.write)
-            self.enable_tracing()
-
-        # Config._consider_importhook will set a real object if required.
-        self.rewrite_hook = _pytest.assertion.DummyRewriteHook()
-
-    def addhooks(self, module_or_class):
-        """
-        .. deprecated:: 2.8
-
-        Use :py:meth:`pluggy.PluginManager.add_hookspecs <PluginManager.add_hookspecs>`
-        instead.
-        """
-        warning = dict(code="I2",
-                       fslocation=_pytest._code.getfslineno(sys._getframe(1)),
-                       nodeid=None,
-                       message="use pluginmanager.add_hookspecs instead of "
-                               "deprecated addhooks() method.")
-        self._warn(warning)
-        return self.add_hookspecs(module_or_class)
-
-    def parse_hookimpl_opts(self, plugin, name):
-        # pytest hooks are always prefixed with pytest_
-        # so we avoid accessing possibly non-readable attributes
-        # (see issue #1073)
-        if not name.startswith("pytest_"):
-            return
-        # ignore some historic special names which can not be hooks anyway
-        if name == "pytest_plugins" or name.startswith("pytest_funcarg__"):
-            return
-
-        method = getattr(plugin, name)
-        opts = super(PytestPluginManager, self).parse_hookimpl_opts(plugin, name)
-        if opts is not None:
-            for name in ("tryfirst", "trylast", "optionalhook", "hookwrapper"):
-                opts.setdefault(name, hasattr(method, name))
-        return opts
-
-    def parse_hookspec_opts(self, module_or_class, name):
-        opts = super(PytestPluginManager, self).parse_hookspec_opts(
-            module_or_class, name)
-        if opts is None:
-            method = getattr(module_or_class, name)
-            if name.startswith("pytest_"):
-                opts = {"firstresult": hasattr(method, "firstresult"),
-                        "historic": hasattr(method, "historic")}
-        return opts
-
-    def register(self, plugin, name=None):
-        if name == 'pytest_catchlog':
-            self._warn('pytest-catchlog plugin has been merged into the core, '
-                       'please remove it from your requirements.')
-            return
-        ret = super(PytestPluginManager, self).register(plugin, name)
-        if ret:
-            self.hook.pytest_plugin_registered.call_historic(
-                kwargs=dict(plugin=plugin, manager=self))
-
-            if isinstance(plugin, types.ModuleType):
-                self.consider_module(plugin)
-        return ret
-
-    def getplugin(self, name):
-        # support deprecated naming because plugins (xdist e.g.) use it
-        return self.get_plugin(name)
-
-    def hasplugin(self, name):
-        """Return True if the plugin with the given name is registered."""
-        return bool(self.get_plugin(name))
-
-    def pytest_configure(self, config):
-        # XXX now that the pluginmanager exposes hookimpl(tryfirst...)
-        # we should remove tryfirst/trylast as markers
-        config.addinivalue_line("markers",
-                                "tryfirst: mark a hook implementation function such that the "
-                                "plugin machinery will try to call it first/as early as possible.")
-        config.addinivalue_line("markers",
-                                "trylast: mark a hook implementation function such that the "
-                                "plugin machinery will try to call it last/as late as possible.")
-
-    def _warn(self, message):
-        kwargs = message if isinstance(message, dict) else {
-            'code': 'I1',
-            'message': message,
-            'fslocation': None,
-            'nodeid': None,
-        }
-        self.hook.pytest_logwarning.call_historic(kwargs=kwargs)
-
-    #
-    # internal API for local conftest plugin handling
-    #
-    def _set_initial_conftests(self, namespace):
-        """ load initial conftest files given a preparsed "namespace".
-            As conftest files may add their own command line options
-            which have arguments ('--my-opt somepath') we might get some
-            false positives.  All builtin and 3rd party plugins will have
-            been loaded, however, so common options will not confuse our logic
-            here.
-        """
-        current = py.path.local()
-        self._confcutdir = current.join(namespace.confcutdir, abs=True) \
-            if namespace.confcutdir else None
-        self._noconftest = namespace.noconftest
-        testpaths = namespace.file_or_dir
-        foundanchor = False
-        for path in testpaths:
-            path = str(path)
-            # remove node-id syntax
-            i = path.find("::")
-            if i != -1:
-                path = path[:i]
-            anchor = current.join(path, abs=1)
-            if exists(anchor):  # we found some file object
-                self._try_load_conftest(anchor)
-                foundanchor = True
-        if not foundanchor:
-            self._try_load_conftest(current)
-
-    def _try_load_conftest(self, anchor):
-        self._getconftestmodules(anchor)
-        # let's also consider test* subdirs
-        if anchor.check(dir=1):
-            for x in anchor.listdir("test*"):
-                if x.check(dir=1):
-                    self._getconftestmodules(x)
-
-    def _getconftestmodules(self, path):
-        if self._noconftest:
-            return []
-        try:
-            return self._path2confmods[path]
-        except KeyError:
-            if path.isfile():
-                clist = self._getconftestmodules(path.dirpath())
-            else:
-                # XXX these days we may rather want to use config.rootdir
-                # and allow users to opt into looking into the rootdir parent
-                # directories instead of requiring to specify confcutdir
-                clist = []
-                for parent in path.parts():
-                    if self._confcutdir and self._confcutdir.relto(parent):
-                        continue
-                    conftestpath = parent.join("conftest.py")
-                    if conftestpath.isfile():
-                        mod = self._importconftest(conftestpath)
-                        clist.append(mod)
-
-            self._path2confmods[path] = clist
-            return clist
-
-    def _rget_with_confmod(self, name, path):
-        modules = self._getconftestmodules(path)
-        for mod in reversed(modules):
-            try:
-                return mod, getattr(mod, name)
-            except AttributeError:
-                continue
-        raise KeyError(name)
-
-    def _importconftest(self, conftestpath):
-        try:
-            return self._conftestpath2mod[conftestpath]
-        except KeyError:
-            pkgpath = conftestpath.pypkgpath()
-            if pkgpath is None:
-                _ensure_removed_sysmodule(conftestpath.purebasename)
-            try:
-                mod = conftestpath.pyimport()
-            except Exception:
-                raise ConftestImportFailure(conftestpath, sys.exc_info())
-
-            self._conftest_plugins.add(mod)
-            self._conftestpath2mod[conftestpath] = mod
-            dirpath = conftestpath.dirpath()
-            if dirpath in self._path2confmods:
-                for path, mods in self._path2confmods.items():
-                    if path and path.relto(dirpath) or path == dirpath:
-                        assert mod not in mods
-                        mods.append(mod)
-            self.trace("loaded conftestmodule %r" % (mod))
-            self.consider_conftest(mod)
-            return mod
-
-    #
-    # API for bootstrapping plugin loading
-    #
-    #
-
-    def consider_preparse(self, args):
-        for opt1, opt2 in zip(args, args[1:]):
-            if opt1 == "-p":
-                self.consider_pluginarg(opt2)
-
-    def consider_pluginarg(self, arg):
-        if arg.startswith("no:"):
-            name = arg[3:]
-            self.set_blocked(name)
-            if not name.startswith("pytest_"):
-                self.set_blocked("pytest_" + name)
-        else:
-            self.import_plugin(arg)
-
-    def consider_conftest(self, conftestmodule):
-        self.register(conftestmodule, name=conftestmodule.__file__)
-
-    def consider_env(self):
-        self._import_plugin_specs(os.environ.get("PYTEST_PLUGINS"))
-
-    def consider_module(self, mod):
-        self._import_plugin_specs(getattr(mod, 'pytest_plugins', []))
-
-    def _import_plugin_specs(self, spec):
-        plugins = _get_plugin_specs_as_list(spec)
-        for import_spec in plugins:
-            self.import_plugin(import_spec)
-
-    def import_plugin(self, modname):
-        # most often modname refers to builtin modules, e.g. "pytester",
-        # "terminal" or "capture".  Those plugins are registered under their
-        # basename for historic purposes but must be imported with the
-        # _pytest prefix.
-        assert isinstance(modname, (six.text_type, str)), "module name as text required, got %r" % modname
-        modname = str(modname)
-        if self.is_blocked(modname) or self.get_plugin(modname) is not None:
-            return
-        if modname in builtin_plugins:
-            importspec = "_pytest." + modname
-        else:
-            importspec = modname
-        self.rewrite_hook.mark_rewrite(importspec)
-        try:
-            __import__(importspec)
-        except ImportError as e:
-            new_exc_type = ImportError
-            new_exc_message = 'Error importing plugin "%s": %s' % (modname, safe_str(e.args[0]))
-            new_exc = new_exc_type(new_exc_message)
-
-            six.reraise(new_exc_type, new_exc, sys.exc_info()[2])
-
-        except Exception as e:
-            import pytest
-            if not hasattr(pytest, 'skip') or not isinstance(e, pytest.skip.Exception):
-                raise
-            self._warn("skipped plugin %r: %s" % ((modname, e.msg)))
-        else:
-            mod = sys.modules[importspec]
-            self.register(mod, modname)
-
-
-def _get_plugin_specs_as_list(specs):
-    """
-    Parses a list of "plugin specs" and returns a list of plugin names.
-
-    Plugin specs can be given as a list of strings separated by "," or already as a list/tuple in
-    which case it is returned as a list. Specs can also be `None` in which case an
-    empty list is returned.
-    """
-    if specs is not None:
-        if isinstance(specs, str):
-            specs = specs.split(',') if specs else []
-        if not isinstance(specs, (list, tuple)):
-            raise UsageError("Plugin specs must be a ','-separated string or a "
-                             "list/tuple of strings for plugin names. Given: %r" % specs)
-        return list(specs)
-    return []
-
-
-class Parser:
-    """ Parser for command line arguments and ini-file values.
-
-    :ivar extra_info: dict of generic param -> value to display in case
-        there's an error processing the command line arguments.
-    """
-
-    def __init__(self, usage=None, processopt=None):
-        self._anonymous = OptionGroup("custom options", parser=self)
-        self._groups = []
-        self._processopt = processopt
-        self._usage = usage
-        self._inidict = {}
-        self._ininames = []
-        self.extra_info = {}
-
-    def processoption(self, option):
-        if self._processopt:
-            if option.dest:
-                self._processopt(option)
-
-    def getgroup(self, name, description="", after=None):
-        """ get (or create) a named option Group.
-
-        :name: name of the option group.
-        :description: long description for --help output.
-        :after: name of other group, used for ordering --help output.
-
-        The returned group object has an ``addoption`` method with the same
-        signature as :py:func:`parser.addoption
-        <_pytest.config.Parser.addoption>` but will be shown in the
-        respective group in the output of ``pytest. --help``.
-        """
-        for group in self._groups:
-            if group.name == name:
-                return group
-        group = OptionGroup(name, description, parser=self)
-        i = 0
-        for i, grp in enumerate(self._groups):
-            if grp.name == after:
-                break
-        self._groups.insert(i + 1, group)
-        return group
-
-    def addoption(self, *opts, **attrs):
-        """ register a command line option.
-
-        :opts: option names, can be short or long options.
-        :attrs: same attributes which the ``add_option()`` function of the
-           `argparse library
-           <http://docs.python.org/2/library/argparse.html>`_
-           accepts.
-
-        After command line parsing options are available on the pytest config
-        object via ``config.option.NAME`` where ``NAME`` is usually set
-        by passing a ``dest`` attribute, for example
-        ``addoption("--long", dest="NAME", ...)``.
-        """
-        self._anonymous.addoption(*opts, **attrs)
-
-    def parse(self, args, namespace=None):
-        from _pytest._argcomplete import try_argcomplete
-        self.optparser = self._getparser()
-        try_argcomplete(self.optparser)
-        return self.optparser.parse_args([str(x) for x in args], namespace=namespace)
-
-    def _getparser(self):
-        from _pytest._argcomplete import filescompleter
-        optparser = MyOptionParser(self, self.extra_info)
-        groups = self._groups + [self._anonymous]
-        for group in groups:
-            if group.options:
-                desc = group.description or group.name
-                arggroup = optparser.add_argument_group(desc)
-                for option in group.options:
-                    n = option.names()
-                    a = option.attrs()
-                    arggroup.add_argument(*n, **a)
-        # bash like autocompletion for dirs (appending '/')
-        optparser.add_argument(FILE_OR_DIR, nargs='*').completer = filescompleter
-        return optparser
-
-    def parse_setoption(self, args, option, namespace=None):
-        parsedoption = self.parse(args, namespace=namespace)
-        for name, value in parsedoption.__dict__.items():
-            setattr(option, name, value)
-        return getattr(parsedoption, FILE_OR_DIR)
-
-    def parse_known_args(self, args, namespace=None):
-        """parses and returns a namespace object with known arguments at this
-        point.
-        """
-        return self.parse_known_and_unknown_args(args, namespace=namespace)[0]
-
-    def parse_known_and_unknown_args(self, args, namespace=None):
-        """parses and returns a namespace object with known arguments, and
-        the remaining arguments unknown at this point.
-        """
-        optparser = self._getparser()
-        args = [str(x) for x in args]
-        return optparser.parse_known_args(args, namespace=namespace)
-
-    def addini(self, name, help, type=None, default=None):
-        """ register an ini-file option.
-
-        :name: name of the ini-variable
-        :type: type of the variable, can be ``pathlist``, ``args``, ``linelist``
-               or ``bool``.
-        :default: default value if no ini-file option exists but is queried.
-
-        The value of ini-variables can be retrieved via a call to
-        :py:func:`config.getini(name) <_pytest.config.Config.getini>`.
-        """
-        assert type in (None, "pathlist", "args", "linelist", "bool")
-        self._inidict[name] = (help, type, default)
-        self._ininames.append(name)
-
-
-class ArgumentError(Exception):
-    """
-    Raised if an Argument instance is created with invalid or
-    inconsistent arguments.
-    """
-
-    def __init__(self, msg, option):
-        self.msg = msg
-        self.option_id = str(option)
-
-    def __str__(self):
-        if self.option_id:
-            return "option %s: %s" % (self.option_id, self.msg)
-        else:
-            return self.msg
-
-
-class Argument:
-    """class that mimics the necessary behaviour of optparse.Option
-
-    its currently a least effort implementation
-    and ignoring choices and integer prefixes
-    https://docs.python.org/3/library/optparse.html#optparse-standard-option-types
-    """
-    _typ_map = {
-        'int': int,
-        'string': str,
-        'float': float,
-        'complex': complex,
-    }
-
-    def __init__(self, *names, **attrs):
-        """store parms in private vars for use in add_argument"""
-        self._attrs = attrs
-        self._short_opts = []
-        self._long_opts = []
-        self.dest = attrs.get('dest')
-        if '%default' in (attrs.get('help') or ''):
-            warnings.warn(
-                'pytest now uses argparse. "%default" should be'
-                ' changed to "%(default)s" ',
-                DeprecationWarning,
-                stacklevel=3)
-        try:
-            typ = attrs['type']
-        except KeyError:
-            pass
-        else:
-            # this might raise a keyerror as well, don't want to catch that
-            if isinstance(typ, six.string_types):
-                if typ == 'choice':
-                    warnings.warn(
-                        'type argument to addoption() is a string %r.'
-                        ' For parsearg this is optional and when supplied'
-                        ' should be a type.'
-                        ' (options: %s)' % (typ, names),
-                        DeprecationWarning,
-                        stacklevel=3)
-                    # argparse expects a type here take it from
-                    # the type of the first element
-                    attrs['type'] = type(attrs['choices'][0])
-                else:
-                    warnings.warn(
-                        'type argument to addoption() is a string %r.'
-                        ' For parsearg this should be a type.'
-                        ' (options: %s)' % (typ, names),
-                        DeprecationWarning,
-                        stacklevel=3)
-                    attrs['type'] = Argument._typ_map[typ]
-                # used in test_parseopt -> test_parse_defaultgetter
-                self.type = attrs['type']
-            else:
-                self.type = typ
-        try:
-            # attribute existence is tested in Config._processopt
-            self.default = attrs['default']
-        except KeyError:
-            pass
-        self._set_opt_strings(names)
-        if not self.dest:
-            if self._long_opts:
-                self.dest = self._long_opts[0][2:].replace('-', '_')
-            else:
-                try:
-                    self.dest = self._short_opts[0][1:]
-                except IndexError:
-                    raise ArgumentError(
-                        'need a long or short option', self)
-
-    def names(self):
-        return self._short_opts + self._long_opts
-
-    def attrs(self):
-        # update any attributes set by processopt
-        attrs = 'default dest help'.split()
-        if self.dest:
-            attrs.append(self.dest)
-        for attr in attrs:
-            try:
-                self._attrs[attr] = getattr(self, attr)
-            except AttributeError:
-                pass
-        if self._attrs.get('help'):
-            a = self._attrs['help']
-            a = a.replace('%default', '%(default)s')
-            # a = a.replace('%prog', '%(prog)s')
-            self._attrs['help'] = a
-        return self._attrs
-
-    def _set_opt_strings(self, opts):
-        """directly from optparse
-
-        might not be necessary as this is passed to argparse later on"""
-        for opt in opts:
-            if len(opt) < 2:
-                raise ArgumentError(
-                    "invalid option string %r: "
-                    "must be at least two characters long" % opt, self)
-            elif len(opt) == 2:
-                if not (opt[0] == "-" and opt[1] != "-"):
-                    raise ArgumentError(
-                        "invalid short option string %r: "
-                        "must be of the form -x, (x any non-dash char)" % opt,
-                        self)
-                self._short_opts.append(opt)
-            else:
-                if not (opt[0:2] == "--" and opt[2] != "-"):
-                    raise ArgumentError(
-                        "invalid long option string %r: "
-                        "must start with --, followed by non-dash" % opt,
-                        self)
-                self._long_opts.append(opt)
-
-    def __repr__(self):
-        args = []
-        if self._short_opts:
-            args += ['_short_opts: ' + repr(self._short_opts)]
-        if self._long_opts:
-            args += ['_long_opts: ' + repr(self._long_opts)]
-        args += ['dest: ' + repr(self.dest)]
-        if hasattr(self, 'type'):
-            args += ['type: ' + repr(self.type)]
-        if hasattr(self, 'default'):
-            args += ['default: ' + repr(self.default)]
-        return 'Argument({0})'.format(', '.join(args))
-
-
-class OptionGroup:
-    def __init__(self, name, description="", parser=None):
-        self.name = name
-        self.description = description
-        self.options = []
-        self.parser = parser
-
-    def addoption(self, *optnames, **attrs):
-        """ add an option to this group.
-
-        if a shortened version of a long option is specified it will
-        be suppressed in the help. addoption('--twowords', '--two-words')
-        results in help showing '--two-words' only, but --twowords gets
-        accepted **and** the automatic destination is in args.twowords
-        """
-        conflict = set(optnames).intersection(
-            name for opt in self.options for name in opt.names())
-        if conflict:
-            raise ValueError("option names %s already added" % conflict)
-        option = Argument(*optnames, **attrs)
-        self._addoption_instance(option, shortupper=False)
-
-    def _addoption(self, *optnames, **attrs):
-        option = Argument(*optnames, **attrs)
-        self._addoption_instance(option, shortupper=True)
-
-    def _addoption_instance(self, option, shortupper=False):
-        if not shortupper:
-            for opt in option._short_opts:
-                if opt[0] == '-' and opt[1].islower():
-                    raise ValueError("lowercase shortoptions reserved")
-        if self.parser:
-            self.parser.processoption(option)
-        self.options.append(option)
-
-
-class MyOptionParser(argparse.ArgumentParser):
-    def __init__(self, parser, extra_info=None):
-        if not extra_info:
-            extra_info = {}
-        self._parser = parser
-        argparse.ArgumentParser.__init__(self, usage=parser._usage,
-                                         add_help=False, formatter_class=DropShorterLongHelpFormatter)
-        # extra_info is a dict of (param -> value) to display if there's
-        # an usage error to provide more contextual information to the user
-        self.extra_info = extra_info
-
-    def parse_args(self, args=None, namespace=None):
-        """allow splitting of positional arguments"""
-        args, argv = self.parse_known_args(args, namespace)
-        if argv:
-            for arg in argv:
-                if arg and arg[0] == '-':
-                    lines = ['unrecognized arguments: %s' % (' '.join(argv))]
-                    for k, v in sorted(self.extra_info.items()):
-                        lines.append('  %s: %s' % (k, v))
-                    self.error('\n'.join(lines))
-            getattr(args, FILE_OR_DIR).extend(argv)
-        return args
-
-
-class DropShorterLongHelpFormatter(argparse.HelpFormatter):
-    """shorten help for long options that differ only in extra hyphens
-
-    - collapse **long** options that are the same except for extra hyphens
-    - special action attribute map_long_option allows surpressing additional
-      long options
-    - shortcut if there are only two options and one of them is a short one
-    - cache result on action object as this is called at least 2 times
-    """
-
-    def _format_action_invocation(self, action):
-        orgstr = argparse.HelpFormatter._format_action_invocation(self, action)
-        if orgstr and orgstr[0] != '-':  # only optional arguments
-            return orgstr
-        res = getattr(action, '_formatted_action_invocation', None)
-        if res:
-            return res
-        options = orgstr.split(', ')
-        if len(options) == 2 and (len(options[0]) == 2 or len(options[1]) == 2):
-            # a shortcut for '-h, --help' or '--abc', '-a'
-            action._formatted_action_invocation = orgstr
-            return orgstr
-        return_list = []
-        option_map = getattr(action, 'map_long_option', {})
-        if option_map is None:
-            option_map = {}
-        short_long = {}
-        for option in options:
-            if len(option) == 2 or option[2] == ' ':
-                continue
-            if not option.startswith('--'):
-                raise ArgumentError('long optional argument without "--": [%s]'
-                                    % (option), self)
-            xxoption = option[2:]
-            if xxoption.split()[0] not in option_map:
-                shortened = xxoption.replace('-', '')
-                if shortened not in short_long or \
-                   len(short_long[shortened]) < len(xxoption):
-                    short_long[shortened] = xxoption
-        # now short_long has been filled out to the longest with dashes
-        # **and** we keep the right option ordering from add_argument
-        for option in options:
-            if len(option) == 2 or option[2] == ' ':
-                return_list.append(option)
-            if option[2:] == short_long.get(option.replace('-', '')):
-                return_list.append(option.replace(' ', '=', 1))
-        action._formatted_action_invocation = ', '.join(return_list)
-        return action._formatted_action_invocation
-
-
-def _ensure_removed_sysmodule(modname):
-    try:
-        del sys.modules[modname]
-    except KeyError:
-        pass
-
-
-class CmdOptions(object):
-    """ holds cmdline options as attributes."""
-
-    def __init__(self, values=()):
-        self.__dict__.update(values)
-
-    def __repr__(self):
-        return "<CmdOptions %r>" % (self.__dict__,)
-
-    def copy(self):
-        return CmdOptions(self.__dict__)
-
-
-class Notset:
-    def __repr__(self):
-        return "<NOTSET>"
-
-
-notset = Notset()
-FILE_OR_DIR = 'file_or_dir'
-
-
-def _iter_rewritable_modules(package_files):
-    for fn in package_files:
-        is_simple_module = '/' not in fn and fn.endswith('.py')
-        is_package = fn.count('/') == 1 and fn.endswith('__init__.py')
-        if is_simple_module:
-            module_name, _ = os.path.splitext(fn)
-            yield module_name
-        elif is_package:
-            package_name = os.path.dirname(fn)
-            yield package_name
-
-
-class Config(object):
-    """ access to configuration values, pluginmanager and plugin hooks.  """
-
-    def __init__(self, pluginmanager):
-        #: access to command line option as attributes.
-        #: (deprecated), use :py:func:`getoption() <_pytest.config.Config.getoption>` instead
-        self.option = CmdOptions()
-        _a = FILE_OR_DIR
-        self._parser = Parser(
-            usage="%%(prog)s [options] [%s] [%s] [...]" % (_a, _a),
-            processopt=self._processopt,
-        )
-        #: a pluginmanager instance
-        self.pluginmanager = pluginmanager
-        self.trace = self.pluginmanager.trace.root.get("config")
-        self.hook = self.pluginmanager.hook
-        self._inicache = {}
-        self._override_ini = ()
-        self._opt2dest = {}
-        self._cleanup = []
-        self._warn = self.pluginmanager._warn
-        self.pluginmanager.register(self, "pytestconfig")
-        self._configured = False
-
-        def do_setns(dic):
-            import pytest
-            setns(pytest, dic)
-
-        self.hook.pytest_namespace.call_historic(do_setns, {})
-        self.hook.pytest_addoption.call_historic(kwargs=dict(parser=self._parser))
-
-    def add_cleanup(self, func):
-        """ Add a function to be called when the config object gets out of
-        use (usually coninciding with pytest_unconfigure)."""
-        self._cleanup.append(func)
-
-    def _do_configure(self):
-        assert not self._configured
-        self._configured = True
-        self.hook.pytest_configure.call_historic(kwargs=dict(config=self))
-
-    def _ensure_unconfigure(self):
-        if self._configured:
-            self._configured = False
-            self.hook.pytest_unconfigure(config=self)
-            self.hook.pytest_configure._call_history = []
-        while self._cleanup:
-            fin = self._cleanup.pop()
-            fin()
-
-    def warn(self, code, message, fslocation=None, nodeid=None):
-        """ generate a warning for this test session. """
-        self.hook.pytest_logwarning.call_historic(kwargs=dict(
-            code=code, message=message,
-            fslocation=fslocation, nodeid=nodeid))
-
-    def get_terminal_writer(self):
-        return self.pluginmanager.get_plugin("terminalreporter")._tw
-
-    def pytest_cmdline_parse(self, pluginmanager, args):
-        # REF1 assert self == pluginmanager.config, (self, pluginmanager.config)
-        self.parse(args)
-        return self
-
-    def notify_exception(self, excinfo, option=None):
-        if option and option.fulltrace:
-            style = "long"
-        else:
-            style = "native"
-        excrepr = excinfo.getrepr(funcargs=True,
-                                  showlocals=getattr(option, 'showlocals', False),
-                                  style=style,
-                                  )
-        res = self.hook.pytest_internalerror(excrepr=excrepr,
-                                             excinfo=excinfo)
-        if not any(res):
-            for line in str(excrepr).split("\n"):
-                sys.stderr.write("INTERNALERROR> %s\n" % line)
-                sys.stderr.flush()
-
-    def cwd_relative_nodeid(self, nodeid):
-        # nodeid's are relative to the rootpath, compute relative to cwd
-        if self.invocation_dir != self.rootdir:
-            fullpath = self.rootdir.join(nodeid)
-            nodeid = self.invocation_dir.bestrelpath(fullpath)
-        return nodeid
-
-    @classmethod
-    def fromdictargs(cls, option_dict, args):
-        """ constructor useable for subprocesses. """
-        config = get_config()
-        config.option.__dict__.update(option_dict)
-        config.parse(args, addopts=False)
-        for x in config.option.plugins:
-            config.pluginmanager.consider_pluginarg(x)
-        return config
-
-    def _processopt(self, opt):
-        for name in opt._short_opts + opt._long_opts:
-            self._opt2dest[name] = opt.dest
-
-        if hasattr(opt, 'default') and opt.dest:
-            if not hasattr(self.option, opt.dest):
-                setattr(self.option, opt.dest, opt.default)
-
-    @hookimpl(trylast=True)
-    def pytest_load_initial_conftests(self, early_config):
-        self.pluginmanager._set_initial_conftests(early_config.known_args_namespace)
-
-    def _initini(self, args):
-        ns, unknown_args = self._parser.parse_known_and_unknown_args(args, namespace=self.option.copy())
-        r = determine_setup(ns.inifilename, ns.file_or_dir + unknown_args, warnfunc=self.warn)
-        self.rootdir, self.inifile, self.inicfg = r
-        self._parser.extra_info['rootdir'] = self.rootdir
-        self._parser.extra_info['inifile'] = self.inifile
-        self.invocation_dir = py.path.local()
-        self._parser.addini('addopts', 'extra command line options', 'args')
-        self._parser.addini('minversion', 'minimally required pytest version')
-        self._override_ini = ns.override_ini or ()
-
-    def _consider_importhook(self, args):
-        """Install the PEP 302 import hook if using assertion rewriting.
-
-        Needs to parse the --assert=<mode> option from the commandline
-        and find all the installed plugins to mark them for rewriting
-        by the importhook.
-        """
-        ns, unknown_args = self._parser.parse_known_and_unknown_args(args)
-        mode = ns.assertmode
-        if mode == 'rewrite':
-            try:
-                hook = _pytest.assertion.install_importhook(self)
-            except SystemError:
-                mode = 'plain'
-            else:
-                self._mark_plugins_for_rewrite(hook)
-        self._warn_about_missing_assertion(mode)
-
-    def _mark_plugins_for_rewrite(self, hook):
-        """
-        Given an importhook, mark for rewrite any top-level
-        modules or packages in the distribution package for
-        all pytest plugins.
-        """
-        import pkg_resources
-        self.pluginmanager.rewrite_hook = hook
-
-        # 'RECORD' available for plugins installed normally (pip install)
-        # 'SOURCES.txt' available for plugins installed in dev mode (pip install -e)
-        # for installed plugins 'SOURCES.txt' returns an empty list, and vice-versa
-        # so it shouldn't be an issue
-        metadata_files = 'RECORD', 'SOURCES.txt'
-
-        package_files = (
-            entry.split(',')[0]
-            for entrypoint in pkg_resources.iter_entry_points('pytest11')
-            for metadata in metadata_files
-            for entry in entrypoint.dist._get_metadata(metadata)
-        )
-
-        for name in _iter_rewritable_modules(package_files):
-            hook.mark_rewrite(name)
-
-    def _warn_about_missing_assertion(self, mode):
-        try:
-            assert False
-        except AssertionError:
-            pass
-        else:
-            if mode == 'plain':
-                sys.stderr.write("WARNING: ASSERTIONS ARE NOT EXECUTED"
-                                 " and FAILING TESTS WILL PASS.  Are you"
-                                 " using python -O?")
-            else:
-                sys.stderr.write("WARNING: assertions not in test modules or"
-                                 " plugins will be ignored"
-                                 " because assert statements are not executed "
-                                 "by the underlying Python interpreter "
-                                 "(are you using python -O?)\n")
-
-    def _preparse(self, args, addopts=True):
-        if addopts:
-            args[:] = shlex.split(os.environ.get('PYTEST_ADDOPTS', '')) + args
-        self._initini(args)
-        if addopts:
-            args[:] = self.getini("addopts") + args
-        self._checkversion()
-        self._consider_importhook(args)
-        self.pluginmanager.consider_preparse(args)
-        self.pluginmanager.load_setuptools_entrypoints('pytest11')
-        self.pluginmanager.consider_env()
-        self.known_args_namespace = ns = self._parser.parse_known_args(args, namespace=self.option.copy())
-        if self.known_args_namespace.confcutdir is None and self.inifile:
-            confcutdir = py.path.local(self.inifile).dirname
-            self.known_args_namespace.confcutdir = confcutdir
-        try:
-            self.hook.pytest_load_initial_conftests(early_config=self,
-                                                    args=args, parser=self._parser)
-        except ConftestImportFailure:
-            e = sys.exc_info()[1]
-            if ns.help or ns.version:
-                # we don't want to prevent --help/--version to work
-                # so just let is pass and print a warning at the end
-                self._warn("could not load initial conftests (%s)\n" % e.path)
-            else:
-                raise
-
-    def _checkversion(self):
-        import pytest
-        minver = self.inicfg.get('minversion', None)
-        if minver:
-            ver = minver.split(".")
-            myver = pytest.__version__.split(".")
-            if myver < ver:
-                raise pytest.UsageError(
-                    "%s:%d: requires pytest-%s, actual pytest-%s'" % (
-                        self.inicfg.config.path, self.inicfg.lineof('minversion'),
-                        minver, pytest.__version__))
-
-    def parse(self, args, addopts=True):
-        # parse given cmdline arguments into this config object.
-        assert not hasattr(self, 'args'), (
-            "can only parse cmdline args at most once per Config object")
-        self._origargs = args
-        self.hook.pytest_addhooks.call_historic(
-            kwargs=dict(pluginmanager=self.pluginmanager))
-        self._preparse(args, addopts=addopts)
-        # XXX deprecated hook:
-        self.hook.pytest_cmdline_preparse(config=self, args=args)
-        self._parser.after_preparse = True
-        try:
-            args = self._parser.parse_setoption(args, self.option, namespace=self.option)
-            if not args:
-                cwd = os.getcwd()
-                if cwd == self.rootdir:
-                    args = self.getini('testpaths')
-                if not args:
-                    args = [cwd]
-            self.args = args
-        except PrintHelp:
-            pass
-
-    def addinivalue_line(self, name, line):
-        """ add a line to an ini-file option. The option must have been
-        declared but might not yet be set in which case the line becomes the
-        the first line in its value. """
-        x = self.getini(name)
-        assert isinstance(x, list)
-        x.append(line)  # modifies the cached list inline
-
-    def getini(self, name):
-        """ return configuration value from an :ref:`ini file <inifiles>`. If the
-        specified name hasn't been registered through a prior
-        :py:func:`parser.addini <_pytest.config.Parser.addini>`
-        call (usually from a plugin), a ValueError is raised. """
-        try:
-            return self._inicache[name]
-        except KeyError:
-            self._inicache[name] = val = self._getini(name)
-            return val
-
-    def _getini(self, name):
-        try:
-            description, type, default = self._parser._inidict[name]
-        except KeyError:
-            raise ValueError("unknown configuration value: %r" % (name,))
-        value = self._get_override_ini_value(name)
-        if value is None:
-            try:
-                value = self.inicfg[name]
-            except KeyError:
-                if default is not None:
-                    return default
-                if type is None:
-                    return ''
-                return []
-        if type == "pathlist":
-            dp = py.path.local(self.inicfg.config.path).dirpath()
-            values = []
-            for relpath in shlex.split(value):
-                values.append(dp.join(relpath, abs=True))
-            return values
-        elif type == "args":
-            return shlex.split(value)
-        elif type == "linelist":
-            return [t for t in map(lambda x: x.strip(), value.split("\n")) if t]
-        elif type == "bool":
-            return bool(_strtobool(value.strip()))
-        else:
-            assert type is None
-            return value
-
-    def _getconftest_pathlist(self, name, path):
-        try:
-            mod, relroots = self.pluginmanager._rget_with_confmod(name, path)
-        except KeyError:
-            return None
-        modpath = py.path.local(mod.__file__).dirpath()
-        values = []
-        for relroot in relroots:
-            if not isinstance(relroot, py.path.local):
-                relroot = relroot.replace("/", py.path.local.sep)
-                relroot = modpath.join(relroot, abs=True)
-            values.append(relroot)
-        return values
-
-    def _get_override_ini_value(self, name):
-        value = None
-        # override_ini is a list of list, to support both -o foo1=bar1 foo2=bar2 and
-        # and -o foo1=bar1 -o foo2=bar2 options
-        # always use the last item if multiple value set for same ini-name,
-        # e.g. -o foo=bar1 -o foo=bar2 will set foo to bar2
-        for ini_config_list in self._override_ini:
-            for ini_config in ini_config_list:
-                try:
-                    (key, user_ini_value) = ini_config.split("=", 1)
-                except ValueError:
-                    raise UsageError("-o/--override-ini expects option=value style.")
-                if key == name:
-                    value = user_ini_value
-        return value
-
-    def getoption(self, name, default=notset, skip=False):
-        """ return command line option value.
-
-        :arg name: name of the option.  You may also specify
-            the literal ``--OPT`` option instead of the "dest" option name.
-        :arg default: default value if no option of that name exists.
-        :arg skip: if True raise pytest.skip if option does not exists
-            or has a None value.
-        """
-        name = self._opt2dest.get(name, name)
-        try:
-            val = getattr(self.option, name)
-            if val is None and skip:
-                raise AttributeError(name)
-            return val
-        except AttributeError:
-            if default is not notset:
-                return default
-            if skip:
-                import pytest
-                pytest.skip("no %r option found" % (name,))
-            raise ValueError("no option named %r" % (name,))
-
-    def getvalue(self, name, path=None):
-        """ (deprecated, use getoption()) """
-        return self.getoption(name)
-
-    def getvalueorskip(self, name, path=None):
-        """ (deprecated, use getoption(skip=True)) """
-        return self.getoption(name, skip=True)
-
-
-def exists(path, ignore=EnvironmentError):
-    try:
-        return path.check()
-    except ignore:
-        return False
-
-
-def getcfg(args, warnfunc=None):
-    """
-    Search the list of arguments for a valid ini-file for pytest,
-    and return a tuple of (rootdir, inifile, cfg-dict).
-
-    note: warnfunc is an optional function used to warn
-        about ini-files that use deprecated features.
-        This parameter should be removed when pytest
-        adopts standard deprecation warnings (#1804).
-    """
-    from _pytest.deprecated import SETUP_CFG_PYTEST
-    inibasenames = ["pytest.ini", "tox.ini", "setup.cfg"]
-    args = [x for x in args if not str(x).startswith("-")]
-    if not args:
-        args = [py.path.local()]
-    for arg in args:
-        arg = py.path.local(arg)
-        for base in arg.parts(reverse=True):
-            for inibasename in inibasenames:
-                p = base.join(inibasename)
-                if exists(p):
-                    iniconfig = py.iniconfig.IniConfig(p)
-                    if 'pytest' in iniconfig.sections:
-                        if inibasename == 'setup.cfg' and warnfunc:
-                            warnfunc('C1', SETUP_CFG_PYTEST)
-                        return base, p, iniconfig['pytest']
-                    if inibasename == 'setup.cfg' and 'tool:pytest' in iniconfig.sections:
-                        return base, p, iniconfig['tool:pytest']
-                    elif inibasename == "pytest.ini":
-                        # allowed to be empty
-                        return base, p, {}
-    return None, None, None
-
-
-def get_common_ancestor(paths):
-    common_ancestor = None
-    for path in paths:
-        if not path.exists():
-            continue
-        if common_ancestor is None:
-            common_ancestor = path
-        else:
-            if path.relto(common_ancestor) or path == common_ancestor:
-                continue
-            elif common_ancestor.relto(path):
-                common_ancestor = path
-            else:
-                shared = path.common(common_ancestor)
-                if shared is not None:
-                    common_ancestor = shared
-    if common_ancestor is None:
-        common_ancestor = py.path.local()
-    elif common_ancestor.isfile():
-        common_ancestor = common_ancestor.dirpath()
-    return common_ancestor
-
-
-def get_dirs_from_args(args):
-    def is_option(x):
-        return str(x).startswith('-')
-
-    def get_file_part_from_node_id(x):
-        return str(x).split('::')[0]
-
-    def get_dir_from_path(path):
-        if path.isdir():
-            return path
-        return py.path.local(path.dirname)
-
-    # These look like paths but may not exist
-    possible_paths = (
-        py.path.local(get_file_part_from_node_id(arg))
-        for arg in args
-        if not is_option(arg)
-    )
-
-    return [
-        get_dir_from_path(path)
-        for path in possible_paths
-        if path.exists()
-    ]
-
-
-def determine_setup(inifile, args, warnfunc=None):
-    dirs = get_dirs_from_args(args)
-    if inifile:
-        iniconfig = py.iniconfig.IniConfig(inifile)
-        try:
-            inicfg = iniconfig["pytest"]
-        except KeyError:
-            inicfg = None
-        rootdir = get_common_ancestor(dirs)
-    else:
-        ancestor = get_common_ancestor(dirs)
-        rootdir, inifile, inicfg = getcfg([ancestor], warnfunc=warnfunc)
-        if rootdir is None:
-            for rootdir in ancestor.parts(reverse=True):
-                if rootdir.join("setup.py").exists():
-                    break
-            else:
-                rootdir, inifile, inicfg = getcfg(dirs, warnfunc=warnfunc)
-                if rootdir is None:
-                    rootdir = get_common_ancestor([py.path.local(), ancestor])
-                    is_fs_root = os.path.splitdrive(str(rootdir))[1] == '/'
-                    if is_fs_root:
-                        rootdir = ancestor
-    return rootdir, inifile, inicfg or {}
-
-
-def setns(obj, dic):
-    import pytest
-    for name, value in dic.items():
-        if isinstance(value, dict):
-            mod = getattr(obj, name, None)
-            if mod is None:
-                modname = "pytest.%s" % name
-                mod = types.ModuleType(modname)
-                sys.modules[modname] = mod
-                mod.__all__ = []
-                setattr(obj, name, mod)
-            obj.__all__.append(name)
-            setns(mod, value)
-        else:
-            setattr(obj, name, value)
-            obj.__all__.append(name)
-            # if obj != pytest:
-            #    pytest.__all__.append(name)
-            setattr(pytest, name, value)
-
-
-def create_terminal_writer(config, *args, **kwargs):
-    """Create a TerminalWriter instance configured according to the options
-    in the config object. Every code which requires a TerminalWriter object
-    and has access to a config object should use this function.
-    """
-    tw = py.io.TerminalWriter(*args, **kwargs)
-    if config.option.color == 'yes':
-        tw.hasmarkup = True
-    if config.option.color == 'no':
-        tw.hasmarkup = False
-    return tw
-
-
-def _strtobool(val):
-    """Convert a string representation of truth to true (1) or false (0).
-
-    True values are 'y', 'yes', 't', 'true', 'on', and '1'; false values
-    are 'n', 'no', 'f', 'false', 'off', and '0'.  Raises ValueError if
-    'val' is anything else.
-
-    .. note:: copied from distutils.util
-    """
-    val = val.lower()
-    if val in ('y', 'yes', 't', 'true', 'on', '1'):
-        return 1
-    elif val in ('n', 'no', 'f', 'false', 'off', '0'):
-        return 0
-    else:
-        raise ValueError("invalid truth value %r" % (val,))
deleted file mode 100644
--- a/testing/web-platform/tests/tools/third_party/pytest/_pytest/mark.py
+++ /dev/null
@@ -1,496 +0,0 @@
-""" generic mechanism for marking and selecting python functions. """
-from __future__ import absolute_import, division, print_function
-
-import inspect
-import warnings
-import attr
-from collections import namedtuple
-from operator import attrgetter
-from six.moves import map
-from .deprecated import MARK_PARAMETERSET_UNPACKING
-from .compat import NOTSET, getfslineno
-
-
-def alias(name, warning=None):
-    getter = attrgetter(name)
-
-    def warned(self):
-        warnings.warn(warning, stacklevel=2)
-        return getter(self)
-
-    return property(getter if warning is None else warned, doc='alias for ' + name)
-
-
-class ParameterSet(namedtuple('ParameterSet', 'values, marks, id')):
-    @classmethod
-    def param(cls, *values, **kw):
-        marks = kw.pop('marks', ())
-        if isinstance(marks, MarkDecorator):
-            marks = marks,
-        else:
-            assert isinstance(marks, (tuple, list, set))
-
-        def param_extract_id(id=None):
-            return id
-
-        id = param_extract_id(**kw)
-        return cls(values, marks, id)
-
-    @classmethod
-    def extract_from(cls, parameterset, legacy_force_tuple=False):
-        """
-        :param parameterset:
-            a legacy style parameterset that may or may not be a tuple,
-            and may or may not be wrapped into a mess of mark objects
-
-        :param legacy_force_tuple:
-            enforce tuple wrapping so single argument tuple values
-            don't get decomposed and break tests
-
-        """
-
-        if isinstance(parameterset, cls):
-            return parameterset
-        if not isinstance(parameterset, MarkDecorator) and legacy_force_tuple:
-            return cls.param(parameterset)
-
-        newmarks = []
-        argval = parameterset
-        while isinstance(argval, MarkDecorator):
-            newmarks.append(MarkDecorator(Mark(
-                argval.markname, argval.args[:-1], argval.kwargs)))
-            argval = argval.args[-1]
-        assert not isinstance(argval, ParameterSet)
-        if legacy_force_tuple:
-            argval = argval,
-
-        if newmarks:
-            warnings.warn(MARK_PARAMETERSET_UNPACKING)
-
-        return cls(argval, marks=newmarks, id=None)
-
-    @classmethod
-    def _for_parameterize(cls, argnames, argvalues, function):
-        if not isinstance(argnames, (tuple, list)):
-            argnames = [x.strip() for x in argnames.split(",") if x.strip()]
-            force_tuple = len(argnames) == 1
-        else:
-            force_tuple = False
-        parameters = [
-            ParameterSet.extract_from(x, legacy_force_tuple=force_tuple)
-            for x in argvalues]
-        del argvalues
-
-        if not parameters:
-            fs, lineno = getfslineno(function)
-            reason = "got empty parameter set %r, function %s at %s:%d" % (
-                argnames, function.__name__, fs, lineno)
-            mark = MARK_GEN.skip(reason=reason)
-            parameters.append(ParameterSet(
-                values=(NOTSET,) * len(argnames),
-                marks=[mark],
-                id=None,
-            ))
-        return argnames, parameters
-
-
-class MarkerError(Exception):
-
-    """Error in use of a pytest marker/attribute."""
-
-
-def param(*values, **kw):
-    return ParameterSet.param(*values, **kw)
-
-
-def pytest_addoption(parser):
-    group = parser.getgroup("general")
-    group._addoption(
-        '-k',
-        action="store", dest="keyword", default='', metavar="EXPRESSION",
-        help="only run tests which match the given substring expression. "
-             "An expression is a python evaluatable expression "
-             "where all names are substring-matched against test names "
-             "and their parent classes. Example: -k 'test_method or test_"
-             "other' matches all test functions and classes whose name "
-             "contains 'test_method' or 'test_other', while -k 'not test_method' "
-             "matches those that don't contain 'test_method' in their names. "
-             "Additionally keywords are matched to classes and functions "
-             "containing extra names in their 'extra_keyword_matches' set, "
-             "as well as functions which have names assigned directly to them."
-    )
-
-    group._addoption(
-        "-m",
-        action="store", dest="markexpr", default="", metavar="MARKEXPR",
-        help="only run tests matching given mark expression.  "
-             "example: -m 'mark1 and not mark2'."
-    )
-
-    group.addoption(
-        "--markers", action="store_true",
-        help="show markers (builtin, plugin and per-project ones)."
-    )
-
-    parser.addini("markers", "markers for test functions", 'linelist')
-
-
-def pytest_cmdline_main(config):
-    import _pytest.config
-    if config.option.markers:
-        config._do_configure()
-        tw = _pytest.config.create_terminal_writer(config)
-        for line in config.getini("markers"):
-            parts = line.split(":", 1)
-            name = parts[0]
-            rest = parts[1] if len(parts) == 2 else ''
-            tw.write("@pytest.mark.%s:" % name, bold=True)
-            tw.line(rest)
-            tw.line()
-        config._ensure_unconfigure()
-        return 0
-
-
-pytest_cmdline_main.tryfirst = True
-
-
-def pytest_collection_modifyitems(items, config):
-    keywordexpr = config.option.keyword.lstrip()
-    matchexpr = config.option.markexpr
-    if not keywordexpr and not matchexpr:
-        return
-    # pytest used to allow "-" for negating
-    # but today we just allow "-" at the beginning, use "not" instead
-    # we probably remove "-" altogether soon
-    if keywordexpr.startswith("-"):
-        keywordexpr = "not " + keywordexpr[1:]
-    selectuntil = False
-    if keywordexpr[-1:] == ":":
-        selectuntil = True
-        keywordexpr = keywordexpr[:-1]
-
-    remaining = []
-    deselected = []
-    for colitem in items:
-        if keywordexpr and not matchkeyword(colitem, keywordexpr):
-            deselected.append(colitem)
-        else:
-            if selectuntil:
-                keywordexpr = None
-            if matchexpr:
-                if not matchmark(colitem, matchexpr):
-                    deselected.append(colitem)
-                    continue
-            remaining.append(colitem)
-
-    if deselected:
-        config.hook.pytest_deselected(items=deselected)
-        items[:] = remaining
-
-
-@attr.s
-class MarkMapping(object):
-    """Provides a local mapping for markers where item access
-    resolves to True if the marker is present. """
-
-    own_mark_names = attr.ib()
-
-    @classmethod
-    def from_keywords(cls, keywords):
-        mark_names = set()
-        for key, value in keywords.items():
-            if isinstance(value, MarkInfo) or isinstance(value, MarkDecorator):
-                mark_names.add(key)
-        return cls(mark_names)
-
-    def __getitem__(self, name):
-        return name in self.own_mark_names
-
-
-class KeywordMapping(object):
-    """Provides a local mapping for keywords.
-    Given a list of names, map any substring of one of these names to True.
-    """
-
-    def __init__(self, names):
-        self._names = names
-
-    def __getitem__(self, subname):
-        for name in self._names:
-            if subname in name:
-                return True
-        return False
-
-
-def matchmark(colitem, markexpr):
-    """Tries to match on any marker names, attached to the given colitem."""
-    return eval(markexpr, {}, MarkMapping.from_keywords(colitem.keywords))
-
-
-def matchkeyword(colitem, keywordexpr):
-    """Tries to match given keyword expression to given collector item.
-
-    Will match on the name of colitem, including the names of its parents.
-    Only matches names of items which are either a :class:`Class` or a
-    :class:`Function`.
-    Additionally, matches on names in the 'extra_keyword_matches' set of
-    any item, as well as names directly assigned to test functions.
-    """
-    mapped_names = set()
-
-    # Add the names of the current item and any parent items
-    import pytest
-    for item in colitem.listchain():
-        if not isinstance(item, pytest.Instance):
-            mapped_names.add(item.name)
-
-    # Add the names added as extra keywords to current or parent items
-    for name in colitem.listextrakeywords():
-        mapped_names.add(name)
-
-    # Add the names attached to the current function through direct assignment
-    if hasattr(colitem, 'function'):
-        for name in colitem.function.__dict__:
-            mapped_names.add(name)
-
-    mapping = KeywordMapping(mapped_names)
-    if " " not in keywordexpr:
-        # special case to allow for simple "-k pass" and "-k 1.3"
-        return mapping[keywordexpr]
-    elif keywordexpr.startswith("not ") and " " not in keywordexpr[4:]:
-        return not mapping[keywordexpr[4:]]
-    return eval(keywordexpr, {}, mapping)
-
-
-def pytest_configure(config):
-    config._old_mark_config = MARK_GEN._config
-    if config.option.strict:
-        MARK_GEN._config = config
-
-
-def pytest_unconfigure(config):
-    MARK_GEN._config = getattr(config, '_old_mark_config', None)
-
-
-class MarkGenerator:
-    """ Factory for :class:`MarkDecorator` objects - exposed as
-    a ``pytest.mark`` singleton instance.  Example::
-
-         import pytest
-         @pytest.mark.slowtest
-         def test_function():
-            pass
-
-    will set a 'slowtest' :class:`MarkInfo` object
-    on the ``test_function`` object. """
-    _config = None
-
-    def __getattr__(self, name):
-        if name[0] == "_":
-            raise AttributeError("Marker name must NOT start with underscore")
-        if self._config is not None:
-            self._check(name)
-        return MarkDecorator(Mark(name, (), {}))
-
-    def _check(self, name):
-        try:
-            if name in self._markers:
-                return
-        except AttributeError:
-            pass
-        self._markers = values = set()
-        for line in self._config.getini("markers"):
-            marker = line.split(":", 1)[0]
-            marker = marker.rstrip()
-            x = marker.split("(", 1)[0]
-            values.add(x)
-        if name not in self._markers:
-            raise AttributeError("%r not a registered marker" % (name,))
-
-
-def istestfunc(func):
-    return hasattr(func, "__call__") and \
-        getattr(func, "__name__", "<lambda>") != "<lambda>"
-
-
-@attr.s(frozen=True)
-class Mark(object):
-    name = attr.ib()
-    args = attr.ib()
-    kwargs = attr.ib()
-
-    def combined_with(self, other):
-        assert self.name == other.name
-        return Mark(
-            self.name, self.args + other.args,
-            dict(self.kwargs, **other.kwargs))
-
-
-@attr.s
-class MarkDecorator(object):
-    """ A decorator for test functions and test classes.  When applied
-    it will create :class:`MarkInfo` objects which may be
-    :ref:`retrieved by hooks as item keywords <excontrolskip>`.
-    MarkDecorator instances are often created like this::
-
-        mark1 = pytest.mark.NAME              # simple MarkDecorator
-        mark2 = pytest.mark.NAME(name1=value) # parametrized MarkDecorator
-
-    and can then be applied as decorators to test functions::
-
-        @mark2
-        def test_function():
-            pass
-
-    When a MarkDecorator instance is called it does the following:
-      1. If called with a single class as its only positional argument and no
-         additional keyword arguments, it attaches itself to the class so it
-         gets applied automatically to all test cases found in that class.
-      2. If called with a single function as its only positional argument and
-         no additional keyword arguments, it attaches a MarkInfo object to the
-         function, containing all the arguments already stored internally in
-         the MarkDecorator.
-      3. When called in any other case, it performs a 'fake construction' call,
-         i.e. it returns a new MarkDecorator instance with the original
-         MarkDecorator's content updated with the arguments passed to this
-         call.
-
-    Note: The rules above prevent MarkDecorator objects from storing only a
-    single function or class reference as their positional argument with no
-    additional keyword or positional arguments.
-
-    """
-
-    mark = attr.ib(validator=attr.validators.instance_of(Mark))
-
-    name = alias('mark.name')
-    args = alias('mark.args')
-    kwargs = alias('mark.kwargs')
-
-    @property
-    def markname(self):
-        return self.name  # for backward-compat (2.4.1 had this attr)
-
-    def __eq__(self, other):
-        return self.mark == other.mark if isinstance(other, MarkDecorator) else False
-
-    def __repr__(self):
-        return "<MarkDecorator %r>" % (self.mark,)
-
-    def with_args(self, *args, **kwargs):
-        """ return a MarkDecorator with extra arguments added
-
-        unlike call this can be used even if the sole argument is a callable/class
-
-        :return: MarkDecorator
-        """
-
-        mark = Mark(self.name, args, kwargs)
-        return self.__class__(self.mark.combined_with(mark))
-
-    def __call__(self, *args, **kwargs):
-        """ if passed a single callable argument: decorate it with mark info.
-            otherwise add *args/**kwargs in-place to mark information. """
-        if args and not kwargs:
-            func = args[0]
-            is_class = inspect.isclass(func)
-            if len(args) == 1 and (istestfunc(func) or is_class):
-                if is_class:
-                    store_mark(func, self.mark)
-                else:
-                    store_legacy_markinfo(func, self.mark)
-                    store_mark(func, self.mark)
-                return func
-        return self.with_args(*args, **kwargs)
-
-
-def get_unpacked_marks(obj):
-    """
-    obtain the unpacked marks that are stored on a object
-    """
-    mark_list = getattr(obj, 'pytestmark', [])
-
-    if not isinstance(mark_list, list):
-        mark_list = [mark_list]
-    return [
-        getattr(mark, 'mark', mark)  # unpack MarkDecorator
-        for mark in mark_list
-    ]
-
-
-def store_mark(obj, mark):
-    """store a Mark on a object
-    this is used to implement the Mark declarations/decorators correctly
-    """
-    assert isinstance(mark, Mark), mark
-    # always reassign name to avoid updating pytestmark
-    # in a reference that was only borrowed
-    obj.pytestmark = get_unpacked_marks(obj) + [mark]
-
-
-def store_legacy_markinfo(func, mark):
-    """create the legacy MarkInfo objects and put them onto the function
-    """
-    if not isinstance(mark, Mark):
-        raise TypeError("got {mark!r} instead of a Mark".format(mark=mark))
-    holder = getattr(func, mark.name, None)
-    if holder is None:
-        holder = MarkInfo(mark)
-        setattr(func, mark.name, holder)
-    else:
-        holder.add_mark(mark)
-
-
-class MarkInfo(object):
-    """ Marking object created by :class:`MarkDecorator` instances. """
-
-    def __init__(self, mark):
-        assert isinstance(mark, Mark), repr(mark)
-        self.combined = mark
-        self._marks = [mark]
-
-    name = alias('combined.name')
-    args = alias('combined.args')
-    kwargs = alias('combined.kwargs')
-
-    def __repr__(self):
-        return "<MarkInfo {0!r}>".format(self.combined)
-
-    def add_mark(self, mark):
-        """ add a MarkInfo with the given args and kwargs. """
-        self._marks.append(mark)
-        self.combined = self.combined.combined_with(mark)
-
-    def __iter__(self):
-        """ yield MarkInfo objects each relating to a marking-call. """
-        return map(MarkInfo, self._marks)
-
-
-MARK_GEN = MarkGenerator()
-
-
-def _marked(func, mark):
-    """ Returns True if :func: is already marked with :mark:, False otherwise.
-    This can happen if marker is applied to class and the test file is
-    invoked more than once.
-    """
-    try:
-        func_mark = getattr(func, mark.name)
-    except AttributeError:
-        return False
-    return mark.args == func_mark.args and mark.kwargs == func_mark.kwargs
-
-
-def transfer_markers(funcobj, cls, mod):
-    """
-    this function transfers class level markers and module level markers
-    into function level markinfo objects
-
-    this is the main reason why marks are so broken
-    the resolution will involve phasing out function level MarkInfo objects
-
-    """
-    for obj in (cls, mod):
-        for mark in get_unpacked_marks(obj):
-            if not _marked(funcobj, mark):
-                store_legacy_markinfo(funcobj, mark)
--- a/testing/web-platform/tests/tools/third_party/pytest/appveyor.yml
+++ b/testing/web-platform/tests/tools/third_party/pytest/appveyor.yml
@@ -37,8 +37,12 @@ install:
   - if "%TOXENV%" == "pypy" call scripts\install-pypy.bat
 
   - C:\Python36\python -m pip install --upgrade --pre tox
 
 build: false  # Not a C# project, build stuff at the test step instead.
 
 test_script:
   - call scripts\call-tox.bat
+
+cache:
+  - '%LOCALAPPDATA%\pip\cache'
+  - '%USERPROFILE%\.cache\pre-commit'
--- a/testing/web-platform/tests/tools/third_party/pytest/bench/bench.py
+++ b/testing/web-platform/tests/tools/third_party/pytest/bench/bench.py
@@ -1,12 +1,13 @@
 import sys
 
-if __name__ == '__main__':
+if __name__ == "__main__":
     import cProfile
-    import pytest
+    import pytest  # NOQA
     import pstats
+
     script = sys.argv[1:] if len(sys.argv) > 1 else "empty.py"
-    stats = cProfile.run('pytest.cmdline.main(%r)' % script, 'prof')
+    stats = cProfile.run("pytest.cmdline.main(%r)" % script, "prof")
     p = pstats.Stats("prof")
     p.strip_dirs()
-    p.sort_stats('cumulative')
+    p.sort_stats("cumulative")
     print(p.print_stats(500))
--- a/testing/web-platform/tests/tools/third_party/pytest/bench/bench_argcomplete.py
+++ b/testing/web-platform/tests/tools/third_party/pytest/bench/bench_argcomplete.py
@@ -1,19 +1,22 @@
 
 
 # 10000 iterations, just for relative comparison
 #                      2.7.5     3.3.2
 # FilesCompleter       75.1109   69.2116
 # FastFilesCompleter    0.7383    1.0760
 
+import timeit
 
-if __name__ == '__main__':
-    import sys
-    import timeit
-    from argcomplete.completers import FilesCompleter
-    from _pytest._argcomplete import FastFilesCompleter
-    count = 1000 # only a few seconds
-    setup = 'from __main__ import FastFilesCompleter\nfc = FastFilesCompleter()'
-    run = 'fc("/d")'
-    sys.stdout.write('%s\n' % (timeit.timeit(run,
-                                setup=setup.replace('Fast', ''), number=count)))
-    sys.stdout.write('%s\n' % (timeit.timeit(run, setup=setup, number=count)))
+imports = [
+    "from argcomplete.completers import FilesCompleter as completer",
+    "from _pytest._argcomplete import FastFilesCompleter as completer",
+]
+
+count = 1000  # only a few seconds
+setup = "%s\nfc = completer()"
+run = 'fc("/d")'
+
+
+if __name__ == "__main__":
+    print(timeit.timeit(run, setup=setup % imports[0], number=count))
+    print((timeit.timeit(run, setup=setup % imports[1], number=count)))
--- a/testing/web-platform/tests/tools/third_party/pytest/bench/empty.py
+++ b/testing/web-platform/tests/tools/third_party/pytest/bench/empty.py
@@ -1,3 +1,4 @@
 import py
+
 for i in range(1000):
     py.builtin.exec_("def test_func_%d(): pass" % i)
--- a/testing/web-platform/tests/tools/third_party/pytest/bench/manyparam.py
+++ b/testing/web-platform/tests/tools/third_party/pytest/bench/manyparam.py
@@ -1,12 +1,15 @@
 
 import pytest
 
-@pytest.fixture(scope='module', params=range(966))
+
+@pytest.fixture(scope="module", params=range(966))
 def foo(request):
     return request.param
 
+
 def test_it(foo):
     pass
+
+
 def test_it2(foo):
     pass
-
--- a/testing/web-platform/tests/tools/third_party/pytest/bench/skip.py
+++ b/testing/web-platform/tests/tools/third_party/pytest/bench/skip.py
@@ -1,10 +1,11 @@
-
+from six.moves import range
 import pytest
 
 
 SKIP = True
 
-@pytest.mark.parametrize("x", xrange(5000))
+
+@pytest.mark.parametrize("x", range(5000))
 def test_foo(x):
     if SKIP:
         pytest.skip("heh")
deleted file mode 100644
--- a/testing/web-platform/tests/tools/third_party/pytest/changelog/2920.bugfix
+++ /dev/null
@@ -1,1 +0,0 @@
-Fix issue about ``-p no:<plugin>`` having no effect.
deleted file mode 100644
--- a/testing/web-platform/tests/tools/third_party/pytest/changelog/2949.trivial
+++ /dev/null
@@ -1,1 +0,0 @@
-Update github "bugs" link in CONTRIBUTING.rst
deleted file mode 100644
--- a/testing/web-platform/tests/tools/third_party/pytest/changelog/2956.bugfix
+++ /dev/null
@@ -1,1 +0,0 @@
-Fix regression with warnings that contained non-strings in their arguments in Python 2.
deleted file mode 100644
--- a/testing/web-platform/tests/tools/third_party/pytest/changelog/2957.bugfix
+++ /dev/null
@@ -1,1 +0,0 @@
-Always escape null bytes when setting ``PYTEST_CURRENT_TEST``.
deleted file mode 100644
--- a/testing/web-platform/tests/tools/third_party/pytest/changelog/2963.doc
+++ /dev/null
@@ -1,1 +0,0 @@
-Fix broken link to plugin pytest-localserver.
deleted file mode 100644
--- a/testing/web-platform/tests/tools/third_party/pytest/changelog/2971.bugfix
+++ /dev/null
@@ -1,1 +0,0 @@
-Fix ``ZeroDivisionError`` when using the ``testmon`` plugin when no tests were actually collected.
deleted file mode 100644
--- a/testing/web-platform/tests/tools/third_party/pytest/changelog/2984.bugfix
+++ /dev/null
@@ -1,1 +0,0 @@
-Bring back ``TerminalReporter.writer`` as an alias to ``TerminalReporter._tw``. This alias was removed by accident in the ``3.3.0`` release.
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/tools/third_party/pytest/changelog/README.rst
@@ -0,0 +1,32 @@
+This directory contains "newsfragments" which are short files that contain a small **ReST**-formatted
+text that will be added to the next ``CHANGELOG``.
+
+The ``CHANGELOG`` will be read by users, so this description should be aimed to pytest users
+instead of describing internal changes which are only relevant to the developers.
+
+Make sure to use full sentences with correct case and punctuation, for example::
+
+    Fix issue with non-ascii messages from the ``warnings`` module.
+
+Each file should be named like ``<ISSUE>.<TYPE>.rst``, where
+``<ISSUE>`` is an issue number, and ``<TYPE>`` is one of:
+
+* ``feature``: new user facing features, like new command-line options and new behavior.
+* ``bugfix``: fixes a reported bug.
+* ``doc``: documentation improvement, like rewording an entire session or adding missing docs.
+* ``removal``: feature deprecation or removal.
+* ``vendor``: changes in packages vendored in pytest.
+* ``trivial``: fixing a small typo or internal change that might be noteworthy.
+
+So for example: ``123.feature.rst``, ``456.bugfix.rst``.
+
+If your PR fixes an issue, use that number here. If there is no issue,
+then after you submit the PR and get the PR number you can add a
+changelog using that instead.
+
+If you are not sure what issue type to use, don't hesitate to ask in your PR.
+
+Note that the ``towncrier`` tool will automatically
+reflow your text, so it will work best if you stick to a single paragraph, but multiple sentences and links are OK
+and encouraged. You can install ``towncrier`` and then run ``towncrier --draft``
+if you want to get a preview of how your change will look in the final release notes.
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/_templates/globaltoc.html
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/_templates/globaltoc.html
@@ -1,19 +1,20 @@
 <h3><a href="{{ pathto(master_doc) }}">{{ _('Table Of Contents') }}</a></h3>
 
 <ul>
   <li><a href="{{ pathto('index') }}">Home</a></li>
+  <li><a href="{{ pathto('getting-started') }}">Install</a></li>
   <li><a href="{{ pathto('contents') }}">Contents</a></li>
-  <li><a href="{{ pathto('getting-started') }}">Install</a></li>
+  <li><a href="{{ pathto('reference') }}">Reference</a></li>
   <li><a href="{{ pathto('example/index') }}">Examples</a></li>
   <li><a href="{{ pathto('customize') }}">Customize</a></li>
-  <li><a href="{{ pathto('contact') }}">Contact</a></li>
-  <li><a href="{{ pathto('talks') }}">Talks/Posts</a></li>
   <li><a href="{{ pathto('changelog') }}">Changelog</a></li>
+  <li><a href="{{ pathto('contributing') }}">Contributing</a></li>
   <li><a href="{{ pathto('backwards-compatibility') }}">Backwards Compatibility</a></li>
   <li><a href="{{ pathto('license') }}">License</a></li>
+  <li><a href="{{ pathto('contact') }}">Contact Channels</a></li>
 </ul>
 
 {%- if display_toc %}
   <hr>
   {{ toc }}
 {%- endif %}
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/_templates/links.html
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/_templates/links.html
@@ -1,11 +1,8 @@
 <h3>Useful Links</h3>
 <ul>
-  <li><a href="{{ pathto('index') }}">The pytest Website</a></li>
-  <li><a href="{{ pathto('contributing') }}">Contribution Guide</a></li>
-  <li><a href="https://pypi.python.org/pypi/pytest">pytest @ PyPI</a></li>
+  <li><a href="https://pypi.org/project/pytest/">pytest @ PyPI</a></li>
   <li><a href="https://github.com/pytest-dev/pytest/">pytest @ GitHub</a></li>
   <li><a href="http://plugincompat.herokuapp.com/">3rd party plugins</a></li>
   <li><a href="https://github.com/pytest-dev/pytest/issues">Issue Tracker</a></li>
   <li><a href="https://media.readthedocs.org/pdf/pytest/latest/pytest.pdf">PDF Documentation</a>
 </ul>
-
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/_themes/flask/theme.conf
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/_themes/flask/theme.conf
@@ -1,9 +1,9 @@
 [theme]
 inherit = basic
 stylesheet = flasky.css
 pygments_style = flask_theme_support.FlaskyStyle
 
 [options]
 index_logo = ''
 index_logo_height = 120px
-touch_icon = 
+touch_icon =
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/_themes/flask_theme_support.py
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/_themes/flask_theme_support.py
@@ -1,86 +1,89 @@
 # flasky extensions.  flasky pygments style based on tango style
 from pygments.style import Style
-from pygments.token import Keyword, Name, Comment, String, Error, \
-     Number, Operator, Generic, Whitespace, Punctuation, Other, Literal
+from pygments.token import (
+    Keyword,
+    Name,
+    Comment,
+    String,
+    Error,
+    Number,
+    Operator,
+    Generic,
+    Whitespace,
+    Punctuation,
+    Other,
+    Literal,
+)
 
 
 class FlaskyStyle(Style):
     background_color = "#f8f8f8"
     default_style = ""
 
     styles = {
         # No corresponding class for the following:
-        #Text:                     "", # class:  ''
-        Whitespace:                "underline #f8f8f8",      # class: 'w'
-        Error:                     "#a40000 border:#ef2929", # class: 'err'
-        Other:                     "#000000",                # class 'x'
-
-        Comment:                   "italic #8f5902", # class: 'c'
-        Comment.Preproc:           "noitalic",       # class: 'cp'
-
-        Keyword:                   "bold #004461",   # class: 'k'
-        Keyword.Constant:          "bold #004461",   # class: 'kc'
-        Keyword.Declaration:       "bold #004461",   # class: 'kd'
-        Keyword.Namespace:         "bold #004461",   # class: 'kn'
-        Keyword.Pseudo:            "bold #004461",   # class: 'kp'
-        Keyword.Reserved:          "bold #004461",   # class: 'kr'
-        Keyword.Type:              "bold #004461",   # class: 'kt'
-
-        Operator:                  "#582800",   # class: 'o'
-        Operator.Word:             "bold #004461",   # class: 'ow' - like keywords
-
-        Punctuation:               "bold #000000",   # class: 'p'
-
+        # Text:                     "", # class:  ''
+        Whitespace: "underline #f8f8f8",  # class: 'w'
+        Error: "#a40000 border:#ef2929",  # class: 'err'
+        Other: "#000000",  # class 'x'
+        Comment: "italic #8f5902",  # class: 'c'
+        Comment.Preproc: "noitalic",  # class: 'cp'
+        Keyword: "bold #004461",  # class: 'k'
+        Keyword.Constant: "bold #004461",  # class: 'kc'
+        Keyword.Declaration: "bold #004461",  # class: 'kd'
+        Keyword.Namespace: "bold #004461",  # class: 'kn'
+        Keyword.Pseudo: "bold #004461",  # class: 'kp'
+        Keyword.Reserved: "bold #004461",  # class: 'kr'
+        Keyword.Type: "bold #004461",  # class: 'kt'
+        Operator: "#582800",  # class: 'o'
+        Operator.Word: "bold #004461",  # class: 'ow' - like keywords
+        Punctuation: "bold #000000",  # class: 'p'
         # because special names such as Name.Class, Name.Function, etc.
         # are not recognized as such later in the parsing, we choose them
         # to look the same as ordinary variables.
-        Name:                      "#000000",        # class: 'n'
-        Name.Attribute:            "#c4a000",        # class: 'na' - to be revised
-        Name.Builtin:              "#004461",        # class: 'nb'
-        Name.Builtin.Pseudo:       "#3465a4",        # class: 'bp'
-        Name.Class:                "#000000",        # class: 'nc' - to be revised
-        Name.Constant:             "#000000",        # class: 'no' - to be revised
-        Name.Decorator:            "#888",           # class: 'nd' - to be revised
-        Name.Entity:               "#ce5c00",        # class: 'ni'
-        Name.Exception:            "bold #cc0000",   # class: 'ne'
-        Name.Function:             "#000000",        # class: 'nf'
-        Name.Property:             "#000000",        # class: 'py'
-        Name.Label:                "#f57900",        # class: 'nl'
-        Name.Namespace:            "#000000",        # class: 'nn' - to be revised
-        Name.Other:                "#000000",        # class: 'nx'
-        Name.Tag:                  "bold #004461",   # class: 'nt' - like a keyword
-        Name.Variable:             "#000000",        # class: 'nv' - to be revised
-        Name.Variable.Class:       "#000000",        # class: 'vc' - to be revised
-        Name.Variable.Global:      "#000000",        # class: 'vg' - to be revised
-        Name.Variable.Instance:    "#000000",        # class: 'vi' - to be revised
-
-        Number:                    "#990000",        # class: 'm'
-
-        Literal:                   "#000000",        # class: 'l'
-        Literal.Date:              "#000000",        # class: 'ld'
-
-        String:                    "#4e9a06",        # class: 's'
-        String.Backtick:           "#4e9a06",        # class: 'sb'
-        String.Char:               "#4e9a06",        # class: 'sc'
-        String.Doc:                "italic #8f5902", # class: 'sd' - like a comment
-        String.Double:             "#4e9a06",        # class: 's2'
-        String.Escape:             "#4e9a06",        # class: 'se'
-        String.Heredoc:            "#4e9a06",        # class: 'sh'
-        String.Interpol:           "#4e9a06",        # class: 'si'
-        String.Other:              "#4e9a06",        # class: 'sx'
-        String.Regex:              "#4e9a06",        # class: 'sr'
-        String.Single:             "#4e9a06",        # class: 's1'
-        String.Symbol:             "#4e9a06",        # class: 'ss'
-
-        Generic:                   "#000000",        # class: 'g'
-        Generic.Deleted:           "#a40000",        # class: 'gd'
-        Generic.Emph:              "italic #000000", # class: 'ge'
-        Generic.Error:             "#ef2929",        # class: 'gr'
-        Generic.Heading:           "bold #000080",   # class: 'gh'
-        Generic.Inserted:          "#00A000",        # class: 'gi'
-        Generic.Output:            "#888",           # class: 'go'
-        Generic.Prompt:            "#745334",        # class: 'gp'
-        Generic.Strong:            "bold #000000",   # class: 'gs'
-        Generic.Subheading:        "bold #800080",   # class: 'gu'
-        Generic.Traceback:         "bold #a40000",   # class: 'gt'
+        Name: "#000000",  # class: 'n'
+        Name.Attribute: "#c4a000",  # class: 'na' - to be revised
+        Name.Builtin: "#004461",  # class: 'nb'
+        Name.Builtin.Pseudo: "#3465a4",  # class: 'bp'
+        Name.Class: "#000000",  # class: 'nc' - to be revised
+        Name.Constant: "#000000",  # class: 'no' - to be revised
+        Name.Decorator: "#888",  # class: 'nd' - to be revised
+        Name.Entity: "#ce5c00",  # class: 'ni'
+        Name.Exception: "bold #cc0000",  # class: 'ne'
+        Name.Function: "#000000",  # class: 'nf'
+        Name.Property: "#000000",  # class: 'py'
+        Name.Label: "#f57900",  # class: 'nl'
+        Name.Namespace: "#000000",  # class: 'nn' - to be revised
+        Name.Other: "#000000",  # class: 'nx'
+        Name.Tag: "bold #004461",  # class: 'nt' - like a keyword
+        Name.Variable: "#000000",  # class: 'nv' - to be revised
+        Name.Variable.Class: "#000000",  # class: 'vc' - to be revised
+        Name.Variable.Global: "#000000",  # class: 'vg' - to be revised
+        Name.Variable.Instance: "#000000",  # class: 'vi' - to be revised
+        Number: "#990000",  # class: 'm'
+        Literal: "#000000",  # class: 'l'
+        Literal.Date: "#000000",  # class: 'ld'
+        String: "#4e9a06",  # class: 's'
+        String.Backtick: "#4e9a06",  # class: 'sb'
+        String.Char: "#4e9a06",  # class: 'sc'
+        String.Doc: "italic #8f5902",  # class: 'sd' - like a comment
+        String.Double: "#4e9a06",  # class: 's2'
+        String.Escape: "#4e9a06",  # class: 'se'
+        String.Heredoc: "#4e9a06",  # class: 'sh'
+        String.Interpol: "#4e9a06",  # class: 'si'
+        String.Other: "#4e9a06",  # class: 'sx'
+        String.Regex: "#4e9a06",  # class: 'sr'
+        String.Single: "#4e9a06",  # class: 's1'
+        String.Symbol: "#4e9a06",  # class: 'ss'
+        Generic: "#000000",  # class: 'g'
+        Generic.Deleted: "#a40000",  # class: 'gd'
+        Generic.Emph: "italic #000000",  # class: 'ge'
+        Generic.Error: "#ef2929",  # class: 'gr'
+        Generic.Heading: "bold #000080",  # class: 'gh'
+        Generic.Inserted: "#00A000",  # class: 'gi'
+        Generic.Output: "#888",  # class: 'go'
+        Generic.Prompt: "#745334",  # class: 'gp'
+        Generic.Strong: "bold #000000",  # class: 'gs'
+        Generic.Subheading: "bold #800080",  # class: 'gu'
+        Generic.Traceback: "bold #a40000",  # class: 'gt'
     }
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/index.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/index.rst
@@ -1,16 +1,26 @@
 
 Release announcements
 ===========================================
 
 .. toctree::
    :maxdepth: 2
 
-   
+
+   release-3.6.2
+   release-3.6.1
+   release-3.6.0
+   release-3.5.1
+   release-3.5.0
+   release-3.4.2
+   release-3.4.1
+   release-3.4.0
+   release-3.3.2
+   release-3.3.1
    release-3.3.0
    release-3.2.5
    release-3.2.4
    release-3.2.3
    release-3.2.2
    release-3.2.1
    release-3.2.0
    release-3.1.3
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.0.3.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.0.3.rst
@@ -1,9 +1,9 @@
-py.test 2.0.3: bug fixes and speed ups 
+py.test 2.0.3: bug fixes and speed ups
 ===========================================================================
 
 Welcome to pytest-2.0.3, a maintenance and bug fix release of pytest,
 a mature testing tool for Python, supporting CPython 2.4-3.2, Jython
 and latest PyPy interpreters.  See the extensive docs with tested examples here:
 
     http://pytest.org/
 
@@ -32,9 +32,8 @@ Changes between 2.0.2 and 2.0.3
 
 - don't require zlib (and other libs) for genscript plugin without
   --genscript actually being used.
 
 - speed up skips (by not doing a full traceback representation
   internally)
 
 - fix issue37: avoid invalid characters in junitxml's output
-
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.1.1.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.1.1.rst
@@ -29,9 +29,8 @@ Changes between 2.1.0 and 2.1.1
 - fix issue60 / fix error conditions involving the creation of __pycache__
 - fix issue63 / assertion rewriting on inserts involving strings containing '%'
 - fix assertion rewriting on calls with a ** arg
 - don't cache rewritten modules if bytecode generation is disabled
 - fix assertion rewriting in read-only directories
 - fix issue59: provide system-out/err tags for junitxml output
 - fix issue61: assertion rewriting on boolean operations with 3 or more operands
 - you can now build a man page with "cd doc ; make man"
-
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.1.2.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.1.2.rst
@@ -25,9 +25,8 @@ Changes between 2.1.1 and 2.1.2
 ----------------------------------------
 
 - fix assertion rewriting on files with windows newlines on some Python versions
 - refine test discovery by package/module name (--pyargs), thanks Florian Mayer
 - fix issue69 / assertion rewriting fixed on some boolean operations
 - fix issue68 / packages now work with assertion rewriting
 - fix issue66: use different assertion rewriting caches when the -O option is passed
 - don't try assertion rewriting on Jython, use reinterp
-
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.1.3.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.1.3.rst
@@ -4,17 +4,17 @@ py.test 2.1.3: just some more fixes
 pytest-2.1.3 is a minor backward compatible maintenance release of the
 popular py.test testing tool.  It is commonly used for unit, functional-
 and integration testing.  See extensive docs with examples here:
 
      http://pytest.org/
 
 The release contains another fix to the perfected assertions introduced
 with the 2.1 series as well as the new possibility to customize reporting
-for assertion expressions on a per-directory level.  
+for assertion expressions on a per-directory level.
 
 If you want to install or upgrade pytest, just type one of::
 
     pip install -U pytest # or
     easy_install -U pytest
 
 Thanks to the bug reporters and to Ronny Pfannschmidt, Benjamin Peterson
 and Floris Bruynooghe who implemented the fixes.
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.2.1.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.2.1.rst
@@ -22,20 +22,20 @@ Gospodnetic and Ralf Schmitt.
 best,
 holger krekel
 
 
 Changes between 2.2.0 and 2.2.1
 ----------------------------------------
 
 - fix issue99 (in pytest and py) internallerrors with resultlog now
-  produce better output - fixed by normalizing pytest_internalerror 
+  produce better output - fixed by normalizing pytest_internalerror
   input arguments.
 - fix issue97 / traceback issues (in pytest and py) improve traceback output
   in conjunction with jinja2 and cython which hack tracebacks
 - fix issue93 (in pytest and pytest-xdist) avoid "delayed teardowns":
   the final test in a test node will now run its teardown directly
   instead of waiting for the end of the session. Thanks Dave Hunt for
   the good reporting and feedback.  The pytest_runtest_protocol as well
-  as the pytest_runtest_teardown hooks now have "nextitem" available 
+  as the pytest_runtest_teardown hooks now have "nextitem" available
   which will be None indicating the end of the test run.
 - fix collection crash due to unknown-source collected items, thanks
   to Ralf Schmitt (fixed by depending on a more recent pylib)
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.2.2.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.2.2.rst
@@ -1,15 +1,15 @@
 pytest-2.2.2: bug fixes
 ===========================================================================
 
 pytest-2.2.2 (updated to 2.2.3 to fix packaging issues) is a minor
 backward-compatible release of the versatile py.test testing tool.   It
 contains bug fixes and a few refinements particularly to reporting with
-"--collectonly", see below for betails.  
+"--collectonly", see below for betails.
 
 For general information see here:
 
      http://pytest.org/
 
 To install or upgrade pytest:
 
     pip install -U pytest # or
@@ -22,22 +22,22 @@ best,
 holger krekel
 
 
 Changes between 2.2.1 and 2.2.2
 ----------------------------------------
 
 - fix issue101: wrong args to unittest.TestCase test function now
   produce better output
-- fix issue102: report more useful errors and hints for when a 
+- fix issue102: report more useful errors and hints for when a
   test directory was renamed and some pyc/__pycache__ remain
 - fix issue106: allow parametrize to be applied multiple times
   e.g. from module, class and at function level.
 - fix issue107: actually perform session scope finalization
 - don't check in parametrize if indirect parameters are funcarg names
 - add chdir method to monkeypatch funcarg
 - fix crash resulting from calling monkeypatch undo a second time
 - fix issue115: make --collectonly robust against early failure
   (missing files/directories)
 - "-qq --collectonly" now shows only files and the number of tests in them
-- "-q --collectonly" now shows test ids 
+- "-q --collectonly" now shows test ids
 - allow adding of attributes to test reports such that it also works
   with distributed testing (no upgrade of pytest-xdist needed)
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.2.4.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.2.4.rst
@@ -31,9 +31,8 @@ Changes between 2.2.3 and 2.2.4
 - document integration with the extended distribute/setuptools test commands
 - fix issue 140: properly get the real functions
   of bound classmethods for setup/teardown_class
 - fix issue #141: switch from the deceased paste.pocoo.org to bpaste.net
 - fix issue #143: call unconfigure/sessionfinish always when
   configure/sessionstart where called
 - fix issue #144: better mangle test ids to junitxml classnames
 - upgrade distribute_setup.py to 0.6.27
-
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.3.0.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.3.0.rst
@@ -1,20 +1,20 @@
 pytest-2.3: improved fixtures / better unittest integration
 =============================================================================
 
-pytest-2.3 comes with many major improvements for fixture/funcarg management 
+pytest-2.3 comes with many major improvements for fixture/funcarg management
 and parametrized testing in Python.  It is now easier, more efficient and
 more predicatable to re-run the same tests with different fixture
 instances.  Also, you can directly declare the caching "scope" of
 fixtures so that dependent tests throughout your whole test suite can
 re-use database or other expensive fixture objects with ease.  Lastly,
 it's possible for fixture functions (formerly known as funcarg
 factories) to use other fixtures, allowing for a completely modular and
-re-useable fixture design. 
+re-useable fixture design.
 
 For detailed info and tutorial-style examples, see:
 
     http://pytest.org/latest/fixture.html
 
 Moreover, there is now support for using pytest fixtures/funcargs with
 unittest-style suites, see here for examples:
 
@@ -22,33 +22,33 @@ unittest-style suites, see here for exam
 
 Besides, more unittest-test suites are now expected to "simply work"
 with pytest.
 
 All changes are backward compatible and you should be able to continue
 to run your test suites and 3rd party plugins that worked with
 pytest-2.2.4.
 
-If you are interested in the precise reasoning (including examples) of the 
+If you are interested in the precise reasoning (including examples) of the
 pytest-2.3 fixture evolution, please consult
 http://pytest.org/latest/funcarg_compare.html
 
 For general info on installation and getting started:
 
     http://pytest.org/latest/getting-started.html
 
 Docs and PDF access as usual at:
 
     http://pytest.org
 
 and more details for those already in the knowing of pytest can be found
 in the CHANGELOG below.
 
 Particular thanks for this release go to Floris Bruynooghe, Alex Okrushko
-Carl Meyer, Ronny Pfannschmidt, Benjamin Peterson and Alex Gaynor for helping 
+Carl Meyer, Ronny Pfannschmidt, Benjamin Peterson and Alex Gaynor for helping
 to get the new features right and well integrated.  Ronny and Floris
 also helped to fix a number of bugs and yet more people helped by
 providing bug reports.
 
 have fun,
 holger krekel
 
 
@@ -89,17 +89,17 @@ Changes between 2.2.4 and 2.3.0
 
 - fix issue128: show captured output when capsys/capfd are used
 
 - fix issue179: properly show the dependency chain of factories
 
 - pluginmanager.register(...) now raises ValueError if the
   plugin has been already registered or the name is taken
 
-- fix issue159: improve http://pytest.org/latest/faq.html 
+- fix issue159: improve http://pytest.org/latest/faq.html
   especially with respect to the "magic" history, also mention
   pytest-django, trial and unittest integration.
 
 - make request.keywords and node.keywords writable.  All descendant
   collection nodes will see keyword values.  Keywords are dictionaries
   containing markers and other info.
 
 - fix issue 178: xml binary escapes are now wrapped in py.xml.raw
@@ -120,15 +120,14 @@ Changes between 2.2.4 and 2.3.0
 - fix issue 156: monkeypatch correctly handles class level descriptors
 
 - reporting refinements:
 
   - pytest_report_header now receives a "startdir" so that
     you can use startdir.bestrelpath(yourpath) to show
     nice relative path
 
-  - allow plugins to implement both pytest_report_header and 
+  - allow plugins to implement both pytest_report_header and
     pytest_sessionstart (sessionstart is invoked first).
 
   - don't show deselected reason line if there is none
 
   - py.test -vv will show all of assert comparisons instead of truncating
-
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.3.1.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.3.1.rst
@@ -1,23 +1,23 @@
 pytest-2.3.1: fix regression with factory functions
 ===========================================================================
 
 pytest-2.3.1 is a quick follow-up release:
 
-- fix issue202 - regression with fixture functions/funcarg factories:  
-  using "self" is now safe again and works as in 2.2.4.  Thanks 
+- fix issue202 - regression with fixture functions/funcarg factories:
+  using "self" is now safe again and works as in 2.2.4.  Thanks
   to Eduard Schettino for the quick bug report.
 
-- disable pexpect pytest self tests on Freebsd - thanks Koob for the 
+- disable pexpect pytest self tests on Freebsd - thanks Koob for the
   quick reporting
 
 - fix/improve interactive docs with --markers
 
-See 
+See
 
      http://pytest.org/
 
 for general information.  To install or upgrade pytest:
 
     pip install -U pytest # or
     easy_install -U pytest
 
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.3.2.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.3.2.rst
@@ -3,35 +3,35 @@ pytest-2.3.2: some fixes and more traceb
 
 pytest-2.3.2 is another stabilization release:
 
 - issue 205: fixes a regression with conftest detection
 - issue 208/29: fixes traceback-printing speed in some bad cases
 - fix teardown-ordering for parametrized setups
 - fix unittest and trial compat behaviour with respect  to runTest() methods
 - issue 206 and others: some improvements to packaging
-- fix issue127 and others: improve some docs 
+- fix issue127 and others: improve some docs
 
-See 
+See
 
      http://pytest.org/
 
 for general information.  To install or upgrade pytest:
 
     pip install -U pytest # or
     easy_install -U pytest
 
 best,
 holger krekel
 
 
 Changes between 2.3.1 and 2.3.2
 -----------------------------------
 
-- fix issue208 and fix issue29 use new py version to avoid long pauses 
+- fix issue208 and fix issue29 use new py version to avoid long pauses
   when printing tracebacks in long modules
 
 - fix issue205 - conftests in subdirs customizing
   pytest_pycollect_makemodule and pytest_pycollect_makeitem
   now work properly
 
 - fix teardown-ordering for parametrized setups
 
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.3.3.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.3.3.rst
@@ -1,27 +1,27 @@
 pytest-2.3.3: integration fixes, py24 support, ``*/**`` shown in traceback
 ===========================================================================
 
 pytest-2.3.3 is another stabilization release of the py.test tool
 which offers uebersimple assertions, scalable fixture mechanisms
 and deep customization for testing with Python.  Particularly,
 this release provides:
 
-- integration fixes and improvements related to flask, numpy, nose, 
+- integration fixes and improvements related to flask, numpy, nose,
   unittest, mock
 
 - makes pytest work on py24 again (yes, people sometimes still need to use it)
 
 - show ``*,**`` args in pytest tracebacks
 
 Thanks to Manuel Jacob, Thomas Waldmann, Ronny Pfannschmidt, Pavel Repin
 and Andreas Taumoefolau for providing patches and all for the issues.
 
-See 
+See
 
      http://pytest.org/
 
 for general information.  To install or upgrade pytest:
 
     pip install -U pytest # or
     easy_install -U pytest
 
@@ -54,9 +54,8 @@ Changes between 2.3.2 and 2.3.3
 - in tracebacks *,** arg values are now shown next to normal arguments
   (thanks Manuel Jacob)
 
 - fix issue217 - support mock.patch with pytest's fixtures - note that
   you need either mock-1.0.1 or the python3.3 builtin unittest.mock.
 
 - fix issue127 - improve documentation for pytest_addoption() and
   add a ``config.getoption(name)`` helper function for consistency.
-
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.3.4.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.3.4.rst
@@ -5,33 +5,33 @@ pytest-2.3.4 is a small stabilization re
 which offers uebersimple assertions, scalable fixture mechanisms
 and deep customization for testing with Python.  This release
 comes with the following fixes and features:
 
 - make "-k" option accept an expressions the same as with "-m" so that one
   can write: -k "name1 or name2" etc.  This is a slight usage incompatibility
   if you used special syntax like "TestClass.test_method" which you now
   need to write as -k "TestClass and test_method" to match a certain
-  method in a certain test class.  
+  method in a certain test class.
 - allow to dynamically define markers via
   item.keywords[...]=assignment integrating with "-m" option
-- yielded test functions will now have autouse-fixtures active but 
+- yielded test functions will now have autouse-fixtures active but
   cannot accept fixtures as funcargs - it's anyway recommended to
   rather use the post-2.0 parametrize features instead of yield, see:
   http://pytest.org/latest/example/parametrize.html
 - fix autouse-issue where autouse-fixtures would not be discovered
-  if defined in a a/conftest.py file and tests in a/tests/test_some.py
+  if defined in an a/conftest.py file and tests in a/tests/test_some.py
 - fix issue226 - LIFO ordering for fixture teardowns
 - fix issue224 - invocations with >256 char arguments now work
 - fix issue91 - add/discuss package/directory level setups in example
 - fixes related to autouse discovery and calling
 
 Thanks in particular to Thomas Waldmann for spotting and reporting issues.
 
-See 
+See
 
      http://pytest.org/
 
 for general information.  To install or upgrade pytest:
 
     pip install -U pytest # or
     easy_install -U pytest
 
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.3.5.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.3.5.rst
@@ -8,18 +8,18 @@ prior version are expected to work unmod
 few interesting new plugins saw the light last month:
 
 - pytest-instafail: show failure information while tests are running
 - pytest-qt: testing of GUI applications written with QT/Pyside
 - pytest-xprocess: managing external processes across test runs
 - pytest-random: randomize test ordering
 
 And several others like pytest-django saw maintenance releases.
-For a more complete list, check out 
-https://pypi.python.org/pypi?%3Aaction=search&term=pytest&submit=search.
+For a more complete list, check out
+https://pypi.org/search/?q=pytest
 
 For general information see:
 
      http://pytest.org/
 
 To install or upgrade pytest:
 
     pip install -U pytest # or
@@ -76,22 +76,21 @@ Changes between 2.3.4 and 2.3.5
 
 - move long description of distribution into README.rst
 
 - improve docstring for metafunc.parametrize()
 
 - fix bug where using capsys with pytest.set_trace() in a test
   function would break when looking at capsys.readouterr()
 
-- allow to specify prefixes starting with "_" when 
+- allow to specify prefixes starting with "_" when
   customizing python_functions test discovery. (thanks Graham Horler)
 
 - improve PYTEST_DEBUG tracing output by putting
   extra data on a new lines with additional indent
 
 - ensure OutcomeExceptions like skip/fail have initialized exception attributes
 
 - issue 260 - don't use nose special setup on plain unittest cases
 
 - fix issue134 - print the collect errors that prevent running specified test items
 
 - fix issue266 - accept unicode in MarkEvaluator expressions
-
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.4.0.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.4.0.rst
@@ -1,57 +1,57 @@
 pytest-2.4.0: new fixture features/hooks and bug fixes
 ===========================================================================
 
-The just released pytest-2.4.0 brings many improvements and numerous 
+The just released pytest-2.4.0 brings many improvements and numerous
 bug fixes while remaining plugin- and test-suite compatible apart
-from a few supposedly very minor incompatibilities.  See below for 
+from a few supposedly very minor incompatibilities.  See below for
 a full list of details.  A few feature highlights:
 
 - new yield-style fixtures `pytest.yield_fixture
   <http://pytest.org/latest/yieldfixture.html>`_, allowing to use
   existing with-style context managers in fixture functions.
 
 - improved pdb support: ``import pdb ; pdb.set_trace()`` now works
   without requiring prior disabling of stdout/stderr capturing.
   Also the ``--pdb`` options works now on collection and internal errors
-  and we introduced a new experimental hook for IDEs/plugins to 
+  and we introduced a new experimental hook for IDEs/plugins to
   intercept debugging: ``pytest_exception_interact(node, call, report)``.
 
 - shorter monkeypatch variant to allow specifying an import path as
   a target, for example: ``monkeypatch.setattr("requests.get", myfunc)``
 
 - better unittest/nose compatibility: all teardown methods are now only
   called if the corresponding setup method succeeded.
 
 - integrate tab-completion on command line options if you
-  have `argcomplete <http://pypi.python.org/pypi/argcomplete>`_ 
+  have `argcomplete <http://pypi.python.org/pypi/argcomplete>`_
   configured.
 
 - allow boolean expression directly with skipif/xfail
   if a "reason" is also specified.
 
 - a new hook ``pytest_load_initial_conftests`` allows plugins like
-  `pytest-django <http://pypi.python.org/pypi/pytest-django>`_ to
+  `pytest-django <https://pypi.org/project/pytest-django/>`_ to
   influence the environment before conftest files import ``django``.
 
 - reporting: color the last line red or green depending if
   failures/errors occurred or everything passed.
 
-The documentation has been updated to accommodate the changes, 
-see `http://pytest.org <http://pytest.org>`_ 
+The documentation has been updated to accommodate the changes,
+see `http://pytest.org <http://pytest.org>`_
 
 To install or upgrade pytest::
 
     pip install -U pytest # or
     easy_install -U pytest
 
 
-**Many thanks to all who helped, including Floris Bruynooghe, 
-Brianna Laugher, Andreas Pelme, Anthon van der Neut, Anatoly Bubenkoff, 
+**Many thanks to all who helped, including Floris Bruynooghe,
+Brianna Laugher, Andreas Pelme, Anthon van der Neut, Anatoly Bubenkoff,
 Vladimir Keleshev, Mathieu Agopian, Ronny Pfannschmidt, Christian
 Theunert and many others.**
 
 may passing tests be with you,
 
 holger krekel
 
 Changes between 2.3.5 and 2.4
@@ -96,22 +96,22 @@ new features:
 
 - reporting: color the last line red or green depending if
   failures/errors occurred or everything passed.  thanks Christian
   Theunert.
 
 - make "import pdb ; pdb.set_trace()" work natively wrt capturing (no
   "-s" needed anymore), making ``pytest.set_trace()`` a mere shortcut.
 
-- fix issue181: --pdb now also works on collect errors (and 
-  on internal errors) .  This was implemented by a slight internal 
-  refactoring and the introduction of a new hook 
+- fix issue181: --pdb now also works on collect errors (and
+  on internal errors) .  This was implemented by a slight internal
+  refactoring and the introduction of a new hook
   ``pytest_exception_interact`` hook (see next item).
 
-- fix issue341: introduce new experimental hook for IDEs/terminals to 
+- fix issue341: introduce new experimental hook for IDEs/terminals to
   intercept debugging: ``pytest_exception_interact(node, call, report)``.
 
 - new monkeypatch.setattr() variant to provide a shorter
   invocation for patching out classes/functions from modules:
 
      monkeypatch.setattr("requests.get", myfunc)
 
   will replace the "get" function of the "requests" module with ``myfunc``.
@@ -119,17 +119,17 @@ new features:
 - fix issue322: tearDownClass is not run if setUpClass failed. Thanks
   Mathieu Agopian for the initial fix.  Also make all of pytest/nose
   finalizer mimic the same generic behaviour: if a setupX exists and
   fails, don't run teardownX.  This internally introduces a new method
   "node.addfinalizer()" helper which can only be called during the setup
   phase of a node.
 
 - simplify pytest.mark.parametrize() signature: allow to pass a
-  CSV-separated string to specify argnames.  For example: 
+  CSV-separated string to specify argnames.  For example:
   ``pytest.mark.parametrize("input,expected",  [(1,2), (2,3)])``
   works as well as the previous:
   ``pytest.mark.parametrize(("input", "expected"), ...)``.
 
 - add support for setUpModule/tearDownModule detection, thanks Brian Okken.
 
 - integrate tab-completion on options through use of "argcomplete".
   Thanks Anthon van der Neut for the PR.
@@ -144,20 +144,20 @@ new features:
 - fix issue 308 - allow to mark/xfail/skip individual parameter sets
   when parametrizing.  Thanks Brianna Laugher.
 
 - call new experimental pytest_load_initial_conftests hook to allow
   3rd party plugins to do something before a conftest is loaded.
 
 Bug fixes:
 
-- fix issue358 - capturing options are now parsed more properly 
+- fix issue358 - capturing options are now parsed more properly
   by using a new parser.parse_known_args method.
 
-- pytest now uses argparse instead of optparse (thanks Anthon) which 
+- pytest now uses argparse instead of optparse (thanks Anthon) which
   means that "argparse" is added as a dependency if installing into python2.6
   environments or below.
 
 - fix issue333: fix a case of bad unittest/pytest hook interaction.
 
 - PR27: correctly handle nose.SkipTest during collection.  Thanks
   Antonio Cuni, Ronny Pfannschmidt.
 
@@ -188,38 +188,37 @@ Bug fixes:
   reporting (thanks Katarzyna Jachim)
 
 - fix issue300 - Fix order of conftest loading when starting py.test
   in a subdirectory.
 
 - fix issue323 - sorting of many module-scoped arg parametrizations
 
 - make sessionfinish hooks execute with the same cwd-context as at
-  session start (helps fix plugin behaviour which write output files 
+  session start (helps fix plugin behaviour which write output files
   with relative path such as pytest-cov)
 
 - fix issue316 - properly reference collection hooks in docs
 
 - fix issue 306 - cleanup of -k/-m options to only match markers/test
   names/keywords respectively.  Thanks Wouter van Ackooy.
 
-- improved doctest counting for doctests in python modules -- 
+- improved doctest counting for doctests in python modules --
   files without any doctest items will not show up anymore
   and doctest examples are counted as separate test items.
   thanks Danilo Bellini.
 
 - fix issue245 by depending on the released py-1.4.14
   which fixes py.io.dupfile to work with files with no
   mode. Thanks Jason R. Coombs.
 
 - fix junitxml generation when test output contains control characters,
-  addressing issue267, thanks Jaap Broekhuizen 
+  addressing issue267, thanks Jaap Broekhuizen
 
 - fix issue338: honor --tb style for setup/teardown errors as well.  Thanks Maho.
 
 - fix issue307 - use yaml.safe_load in example, thanks Mark Eichin.
 
 - better parametrize error messages, thanks Brianna Laugher
 
 - pytest_terminal_summary(terminalreporter) hooks can now use
-  ".section(title)" and ".line(msg)" methods to print extra 
+  ".section(title)" and ".line(msg)" methods to print extra
   information at the end of a test run.
-
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.4.1.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.4.1.rst
@@ -3,17 +3,17 @@ pytest-2.4.1: fixing three regressions c
 
 pytest-2.4.1 is a quick follow up release to fix three regressions
 compared to 2.3.5 before they hit more people:
 
 - When using parser.addoption() unicode arguments to the
   "type" keyword should also be converted to the respective types.
   thanks Floris Bruynooghe, @dnozay. (fixes issue360 and issue362)
 
-- fix dotted filename completion when using argcomplete 
+- fix dotted filename completion when using argcomplete
   thanks Anthon van der Neuth. (fixes issue361)
 
 - fix regression when a 1-tuple ("arg",) is used for specifying
   parametrization (the values of the parametrization were passed
   nested in a tuple).  Thanks Donald Stufft.
 
 - also merge doc typo fixes, thanks Andy Dirnberger
 
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.4.2.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.4.2.rst
@@ -21,19 +21,19 @@ pytest-2.4.2 is another bug-fixing relea
 
 - introduce node.get_marker/node.add_marker API for plugins
   like pytest-pep8 and pytest-flakes to avoid the messy
   details of the node.keywords  pseudo-dicts.  Adapted
   docs.
 
 - remove attempt to "dup" stdout at startup as it's icky.
   the normal capturing should catch enough possibilities
-  of tests messing up standard FDs. 
+  of tests messing up standard FDs.
 
-- add pluginmanager.do_configure(config) as a link to 
+- add pluginmanager.do_configure(config) as a link to
   config.do_configure() for plugin-compatibility
 
 as usual, docs at http://pytest.org and upgrades via::
 
     pip install -U pytest
 
 have fun,
 holger krekel
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.5.0.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.5.0.rst
@@ -1,33 +1,33 @@
 pytest-2.5.0: now down to ZERO reported bugs!
 ===========================================================================
 
 pytest-2.5.0 is a big fixing release, the result of two community bug
 fixing days plus numerous additional works from many people and
 reporters.  The release should be fully compatible to 2.4.2, existing
-plugins and test suites.  We aim at maintaining this level of ZERO reported 
+plugins and test suites.  We aim at maintaining this level of ZERO reported
 bugs because it's no fun if your testing tool has bugs, is it?  Under a
 condition, though: when submitting a bug report please provide
 clear information about the circumstances and a simple example which
 reproduces the problem.
 
 The issue tracker is of course not empty now.  We have many remaining
 "enhacement" issues which we'll hopefully can tackle in 2014 with your
 help.
 
 For those who use older Python versions, please note that pytest is not
 automatically tested on python2.5 due to virtualenv, setuptools and tox
 not supporting it anymore.  Manual verification shows that it mostly
-works fine but it's not going to be part of the automated release 
+works fine but it's not going to be part of the automated release
 process and thus likely to break in the future.
 
-As usual, current docs are at 
+As usual, current docs are at
 
-    http://pytest.org 
+    http://pytest.org
 
 and you can upgrade from pypi via::
 
     pip install -U pytest
 
 Particular thanks for helping with this release go to Anatoly Bubenkoff,
 Floris Bruynooghe, Marc Abramowitz, Ralph Schmitt, Ronny Pfannschmidt,
 Donald Stufft, James Lan, Rob Dennis, Jason R. Coombs, Mathieu Agopian,
@@ -35,58 +35,58 @@ Virgil Dupras, Bruno Oliveira, Alex Gayn
 
 have fun,
 holger krekel
 
 
 2.5.0
 -----------------------------------
 
-- dropped python2.5 from automated release testing of pytest itself 
-  which means it's probably going to break soon (but still works 
+- dropped python2.5 from automated release testing of pytest itself
+  which means it's probably going to break soon (but still works
   with this release we believe).
 
 - simplified and fixed implementation for calling finalizers when
-  parametrized fixtures or function arguments are involved.  finalization 
+  parametrized fixtures or function arguments are involved.  finalization
   is now performed lazily at setup time instead of in the "teardown phase".
-  While this might sound odd at first, it helps to ensure that we are 
+  While this might sound odd at first, it helps to ensure that we are
   correctly handling setup/teardown even in complex code.  User-level code
   should not be affected unless it's implementing the pytest_runtest_teardown
   hook and expecting certain fixture instances are torn down within (very
   unlikely and would have been unreliable anyway).
 
-- PR90: add --color=yes|no|auto option to force terminal coloring 
+- PR90: add --color=yes|no|auto option to force terminal coloring
   mode ("auto" is default).  Thanks Marc Abramowitz.
 
 - fix issue319 - correctly show unicode in assertion errors.  Many
   thanks to Floris Bruynooghe for the complete PR.  Also means
   we depend on py>=1.4.19 now.
 
-- fix issue396 - correctly sort and finalize class-scoped parametrized 
-  tests independently from number of methods on the class.  
+- fix issue396 - correctly sort and finalize class-scoped parametrized
+  tests independently from number of methods on the class.
 
 - refix issue323 in a better way -- parametrization should now never
   cause Runtime Recursion errors because the underlying algorithm
   for re-ordering tests per-scope/per-fixture is not recursive
   anymore (it was tail-call recursive before which could lead
   to problems for more than >966 non-function scoped parameters).
 
 - fix issue290 - there is preliminary support now for parametrizing
-  with repeated same values (sometimes useful to test if calling 
+  with repeated same values (sometimes useful to test if calling
   a second time works as with the first time).
 
 - close issue240 - document precisely how pytest module importing
-  works, discuss the two common test directory layouts, and how it 
+  works, discuss the two common test directory layouts, and how it
   interacts with PEP420-namespace packages.
 
 - fix issue246 fix finalizer order to be LIFO on independent fixtures
-  depending on a parametrized higher-than-function scoped fixture. 
+  depending on a parametrized higher-than-function scoped fixture.
   (was quite some effort so please bear with the complexity of this sentence :)
   Thanks Ralph Schmitt for the precise failure example.
- 
+
 - fix issue244 by implementing special index for parameters to only use
   indices for paramentrized test ids
 
 - fix issue287 by running all finalizers but saving the exception
   from the first failing finalizer and re-raising it so teardown will
   still have failed.  We reraise the first failing exception because
   it might be the cause for other finalizers to fail.
 
@@ -94,27 +94,27 @@ 2.5.0
   are used with test methods.  This fixues issue346 and should
   help with random "xdist" collection failures.  Thanks to
   Ronny Pfannschmidt and Donald Stufft for helping to isolate it.
 
 - fix issue357 - special case "-k" expressions to allow for
   filtering with simple strings that are not valid python expressions.
   Examples: "-k 1.3" matches all tests parametrized with 1.3.
   "-k None" filters all tests that have "None" in their name
-  and conversely "-k 'not None'". 
+  and conversely "-k 'not None'".
   Previously these examples would raise syntax errors.
-  
+
 - fix issue384 by removing the trial support code
   since the unittest compat enhancements allow
   trial to handle it on its own
 
 - don't hide an ImportError when importing a plugin produces one.
   fixes issue375.
 
-- fix issue275 - allow usefixtures and autouse fixtures 
+- fix issue275 - allow usefixtures and autouse fixtures
   for running doctest text files.
 
 - fix issue380 by making --resultlog only rely on longrepr instead
   of the "reprcrash" attribute which only exists sometimes.
 
 - address issue122: allow @pytest.fixture(params=iterator) by exploding
   into a list early on.
 
@@ -130,46 +130,45 @@ 2.5.0
 
 - In assertion rewriting mode on Python 2, fix the detection of coding
   cookies. See issue #330.
 
 - make "--runxfail" turn imperative pytest.xfail calls into no ops
   (it already did neutralize pytest.mark.xfail markers)
 
 - refine pytest / pkg_resources interactions: The AssertionRewritingHook
-  PEP302 compliant loader now registers itself with setuptools/pkg_resources 
+  PEP302 compliant loader now registers itself with setuptools/pkg_resources
   properly so that the pkg_resources.resource_stream method works properly.
   Fixes issue366.  Thanks for the investigations and full PR to Jason R. Coombs.
 
 - pytestconfig fixture is now session-scoped as it is the same object during the
-  whole test run.  Fixes issue370. 
+  whole test run.  Fixes issue370.
 
 - avoid one surprising case of marker malfunction/confusion::
-  
+
       @pytest.mark.some(lambda arg: ...)
       def test_function():
 
-  would not work correctly because pytest assumes @pytest.mark.some 
-  gets a function to be decorated already.  We now at least detect if this 
+  would not work correctly because pytest assumes @pytest.mark.some
+  gets a function to be decorated already.  We now at least detect if this
   arg is a lambda and thus the example will work.  Thanks Alex Gaynor
   for bringing it up.
 
 - xfail a test on pypy that checks wrong encoding/ascii (pypy does
   not error out). fixes issue385.
 
 - internally make varnames() deal with classes's __init__,
   although it's not needed by pytest itself atm.  Also
   fix caching.  Fixes issue376.
 
-- fix issue221 - handle importing of namespace-package with no 
+- fix issue221 - handle importing of namespace-package with no
   __init__.py properly.
 
 - refactor internal FixtureRequest handling to avoid monkeypatching.
-  One of the positive user-facing effects is that the "request" object 
+  One of the positive user-facing effects is that the "request" object
   can now be used in closures.
 
 - fixed version comparison in pytest.importskip(modname, minverstring)
 
 - fix issue377 by clarifying in the nose-compat docs that pytest
   does not duplicate the unittest-API into the "plain" namespace.
 
 - fix verbose reporting for @mock'd test functions
-
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.5.1.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.5.1.rst
@@ -1,27 +1,27 @@
 pytest-2.5.1: fixes and new home page styling
 ===========================================================================
 
-pytest is a mature Python testing tool with more than a 1000 tests 
-against itself, passing on many different interpreters and platforms.  
+pytest is a mature Python testing tool with more than a 1000 tests
+against itself, passing on many different interpreters and platforms.
 
 The 2.5.1 release maintains the "zero-reported-bugs" promise by fixing
 the three bugs reported since the last release a few days ago.  It also
 features a new home page styling implemented by Tobias Bieniek, based on
 the flask theme from Armin Ronacher:
 
     http://pytest.org
 
-If you have anything more to improve styling and docs, 
+If you have anything more to improve styling and docs,
 we'd be very happy to merge further pull requests.
 
 On the coding side, the release also contains a little enhancement to
 fixture decorators allowing to directly influence generation of test
-ids, thanks to Floris Bruynooghe.  Other thanks for helping with 
+ids, thanks to Floris Bruynooghe.  Other thanks for helping with
 this release go to Anatoly Bubenkoff and Ronny Pfannschmidt.
 
 As usual, you can upgrade from pypi via::
 
     pip install -U pytest
 
 have fun and a nice remaining "bug-free" time of the year :)
 holger krekel
@@ -32,16 +32,15 @@ 2.5.1
 - merge new documentation styling PR from Tobias Bieniek.
 
 - fix issue403: allow parametrize of multiple same-name functions within
   a collection node.  Thanks Andreas Kloeckner and Alex Gaynor for reporting
   and analysis.
 
 - Allow parameterized fixtures to specify the ID of the parameters by
   adding an ids argument to pytest.fixture() and pytest.yield_fixture().
-  Thanks Floris Bruynooghe. 
+  Thanks Floris Bruynooghe.
 
 - fix issue404 by always using the binary xml escape in the junitxml
   plugin.  Thanks Ronny Pfannschmidt.
 
 - fix issue407: fix addoption docstring to point to argparse instead of
   optparse. Thanks Daniel D. Wright.
-
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.5.2.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.5.2.rst
@@ -1,64 +1,63 @@
-pytest-2.5.2: fixes 
+pytest-2.5.2: fixes
 ===========================================================================
 
-pytest is a mature Python testing tool with more than a 1000 tests 
-against itself, passing on many different interpreters and platforms.  
+pytest is a mature Python testing tool with more than a 1000 tests
+against itself, passing on many different interpreters and platforms.
 
 The 2.5.2 release fixes a few bugs with two maybe-bugs remaining and
 actively being worked on (and waiting for the bug reporter's input).
 We also have a new contribution guide thanks to Piotr Banaszkiewicz
 and others.
 
 See docs at:
 
     http://pytest.org
 
 As usual, you can upgrade from pypi via::
 
     pip install -U pytest
 
 Thanks to the following people who contributed to this release:
 
-    Anatoly Bubenkov 
+    Anatoly Bubenkov
     Ronny Pfannschmidt
     Floris Bruynooghe
-    Bruno Oliveira 
-    Andreas Pelme 
+    Bruno Oliveira
+    Andreas Pelme
     Jurko Gospodnetić
-    Piotr Banaszkiewicz 
-    Simon Liedtke 
-    lakka 
-    Lukasz Balcerzak 
-    Philippe Muller 
-    Daniel Hahler 
+    Piotr Banaszkiewicz
+    Simon Liedtke
+    lakka
+    Lukasz Balcerzak
+    Philippe Muller
+    Daniel Hahler
 
 have fun,
 holger krekel
 
 2.5.2
 -----------------------------------
 
 - fix issue409 -- better interoperate with cx_freeze by not
-  trying to import from collections.abc which causes problems 
+  trying to import from collections.abc which causes problems
   for py27/cx_freeze.  Thanks Wolfgang L. for reporting and tracking it down.
 
 - fixed docs and code to use "pytest" instead of "py.test" almost everywhere.
-  Thanks Jurko Gospodnetic for the complete PR.  
+  Thanks Jurko Gospodnetic for the complete PR.
 
 - fix issue425: mention at end of "py.test -h" that --markers
   and --fixtures work according to specified test path (or current dir)
 
 - fix issue413: exceptions with unicode attributes are now printed
   correctly also on python2 and with pytest-xdist runs. (the fix
   requires py-1.4.20)
 
 - copy, cleanup and integrate py.io capture
   from pylib 1.4.20.dev2 (rev 13d9af95547e)
-  
+
 - address issue416: clarify docs as to conftest.py loading semantics
 
 - fix issue429: comparing byte strings with non-ascii chars in assert
   expressions now work better.  Thanks Floris Bruynooghe.
 
 - make capfd/capsys.capture private, its unused and shouldn't be exposed
-
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.6.1.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.6.1.rst
@@ -47,13 +47,12 @@ Changes 2.6.1
 
 - fix integration of pytest with unittest.mock.patch decorator when
   it uses the "new" argument.  Thanks Nicolas Delaby for test and PR.
 
 - fix issue with detecting conftest files if the arguments contain
   "::" node id specifications (copy pasted from "-v" output)
 
 - fix issue544 by only removing "@NUM" at the end of "::" separated parts
-  and if the part has an ".py" extension
+  and if the part has a ".py" extension
 
 - don't use py.std import helper, rather import things directly.
   Thanks Bruno Oliveira.
-
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.6.2.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.6.2.rst
@@ -44,9 +44,8 @@ 2.6.2
 
 - Fix example in monkeypatch documentation, thanks t-8ch.
 
 - fix issue572: correct tmpdir doc example for python3.
 
 - Do not mark as universal wheel because Python 2.6 is different from
   other builds due to the extra argparse dependency.  Fixes issue566.
   Thanks sontek.
-
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.6.3.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.6.3.rst
@@ -44,9 +44,8 @@ Changes 2.6.3
   CWD outside of a test package pytest would get fixture discovery wrong.
   Thanks to Wolfgang Schnerring for figuring out a reproducible example.
 
 - Introduce pytest_enter_pdb hook (needed e.g. by pytest_timeout to cancel the
   timeout when interactively entering pdb).  Thanks Wolfgang Schnerring.
 
 - check xfail/skip also with non-python function test items. Thanks
   Floris Bruynooghe.
-
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.7.0.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.7.0.rst
@@ -93,9 +93,8 @@ 2.7.0 (compared to 2.6.4)
 
 - allow to override parametrized fixtures with non-parametrized ones and vice versa (bubenkoff).
 
 - fix issue463: raise specific error for 'parameterize' misspelling (pfctdayelise).
 
 - On failure, the ``sys.last_value``, ``sys.last_type`` and
   ``sys.last_traceback`` are set, so that a user can inspect the error
   via postmortem debugging (almarklein).
-
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.7.2.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.7.2.rst
@@ -50,9 +50,8 @@ 2.7.2 (compared to 2.7.1)
 - fix issue748: unittest.SkipTest reports to internal pytest unittest plugin.
   Thanks Thomas De Schampheleire for reporting and Bruno Oliveira for the PR.
 
 - fix issue718: failed to create representation of sets containing unsortable
   elements in python 2. Thanks Edison Gustavo Muenz
 
 - fix issue756, fix issue752 (and similar issues): depend on py-1.4.29
   which has a refined algorithm for traceback generation.
-
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.8.3.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.8.3.rst
@@ -48,12 +48,11 @@ 2.8.3 (compared to 2.8.2)
   belongs to a file which is no longer available.
   Thanks Bruno Oliveira for the PR.
 
 - enhancement made to highlight in red the name of the failing tests so
   they stand out in the output.
   Thanks Gabriel Reis for the PR.
 
 - add more talks to the documentation
-- extend documentation on the --ignore cli option 
-- use pytest-runner for setuptools integration 
+- extend documentation on the --ignore cli option
+- use pytest-runner for setuptools integration
 - minor fixes for interaction with OS X El Capitan system integrity protection (thanks Florian)
-
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.8.7.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.8.7.rst
@@ -23,9 +23,9 @@ Thanks to all who contributed to this re
 
 Happy testing,
 The py.test Development Team
 
 
 2.8.7 (compared to 2.8.6)
 -------------------------
 
-- fix #1338: use predictable object resolution for monkeypatch
\ No newline at end of file
+- fix #1338: use predictable object resolution for monkeypatch
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.9.0.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.9.0.rst
@@ -9,35 +9,35 @@ See below for the changes and see docs a
     http://pytest.org
 
 As usual, you can upgrade from pypi via::
 
     pip install -U pytest
 
 Thanks to all who contributed to this release, among them:
 
-    Anatoly Bubenkov                                                                                                                                                                                                         
-    Bruno Oliveira                                                                                                                                                                                                           
-    Buck Golemon                                                                                                                                                                                                             
-    David Vierra                                                                                                                                                                                                             
-    Florian Bruhin                                                                                                                                                                                                           
-    Galaczi Endre                                                                                                                                                                                                            
-    Georgy Dyuldin                                                                                                                                                                                                           
-    Lukas Bednar                                                                                                                                                                                                             
-    Luke Murphy                                                                                                                                                                                                              
-    Marcin Biernat                                                                                                                                                                                                           
-    Matt Williams                                                                                                                                                                                                            
-    Michael Aquilina                                                                                                                                                                                                         
-    Raphael Pierzina                                                                                                                                                                                                         
-    Ronny Pfannschmidt                                                                                                                                                                                                       
-    Ryan Wooden                                                                                                                                                                                                              
-    Tiemo Kieft                                                                                                                                                                                                              
-    TomV                                                                                                                                                                                                                     
-    holger krekel                                                                                                                                                                                                            
-    jab   
+    Anatoly Bubenkov
+    Bruno Oliveira
+    Buck Golemon
+    David Vierra
+    Florian Bruhin
+    Galaczi Endre
+    Georgy Dyuldin
+    Lukas Bednar
+    Luke Murphy
+    Marcin Biernat
+    Matt Williams
+    Michael Aquilina
+    Raphael Pierzina
+    Ronny Pfannschmidt
+    Ryan Wooden
+    Tiemo Kieft
+    TomV
+    holger krekel
+    jab
 
 
 Happy testing,
 The py.test Development Team
 
 
 2.9.0 (compared to 2.8.7)
 -------------------------
@@ -71,28 +71,28 @@ 2.9.0 (compared to 2.8.7)
 
 * catch IndexError exceptions when getting exception source location. This fixes
   pytest internal error for dynamically generated code (fixtures and tests)
   where source lines are fake by intention
 
 **Changes**
 
 * **Important**: `py.code <https://pylib.readthedocs.io/en/latest/code.html>`_ has been
-  merged into the ``pytest`` repository as ``pytest._code``. This decision 
-  was made because ``py.code`` had very few uses outside ``pytest`` and the 
-  fact that it was in a different repository made it difficult to fix bugs on 
+  merged into the ``pytest`` repository as ``pytest._code``. This decision
+  was made because ``py.code`` had very few uses outside ``pytest`` and the
+  fact that it was in a different repository made it difficult to fix bugs on
   its code in a timely manner. The team hopes with this to be able to better
   refactor out and improve that code.
   This change shouldn't affect users, but it is useful to let users aware
   if they encounter any strange behavior.
-  
-  Keep in mind that the code for ``pytest._code`` is **private** and 
+
+  Keep in mind that the code for ``pytest._code`` is **private** and
   **experimental**, so you definitely should not import it explicitly!
 
-  Please note that the original ``py.code`` is still available in 
+  Please note that the original ``py.code`` is still available in
   `pylib <https://pylib.readthedocs.io>`_.
 
 * ``pytest_enter_pdb`` now optionally receives the pytest config object.
   Thanks `@nicoddemus`_ for the PR.
 
 * Removed code and documentation for Python 2.5 or lower versions,
   including removal of the obsolete ``_pytest.assertion.oldinterpret`` module.
   Thanks `@nicoddemus`_ for the PR (`#1226`_).
@@ -124,18 +124,18 @@ 2.9.0 (compared to 2.8.7)
   Thanks `@biern`_ for the PR.
 
 * Fix `traceback style docs`_ to describe all of the available options
   (auto/long/short/line/native/no), with `auto` being the default since v2.6.
   Thanks `@hackebrot`_ for the PR.
 
 * Fix (`#1422`_): junit record_xml_property doesn't allow multiple records
   with same name.
-  
-  
+
+
 .. _`traceback style docs`: https://pytest.org/latest/usage.html#modifying-python-traceback-printing
 
 .. _#1422: https://github.com/pytest-dev/pytest/issues/1422
 .. _#1379: https://github.com/pytest-dev/pytest/issues/1379
 .. _#1366: https://github.com/pytest-dev/pytest/issues/1366
 .. _#1040: https://github.com/pytest-dev/pytest/pull/1040
 .. _#680: https://github.com/pytest-dev/pytest/issues/680
 .. _#1287: https://github.com/pytest-dev/pytest/pull/1287
@@ -151,9 +151,9 @@ 2.9.0 (compared to 2.8.7)
 .. _@jab: https://github.com/jab
 .. _@codewarrior0: https://github.com/codewarrior0
 .. _@jaraco: https://github.com/jaraco
 .. _@The-Compiler: https://github.com/The-Compiler
 .. _@Shinkenjoe: https://github.com/Shinkenjoe
 .. _@tomviner: https://github.com/tomviner
 .. _@RonnyPfannschmidt: https://github.com/RonnyPfannschmidt
 .. _@rabbbit: https://github.com/rabbbit
-.. _@hackebrot: https://github.com/hackebrot
\ No newline at end of file
+.. _@hackebrot: https://github.com/hackebrot
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.9.1.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-2.9.1.rst
@@ -9,27 +9,27 @@ See below for the changes and see docs a
     http://pytest.org
 
 As usual, you can upgrade from pypi via::
 
     pip install -U pytest
 
 Thanks to all who contributed to this release, among them:
 
-    Bruno Oliveira                                                                                                                                                                                                                            
-    Daniel Hahler                                                                                                                                                                                                                             
-    Dmitry Malinovsky                                                                                                                                                                                                                         
-    Florian Bruhin                                                                                                                                                                                                                            
-    Floris Bruynooghe                                                                                                                                                                                                                         
-    Matt Bachmann                                                                                                                                                                                                                             
-    Ronny Pfannschmidt                                                                                                                                                                                                                        
-    TomV                                                                                                                                                                                                                                      
-    Vladimir Bolshakov                                                                                                                                                                                                                        
-    Zearin                                                                                                                                                                                                                                     
-    palaviv   
+    Bruno Oliveira
+    Daniel Hahler
+    Dmitry Malinovsky
+    Florian Bruhin
+    Floris Bruynooghe
+    Matt Bachmann
+    Ronny Pfannschmidt
+    TomV
+    Vladimir Bolshakov
+    Zearin
+    palaviv
 
 
 Happy testing,
 The py.test Development Team
 
 
 2.9.1 (compared to 2.9.0)
 -------------------------
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.0.0.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.0.0.rst
@@ -3,20 +3,20 @@ pytest-3.0.0
 
 The pytest team is proud to announce the 3.0.0 release!
 
 pytest is a mature Python testing tool with more than a 1600 tests
 against itself, passing on many different interpreters and platforms.
 
 This release contains a lot of bugs fixes and improvements, and much of
 the work done on it was possible because of the 2016 Sprint[1], which
-was funded by an indiegogo campaign which raised over US$12,000 with 
-nearly 100 backers. 
+was funded by an indiegogo campaign which raised over US$12,000 with
+nearly 100 backers.
 
-There's a "What's new in pytest 3.0" [2] blog post highlighting the 
+There's a "What's new in pytest 3.0" [2] blog post highlighting the
 major features in this release.
 
 To see the complete changelog and documentation, please visit:
 
     http://docs.pytest.org
 
 As usual, you can upgrade from pypi via:
 
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.0.1.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.0.1.rst
@@ -2,17 +2,17 @@ pytest-3.0.1
 ============
 
 pytest 3.0.1 has just been released to PyPI.
 
 This release fixes some regressions reported in version 3.0.0, being a
 drop-in replacement. To upgrade:
 
   pip install --upgrade pytest
-  
+
 The changelog is available at http://doc.pytest.org/en/latest/changelog.html.
 
 Thanks to all who contributed to this release, among them:
 
       Adam Chainz
       Andrew Svetlov
       Bruno Oliveira
       Daniel Hahler
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.0.2.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.0.2.rst
@@ -2,17 +2,17 @@ pytest-3.0.2
 ============
 
 pytest 3.0.2 has just been released to PyPI.
 
 This release fixes some regressions and bugs reported in version 3.0.1, being a
 drop-in replacement. To upgrade::
 
   pip install --upgrade pytest
-  
+
 The changelog is available at http://doc.pytest.org/en/latest/changelog.html.
 
 Thanks to all who contributed to this release, among them:
 
 * Ahn Ki-Wook
 * Bruno Oliveira
 * Florian Bruhin
 * Jordan Guymon
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.0.3.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.0.3.rst
@@ -1,18 +1,18 @@
 pytest-3.0.3
 ============
 
 pytest 3.0.3 has just been released to PyPI.
 
-This release fixes some regressions and bugs reported in the last version, 
+This release fixes some regressions and bugs reported in the last version,
 being a drop-in replacement. To upgrade::
 
   pip install --upgrade pytest
-  
+
 The changelog is available at http://doc.pytest.org/en/latest/changelog.html.
 
 Thanks to all who contributed to this release, among them:
 
 * Bruno Oliveira
 * Florian Bruhin
 * Floris Bruynooghe
 * Huayi Zhang
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.0.4.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.0.4.rst
@@ -1,18 +1,18 @@
 pytest-3.0.4
 ============
 
 pytest 3.0.4 has just been released to PyPI.
 
-This release fixes some regressions and bugs reported in the last version, 
+This release fixes some regressions and bugs reported in the last version,
 being a drop-in replacement. To upgrade::
 
   pip install --upgrade pytest
-  
+
 The changelog is available at http://doc.pytest.org/en/latest/changelog.html.
 
 Thanks to all who contributed to this release, among them:
 
 * Bruno Oliveira
 * Dan Wandschneider
 * Florian Bruhin
 * Georgy Dyuldin
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.0.5.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.0.5.rst
@@ -1,17 +1,17 @@
 pytest-3.0.5
 ============
 
 pytest 3.0.5 has just been released to PyPI.
 
 This is a bug-fix release, being a drop-in replacement. To upgrade::
 
   pip install --upgrade pytest
-  
+
 The changelog is available at http://doc.pytest.org/en/latest/changelog.html.
 
 Thanks to all who contributed to this release, among them:
 
 * Ana Vojnovic
 * Bruno Oliveira
 * Daniel Hahler
 * Duncan Betts
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.0.6.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.0.6.rst
@@ -1,17 +1,17 @@
 pytest-3.0.6
 ============
 
 pytest 3.0.6 has just been released to PyPI.
 
 This is a bug-fix release, being a drop-in replacement. To upgrade::
 
   pip install --upgrade pytest
-  
+
 The full changelog is available at http://doc.pytest.org/en/latest/changelog.html.
 
 
 Thanks to all who contributed to this release, among them:
 
 * Andreas Pelme
 * Bruno Oliveira
 * Dmitry Malinovsky
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.0.7.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.0.7.rst
@@ -1,17 +1,17 @@
 pytest-3.0.7
 ============
 
 pytest 3.0.7 has just been released to PyPI.
 
 This is a bug-fix release, being a drop-in replacement. To upgrade::
 
   pip install --upgrade pytest
-  
+
 The full changelog is available at http://doc.pytest.org/en/latest/changelog.html.
 
 Thanks to all who contributed to this release, among them:
 
 * Anthony Sottile
 * Barney Gale
 * Bruno Oliveira
 * Florian Bruhin
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.1.1.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.1.1.rst
@@ -1,17 +1,17 @@
 pytest-3.1.1
 =======================================
 
 pytest 3.1.1 has just been released to PyPI.
 
 This is a bug-fix release, being a drop-in replacement. To upgrade::
 
   pip install --upgrade pytest
-  
+
 The full changelog is available at http://doc.pytest.org/en/latest/changelog.html.
 
 Thanks to all who contributed to this release, among them:
 
 * Bruno Oliveira
 * Florian Bruhin
 * Floris Bruynooghe
 * Jason R. Coombs
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.1.2.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.1.2.rst
@@ -1,17 +1,17 @@
 pytest-3.1.2
 =======================================
 
 pytest 3.1.2 has just been released to PyPI.
 
 This is a bug-fix release, being a drop-in replacement. To upgrade::
 
   pip install --upgrade pytest
-  
+
 The full changelog is available at http://doc.pytest.org/en/latest/changelog.html.
 
 Thanks to all who contributed to this release, among them:
 
 * Andreas Pelme
 * ApaDoctor
 * Bruno Oliveira
 * Florian Bruhin
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.1.3.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.1.3.rst
@@ -1,17 +1,17 @@
 pytest-3.1.3
 =======================================
 
 pytest 3.1.3 has just been released to PyPI.
 
 This is a bug-fix release, being a drop-in replacement. To upgrade::
 
   pip install --upgrade pytest
-  
+
 The full changelog is available at http://doc.pytest.org/en/latest/changelog.html.
 
 Thanks to all who contributed to this release, among them:
 
 * Antoine Legrand
 * Bruno Oliveira
 * Max Moroz
 * Raphael Pierzina
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.2.1.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.2.1.rst
@@ -1,17 +1,17 @@
 pytest-3.2.1
 =======================================
 
 pytest 3.2.1 has just been released to PyPI.
 
 This is a bug-fix release, being a drop-in replacement. To upgrade::
 
   pip install --upgrade pytest
-  
+
 The full changelog is available at http://doc.pytest.org/en/latest/changelog.html.
 
 Thanks to all who contributed to this release, among them:
 
 * Alex Gaynor
 * Bruno Oliveira
 * Florian Bruhin
 * Ronny Pfannschmidt
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.2.2.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.2.2.rst
@@ -1,17 +1,17 @@
 pytest-3.2.2
 =======================================
 
 pytest 3.2.2 has just been released to PyPI.
 
 This is a bug-fix release, being a drop-in replacement. To upgrade::
 
   pip install --upgrade pytest
-  
+
 The full changelog is available at http://doc.pytest.org/en/latest/changelog.html.
 
 Thanks to all who contributed to this release, among them:
 
 * Andreas Pelme
 * Antonio Hidalgo
 * Bruno Oliveira
 * Felipe Dau
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.2.3.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.2.3.rst
@@ -1,17 +1,17 @@
 pytest-3.2.3
 =======================================
 
 pytest 3.2.3 has just been released to PyPI.
 
 This is a bug-fix release, being a drop-in replacement. To upgrade::
 
   pip install --upgrade pytest
-  
+
 The full changelog is available at http://doc.pytest.org/en/latest/changelog.html.
 
 Thanks to all who contributed to this release, among them:
 
 * Bruno Oliveira
 * Evan
 * Joe Hamman
 * Oliver Bestwalter
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.2.4.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.2.4.rst
@@ -1,17 +1,17 @@
 pytest-3.2.4
 =======================================
 
 pytest 3.2.4 has just been released to PyPI.
 
 This is a bug-fix release, being a drop-in replacement. To upgrade::
 
   pip install --upgrade pytest
-  
+
 The full changelog is available at http://doc.pytest.org/en/latest/changelog.html.
 
 Thanks to all who contributed to this release, among them:
 
 * Bruno Oliveira
 * Christian Boelsen
 * Christoph Buchner
 * Daw-Ran Liou
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.2.5.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.2.5.rst
@@ -1,17 +1,17 @@
 pytest-3.2.5
 =======================================
 
 pytest 3.2.5 has just been released to PyPI.
 
 This is a bug-fix release, being a drop-in replacement. To upgrade::
 
   pip install --upgrade pytest
-  
+
 The full changelog is available at http://doc.pytest.org/en/latest/changelog.html.
 
 Thanks to all who contributed to this release, among them:
 
 * Bruno Oliveira
 
 
 Happy testing,
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.3.1.rst
@@ -0,0 +1,25 @@
+pytest-3.3.1
+=======================================
+
+pytest 3.3.1 has just been released to PyPI.
+
+This is a bug-fix release, being a drop-in replacement. To upgrade::
+
+  pip install --upgrade pytest
+
+The full changelog is available at http://doc.pytest.org/en/latest/changelog.html.
+
+Thanks to all who contributed to this release, among them:
+
+* Bruno Oliveira
+* Daniel Hahler
+* Eugene Prikazchikov
+* Florian Bruhin
+* Roland Puntaier
+* Ronny Pfannschmidt
+* Sebastian Rahlf
+* Tom Viner
+
+
+Happy testing,
+The pytest Development Team
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.3.2.rst
@@ -0,0 +1,28 @@
+pytest-3.3.2
+=======================================
+
+pytest 3.3.2 has just been released to PyPI.
+
+This is a bug-fix release, being a drop-in replacement. To upgrade::
+
+  pip install --upgrade pytest
+
+The full changelog is available at http://doc.pytest.org/en/latest/changelog.html.
+
+Thanks to all who contributed to this release, among them:
+
+* Anthony Sottile
+* Antony Lee
+* Austin
+* Bruno Oliveira
+* Florian Bruhin
+* Floris Bruynooghe
+* Henk-Jaap Wagenaar
+* Jurko Gospodnetić
+* Ronny Pfannschmidt
+* Srinivas Reddy Thatiparthy
+* Thomas Hisch
+
+
+Happy testing,
+The pytest Development Team
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.4.0.rst
@@ -0,0 +1,52 @@
+pytest-3.4.0
+=======================================
+
+The pytest team is proud to announce the 3.4.0 release!
+
+pytest is a mature Python testing tool with more than a 1600 tests
+against itself, passing on many different interpreters and platforms.
+
+This release contains a number of bugs fixes and improvements, so users are encouraged
+to take a look at the CHANGELOG:
+
+    http://doc.pytest.org/en/latest/changelog.html
+
+For complete documentation, please visit:
+
+    http://docs.pytest.org
+
+As usual, you can upgrade from pypi via:
+
+    pip install -U pytest
+
+Thanks to all who contributed to this release, among them:
+
+* Aaron
+* Alan Velasco
+* Anders Hovmöller
+* Andrew Toolan
+* Anthony Sottile
+* Aron Coyle
+* Brian Maissy
+* Bruno Oliveira
+* Cyrus Maden
+* Florian Bruhin
+* Henk-Jaap Wagenaar
+* Ian Lesperance
+* Jon Dufresne
+* Jurko Gospodnetić
+* Kate
+* Kimberly
+* Per A. Brodtkorb
+* Pierre-Alexandre Fonta
+* Raphael Castaneda
+* Ronny Pfannschmidt
+* ST John
+* Segev Finer
+* Thomas Hisch
+* Tzu-ping Chung
+* feuillemorte
+
+
+Happy testing,
+The Pytest Development Team
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.4.1.rst
@@ -0,0 +1,27 @@
+pytest-3.4.1
+=======================================
+
+pytest 3.4.1 has just been released to PyPI.
+
+This is a bug-fix release, being a drop-in replacement. To upgrade::
+
+  pip install --upgrade pytest
+
+The full changelog is available at http://doc.pytest.org/en/latest/changelog.html.
+
+Thanks to all who contributed to this release, among them:
+
+* Aaron
+* Alan Velasco
+* Andy Freeland
+* Brian Maissy
+* Bruno Oliveira
+* Florian Bruhin
+* Jason R. Coombs
+* Marcin Bachry
+* Pedro Algarvio
+* Ronny Pfannschmidt
+
+
+Happy testing,
+The pytest Development Team
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.4.2.rst
@@ -0,0 +1,28 @@
+pytest-3.4.2
+=======================================
+
+pytest 3.4.2 has just been released to PyPI.
+
+This is a bug-fix release, being a drop-in replacement. To upgrade::
+
+  pip install --upgrade pytest
+
+The full changelog is available at http://doc.pytest.org/en/latest/changelog.html.
+
+Thanks to all who contributed to this release, among them:
+
+* Allan Feldman
+* Bruno Oliveira
+* Florian Bruhin
+* Jason R. Coombs
+* Kyle Altendorf
+* Maik Figura
+* Ronny Pfannschmidt
+* codetriage-readme-bot
+* feuillemorte
+* joshm91
+* mike
+
+
+Happy testing,
+The pytest Development Team
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.5.0.rst
@@ -0,0 +1,51 @@
+pytest-3.5.0
+=======================================
+
+The pytest team is proud to announce the 3.5.0 release!
+
+pytest is a mature Python testing tool with more than a 1600 tests
+against itself, passing on many different interpreters and platforms.
+
+This release contains a number of bugs fixes and improvements, so users are encouraged
+to take a look at the CHANGELOG:
+
+    http://doc.pytest.org/en/latest/changelog.html
+
+For complete documentation, please visit:
+
+    http://docs.pytest.org
+
+As usual, you can upgrade from pypi via:
+
+    pip install -U pytest
+
+Thanks to all who contributed to this release, among them:
+
+* Allan Feldman
+* Brian Maissy
+* Bruno Oliveira
+* Carlos Jenkins
+* Daniel Hahler
+* Florian Bruhin
+* Jason R. Coombs
+* Jeffrey Rackauckas
+* Jordan Speicher
+* Julien Palard
+* Kale Kundert
+* Kostis Anagnostopoulos
+* Kyle Altendorf
+* Maik Figura
+* Pedro Algarvio
+* Ronny Pfannschmidt
+* Tadeu Manoel
+* Tareq Alayan
+* Thomas Hisch
+* William Lee
+* codetriage-readme-bot
+* feuillemorte
+* joshm91
+* mike
+
+
+Happy testing,
+The Pytest Development Team
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.5.1.rst
@@ -0,0 +1,30 @@
+pytest-3.5.1
+=======================================
+
+pytest 3.5.1 has just been released to PyPI.
+
+This is a bug-fix release, being a drop-in replacement. To upgrade::
+
+  pip install --upgrade pytest
+
+The full changelog is available at http://doc.pytest.org/en/latest/changelog.html.
+
+Thanks to all who contributed to this release, among them:
+
+* Brian Maissy
+* Bruno Oliveira
+* Darren Burns
+* David Chudzicki
+* Floris Bruynooghe
+* Holger Kohr
+* Irmen de Jong
+* Jeffrey Rackauckas
+* Rachel Kogan
+* Ronny Pfannschmidt
+* Stefan Scherfke
+* Tim Strazny
+* Семён Марьясин
+
+
+Happy testing,
+The pytest Development Team
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.6.0.rst
@@ -0,0 +1,41 @@
+pytest-3.6.0
+=======================================
+
+The pytest team is proud to announce the 3.6.0 release!
+
+pytest is a mature Python testing tool with more than a 1600 tests
+against itself, passing on many different interpreters and platforms.
+
+This release contains a number of bugs fixes and improvements, so users are encouraged
+to take a look at the CHANGELOG:
+
+    http://doc.pytest.org/en/latest/changelog.html
+
+For complete documentation, please visit:
+
+    http://docs.pytest.org
+
+As usual, you can upgrade from pypi via:
+
+    pip install -U pytest
+
+Thanks to all who contributed to this release, among them:
+
+* Anthony Shaw
+* ApaDoctor
+* Brian Maissy
+* Bruno Oliveira
+* Jon Dufresne
+* Katerina Koukiou
+* Miro Hrončok
+* Rachel Kogan
+* Ronny Pfannschmidt
+* Tim Hughes
+* Tyler Goodlet
+* Ville Skyttä
+* aviral1701
+* feuillemorte
+
+
+Happy testing,
+The Pytest Development Team
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.6.1.rst
@@ -0,0 +1,24 @@
+pytest-3.6.1
+=======================================
+
+pytest 3.6.1 has just been released to PyPI.
+
+This is a bug-fix release, being a drop-in replacement. To upgrade::
+
+  pip install --upgrade pytest
+
+The full changelog is available at http://doc.pytest.org/en/latest/changelog.html.
+
+Thanks to all who contributed to this release, among them:
+
+* Anthony Sottile
+* Bruno Oliveira
+* Jeffrey Rackauckas
+* Miro Hrončok
+* Niklas Meinzer
+* Oliver Bestwalter
+* Ronny Pfannschmidt
+
+
+Happy testing,
+The pytest Development Team
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/announce/release-3.6.2.rst
@@ -0,0 +1,29 @@
+pytest-3.6.2
+=======================================
+
+pytest 3.6.2 has just been released to PyPI.
+
+This is a bug-fix release, being a drop-in replacement. To upgrade::
+
+  pip install --upgrade pytest
+
+The full changelog is available at http://doc.pytest.org/en/latest/changelog.html.
+
+Thanks to all who contributed to this release, among them:
+
+* Alan Velasco
+* Alex Barbato
+* Anthony Sottile
+* Bartosz Cierocki
+* Bruno Oliveira
+* Daniel Hahler
+* Guoqiang Zhang
+* Hynek Schlawack
+* John T. Wodder II
+* Michael Käufl
+* Ronny Pfannschmidt
+* Samuel Dion-Girardeau
+
+
+Happy testing,
+The pytest Development Team
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/assert.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/assert.rst
@@ -24,27 +24,27 @@ following::
 to assert that your function returns a certain value. If this assertion fails
 you will see the return value of the function call::
 
     $ pytest test_assert1.py
     =========================== test session starts ============================
     platform linux -- Python 3.x.y, pytest-3.x.y, py-1.x.y, pluggy-0.x.y
     rootdir: $REGENDOC_TMPDIR, inifile:
     collected 1 item
-    
+
     test_assert1.py F                                                    [100%]
-    
+
     ================================= FAILURES =================================
     ______________________________ test_function _______________________________
-    
+
         def test_function():
     >       assert f() == 4
     E       assert 3 == 4
     E        +  where 3 = f()
-    
+
     test_assert1.py:5: AssertionError
     ========================= 1 failed in 0.12 seconds =========================
 
 ``pytest`` has support for showing the values of the most common subexpressions
 including calls, attributes, comparisons, and binary and unary
 operators. (See :ref:`tbreportdemo`).  This allows you to use the
 idiomatic python constructs without boilerplate code while not losing
 introspection information.
@@ -86,17 +86,17 @@ the actual exception raised.  The main a
 ``.type``, ``.value`` and ``.traceback``.
 
 .. versionchanged:: 3.0
 
 In the context manager form you may use the keyword argument
 ``message`` to specify a custom failure message::
 
      >>> with raises(ZeroDivisionError, message="Expecting ZeroDivisionError"):
-     ...    pass
+     ...     pass
      ... Failed: Expecting ZeroDivisionError
 
 If you want to write test code that works on Python 2.4 as well,
 you may also use two other ways to test for an expected exception::
 
     pytest.raises(ExpectedException, func, *args, **kwargs)
     pytest.raises(ExpectedException, "func(*args, **kwargs)")
 
@@ -167,33 +167,33 @@ when it encounters comparisons.  For exa
 
 if you run this module::
 
     $ pytest test_assert2.py
     =========================== test session starts ============================
     platform linux -- Python 3.x.y, pytest-3.x.y, py-1.x.y, pluggy-0.x.y
     rootdir: $REGENDOC_TMPDIR, inifile:
     collected 1 item
-    
+
     test_assert2.py F                                                    [100%]
-    
+
     ================================= FAILURES =================================
     ___________________________ test_set_comparison ____________________________
-    
+
         def test_set_comparison():
             set1 = set("1308")
             set2 = set("8035")
     >       assert set1 == set2
     E       AssertionError: assert {'0', '1', '3', '8'} == {'0', '3', '5', '8'}
     E         Extra items in the left set:
     E         '1'
     E         Extra items in the right set:
     E         '5'
     E         Use -v to get the full diff
-    
+
     test_assert2.py:5: AssertionError
     ========================= 1 failed in 0.12 seconds =========================
 
 Special comparisons are done for a number of cases:
 
 * comparing long strings: a context diff is shown
 * comparing long sequences: first failing indices
 * comparing dicts: different entries
@@ -204,17 +204,17 @@ Defining your own assertion comparison
 ----------------------------------------------
 
 It is possible to add your own detailed explanations by implementing
 the ``pytest_assertrepr_compare`` hook.
 
 .. autofunction:: _pytest.hookspec.pytest_assertrepr_compare
    :noindex:
 
-As an example consider adding the following hook in a :ref:`conftest.py <conftest.py>` 
+As an example consider adding the following hook in a :ref:`conftest.py <conftest.py>`
 file which provides an alternative explanation for ``Foo`` objects::
 
    # content of conftest.py
    from test_foocompare import Foo
    def pytest_assertrepr_compare(op, left, right):
        if isinstance(left, Foo) and isinstance(right, Foo) and op == "==":
            return ['Comparing Foo instances:',
                    '   vals: %s != %s' % (left.val, right.val)]
@@ -236,24 +236,24 @@ now, given this test module::
 
 you can run the test module and get the custom output defined in
 the conftest file::
 
    $ pytest -q test_foocompare.py
    F                                                                    [100%]
    ================================= FAILURES =================================
    _______________________________ test_compare _______________________________
-   
+
        def test_compare():
            f1 = Foo(1)
            f2 = Foo(2)
    >       assert f1 == f2
    E       assert Comparing Foo instances:
    E            vals: 1 != 2
-   
+
    test_foocompare.py:11: AssertionError
    1 failed in 0.12 seconds
 
 .. _assert-details:
 .. _`assert introspection`:
 
 Advanced assertion introspection
 ----------------------------------
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/backwards-compatibility.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/backwards-compatibility.rst
@@ -10,96 +10,11 @@ With the pytest 3.0 release we introduce
 To communicate changes we are already issuing deprecation warnings, but they are not displayed by default. In pytest 3.0 we changed the default setting so that pytest deprecation warnings are displayed if not explicitly silenced (with ``--disable-pytest-warnings``).
 
 We will only remove deprecated functionality in major releases (e.g. if we deprecate something in 3.0 we will remove it in 4.0), and keep it around for at least two minor releases (e.g. if we deprecate something in 3.9 and 4.0 is the next release, we will not remove it in 4.0 but in 5.0).
 
 
 Deprecation Roadmap
 -------------------
 
-This page lists deprecated features and when we plan to remove them. It is important to list the feature, the version where it got deprecated and the version we plan to remove it.
-
-Following our deprecation policy, we should aim to keep features for *at least* two minor versions after it was considered deprecated.
-
-
-Future Releases
-~~~~~~~~~~~~~~~
-
-3.4
-^^^
-
-**Old style classes**
-
-Issue: `#2147 <https://github.com/pytest-dev/pytest/issues/2147>`_.
-
-Deprecated in ``3.2``.
-
-4.0
-^^^
-
-**Yield tests**
-
-Deprecated in ``3.0``.
-
-**pytest-namespace hook**
-
-deprecated in ``3.2``.
-
-**Marks in parameter sets**
-
-Deprecated in ``3.2``.
-
-**--result-log**
-
-Deprecated in ``3.0``.
-
-See `#830 <https://github.com/pytest-dev/pytest/issues/830>`_ for more information. Suggested alternative: `pytest-tap <https://pypi.python.org/pypi/pytest-tap>`_.
-
-**metafunc.addcall**
-
-Issue: `#2876 <https://github.com/pytest-dev/pytest/issues/2876>`_.
-
-Deprecated in ``3.3``.
+We track deprecation and removal of features using milestones and the `deprecation <https://github.com/pytest-dev/pytest/issues?q=label%3A%22type%3A+deprecation%22>`_ and `removal <https://github.com/pytest-dev/pytest/labels/type%3A%20removal>`_ labels on GitHub.
 
-**pytest_plugins in non-toplevel conftests**
-
-There is a deep conceptual confusion as ``conftest.py`` files themselves are activated/deactivated based on path, but the plugins they depend on aren't.
-
-Issue: `#2639 <https://github.com/pytest-dev/pytest/issues/2639>`_.
-
-Not yet officially deprecated.
-
-**passing a single string to pytest.main()**
-
-Pass a list of strings to ``pytest.main()`` instead.
-
-Deprecated in ``3.1``.
-
-**[pytest] section in setup.cfg**
-
-Use ``[tool:pytest]`` instead for compatibility with other tools.
-
-Deprecated in ``3.0``.
-
-Past Releases
-~~~~~~~~~~~~~
-
-3.0
-^^^
-
-* The following deprecated commandline options were removed:
-
-  * ``--genscript``: no longer supported;
-  * ``--no-assert``: use ``--assert=plain`` instead;
-  * ``--nomagic``: use ``--assert=plain`` instead;
-  * ``--report``: use ``-r`` instead;
-
-* Removed all ``py.test-X*`` entry points. The versioned, suffixed entry points
-  were never documented and a leftover from a pre-virtualenv era. These entry
-  points also created broken entry points in wheels, so removing them also
-  removes a source of confusion for users.
-
-
-
-3.3
-^^^
-
-* Dropped support for EOL Python 2.6 and 3.3.
\ No newline at end of file
+Following our deprecation policy, after starting issuing deprecation warnings we keep features for *at least* two minor versions before considering removal.
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/bash-completion.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/bash-completion.rst
@@ -9,20 +9,17 @@ When using bash as your shell, ``pytest`
 For this ``argcomplete`` needs to be installed **and** enabled.
 
 Install argcomplete using::
 
         sudo pip install 'argcomplete>=0.5.7'
 
 For global activation of all argcomplete enabled python applications run::
 
-	sudo activate-global-python-argcomplete
+    sudo activate-global-python-argcomplete
 
 For permanent (but not global) ``pytest`` activation, use::
 
         register-python-argcomplete pytest >> ~/.bashrc
 
 For one-time activation of argcomplete for ``pytest`` only, use::
 
         eval "$(register-python-argcomplete pytest)"
-
-
-
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/builtin.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/builtin.rst
@@ -1,161 +1,122 @@
+:orphan:
 
 .. _`pytest helpers`:
 
 Pytest API and builtin fixtures
 ================================================
 
-This is a list of ``pytest.*`` API functions and fixtures.
+
+Most of the information of this page has been moved over to :ref:`reference`.
 
 For information on plugin hooks and objects, see :ref:`plugins`.
 
 For information on the ``pytest.mark`` mechanism, see :ref:`mark`.
 
-For the below objects, you can also interactively ask for help, e.g. by
-typing on the Python interactive prompt something like::
-
-    import pytest
-    help(pytest)
-
-.. currentmodule:: pytest
-
-Invoking pytest interactively
----------------------------------------------------
-
-.. autofunction:: main
-
-More examples at :ref:`pytest.main-usage`
-
-
-Helpers for assertions about Exceptions/Warnings
---------------------------------------------------------
-
-.. autofunction:: raises
-
-Examples at :ref:`assertraises`.
-
-.. autofunction:: deprecated_call
-
-Comparing floating point numbers
---------------------------------
-
-.. autofunction:: approx
-
-Raising a specific test outcome
---------------------------------------
-
-You can use the following functions in your test, fixture or setup
-functions to force a certain test outcome.  Note that most often
-you can rather use declarative marks, see :ref:`skipping`.
-
-.. autofunction:: _pytest.outcomes.fail
-.. autofunction:: _pytest.outcomes.skip
-.. autofunction:: _pytest.outcomes.importorskip
-.. autofunction:: _pytest.outcomes.xfail
-.. autofunction:: _pytest.outcomes.exit
-
-Fixtures and requests
------------------------------------------------------
-
-To mark a fixture function:
-
-.. autofunction:: _pytest.fixtures.fixture
-
-Tutorial at :ref:`fixtures`.
-
-The ``request`` object that can be used from fixture functions.
-
-.. autoclass:: _pytest.fixtures.FixtureRequest()
-    :members:
-
-
-.. _builtinfixtures:
-.. _builtinfuncargs:
-
-Builtin fixtures/function arguments
------------------------------------------
-
-You can ask for available builtin or project-custom
-:ref:`fixtures <fixtures>` by typing::
+For information about fixtures, see :ref:`fixtures`. To see a complete list of available fixtures (add ``-v`` to also see fixtures with leading ``_``), type ::
 
     $ pytest -q --fixtures
     cache
         Return a cache object that can persist state between testing sessions.
-        
+
         cache.get(key, default)
         cache.set(key, value)
-        
+
         Keys must be a ``/`` separated value, where the first part is usually the
         name of your plugin or application to avoid clashes with other cache users.
-        
+
         Values can be any object handled by the json stdlib module.
     capsys
-        Enable capturing of writes to sys.stdout/sys.stderr and make
+        Enable capturing of writes to ``sys.stdout`` and ``sys.stderr`` and make
         captured output available via ``capsys.readouterr()`` method calls
-        which return a ``(out, err)`` tuple.  ``out`` and ``err`` will be ``text``
+        which return a ``(out, err)`` namedtuple.  ``out`` and ``err`` will be ``text``
         objects.
     capsysbinary
-        Enable capturing of writes to sys.stdout/sys.stderr and make
+        Enable capturing of writes to ``sys.stdout`` and ``sys.stderr`` and make
         captured output available via ``capsys.readouterr()`` method calls
         which return a ``(out, err)`` tuple.  ``out`` and ``err`` will be ``bytes``
         objects.
     capfd
-        Enable capturing of writes to file descriptors 1 and 2 and make
+        Enable capturing of writes to file descriptors ``1`` and ``2`` and make
         captured output available via ``capfd.readouterr()`` method calls
         which return a ``(out, err)`` tuple.  ``out`` and ``err`` will be ``text``
         objects.
     capfdbinary
         Enable capturing of write to file descriptors 1 and 2 and make
         captured output available via ``capfdbinary.readouterr`` method calls
         which return a ``(out, err)`` tuple.  ``out`` and ``err`` will be
         ``bytes`` objects.
     doctest_namespace
-        Inject names into the doctest namespace.
+        Fixture that returns a :py:class:`dict` that will be injected into the namespace of doctests.
     pytestconfig
-        the pytest config object with access to command line opts.
-    record_xml_property
-        Add extra xml properties to the tag for the calling test.
+        Session-scoped fixture that returns the :class:`_pytest.config.Config` object.
+
+        Example::
+
+            def test_foo(pytestconfig):
+                if pytestconfig.getoption("verbose"):
+                    ...
+    record_property
+        Add an extra properties the calling test.
+        User properties become part of the test report and are available to the
+        configured reporters, like JUnit XML.
         The fixture is callable with ``(name, value)``, with value being automatically
         xml-encoded.
+
+        Example::
+
+            def test_function(record_property):
+                record_property("example_key", 1)
+    record_xml_property
+        (Deprecated) use record_property.
+    record_xml_attribute
+        Add extra xml attributes to the tag for the calling test.
+        The fixture is callable with ``(name, value)``, with value being
+        automatically xml-encoded
     caplog
         Access and control log capturing.
-        
+
         Captured logs are available through the following methods::
-        
-        * caplog.text()          -> string containing formatted log output
-        * caplog.records()       -> list of logging.LogRecord instances
-        * caplog.record_tuples() -> list of (logger_name, level, message) tuples
+
+        * caplog.text            -> string containing formatted log output
+        * caplog.records         -> list of logging.LogRecord instances
+        * caplog.record_tuples   -> list of (logger_name, level, message) tuples
+        * caplog.clear()         -> clear captured records and formatted log output string
     monkeypatch
         The returned ``monkeypatch`` fixture provides these
         helper methods to modify objects, dictionaries or os.environ::
-        
+
             monkeypatch.setattr(obj, name, value, raising=True)
             monkeypatch.delattr(obj, name, raising=True)
             monkeypatch.setitem(mapping, name, value)
             monkeypatch.delitem(obj, name, raising=True)
             monkeypatch.setenv(name, value, prepend=False)
             monkeypatch.delenv(name, value, raising=True)
             monkeypatch.syspath_prepend(path)
             monkeypatch.chdir(path)
-        
+
         All modifications will be undone after the requesting
         test function or fixture has finished. The ``raising``
         parameter determines if a KeyError or AttributeError
         will be raised if the set/deletion operation has no target.
     recwarn
-        Return a WarningsRecorder instance that provides these methods:
-        
-        * ``pop(category=None)``: return last warning matching the category.
-        * ``clear()``: clear list of warnings
-        
+        Return a :class:`WarningsRecorder` instance that records all warnings emitted by test functions.
+
         See http://docs.python.org/library/warnings.html for information
         on warning categories.
     tmpdir_factory
         Return a TempdirFactory instance for the test session.
     tmpdir
         Return a temporary directory path object
         which is unique to each test function invocation,
         created as a sub directory of the base temporary
         directory.  The returned object is a `py.path.local`_
         path object.
-    
+
+        .. _`py.path.local`: https://py.readthedocs.io/en/latest/path.html
+
     no tests ran in 0.12 seconds
+
+You can also interactively ask for help, e.g. by typing on the Python interactive prompt something like::
+
+    import pytest
+    help(pytest)
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/cache.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/cache.rst
@@ -15,17 +15,17 @@ last ``pytest`` invocation:
 
 * ``--lf``, ``--last-failed`` - to only re-run the failures.
 * ``--ff``, ``--failed-first`` - to run the failures first and then the rest of
   the tests.
 
 For cleanup (usually not needed), a ``--cache-clear`` option allows to remove
 all cross-session cache contents ahead of a test run.
 
-Other plugins may access the `config.cache`_ object to set/get 
+Other plugins may access the `config.cache`_ object to set/get
 **json encodable** values between ``pytest`` invocations.
 
 .. note::
 
     This plugin is enabled by default, but can be disabled if needed: see
     :ref:`cmdunregister` (the internal name for this plugin is
     ``cacheprovider``).
 
@@ -44,119 +44,132 @@ First, let's create 50 test invocation o
            pytest.fail("bad luck")
 
 If you run this for the first time you will see two failures::
 
     $ pytest -q
     .................F.......F........................                   [100%]
     ================================= FAILURES =================================
     _______________________________ test_num[17] _______________________________
-    
+
     i = 17
-    
+
         @pytest.mark.parametrize("i", range(50))
         def test_num(i):
             if i in (17, 25):
     >          pytest.fail("bad luck")
     E          Failed: bad luck
-    
+
     test_50.py:6: Failed
     _______________________________ test_num[25] _______________________________
-    
+
     i = 25
-    
+
         @pytest.mark.parametrize("i", range(50))
         def test_num(i):
             if i in (17, 25):
     >          pytest.fail("bad luck")
     E          Failed: bad luck
-    
+
     test_50.py:6: Failed
     2 failed, 48 passed in 0.12 seconds
 
 If you then run it with ``--lf``::
 
     $ pytest --lf
     =========================== test session starts ============================
     platform linux -- Python 3.x.y, pytest-3.x.y, py-1.x.y, pluggy-0.x.y
     rootdir: $REGENDOC_TMPDIR, inifile:
-    collected 50 items
+    collected 50 items / 48 deselected
     run-last-failure: rerun previous 2 failures
-    
+
     test_50.py FF                                                        [100%]
-    
+
     ================================= FAILURES =================================
     _______________________________ test_num[17] _______________________________
-    
+
     i = 17
-    
+
         @pytest.mark.parametrize("i", range(50))
         def test_num(i):
             if i in (17, 25):
     >          pytest.fail("bad luck")
     E          Failed: bad luck
-    
+
     test_50.py:6: Failed
     _______________________________ test_num[25] _______________________________
-    
+
     i = 25
-    
+
         @pytest.mark.parametrize("i", range(50))
         def test_num(i):
             if i in (17, 25):
     >          pytest.fail("bad luck")
     E          Failed: bad luck
-    
+
     test_50.py:6: Failed
-    =========================== 48 tests deselected ============================
     ================= 2 failed, 48 deselected in 0.12 seconds ==================
 
 You have run only the two failing test from the last run, while 48 tests have
 not been run ("deselected").
 
 Now, if you run with the ``--ff`` option, all tests will be run but the first
 previous failures will be executed first (as can be seen from the series
 of ``FF`` and dots)::
 
     $ pytest --ff
     =========================== test session starts ============================
     platform linux -- Python 3.x.y, pytest-3.x.y, py-1.x.y, pluggy-0.x.y
     rootdir: $REGENDOC_TMPDIR, inifile:
     collected 50 items
     run-last-failure: rerun previous 2 failures first
-    
+
     test_50.py FF................................................        [100%]
-    
+
     ================================= FAILURES =================================
     _______________________________ test_num[17] _______________________________
-    
+
     i = 17
-    
+
         @pytest.mark.parametrize("i", range(50))
         def test_num(i):
             if i in (17, 25):
     >          pytest.fail("bad luck")
     E          Failed: bad luck
-    
+
     test_50.py:6: Failed
     _______________________________ test_num[25] _______________________________
-    
+
     i = 25
-    
+
         @pytest.mark.parametrize("i", range(50))
         def test_num(i):
             if i in (17, 25):
     >          pytest.fail("bad luck")
     E          Failed: bad luck
-    
+
     test_50.py:6: Failed
     =================== 2 failed, 48 passed in 0.12 seconds ====================
 
 .. _`config.cache`:
 
+New ``--nf``, ``--new-first`` options: run new tests first followed by the rest
+of the tests, in both cases tests are also sorted by the file modified time,
+with more recent files coming first.
+
+Behavior when no tests failed in the last run
+---------------------------------------------
+
+When no tests failed in the last run, or when no cached ``lastfailed`` data was
+found, ``pytest`` can be configured either to run all of the tests or no tests,
+using the ``--last-failed-no-failures`` option, which takes one of the following values::
+
+    pytest --last-failed-no-failures all    # run all tests (default behavior)
+    pytest --last-failed-no-failures none   # run no tests and exit
+
 The new config.cache object
 --------------------------------
 
 .. regendoc:wipe
 
 Plugins or conftest.py support code can get a cached value using the
 pytest ``config`` object.  Here is a basic example plugin which
 implements a :ref:`fixture` which re-uses previously created state
@@ -180,89 +193,70 @@ across pytest invocations::
 
 If you run this command once, it will take a while because
 of the sleep::
 
     $ pytest -q
     F                                                                    [100%]
     ================================= FAILURES =================================
     ______________________________ test_function _______________________________
-    
+
     mydata = 42
-    
+
         def test_function(mydata):
     >       assert mydata == 23
     E       assert 42 == 23
-    
+
     test_caching.py:14: AssertionError
     1 failed in 0.12 seconds
 
 If you run it a second time the value will be retrieved from
 the cache and this will be quick::
 
     $ pytest -q
     F                                                                    [100%]
     ================================= FAILURES =================================
     ______________________________ test_function _______________________________
-    
+
     mydata = 42
-    
+
         def test_function(mydata):
     >       assert mydata == 23
     E       assert 42 == 23
-    
+
     test_caching.py:14: AssertionError
     1 failed in 0.12 seconds
 
-See the `cache-api`_ for more details.
+See the :ref:`cache-api` for more details.
 
 
 Inspecting Cache content
 -------------------------------
 
 You can always peek at the content of the cache using the
 ``--cache-show`` command line option::
 
-    $ py.test --cache-show
+    $ pytest --cache-show
     =========================== test session starts ============================
     platform linux -- Python 3.x.y, pytest-3.x.y, py-1.x.y, pluggy-0.x.y
     rootdir: $REGENDOC_TMPDIR, inifile:
-    cachedir: $REGENDOC_TMPDIR/.cache
+    cachedir: $REGENDOC_TMPDIR/.pytest_cache
     ------------------------------- cache values -------------------------------
     cache/lastfailed contains:
       {'test_caching.py::test_function': True}
+    cache/nodeids contains:
+      ['test_caching.py::test_function']
     example/value contains:
       42
-    
+
     ======================= no tests ran in 0.12 seconds =======================
 
 Clearing Cache content
 -------------------------------
 
 You can instruct pytest to clear all cache files and values
 by adding the ``--cache-clear`` option like this::
 
     pytest --cache-clear
 
 This is recommended for invocations from Continuous Integration
 servers where isolation and correctness is more important
 than speed.
-
-
-.. _`cache-api`:
-
-config.cache API
-------------------
-
-The ``config.cache`` object allows other plugins,
-including ``conftest.py`` files,
-to safely and flexibly store and retrieve values across
-test runs because the ``config`` object is available
-in many places.
-
-Under the hood, the cache plugin uses the simple
-dumps/loads API of the json stdlib module
-
-.. currentmodule:: _pytest.cacheprovider
-
-.. automethod:: Cache.get
-.. automethod:: Cache.set
-.. automethod:: Cache.makedir
--- a/testing/web-platform/tests/tools/third_party/pytest/doc/en/capture.rst
+++ b/testing/web-platform/tests/tools/third_party/pytest/doc/en/capture.rst
@@ -4,17 +4,18 @@
 Capturing of the stdout/stderr output
 =========================================================
 
 Default stdout/stderr/stdin capturing behaviour
 ---------------------------------------------------------
 
 During test execution any output sent to ``stdout`` and ``stderr`` is
 captured.  If a test or a setup method fails its according captured
-output will usually be shown along with the failure traceback.
+output will usually be shown along with the failure traceback. (this
+behavior can be configured by the ``--show-capture`` command-line option).
 
 In addition, ``stdin`` is set to a "null" object which will
 fail on attempts to read from it because it is rarely desired
 to wait for interactive input when running automated tests.
 
 By default ca