Full Code of pytest-dev/pytest for AI

main 960ddc6f67d7 cached
618 files
6.0 MB
1.6M tokens
5916 symbols
1 requests
Download .txt
Showing preview only (6,402K chars total). Download the full file or copy to clipboard to get everything.
Repository: pytest-dev/pytest
Branch: main
Commit: 960ddc6f67d7
Files: 618
Total size: 6.0 MB

Directory structure:
gitextract_zvz9np91/

├── .git-blame-ignore-revs
├── .gitattributes
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── 1_bug_report.md
│   │   ├── 2_feature_request.md
│   │   └── config.yml
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── chronographer.yml
│   ├── config.yml
│   ├── dependabot.yml
│   ├── labels.toml
│   ├── patchback.yml
│   └── workflows/
│       ├── deploy.yml
│       ├── doc-check-links.yml
│       ├── prepare-release-pr.yml
│       ├── stale.yml
│       ├── test.yml
│       └── update-plugin-list.yml
├── .gitignore
├── .mailmap
├── .pre-commit-config.yaml
├── .readthedocs.yaml
├── AUTHORS
├── CHANGELOG.rst
├── CITATION
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.rst
├── LICENSE
├── OPENCOLLECTIVE.rst
├── README.rst
├── RELEASING.rst
├── TIDELIFT.rst
├── bench/
│   ├── bench.py
│   ├── bench_argcomplete.py
│   ├── empty.py
│   ├── manyparam.py
│   ├── skip.py
│   ├── unit_test.py
│   └── xunit.py
├── changelog/
│   ├── .gitignore
│   ├── 12444.bugfix.rst
│   ├── 12689.contrib.rst
│   ├── 12882.deprecation.rst
│   ├── 13192.bugfix.rst
│   ├── 13388.doc.rst
│   ├── 13409.deprecation.rst
│   ├── 13634.bugfix.rst
│   ├── 13731.doc.rst
│   ├── 13734.bugfix.rst
│   ├── 13884.bugfix.rst
│   ├── 13917.bugfix.rst
│   ├── 13946.deprecation.rst
│   ├── 13963.bugfix.rst
│   ├── 14023.feature.rst
│   ├── 14026.improvement.rst
│   ├── 14050.bugfix.rst
│   ├── 14088.doc.rst
│   ├── 14114.bugfix.rst
│   ├── 14195.bugfix.rst
│   ├── 14255.doc.rst
│   ├── 14303.doc.rst
│   ├── 5848.bugfix.rst
│   ├── 719.bugfix.rst
│   ├── README.rst
│   └── _template.rst
├── codecov.yml
├── doc/
│   └── en/
│       ├── Makefile
│       ├── _static/
│       │   └── pytest-custom.css
│       ├── _templates/
│       │   └── links.html
│       ├── adopt.rst
│       ├── announce/
│       │   ├── index.rst
│       │   ├── release-2.0.0.rst
│       │   ├── release-2.0.1.rst
│       │   ├── release-2.0.2.rst
│       │   ├── release-2.0.3.rst
│       │   ├── release-2.1.0.rst
│       │   ├── release-2.1.1.rst
│       │   ├── release-2.1.2.rst
│       │   ├── release-2.1.3.rst
│       │   ├── release-2.2.0.rst
│       │   ├── release-2.2.1.rst
│       │   ├── release-2.2.2.rst
│       │   ├── release-2.2.4.rst
│       │   ├── release-2.3.0.rst
│       │   ├── release-2.3.1.rst
│       │   ├── release-2.3.2.rst
│       │   ├── release-2.3.3.rst
│       │   ├── release-2.3.4.rst
│       │   ├── release-2.3.5.rst
│       │   ├── release-2.4.0.rst
│       │   ├── release-2.4.1.rst
│       │   ├── release-2.4.2.rst
│       │   ├── release-2.5.0.rst
│       │   ├── release-2.5.1.rst
│       │   ├── release-2.5.2.rst
│       │   ├── release-2.6.0.rst
│       │   ├── release-2.6.1.rst
│       │   ├── release-2.6.2.rst
│       │   ├── release-2.6.3.rst
│       │   ├── release-2.7.0.rst
│       │   ├── release-2.7.1.rst
│       │   ├── release-2.7.2.rst
│       │   ├── release-2.8.2.rst
│       │   ├── release-2.8.3.rst
│       │   ├── release-2.8.4.rst
│       │   ├── release-2.8.5.rst
│       │   ├── release-2.8.6.rst
│       │   ├── release-2.8.7.rst
│       │   ├── release-2.9.0.rst
│       │   ├── release-2.9.1.rst
│       │   ├── release-2.9.2.rst
│       │   ├── release-3.0.0.rst
│       │   ├── release-3.0.1.rst
│       │   ├── release-3.0.2.rst
│       │   ├── release-3.0.3.rst
│       │   ├── release-3.0.4.rst
│       │   ├── release-3.0.5.rst
│       │   ├── release-3.0.6.rst
│       │   ├── release-3.0.7.rst
│       │   ├── release-3.1.0.rst
│       │   ├── release-3.1.1.rst
│       │   ├── release-3.1.2.rst
│       │   ├── release-3.1.3.rst
│       │   ├── release-3.10.0.rst
│       │   ├── release-3.10.1.rst
│       │   ├── release-3.2.0.rst
│       │   ├── release-3.2.1.rst
│       │   ├── release-3.2.2.rst
│       │   ├── release-3.2.3.rst
│       │   ├── release-3.2.4.rst
│       │   ├── release-3.2.5.rst
│       │   ├── release-3.3.0.rst
│       │   ├── release-3.3.1.rst
│       │   ├── release-3.3.2.rst
│       │   ├── release-3.4.0.rst
│       │   ├── release-3.4.1.rst
│       │   ├── release-3.4.2.rst
│       │   ├── release-3.5.0.rst
│       │   ├── release-3.5.1.rst
│       │   ├── release-3.6.0.rst
│       │   ├── release-3.6.1.rst
│       │   ├── release-3.6.2.rst
│       │   ├── release-3.6.3.rst
│       │   ├── release-3.6.4.rst
│       │   ├── release-3.7.0.rst
│       │   ├── release-3.7.1.rst
│       │   ├── release-3.7.2.rst
│       │   ├── release-3.7.3.rst
│       │   ├── release-3.7.4.rst
│       │   ├── release-3.8.0.rst
│       │   ├── release-3.8.1.rst
│       │   ├── release-3.8.2.rst
│       │   ├── release-3.9.0.rst
│       │   ├── release-3.9.1.rst
│       │   ├── release-3.9.2.rst
│       │   ├── release-3.9.3.rst
│       │   ├── release-4.0.0.rst
│       │   ├── release-4.0.1.rst
│       │   ├── release-4.0.2.rst
│       │   ├── release-4.1.0.rst
│       │   ├── release-4.1.1.rst
│       │   ├── release-4.2.0.rst
│       │   ├── release-4.2.1.rst
│       │   ├── release-4.3.0.rst
│       │   ├── release-4.3.1.rst
│       │   ├── release-4.4.0.rst
│       │   ├── release-4.4.1.rst
│       │   ├── release-4.4.2.rst
│       │   ├── release-4.5.0.rst
│       │   ├── release-4.6.0.rst
│       │   ├── release-4.6.1.rst
│       │   ├── release-4.6.2.rst
│       │   ├── release-4.6.3.rst
│       │   ├── release-4.6.4.rst
│       │   ├── release-4.6.5.rst
│       │   ├── release-4.6.6.rst
│       │   ├── release-4.6.7.rst
│       │   ├── release-4.6.8.rst
│       │   ├── release-4.6.9.rst
│       │   ├── release-5.0.0.rst
│       │   ├── release-5.0.1.rst
│       │   ├── release-5.1.0.rst
│       │   ├── release-5.1.1.rst
│       │   ├── release-5.1.2.rst
│       │   ├── release-5.1.3.rst
│       │   ├── release-5.2.0.rst
│       │   ├── release-5.2.1.rst
│       │   ├── release-5.2.2.rst
│       │   ├── release-5.2.3.rst
│       │   ├── release-5.2.4.rst
│       │   ├── release-5.3.0.rst
│       │   ├── release-5.3.1.rst
│       │   ├── release-5.3.2.rst
│       │   ├── release-5.3.3.rst
│       │   ├── release-5.3.4.rst
│       │   ├── release-5.3.5.rst
│       │   ├── release-5.4.0.rst
│       │   ├── release-5.4.1.rst
│       │   ├── release-5.4.2.rst
│       │   ├── release-5.4.3.rst
│       │   ├── release-6.0.0.rst
│       │   ├── release-6.0.0rc1.rst
│       │   ├── release-6.0.1.rst
│       │   ├── release-6.0.2.rst
│       │   ├── release-6.1.0.rst
│       │   ├── release-6.1.1.rst
│       │   ├── release-6.1.2.rst
│       │   ├── release-6.2.0.rst
│       │   ├── release-6.2.1.rst
│       │   ├── release-6.2.2.rst
│       │   ├── release-6.2.3.rst
│       │   ├── release-6.2.4.rst
│       │   ├── release-6.2.5.rst
│       │   ├── release-7.0.0.rst
│       │   ├── release-7.0.0rc1.rst
│       │   ├── release-7.0.1.rst
│       │   ├── release-7.1.0.rst
│       │   ├── release-7.1.1.rst
│       │   ├── release-7.1.2.rst
│       │   ├── release-7.1.3.rst
│       │   ├── release-7.2.0.rst
│       │   ├── release-7.2.1.rst
│       │   ├── release-7.2.2.rst
│       │   ├── release-7.3.0.rst
│       │   ├── release-7.3.1.rst
│       │   ├── release-7.3.2.rst
│       │   ├── release-7.4.0.rst
│       │   ├── release-7.4.1.rst
│       │   ├── release-7.4.2.rst
│       │   ├── release-7.4.3.rst
│       │   ├── release-7.4.4.rst
│       │   ├── release-8.0.0.rst
│       │   ├── release-8.0.0rc1.rst
│       │   ├── release-8.0.0rc2.rst
│       │   ├── release-8.0.1.rst
│       │   ├── release-8.0.2.rst
│       │   ├── release-8.1.0.rst
│       │   ├── release-8.1.1.rst
│       │   ├── release-8.1.2.rst
│       │   ├── release-8.2.0.rst
│       │   ├── release-8.2.1.rst
│       │   ├── release-8.2.2.rst
│       │   ├── release-8.3.0.rst
│       │   ├── release-8.3.1.rst
│       │   ├── release-8.3.2.rst
│       │   ├── release-8.3.3.rst
│       │   ├── release-8.3.4.rst
│       │   ├── release-8.3.5.rst
│       │   ├── release-8.4.0.rst
│       │   ├── release-8.4.1.rst
│       │   ├── release-8.4.2.rst
│       │   ├── release-9.0.0.rst
│       │   ├── release-9.0.1.rst
│       │   ├── release-9.0.2.rst
│       │   └── sprint2016.rst
│       ├── backwards-compatibility.rst
│       ├── broken-dep-constraints.txt
│       ├── builtin.rst
│       ├── changelog.rst
│       ├── conf.py
│       ├── conftest.py
│       ├── contact.rst
│       ├── contents.rst
│       ├── contributing.rst
│       ├── deprecations.rst
│       ├── development_guide.rst
│       ├── example/
│       │   ├── .ruff.toml
│       │   ├── assertion/
│       │   │   ├── failure_demo.py
│       │   │   ├── global_testmodule_config/
│       │   │   │   ├── conftest.py
│       │   │   │   └── test_hello_world.py
│       │   │   ├── test_failures.py
│       │   │   └── test_setup_flow_example.py
│       │   ├── attic.rst
│       │   ├── conftest.py
│       │   ├── customdirectory/
│       │   │   ├── conftest.py
│       │   │   ├── pytest.ini
│       │   │   └── tests/
│       │   │       ├── manifest.json
│       │   │       ├── test_first.py
│       │   │       ├── test_second.py
│       │   │       └── test_third.py
│       │   ├── customdirectory.rst
│       │   ├── fixtures/
│       │   │   ├── test_fixtures_order_autouse.py
│       │   │   ├── test_fixtures_order_autouse_multiple_scopes.py
│       │   │   ├── test_fixtures_order_autouse_temp_effects.py
│       │   │   ├── test_fixtures_order_dependencies.py
│       │   │   ├── test_fixtures_order_scope.py
│       │   │   └── test_fixtures_request_different_scope.py
│       │   ├── index.rst
│       │   ├── markers.rst
│       │   ├── multipython.py
│       │   ├── nonpython/
│       │   │   ├── __init__.py
│       │   │   ├── conftest.py
│       │   │   └── test_simple.yaml
│       │   ├── nonpython.rst
│       │   ├── parametrize.rst
│       │   ├── pythoncollection.py
│       │   ├── pythoncollection.rst
│       │   ├── reportingdemo.rst
│       │   ├── simple.rst
│       │   ├── special.rst
│       │   └── xfail_demo.py
│       ├── explanation/
│       │   ├── anatomy.rst
│       │   ├── ci.rst
│       │   ├── fixtures.rst
│       │   ├── flaky.rst
│       │   ├── goodpractices.rst
│       │   ├── index.rst
│       │   ├── pythonpath.rst
│       │   └── types.rst
│       ├── funcarg_compare.rst
│       ├── funcargs.rst
│       ├── getting-started.rst
│       ├── historical-notes.rst
│       ├── history.rst
│       ├── how-to/
│       │   ├── assert.rst
│       │   ├── bash-completion.rst
│       │   ├── cache.rst
│       │   ├── capture-stdout-stderr.rst
│       │   ├── capture-warnings.rst
│       │   ├── doctest.rst
│       │   ├── existingtestsuite.rst
│       │   ├── failures.rst
│       │   ├── fixtures.rst
│       │   ├── index.rst
│       │   ├── logging.rst
│       │   ├── mark.rst
│       │   ├── monkeypatch.rst
│       │   ├── output.rst
│       │   ├── parametrize.rst
│       │   ├── plugins.rst
│       │   ├── skipping.rst
│       │   ├── subtests.rst
│       │   ├── tmp_path.rst
│       │   ├── unittest.rst
│       │   ├── usage.rst
│       │   ├── writing_hook_functions.rst
│       │   ├── writing_plugins.rst
│       │   └── xunit_setup.rst
│       ├── index.rst
│       ├── license.rst
│       ├── naming20.rst
│       ├── proposals/
│       │   └── parametrize_with_fixtures.rst
│       ├── pytest.ini
│       ├── recwarn.rst
│       ├── reference/
│       │   ├── customize.rst
│       │   ├── exit-codes.rst
│       │   ├── fixtures.rst
│       │   ├── index.rst
│       │   ├── plugin_list.rst
│       │   └── reference.rst
│       ├── requirements.txt
│       ├── sponsor.rst
│       ├── talks.rst
│       ├── tidelift.rst
│       └── yieldfixture.rst
├── extra/
│   └── get_issues.py
├── pyproject.toml
├── scripts/
│   ├── .gitignore
│   ├── generate-gh-release-notes.py
│   ├── prepare-release-pr.py
│   ├── release.major.rst
│   ├── release.minor.rst
│   ├── release.patch.rst
│   ├── release.pre.rst
│   ├── release.py
│   └── update-plugin-list.py
├── src/
│   ├── _pytest/
│   │   ├── __init__.py
│   │   ├── _argcomplete.py
│   │   ├── _code/
│   │   │   ├── __init__.py
│   │   │   ├── code.py
│   │   │   └── source.py
│   │   ├── _io/
│   │   │   ├── __init__.py
│   │   │   ├── pprint.py
│   │   │   ├── saferepr.py
│   │   │   ├── terminalwriter.py
│   │   │   └── wcwidth.py
│   │   ├── _py/
│   │   │   ├── __init__.py
│   │   │   ├── error.py
│   │   │   └── path.py
│   │   ├── assertion/
│   │   │   ├── __init__.py
│   │   │   ├── rewrite.py
│   │   │   ├── truncate.py
│   │   │   └── util.py
│   │   ├── cacheprovider.py
│   │   ├── capture.py
│   │   ├── compat.py
│   │   ├── config/
│   │   │   ├── __init__.py
│   │   │   ├── argparsing.py
│   │   │   ├── exceptions.py
│   │   │   └── findpaths.py
│   │   ├── debugging.py
│   │   ├── deprecated.py
│   │   ├── doctest.py
│   │   ├── faulthandler.py
│   │   ├── fixtures.py
│   │   ├── freeze_support.py
│   │   ├── helpconfig.py
│   │   ├── hookspec.py
│   │   ├── junitxml.py
│   │   ├── legacypath.py
│   │   ├── logging.py
│   │   ├── main.py
│   │   ├── mark/
│   │   │   ├── __init__.py
│   │   │   ├── expression.py
│   │   │   └── structures.py
│   │   ├── monkeypatch.py
│   │   ├── nodes.py
│   │   ├── outcomes.py
│   │   ├── pastebin.py
│   │   ├── pathlib.py
│   │   ├── py.typed
│   │   ├── pytester.py
│   │   ├── pytester_assertions.py
│   │   ├── python.py
│   │   ├── python_api.py
│   │   ├── raises.py
│   │   ├── recwarn.py
│   │   ├── reports.py
│   │   ├── runner.py
│   │   ├── scope.py
│   │   ├── setuponly.py
│   │   ├── setupplan.py
│   │   ├── skipping.py
│   │   ├── stash.py
│   │   ├── stepwise.py
│   │   ├── subtests.py
│   │   ├── terminal.py
│   │   ├── terminalprogress.py
│   │   ├── threadexception.py
│   │   ├── timing.py
│   │   ├── tmpdir.py
│   │   ├── tracemalloc.py
│   │   ├── unittest.py
│   │   ├── unraisableexception.py
│   │   ├── warning_types.py
│   │   └── warnings.py
│   ├── py.py
│   └── pytest/
│       ├── __init__.py
│       ├── __main__.py
│       └── py.typed
├── testing/
│   ├── _py/
│   │   └── test_local.py
│   ├── acceptance_test.py
│   ├── code/
│   │   ├── test_code.py
│   │   ├── test_excinfo.py
│   │   └── test_source.py
│   ├── conftest.py
│   ├── deprecated_test.py
│   ├── example_scripts/
│   │   ├── README.rst
│   │   ├── __init__.py
│   │   ├── acceptance/
│   │   │   └── fixture_mock_integration.py
│   │   ├── collect/
│   │   │   ├── collect_init_tests/
│   │   │   │   ├── pytest.ini
│   │   │   │   └── tests/
│   │   │   │       ├── __init__.py
│   │   │   │       └── test_foo.py
│   │   │   ├── package_infinite_recursion/
│   │   │   │   ├── __init__.pyi
│   │   │   │   ├── conftest.py
│   │   │   │   └── tests/
│   │   │   │       ├── __init__.py
│   │   │   │       └── test_basic.py
│   │   │   └── package_init_given_as_arg/
│   │   │       └── pkg/
│   │   │           ├── __init__.py
│   │   │           └── test_foo.py
│   │   ├── config/
│   │   │   └── collect_pytest_prefix/
│   │   │       ├── __init__.pyi
│   │   │       ├── conftest.py
│   │   │       └── test_foo.py
│   │   ├── conftest_usageerror/
│   │   │   ├── __init__.pyi
│   │   │   └── conftest.py
│   │   ├── customdirectory/
│   │   │   ├── conftest.py
│   │   │   ├── pytest.ini
│   │   │   └── tests/
│   │   │       ├── manifest.json
│   │   │       ├── test_first.py
│   │   │       ├── test_second.py
│   │   │       └── test_third.py
│   │   ├── dataclasses/
│   │   │   ├── test_compare_dataclasses.py
│   │   │   ├── test_compare_dataclasses_field_comparison_off.py
│   │   │   ├── test_compare_dataclasses_verbose.py
│   │   │   ├── test_compare_dataclasses_with_custom_eq.py
│   │   │   ├── test_compare_initvar.py
│   │   │   ├── test_compare_recursive_dataclasses.py
│   │   │   └── test_compare_two_different_dataclasses.py
│   │   ├── doctest/
│   │   │   └── main_py/
│   │   │       ├── __main__.py
│   │   │       └── test_normal_module.py
│   │   ├── fixtures/
│   │   │   ├── custom_item/
│   │   │   │   ├── __init__.pyi
│   │   │   │   ├── conftest.py
│   │   │   │   └── foo/
│   │   │   │       ├── __init__.py
│   │   │   │       └── test_foo.py
│   │   │   ├── fill_fixtures/
│   │   │   │   ├── test_conftest_funcargs_only_available_in_subdir/
│   │   │   │   │   ├── sub1/
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   ├── conftest.py
│   │   │   │   │   │   └── test_in_sub1.py
│   │   │   │   │   └── sub2/
│   │   │   │   │       ├── __init__.py
│   │   │   │   │       ├── conftest.py
│   │   │   │   │       └── test_in_sub2.py
│   │   │   │   ├── test_detect_recursive_dependency_error.py
│   │   │   │   ├── test_extend_fixture_conftest_conftest/
│   │   │   │   │   ├── __init__.pyi
│   │   │   │   │   ├── conftest.py
│   │   │   │   │   └── pkg/
│   │   │   │   │       ├── __init__.py
│   │   │   │   │       ├── conftest.py
│   │   │   │   │       └── test_spam.py
│   │   │   │   ├── test_extend_fixture_conftest_module/
│   │   │   │   │   ├── __init__.pyi
│   │   │   │   │   ├── conftest.py
│   │   │   │   │   └── test_extend_fixture_conftest_module.py
│   │   │   │   ├── test_extend_fixture_module_class.py
│   │   │   │   ├── test_funcarg_basic.py
│   │   │   │   ├── test_funcarg_lookup_classlevel.py
│   │   │   │   ├── test_funcarg_lookup_modulelevel.py
│   │   │   │   └── test_funcarg_lookupfails.py
│   │   │   ├── test_fixture_named_request.py
│   │   │   └── test_getfixturevalue_dynamic.py
│   │   ├── issue88_initial_file_multinodes/
│   │   │   ├── __init__.pyi
│   │   │   ├── conftest.py
│   │   │   └── test_hello.py
│   │   ├── issue_519.py
│   │   ├── junit-10.xsd
│   │   ├── marks/
│   │   │   └── marks_considered_keywords/
│   │   │       ├── __init__.pyi
│   │   │       ├── conftest.py
│   │   │       └── test_marks_as_keywords.py
│   │   ├── perf_examples/
│   │   │   └── collect_stats/
│   │   │       ├── .gitignore
│   │   │       ├── generate_folders.py
│   │   │       └── template_test.py
│   │   ├── pytest.ini
│   │   ├── tmpdir/
│   │   │   └── tmp_path_fixture.py
│   │   ├── unittest/
│   │   │   ├── test_parametrized_fixture_error_message.py
│   │   │   ├── test_setup_skip.py
│   │   │   ├── test_setup_skip_class.py
│   │   │   ├── test_setup_skip_module.py
│   │   │   ├── test_unittest_asyncio.py
│   │   │   ├── test_unittest_asynctest.py
│   │   │   └── test_unittest_plain_async.py
│   │   └── warnings/
│   │       ├── test_group_warnings_by_message.py
│   │       └── test_group_warnings_by_message_summary/
│   │           ├── test_1.py
│   │           └── test_2.py
│   ├── examples/
│   │   └── test_issue519.py
│   ├── freeze/
│   │   ├── .gitignore
│   │   ├── create_executable.py
│   │   ├── runtests_script.py
│   │   ├── tests/
│   │   │   ├── test_doctest.txt
│   │   │   └── test_trivial.py
│   │   └── tox_run.py
│   ├── io/
│   │   ├── test_pprint.py
│   │   ├── test_saferepr.py
│   │   ├── test_terminalwriter.py
│   │   └── test_wcwidth.py
│   ├── logging/
│   │   ├── test_fixture.py
│   │   ├── test_formatter.py
│   │   └── test_reporting.py
│   ├── plugins_integration/
│   │   ├── .gitignore
│   │   ├── README.rst
│   │   ├── bdd_wallet.feature
│   │   ├── bdd_wallet.py
│   │   ├── django_settings.py
│   │   ├── pytest.ini
│   │   ├── pytest_anyio_integration.py
│   │   ├── pytest_asyncio_integration.py
│   │   ├── pytest_mock_integration.py
│   │   ├── pytest_rerunfailures_integration.py
│   │   ├── pytest_trio_integration.py
│   │   ├── pytest_twisted_integration.py
│   │   ├── requirements.txt
│   │   └── simple_integration.py
│   ├── python/
│   │   ├── approx.py
│   │   ├── collect.py
│   │   ├── fixtures.py
│   │   ├── integration.py
│   │   ├── metafunc.py
│   │   ├── raises.py
│   │   ├── raises_group.py
│   │   └── show_fixtures_per_test.py
│   ├── test_argcomplete.py
│   ├── test_assertion.py
│   ├── test_assertrewrite.py
│   ├── test_cacheprovider.py
│   ├── test_capture.py
│   ├── test_collect_imported_tests.py
│   ├── test_collection.py
│   ├── test_compat.py
│   ├── test_config.py
│   ├── test_conftest.py
│   ├── test_debugging.py
│   ├── test_doctest.py
│   ├── test_entry_points.py
│   ├── test_error_diffs.py
│   ├── test_faulthandler.py
│   ├── test_findpaths.py
│   ├── test_helpconfig.py
│   ├── test_junitxml.py
│   ├── test_legacypath.py
│   ├── test_link_resolve.py
│   ├── test_main.py
│   ├── test_mark.py
│   ├── test_mark_expression.py
│   ├── test_meta.py
│   ├── test_monkeypatch.py
│   ├── test_nodes.py
│   ├── test_parseopt.py
│   ├── test_pastebin.py
│   ├── test_pathlib.py
│   ├── test_pluginmanager.py
│   ├── test_pytester.py
│   ├── test_python_path.py
│   ├── test_recwarn.py
│   ├── test_reports.py
│   ├── test_runner.py
│   ├── test_runner_xunit.py
│   ├── test_scope.py
│   ├── test_session.py
│   ├── test_setuponly.py
│   ├── test_setupplan.py
│   ├── test_skipping.py
│   ├── test_stash.py
│   ├── test_stepwise.py
│   ├── test_subtests.py
│   ├── test_terminal.py
│   ├── test_threadexception.py
│   ├── test_tmpdir.py
│   ├── test_unittest.py
│   ├── test_unraisableexception.py
│   ├── test_warning_types.py
│   ├── test_warnings.py
│   ├── typing_checks.py
│   └── typing_raises_group.py
└── tox.ini

================================================
FILE CONTENTS
================================================

================================================
FILE: .git-blame-ignore-revs
================================================
# List of revisions that can be ignored with git-blame(1).
#
# See `blame.ignoreRevsFile` in git-config(1) to enable it by default, or
# use it with `--ignore-revs-file` manually with git-blame.
#
# To "install" it:
#
#   git config --local blame.ignoreRevsFile .git-blame-ignore-revs

# run black
703e4b11ba76171eccd3f13e723c47b810ded7ef
# switched to src layout
eaa882f3d5340956beb176aa1753e07e3f3f2190
# pre-commit run pyupgrade --all-files
a91fe1feddbded535a4322ab854429e3a3961fb4
# move node base classes from main to nodes
afc607cfd81458d4e4f3b1f3cf8cc931b933907e
# [?] split most fixture related code into own plugin
8c49561470708761f7321504f5e8343811be87ac
# run pyupgrade
9aacb4635e81edd6ecf281d4f6c0cfc8e94ab301
# run blacken-docs
5f95dce95602921a70bfbc7d8de2f7712c5e4505
# ran pyupgrade-docs again
75d0b899bbb56d6849e9d69d83a9426ed3f43f8b
# move argument parser to own file
c9df77cbd6a365dcb73c39618e4842711817e871
# Replace reorder-python-imports by isort due to black incompatibility (#11896)
8b54596639f41dfac070030ef20394b9001fe63c
# Run blacken-docs with black's 2024's style
4546d5445aaefe6a03957db028c263521dfb5c4b
# Migration to ruff / ruff format
4588653b2497ed25976b7aaff225b889fb476756
# Use format specifiers instead of percent format
4788165e69d08e10fc6b9c0124083fb358e2e9b0


================================================
FILE: .gitattributes
================================================
*.bat  text eol=crlf


================================================
FILE: .github/FUNDING.yml
================================================
# info:
# * https://help.github.com/en/articles/displaying-a-sponsor-button-in-your-repository
# * https://tidelift.com/subscription/how-to-connect-tidelift-with-github
github: pytest-dev
tidelift: pypi/pytest
open_collective: pytest
thanks_dev: u/gh/pytest-dev


================================================
FILE: .github/ISSUE_TEMPLATE/1_bug_report.md
================================================
---
name: 🐛 Bug Report
about: Report errors and problems

---

<!--
Thanks for submitting an issue!

Quick check-list while reporting bugs:
-->

- [ ] a detailed description of the bug or problem you are having
- [ ] output of `pip list` from the virtual environment you are using
- [ ] pytest and operating system versions
- [ ] minimal example if possible


================================================
FILE: .github/ISSUE_TEMPLATE/2_feature_request.md
================================================
---
name: 🚀 Feature Request
about: Ideas for new features and improvements

---

<!--
Thanks for suggesting a feature!

Quick check-list while suggesting features:
-->

#### What's the problem this feature will solve?
<!-- What are you trying to do, that you are unable to achieve with pytest as it currently stands? -->

#### Describe the solution you'd like
<!-- A clear and concise description of what you want to happen. -->

<!-- Provide examples of real-world use cases that this would enable and how it solves the problem described above. -->

#### Alternative Solutions
<!-- Have you tried to workaround the problem using a pytest plugin or other tools? Or a different approach to solving this issue? Please elaborate here. -->

#### Additional context
<!-- Add any other context, links, etc. about the feature here. -->


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
  - name: ❓ Support Question
    url: https://github.com/pytest-dev/pytest/discussions
    about: Use GitHub's new Discussions feature for questions


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
<!--
Thanks for submitting a PR, your contribution is really appreciated!

Here is a quick checklist that should be present in PRs.

- [ ] Include documentation when adding new features.
- [ ] Include new tests or update existing tests when applicable.
- [X] Allow maintainers to push and squash when merging my commits. Please uncheck this if you prefer to squash the commits yourself.

If this change fixes an issue, please:

- [ ] Add text like ``closes #XYZW`` to the PR description and/or commits (where ``XYZW`` is the issue number). See the [github docs](https://help.github.com/en/github/managing-your-work-on-github/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword) for more information.

> [!IMPORTANT]
> **Unsupervised agentic contributions are not accepted**. See our [AI/LLM-Assisted Contributions Policy](https://github.com/pytest-dev/pytest/blob/main/CONTRIBUTING.rst#aillm-assisted-contributions-policy).

- [ ] If AI agents were used, they are credited in `Co-authored-by` commit trailers.

Unless your change is trivial or a small documentation fix (e.g., a typo or reword of a small section) please:

- [ ] Create a new changelog file in the `changelog` directory, with a name like `<ISSUE NUMBER>.<TYPE>.rst`. See [changelog/README.rst](https://github.com/pytest-dev/pytest/blob/main/changelog/README.rst) for details.

  Write sentences in the **past or present tense**, examples:

  * *Improved verbose diff output with sequences.*
  * *Terminal summary statistics now use multiple colors.*

  Also make sure to end the sentence with a `.`.

- [ ] Add yourself to `AUTHORS` in alphabetical order.
-->


================================================
FILE: .github/chronographer.yml
================================================
---

branch-protection-check-name: Changelog entry
action-hints:
  check-title-prefix: "Chronographer: "
  external-docs-url: >-
    https://docs.pytest.org/en/latest/contributing.html#preparing-pull-requests
  inline-markdown: >-
    See
    https://docs.pytest.org/en/latest/contributing.html#preparing-pull-requests
    for details.
enforce-name:
  suffix: .rst
exclude:
  humans:
  - pyup-bot
labels:
  skip-changelog: skip news

...


================================================
FILE: .github/config.yml
================================================
rtd:
  project: pytest


================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
- package-ecosystem: pip
  directory: "/testing/plugins_integration"
  schedule:
    interval: weekly
    time: "03:00"
  open-pull-requests-limit: 10
  allow:
  - dependency-type: direct
  - dependency-type: indirect
  cooldown:
    default-days: 7
- package-ecosystem: github-actions
  directory: /
  schedule:
    interval: weekly
    time: "03:00"
  open-pull-requests-limit: 10
  cooldown:
    default-days: 7


================================================
FILE: .github/labels.toml
================================================
["os: cygwin"]
color = "006b75"
description = "cygwin platform-specific problem"
name = "os: cygwin"

["os: linux"]
color = "1d76db"
description = "linux platform-specific problem"
name = "os: linux"

["os: mac"]
color = "bfdadc"
description = "mac platform-specific problem"
name = "os: mac"

["os: windows"]
color = "fbca04"
description = "windows platform-specific problem"
name = "os: windows"

["plugin: argcomplete"]
color = "d4c5f9"
description = "related to the argcomplete builtin plugin"
name = "plugin: argcomplete"

["plugin: cache"]
color = "c7def8"
description = "related to the cache builtin plugin"
name = "plugin: cache"

["plugin: capture"]
color = "1d76db"
description = "related to the capture builtin plugin"
name = "plugin: capture"

["plugin: debugging"]
color = "dd52a8"
description = "related to the debugging builtin plugin"
name = "plugin: debugging"

["plugin: doctests"]
color = "fad8c7"
description = "related to the doctests builtin plugin"
name = "plugin: doctests"

["plugin: junitxml"]
color = "c5def5"
description = "related to the junitxml builtin plugin"
name = "plugin: junitxml"

["plugin: logging"]
color = "ff5432"
description = "related to the logging builtin plugin"
name = "plugin: logging"

["plugin: monkeypatch"]
color = "0e8a16"
description = "related to the monkeypatch builtin plugin"
name = "plugin: monkeypatch"

["plugin: nose"]
color = "bfdadc"
description = "related to the nose integration builtin plugin"
name = "plugin: nose"

["plugin: pastebin"]
color = "bfd4f2"
description = "related to the pastebin builtin plugin"
name = "plugin: pastebin"

["plugin: pytester"]
color = "c5def5"
description = "related to the pytester builtin plugin"
name = "plugin: pytester"

["plugin: tmpdir"]
color = "bfd4f2"
description = "related to the tmpdir builtin plugin"
name = "plugin: tmpdir"

["plugin: unittest"]
color = "006b75"
description = "related to the unittest integration builtin plugin"
name = "plugin: unittest"

["plugin: warnings"]
color = "fef2c0"
description = "related to the warnings builtin plugin"
name = "plugin: warnings"

["plugin: xdist"]
color = "5319e7"
description = "related to the xdist external plugin"
name = "plugin: xdist"

["status: critical"]
color = "e11d21"
description = "grave problem or usability issue that affects lots of users"
name = "status: critical"

["status: easy"]
color = "bfe5bf"
description = "easy issue that is friendly to new contributor"
name = "status: easy"

["status: help wanted"]
color = "159818"
description = "developers would like help from experts on this topic"
name = "status: help wanted"

["status: needs information"]
color = "5319e7"
description = "reporter needs to provide more information; can be closed after 2 or more weeks of inactivity"
name = "status: needs information"

["topic: collection"]
color = "006b75"
description = "related to the collection phase"
name = "topic: collection"

["topic: config"]
color = "006b75"
description = "related to config handling, argument parsing and config file"
name = "topic: config"

["topic: fixtures"]
color = "5319e7"
description = "anything involving fixtures directly or indirectly"
name = "topic: fixtures"

["topic: marks"]
color = "b60205"
description = "related to marks, either the general marks or builtin"
name = "topic: marks"

["topic: parametrize"]
color = "fbca04"
description = "related to @pytest.mark.parametrize"
name = "topic: parametrize"

["topic: reporting"]
color = "fef2c0"
description = "related to terminal output and user-facing messages and errors"
name = "topic: reporting"

["topic: rewrite"]
color = "0e8a16"
description = "related to the assertion rewrite mechanism"
name = "topic: rewrite"


================================================
FILE: .github/patchback.yml
================================================
---

backport_branch_prefix: patchback/backports/
backport_label_prefix: 'backport '  # IMPORTANT: the labels are space-delimited
# target_branch_prefix: ''  # The project's backport branches are non-prefixed

...


================================================
FILE: .github/workflows/deploy.yml
================================================
name: deploy

on:
  workflow_dispatch:
    inputs:
      version:
        description: 'Release version'
        required: true
        default: '1.2.3'


# Set permissions at the job level.
permissions: {}

jobs:
  package:
    runs-on: ubuntu-latest
    env:
      SETUPTOOLS_SCM_PRETEND_VERSION_FOR_PYTEST: ${{ github.event.inputs.version }}
    timeout-minutes: 10

    # Required by attest-build-provenance-github.
    permissions:
      id-token: write
      attestations: write

    steps:
    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        fetch-depth: 0
        persist-credentials: false

    - name: Build and Check Package
      uses: hynek/build-and-inspect-python-package@efb823f52190ad02594531168b7a2d5790e66516
      with:
        attest-build-provenance-github: 'true'

  generate-gh-release-notes:
    needs: [package]
    runs-on: ubuntu-latest
    timeout-minutes: 30
    permissions:
      contents: read
    steps:
    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        fetch-depth: 0
        persist-credentials: false

    - name: Set up Python
      uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
      with:
        python-version: "3.13"

    - name: Install tox
      run: |
        python -m pip install --upgrade pip
        pip install tox

    - name: Generate release notes
      env:
        VERSION: ${{ github.event.inputs.version }}
      run: |
        tox -e generate-gh-release-notes -- "$VERSION" gh-release-notes.md

    - name: Upload release notes
      uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
      with:
        name: release-notes
        path: gh-release-notes.md
        retention-days: 1

  publish-to-pypi:
    if: github.repository == 'pytest-dev/pytest'
    # Need generate-gh-release-notes only for ordering.
    # Don't want to release to PyPI if generating GitHub release notes fails.
    needs: [package, generate-gh-release-notes]
    runs-on: ubuntu-latest
    environment: deploy
    timeout-minutes: 30
    permissions:
      id-token: write
    steps:
    - name: Download Package
      uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8.0.0
      with:
        name: Packages
        path: dist

    - name: Publish package to PyPI
      uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e
      with:
        attestations: true

  push-tag:
    needs: [publish-to-pypi]
    runs-on: ubuntu-latest
    timeout-minutes: 10
    permissions:
      contents: write
    steps:
    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        fetch-depth: 0
        persist-credentials: true

    - name: Push tag
      env:
          VERSION: ${{ github.event.inputs.version }}
      run: |
        git config user.name "pytest bot"
        git config user.email "pytestbot@gmail.com"
        git tag --annotate --message=v"$VERSION" "$VERSION" ${{ github.sha }}
        git push origin "$VERSION"

  create-github-release:
    needs: [push-tag, generate-gh-release-notes]
    runs-on: ubuntu-latest
    timeout-minutes: 10
    permissions:
      contents: write
    steps:
    - name: Download Package
      uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8.0.0
      with:
        name: Packages
        path: dist

    - name: Download release notes
      uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8.0.0
      with:
        name: release-notes
        path: .

    - name: Publish GitHub Release
      env:
        VERSION: ${{ github.event.inputs.version }}
        GH_REPO: ${{ github.repository }}
        GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      run: |
        gh release create --notes-file gh-release-notes.md --verify-tag "$VERSION" dist/*


================================================
FILE: .github/workflows/doc-check-links.yml
================================================
name: Doc Check Links

on:
  schedule:
    # At 00:00 on Sunday.
    # https://crontab.guru
    - cron: '0 0 * * 0'
  workflow_dispatch:

# Set permissions at the job level.
permissions: {}

jobs:
  doc-check-links:
    if: github.repository_owner == 'pytest-dev'
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
        with:
          fetch-depth: 0
          persist-credentials: false

      - name: Setup Python
        uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
        with:
          python-version: "3.13"
          cache: pip

      - name: Install tox
        run: |
          python -m pip install --upgrade pip
          pip install tox

      - name: Run sphinx linkcheck via tox
        run: tox -e docs-checklinks


================================================
FILE: .github/workflows/prepare-release-pr.yml
================================================
name: prepare release pr

on:
  workflow_dispatch:
    inputs:
      branch:
        description: 'Branch to base the release from'
        required: true
        default: ''
      major:
        description: 'Major release? (yes/no)'
        required: true
        default: 'no'
      prerelease:
        description: 'Prerelease (ex: rc1). Leave empty if not a pre-release.'
        required: false
        default: ''

# Set permissions at the job level.
permissions: {}

jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      contents: write
      pull-requests: write

    steps:
    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        fetch-depth: 0
        # persist-credentials is needed in order for us to push the release branch.
        persist-credentials: true

    - name: Set up Python
      uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
      with:
        python-version: "3.13"

    - name: Install tox
      run: |
        python -m pip install --upgrade pip
        pip install tox

    - name: Prepare release PR (minor/patch release)
      if: github.event.inputs.major == 'no'
      env:
        BRANCH: ${{ github.event.inputs.branch }}
        PRERELEASE: ${{ github.event.inputs.prerelease }}
        GH_TOKEN: ${{ github.token }}
      run: |
        tox -e prepare-release-pr -- "$BRANCH" --prerelease="$PRERELEASE"

    - name: Prepare release PR (major release)
      if: github.event.inputs.major == 'yes'
      env:
        BRANCH: ${{ github.event.inputs.branch }}
        PRERELEASE: ${{ github.event.inputs.prerelease }}
        GH_TOKEN: ${{ github.token }}
      run: |
        tox -e prepare-release-pr -- "$BRANCH" --major --prerelease="$PRERELEASE"


================================================
FILE: .github/workflows/stale.yml
================================================
name: close needs-information issues
on:
  schedule:
    - cron: "30 1 * * *"
  workflow_dispatch:

jobs:
  close-issues:
    runs-on: ubuntu-latest
    permissions:
      issues: write
    steps:
      - uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f # v10.1.0
        with:
          debug-only: false
          days-before-issue-stale: 14
          days-before-issue-close: 7
          only-labels: "status: needs information"
          stale-issue-label: "stale"
          stale-issue-message: "This issue is stale because it has the `status: needs information` label and requested follow-up information was not provided for 14 days."
          close-issue-message: "This issue was closed because it has the `status: needs information` label and follow-up information has not been provided for 7 days since being marked as stale."
          days-before-pr-stale: -1
          days-before-pr-close: -1


================================================
FILE: .github/workflows/test.yml
================================================
name: test

on:
  push:
    branches:
      - main
      - "[0-9]+.[0-9]+.x"
      - "test-me-*"
    tags:
      - "[0-9]+.[0-9]+.[0-9]+"
      - "[0-9]+.[0-9]+.[0-9]+rc[0-9]+"

  pull_request:
    branches:
      - main
      - "[0-9]+.[0-9]+.x"
    types:
    - opened  # default
    - synchronize  # default
    - reopened  # default
    - ready_for_review  # used in PRs created from the release workflow

  workflow_dispatch:  # allows manual triggering of the workflow

env:
  PYTEST_ADDOPTS: "--color=yes"

# Cancel running jobs for the same workflow and branch.
concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

# Set permissions at the job level.
permissions: {}

jobs:
  package:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        fetch-depth: 0
        persist-credentials: false
    - name: Build and Check Package
      uses: hynek/build-and-inspect-python-package@efb823f52190ad02594531168b7a2d5790e66516

  build:
    needs: [package]

    runs-on: ${{ matrix.os }}
    timeout-minutes: 45
    permissions:
      contents: read

    strategy:
      fail-fast: false
      matrix:
        name: [
          "windows-py310-unittest-asynctest",
          "windows-py310-unittest-twisted24",
          "windows-py310-unittest-twisted25",
          "windows-py310-pluggy",
          "windows-py310-xdist",
          "windows-py311",
          "windows-py312",
          "windows-py313",
          "windows-py314",

          "ubuntu-py310-unittest-asynctest",
          "ubuntu-py310-unittest-twisted24",
          "ubuntu-py310-unittest-twisted25",
          "ubuntu-py310-lsof-numpy-pexpect",
          "ubuntu-py310-pluggy",
          "ubuntu-py310-freeze",
          "ubuntu-py310-xdist",
          "ubuntu-py311",
          "ubuntu-py312",
          "ubuntu-py313-pexpect",
          "ubuntu-py314",
          "ubuntu-pypy3-xdist",

          "macos-py310",
          "macos-py312",
          "macos-py313",
          "macos-py314",

          "doctesting",
          "plugins",
        ]

        include:
          # Use separate jobs for different unittest flavors (twisted, asynctest) to ensure proper coverage.
          - name: "windows-py310-unittest-asynctest"
            python: "3.10"
            os: windows-latest
            tox_env: "py310-asynctest"
            use_coverage: true

          - name: "windows-py310-unittest-twisted24"
            python: "3.10"
            os: windows-latest
            tox_env: "py310-twisted24"
            use_coverage: true

          - name: "windows-py310-unittest-twisted25"
            python: "3.10"
            os: windows-latest
            tox_env: "py310-twisted25"
            use_coverage: true

          - name: "windows-py310-pluggy"
            python: "3.10"
            os: windows-latest
            tox_env: "py310-pluggymain-pylib-xdist"
            xfail: true

          - name: "windows-py310-xdist"
            python: "3.10"
            os: windows-latest
            tox_env: "py310-xdist"

          - name: "windows-py311"
            python: "3.11"
            os: windows-latest
            tox_env: "py311"

          - name: "windows-py312"
            python: "3.12"
            os: windows-latest
            tox_env: "py312"

          - name: "windows-py313"
            python: "3.13"
            os: windows-latest
            tox_env: "py313"
            xfail: true

          - name: "windows-py314"
            python: "3.14"
            os: windows-latest
            tox_env: "py314"
            use_coverage: true

          # Use separate jobs for different unittest flavors (twisted, asynctest) to ensure proper coverage.
          - name: "ubuntu-py310-unittest-asynctest"
            python: "3.10"
            os: ubuntu-latest
            tox_env: "py310-asynctest"
            use_coverage: true

          - name: "ubuntu-py310-unittest-twisted24"
            python: "3.10"
            os: ubuntu-latest
            tox_env: "py310-twisted24"
            use_coverage: true

          - name: "ubuntu-py310-unittest-twisted25"
            python: "3.10"
            os: ubuntu-latest
            tox_env: "py310-twisted25"
            use_coverage: true

          - name: "ubuntu-py310-lsof-numpy-pexpect"
            python: "3.10"
            os: ubuntu-latest
            tox_env: "py310-lsof-numpy-pexpect"
            use_coverage: true

          - name: "ubuntu-py310-pluggy"
            python: "3.10"
            os: ubuntu-latest
            tox_env: "py310-pluggymain-pylib-xdist"
            xfail: true

          - name: "ubuntu-py310-freeze"
            python: "3.10"
            os: ubuntu-latest
            tox_env: "py310-freeze"
            xfail: true

          - name: "ubuntu-py310-xdist"
            python: "3.10"
            os: ubuntu-latest
            tox_env: "py310-xdist"

          - name: "ubuntu-py311"
            python: "3.11"
            os: ubuntu-latest
            tox_env: "py311"
            use_coverage: true

          - name: "ubuntu-py312"
            python: "3.12"
            os: ubuntu-latest
            tox_env: "py312"
            use_coverage: true

          - name: "ubuntu-py313-pexpect"
            python: "3.13"
            os: ubuntu-latest
            tox_env: "py313-pexpect"
            use_coverage: true
            xfail: true

          - name: "ubuntu-py314"
            python: "3.14"
            os: ubuntu-latest
            tox_env: "py314"
            use_coverage: true

          - name: "ubuntu-pypy3-xdist"
            python: "pypy-3.10"
            os: ubuntu-latest
            tox_env: "pypy3-xdist"


          - name: "macos-py310"
            python: "3.10"
            os: macos-latest
            tox_env: "py310-xdist"
            xfail: true

          - name: "macos-py312"
            python: "3.12"
            os: macos-latest
            tox_env: "py312-xdist"

          - name: "macos-py313"
            python: "3.13"
            os: macos-latest
            tox_env: "py313-xdist"
            xfail: true

          - name: "macos-py314"
            python: "3.14"
            os: macos-latest
            tox_env: "py314-xdist"

          - name: "plugins"
            python: "3.12"
            os: ubuntu-latest
            tox_env: "plugins"


          - name: "doctesting"
            python: "3.10"
            os: ubuntu-latest
            tox_env: "doctesting"
            use_coverage: true

    continue-on-error: ${{ matrix.xfail && true || false }}

    steps:
    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        fetch-depth: 0
        persist-credentials: false

    - name: Download Package
      uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8.0.0
      with:
        name: Packages
        path: dist

    - name: Set up Python ${{ matrix.python }}
      uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
      with:
        python-version: ${{ matrix.python }}
        check-latest: true
        allow-prereleases: true

    - name: Install tox
      run: |
        python -m pip install --upgrade pip
        pip install tox

    - name: Test without coverage
      if: "! matrix.use_coverage"
      shell: bash
      env:
        _PYTEST_TOX_POSARGS_JUNIT: --junitxml=junit.xml
      run: tox run -e ${{ matrix.tox_env }} --installpkg `find dist/*.tar.gz`

    - name: Test with coverage
      if: "matrix.use_coverage"
      shell: bash
      env:
        _PYTEST_TOX_POSARGS_JUNIT: --junitxml=junit.xml
      run: tox run -e ${{ matrix.tox_env }}-coverage --installpkg `find dist/*.tar.gz`

    - name: Upload coverage to Codecov
      if: "matrix.use_coverage"
      uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de
      with:
        fail_ci_if_error: false
        files: ./coverage.xml
        verbose: true

    - name: Upload JUnit report to Codecov
      uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de
      with:
        fail_ci_if_error: false
        files: junit.xml
        report_type: test_results
        verbose: true

  check:  # This job does nothing and is only used for the branch protection
    if: always()

    needs:
    - build

    runs-on: ubuntu-latest

    steps:
    - name: Decide whether the needed jobs succeeded or failed
      uses: re-actors/alls-green@a638d6464689bbb24c325bb3fe9404d63a913030
      with:
        jobs: ${{ toJSON(needs) }}


================================================
FILE: .github/workflows/update-plugin-list.yml
================================================
name: Update Plugin List

on:
  schedule:
    # At 00:00 on Sunday.
    # https://crontab.guru
    - cron: '0 0 * * 0'
  workflow_dispatch:

# Set permissions at the job level.
permissions: {}

jobs:
  update-plugin-list:
    if: github.repository_owner == 'pytest-dev'
    runs-on: ubuntu-latest
    permissions:
      contents: write
      pull-requests: write

    steps:
      - name: Checkout
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
        with:
          fetch-depth: 0
          persist-credentials: false

      - name: Setup Python
        uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
        with:
          python-version: "3.13"

      - name: requests-cache
        uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3
        with:
          path: ~/.cache/pytest-plugin-list/
          key: plugins-http-cache-${{ github.run_id }} # Can use time based key as well
          restore-keys: plugins-http-cache-

      - name: Install tox
        run: |
          python -m pip install --upgrade pip
          pip install tox

      - name: Update Plugin List
        run: tox -e update-plugin-list

      - name: Create Pull Request
        id: pr
        uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0
        with:
          commit-message: '[automated] Update plugin list'
          author: 'pytest bot <pytestbot@users.noreply.github.com>'
          branch: update-plugin-list/patch
          delete-branch: true
          branch-suffix: short-commit-hash
          title: '[automated] Update plugin list'
          body: '[automated] Update plugin list'
          draft: true

      - name: Instruct the maintainers to trigger CI by undrafting the PR
        env:
          GITHUB_TOKEN: ${{ github.token }}
          PULL_REQUEST_NUMBER: ${{ steps.pr.outputs.pull-request-number }}
        run: >-
          gh pr comment
          --body 'Please mark the PR as ready for review to trigger PR checks.'
          --repo '${{ github.repository }}'
          "$PULL_REQUEST_NUMBER"


================================================
FILE: .gitignore
================================================
# Automatically generated by `hgimportsvn`
.svn
.hgsvn

# Ignore local virtualenvs
lib/
bin/
include/
.Python/

# These lines are suggested according to the svn:ignore property
# Feel free to enable them by uncommenting them
*.pyc
*.pyo
*.swp
*.class
*.orig
*~
.hypothesis/

# autogenerated
src/_pytest/_version.py
# setuptools
.eggs/

doc/*/_build
doc/*/.doctrees
build/
dist/
*.egg-info
htmlcov/
issue/
env/
.env/
.venv/
/pythonenv*/
3rdparty/
.tox
.cache
.pytest_cache
.mypy_cache
.coverage
.coverage.*
coverage.xml
.ropeproject
.idea
.hypothesis
.pydevproject
.project
.settings
.vscode
__pycache__/
.python-version
.claude/settings.local.json

# generated by pip
pip-wheel-metadata/

# pytest debug logs generated via --debug
pytestdebug.log


================================================
FILE: .mailmap
================================================
Freya Bruhin <git@the-compiler.org>
Freya Bruhin <me@the-compiler.org>


================================================
FILE: .pre-commit-config.yaml
================================================
minimum_pre_commit_version: "4.4.0"
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
  rev: "v0.14.14"
  hooks:
    - id: ruff-check
      args: ["--fix"]
    - id: ruff-format
-   repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v6.0.0
    hooks:
    -   id: trailing-whitespace
    -   id: end-of-file-fixer
    -   id: check-yaml
- repo: https://github.com/woodruffw/zizmor-pre-commit
  rev: v1.22.0
  hooks:
    - id: zizmor
      args: ["--fix", "--no-progress"]
-   repo: https://github.com/adamchainz/blacken-docs
    rev: 1.20.0
    hooks:
    -   id: blacken-docs
        additional_dependencies: [black==24.1.1]
-   repo: https://github.com/codespell-project/codespell
    rev: v2.4.1
    hooks:
    -   id: codespell
        args: ["--toml=pyproject.toml"]
        additional_dependencies:
          - tomli
-   repo: https://github.com/pre-commit/pygrep-hooks
    rev: v1.10.0
    hooks:
    -   id: python-use-type-annotations
-   repo: https://github.com/pre-commit/mirrors-mypy
    rev: v1.19.1
    hooks:
    -   id: mypy
        files: ^(src/|testing/|scripts/)
        additional_dependencies:
          - iniconfig>=1.1.0
          - attrs>=19.2.0
          - pluggy>=1.5.0
          - packaging
          - tomli
          - types-setuptools
          - types-tabulate
            # for mypy running on python>=3.11 since exceptiongroup is only a dependency
            # on <3.11
          - exceptiongroup>=1.0.0rc8
-   repo: https://github.com/RobertCraigie/pyright-python
    rev: v1.1.408
    hooks:
    -   id: pyright
        files: ^(src/|scripts/)
        additional_dependencies:
          - iniconfig>=1.1.0
          - attrs>=19.2.0
          - pluggy>=1.5.0
          - packaging
          - tomli
          - types-setuptools
          - types-tabulate
            # for mypy running on python>=3.11 since exceptiongroup is only a dependency
            # on <3.11
          - exceptiongroup>=1.0.0rc8
        # Manual because passing pyright is a work in progress.
        stages: [manual]
- repo: https://github.com/tox-dev/pyproject-fmt
  rev: "v2.12.1"
  hooks:
    - id: pyproject-fmt
      # https://pyproject-fmt.readthedocs.io/en/latest/#calculating-max-supported-python-version
      additional_dependencies: ["tox>=4.9"]
-   repo: https://github.com/asottile/pyupgrade
    rev: v3.21.2
    hooks:
    -   id: pyupgrade
        args:
          - "--py310-plus"
        # Manual because ruff does what pyupgrade does and the two are not out of sync
        # often enough to make launching pyupgrade everytime worth it
        stages: [manual]
-   repo: local
    hooks:
    -   id: pylint
        name: pylint
        entry: pylint
        language: unsupported
        types: [python]
        args: ["-rn", "-sn", "--fail-on=I", "--enable-all-extentions"]
        require_serial: true
        stages: [manual]
    -   id: rst
        name: rst
        entry: rst-lint
        files: ^(RELEASING.rst|README.rst|TIDELIFT.rst)$
        language: python
        additional_dependencies: [pygments, restructuredtext_lint>=2.0.0]
    -   id: changelogs-rst
        name: changelog filenames
        language: fail
        entry: >-
          changelog files must be named
          ####.(
          breaking
          | deprecation
          | feature
          | improvement
          | bugfix
          | vendor
          | doc
          | packaging
          | contrib
          | misc
          )(.#)?(.rst)?
        exclude: >-
          (?x)
          ^
            changelog/(
              \.gitignore
              |\d+\.(
                breaking
                |deprecation
                |feature
                |improvement
                |bugfix
                |vendor
                |doc
                |packaging
                |contrib
                |misc
              )(\.\d+)?(\.rst)?
              |README\.rst
              |_template\.rst
            )
          $
        files: ^changelog/
    -   id: changelogs-user-role
        name: Changelog files should use a non-broken :user:`name` role
        language: pygrep
        entry: :user:([^`]+`?|`[^`]+[\s,])
        pass_filenames: true
        types:
          - file
          - rst
    -   id: py-deprecated
        name: py library is deprecated
        language: pygrep
        entry: >
            (?x)\bpy\.(
                _code\.|
                builtin\.|
                code\.|
                io\.|
                path\.local\.sysfind|
                process\.|
                std\.|
                error\.|
                xml\.
            )
        types: [python]
    -   id: py-path-deprecated
        name: py.path usage is deprecated
        exclude: docs|src/_pytest/deprecated.py|testing/deprecated_test.py|src/_pytest/legacypath.py
        language: pygrep
        entry: \bpy\.path\.local
        types: [python]


================================================
FILE: .readthedocs.yaml
================================================
version: 2

python:
   install:
     # Install pytest first, then doc/en/requirements.txt.
     # This order is important to honor any pins in doc/en/requirements.txt
     # when the pinned library is also a dependency of pytest.
     - method: pip
       path: .
     - requirements: doc/en/requirements.txt

sphinx:
  configuration: doc/en/conf.py
  fail_on_warning: true

build:
  os: ubuntu-24.04
  tools:
    python: >-
      3.13
  apt_packages:
    - inkscape
  jobs:
    post_checkout:
      - git fetch --unshallow || true
      - git fetch --tags || true

formats:
  - epub
  - pdf
  - htmlzip


================================================
FILE: AUTHORS
================================================
Holger Krekel, holger at merlinux eu
merlinux GmbH, Germany, office at merlinux eu

Contributors include::

Aaron Coleman
Abdeali JK
Abdelrahman Elbehery
Abhijeet Kasurde
Adam Johnson
Adam Stewart
Adam Uhlir
Ahn Ki-Wook
Akhilesh Ramakrishnan
Akiomi Kamakura
Alan Velasco
Alejandro Villate
Alessio Izzo
Alex Jones
Alex Lambson
Alexander Johnson
Alexander King
Alexei Kozlenok
Alice Purcell
Allan Feldman
Aly Sivji
Amir Elkess
Ammar Askar
Anatoly Bubenkoff
Anders Hovmöller
Andras Mitzki
Andras Tim
Andrea Cimatoribus
Andreas Motl
Andreas Zeidler
Andrew Pikul
Andrew Shapton
Andrey Paramonov
Andrzej Klajnert
Andrzej Ostrowski
Andy Freeland
Anita Hammer
Anna Tasiopoulou
Anthon van der Neut
Anthony Shaw
Anthony Sottile
Anton Grinevich
Anton Lodder
Anton Zhilin
Antony Lee
Arel Cordero
Arias Emmanuel
Ariel Pillemer
Armin Rigo
Aron Coyle
Aron Curzon
Arthur Richard
Ashish Kurmi
Ashley Whetter
Aviral Verma
Aviv Palivoda
Babak Keyvani
Bahram Farahmand
Barney Gale
Ben Brown
Ben Gartner
Ben Leith
Ben Webb
Benjamin Peterson
Benjamin Schubert
Bernard Pratz
Bo Wu
Bob Ippolito
Brian Dorsey
Brian Larsen
Brian Maissy
Brian Okken
Brianna Laugher
Bruno Oliveira
Cal Jacobson
Cal Leeming
Carl Friedrich Bolz
Carlos Jenkins
Ceridwen
Charles Cloud
Charles Machalow
Charles-Meldhine Madi Mnemoi (cmnemoi)
Charnjit SiNGH (CCSJ)
Cheuk Ting Ho
Chris Mahoney
Chris Lamb
Chris NeJame
Chris Rose
Chris Wheeler
Christian Boelsen
Christian Clauss
Christian Fetzer
Christian Neumüller
Christian Theunert
Christian Tismer
Christine Mecklenborg
Christoph Buelter
Christopher Dignam
Christopher Gilling
Christopher Head
Claire Cecil
Claudio Madotto
Clément M.T. Robert
Cornelius Riemenschneider
CrazyMerlyn
Cristian Vera
Cyrus Maden
Daara Shaw
Damian Skrzypczak
Daniel Grana
Daniel Hahler
Daniel Miller
Daniel Nuri
Daniel Sánchez Castelló
Daniel Valenzuela Zenteno
Daniel Wandschneider
Daniele Procida
Danielle Jenkins
Daniil Galiev
Dave Hunt
David Díaz-Barquero
David Mohr
David Paul Röthlisberger
David Peled
David Szotten
David Vierra
Daw-Ran Liou
Debi Mishra
Denis Cherednichenko
Denis Kirisov
Denivy Braiam Rück
Deysha Rivera
Dheeraj C K
Dhiren Serai
Diego Russo
Dima Gerasimov
Dmitry Dygalo
Dmitry Pribysh
Dominic Mortlock
Duncan Betts
Edison Gustavo Muenz
Edoardo Batini
Edson Tadeu M. Manoel
Eduardo Schettino
Edward Haigh
Eero Vaher
Eli Boyarski
Elizaveta Shashkova
Éloi Rivard
Emil Hjelm
Endre Galaczi
Eric Hunsberger
Eric Liu
Eric Siegerman
Eric Yuan
Erik Aronesty
Erik Hasse
Erik M. Bray
Ethan Wass
Evan Kepner
Evgeny Seliverstov
Fabian Sturm
Fabien Zarifian
Fabio Zadrozny
Farbod Ahmadian
faph
Felix Hofstätter
Felix Nieuwenhuizen
Feng Ma
Florian Dahlitz
Floris Bruynooghe
Frank Hoffmann
Fraser Stark
Freya Bruhin
Gabriel Landau
Gabriel Reis
Garvit Shubham
Gene Wood
George Kussumoto
Georgy Dyuldin
Gergely Kalmár
Gleb Nikonorov
Graeme Smecher
Graham Horler
Greg Price
Gregory Lee
Grig Gheorghiu
Grigorii Eremeev (budulianin)
Guido Wesdorp
Guoqiang Zhang
Harald Armin Massa
Harshna
Henk-Jaap Wagenaar
Holger Kohr
Hugo van Kemenade
Hui Wang (coldnight)
Ian Bicking
Ian Lesperance
Ilya Konstantinov
Ionuț Turturică
Isaac Virshup
Israel Fruchter
Israël Hallé
Itxaso Aizpurua
Iwan Briquemont
Jaap Broekhuizen
Jake VanderPlas
Jakob van Santen
Jakub Mitoraj
James Bourbeau
James Frost
Jan Balster
Janne Vanhala
Jason R. Coombs
Javier Domingo Cansino
Javier Romero
Jeff Rackauckas
Jeff Widman
Jenni Rinker
Jens Tröger
Jiajun Xu
John Eddie Ayson
John Litborn
John Towler
Jon Parise
Jon Sonesen
Jonas Obrist
Jordan Guymon
Jordan Macdonald
Jordan Moldow
Jordan Speicher
Joseph Hunkeler
Joseph Sawaya
Josh Karpel
Joshua Bronson
Julian Valentin
Junhao Liao
Jurko Gospodnetić
Justice Ndou
Justyna Janczyszyn
Kale Kundert
Kamran Ahmad
Kenny Y
Karl O. Pinc
Karthikeyan Singaravelan
Katarzyna Jachim
Katarzyna Król
Katerina Koukiou
Keri Volans
Kevin C
Kevin Cox
Kevin Hierro Carrasco
Kevin J. Foley
Kian Eliasi
Kian-Meng Ang
Kim Soo
Kodi B. Arfer
Kojo Idrissa
Kostis Anagnostopoulos
Kristoffer Nordström
Kyle Altendorf
Lawrence Mitchell
Lee Kamentsky
Leonardus Chen
Lev Maximov
Levon Saldamli
Lewis Cowles
Liam DeVoe
Llandy Riveron Del Risco
Loic Esteve
lovetheguitar
Lukas Bednar
Luke Murphy
Maciek Fijalkowski
Maggie Chung
Maho
Maik Figura
Mandeep Bhutani
Manuel Krebber
Marc Mueller
Marc Schlaich
Marcelo Duarte Trevisani
Marcin Augustynów
Marcin Bachry
Marc Bresson
Marco Gorelli
Marcos Boger
Mark Abramowitz
Mark Dickinson
Mark Vong
Marko Pacak
Markus Unterwaditzer
Martijn Faassen
Martin Altmayer
Martin K. Scherer
Martin Prusse
Mathieu Clabaut
Matt Bachmann
Matt Duck
Matt Williams
Matthias Hafner
Maxim Filipenko
Maximilian Cosmo Sitter
mbyt
Michael Aquilina
Michael Birtwell
Michael Droettboom
Michael Goerz
Michael Krebs
Michael Seifert
Michael Vogt
Michael Reznik
Michal Wajszczuk
Michał Górny
Michał Zięba
Mickey Pashov
Mihai Capotă
Mihail Milushev
Mike Hoyle (hoylemd)
Mike Lundy
Milan Lesnek
Miro Hrončok
Mulat Mekonen
mrbean-bremen
Nathan Goldbaum
Nathan Rousseau
Nathaniel Compton
Nathaniel Waisbrot
Nauman Ahmed
Ned Batchelder
Neil Martin
Neven Mundar
Nicholas Devenish
Nicholas Murphy
Niclas Olofsson
Nicolas Delaby
Nicolas Simonds
Nico Vidal
Nikesh Chavhan
Nikolay Kondratyev
Nipunn Koorapati
Oleg Pidsadnyi
Oleg Sushchenko
Oleksandr Zavertniev
Olga Matoula
Oliver Bestwalter
Olivier Grisel
Omar Kohl
Omer Hadari
Omri Golan
Ondřej Súkup
Oscar Benjamin
Parth Patel
Patrick Hayes
Patrick Lannigan
Paul Müller
Paul Reece
Pauli Virtanen
Pavel Karateev
Pavel Zhukov
Paweł Adamczak
Pedro Algarvio
Peter Gessler
Petter Strandmark
Philipp Loose
Pierre Sassoulas
Pieter Mulder
Piotr Banaszkiewicz
Piotr Helm
Poulami Sau
Prakhar Gurunani
Prashant Anand
Prashant Sharma
Pulkit Goyal
Punyashloka Biswal
Quentin Pradet
q0w
Ralf Schmitt
Ralph Giles
Ram Rachum
Ran Benita
Randy Döring
Raphael Castaneda
Raphael Pierzina
Rafal Semik
Reza Mousavi
Raquel Alegre
Ravi Chandra
Reagan Lee
Reilly Brogan
Rob Arrow
Robert Holt
Roberto Aldera
Roberto Polli
Roland Puntaier
Romain Dorgueil
Roman Bolshakov
Ronny Pfannschmidt
Ross Lawley
Ruaridh Williamson
Russel Winder
Russell Martin
Ryan Puddephatt
Ryan Wooden
Sadra Barikbin
Saiprasad Kale
Samuel Colvin
Samuel Dion-Girardeau
Samuel Gaist
Samuel Jirovec
Samuel Searles-Bryant
Samuel Therrien (Avasam)
Samuele Pedroni
Sanket Duthade
Sankt Petersbug
Saravanan Padmanaban
Sean Malloy
Segev Finer
Serhii Mozghovyi
Seth Junot
Shantanu Jain
Sharad Nair
Shaygan Hooshyari
Shubham Adep
Simon Blanchard
Simon Gomizelj
Simon Holesch
Simon Kerr
Skylar Downes
Srinivas Reddy Thatiparthy
Stefaan Lippens
Stefan Farmbauer
Stefan Scherfke
Stefan Zimmermann
Stefanie Molin
Stefano Taschini
Steffen Allner
Stephan Obermann
Sven
Sven-Hendrik Haase
Sviatoslav Sydorenko
Sylvain Marié
Tadek Teleżyński
Takafumi Arakaki
Takumi Otani
Taneli Hukkinen
Tanvi Mehta
Tanya Agarwal
Tarcisio Fischer
Tareq Alayan
Tatiana Ovary
Ted Xiao
Terje Runde
Thomas Grainger
Thomas Hisch
Tianyu Dongfang
Tim Hoffmann
Tim Strazny
TJ Bruno
Tobias Diez
Tobias Petersen
Tom Dalton
Tom Most
Tom Viner
Tomáš Gavenčiak
Tomer Keren
Tony Narlock
Tor Colvin
Trevor Bekolay
Tushar Sadhwani
Tyler Goodlet
Tyler Smart
Tzu-ping Chung
Vasily Kuznetsov
Victor Maryama
Victor Rodriguez
Victor Uriarte
Vidar T. Fauske
Vijay Arora
Virendra Patil
Virgil Dupras
Vitaly Lashmanov
Vivaan Verma
Vlad Dragos
Vlad Radziuk
Vladyslav Rachek
Volodymyr Kochetkov
Volodymyr Piskun
Wei Lin
Wil Cooley
Will Riley
William Lee
Wim Glenn
Wouter van Ackooy
Xixi Zhao
Xuan Luong
Xuecong Liao
Yannick Péroux
Yao Xiao
Yoav Caspi
Yuliang Shao
Yusuke Kadowaki
Yutian Li
Yuval Shimon
Zac Hatfield-Dodds
Zac Palmer Laporte
Zach Snicker
Zachary Kneupper
Zachary OBrien
Zhouxin Qiu
Zoltán Máté
Zsolt Cserna


================================================
FILE: CHANGELOG.rst
================================================
=========
Changelog
=========

The pytest CHANGELOG is located `here <https://docs.pytest.org/en/stable/changelog.html>`__.

The source document can be found at: https://github.com/pytest-dev/pytest/blob/main/doc/en/changelog.rst


================================================
FILE: CITATION
================================================
NOTE: Change "x.y" by the version you use. If you are unsure about which version
you are using run: `pip show pytest`. Do not include the patch number (i.e., z in x.y.z)

Text:

[pytest] pytest x.y, 2004
Krekel et al., https://github.com/pytest-dev/pytest

BibLaTeX:

@software{pytest,
  title        = {pytest x.y},
  author       = {Holger Krekel and Bruno Oliveira and Ronny Pfannschmidt and Floris Bruynooghe and Brianna Laugher and Freya Bruhin},
  year         = {2004},
  version      = {x.y},
  url          = {https://github.com/pytest-dev/pytest},
  note         = {Contributors: Holger Krekel and Bruno Oliveira and Ronny Pfannschmidt and Floris Bruynooghe and Brianna Laugher and Freya Bruhin and others}
}

BibTeX:

@misc{pytest,
  author       = {Holger Krekel and Bruno Oliveira and Ronny Pfannschmidt and Floris Bruynooghe and Brianna Laugher and Freya Bruhin},
  title        = {pytest x.y},
  year         = {2004},
  howpublished = {\url{https://github.com/pytest-dev/pytest}},
  note         = {Version x.y. Contributors include Holger Krekel, Bruno Oliveira, Ronny Pfannschmidt, Floris Bruynooghe, Brianna Laugher, Freya Bruhin, and others.}
}


================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct

## Our Pledge

In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, sex characteristics, gender identity and expression,
level of experience, education, socio-economic status, nationality, personal
appearance, race, religion, or sexual identity and orientation.

## Our Standards

Examples of behavior that contributes to creating a positive environment
include:

* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members

Examples of unacceptable behavior by participants include:

* The use of sexualized language or imagery and unwelcome sexual attention or
 advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
 address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
 professional setting

## Our Responsibilities

Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.

## Scope

This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at coc@pytest.org. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.

Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.

The coc@pytest.org address is routed to the following people who can also be
contacted individually:

- Brianna Laugher ([@pfctdayelise](https://github.com/pfctdayelise)): brianna@laugher.id.au
- Bruno Oliveira ([@nicoddemus](https://github.com/nicoddemus)): nicoddemus@gmail.com
- Freya Bruhin ([@the-compiler](https://github.com/the-compiler)): pytest@the-compiler.org

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html

[homepage]: https://www.contributor-covenant.org

For answers to common questions about this code of conduct, see
https://www.contributor-covenant.org/faq


================================================
FILE: CONTRIBUTING.rst
================================================
============================
Contributing
============================

Contributions are highly welcomed and appreciated.  Every little bit of help counts,
so do not hesitate!


.. _submitfeedback:

Feature requests and feedback
-----------------------------

Do you like pytest?  Share some love on Twitter or in your blog posts!

We'd also like to hear about your propositions and suggestions.  Feel free to
`submit them as issues <https://github.com/pytest-dev/pytest/issues>`_ and:

* Explain in detail how they should work.
* Keep the scope as narrow as possible.  This will make it easier to implement.


.. _reportbugs:

Report bugs
-----------

Report bugs for pytest in the `issue tracker <https://github.com/pytest-dev/pytest/issues>`_.

If you are reporting a bug, please include:

* Your operating system name and version.
* Any details about your local setup that might be helpful in troubleshooting,
  specifically the Python interpreter version, installed libraries, and pytest
  version.
* Detailed steps to reproduce the bug.

If you can write a demonstration test that currently fails but should pass
(xfail), that is a very useful commit to make as well, even if you cannot
fix the bug itself.


.. _fixbugs:

Fix bugs
--------

Look through the `GitHub issues for bugs <https://github.com/pytest-dev/pytest/labels/type:%20bug>`_.
See also the `"good first issue" issues <https://github.com/pytest-dev/pytest/labels/good%20first%20issue>`_
that are friendly to new contributors.

`Talk to developers <https://docs.pytest.org/en/stable/contact.html>`_ to find out how you can fix specific bugs. To indicate that you are going
to work on a particular issue, add a comment to that effect on the specific issue.

Don't forget to check the issue trackers of your favourite plugins, too!

.. _writeplugins:

Implement features
------------------

Look through the `GitHub issues for enhancements <https://github.com/pytest-dev/pytest/labels/type:%20enhancement>`_.

`Talk to developers <https://docs.pytest.org/en/stable/contact.html>`_ to find out how you can implement specific
features.

Write documentation
-------------------

Pytest could always use more documentation.  What exactly is needed?

* More complementary documentation.  Have you perhaps found something unclear?
* Documentation translations.  We currently have only English.
* Docstrings.  There can never be too many of them.
* Blog posts, articles and such -- they're all very appreciated.

You can also edit documentation files directly in the GitHub web interface,
without using a local copy.  This can be convenient for small fixes.

.. note::
    Build the documentation locally with the following command:

    .. code:: bash

        $ tox -e docs

    The built documentation should be available in ``doc/en/_build/html``,
    where 'en' refers to the documentation language.

Pytest has an API reference which in large part is
`generated automatically <https://www.sphinx-doc.org/en/master/usage/extensions/autodoc.html>`_
from the docstrings of the documented items. Pytest uses the
`Sphinx docstring format <https://sphinx-rtd-tutorial.readthedocs.io/en/latest/docstrings.html>`_.
For example:

.. code-block:: python

    def my_function(arg: ArgType) -> Foo:
        """Do important stuff.

        More detailed info here, in separate paragraphs from the subject line.
        Use proper sentences -- start sentences with capital letters and end
        with periods.

        Can include annotated documentation:

        :param short_arg: An argument which determines stuff.
        :param long_arg:
            A long explanation which spans multiple lines, overflows
            like this.
        :returns: The result.
        :raises ValueError:
            Detailed information when this can happen.

        .. versionadded:: 6.0

        Including types into the annotations above is not necessary when
        type-hinting is being used (as in this example).
        """


.. _submitplugin:

Submitting Plugins to pytest-dev
--------------------------------

Development of the pytest core, support code, and some plugins happens
in repositories living under the ``pytest-dev`` organisations:

- `pytest-dev on GitHub <https://github.com/pytest-dev>`_

All pytest-dev Contributors team members have write access to all contained
repositories.  Pytest core and plugins are generally developed
using `pull requests`_ to respective repositories.

The objectives of the ``pytest-dev`` organisation are:

* Having a central location for popular pytest plugins
* Sharing some of the maintenance responsibility (in case a maintainer no
  longer wishes to maintain a plugin)

You can submit your plugin by posting a new topic in the `pytest-dev GitHub Discussions
<https://github.com/pytest-dev/pytest/discussions>`_ pointing to your existing pytest plugin repository which must have
the following:

- PyPI presence with packaging metadata that contains a ``pytest-``
  prefixed name, version number, authors, short and long description.

- a `tox configuration <https://tox.readthedocs.io/en/latest/config.html#configuration-discovery>`_
  for running tests using `tox <https://tox.readthedocs.io>`_.

- a ``README`` describing how to use the plugin and on which
  platforms it runs.

- a ``LICENSE`` file containing the licensing information, with
  matching info in its packaging metadata.

- an issue tracker for bug reports and enhancement requests.

- a `changelog <https://keepachangelog.com/>`_.

If no contributor strongly objects and two agree, the repository can then be
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
releases of your repository or take ownership in any way, except in rare cases
where someone becomes unresponsive after months of contact attempts.
As stated, the objective is to share maintenance and avoid "plugin-abandon".


.. _ai-contributions:

AI/LLM-Assisted Contributions Policy
-------------------------------------

We welcome contributions from all developers, including those who use AI/LLM tools
as part of their workflow. However, we have requirements to protect the time
and effort of our reviewers:

**Purely agentic contributions are not accepted.** Pull requests that are entirely
generated by AI agents, with no meaningful human review, understanding, or oversight,
will be closed. Every contribution must demonstrate that a human has reviewed,
understood, and taken responsibility for the changes. If you submit it, you own it.

**You are responsible for your contribution.** Regardless of how the code was
produced, the person submitting a pull request must understand the changes and be
able to respond to review feedback. If a reviewer asks questions or requests changes,
they expect to interact with someone who can engage substantively, not an automated
loop replaying prompts.

**Credit AI tools via attribution.** If AI agents helped produce your code or
commits, consider adding ``Co-authored-by`` trailers to your commit messages to
credit them. This is not required, but helps reviewers set expectations and is
appreciated.

**Respect maintainer time.** Submitting low-effort AI-generated pull requests that
waste reviewer time may result in a ban from the project. Our maintainers are
volunteers, and contributions should reflect genuine engagement with the project.


Context
~~~~~~~

With the advent of unsupervised agentic tools like OpenClaw,
there has been a rise in low-quality contributions
where an agent produces a large number of low-quality pull requests.
Oftentimes this can look similar to a human beginner with new access to tools
and trying to learn, but in practice it is usually an unsupervised agentic tool
generating changes without meaningful human review.

When a human contributor is learning, we are glad to invest time to help,
give feedback, and guide them in the right direction. With fully agentic,
unsupervised tools, that same review effort does not support anyone's learning
or growth. Instead, it diverts limited maintainer time away from improving the
project and supporting engaged contributors.

There is also an asymmetry at play: someone is prioritizing what we review
without making an equivalent investment of time or effort.
When a contributor works on an issue themselves, they invest real time, effectively
earning influence over what the project focuses on. Unsupervised agentic contributions
expect to set that priority at near-zero cost to the sender, while shifting the
entire burden onto maintainers.

Fully agentic contributions invert the intended benefit of these tools: rather than
saving time, they create avoidable review and triage work. There is no accountable
human author thoughtfully iterating on feedback, only automated output driven
by prompts.

From our own experience using coding agents, we know they must be carefully prompted,
supervised, and checked by humans. Even modern models can make serious mistakes when
operating at framework or tooling level, and those mistakes can be subtle and
time-consuming to diagnose.

Running such tools unsupervised on open-source projects imposes this cost on
maintainers and other contributors without their consent. Our goal with this policy
is to set clear expectations, protect reviewer time, and ensure that contributions
remain collaborative, respectful, and sustainable.


.. _`pull requests`:
.. _pull-requests:

Preparing Pull Requests
-----------------------

Short version
~~~~~~~~~~~~~

#. Fork the repository.
#. Fetch tags from upstream if necessary (if you cloned only main `git fetch --tags https://github.com/pytest-dev/pytest`).
#. Enable and install `pre-commit <https://pre-commit.com>`_ to ensure style-guides and code checks are followed.
#. Follow `PEP-8 <https://www.python.org/dev/peps/pep-0008/>`_ for naming.
#. Tests are run using ``tox``::

    tox -e linting,py313

   The test environments above are usually enough to cover most cases locally.

#. Write a ``changelog`` entry: ``changelog/2574.bugfix.rst``, use issue id number
   and one of ``feature``, ``improvement``, ``bugfix``, ``doc``, ``deprecation``,
   ``breaking``, ``vendor``, ``packaging``, ``contrib``, or ``misc`` 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.


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>`_.
Once you send a pull request, we can discuss its potential modifications and
even add more commits to it later on. There's an excellent tutorial on how Pull
Requests work in the
`GitHub Help Center <https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests>`_.

Here is a simple overview, with pytest-specific bits:

#. Fork the
   `pytest GitHub repository <https://github.com/pytest-dev/pytest>`__.  It'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
    $ git fetch --tags https://github.com/pytest-dev/pytest
    # now, create your own branch off "main":

        $ git checkout -b your-bugfix-branch-name main

   Given we have "major.minor.micro" version numbers, bug fixes will usually
   be released in micro releases whereas features will be released in
   minor releases and incompatible changes in major releases.

   You will need the tags to test locally, so be sure you have the tags from the main repository. If you suspect you don't, set the main repository as upstream and fetch the tags::

     $ git remote add upstream https://github.com/pytest-dev/pytest
     $ git fetch upstream --tags

   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 https://virtualenv.pypa.io/en/latest/)::

    $ pip install tox

#. Run all the tests

   You need to have a supported Python version available in your system.  Now
   running tests is as simple as issuing this command::

    $ tox -e linting,py

   This command will run tests via the "tox" tool against your default Python
   version and also perform "lint" coding-style checks.

#. You can now edit your local working copy and run the tests again as necessary. Please follow `PEP-8 <https://www.python.org/dev/peps/pep-0008/>`_ for naming.

   You can pass different options to ``tox``. For example, to run tests on Python 3.13 and pass options to pytest
   (e.g. enter pdb on failure) you can do::

    $ tox -e py313 -- --pdb

   Or to only run tests in a particular test module on Python 3.12::

    $ tox -e py312 -- testing/test_config.py


   When committing, ``pre-commit`` will re-format the files if necessary.

#. If instead of using ``tox`` you prefer to run the tests directly, then we suggest to create a virtual environment and use
   an editable install with the ``dev`` extra::

       $ python3 -m venv .venv
       $ source .venv/bin/activate  # Linux
       $ .venv/Scripts/activate.bat  # Windows
       $ pip install -e ".[dev]"

   Afterwards, you can edit the files and run pytest normally::

       $ pytest testing/test_config.py

#. Create a new changelog entry in ``changelog``. The file should be named ``<issueid>.<type>.rst``,
   where *issueid* is the number of the issue related to the change and *type* is one of
   ``feature``, ``improvement``, ``bugfix``, ``doc``, ``deprecation``, ``breaking``, ``vendor``,
   ``packaging``, ``contrib``, or ``misc``.
   You may skip creating the changelog entry if the change doesn't affect the
   documented behaviour of pytest.

#. Add yourself to ``AUTHORS`` file if not there yet, in alphabetical order.

#. Commit and push once your tests pass and you are happy with your change(s)::

    $ git commit -a -m "<commit message>"
    $ git push -u

#. Finally, submit a pull request through the GitHub website using this data::

    head-fork: YOUR_GITHUB_USERNAME/pytest
    compare: your-branch-name

    base-fork: pytest-dev/pytest
    base: main


Writing Tests
~~~~~~~~~~~~~

Writing tests for plugins or for pytest itself is often done using the `pytester fixture <https://docs.pytest.org/en/stable/reference/reference.html#pytester>`_, as a "black-box" test.

For example, to ensure a simple test passes you can write:

.. code-block:: python

    def test_true_assertion(pytester):
        pytester.makepyfile(
            """
            def test_foo():
                assert True
        """
        )
        result = pytester.runpytest()
        result.assert_outcomes(failed=0, passed=1)


Alternatively, it is possible to make checks based on the actual output of the terminal using
*glob-like* expressions:

.. code-block:: python

    def test_true_assertion(pytester):
        pytester.makepyfile(
            """
            def test_foo():
                assert False
        """
        )
        result = pytester.runpytest()
        result.stdout.fnmatch_lines(["*assert False*", "*1 failed*"])

When choosing a file where to write a new test, take a look at the existing files and see if there's
one file which looks like a good fit. For example, a regression test about a bug in the ``--lf`` option
should go into ``test_cacheprovider.py``, given that this option is implemented in ``cacheprovider.py``.
If in doubt, go ahead and open a PR with your best guess and we can discuss this over the code.

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 there is any change in your contribution workflow:
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.


Merge/squash guidelines
-----------------------

When a PR is approved and ready to be integrated to the ``main`` branch, one has the option to *merge* the commits unchanged, or *squash* all the commits into a single commit.

Here are some guidelines on how to proceed, based on examples of a single PR commit history:

1. Miscellaneous commits:

   * ``Implement X``
   * ``Fix test_a``
   * ``Add myself to AUTHORS``
   * ``fixup! Fix test_a``
   * ``Update tests/test_integration.py``
   * ``Merge origin/main into PR branch``
   * ``Update tests/test_integration.py``

   In this case, prefer to use the **Squash** merge strategy: the commit history is a bit messy (not in a derogatory way, often one just commits changes because they know the changes will eventually be squashed together), so squashing everything into a single commit is best. You must clean up the commit message, making sure it contains useful details.

2. Separate commits related to the same topic:

   * ``Implement X``
   * ``Add myself to AUTHORS``
   * ``Update CHANGELOG for X``

   In this case, prefer to use the **Squash** merge strategy: while the commit history is not "messy" as in the example above, the individual commits do not bring much value overall, specially when looking at the changes a few months/years down the line.

3. Separate commits, each with their own topic (refactorings, renames, etc), but still have a larger topic/purpose.

   * ``Refactor class X in preparation for feature Y``
   * ``Remove unused method``
   * ``Implement feature Y``

   In this case, prefer to use the **Merge** strategy: each commit is valuable on its own, even if they serve a common topic overall. Looking at the history later, it is useful to have the removal of the unused method separately on its own commit, along with more information (such as how it became unused in the first place).

4. Separate commits, each with their own topic, but without a larger topic/purpose other than improve the code base (using more modern techniques, improve typing, removing clutter, etc).

   * ``Improve internal names in X``
   * ``Add type annotations to Y``
   * ``Remove unnecessary dict access``
   * ``Remove unreachable code due to EOL Python``

   In this case, prefer to use the **Merge** strategy: each commit is valuable on its own, and the information on each is valuable in the long term.


As mentioned, those are overall guidelines, not rules cast in stone. This topic was discussed in `#12633 <https://github.com/pytest-dev/pytest/discussions/12633>`_.


*Backport PRs* (as those created automatically from a ``backport`` label) should always be **squashed**, as they preserve the original PR author.


Backporting bug fixes for the next patch release
------------------------------------------------

Pytest makes a feature release every few weeks or months. In between, patch releases
are made to the previous feature release, containing bug fixes only. The bug fixes
usually fix regressions, but may be any change that should reach users before the
next feature release.

Suppose for example that the latest release was 1.2.3, and you want to include
a bug fix in 1.2.4 (check https://github.com/pytest-dev/pytest/releases for the
actual latest release). The procedure for this is:

#. First, make sure the bug is fixed in the ``main`` branch, with a regular pull
   request, as described above. An exception to this is if the bug fix is not
   applicable to ``main`` anymore.

Automatic method:

Add a ``backport 1.2.x`` label to the PR you want to backport. This will create
a backport PR against the ``1.2.x`` branch.

Manual method:

#. ``git checkout origin/1.2.x -b backport-XXXX`` # use the main PR number here

#. Locate the merge commit on the PR, in the *merged* message, for example:

    nicoddemus merged commit 0f8b462 into pytest-dev:main

#. ``git cherry-pick -x -m1 REVISION`` # use the revision you found above (``0f8b462``).

#. Open a PR targeting ``1.2.x``:

   * Prefix the message with ``[1.2.x]``.
   * Delete the PR body, it usually contains a duplicate commit message.


Who does the backporting
~~~~~~~~~~~~~~~~~~~~~~~~

As mentioned above, bugs should first be fixed on ``main`` (except in rare occasions
that a bug only happens in a previous release). So, who should do the backport procedure described
above?

1. If the bug was fixed by a core developer, it is the main responsibility of that core developer
   to do the backport.
2. However, often the merge is done by another maintainer, in which case it is nice of them to
   do the backport procedure if they have the time.
3. For bugs submitted by non-maintainers, it is expected that a core developer will do
   the backport, normally the one that merged the PR on ``main``.
4. If a non-maintainer notices a bug which is fixed on ``main`` but has not been backported
   (due to maintainers forgetting to apply the *needs backport* or *backport x.x.x* labels, or just plain missing it),
   they are also welcome to open a PR with the backport. The procedure is simple and really
   helps with the maintenance of the project.

All the above are not rules, but merely some guidelines/suggestions on what we should expect
about backports.

Backports should be **squashed** (rather than **merged**), as doing so preserves the original PR author correctly.

Handling stale issues/PRs
-------------------------

Stale issues/PRs are those where pytest contributors have asked for questions/changes
and the authors didn't get around to answer/implement them yet after a somewhat long time, or
the discussion simply died because people seemed to lose interest.

There are many reasons why people don't answer questions or implement requested changes:
they might get busy, lose interest, or just forget about it,
but the fact is that this is very common in open source software.

The pytest team really appreciates every issue and pull request, but being a high-volume project
with many issues and pull requests being submitted daily, we try to reduce the number of stale
issues and PRs by regularly closing them. When an issue/pull request is closed in this manner,
it is by no means a dismissal of the topic being tackled by the issue/pull request, but it
is just a way for us to clear up the queue and make the maintainers' work more manageable. Submitters
can always reopen the issue/pull request in their own time later if it makes sense.

When to close
~~~~~~~~~~~~~

Here are a few general rules the maintainers use to decide when to close issues/PRs because
of lack of inactivity:

* Issues labeled ``question`` or ``needs information``: closed after 14 days inactive.
* Issues labeled ``proposal``: closed after six months inactive.
* Pull requests: after one month, consider pinging the author, update linked issue, or consider closing. For pull requests which are nearly finished, the team should consider finishing it up and merging it.

The above are **not hard rules**, but merely **guidelines**, and can be (and often are!) reviewed on a case-by-case basis.

Closing pull requests
~~~~~~~~~~~~~~~~~~~~~

When closing a Pull Request, we should acknowledge the time, effort, and interest demonstrated by the person who submitted it. As mentioned previously, it is not the intent of the team to dismiss a stalled pull request entirely but to merely to clear up our queue, so a message like the one below is warranted when closing a pull request that went stale:

    Hi <contributor>,

    First of all, we would like to thank you for your time and effort on working on this, the pytest team deeply appreciates it.

    We noticed it has been awhile since you have updated this PR, however. pytest is a high activity project, with many issues/PRs being opened daily, so it is hard for us maintainers to track which PRs are ready for merging, for review, or need more attention.

    So for those reasons, we think it is best to close the PR for now, but with the only intention to clean up our queue, it is by no means a rejection of your changes. We still encourage you to re-open this PR (it is just a click of a button away) when you are ready to get back to it.

    Again we appreciate your time for working on this, and hope you might get back to this at a later time!

    <bye>

Closing issues
--------------

When a pull request is submitted to fix an issue, add text like ``closes #XYZW`` to the PR description and/or commits (where ``XYZW`` is the issue number). See the `GitHub docs <https://help.github.com/en/github/managing-your-work-on-github/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword>`_ for more information.

When an issue is due to user error (e.g. misunderstanding of a functionality), please politely explain to the user why the issue raised is really a non-issue and ask them to close the issue if they have no further questions. If the original requester is unresponsive, the issue will be handled as described in the section `Handling stale issues/PRs`_ above.


================================================
FILE: LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2004 Holger Krekel and others

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: OPENCOLLECTIVE.rst
================================================
==============
OpenCollective
==============

pytest has a collective setup at `OpenCollective`_. This document describes how the core team manages
OpenCollective-related activities.

What is it
==========

Open Collective is an online funding platform for open and transparent communities.
It provides tools to raise money and share your finances in full transparency.

It is the platform of choice for individuals and companies that want to make one-time or
monthly donations directly to the project.

Funds
=====

The OpenCollective funds donated to pytest will be used to fund overall maintenance,
local sprints, merchandising (stickers to distribute in conferences for example), and future
gatherings of pytest developers (sprints).

`Core contributors`_ which are contributing on a continuous basis are free to submit invoices
to bill maintenance hours using the platform. How much each contributor should request is still an
open question, but we should use common sense and trust in the contributors, most of which know
themselves in-person. A good rule of thumb is to bill the same amount as monthly payments
contributors which participate in the `Tidelift`_ subscription. If in doubt, just ask.

Admins
======

A few people have admin access to the OpenCollective dashboard to make changes. Those people
are part of the `@pytest-dev/opencollective-admins`_ team.

`Core contributors`_ interested in helping out with OpenCollective maintenance are welcome! We don't
expect much work here other than the occasional approval of expenses from other core contributors.
Just drop a line to one of the `@pytest-dev/opencollective-admins`_ or use the mailing list.


.. _`OpenCollective`: https://opencollective.com/pytest
.. _`Tidelift`: https://tidelift.com
.. _`core contributors`: https://github.com/orgs/pytest-dev/teams/core/members
.. _`@pytest-dev/opencollective-admins`: https://github.com/orgs/pytest-dev/teams/opencollective-admins/members


================================================
FILE: README.rst
================================================
.. image:: https://github.com/pytest-dev/pytest/raw/main/doc/en/img/pytest_logo_curves.svg
   :target: https://docs.pytest.org/en/stable/
   :align: center
   :height: 200
   :alt: pytest


------

.. image:: https://img.shields.io/pypi/v/pytest.svg
    :target: https://pypi.org/project/pytest/

.. 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.org/project/pytest/

.. image:: https://codecov.io/gh/pytest-dev/pytest/branch/main/graph/badge.svg
    :target: https://codecov.io/gh/pytest-dev/pytest
    :alt: Code coverage Status

.. image:: https://github.com/pytest-dev/pytest/actions/workflows/test.yml/badge.svg
    :target: https://github.com/pytest-dev/pytest/actions?query=workflow%3Atest

.. image:: https://results.pre-commit.ci/badge/github/pytest-dev/pytest/main.svg
   :target: https://results.pre-commit.ci/latest/github/pytest-dev/pytest/main
   :alt: pre-commit.ci status

.. image:: https://www.codetriage.com/pytest-dev/pytest/badges/users.svg
    :target: https://www.codetriage.com/pytest-dev/pytest

.. image:: https://readthedocs.org/projects/pytest/badge/?version=latest
    :target: https://pytest.readthedocs.io/en/latest/?badge=latest
    :alt: Documentation Status

.. image:: https://img.shields.io/badge/Discord-pytest--dev-blue
    :target: https://discord.com/invite/pytest-dev
    :alt: Discord

.. image:: https://img.shields.io/badge/Libera%20chat-%23pytest-orange
    :target: https://web.libera.chat/#pytest
    :alt: Libera chat


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 =============================
    collected 1 items

    test_sample.py F

    ================================== FAILURES ===================================
    _________________________________ test_answer _________________________________

        def test_answer():
    >       assert inc(3) == 5
    E       assert 4 == 5
    E        +  where 4 = inc(3)

    test_sample.py:5: AssertionError
    ========================== 1 failed in 0.04 seconds ===========================


Thanks to ``pytest``'s detailed assertion introspection, you can simply use plain ``assert`` statements. See `getting-started <https://docs.pytest.org/en/stable/getting-started.html#our-first-test-run>`_ for more examples.


Features
--------

- Detailed info on failing `assert statements <https://docs.pytest.org/en/stable/how-to/assert.html>`_ (no need to remember ``self.assert*`` names)

- `Auto-discovery
  <https://docs.pytest.org/en/stable/explanation/goodpractices.html#python-test-discovery>`_
  of test modules and functions

- `Modular fixtures <https://docs.pytest.org/en/stable/explanation/fixtures.html>`_ for
  managing small or parametrized long-lived test resources

- Can run `unittest <https://docs.pytest.org/en/stable/how-to/unittest.html>`_ (or trial)
  test suites out of the box

- Python 3.10+ or PyPy3

- Rich plugin architecture, with over 1300+ `external plugins <https://docs.pytest.org/en/latest/reference/plugin_list.html>`_ and thriving community


Documentation
-------------

For full documentation, including installation, tutorials and PDF documents, please see https://docs.pytest.org/en/stable/.


Bugs/Requests
-------------

Please use the `GitHub issue tracker <https://github.com/pytest-dev/pytest/issues>`_ to submit bugs or request features.


Changelog
---------

Consult the `Changelog <https://docs.pytest.org/en/stable/changelog.html>`__ page for fixes and enhancements of each version.


Support pytest
--------------

`Open Collective`_ is an online funding platform for open and transparent communities.
It provides tools to raise money and share your finances in full transparency.

It is the platform of choice for individuals and companies that want to make one-time or
monthly donations directly to the project.

See more details in the `pytest collective`_.

.. _Open Collective: https://opencollective.com
.. _pytest collective: https://opencollective.com/pytest


pytest for enterprise
---------------------

Available as part of the Tidelift Subscription.

The maintainers of pytest and thousands of other packages are working with Tidelift to deliver commercial support and
maintenance for the open source dependencies you use to build your applications.
Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use.

`Learn more. <https://tidelift.com/subscription/pkg/pypi-pytest?utm_source=pypi-pytest&utm_medium=referral&utm_campaign=enterprise&utm_term=repo>`_

Security
^^^^^^^^

pytest has never been associated with a security vulnerability, but in any case, to report a
security vulnerability please use the `Tidelift security contact <https://tidelift.com/security>`_.
Tidelift will coordinate the fix and disclosure.


License
-------

Copyright Holger Krekel and others, 2004.

Distributed under the terms of the `MIT`_ license, pytest is free and open source software.

.. _`MIT`: https://github.com/pytest-dev/pytest/blob/main/LICENSE


================================================
FILE: RELEASING.rst
================================================
Release Procedure
-----------------

Our current policy for releasing is to aim for a bug-fix release every few weeks and a minor release every 2-3 months. The idea
is to get fixes and new features out instead of trying to cram a ton of features into a release and by consequence
taking a lot of time to make a new one.

The git commands assume the following remotes are setup:

* ``origin``: your own fork of the repository.
* ``upstream``: the ``pytest-dev/pytest`` official repository.

Preparing: Automatic Method
~~~~~~~~~~~~~~~~~~~~~~~~~~~

We have developed an automated workflow for releases, that uses GitHub workflows and is triggered
by `manually running <https://docs.github.com/en/actions/managing-workflow-runs/manually-running-a-workflow>`__
the `prepare-release-pr workflow <https://github.com/pytest-dev/pytest/actions/workflows/prepare-release-pr.yml>`__
on GitHub Actions.

The automation will decide the new version number based on the following criteria:

- If the "major release" input is set to "yes", release a new major release
  (e.g. 7.0.0 -> 8.0.0)
- If there are any ``.feature.rst`` or ``.breaking.rst`` files in the
  ``changelog`` directory, release a new minor release (e.g. 7.0.0 -> 7.1.0)
- Otherwise, release a bugfix release (e.g. 7.0.0 -> 7.0.1)
- If the "prerelease" input is set, append the string to the version number
  (e.g. 7.0.0 -> 8.0.0rc1), if "major" is set, and "prerelease" is set to `rc1`)

Bug-fix and minor releases
^^^^^^^^^^^^^^^^^^^^^^^^^^

Bug-fix and minor releases are always done from a maintenance branch. First,
consider double-checking the ``changelog`` directory to see if there are any
breaking changes or new features.

For a new minor release, first create a new maintenance branch from ``main``::

     git fetch upstream
     git branch 7.1.x upstream/main
     git push upstream 7.1.x

Then, trigger the workflow with the following inputs:

- branch: **7.1.x**
- major release: **no**
- prerelease: empty

Or via the commandline using `GitHub's cli <https://github.com/cli/cli>`__::

    gh workflow run prepare-release-pr.yml -f branch=7.1.x -f major=no -f prerelease=

Where ``7.1.x`` is the maintenance branch for the ``7.1`` series. The automated
workflow will publish a PR for a branch ``release-7.1.0``.

Similarly, for a bug-fix release, use the existing maintenance branch and
trigger the workflow with e.g. ``branch: 7.0.x`` to get a new ``release-7.0.1``
PR.

Major releases
^^^^^^^^^^^^^^

1. Create a new maintenance branch from ``main``::

        git fetch upstream
        git branch 8.0.x upstream/main
        git push upstream 8.0.x

2. Trigger the workflow with the following inputs:

   - branch: **8.0.x**
   - major release: **yes**
   - prerelease: empty

Or via the commandline::

    gh workflow run prepare-release-pr.yml -f branch=8.0.x -f major=yes -f prerelease=

The automated workflow will publish a PR for a branch ``release-8.0.0``.

At this point on, this follows the same workflow as other maintenance branches: bug-fixes are merged
into ``main`` and ported back to the maintenance branch, even for release candidates.

Release candidates
^^^^^^^^^^^^^^^^^^

To release a release candidate, set the "prerelease" input to the version number
suffix to use. To release a ``8.0.0rc1``, proceed like under "major releases", but set:

- branch: 8.0.x
- major release: yes
- prerelease: **rc1**

Or via the commandline::

    gh workflow run prepare-release-pr.yml -f branch=8.0.x -f major=yes -f prerelease=rc1

The automated workflow will publish a PR for a branch ``release-8.0.0rc1``.

**A note about release candidates**

During release candidates we can merge small improvements into
the maintenance branch before releasing the final major version, however we must take care
to avoid introducing big changes at this stage.

Preparing: Manual Method
~~~~~~~~~~~~~~~~~~~~~~~~

**Important**: pytest releases must be prepared on **Linux** because the docs and examples expect
to be executed on that platform.

To release a version ``MAJOR.MINOR.PATCH``, follow these steps:

#. For major and minor releases, create a new branch ``MAJOR.MINOR.x`` from
   ``upstream/main`` and push it to ``upstream``.

#. Create a branch ``release-MAJOR.MINOR.PATCH`` from the ``MAJOR.MINOR.x`` branch.

   Ensure your local checkout is up to date and in a clean working tree.

#. Using ``tox``, generate docs, changelog, announcements::

    $ tox -e release -- MAJOR.MINOR.PATCH

   This will generate a commit with all the changes ready for pushing.

#. Open a PR for the ``release-MAJOR.MINOR.PATCH`` branch targeting ``MAJOR.MINOR.x``.


Releasing
~~~~~~~~~

Both automatic and manual processes described above follow the same steps from this point onward.

#. After all tests pass and the PR has been approved, trigger the ``deploy`` workflow
   in https://github.com/pytest-dev/pytest/actions/workflows/deploy.yml, using the ``release-MAJOR.MINOR.PATCH`` branch
   as source.

   Using the command-line::

     $ gh workflow run deploy.yml -R pytest-dev/pytest --ref=release-{VERSION} -f version={VERSION}

   This job will require approval from ``pytest-dev/core``, after which it will publish to PyPI
   and tag the repository.

#. Merge the PR. **Make sure it's not squash-merged**, so that the tagged commit ends up in the main branch.

#. For major and minor releases (or the first prerelease of it),
   in the `ReadTheDocs admin page <https://app.readthedocs.org/projects/pytest/>`__, click "Add Version" on the top right,
   choose the new branch, then set the new version as active.

#. Cherry-pick the CHANGELOG / announce files to the ``main`` branch::

       git fetch upstream
       git checkout upstream/main -b cherry-pick-release
       git cherry-pick -x -m1 upstream/MAJOR.MINOR.x

#. Open a PR for ``cherry-pick-release`` and merge it once CI passes. No need to wait for approvals if there were no conflicts on the previous step.

#. For major and minor releases (or the first prerelease of it), tag the release cherry-pick merge commit in main with
   a dev tag for the next feature release::

       git checkout main
       git pull
       git tag MAJOR.{MINOR+1}.0.dev0
       git push upstream MAJOR.{MINOR+1}.0.dev0

#. Send an email announcement with the contents from::

     doc/en/announce/release-<VERSION>.rst

   To the following mailing lists:

   * python-announce-list@python.org

   And announce it with the ``#pytest`` hashtag on:

   * `Bluesky <https://bsky.app>`_
   * `Fosstodon <https://fosstodon.org>`_
   * `Twitter/X <https://x.com>`_


================================================
FILE: TIDELIFT.rst
================================================
========
Tidelift
========

pytest is a member of `Tidelift`_. This document describes how the core team manages
Tidelift-related activities.

What is it
==========

Tidelift aims to make Open Source sustainable by offering subscriptions to companies which rely
on Open Source packages. This subscription allows it to pay maintainers of those Open Source
packages to aid sustainability of the work.

It is the perfect platform for companies that want to support Open Source packages and at the same
time obtain assurances regarding maintenance, quality and security.

Funds
=====

It was decided in the `mailing list`_ that the Tidelift contribution will be split evenly between
members of the `contributors team`_ interested in receiving funding.

The current list of contributors receiving funding are:

* `@nicoddemus`_
* `@The-Compiler`_
* `@RonnyPfannschmidt`_

Contributors interested in receiving a part of the funds just need to submit a PR adding their
name to the list. Contributors that want to stop receiving the funds should also submit a PR
in the same way.

The PR should mention `@pytest-dev/tidelift-admins`_ so appropriate changes
can be made in the Tidelift platform.

After the PR has been accepted and merged, the contributor should register in the `Tidelift`_
platform and follow the instructions there, including signing an `agreement`_.

Admins
======

A few people have admin access to the Tidelift dashboard to make changes. Those people
are part of the `@pytest-dev/tidelift-admins`_ team.

`Core contributors`_ interested in helping out with Tidelift maintenance are welcome! We don't
expect much work here other than the occasional adding/removal of a contributor from receiving
funds. Just drop a line to one of the `@pytest-dev/tidelift-admins`_ or use the mailing list.


.. _`Tidelift`: https://tidelift.com
.. _`mailing list`: https://mail.python.org/pipermail/pytest-dev/2019-May/004716.html
.. _`contributors team`: https://github.com/orgs/pytest-dev/teams/contributors
.. _`core contributors`: https://github.com/orgs/pytest-dev/teams/core/members
.. _`@pytest-dev/tidelift-admins`: https://github.com/orgs/pytest-dev/teams/tidelift-admins/members
.. _`agreement`: https://tidelift.com/docs/lifting/agreement

.. _`@nicoddemus`: https://github.com/nicoddemus
.. _`@The-Compiler`: https://github.com/The-Compiler
.. _`@RonnyPfannschmidt`: https://github.com/RonnyPfannschmidt


================================================
FILE: bench/bench.py
================================================
from __future__ import annotations

import sys


if __name__ == "__main__":
    import cProfile
    import pstats

    import pytest  # noqa: F401

    script = sys.argv[1:] if len(sys.argv) > 1 else ["empty.py"]
    cProfile.run(f"pytest.cmdline.main({script!r})", "prof")
    p = pstats.Stats("prof")
    p.strip_dirs()
    p.sort_stats("cumulative")
    print(p.print_stats(500))


================================================
FILE: bench/bench_argcomplete.py
================================================
# 10000 iterations, just for relative comparison
#                      2.7.5     3.3.2
# FilesCompleter       75.1109   69.2116
# FastFilesCompleter    0.7383    1.0760
from __future__ import annotations

import timeit


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))


================================================
FILE: bench/empty.py
================================================
from __future__ import annotations


for i in range(1000):
    exec(f"def test_func_{i}(): pass")


================================================
FILE: bench/manyparam.py
================================================
from __future__ import annotations

import pytest


@pytest.fixture(scope="module", params=range(966))
def foo(request):
    return request.param


def test_it(foo):
    pass


def test_it2(foo):
    pass


================================================
FILE: bench/skip.py
================================================
from __future__ import annotations

import pytest


SKIP = True


@pytest.mark.parametrize("x", range(5000))
def test_foo(x):
    if SKIP:
        pytest.skip("heh")


================================================
FILE: bench/unit_test.py
================================================
from __future__ import annotations

from unittest import TestCase  # noqa: F401


for i in range(15000):
    exec(
        f"""
class Test{i}(TestCase):
    @classmethod
    def setUpClass(cls): pass
    def test_1(self): pass
    def test_2(self): pass
    def test_3(self): pass
"""
    )


================================================
FILE: bench/xunit.py
================================================
from __future__ import annotations


for i in range(5000):
    exec(
        f"""
class Test{i}:
    @classmethod
    def setup_class(cls): pass
    def test_1(self): pass
    def test_2(self): pass
    def test_3(self): pass
"""
    )


================================================
FILE: changelog/.gitignore
================================================
*
!.gitignore
!_template.rst
!README.rst
!*.bugfix
!*.bugfix.rst
!*.bugfix.*.rst
!*.breaking
!*.breaking.rst
!*.breaking.*.rst
!*.contrib
!*.contrib.rst
!*.contrib.*.rst
!*.deprecation
!*.deprecation.rst
!*.deprecation.*.rst
!*.doc
!*.doc.rst
!*.doc.*.rst
!*.feature
!*.feature.rst
!*.feature.*.rst
!*.improvement
!*.improvement.rst
!*.improvement.*.rst
!*.misc
!*.misc.rst
!*.misc.*.rst
!*.packaging
!*.packaging.rst
!*.packaging.*.rst
!*.vendor
!*.vendor.rst
!*.vendor.*.rst


================================================
FILE: changelog/12444.bugfix.rst
================================================
Fixed :func:`pytest.approx` which now correctly takes into account :class:`~collections.abc.Mapping` keys order to compare them.


================================================
FILE: changelog/12689.contrib.rst
================================================
The test reports are now published to Codecov from GitHub Actions.
The test statistics is visible `on the web interface
<https://app.codecov.io/gh/pytest-dev/pytest/tests>`__.

-- by :user:`aleguy02`


================================================
FILE: changelog/12882.deprecation.rst
================================================
Calling :meth:`request.getfixturevalue() <pytest.FixtureRequest.getfixturevalue>` during teardown to request a fixture that was not already requested is now deprecated and will become an error in pytest 10.

See :ref:`dynamic-fixture-request-during-teardown` for details.


================================================
FILE: changelog/13192.bugfix.rst
================================================
Fixed `|` (pipe) not being treated as a regex meta-character that needs escaping in :func:`pytest.raises(match=...) <pytest.raises>`.


================================================
FILE: changelog/13388.doc.rst
================================================
Clarified documentation for ``-p`` vs ``PYTEST_PLUGINS`` plugin loading and fixed an incorrect ``-p`` example.


================================================
FILE: changelog/13409.deprecation.rst
================================================
Using non-:class:`~collections.abc.Collection` iterables (such as generators, iterators, or custom iterable objects) for the ``argvalues`` parameter in :ref:`@pytest.mark.parametrize <pytest.mark.parametrize ref>` and :meth:`metafunc.parametrize <pytest.Metafunc.parametrize>` is now deprecated.

These iterables get exhausted after the first iteration,
leading to tests getting unexpectedly skipped in cases such as running :func:`pytest.main()` multiple times,
using class-level parametrize decorators,
or collecting tests multiple times.

See :ref:`parametrize-iterators` for details and suggestions.


================================================
FILE: changelog/13634.bugfix.rst
================================================
Blocking a ``conftest.py`` file using the ``-p no:`` option is now explicitly disallowed.

Previously this resulted in an internal assertion failure during plugin loading.

Pytest now raises a clear ``UsageError`` explaining that conftest files are not plugins and cannot be disabled via ``-p``.


================================================
FILE: changelog/13731.doc.rst
================================================
Clarified that capture fixtures (e.g. ``capsys`` and ``capfd``) take precedence over the ``-s`` / ``--capture=no`` command-line options in :ref:`Accessing captured output from a test function <accessing-captured-output>`.


================================================
FILE: changelog/13734.bugfix.rst
================================================
Fixed crash when a test raises an exceptiongroup with ``__tracebackhide__ = True``.


================================================
FILE: changelog/13884.bugfix.rst
================================================
Fixed rare internal IndexError caused by `builtins.compile` being overridden in client code.


================================================
FILE: changelog/13917.bugfix.rst
================================================
:class:`unittest.SkipTest` is no longer considered an interactive exception, i.e. :hook:`pytest_exception_interact` is no longer called for it.


================================================
FILE: changelog/13946.deprecation.rst
================================================
The private ``config.inicfg`` attribute is now deprecated.
Use :meth:`config.getini() <pytest.Config.getini>` to access configuration values instead.

See :ref:`config-inicfg` for more details.


================================================
FILE: changelog/13963.bugfix.rst
================================================
Fixed subtests running with :pypi:`pytest-xdist` when their contexts contain objects that are not JSON-serializable.

Fixes `pytest-dev/pytest-xdist#1273 <https://github.com/pytest-dev/pytest-xdist/issues/1273>`__.


================================================
FILE: changelog/14023.feature.rst
================================================
Added `--report-chars` long CLI option.


================================================
FILE: changelog/14026.improvement.rst
================================================
Added test coverage for compiled regex patterns in :func:`pytest.raises` match parameter.


================================================
FILE: changelog/14050.bugfix.rst
================================================
Display dictionary differences in assertion failures using the original key insertion order instead of sorted order.


================================================
FILE: changelog/14088.doc.rst
================================================
Clarified that the default :hook:`pytest_collection` hook sets ``session.items`` before it calls :hook:`pytest_collection_finish`, not after.


================================================
FILE: changelog/14114.bugfix.rst
================================================
An exception from :hook:`pytest_fixture_post_finalizer` no longer prevents fixtures from being torn down, causing additional errors in the following tests.


================================================
FILE: changelog/14195.bugfix.rst
================================================
Fixed an issue where non-string messages passed to `unittest.TestCase.subTest()` were not printed.


================================================
FILE: changelog/14255.doc.rst
================================================
TOML integer log levels must be quoted: Updating reference documentation.


================================================
FILE: changelog/14303.doc.rst
================================================
The documentation is now built with Sphinx >= 9.


================================================
FILE: changelog/5848.bugfix.rst
================================================
:hook:`pytest_fixture_post_finalizer` is no longer called extra times for the same fixture teardown in some cases.


================================================
FILE: changelog/719.bugfix.rst
================================================
Fixed :ref:`@pytest.mark.parametrize <pytest.mark.parametrize ref>` not unpacking single-element tuple values when using a string argnames with a trailing comma (e.g., ``"arg,"``).

The trailing comma form now correctly behaves like the tuple form ``("arg",)``, treating argvalues as a list of tuples to unpack.


================================================
FILE: changelog/README.rst
================================================
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 in the **past or present tense** and use punctuation, examples::

    Improved verbose diff output with sequences.

    Terminal summary statistics now use multiple colors.

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.
* ``improvement``: improvement of existing functionality, usually without requiring user intervention (for example, new fields being written in ``--junit-xml``, improved colors in terminal, etc).
* ``bugfix``: fixes a bug.
* ``doc``: documentation improvement, like rewording an entire section or adding missing docs.
* ``deprecation``: feature deprecation.
* ``breaking``: a change which may break existing suites, such as feature removal or behavior change.
* ``vendor``: changes in packages vendored in pytest.
* ``packaging``: notes for downstreams about unobvious side effects
  and tooling. Changes in the test invocation considerations and
  runtime assumptions.
* ``contrib``: stuff that affects the contributor experience. e.g.
  Running tests, building the docs, setting up the development
  environment.
* ``misc``: changes that are hard to assign to any of the above
  categories.

So for example: ``123.feature.rst``, ``456.bugfix.rst``.

.. tip::

   See :file:`pyproject.toml` for all available categories
   (``tool.towncrier.type``).

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.

``towncrier`` preserves multiple paragraphs and formatting (code blocks, lists, and so on), but for entries
other than ``features`` it is usually better to stick to a single paragraph to keep it concise.

You can also run ``tox -e docs`` to build the documentation
with the draft changelog (``doc/en/_build/html/changelog.html``) if you want to get a preview of how your change will look in the final release notes.


================================================
FILE: changelog/_template.rst
================================================
{% for section in sections %}
{% set underline = "-" %}
{% if section %}
{{section}}
{{ underline * section|length }}{% set underline = "~" %}

{% endif %}
{% if sections[section] %}
{% for category, val in definitions.items() if category in sections[section] %}

{{ definitions[category]['name'] }}
{{ underline * definitions[category]['name']|length }}

{% if definitions[category]['showcontent'] %}
{% for text, values in sections[section][category]|dictsort(by='value') %}
{% set issue_joiner = joiner(', ') %}
- {% for value in values|sort %}{{ issue_joiner() }}`{{ value }} <https://github.com/pytest-dev/pytest/issues/{{ value[1:] }}>`_{% endfor %}: {{ text }}


{% endfor %}
{% else %}
- {{ sections[section][category]['']|sort|join(', ') }}


{% endif %}
{% if sections[section][category]|length == 0 %}

No significant changes.


{% else %}
{% endif %}
{% endfor %}
{% else %}

No significant changes.


{% endif %}
{% endfor %}


================================================
FILE: codecov.yml
================================================
# reference: https://docs.codecov.io/docs/codecovyml-reference
---

codecov:
  token: 1eca3b1f-31a2-4fb8-a8c3-138b441b50a7 #repo token

coverage:
  status:
    patch:
      default:
        target: 100%  # require patches to be 100%
    project: false
comment: false


================================================
FILE: doc/en/Makefile
================================================
# Minimal makefile for Sphinx documentation
#

# You can set these variables from the command line, and also
# from the environment for the first two.
SPHINXOPTS    ?=
SPHINXBUILD   ?= sphinx-build
SOURCEDIR     = .
BUILDDIR      = _build

# Put it first so that "make" without argument is like "make help".
help:
	@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

.PHONY: help Makefile

# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
	@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)


REGENDOC_ARGS := \
	--normalize "/[ \t]+\n/\n/" \
	--normalize "~\$$REGENDOC_TMPDIR~/home/sweet/project~" \
	--normalize "~/path/to/example~/home/sweet/project~" \
	--normalize "/in \d.\d\ds/in 0.12s/" \
	--normalize "@/tmp/pytest-of-.*/pytest-\d+@PYTEST_TMPDIR@" \
	--normalize "@pytest-(\d+)\\.[^ ,]+@pytest-\1.x.y@" \
	--normalize "@py-(\d+)\\.[^ ,]+@py-\1.x.y@" \
	--normalize "@pluggy-(\d+)\\.[.\d,]+@pluggy-\1.x.y@" \
	--normalize "@hypothesis-(\d+)\\.[.\d,]+@hypothesis-\1.x.y@" \
	--normalize "@Python (\d+)\\.[^ ,]+@Python \1.x.y@"

regen: REGENDOC_FILES:=*.rst */*.rst
regen:
# need to reset cachedir to the non-tox default
	PYTHONDONTWRITEBYTECODE=1 \
	PYTEST_ADDOPTS="-pno:hypothesis -p no:hypothesispytest -Wignore::pytest.PytestUnknownMarkWarning -o cache_dir=.pytest_cache" \
	COLUMNS=76 \
	regendoc --update ${REGENDOC_FILES} ${REGENDOC_ARGS}

.PHONY: regen


================================================
FILE: doc/en/_static/pytest-custom.css
================================================
/* Tweak how the sidebar logo is presented */
.sidebar-logo {
  width: 70%;
}
.sidebar-brand {
  padding: 0;
}

/* The landing pages' sidebar-in-content highlights */
#features ul {
  padding-left: 1rem;
  list-style: none;
}
#features ul li {
  margin-bottom: 0;
}
@media (min-width: 46em) {
  #features {
    width: 50%;
  }
}


================================================
FILE: doc/en/_templates/links.html
================================================
<h3>Useful Links</h3>
<ul>
  <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="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>


================================================
FILE: doc/en/adopt.rst
================================================
:orphan:

.. warnings about this file not being included in any toctree will be suppressed by :orphan:


April 2015 is "adopt pytest month"
=============================================

Are you an enthusiastic pytest user, the local testing guru in your workplace? Or are you considering using pytest for your open source project, but not sure how to get started? Then you may be interested in "adopt pytest month"!

We will pair experienced pytest users with open source projects, for a month's effort of getting new development teams started with pytest.

In 2015 we are trying this for the first time. In February and March 2015 we will gather volunteers on both sides, in April we will do the work, and in May we will evaluate how it went. This effort is being coordinated by Brianna Laugher. If you have any questions or comments, you can raise them on the `@pytestdotorg twitter account <https://twitter.com/pytestdotorg>`_\, the :issue:`issue tracker <676>` or the `pytest-dev mailing list`_.


.. _`pytest-dev mailing list`: https://mail.python.org/mailman/listinfo/pytest-dev


The ideal pytest helper
-----------------------------------------

 - will be able to commit 2-4 hours a week to working with their particular project (this might involve joining their mailing list, installing the software and exploring any existing tests, offering advice, writing some example tests)
 - feels confident in using pytest (e.g. has explored command line options, knows how to write parametrized tests, has an idea about conftest contents)
 - does not need to be an expert in every aspect!

Pytest helpers, sign up here! (preferably in February, hard deadline 22 March)



The ideal partner project
-----------------------------------------

 - is open source, and predominantly written in Python
 - has an automated/documented install process for developers
 - has more than one core developer
 - has at least one official release (e.g. is available on pypi)
 - has the support of the core development team, in trying out pytest adoption
 - has no tests... or 100% test coverage... or somewhere in between!

Partner projects, sign up here! (by 22 March)



What does it mean to "adopt pytest"?
-----------------------------------------

There can be many different definitions of "success". Pytest can run many unittest_ tests by default, so using pytest as your testrunner may be possible from day 1. Job done, right?

Progressive success might look like:

 - tests can be run (by pytest) without errors (there may be failures)
 - tests can be run (by pytest) without failures
 - test runner is integrated into CI server
 - existing tests are rewritten to take advantage of pytest features - this can happen in several iterations, for example:
    - changing to native assert_ statements (pycmd_ has a script to help with that, ``pyconvert_unittest.py``)
    - changing `setUp/tearDown methods`_ to fixtures_
    - adding markers_
    - other changes to reduce boilerplate
 - assess needs for future tests to be written, e.g. new fixtures, distributed_ testing tweaks

"Success" should also include that the development team feels comfortable with their knowledge of how to use pytest. In fact this is probably more important than anything else. So spending a lot of time on communication, giving examples, etc will probably be important - both in running the tests, and in writing them.

It may be after the month is up, the partner project decides that pytest is not right for it. That's okay - hopefully the pytest team will also learn something about its weaknesses or deficiencies.

.. _unittest: unittest.html
.. _assert: assert.html
.. _pycmd: https://bitbucket.org/hpk42/pycmd/overview
.. _`setUp/tearDown methods`: xunit_setup.html
.. _fixtures: fixture.html
.. _markers: mark.html
.. _distributed: xdist.html


Other ways to help
-----------------------------------------

Promote! Do your favourite open source Python projects use pytest? If not, why not tell them about this page?


================================================
FILE: doc/en/announce/index.rst
================================================

Release announcements
===========================================

.. toctree::
   :maxdepth: 2


   release-9.0.2
   release-9.0.1
   release-9.0.0
   release-8.4.2
   release-8.4.1
   release-8.4.0
   release-8.3.5
   release-8.3.4
   release-8.3.3
   release-8.3.2
   release-8.3.1
   release-8.3.0
   release-8.2.2
   release-8.2.1
   release-8.2.0
   release-8.1.2
   release-8.1.1
   release-8.1.0
   release-8.0.2
   release-8.0.1
   release-8.0.0
   release-8.0.0rc2
   release-8.0.0rc1
   release-7.4.4
   release-7.4.3
   release-7.4.2
   release-7.4.1
   release-7.4.0
   release-7.3.2
   release-7.3.1
   release-7.3.0
   release-7.2.2
   release-7.2.1
   release-7.2.0
   release-7.1.3
   release-7.1.2
   release-7.1.1
   release-7.1.0
   release-7.0.1
   release-7.0.0
   release-7.0.0rc1
   release-6.2.5
   release-6.2.4
   release-6.2.3
   release-6.2.2
   release-6.2.1
   release-6.2.0
   release-6.1.2
   release-6.1.1
   release-6.1.0
   release-6.0.2
   release-6.0.1
   release-6.0.0
   release-6.0.0rc1
   release-5.4.3
   release-5.4.2
   release-5.4.1
   release-5.4.0
   release-5.3.5
   release-5.3.4
   release-5.3.3
   release-5.3.2
   release-5.3.1
   release-5.3.0
   release-5.2.4
   release-5.2.3
   release-5.2.2
   release-5.2.1
   release-5.2.0
   release-5.1.3
   release-5.1.2
   release-5.1.1
   release-5.1.0
   release-5.0.1
   release-5.0.0
   release-4.6.9
   release-4.6.8
   release-4.6.7
   release-4.6.6
   release-4.6.5
   release-4.6.4
   release-4.6.3
   release-4.6.2
   release-4.6.1
   release-4.6.0
   release-4.5.0
   release-4.4.2
   release-4.4.1
   release-4.4.0
   release-4.3.1
   release-4.3.0
   release-4.2.1
   release-4.2.0
   release-4.1.1
   release-4.1.0
   release-4.0.2
   release-4.0.1
   release-4.0.0
   release-3.10.1
   release-3.10.0
   release-3.9.3
   release-3.9.2
   release-3.9.1
   release-3.9.0
   release-3.8.2
   release-3.8.1
   release-3.8.0
   release-3.7.4
   release-3.7.3
   release-3.7.2
   release-3.7.1
   release-3.7.0
   release-3.6.4
   release-3.6.3
   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
   release-3.1.2
   release-3.1.1
   release-3.1.0
   release-3.0.7
   release-3.0.6
   release-3.0.5
   release-3.0.4
   release-3.0.3
   release-3.0.2
   release-3.0.1
   release-3.0.0
   sprint2016
   release-2.9.2
   release-2.9.1
   release-2.9.0
   release-2.8.7
   release-2.8.6
   release-2.8.5
   release-2.8.4
   release-2.8.3
   release-2.8.2
   release-2.7.2
   release-2.7.1
   release-2.7.0
   release-2.6.3
   release-2.6.2
   release-2.6.1
   release-2.6.0
   release-2.5.2
   release-2.5.1
   release-2.5.0
   release-2.4.2
   release-2.4.1
   release-2.4.0
   release-2.3.5
   release-2.3.4
   release-2.3.3
   release-2.3.2
   release-2.3.1
   release-2.3.0
   release-2.2.4
   release-2.2.2
   release-2.2.1
   release-2.2.0
   release-2.1.3
   release-2.1.2
   release-2.1.1
   release-2.1.0
   release-2.0.3
   release-2.0.2
   release-2.0.1
   release-2.0.0


================================================
FILE: doc/en/announce/release-2.0.0.rst
================================================
py.test 2.0.0: asserts++, unittest++, reporting++, config++, docs++
===========================================================================

Welcome to pytest-2.0.0, a major new release of "py.test", the rapid
easy Python testing tool.  There are many new features and enhancements,
see below for summary and detailed lists.  A lot of long-deprecated code
has been removed, resulting in a much smaller and cleaner
implementation.  See the new docs with examples here:

    http://pytest.org/en/stable/index.html

A note on packaging: pytest used to part of the "py" distribution up
until version py-1.3.4 but this has changed now:  pytest-2.0.0 only
contains py.test related code and is expected to be backward-compatible
to existing test code. If you want to install pytest, just type one of::

    pip install -U pytest
    easy_install -U pytest

Many thanks to all issue reporters and people asking questions or
complaining.  Particular thanks to Floris Bruynooghe and Ronny Pfannschmidt
for their great coding contributions and many others for feedback and help.

best,
holger krekel


New Features
-----------------------

- new invocations through Python interpreter and from Python::

    python -m pytest      # on all pythons >= 2.5

  or from a python program::

    import pytest ; pytest.main(arglist, pluginlist)

  see http://pytest.org/en/stable/how-to/usage.html for details.

- new and better reporting information in assert expressions
  if comparing lists, sequences or strings.

  see http://pytest.org/en/stable/how-to/assert.html#newreport

- new configuration through ini-files (setup.cfg or tox.ini recognized),
  for example::

    [pytest]
    norecursedirs = .hg data*  # don't ever recurse in such dirs
    addopts = -x --pyargs      # add these command line options by default

  see http://pytest.org/en/stable/reference/customize.html

- improved standard unittest support.  In general py.test should now
  better be able to run custom unittest.TestCases like twisted trial
  or Django based TestCases.  Also you can now run the tests of an
  installed 'unittest' package with py.test::

    py.test --pyargs unittest

- new "-q" option which decreases verbosity and prints a more
  nose/unittest-style "dot" output.

- many, many, more detailed improvements details

Fixes
-----------------------

- fix issue126 - introduce py.test.set_trace() to trace execution via
  PDB during the running of tests even if capturing is ongoing.
- fix issue124 - make reporting more resilient against tests opening
  files on filedescriptor 1 (stdout).
- fix issue109 - sibling conftest.py files will not be loaded.
  (and Directory collectors cannot be customized anymore from a Directory's
  conftest.py - this needs to happen at least one level up).
- fix issue88 (finding custom test nodes from command line arg)
- fix issue93 stdout/stderr is captured while importing conftest.py
- fix bug: unittest collected functions now also can have "pytestmark"
  applied at class/module level

Important Notes
--------------------

* The usual way in pre-2.0 times to use py.test in python code was
  to import "py" and then e.g. use "py.test.raises" for the helper.
  This remains valid and is not planned to be deprecated.  However,
  in most examples and internal code you'll find "import pytest"
  and "pytest.raises" used as the recommended default way.

* pytest now first performs collection of the complete test suite
  before running any test. This changes for example the semantics of when
  pytest_collectstart/pytest_collectreport are called.  Some plugins may
  need upgrading.

* The pytest package consists of a 400 LOC core.py and about 20 builtin plugins,
  summing up to roughly 5000 LOCs, including docstrings. To be fair, it also
  uses generic code from the "pylib", and the new "py" package to help
  with filesystem and introspection/code manipulation.

(Incompatible) Removals
-----------------------------

- py.test.config is now only available if you are in a test run.

- the following (mostly already deprecated) functionality was removed:

  - removed support for Module/Class/... collection node definitions
    in conftest.py files.  They will cause nothing special.
  - removed support for calling the pre-1.0 collection API of "run()" and "join"
  - removed reading option values from conftest.py files or env variables.
    This can now be done much, much, better and easier through the ini-file
    mechanism and the "addopts" entry in particular.
  - removed the "disabled" attribute in test classes.  Use the skipping
    and pytestmark mechanism to skip or xfail a test class.

- py.test.collect.Directory does not exist anymore and it
  is not possible to provide an own "Directory" object.
  If you have used this and don't know what to do, get
  in contact.  We'll figure something out.

  Note that pytest_collect_directory() is still called but
  any return value will be ignored.  This allows to keep
  old code working that performed for example "py.test.skip()"
  in collect() to prevent recursion into directory trees
  if a certain dependency or command line option is missing.


see :ref:`changelog` for more detailed changes.


================================================
FILE: doc/en/announce/release-2.0.1.rst
================================================
py.test 2.0.1: bug fixes
===========================================================================

Welcome to pytest-2.0.1, 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 extensive docs with tested examples here:

    http://pytest.org/

If you want to install or upgrade pytest, just type one of::

    pip install -U pytest # or
    easy_install -U pytest

Many thanks to all issue reporters and people asking questions or
complaining.  Particular thanks to Floris Bruynooghe and Ronny Pfannschmidt
for their great coding contributions and many others for feedback and help.

best,
holger krekel

Changes between 2.0.0 and 2.0.1
----------------------------------------------

- refine and unify initial capturing so that it works nicely
  even if the logging module is used on an early-loaded conftest.py
  file or plugin.
- fix issue12 - show plugin versions with "--version" and
  "--traceconfig" and also document how to add extra information
  to reporting test header
- fix issue17 (import-* reporting issue on python3) by
  requiring py>1.4.0 (1.4.1 is going to include it)
- fix issue10 (numpy arrays truth checking) by refining
  assertion interpretation in py lib
- fix issue15: make nose compatibility tests compatible
  with python3 (now that nose-1.0 supports python3)
- remove somewhat surprising "same-conftest" detection because
  it ignores conftest.py when they appear in several subdirs.
- improve assertions ("not in"), thanks Floris Bruynooghe
- improve behaviour/warnings when running on top of "python -OO"
  (assertions and docstrings are turned off, leading to potential
  false positives)
- introduce a pytest_cmdline_processargs(args) hook
  to allow dynamic computation of command line arguments.
  This fixes a regression because py.test prior to 2.0
  allowed to set command line options from conftest.py
  files which so far pytest-2.0 only allowed from ini-files now.
- fix issue7: assert failures in doctest modules.
  unexpected failures in doctests will not generally
  show nicer, i.e. within the doctest failing context.
- fix issue9: setup/teardown functions for an xfail-marked
  test will report as xfail if they fail but report as normally
  passing (not xpassing) if they succeed.  This only is true
  for "direct" setup/teardown invocations because teardown_class/
  teardown_module cannot closely relate to a single test.
- fix issue14: no logging errors at process exit
- refinements to "collecting" output on non-ttys
- refine internal plugin registration and --traceconfig output
- introduce a mechanism to prevent/unregister plugins from the
  command line, see http://pytest.org/en/stable/how-to/plugins.html#cmdunregister
- activate resultlog plugin by default
- fix regression wrt yielded tests which due to the
  collection-before-running semantics were not
  setup as with pytest 1.3.4.  Note, however, that
  the recommended and much cleaner way to do test
  parametrization remains the "pytest_generate_tests"
  mechanism, see the docs.


================================================
FILE: doc/en/announce/release-2.0.2.rst
================================================
py.test 2.0.2: bug fixes, improved xfail/skip expressions, speed ups
===========================================================================

Welcome to pytest-2.0.2, 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/

If you want to install or upgrade pytest, just type one of::

    pip install -U pytest # or
    easy_install -U pytest

Many thanks to all issue reporters and people asking questions
or complaining, particularly Jurko for his insistence,
Laura, Victor and Brianna for helping with improving
and Ronny for his general advise.

best,
holger krekel

Changes between 2.0.1 and 2.0.2
----------------------------------------------

- tackle issue32 - speed up test runs of very quick test functions
  by reducing the relative overhead

- fix issue30 - extended xfail/skipif handling and improved reporting.
  If you have a syntax error in your skip/xfail
  expressions you now get nice error reports.

  Also you can now access module globals from xfail/skipif
  expressions so that this for example works now::

    import pytest
    import mymodule
    @pytest.mark.skipif("mymodule.__version__[0] == "1")
    def test_function():
        pass

  This will not run the test function if the module's version string
  does not start with a "1".  Note that specifying a string instead
  of a boolean expressions allows py.test to report meaningful information
  when summarizing a test run as to what conditions lead to skipping
  (or xfail-ing) tests.

- fix issue28 - setup_method and pytest_generate_tests work together
  The setup_method fixture method now gets called also for
  test function invocations generated from the pytest_generate_tests
  hook.

- fix issue27 - collectonly and keyword-selection (-k) now work together
  Also, if you do "py.test --collectonly -q" you now get a flat list
  of test ids that you can use to paste to the py.test commandline
  in order to execute a particular test.

- fix issue25 avoid reported problems with --pdb and python3.2/encodings output

- fix issue23 - tmpdir argument now works on Python3.2 and WindowsXP
  Starting with Python3.2 os.symlink may be supported. By requiring
  a newer py lib version the py.path.local() implementation acknowledges
  this.

- fixed typos in the docs (thanks Victor Garcia, Brianna Laugher) and particular
  thanks to Laura Creighton who also reviewed parts of the documentation.

- fix slightly wrong output of verbose progress reporting for classes
  (thanks Amaury)

- more precise (avoiding of) deprecation warnings for node.Class|Function accesses

- avoid std unittest assertion helper code in tracebacks (thanks Ronny)


================================================
FILE: doc/en/announce/release-2.0.3.rst
================================================
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/

If you want to install or upgrade pytest, just type one of::

    pip install -U pytest # or
    easy_install -U pytest

There also is a bugfix release 1.6 of pytest-xdist, the plugin
that enables seamless distributed and "looponfail" testing for Python.

best,
holger krekel

Changes between 2.0.2 and 2.0.3
----------------------------------------------

- fix issue38: nicer tracebacks on calls to hooks, particularly early
  configure/sessionstart ones

- fix missing skip reason/meta information in junitxml files, reported
  via http://lists.idyll.org/pipermail/testing-in-python/2011-March/003928.html

- fix issue34: avoid collection failure with "test" prefixed classes
  deriving from object.

- 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


================================================
FILE: doc/en/announce/release-2.1.0.rst
================================================
py.test 2.1.0: perfected assertions and bug fixes
===========================================================================

Welcome to the release of pytest-2.1, a mature testing tool for Python,
supporting CPython 2.4-3.2, Jython and latest PyPy interpreters.  See
the improved extensive docs (now also as PDF!) with tested examples here:

     http://pytest.org/

The single biggest news about this release are **perfected assertions**
courtesy of Benjamin Peterson.  You can now safely use ``assert``
statements in test modules without having to worry about side effects
or python optimization ("-OO") options.  This is achieved by rewriting
assert statements in test modules upon import, using a PEP302 hook.
See https://docs.pytest.org/en/stable/how-to/assert.html for
detailed information.  The work has been partly sponsored by my company,
merlinux GmbH.

For further details on bug fixes and smaller enhancements see below.

If you want to install or upgrade pytest, just type one of::

    pip install -U pytest # or
    easy_install -U pytest

best,
holger krekel / https://merlinux.eu/

Changes between 2.0.3 and 2.1.0
----------------------------------------------

- fix issue53 call nosestyle setup functions with correct ordering
- fix issue58 and issue59: new assertion code fixes
- merge Benjamin's assertionrewrite branch: now assertions
  for test modules on python 2.6 and above are done by rewriting
  the AST and saving the pyc file before the test module is imported.
  see doc/assert.txt for more info.
- fix issue43: improve doctests with better traceback reporting on
  unexpected exceptions
- fix issue47: timing output in junitxml for test cases is now correct
- fix issue48: typo in MarkInfo repr leading to exception
- fix issue49: avoid confusing error when initialization partially fails
- fix issue44: env/username expansion for junitxml file path
- show releaselevel information in test runs for pypy
- reworked doc pages for better navigation and PDF generation
- report KeyboardInterrupt even if interrupted during session startup
- fix issue 35 - provide PDF doc version and download link from index page


================================================
FILE: doc/en/announce/release-2.1.1.rst
================================================
py.test 2.1.1: assertion fixes and improved junitxml output
===========================================================================

pytest-2.1.1 is a backward compatible maintenance release of the
popular py.test testing tool.  See extensive docs with examples here:

     http://pytest.org/

Most bug fixes address remaining issues with the perfected assertions
introduced with 2.1.0 - many thanks to the bug reporters and to Benjamin
Peterson for helping to fix them.  Also, junitxml output now produces
system-out/err tags which lead to better displays of tracebacks with Jenkins.

Also a quick note to package maintainers and others interested: there now
is a "pytest" man page which can be generated with "make man" in doc/.

If you want to install or upgrade pytest, just type one of::

    pip install -U pytest # or
    easy_install -U pytest

best,
holger krekel / https://merlinux.eu/

Changes between 2.1.0 and 2.1.1
----------------------------------------------

- fix issue64 / pytest.set_trace now works within pytest_generate_tests hooks
- 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"


================================================
FILE: doc/en/announce/release-2.1.2.rst
================================================
py.test 2.1.2: bug fixes and fixes for jython
===========================================================================

pytest-2.1.2 is a minor backward compatible maintenance release of the
popular py.test testing tool.  pytest is commonly used for unit,
functional- and integration testing.  See extensive docs with examples
here:

     http://pytest.org/

Most bug fixes address remaining issues with the perfected assertions
introduced in the 2.1 series - many thanks to the bug reporters and to Benjamin
Peterson for helping to fix them.  pytest should also work better with
Jython-2.5.1 (and Jython trunk).

If you want to install or upgrade pytest, just type one of::

    pip install -U pytest # or
    easy_install -U pytest

best,
holger krekel / https://merlinux.eu/

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


================================================
FILE: doc/en/announce/release-2.1.3.rst
================================================
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.

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.

best,
holger krekel

Changes between 2.1.2 and 2.1.3
----------------------------------------

- fix issue79: assertion rewriting failed on some comparisons in boolops,
- correctly handle zero length arguments (a la pytest '')
- fix issue67 / junitxml now contains correct test durations
- fix issue75 / skipping test failure on jython
- fix issue77 / Allow assertrepr_compare hook to apply to a subset of tests


================================================
FILE: doc/en/announce/release-2.2.0.rst
================================================
py.test 2.2.0: test marking++, parametrization++ and duration profiling
===========================================================================

pytest-2.2.0 is a test-suite compatible release of the popular
py.test testing tool.  Plugins might need upgrades. It comes
with these improvements:

* easier and more powerful parametrization of tests:

  - new @pytest.mark.parametrize decorator to run tests with different arguments
  - new metafunc.parametrize() API for parametrizing arguments independently
  - see examples at http://pytest.org/en/stable/example/how-to/parametrize.html
  - NOTE that parametrize() related APIs are still a bit experimental
    and might change in future releases.

* improved handling of test markers and refined marking mechanism:

  - "-m markexpr" option for selecting tests according to their mark
  - a new "markers" ini-variable for registering test markers for your project
  - the new "--strict" bails out with an error if using unregistered markers.
  - see examples at http://pytest.org/en/stable/example/markers.html

* duration profiling: new "--duration=N" option showing the N slowest test
  execution or setup/teardown calls. This is most useful if you want to
  find out where your slowest test code is.

* also 2.2.0 performs more eager calling of teardown/finalizers functions
  resulting in better and more accurate reporting when they fail

Besides there is the usual set of bug fixes along with a cleanup of
pytest's own test suite allowing it to run on a wider range of environments.

For general information, see extensive docs with examples here:

     http://pytest.org/

If you want to install or upgrade pytest you might just type::

    pip install -U pytest # or
    easy_install -U pytest

Thanks to Ronny Pfannschmidt, David Burns, Jeff Donner, Daniel Nouri, Alfredo Deza and all who gave feedback or sent bug reports.

best,
holger krekel


notes on incompatibility
------------------------------

While test suites should work unchanged you might need to upgrade plugins:

* You need a new version of the pytest-xdist plugin (1.7) for distributing
  test runs.

* Other plugins might need an upgrade if they implement
  the ``pytest_runtest_logreport`` hook which now is called unconditionally
  for the setup/teardown fixture phases of a test. You may choose to
  ignore setup/teardown failures by inserting "if rep.when != 'call': return"
  or something similar. Note that most code probably "just" works because
  the hook was already called for failing setup/teardown phases of a test
  so a plugin should have been ready to grok such reports already.


Changes between 2.1.3 and 2.2.0
----------------------------------------

- fix issue90: introduce eager tearing down of test items so that
  teardown function are called earlier.
- add an all-powerful metafunc.parametrize function which allows to
  parametrize test function arguments in multiple steps and therefore
  from independent plugins and places.
- add a @pytest.mark.parametrize helper which allows to easily
  call a test function with different argument values.
- Add examples to the "parametrize" example page, including a quick port
  of Test scenarios and the new parametrize function and decorator.
- introduce registration for "pytest.mark.*" helpers via ini-files
  or through plugin hooks.  Also introduce a "--strict" option which
  will treat unregistered markers as errors
  allowing to avoid typos and maintain a well described set of markers
  for your test suite.  See examples at http://pytest.org/en/stable/how-to/mark.html
  and its links.
- issue50: introduce "-m marker" option to select tests based on markers
  (this is a stricter and more predictable version of "-k" in that "-m"
  only matches complete markers and has more obvious rules for and/or
  semantics.
- new feature to help optimizing the speed of your tests:
  --durations=N option for displaying N slowest test calls
  and setup/teardown methods.
- fix issue87: --pastebin now works with python3
- fix issue89: --pdb with unexpected exceptions in doctest work more sensibly
- fix and cleanup pytest's own test suite to not leak FDs
- fix issue83: link to generated funcarg list
- fix issue74: pyarg module names are now checked against imp.find_module false positives
- fix compatibility with twisted/trial-11.1.0 use cases


================================================
FILE: doc/en/announce/release-2.2.1.rst
================================================
pytest-2.2.1: bug fixes, perfect teardowns
===========================================================================


pytest-2.2.1 is a minor backward-compatible release of the py.test
testing tool.   It contains bug fixes and little improvements, including
documentation fixes.  If you are using the distributed testing
pluginmake sure to upgrade it to pytest-xdist-1.8.

For general information see here:

     http://pytest.org/

To install or upgrade pytest:

    pip install -U pytest # or
    easy_install -U pytest

Special thanks for helping on this release to Ronny Pfannschmidt, Jurko
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
  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
  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)


================================================
FILE: doc/en/announce/release-2.2.2.rst
================================================
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 details.

For general information see here:

     http://pytest.org/

To install or upgrade pytest:

    pip install -U pytest # or
    easy_install -U pytest

Special thanks for helping on this release to Ronny Pfannschmidt
and Ralf Schmitt and the contributors of issues.

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
  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
- allow adding of attributes to test reports such that it also works
  with distributed testing (no upgrade of pytest-xdist needed)


================================================
FILE: doc/en/announce/release-2.2.4.rst
================================================
pytest-2.2.4: bug fixes, better junitxml/unittest/python3 compat
===========================================================================

pytest-2.2.4 is a minor backward-compatible release of the versatile
py.test testing tool.   It contains bug fixes and a few refinements
to junitxml reporting, better unittest- and python3 compatibility.

For general information see here:

     http://pytest.org/

To install or upgrade pytest:

    pip install -U pytest # or
    easy_install -U pytest

Special thanks for helping on this release to Ronny Pfannschmidt
and Benjamin Peterson and the contributors of issues.

best,
holger krekel

Changes between 2.2.3 and 2.2.4
-----------------------------------

- fix error message for rewritten assertions involving the % operator
- fix issue 126: correctly match all invalid xml characters for junitxml
  binary escape
- fix issue with unittest: now @unittest.expectedFailure markers should
  be processed correctly (you can also use @pytest.mark markers)
- 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


================================================
FILE: doc/en/announce/release-2.3.0.rst
================================================
pytest-2.3: improved fixtures / better unittest integration
=============================================================================

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 predictable 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
reuse 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
reusable fixture design.

For detailed info and tutorial-style examples, see:

    http://pytest.org/en/stable/explanation/fixtures.html

Moreover, there is now support for using pytest fixtures/funcargs with
unittest-style suites, see here for examples:

    http://pytest.org/en/stable/how-to/unittest.html

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
pytest-2.3 fixture evolution, please consult
http://pytest.org/en/stable/funcarg_compare.html

For general info on installation and getting started:

    http://pytest.org/en/stable/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
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


Changes between 2.2.4 and 2.3.0
-----------------------------------

- fix issue202 - better automatic names for parametrized test functions
- fix issue139 - introduce @pytest.fixture which allows direct scoping
  and parametrization of funcarg factories.  Introduce new @pytest.setup
  marker to allow the writing of setup functions which accept funcargs.
- fix issue198 - conftest fixtures were not found on windows32 in some
  circumstances with nested directory structures due to path manipulation issues
- fix issue193 skip test functions with were parametrized with empty
  parameter sets
- fix python3.3 compat, mostly reporting bits that previously depended
  on dict ordering
- introduce re-ordering of tests by resource and parametrization setup
  which takes precedence to the usual file-ordering
- fix issue185 monkeypatching time.time does not cause pytest to fail
- fix issue172 duplicate call of pytest.setup-decoratored setup_module
  functions
- fix junitxml=path construction so that if tests change the
  current working directory and the path is a relative path
  it is constructed correctly from the original current working dir.
- fix "python setup.py test" example to cause a proper "errno" return
- fix issue165 - fix broken doc links and mention stackoverflow for FAQ
- catch unicode-issues when writing failure representations
  to terminal to prevent the whole session from crashing
- fix xfail/skip confusion: a skip-mark or an imperative pytest.skip
  will now take precedence before xfail-markers because we
  can't determine xfail/xpass status in case of a skip. see also:
  http://stackoverflow.com/questions/11105828/in-py-test-when-i-explicitly-skip-a-test-that-is-marked-as-xfail-how-can-i-get

- always report installed 3rd party plugins in the header of a test run

- fix issue160: a failing setup of an xfail-marked tests should
  be reported as xfail (not xpass)

- 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 https://docs.pytest.org/en/6.0.1/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

- fix issue 176: correctly catch the builtin AssertionError
  even when we replaced AssertionError with a subclass on the
  python level

- factory discovery no longer fails with magic global callables
  that provide no sane __code__ object (mock.call for example)

- fix issue 182: testdir.inprocess_run now considers passed plugins

- fix issue 188: ensure sys.exc_info is clear on python2
                 before calling into a test

- fix issue 191: add unittest TestCase runTest method support
- 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
    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


================================================
FILE: doc/en/announce/release-2.3.1.rst
================================================
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
  to Eduard Schettino for the quick bug report.

- disable pexpect pytest self tests on Freebsd - thanks Koob for the
  quick reporting

- fix/improve interactive docs with --markers

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.0 and 2.3.1
-----------------------------------

- fix issue202 - fix regression: using "self" from fixture functions now
  works as expected (it's the same "self" instance that a test method
  which uses the fixture sees)

- skip pexpect using tests (test_pdb.py mostly) on freebsd* systems
  due to pexpect not supporting it properly (hanging)

- link to web pages from --markers output which provides help for
  pytest.mark.* usage.


================================================
FILE: doc/en/announce/release-2.3.2.rst
================================================
pytest-2.3.2: some fixes and more traceback-printing speed
===========================================================================

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

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
  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

- fix issue127 - better documentation for pytest_addoption
  and related objects.

- fix unittest behaviour: TestCase.runtest only called if there are
  test methods defined

- improve trial support: don't collect its empty
  unittest.TestCase.runTest() method

- "python setup.py test" now works with pytest itself

- fix/improve internal/packaging related bits:

  - exception message check of test_nose.py now passes on python33 as well

  - issue206 - fix test_assertrewrite.py to work when a global
    PYTHONDONTWRITEBYTECODE=1 is present

  - add tox.ini to pytest distribution so that ignore-dirs and others config
    bits are properly distributed for maintainers who run pytest-own tests


================================================
FILE: doc/en/announce/release-2.3.3.rst
================================================
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,
  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

     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.2 and 2.3.3
-----------------------------------

- fix issue214 - parse modules that contain special objects like e. g.
  flask's request object which blows up on getattr access if no request
  is active. thanks Thomas Waldmann.

- fix issue213 - allow to parametrize with values like numpy arrays that
  do not support an __eq__ operator

- fix issue215 - split test_python.org into multiple files

- fix issue148 - @unittest.skip on classes is now recognized and avoids
  calling setUpClass/tearDownClass, thanks Pavel Repin

- fix issue209 - reintroduce python2.4 support by depending on newer
  pylib which re-introduced statement-finding for pre-AST interpreters

- nose support: only call setup if it's a callable, thanks Andrew
  Taumoefolau

- fix issue219 - add py2.4-3.3 classifiers to TROVE list

- 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.


================================================
FILE: doc/en/announce/release-2.3.4.rst
================================================
pytest-2.3.4: stabilization, more flexible selection via "-k expr"
===========================================================================

pytest-2.3.4 is a small stabilization release of the py.test tool
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.
- allow to dynamically define markers via
  item.keywords[...]=assignment integrating with "-m" option
- 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/en/stable/example/how-to/parametrize.html
- fix autouse-issue where autouse-fixtures would not be discovered
  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

     http://pytest.org/

for general information.  To install or upgrade pytest:

    pip install -U pytest # or
    easy_install -U pytest

best,
holger krekel


================================================
FILE: doc/en/announce/release-2.3.5.rst
================================================
pytest-2.3.5: bug fixes and little improvements
===========================================================================

pytest-2.3.5 is a maintenance release with many bug fixes and little
improvements.  See the changelog below for details.  No backward
compatibility issues are foreseen and all plugins which worked with the
prior version are expected to work unmodified.   Speaking of which, a
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.org/search/?q=pytest

For general information see:

     http://pytest.org/

To install or upgrade pytest:

    pip install -U pytest # or
    easy_install -U pytest

Particular thanks to Floris, Ronny, Benjamin and the many bug reporters
and fix providers.

may the fixtures be with you,
holger krekel


Changes between 2.3.4 and 2.3.5
-----------------------------------

- never consider a fixture function for test function collection

- allow re-running of test items / helps to fix pytest-reruntests plugin
  and also help to keep less fixture/resource references alive

- put captured stdout/stderr into junitxml output even for passing tests
  (thanks Adam Goucher)

- Issue 265 - integrate nose setup/teardown with setupstate
  so it doesn't try to teardown if it did not setup

- issue 271 - don't write junitxml on worker nodes

- Issue 274 - don't try to show full doctest example
  when doctest does not know the example location

- issue 280 - disable assertion rewriting on buggy CPython 2.6.0

- inject "getfixture()" helper to retrieve fixtures from doctests,
  thanks Andreas Zeidler

- issue 259 - when assertion rewriting, be consistent with the default
  source encoding of ASCII on Python 2

- issue 251 - report a skip instead of ignoring classes with init

- issue250 unicode/str mixes in parametrization names and values now works

- issue257, assertion-triggered compilation of source ending in a
  comment line doesn't blow up in python2.5 (fixed through py>=1.4.13.dev6)

- fix --genscript option to generate standalone scripts that also
  work with python3.3 (importer ordering)

- issue171 - in assertion rewriting, show the repr of some
  global variables

- fix option help for "-k"

- 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
  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


================================================
FILE: doc/en/announce/release-2.4.0.rst
================================================
pytest-2.4.0: new fixture features/hooks and bug fixes
===========================================================================

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
a full list of details.  A few feature highlights:

- new yield-style fixtures `pytest.yield_fixture
  <http://pytest.org/en/stable/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
  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 :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
  :pypi:`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>`_

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,
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
-----------------------------------

known incompatibilities:

- if calling --genscript from python2.7 or above, you only get a
  standalone script which works on python2.7 or above.  Use Python2.6
  to also get a python2.5 compatible version.

- all xunit-style teardown methods (nose-style, pytest-style,
  unittest-style) will not be called if the corresponding setup method failed,
  see issue322 below.

- the pytest_plugin_unregister hook wasn't ever properly called
  and there is no known implementation of the hook - so it got removed.

- pytest.fixture-decorated functions cannot be generators (i.e. use
  yield) anymore.  This change might be reversed in 2.4.1 if it causes
  unforeseen real-life issues.  However, you can always write and return
  an inner function/generator and change the fixture consumer to iterate
  over the returned generator.  This change was done in lieu of the new
  ``pytest.yield_fixture`` decorator, see below.

new features:

- experimentally introduce a new ``pytest.yield_fixture`` decorator
  which accepts exactly the same parameters as pytest.fixture but
  mandates a ``yield`` statement instead of a ``return statement`` from
  fixture functions.  This allows direct integration with "with-style"
  context managers in fixture functions and generally avoids registering
  of finalization callbacks in favour of treating the "after-yield" as
  teardown code.  Thanks Andreas Pelme, Vladimir Keleshev, Floris
  Bruynooghe, Ronny Pfannschmidt and many others for discussions.

- allow boolean expression directly with skipif/xfail
  if a "reason" is also specified.  Rework skipping documentation
  to recommend "condition as booleans" because it prevents surprises
  when importing markers between modules.  Specifying conditions
  as strings will remain fully supported.

- 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
  ``pytest_exception_interact`` hook (see next item).

- 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``.

- 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:
  ``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.

- change option names to be hyphen-separated long options but keep the
  old spelling backward compatible.  py.test -h will only show the
  hyphenated version, for example "--collect-only" but "--collectonly"
  will remain valid as well (for backward-compat reasons).  Many thanks to
  Anthon van der Neut for the implementation and to Hynek Schlawack for
  pushing us.

- 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
  by using a new parser.parse_known_args method.

- 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.

- fix issue355: junitxml puts name="pytest" attribute to testsuite tag.

- fix issue336: autouse fixture in plugins should work again.

- fix issue279: improve object comparisons on assertion failure
  for standard datatypes and recognise collections.abc.  Thanks to
  Brianna Laugher and Mathieu Agopian.

- fix issue317: assertion rewriter support for the is_package method

- fix issue335: document py.code.ExceptionInfo() object returned
  from pytest.raises(), thanks Mathieu Agopian.

- remove implicit distribute_setup support from setup.py.

- fix issue305: ignore any problems when writing pyc files.

- SO-17664702: call fixture finalizers even if the fixture function
  partially failed (finalizers would not always be called before)

- fix issue320 - fix class scope for fixtures when mixed with
  module-level functions.  Thanks Anatoly Bubenkoff.

- you can specify "-q" or "-qq" to get different levels of "quieter"
  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
  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 --
  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

- 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
  information at the end of a test run.


================================================
FILE: doc/en/announce/release-2.4.1.rst
================================================
pytest-2.4.1: fixing three regressions compared to 2.3.5
===========================================================================

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
  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

as usual, docs at http://pytest.org and upgrades via::

    pip install -U pytest

have fun,
holger krekel


================================================
FILE: doc/en/announce/release-2.4.2.rst
================================================
pytest-2.4.2: colorama on windows, plugin/tmpdir fixes
===========================================================================

pytest-2.4.2 is another bug-fixing release:

- on Windows require colorama and a newer py lib so that py.io.TerminalWriter()
  now uses colorama instead of its own ctypes hacks. (fixes issue365)
  thanks Paul Moore for bringing it up.

- fix "-k" matching of tests where "repr" and "attr" and other names would
  cause wrong matches because of an internal implementation quirk
  (don't ask) which is now properly implemented. fixes issue345.

- avoid tmpdir fixture to create too long filenames especially
  when parametrization is used (issue354)

- fix pytest-pep8 and pytest-flakes / pytest interactions
  (collection names in mark plugin was assuming an item always
  has a function which is not true for those plugins etc.)
  Thanks Andi Zeidler.

- 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.

- 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


================================================
FILE: doc/en/announce/release-2.5.0.rst
================================================
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
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
"enhancement" 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
process and thus likely to break in the future.

As usual, current docs are at

    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,
Virgil Dupras, Bruno Oliveira, Alex Gaynor and others.

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
  with this release we believe).

- simplified and fixed implementation for calling finalizers when
  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
  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
  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.

- 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
  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
  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.
  (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 parametrized 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.

- fix ordering when mock.patch or other standard decorator-wrappings
  are used with test methods.  This fixes 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'".
  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
  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.

- fix pexpect-3.0 compatibility for pytest's own tests.
  (fixes issue386)

- allow nested parametrize-value markers, thanks James Lan for the PR.

- fix unicode handling with new monkeypatch.setattr(import_path, value)
  API.  Thanks Rob Dennis.  Fixes issue371.

- fix unicode handling with junitxml, fixes issue368.

- 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
  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.

- 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 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
  __init__.py properly.

- refactor internal FixtureRequest handling to avoid monkeypatching.
  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


================================================
FILE: doc/en/announce/release-2.5.1.rst
================================================
pytest-2.5.1: fixes and new home page styling
===========================================================================

pytest is a mature Python testing tool with more than 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,
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
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

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.

- 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.


================================================
FILE: doc/en/announce/release-2.5.2.rst
================================================
pytest-2.5.2: fixes
===========================================================================

pytest is a mature Python testing tool with more than 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
    Ronny Pfannschmidt
    Floris Bruynooghe
    Bruno Oliveira
    Andreas Pelme
    Jurko Gospodnetić
    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
  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.

- 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


================================================
FILE: doc/en/announce/release-2.6.0.rst
================================================
pytest-2.6.0: shorter tracebacks, new warning system, test runner compat
===========================================================================

pytest is a mature Python testing tool with more than 1000 tests
against itself, passing on many different interpreters and platforms.

The 2.6.0 release should be drop-in backward compatible to 2.5.2 and
fixes a number of bugs and brings some new features, mainly:

- shorter tracebacks by default: only the first (test function) entry
  and the last (failure location) entry are shown, the ones between
  only in "short" format.  Use ``--tb=long`` to get back the old
  behaviour of showing "long" entries everywhere.

- a new warning system which reports oddities during collection
  and execution.  For example, ignoring collecting Test* classes with an
  ``__init__`` now produces a warning.

- various improvements to nose/mock/unittest integration

Note also that 2.6.0 departs with the "zero reported bugs" policy
because it has been too hard to keep up with it, unfortunately.
Instead we are for now rather bound to work on "upvoted" issues in
the https://bitbucket.org/pytest-dev/pytest/issues?status=new&status=open&sort=-votes
issue tracker.

See docs at:

    http://pytest.org

As usual, you can upgrade from pypi via::

    pip install -U pytest

Thanks to all who contributed, among them:

    Benjamin Peterson
    Jurko Gospodnetić
    Floris Bruynooghe
    Marc Abramowitz
    Marc Schlaich
    Trevor Bekolay
    Bruno Oliveira
    Alex Groenholm

have fun,
holger krekel

2.6.0
-----------------------------------

- fix issue537: Avoid importing old assertion reinterpretation code by default.
  Thanks Benjamin Peterson.

- fix issue364: shorten and enhance tracebacks representation by default.
  The new "--tb=auto" option (default) will only display long tracebacks
  for the first and last entry.  You can get the old behaviour of printing
  all entries as long entries with "--tb=long".  Also short entries by
  default are now printed very similarly to "--tb=native" ones.

- fix issue514: teach assertion reinterpretation about private class attributes
  Thanks Benjamin Peterson.

- change -v output to include full node IDs of tests.  Users can copy
  a node ID from a test run, including line number, and use it as a
  positional argument in order to run only a single test.

- fix issue 475: fail early and comprehensible if calling
  pytest.raises with wrong exception type.

- fix issue516: tell in getting-started about current dependencies.

- cleanup setup.py a bit and specify supported versions. Thanks Jurko
  Gospodnetic for the PR.

- change XPASS colour to yellow rather than red when tests are run
  with -v.

- fix issue473: work around mock putting an unbound method into a class
  dict when double-patching.

- fix issue498: if a fixture finalizer fails, make sure that
  the fixture is still invalidated.

- fix issue453: the result of the pytest_assertrepr_compare hook now gets
  it's newlines escaped so that format_exception does not blow up.

- internal new warning system: pytest will now produce warnings when
  it detects oddities in your test collection or execution.
  Warnings are ultimately sent to a new pytest_logwarning hook which is
  currently only implemented by the terminal plugin which displays
  warnings in the summary line and shows more details when -rw (report on
  warnings) is specified.

- change skips into warnings for test classes with an __init__ and
  callables in test modules which look like a test but are not functions.

- fix issue436: improved finding of initial conftest files from command
  line arguments by using the result of parse_known_args rather than
  the previous flaky heuristics.  Thanks Marc Abramowitz for tests
  and initial fixing approaches in this area.

- fix issue #479: properly handle nose/unittest(2) SkipTest exceptions
  during collection/loading of test modules.  Thanks to Marc Schlaich
  for the complete PR.

- fix issue490: include pytest_load_initial_conftests in documentation
  and improve docstring.

- fix issue472: clarify that ``pytest.config.getvalue()`` cannot work
  if it's triggered ahead of command line parsing.

- merge PR123: improved integration with mock.patch decorator on tests.

- fix issue412: messing with stdout/stderr FD-level streams is now
  captured without crashes.

- fix issue483: trial/py33 works now properly.  Thanks Daniel Grana for PR.

- improve example for pytest integration with "python setup.py test"
  which now has a generic "-a" or "--pytest-args" option where you
  can pass additional options as a quoted string.  Thanks Trevor Bekolay.

- simplified internal capturing mechanism and made it more robust
  against tests or setups changing FD1/FD2, also better integrated
  now with pytest.pdb() in single tests.

- improvements to pytest's own test-suite leakage detection, courtesy of PRs
  from Marc Abramowitz

- fix issue492: avoid leak in test_writeorg.  Thanks Marc Abramowitz.

- fix issue493: don't run tests in doc directory with ``python setup.py test``
  (use tox -e doctesting for that)

- fix issue486: better reporting and handling of early conftest loading failures

- some cleanup and simplification of internal conftest handling.

- work a bit harder to break reference cycles when catching exceptions.
  Thanks Jurko Gospodnetic.

- fix issue443: fix skip examples to use proper comparison.  Thanks Alex
  Groenholm.

- support nose-style ``__test__`` attribute on modules, classes and
  functions, including unittest-style Classes.  If set to False, the
  test will not be collected.

- fix issue512: show "<notset>" for arguments which might not be set
  in monkeypatch plugin.  Improves output in documentation.

- avoid importing "py.test" (an old alias module for "pytest")


================================================
FILE: doc/en/announce/release-2.6.1.rst
================================================
pytest-2.6.1: fixes and new xfail feature
===========================================================================

pytest is a mature Python testing tool with more than 1100 tests
against itself, passing on many different interpreters and platforms.
The 2.6.1 release is drop-in compatible to 2.5.2 and actually fixes some
regressions introduced with 2.6.0.  It also brings a little feature
to the xfail marker which now recognizes expected exceptions,
see the CHANGELOG below.

See docs at:

    http://pytest.org

As usual, you can upgrade from pypi via::

    pip install -U pytest

Thanks to all who contributed, among them:

    Floris Bruynooghe
    Bruno Oliveira
    Nicolas Delaby

have fun,
holger krekel

Changes 2.6.1
=================

- No longer show line numbers in the --verbose output, the output is now
  purely the nodeid.  The line number is still shown in failure reports.
  Thanks Floris Bruynooghe.

- fix issue437 where assertion rewriting could cause pytest-xdist worker nodes
  to collect different tests. Thanks Bruno Oliveira.

- fix issue555: add "errors" attribute to capture-streams to satisfy
  some distutils and possibly other code accessing sys.stdout.errors.

- fix issue547 capsys/capfd also work when output capturing ("-s") is disabled.

- address issue170: allow pytest.mark.xfail(...) to specify expected exceptions via
  an optional "raises=EXC" argument where EXC can be a single exception
  or a tuple of exception classes.  Thanks David Mohr for the complete
  PR.

- 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 a ".py" extension

- don't use py.std import helper, rather import things directly.
  Thanks Bruno Oliveira.


================================================
FILE: doc/en/announce/release-2.6.2.rst
================================================
pytest-2.6.2: few fixes and cx_freeze support
===========================================================================

pytest is a mature Python testing tool with more than 1100 tests
against itself, passing on many different interpreters and platforms.
This release is drop-in compatible to 2.5.2 and 2.6.X.  It also
brings support for including pytest with cx_freeze or similar
freezing tools into your single-file app distribution.  For details
see the CHANGELOG below.

See docs at:

    http://pytest.org

As usual, you can upgrade from pypi via::

    pip install -U pytest

Thanks to all who contributed, among them:

    Floris Bruynooghe
    Benjamin Peterson
    Bruno Oliveira

have fun,
holger krekel

2.6.2
-----------

- Added function pytest.freeze_includes(), which makes it easy to embed
  pytest into executables using tools like cx_freeze.
  See docs for examples and rationale. Thanks Bruno Oliveira.

- Improve assertion rewriting cache invalidation precision.

- fixed issue561: adapt autouse fixture example for python3.

- fixed issue453: assertion rewriting issue with __repr__ containing
  "\n{", "\n}" and "\n~".

- fix issue560: correctly display code if an "else:" or "finally:" is
  followed by statements on the same line.

- 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.


================================================
FILE: doc/en/announce/release-2.6.3.rst
================================================
pytest-2.6.3: fixes and little improvements
===========================================================================

pytest is a mature Python testing tool with more than 1100 tests
against itself, passing on many different interpreters and platforms.
This release is drop-in compatible to 2.5.2 and 2.6.X.
See below for the changes and see docs at:

    http://pytest.org

As usual, you can upgrade from pypi via::

    pip install -U pytest

Thanks to all who contributed, among them:

    Floris Bruynooghe
    Oleg Sinyavskiy
    Uwe Schmitt
    Charles Cloud
    Wolfgang Schnerring

have fun,
holger krekel

Changes 2.6.3
======================

- fix issue575: xunit-xml was reporting collection errors as failures
  instead of errors, thanks Oleg Sinyavskiy.

- fix issue582: fix setuptools example, thanks Laszlo Papp and Ronny
  Pfannschmidt.

- Fix infinite recursion bug when pickling capture.EncodedFile, thanks
  Uwe Schmitt.

- fix issue589: fix bad interaction with numpy and others when showing
  exceptions.  Check for precise "maximum recursion depth exceed" exception
  instead of presuming any RuntimeError is that one (implemented in py
  dep).  Thanks Charles Cloud for analysing the issue.

- fix conftest related fixture visibility issue: when running with a
  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.


========================
Download .txt
gitextract_zvz9np91/

├── .git-blame-ignore-revs
├── .gitattributes
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── 1_bug_report.md
│   │   ├── 2_feature_request.md
│   │   └── config.yml
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── chronographer.yml
│   ├── config.yml
│   ├── dependabot.yml
│   ├── labels.toml
│   ├── patchback.yml
│   └── workflows/
│       ├── deploy.yml
│       ├── doc-check-links.yml
│       ├── prepare-release-pr.yml
│       ├── stale.yml
│       ├── test.yml
│       └── update-plugin-list.yml
├── .gitignore
├── .mailmap
├── .pre-commit-config.yaml
├── .readthedocs.yaml
├── AUTHORS
├── CHANGELOG.rst
├── CITATION
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.rst
├── LICENSE
├── OPENCOLLECTIVE.rst
├── README.rst
├── RELEASING.rst
├── TIDELIFT.rst
├── bench/
│   ├── bench.py
│   ├── bench_argcomplete.py
│   ├── empty.py
│   ├── manyparam.py
│   ├── skip.py
│   ├── unit_test.py
│   └── xunit.py
├── changelog/
│   ├── .gitignore
│   ├── 12444.bugfix.rst
│   ├── 12689.contrib.rst
│   ├── 12882.deprecation.rst
│   ├── 13192.bugfix.rst
│   ├── 13388.doc.rst
│   ├── 13409.deprecation.rst
│   ├── 13634.bugfix.rst
│   ├── 13731.doc.rst
│   ├── 13734.bugfix.rst
│   ├── 13884.bugfix.rst
│   ├── 13917.bugfix.rst
│   ├── 13946.deprecation.rst
│   ├── 13963.bugfix.rst
│   ├── 14023.feature.rst
│   ├── 14026.improvement.rst
│   ├── 14050.bugfix.rst
│   ├── 14088.doc.rst
│   ├── 14114.bugfix.rst
│   ├── 14195.bugfix.rst
│   ├── 14255.doc.rst
│   ├── 14303.doc.rst
│   ├── 5848.bugfix.rst
│   ├── 719.bugfix.rst
│   ├── README.rst
│   └── _template.rst
├── codecov.yml
├── doc/
│   └── en/
│       ├── Makefile
│       ├── _static/
│       │   └── pytest-custom.css
│       ├── _templates/
│       │   └── links.html
│       ├── adopt.rst
│       ├── announce/
│       │   ├── index.rst
│       │   ├── release-2.0.0.rst
│       │   ├── release-2.0.1.rst
│       │   ├── release-2.0.2.rst
│       │   ├── release-2.0.3.rst
│       │   ├── release-2.1.0.rst
│       │   ├── release-2.1.1.rst
│       │   ├── release-2.1.2.rst
│       │   ├── release-2.1.3.rst
│       │   ├── release-2.2.0.rst
│       │   ├── release-2.2.1.rst
│       │   ├── release-2.2.2.rst
│       │   ├── release-2.2.4.rst
│       │   ├── release-2.3.0.rst
│       │   ├── release-2.3.1.rst
│       │   ├── release-2.3.2.rst
│       │   ├── release-2.3.3.rst
│       │   ├── release-2.3.4.rst
│       │   ├── release-2.3.5.rst
│       │   ├── release-2.4.0.rst
│       │   ├── release-2.4.1.rst
│       │   ├── release-2.4.2.rst
│       │   ├── release-2.5.0.rst
│       │   ├── release-2.5.1.rst
│       │   ├── release-2.5.2.rst
│       │   ├── release-2.6.0.rst
│       │   ├── release-2.6.1.rst
│       │   ├── release-2.6.2.rst
│       │   ├── release-2.6.3.rst
│       │   ├── release-2.7.0.rst
│       │   ├── release-2.7.1.rst
│       │   ├── release-2.7.2.rst
│       │   ├── release-2.8.2.rst
│       │   ├── release-2.8.3.rst
│       │   ├── release-2.8.4.rst
│       │   ├── release-2.8.5.rst
│       │   ├── release-2.8.6.rst
│       │   ├── release-2.8.7.rst
│       │   ├── release-2.9.0.rst
│       │   ├── release-2.9.1.rst
│       │   ├── release-2.9.2.rst
│       │   ├── release-3.0.0.rst
│       │   ├── release-3.0.1.rst
│       │   ├── release-3.0.2.rst
│       │   ├── release-3.0.3.rst
│       │   ├── release-3.0.4.rst
│       │   ├── release-3.0.5.rst
│       │   ├── release-3.0.6.rst
│       │   ├── release-3.0.7.rst
│       │   ├── release-3.1.0.rst
│       │   ├── release-3.1.1.rst
│       │   ├── release-3.1.2.rst
│       │   ├── release-3.1.3.rst
│       │   ├── release-3.10.0.rst
│       │   ├── release-3.10.1.rst
│       │   ├── release-3.2.0.rst
│       │   ├── release-3.2.1.rst
│       │   ├── release-3.2.2.rst
│       │   ├── release-3.2.3.rst
│       │   ├── release-3.2.4.rst
│       │   ├── release-3.2.5.rst
│       │   ├── release-3.3.0.rst
│       │   ├── release-3.3.1.rst
│       │   ├── release-3.3.2.rst
│       │   ├── release-3.4.0.rst
│       │   ├── release-3.4.1.rst
│       │   ├── release-3.4.2.rst
│       │   ├── release-3.5.0.rst
│       │   ├── release-3.5.1.rst
│       │   ├── release-3.6.0.rst
│       │   ├── release-3.6.1.rst
│       │   ├── release-3.6.2.rst
│       │   ├── release-3.6.3.rst
│       │   ├── release-3.6.4.rst
│       │   ├── release-3.7.0.rst
│       │   ├── release-3.7.1.rst
│       │   ├── release-3.7.2.rst
│       │   ├── release-3.7.3.rst
│       │   ├── release-3.7.4.rst
│       │   ├── release-3.8.0.rst
│       │   ├── release-3.8.1.rst
│       │   ├── release-3.8.2.rst
│       │   ├── release-3.9.0.rst
│       │   ├── release-3.9.1.rst
│       │   ├── release-3.9.2.rst
│       │   ├── release-3.9.3.rst
│       │   ├── release-4.0.0.rst
│       │   ├── release-4.0.1.rst
│       │   ├── release-4.0.2.rst
│       │   ├── release-4.1.0.rst
│       │   ├── release-4.1.1.rst
│       │   ├── release-4.2.0.rst
│       │   ├── release-4.2.1.rst
│       │   ├── release-4.3.0.rst
│       │   ├── release-4.3.1.rst
│       │   ├── release-4.4.0.rst
│       │   ├── release-4.4.1.rst
│       │   ├── release-4.4.2.rst
│       │   ├── release-4.5.0.rst
│       │   ├── release-4.6.0.rst
│       │   ├── release-4.6.1.rst
│       │   ├── release-4.6.2.rst
│       │   ├── release-4.6.3.rst
│       │   ├── release-4.6.4.rst
│       │   ├── release-4.6.5.rst
│       │   ├── release-4.6.6.rst
│       │   ├── release-4.6.7.rst
│       │   ├── release-4.6.8.rst
│       │   ├── release-4.6.9.rst
│       │   ├── release-5.0.0.rst
│       │   ├── release-5.0.1.rst
│       │   ├── release-5.1.0.rst
│       │   ├── release-5.1.1.rst
│       │   ├── release-5.1.2.rst
│       │   ├── release-5.1.3.rst
│       │   ├── release-5.2.0.rst
│       │   ├── release-5.2.1.rst
│       │   ├── release-5.2.2.rst
│       │   ├── release-5.2.3.rst
│       │   ├── release-5.2.4.rst
│       │   ├── release-5.3.0.rst
│       │   ├── release-5.3.1.rst
│       │   ├── release-5.3.2.rst
│       │   ├── release-5.3.3.rst
│       │   ├── release-5.3.4.rst
│       │   ├── release-5.3.5.rst
│       │   ├── release-5.4.0.rst
│       │   ├── release-5.4.1.rst
│       │   ├── release-5.4.2.rst
│       │   ├── release-5.4.3.rst
│       │   ├── release-6.0.0.rst
│       │   ├── release-6.0.0rc1.rst
│       │   ├── release-6.0.1.rst
│       │   ├── release-6.0.2.rst
│       │   ├── release-6.1.0.rst
│       │   ├── release-6.1.1.rst
│       │   ├── release-6.1.2.rst
│       │   ├── release-6.2.0.rst
│       │   ├── release-6.2.1.rst
│       │   ├── release-6.2.2.rst
│       │   ├── release-6.2.3.rst
│       │   ├── release-6.2.4.rst
│       │   ├── release-6.2.5.rst
│       │   ├── release-7.0.0.rst
│       │   ├── release-7.0.0rc1.rst
│       │   ├── release-7.0.1.rst
│       │   ├── release-7.1.0.rst
│       │   ├── release-7.1.1.rst
│       │   ├── release-7.1.2.rst
│       │   ├── release-7.1.3.rst
│       │   ├── release-7.2.0.rst
│       │   ├── release-7.2.1.rst
│       │   ├── release-7.2.2.rst
│       │   ├── release-7.3.0.rst
│       │   ├── release-7.3.1.rst
│       │   ├── release-7.3.2.rst
│       │   ├── release-7.4.0.rst
│       │   ├── release-7.4.1.rst
│       │   ├── release-7.4.2.rst
│       │   ├── release-7.4.3.rst
│       │   ├── release-7.4.4.rst
│       │   ├── release-8.0.0.rst
│       │   ├── release-8.0.0rc1.rst
│       │   ├── release-8.0.0rc2.rst
│       │   ├── release-8.0.1.rst
│       │   ├── release-8.0.2.rst
│       │   ├── release-8.1.0.rst
│       │   ├── release-8.1.1.rst
│       │   ├── release-8.1.2.rst
│       │   ├── release-8.2.0.rst
│       │   ├── release-8.2.1.rst
│       │   ├── release-8.2.2.rst
│       │   ├── release-8.3.0.rst
│       │   ├── release-8.3.1.rst
│       │   ├── release-8.3.2.rst
│       │   ├── release-8.3.3.rst
│       │   ├── release-8.3.4.rst
│       │   ├── release-8.3.5.rst
│       │   ├── release-8.4.0.rst
│       │   ├── release-8.4.1.rst
│       │   ├── release-8.4.2.rst
│       │   ├── release-9.0.0.rst
│       │   ├── release-9.0.1.rst
│       │   ├── release-9.0.2.rst
│       │   └── sprint2016.rst
│       ├── backwards-compatibility.rst
│       ├── broken-dep-constraints.txt
│       ├── builtin.rst
│       ├── changelog.rst
│       ├── conf.py
│       ├── conftest.py
│       ├── contact.rst
│       ├── contents.rst
│       ├── contributing.rst
│       ├── deprecations.rst
│       ├── development_guide.rst
│       ├── example/
│       │   ├── .ruff.toml
│       │   ├── assertion/
│       │   │   ├── failure_demo.py
│       │   │   ├── global_testmodule_config/
│       │   │   │   ├── conftest.py
│       │   │   │   └── test_hello_world.py
│       │   │   ├── test_failures.py
│       │   │   └── test_setup_flow_example.py
│       │   ├── attic.rst
│       │   ├── conftest.py
│       │   ├── customdirectory/
│       │   │   ├── conftest.py
│       │   │   ├── pytest.ini
│       │   │   └── tests/
│       │   │       ├── manifest.json
│       │   │       ├── test_first.py
│       │   │       ├── test_second.py
│       │   │       └── test_third.py
│       │   ├── customdirectory.rst
│       │   ├── fixtures/
│       │   │   ├── test_fixtures_order_autouse.py
│       │   │   ├── test_fixtures_order_autouse_multiple_scopes.py
│       │   │   ├── test_fixtures_order_autouse_temp_effects.py
│       │   │   ├── test_fixtures_order_dependencies.py
│       │   │   ├── test_fixtures_order_scope.py
│       │   │   └── test_fixtures_request_different_scope.py
│       │   ├── index.rst
│       │   ├── markers.rst
│       │   ├── multipython.py
│       │   ├── nonpython/
│       │   │   ├── __init__.py
│       │   │   ├── conftest.py
│       │   │   └── test_simple.yaml
│       │   ├── nonpython.rst
│       │   ├── parametrize.rst
│       │   ├── pythoncollection.py
│       │   ├── pythoncollection.rst
│       │   ├── reportingdemo.rst
│       │   ├── simple.rst
│       │   ├── special.rst
│       │   └── xfail_demo.py
│       ├── explanation/
│       │   ├── anatomy.rst
│       │   ├── ci.rst
│       │   ├── fixtures.rst
│       │   ├── flaky.rst
│       │   ├── goodpractices.rst
│       │   ├── index.rst
│       │   ├── pythonpath.rst
│       │   └── types.rst
│       ├── funcarg_compare.rst
│       ├── funcargs.rst
│       ├── getting-started.rst
│       ├── historical-notes.rst
│       ├── history.rst
│       ├── how-to/
│       │   ├── assert.rst
│       │   ├── bash-completion.rst
│       │   ├── cache.rst
│       │   ├── capture-stdout-stderr.rst
│       │   ├── capture-warnings.rst
│       │   ├── doctest.rst
│       │   ├── existingtestsuite.rst
│       │   ├── failures.rst
│       │   ├── fixtures.rst
│       │   ├── index.rst
│       │   ├── logging.rst
│       │   ├── mark.rst
│       │   ├── monkeypatch.rst
│       │   ├── output.rst
│       │   ├── parametrize.rst
│       │   ├── plugins.rst
│       │   ├── skipping.rst
│       │   ├── subtests.rst
│       │   ├── tmp_path.rst
│       │   ├── unittest.rst
│       │   ├── usage.rst
│       │   ├── writing_hook_functions.rst
│       │   ├── writing_plugins.rst
│       │   └── xunit_setup.rst
│       ├── index.rst
│       ├── license.rst
│       ├── naming20.rst
│       ├── proposals/
│       │   └── parametrize_with_fixtures.rst
│       ├── pytest.ini
│       ├── recwarn.rst
│       ├── reference/
│       │   ├── customize.rst
│       │   ├── exit-codes.rst
│       │   ├── fixtures.rst
│       │   ├── index.rst
│       │   ├── plugin_list.rst
│       │   └── reference.rst
│       ├── requirements.txt
│       ├── sponsor.rst
│       ├── talks.rst
│       ├── tidelift.rst
│       └── yieldfixture.rst
├── extra/
│   └── get_issues.py
├── pyproject.toml
├── scripts/
│   ├── .gitignore
│   ├── generate-gh-release-notes.py
│   ├── prepare-release-pr.py
│   ├── release.major.rst
│   ├── release.minor.rst
│   ├── release.patch.rst
│   ├── release.pre.rst
│   ├── release.py
│   └── update-plugin-list.py
├── src/
│   ├── _pytest/
│   │   ├── __init__.py
│   │   ├── _argcomplete.py
│   │   ├── _code/
│   │   │   ├── __init__.py
│   │   │   ├── code.py
│   │   │   └── source.py
│   │   ├── _io/
│   │   │   ├── __init__.py
│   │   │   ├── pprint.py
│   │   │   ├── saferepr.py
│   │   │   ├── terminalwriter.py
│   │   │   └── wcwidth.py
│   │   ├── _py/
│   │   │   ├── __init__.py
│   │   │   ├── error.py
│   │   │   └── path.py
│   │   ├── assertion/
│   │   │   ├── __init__.py
│   │   │   ├── rewrite.py
│   │   │   ├── truncate.py
│   │   │   └── util.py
│   │   ├── cacheprovider.py
│   │   ├── capture.py
│   │   ├── compat.py
│   │   ├── config/
│   │   │   ├── __init__.py
│   │   │   ├── argparsing.py
│   │   │   ├── exceptions.py
│   │   │   └── findpaths.py
│   │   ├── debugging.py
│   │   ├── deprecated.py
│   │   ├── doctest.py
│   │   ├── faulthandler.py
│   │   ├── fixtures.py
│   │   ├── freeze_support.py
│   │   ├── helpconfig.py
│   │   ├── hookspec.py
│   │   ├── junitxml.py
│   │   ├── legacypath.py
│   │   ├── logging.py
│   │   ├── main.py
│   │   ├── mark/
│   │   │   ├── __init__.py
│   │   │   ├── expression.py
│   │   │   └── structures.py
│   │   ├── monkeypatch.py
│   │   ├── nodes.py
│   │   ├── outcomes.py
│   │   ├── pastebin.py
│   │   ├── pathlib.py
│   │   ├── py.typed
│   │   ├── pytester.py
│   │   ├── pytester_assertions.py
│   │   ├── python.py
│   │   ├── python_api.py
│   │   ├── raises.py
│   │   ├── recwarn.py
│   │   ├── reports.py
│   │   ├── runner.py
│   │   ├── scope.py
│   │   ├── setuponly.py
│   │   ├── setupplan.py
│   │   ├── skipping.py
│   │   ├── stash.py
│   │   ├── stepwise.py
│   │   ├── subtests.py
│   │   ├── terminal.py
│   │   ├── terminalprogress.py
│   │   ├── threadexception.py
│   │   ├── timing.py
│   │   ├── tmpdir.py
│   │   ├── tracemalloc.py
│   │   ├── unittest.py
│   │   ├── unraisableexception.py
│   │   ├── warning_types.py
│   │   └── warnings.py
│   ├── py.py
│   └── pytest/
│       ├── __init__.py
│       ├── __main__.py
│       └── py.typed
├── testing/
│   ├── _py/
│   │   └── test_local.py
│   ├── acceptance_test.py
│   ├── code/
│   │   ├── test_code.py
│   │   ├── test_excinfo.py
│   │   └── test_source.py
│   ├── conftest.py
│   ├── deprecated_test.py
│   ├── example_scripts/
│   │   ├── README.rst
│   │   ├── __init__.py
│   │   ├── acceptance/
│   │   │   └── fixture_mock_integration.py
│   │   ├── collect/
│   │   │   ├── collect_init_tests/
│   │   │   │   ├── pytest.ini
│   │   │   │   └── tests/
│   │   │   │       ├── __init__.py
│   │   │   │       └── test_foo.py
│   │   │   ├── package_infinite_recursion/
│   │   │   │   ├── __init__.pyi
│   │   │   │   ├── conftest.py
│   │   │   │   └── tests/
│   │   │   │       ├── __init__.py
│   │   │   │       └── test_basic.py
│   │   │   └── package_init_given_as_arg/
│   │   │       └── pkg/
│   │   │           ├── __init__.py
│   │   │           └── test_foo.py
│   │   ├── config/
│   │   │   └── collect_pytest_prefix/
│   │   │       ├── __init__.pyi
│   │   │       ├── conftest.py
│   │   │       └── test_foo.py
│   │   ├── conftest_usageerror/
│   │   │   ├── __init__.pyi
│   │   │   └── conftest.py
│   │   ├── customdirectory/
│   │   │   ├── conftest.py
│   │   │   ├── pytest.ini
│   │   │   └── tests/
│   │   │       ├── manifest.json
│   │   │       ├── test_first.py
│   │   │       ├── test_second.py
│   │   │       └── test_third.py
│   │   ├── dataclasses/
│   │   │   ├── test_compare_dataclasses.py
│   │   │   ├── test_compare_dataclasses_field_comparison_off.py
│   │   │   ├── test_compare_dataclasses_verbose.py
│   │   │   ├── test_compare_dataclasses_with_custom_eq.py
│   │   │   ├── test_compare_initvar.py
│   │   │   ├── test_compare_recursive_dataclasses.py
│   │   │   └── test_compare_two_different_dataclasses.py
│   │   ├── doctest/
│   │   │   └── main_py/
│   │   │       ├── __main__.py
│   │   │       └── test_normal_module.py
│   │   ├── fixtures/
│   │   │   ├── custom_item/
│   │   │   │   ├── __init__.pyi
│   │   │   │   ├── conftest.py
│   │   │   │   └── foo/
│   │   │   │       ├── __init__.py
│   │   │   │       └── test_foo.py
│   │   │   ├── fill_fixtures/
│   │   │   │   ├── test_conftest_funcargs_only_available_in_subdir/
│   │   │   │   │   ├── sub1/
│   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   ├── conftest.py
│   │   │   │   │   │   └── test_in_sub1.py
│   │   │   │   │   └── sub2/
│   │   │   │   │       ├── __init__.py
│   │   │   │   │       ├── conftest.py
│   │   │   │   │       └── test_in_sub2.py
│   │   │   │   ├── test_detect_recursive_dependency_error.py
│   │   │   │   ├── test_extend_fixture_conftest_conftest/
│   │   │   │   │   ├── __init__.pyi
│   │   │   │   │   ├── conftest.py
│   │   │   │   │   └── pkg/
│   │   │   │   │       ├── __init__.py
│   │   │   │   │       ├── conftest.py
│   │   │   │   │       └── test_spam.py
│   │   │   │   ├── test_extend_fixture_conftest_module/
│   │   │   │   │   ├── __init__.pyi
│   │   │   │   │   ├── conftest.py
│   │   │   │   │   └── test_extend_fixture_conftest_module.py
│   │   │   │   ├── test_extend_fixture_module_class.py
│   │   │   │   ├── test_funcarg_basic.py
│   │   │   │   ├── test_funcarg_lookup_classlevel.py
│   │   │   │   ├── test_funcarg_lookup_modulelevel.py
│   │   │   │   └── test_funcarg_lookupfails.py
│   │   │   ├── test_fixture_named_request.py
│   │   │   └── test_getfixturevalue_dynamic.py
│   │   ├── issue88_initial_file_multinodes/
│   │   │   ├── __init__.pyi
│   │   │   ├── conftest.py
│   │   │   └── test_hello.py
│   │   ├── issue_519.py
│   │   ├── junit-10.xsd
│   │   ├── marks/
│   │   │   └── marks_considered_keywords/
│   │   │       ├── __init__.pyi
│   │   │       ├── conftest.py
│   │   │       └── test_marks_as_keywords.py
│   │   ├── perf_examples/
│   │   │   └── collect_stats/
│   │   │       ├── .gitignore
│   │   │       ├── generate_folders.py
│   │   │       └── template_test.py
│   │   ├── pytest.ini
│   │   ├── tmpdir/
│   │   │   └── tmp_path_fixture.py
│   │   ├── unittest/
│   │   │   ├── test_parametrized_fixture_error_message.py
│   │   │   ├── test_setup_skip.py
│   │   │   ├── test_setup_skip_class.py
│   │   │   ├── test_setup_skip_module.py
│   │   │   ├── test_unittest_asyncio.py
│   │   │   ├── test_unittest_asynctest.py
│   │   │   └── test_unittest_plain_async.py
│   │   └── warnings/
│   │       ├── test_group_warnings_by_message.py
│   │       └── test_group_warnings_by_message_summary/
│   │           ├── test_1.py
│   │           └── test_2.py
│   ├── examples/
│   │   └── test_issue519.py
│   ├── freeze/
│   │   ├── .gitignore
│   │   ├── create_executable.py
│   │   ├── runtests_script.py
│   │   ├── tests/
│   │   │   ├── test_doctest.txt
│   │   │   └── test_trivial.py
│   │   └── tox_run.py
│   ├── io/
│   │   ├── test_pprint.py
│   │   ├── test_saferepr.py
│   │   ├── test_terminalwriter.py
│   │   └── test_wcwidth.py
│   ├── logging/
│   │   ├── test_fixture.py
│   │   ├── test_formatter.py
│   │   └── test_reporting.py
│   ├── plugins_integration/
│   │   ├── .gitignore
│   │   ├── README.rst
│   │   ├── bdd_wallet.feature
│   │   ├── bdd_wallet.py
│   │   ├── django_settings.py
│   │   ├── pytest.ini
│   │   ├── pytest_anyio_integration.py
│   │   ├── pytest_asyncio_integration.py
│   │   ├── pytest_mock_integration.py
│   │   ├── pytest_rerunfailures_integration.py
│   │   ├── pytest_trio_integration.py
│   │   ├── pytest_twisted_integration.py
│   │   ├── requirements.txt
│   │   └── simple_integration.py
│   ├── python/
│   │   ├── approx.py
│   │   ├── collect.py
│   │   ├── fixtures.py
│   │   ├── integration.py
│   │   ├── metafunc.py
│   │   ├── raises.py
│   │   ├── raises_group.py
│   │   └── show_fixtures_per_test.py
│   ├── test_argcomplete.py
│   ├── test_assertion.py
│   ├── test_assertrewrite.py
│   ├── test_cacheprovider.py
│   ├── test_capture.py
│   ├── test_collect_imported_tests.py
│   ├── test_collection.py
│   ├── test_compat.py
│   ├── test_config.py
│   ├── test_conftest.py
│   ├── test_debugging.py
│   ├── test_doctest.py
│   ├── test_entry_points.py
│   ├── test_error_diffs.py
│   ├── test_faulthandler.py
│   ├── test_findpaths.py
│   ├── test_helpconfig.py
│   ├── test_junitxml.py
│   ├── test_legacypath.py
│   ├── test_link_resolve.py
│   ├── test_main.py
│   ├── test_mark.py
│   ├── test_mark_expression.py
│   ├── test_meta.py
│   ├── test_monkeypatch.py
│   ├── test_nodes.py
│   ├── test_parseopt.py
│   ├── test_pastebin.py
│   ├── test_pathlib.py
│   ├── test_pluginmanager.py
│   ├── test_pytester.py
│   ├── test_python_path.py
│   ├── test_recwarn.py
│   ├── test_reports.py
│   ├── test_runner.py
│   ├── test_runner_xunit.py
│   ├── test_scope.py
│   ├── test_session.py
│   ├── test_setuponly.py
│   ├── test_setupplan.py
│   ├── test_skipping.py
│   ├── test_stash.py
│   ├── test_stepwise.py
│   ├── test_subtests.py
│   ├── test_terminal.py
│   ├── test_threadexception.py
│   ├── test_tmpdir.py
│   ├── test_unittest.py
│   ├── test_unraisableexception.py
│   ├── test_warning_types.py
│   ├── test_warnings.py
│   ├── typing_checks.py
│   └── typing_raises_group.py
└── tox.ini
Download .txt
Showing preview only (562K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (5916 symbols across 236 files)

FILE: bench/manyparam.py
  function foo (line 7) | def foo(request):
  function test_it (line 11) | def test_it(foo):
  function test_it2 (line 15) | def test_it2(foo):

FILE: bench/skip.py
  function test_foo (line 10) | def test_foo(x):

FILE: doc/en/conf.py
  function setup (line 276) | def setup(app: sphinx.application.Sphinx) -> None:

FILE: doc/en/example/assertion/failure_demo.py
  function otherfunc (line 7) | def otherfunc(a, b):
  function somefunc (line 11) | def somefunc(x, y):
  function otherfunc_multi (line 15) | def otherfunc_multi(a, b):
  function test_generative (line 20) | def test_generative(param1, param2):
  class TestFailing (line 24) | class TestFailing:
    method test_simple (line 25) | def test_simple(self):
    method test_simple_multiline (line 34) | def test_simple_multiline(self):
    method test_not (line 37) | def test_not(self):
  class TestSpecialisedExplanations (line 44) | class TestSpecialisedExplanations:
    method test_eq_text (line 45) | def test_eq_text(self):
    method test_eq_similar_text (line 48) | def test_eq_similar_text(self):
    method test_eq_multiline_text (line 51) | def test_eq_multiline_text(self):
    method test_eq_long_text (line 54) | def test_eq_long_text(self):
    method test_eq_long_text_multiline (line 59) | def test_eq_long_text_multiline(self):
    method test_eq_list (line 64) | def test_eq_list(self):
    method test_eq_list_long (line 67) | def test_eq_list_long(self):
    method test_eq_dict (line 72) | def test_eq_dict(self):
    method test_eq_set (line 75) | def test_eq_set(self):
    method test_eq_longer_list (line 78) | def test_eq_longer_list(self):
    method test_in_list (line 81) | def test_in_list(self):
    method test_not_in_text_multiline (line 84) | def test_not_in_text_multiline(self):
    method test_not_in_text_single (line 88) | def test_not_in_text_single(self):
    method test_not_in_text_single_long (line 92) | def test_not_in_text_single_long(self):
    method test_not_in_text_single_long_term (line 96) | def test_not_in_text_single_long_term(self):
    method test_eq_dataclass (line 100) | def test_eq_dataclass(self):
    method test_eq_attrs (line 112) | def test_eq_attrs(self):
  function test_attribute (line 125) | def test_attribute():
  function test_attribute_instance (line 133) | def test_attribute_instance():
  function test_attribute_failure (line 140) | def test_attribute_failure():
  function test_attribute_multiple (line 151) | def test_attribute_multiple():
  function globf (line 161) | def globf(x):
  class TestRaises (line 165) | class TestRaises:
    method test_raises (line 166) | def test_raises(self):
    method test_raises_doesnt (line 170) | def test_raises_doesnt(self):
    method test_raise (line 173) | def test_raise(self):
    method test_tupleerror (line 176) | def test_tupleerror(self):
    method test_reinterpret_fails_with_print_for_the_fun_of_it (line 179) | def test_reinterpret_fails_with_print_for_the_fun_of_it(self):
    method test_some_error (line 184) | def test_some_error(self):
    method func1 (line 188) | def func1(self):
  function test_dynamic_compile_shows_nicely (line 193) | def test_dynamic_compile_shows_nicely():
  class TestMoreErrors (line 207) | class TestMoreErrors:
    method test_complex_error (line 208) | def test_complex_error(self):
    method test_z1_unpack_error (line 217) | def test_z1_unpack_error(self):
    method test_z2_type_error (line 221) | def test_z2_type_error(self):
    method test_startswith (line 225) | def test_startswith(self):
    method test_startswith_nested (line 230) | def test_startswith_nested(self):
    method test_global_func (line 239) | def test_global_func(self):
    method test_instance (line 242) | def test_instance(self):
    method test_compare (line 246) | def test_compare(self):
    method test_try_finally (line 249) | def test_try_finally(self):
  class TestCustomAssertMsg (line 257) | class TestCustomAssertMsg:
    method test_single_line (line 258) | def test_single_line(self):
    method test_multiline (line 265) | def test_multiline(self):
    method test_custom_repr (line 274) | def test_custom_repr(self):

FILE: doc/en/example/assertion/global_testmodule_config/conftest.py
  function pytest_runtest_setup (line 11) | def pytest_runtest_setup(item):

FILE: doc/en/example/assertion/global_testmodule_config/test_hello_world.py
  function test_func (line 7) | def test_func():

FILE: doc/en/example/assertion/test_failures.py
  function test_failure_demo_fails_properly (line 11) | def test_failure_demo_fails_properly(pytester):

FILE: doc/en/example/assertion/test_setup_flow_example.py
  function setup_module (line 4) | def setup_module(module):
  class TestStateFullThing (line 8) | class TestStateFullThing:
    method setup_class (line 9) | def setup_class(cls):
    method teardown_class (line 12) | def teardown_class(cls):
    method setup_method (line 15) | def setup_method(self, method):
    method test_42 (line 18) | def test_42(self):
    method test_23 (line 22) | def test_23(self):
  function teardown_module (line 27) | def teardown_module(module):

FILE: doc/en/example/customdirectory/conftest.py
  class ManifestDirectory (line 9) | class ManifestDirectory(pytest.Directory):
    method collect (line 10) | def collect(self):
  function pytest_collect_directory (line 25) | def pytest_collect_directory(path, parent):

FILE: doc/en/example/customdirectory/tests/test_first.py
  function test_1 (line 5) | def test_1():

FILE: doc/en/example/customdirectory/tests/test_second.py
  function test_2 (line 5) | def test_2():

FILE: doc/en/example/customdirectory/tests/test_third.py
  function test_3 (line 5) | def test_3():

FILE: doc/en/example/fixtures/test_fixtures_order_autouse.py
  function order (line 7) | def order():
  function a (line 12) | def a(order):
  function b (line 17) | def b(a, order):
  function c (line 22) | def c(b, order):
  function d (line 27) | def d(b, order):
  function e (line 32) | def e(d, order):
  function f (line 37) | def f(e, order):
  function g (line 42) | def g(f, c, order):
  function test_order_and_g (line 46) | def test_order_and_g(g, order):

FILE: doc/en/example/fixtures/test_fixtures_order_autouse_multiple_scopes.py
  function order (line 7) | def order():
  function c1 (line 12) | def c1(order):
  function c2 (line 17) | def c2(order):
  function c3 (line 22) | def c3(order, c1):
  class TestClassWithC1Request (line 26) | class TestClassWithC1Request:
    method test_order (line 27) | def test_order(self, order, c1, c3):
  class TestClassWithoutC1Request (line 31) | class TestClassWithoutC1Request:
    method test_order (line 32) | def test_order(self, order, c2):

FILE: doc/en/example/fixtures/test_fixtures_order_autouse_temp_effects.py
  function order (line 7) | def order():
  function c1 (line 12) | def c1(order):
  function c2 (line 17) | def c2(order):
  class TestClassWithAutouse (line 21) | class TestClassWithAutouse:
    method c3 (line 23) | def c3(self, order, c2):
    method test_req (line 26) | def test_req(self, order, c1):
    method test_no_req (line 29) | def test_no_req(self, order):
  class TestClassWithoutAutouse (line 33) | class TestClassWithoutAutouse:
    method test_req (line 34) | def test_req(self, order, c1):
    method test_no_req (line 37) | def test_no_req(self, order):

FILE: doc/en/example/fixtures/test_fixtures_order_dependencies.py
  function order (line 7) | def order():
  function a (line 12) | def a(order):
  function b (line 17) | def b(a, order):
  function c (line 22) | def c(b, order):
  function d (line 27) | def d(c, b, order):
  function e (line 32) | def e(d, b, order):
  function f (line 37) | def f(e, order):
  function g (line 42) | def g(f, c, order):
  function test_order (line 46) | def test_order(g, order):

FILE: doc/en/example/fixtures/test_fixtures_order_scope.py
  function order (line 7) | def order():
  function func (line 12) | def func(order):
  function cls (line 17) | def cls(order):
  function mod (line 22) | def mod(order):
  function pack (line 27) | def pack(order):
  function sess (line 32) | def sess(order):
  class TestClass (line 36) | class TestClass:
    method test_order (line 37) | def test_order(self, func, cls, mod, pack, sess, order):

FILE: doc/en/example/fixtures/test_fixtures_request_different_scope.py
  function order (line 7) | def order():
  function outer (line 12) | def outer(order, inner):
  class TestOne (line 16) | class TestOne:
    method inner (line 18) | def inner(self, order):
    method test_order (line 21) | def test_order(self, order, outer):
  class TestTwo (line 25) | class TestTwo:
    method inner (line 27) | def inner(self, order):
    method test_order (line 30) | def test_order(self, order, outer):

FILE: doc/en/example/multipython.py
  function python1 (line 17) | def python1(request, tmp_path):
  function python2 (line 23) | def python2(request, python1):
  class Python (line 27) | class Python:
    method __init__ (line 28) | def __init__(self, version, picklefile):
    method dumps (line 34) | def dumps(self, obj):
    method load_and_is_true (line 48) | def load_and_is_true(self, expression):
  function test_basic_objects (line 68) | def test_basic_objects(python1, python2, obj):

FILE: doc/en/example/nonpython/conftest.py
  function pytest_collect_file (line 7) | def pytest_collect_file(parent, file_path):
  class YamlFile (line 12) | class YamlFile(pytest.File):
    method collect (line 13) | def collect(self):
  class YamlItem (line 22) | class YamlItem(pytest.Item):
    method __init__ (line 23) | def __init__(self, *, spec, **kwargs):
    method runtest (line 27) | def runtest(self):
    method repr_failure (line 33) | def repr_failure(self, excinfo):
    method reportinfo (line 45) | def reportinfo(self):
  class YamlException (line 49) | class YamlException(Exception):

FILE: doc/en/example/pythoncollection.py
  function test_function (line 6) | def test_function():
  class TestClass (line 10) | class TestClass:
    method test_method (line 11) | def test_method(self):
    method test_anothermethod (line 14) | def test_anothermethod(self):

FILE: doc/en/example/xfail_demo.py
  function test_hello (line 10) | def test_hello():
  function test_hello2 (line 15) | def test_hello2():
  function test_hello3 (line 20) | def test_hello3():
  function test_hello4 (line 25) | def test_hello4():
  function test_hello5 (line 30) | def test_hello5():
  function test_hello6 (line 34) | def test_hello6():
  function test_hello7 (line 39) | def test_hello7():

FILE: extra/get_issues.py
  function get_issues (line 13) | def get_issues():
  function main (line 37) | def main(args):
  function _get_kind (line 51) | def _get_kind(issue):
  function report (line 59) | def report(issues):

FILE: scripts/generate-gh-release-notes.py
  function extract_changelog_entries_for (line 22) | def extract_changelog_entries_for(version: str) -> str:
  function convert_rst_to_md (line 44) | def convert_rst_to_md(text: str) -> str:
  function main (line 52) | def main(argv: Sequence[str]) -> int:

FILE: scripts/prepare-release-pr.py
  class InvalidFeatureRelease (line 29) | class InvalidFeatureRelease(Exception):
  function prepare_release_pr (line 55) | def prepare_release_pr(base_branch: str, is_major: bool, prerelease: str...
  function find_next_version (line 144) | def find_next_version(
  function main (line 165) | def main() -> None:

FILE: scripts/release.py
  function announce (line 18) | def announce(version: str, template_name: str, doc_version: str) -> None:
  function regen (line 79) | def regen(version: str) -> None:
  function fix_formatting (line 88) | def fix_formatting() -> None:
  function check_links (line 96) | def check_links() -> None:
  function pre_release (line 102) | def pre_release(
  function changelog (line 122) | def changelog(version: str, write_out: bool = False) -> None:
  function main (line 127) | def main() -> None:

FILE: scripts/update-plugin-list.py
  function escape_rst (line 74) | def escape_rst(text: str) -> str:
  function project_response_with_refresh (line 87) | def project_response_with_refresh(
  function get_session (line 100) | def get_session() -> CachedSession:
  function pytest_plugin_projects_from_pypi (line 108) | def pytest_plugin_projects_from_pypi(session: CachedSession) -> dict[str...
  class PluginInfo (line 124) | class PluginInfo(TypedDict):
  function iter_plugins (line 134) | def iter_plugins() -> Iterator[PluginInfo]:
  function plugin_definitions (line 193) | def plugin_definitions(plugins: Iterable[PluginInfo]) -> Iterator[str]:
  function main (line 208) | def main() -> None:

FILE: src/_pytest/_argcomplete.py
  class FastFilesCompleter (line 74) | class FastFilesCompleter:
    method __init__ (line 77) | def __init__(self, directories: bool = True) -> None:
    method __call__ (line 80) | def __call__(self, prefix: str, **kwargs: Any) -> list[str]:
  function try_argcomplete (line 109) | def try_argcomplete(parser: argparse.ArgumentParser) -> None:
  function try_argcomplete (line 114) | def try_argcomplete(parser: argparse.ArgumentParser) -> None:

FILE: src/_pytest/_code/code.py
  class Code (line 60) | class Code:
    method __init__ (line 65) | def __init__(self, obj: CodeType) -> None:
    method from_function (line 69) | def from_function(cls, obj: object) -> Code:
    method __eq__ (line 72) | def __eq__(self, other):
    method firstlineno (line 79) | def firstlineno(self) -> int:
    method name (line 83) | def name(self) -> str:
    method path (line 87) | def path(self) -> Path | str:
    method fullsource (line 104) | def fullsource(self) -> Source | None:
    method source (line 109) | def source(self) -> Source:
    method getargs (line 114) | def getargs(self, var: bool = False) -> tuple[str, ...]:
  class Frame (line 129) | class Frame:
    method __init__ (line 135) | def __init__(self, frame: FrameType) -> None:
    method lineno (line 139) | def lineno(self) -> int:
    method f_globals (line 143) | def f_globals(self) -> dict[str, Any]:
    method f_locals (line 147) | def f_locals(self) -> dict[str, Any]:
    method code (line 151) | def code(self) -> Code:
    method statement (line 155) | def statement(self) -> Source:
    method eval (line 161) | def eval(self, code, **vars):
    method repr (line 172) | def repr(self, object: object) -> str:
    method getargs (line 176) | def getargs(self, var: bool = False):
  class TracebackEntry (line 191) | class TracebackEntry:
    method __init__ (line 196) | def __init__(
    method with_repr_style (line 204) | def with_repr_style(
    method lineno (line 210) | def lineno(self) -> int:
    method get_python_framesummary (line 213) | def get_python_framesummary(self) -> FrameSummary:
    method end_lineno_relative (line 223) | def end_lineno_relative(self) -> int | None:
    method colno (line 227) | def colno(self) -> int | None:
    method end_colno (line 231) | def end_colno(self) -> int | None:
    method end_lineno_relative (line 236) | def end_lineno_relative(self) -> int | None:
    method colno (line 243) | def colno(self) -> int | None:
    method end_colno (line 248) | def end_colno(self) -> int | None:
    method frame (line 253) | def frame(self) -> Frame:
    method relline (line 257) | def relline(self) -> int:
    method __repr__ (line 260) | def __repr__(self) -> str:
    method statement (line 264) | def statement(self) -> Source:
    method path (line 271) | def path(self) -> Path | str:
    method locals (line 276) | def locals(self) -> dict[str, Any]:
    method getfirstlinesource (line 280) | def getfirstlinesource(self) -> int:
    method getsource (line 283) | def getsource(
    method ishidden (line 311) | def ishidden(self, excinfo: ExceptionInfo[BaseException] | None) -> bool:
    method __str__ (line 336) | def __str__(self) -> str:
    method name (line 350) | def name(self) -> str:
  class Traceback (line 355) | class Traceback(list[TracebackEntry]):
    method __init__ (line 358) | def __init__(
    method cut (line 375) | def cut(
    method __getitem__ (line 412) | def __getitem__(self, key: SupportsIndex) -> TracebackEntry: ...
    method __getitem__ (line 415) | def __getitem__(self, key: slice) -> Traceback: ...
    method __getitem__ (line 417) | def __getitem__(self, key: SupportsIndex | slice) -> TracebackEntry | ...
    method filter (line 423) | def filter(
    method recursionindex (line 443) | def recursionindex(self) -> int | None:
  function stringify_exception (line 464) | def stringify_exception(
  class ExceptionInfo (line 496) | class ExceptionInfo(Generic[E]):
    method __init__ (line 505) | def __init__(
    method from_exception (line 519) | def from_exception(
    method from_exc_info (line 549) | def from_exc_info(
    method from_current (line 566) | def from_current(cls, exprinfo: str | None = None) -> ExceptionInfo[Ba...
    method for_later (line 586) | def for_later(cls) -> ExceptionInfo[E]:
    method fill_unfilled (line 590) | def fill_unfilled(self, exc_info: tuple[type[E], E, TracebackType]) ->...
    method type (line 596) | def type(self) -> type[E]:
    method value (line 604) | def value(self) -> E:
    method tb (line 612) | def tb(self) -> TracebackType:
    method typename (line 620) | def typename(self) -> str:
    method traceback (line 628) | def traceback(self) -> Traceback:
    method traceback (line 635) | def traceback(self, value: Traceback) -> None:
    method __repr__ (line 638) | def __repr__(self) -> str:
    method exconly (line 643) | def exconly(self, tryshort: bool = False) -> str:
    method errisinstance (line 676) | def errisinstance(self, exc: EXCEPTION_OR_MORE) -> bool:
    method _getreprcrash (line 683) | def _getreprcrash(self) -> ReprFileLocation | None:
    method getrepr (line 694) | def getrepr(
    method match (line 767) | def match(self, regexp: str | re.Pattern[str]) -> Literal[True]:
    method _group_contains (line 786) | def _group_contains(
    method group_contains (line 816) | def group_contains(
  class FormattedExcinfo (line 866) | class FormattedExcinfo:
    method _getindent (line 885) | def _getindent(self, source: Source) -> int:
    method _getentrysource (line 900) | def _getentrysource(self, entry: TracebackEntry) -> Source | None:
    method repr_args (line 906) | def repr_args(self, entry: TracebackEntry) -> ReprFuncArgs | None:
    method get_source (line 918) | def get_source(
    method get_highlight_arrows_for_line (line 971) | def get_highlight_arrows_for_line(
    method get_exconly (line 1008) | def get_exconly(
    method repr_locals (line 1025) | def repr_locals(self, locals: Mapping[str, object]) -> ReprLocals | None:
    method repr_traceback_entry (line 1051) | def repr_traceback_entry(
    method _makepath (line 1103) | def _makepath(self, path: Path | str) -> str:
    method repr_traceback (line 1113) | def repr_traceback(self, excinfo: ExceptionInfo[BaseException]) -> Rep...
    method _truncate_recursive_traceback (line 1138) | def _truncate_recursive_traceback(
    method repr_excinfo (line 1175) | def repr_excinfo(self, excinfo: ExceptionInfo[BaseException]) -> Excep...
  class TerminalRepr (line 1232) | class TerminalRepr:
    method __str__ (line 1233) | def __str__(self) -> str:
    method __repr__ (line 1241) | def __repr__(self) -> str:
    method toterminal (line 1244) | def toterminal(self, tw: TerminalWriter) -> None:
  class ExceptionRepr (line 1250) | class ExceptionRepr(TerminalRepr):
    method addsection (line 1258) | def addsection(self, name: str, content: str, sep: str = "-") -> None:
    method toterminal (line 1261) | def toterminal(self, tw: TerminalWriter) -> None:
  class ExceptionChainRepr (line 1268) | class ExceptionChainRepr(ExceptionRepr):
    method __init__ (line 1271) | def __init__(
    method toterminal (line 1283) | def toterminal(self, tw: TerminalWriter) -> None:
  class ReprExceptionInfo (line 1293) | class ReprExceptionInfo(ExceptionRepr):
    method toterminal (line 1297) | def toterminal(self, tw: TerminalWriter) -> None:
  class ReprTraceback (line 1303) | class ReprTraceback(TerminalRepr):
    method toterminal (line 1310) | def toterminal(self, tw: TerminalWriter) -> None:
  class ReprTracebackNative (line 1327) | class ReprTracebackNative(ReprTraceback):
    method __init__ (line 1328) | def __init__(self, tblines: Sequence[str]) -> None:
  class ReprEntryNative (line 1335) | class ReprEntryNative(TerminalRepr):
    method toterminal (line 1340) | def toterminal(self, tw: TerminalWriter) -> None:
  class ReprEntry (line 1345) | class ReprEntry(TerminalRepr):
    method _write_entry_lines (line 1352) | def _write_entry_lines(self, tw: TerminalWriter) -> None:
    method toterminal (line 1401) | def toterminal(self, tw: TerminalWriter) -> None:
    method __str__ (line 1423) | def __str__(self) -> str:
  class ReprFileLocation (line 1430) | class ReprFileLocation(TerminalRepr):
    method __post_init__ (line 1435) | def __post_init__(self) -> None:
    method toterminal (line 1438) | def toterminal(self, tw: TerminalWriter) -> None:
  class ReprLocals (line 1450) | class ReprLocals(TerminalRepr):
    method toterminal (line 1453) | def toterminal(self, tw: TerminalWriter, indent="") -> None:
  class ReprFuncArgs (line 1459) | class ReprFuncArgs(TerminalRepr):
    method toterminal (line 1462) | def toterminal(self, tw: TerminalWriter) -> None:
  function getfslineno (line 1481) | def getfslineno(obj: object) -> tuple[str | Path, int]:
  function _byte_offset_to_character_offset (line 1515) | def _byte_offset_to_character_offset(str, offset):
  function filter_traceback (line 1533) | def filter_traceback(entry: TracebackEntry) -> bool:
  function filter_excinfo_traceback (line 1562) | def filter_excinfo_traceback(

FILE: src/_pytest/_code/source.py
  class Source (line 16) | class Source:
    method __init__ (line 22) | def __init__(self, obj: object = None) -> None:
    method __eq__ (line 44) | def __eq__(self, other: object) -> bool:
    method __getitem__ (line 53) | def __getitem__(self, key: int) -> str: ...
    method __getitem__ (line 56) | def __getitem__(self, key: slice) -> Source: ...
    method __getitem__ (line 58) | def __getitem__(self, key: int | slice) -> str | Source:
    method __iter__ (line 69) | def __iter__(self) -> Iterator[str]:
    method __len__ (line 72) | def __len__(self) -> int:
    method strip (line 75) | def strip(self) -> Source:
    method indent (line 87) | def indent(self, indent: str = " " * 4) -> Source:
    method getstatement (line 95) | def getstatement(self, lineno: int) -> Source:
    method getstatementrange (line 101) | def getstatementrange(self, lineno: int) -> tuple[int, int]:
    method deindent (line 109) | def deindent(self) -> Source:
    method __str__ (line 116) | def __str__(self) -> str:
  function findsource (line 125) | def findsource(obj) -> tuple[Source | None, int]:
  function getrawcode (line 136) | def getrawcode(obj: object, trycall: bool = True) -> types.CodeType:
  function deindent (line 149) | def deindent(lines: Iterable[str]) -> list[str]:
  function get_statement_startend2 (line 153) | def get_statement_startend2(lineno: int, node: ast.AST) -> tuple[int, in...
  function getstatementrange_ast (line 181) | def getstatementrange_ast(

FILE: src/_pytest/_io/pprint.py
  class _safe_key (line 29) | class _safe_key:
    method __init__ (line 41) | def __init__(self, obj):
    method __lt__ (line 44) | def __lt__(self, other):
  function _safe_tuple (line 54) | def _safe_tuple(t):
  class PrettyPrinter (line 59) | class PrettyPrinter:
    method __init__ (line 60) | def __init__(
    method pformat (line 89) | def pformat(self, object: Any) -> str:
    method _format (line 94) | def _format(
    method _pprint_dataclass (line 130) | def _pprint_dataclass(
    method _pprint_dict (line 154) | def _pprint_dict(
    method _pprint_ordered_dict (line 171) | def _pprint_ordered_dict(
    method _pprint_list (line 190) | def _pprint_list(
    method _pprint_tuple (line 205) | def _pprint_tuple(
    method _pprint_set (line 220) | def _pprint_set(
    method _pprint_str (line 246) | def _pprint_str(
    method _pprint_bytes (line 305) | def _pprint_bytes(
    method _pprint_bytearray (line 334) | def _pprint_bytearray(
    method _pprint_mappingproxy (line 352) | def _pprint_mappingproxy(
    method _pprint_simplenamespace (line 367) | def _pprint_simplenamespace(
    method _format_dict_items (line 389) | def _format_dict_items(
    method _format_namespace_items (line 413) | def _format_namespace_items(
    method _format_items (line 450) | def _format_items(
    method _repr (line 473) | def _repr(self, object: Any, context: set[int], level: int) -> str:
    method _pprint_default_dict (line 476) | def _pprint_default_dict(
    method _pprint_counter (line 492) | def _pprint_counter(
    method _pprint_chain_map (line 513) | def _pprint_chain_map(
    method _pprint_deque (line 532) | def _pprint_deque(
    method _pprint_user_dict (line 551) | def _pprint_user_dict(
    method _pprint_user_list (line 564) | def _pprint_user_list(
    method _pprint_user_string (line 577) | def _pprint_user_string(
    method _safe_repr (line 590) | def _safe_repr(
  function _recursion (line 654) | def _recursion(object: Any) -> str:
  function _wrap_bytes_repr (line 658) | def _wrap_bytes_repr(object: Any, width: int, allowance: int) -> Iterato...

FILE: src/_pytest/_io/saferepr.py
  function _try_repr_or_str (line 8) | def _try_repr_or_str(obj: object) -> str:
  function _format_repr_exception (line 17) | def _format_repr_exception(exc: BaseException, obj: object) -> str:
  function _ellipsize (line 29) | def _ellipsize(s: str, maxsize: int) -> str:
  class SafeRepr (line 37) | class SafeRepr(reprlib.Repr):
    method __init__ (line 43) | def __init__(self, maxsize: int | None, use_ascii: bool = False) -> None:
    method repr (line 58) | def repr(self, x: object) -> str:
    method repr_instance (line 72) | def repr_instance(self, x: object, level: int) -> str:
    method repr_dict (line 84) | def repr_dict(self, x: dict[object, object], level: int) -> str:
  function safeformat (line 108) | def safeformat(obj: object) -> str:
  function saferepr (line 124) | def saferepr(
  function saferepr_unlimited (line 139) | def saferepr_unlimited(obj: object, use_ascii: bool = True) -> str:

FILE: src/_pytest/_io/terminalwriter.py
  function get_terminal_width (line 26) | def get_terminal_width() -> int:
  function should_do_markup (line 36) | def should_do_markup(file: TextIO) -> bool:
  class TerminalWriter (line 51) | class TerminalWriter:
    method __init__ (line 75) | def __init__(self, file: TextIO | None = None) -> None:
    method fullwidth (line 93) | def fullwidth(self) -> int:
    method fullwidth (line 99) | def fullwidth(self, value: int) -> None:
    method width_of_current_line (line 103) | def width_of_current_line(self) -> int:
    method markup (line 107) | def markup(self, text: str, **markup: bool) -> str:
    method sep (line 117) | def sep(
    method write (line 154) | def write(self, msg: str, *, flush: bool = False, **markup: bool) -> N...
    method write_raw (line 166) | def write_raw(self, msg: str, *, flush: bool = False) -> None:
    method line (line 182) | def line(self, s: str = "", **markup: bool) -> None:
    method flush (line 186) | def flush(self) -> None:
    method _write_source (line 189) | def _write_source(self, lines: Sequence[str], indents: Sequence[str] =...
    method _get_pygments_lexer (line 208) | def _get_pygments_lexer(self, lexer: Literal["python", "diff"]) -> Lexer:
    method _get_pygments_formatter (line 216) | def _get_pygments_formatter(self) -> TerminalFormatter:
    method _highlight (line 235) | def _highlight(

FILE: src/_pytest/_io/wcwidth.py
  function wcwidth (line 8) | def wcwidth(c: str) -> int:
  function wcswidth (line 46) | def wcswidth(s: str) -> int:

FILE: src/_pytest/_py/error.py
  class Error (line 21) | class Error(EnvironmentError):
    method __repr__ (line 22) | def __repr__(self) -> str:
    method __str__ (line 31) | def __str__(self) -> str:
  class ErrorMaker (line 52) | class ErrorMaker:
    method __getattr__ (line 60) | def __getattr__(self, name: str) -> type[Error]:
    method _geterrnoclass (line 68) | def _geterrnoclass(self, eno: int) -> type[Error]:
    method checked_call (line 81) | def checked_call(
  function __getattr__ (line 118) | def __getattr__(attr: str) -> type[Error]:

FILE: src/_pytest/_py/path.py
  class Checkers (line 41) | class Checkers:
    method __init__ (line 44) | def __init__(self, path):
    method dotfile (line 47) | def dotfile(self):
    method ext (line 50) | def ext(self, arg):
    method basename (line 55) | def basename(self, arg):
    method basestarts (line 58) | def basestarts(self, arg):
    method relto (line 61) | def relto(self, arg):
    method fnmatch (line 64) | def fnmatch(self, arg):
    method endswith (line 67) | def endswith(self, arg):
    method _evaluate (line 70) | def _evaluate(self, kw):
    method _stat (line 110) | def _stat(self) -> Stat:
    method dir (line 120) | def dir(self):
    method file (line 123) | def file(self):
    method exists (line 126) | def exists(self):
    method link (line 129) | def link(self):
  class NeverRaised (line 134) | class NeverRaised(Exception):
  class Visitor (line 138) | class Visitor:
    method __init__ (line 139) | def __init__(self, fil, rec, ignore, bf, sort):
    method gen (line 153) | def gen(self, path):
  class FNMatcher (line 173) | class FNMatcher:
    method __init__ (line 174) | def __init__(self, pattern):
    method __call__ (line 177) | def __call__(self, path):
  function map_as_list (line 199) | def map_as_list(func, iter):
  class Stat (line 203) | class Stat:
    method size (line 207) | def size(self) -> int: ...
    method mtime (line 210) | def mtime(self) -> float: ...
    method __getattr__ (line 212) | def __getattr__(self, name: str) -> Any:
    method __init__ (line 215) | def __init__(self, path, osstatresult):
    method owner (line 220) | def owner(self):
    method group (line 229) | def group(self):
    method isdir (line 238) | def isdir(self):
    method isfile (line 241) | def isfile(self):
    method islink (line 244) | def islink(self):
  function getuserid (line 249) | def getuserid(user):
  function getgroupid (line 257) | def getgroupid(group):
  class LocalPath (line 265) | class LocalPath:
    class ImportMismatchError (line 270) | class ImportMismatchError(ImportError):
    method __init__ (line 275) | def __init__(self, path=None, expanduser=False):
    method chown (line 301) | def chown(self, user, group, rec=0):
    method readlink (line 315) | def readlink(self) -> str:
    method mklinkto (line 320) | def mklinkto(self, oldname):
    method mksymlinkto (line 324) | def mksymlinkto(self, value, absolute=1):
    method __div__ (line 337) | def __div__(self, other):
    method basename (line 343) | def basename(self):
    method dirname (line 348) | def dirname(self):
    method purebasename (line 353) | def purebasename(self):
    method ext (line 358) | def ext(self):
    method read_binary (line 362) | def read_binary(self):
    method read_text (line 367) | def read_text(self, encoding):
    method read (line 372) | def read(self, mode="r"):
    method readlines (line 377) | def readlines(self, cr=1):
    method load (line 392) | def load(self):
    method move (line 402) | def move(self, target):
    method fnmatch (line 412) | def fnmatch(self, pattern):
    method relto (line 431) | def relto(self, relpath):
    method ensure_dir (line 450) | def ensure_dir(self, *args):
    method bestrelpath (line 454) | def bestrelpath(self, dest):
    method exists (line 480) | def exists(self):
    method isdir (line 483) | def isdir(self):
    method isfile (line 486) | def isfile(self):
    method parts (line 489) | def parts(self, reverse=False):
    method common (line 505) | def common(self, other):
    method __add__ (line 516) | def __add__(self, other):
    method visit (line 520) | def visit(self, fil=None, rec=None, ignore=NeverRaised, bf=False, sort...
    method _sortlist (line 540) | def _sortlist(self, res, sort):
    method __fspath__ (line 553) | def __fspath__(self):
    method __hash__ (line 556) | def __hash__(self):
    method __eq__ (line 562) | def __eq__(self, other):
    method __ne__ (line 576) | def __ne__(self, other):
    method __lt__ (line 579) | def __lt__(self, other):
    method __gt__ (line 582) | def __gt__(self, other):
    method samefile (line 585) | def samefile(self, other):
    method remove (line 596) | def remove(self, rec=1, ignore_errors=False):
    method computehash (line 618) | def computehash(self, hashtype="md5", chunksize=524288):
    method new (line 640) | def new(self, **kw):
    method _getbyspec (line 680) | def _getbyspec(self, spec: str) -> list[str]:
    method dirpath (line 709) | def dirpath(self, *args, **kwargs):
    method join (line 719) | def join(self, *args: os.PathLike[str], abs: bool = False) -> LocalPath:
    method open (line 749) | def open(self, mode="r", ensure=False, encoding=None):
    method _fastjoin (line 765) | def _fastjoin(self, name):
    method islink (line 770) | def islink(self):
    method check (line 773) | def check(self, **kw):
    method listdir (line 803) | def listdir(self, fil=None, sort=None):
    method size (line 826) | def size(self) -> int:
    method mtime (line 830) | def mtime(self) -> float:
    method copy (line 834) | def copy(self, target, mode=False, stat=False):
    method rename (line 871) | def rename(self, target):
    method dump (line 876) | def dump(self, obj, bin=1):
    method mkdir (line 886) | def mkdir(self, *args):
    method write_binary (line 892) | def write_binary(self, data, ensure=False):
    method write_text (line 901) | def write_text(self, data, encoding, ensure=False):
    method write (line 910) | def write(self, data, mode="w", ensure=False):
    method _ensuredirs (line 931) | def _ensuredirs(self):
    method ensure (line 947) | def ensure(self, *args, **kwargs):
    method stat (line 962) | def stat(self, raising: Literal[True] = ...) -> Stat: ...
    method stat (line 965) | def stat(self, raising: Literal[False]) -> Stat | None: ...
    method stat (line 967) | def stat(self, raising: bool = True) -> Stat | None:
    method lstat (line 978) | def lstat(self) -> Stat:
    method setmtime (line 982) | def setmtime(self, mtime=None):
    method chdir (line 995) | def chdir(self):
    method as_cwd (line 1005) | def as_cwd(self):
    method realpath (line 1018) | def realpath(self):
    method atime (line 1022) | def atime(self):
    method __repr__ (line 1026) | def __repr__(self):
    method __str__ (line 1029) | def __str__(self):
    method chmod (line 1033) | def chmod(self, mode, rec=0):
    method pypkgpath (line 1045) | def pypkgpath(self):
    method _ensuresyspath (line 1060) | def _ensuresyspath(self, ensuremode, path):
    method pyimport (line 1070) | def pyimport(self, modname=None, ensuresyspath=True):
    method sysexec (line 1159) | def sysexec(self, *argv: os.PathLike[str], **popen_opts: Any) -> str:
    method sysfind (line 1193) | def sysfind(cls, name, checker=None, paths=None):
    method _gethomedir (line 1240) | def _gethomedir(cls):
    method get_temproot (line 1254) | def get_temproot(cls):
    method mkdtemp (line 1263) | def mkdtemp(cls, rootdir=None):
    method make_numbered_dir (line 1275) | def make_numbered_dir(
  function copymode (line 1437) | def copymode(src, dest):
  function copystat (line 1444) | def copystat(src, dest):
  function copychunked (line 1452) | def copychunked(src, dest):
  function isimportable (line 1469) | def isimportable(name):

FILE: src/_pytest/assertion/__init__.py
  function pytest_addoption (line 26) | def pytest_addoption(parser: Parser) -> None:
  function register_assert_rewrite (line 71) | def register_assert_rewrite(*names: str) -> None:
  class RewriteHook (line 96) | class RewriteHook(Protocol):
    method mark_rewrite (line 97) | def mark_rewrite(self, *names: str) -> None: ...
  class DummyRewriteHook (line 100) | class DummyRewriteHook:
    method mark_rewrite (line 103) | def mark_rewrite(self, *names: str) -> None:
  class AssertionState (line 107) | class AssertionState:
    method __init__ (line 110) | def __init__(self, config: Config, mode) -> None:
  function install_importhook (line 116) | def install_importhook(config: Config) -> rewrite.AssertionRewritingHook:
  function pytest_collection (line 132) | def pytest_collection(session: Session) -> None:
  function pytest_runtest_protocol (line 143) | def pytest_runtest_protocol(item: Item) -> Generator[None, object, object]:
  function pytest_sessionfinish (line 198) | def pytest_sessionfinish(session: Session) -> None:
  function pytest_assertrepr_compare (line 205) | def pytest_assertrepr_compare(

FILE: src/_pytest/assertion/rewrite.py
  class Sentinel (line 61) | class Sentinel:
  class AssertionRewritingHook (line 76) | class AssertionRewritingHook(importlib.abc.MetaPathFinder, importlib.abc...
    method __init__ (line 79) | def __init__(self, config: Config) -> None:
    method set_session (line 95) | def set_session(self, session: Session | None) -> None:
    method find_spec (line 102) | def find_spec(
    method create_module (line 152) | def create_module(
    method exec_module (line 157) | def exec_module(self, module: types.ModuleType) -> None:
    method _early_rewrite_bailout (line 199) | def _early_rewrite_bailout(self, name: str, state: AssertionState) -> ...
    method _should_rewrite (line 238) | def _should_rewrite(self, name: str, fn: str, state: AssertionState) -...
    method _is_marked_for_rewrite (line 259) | def _is_marked_for_rewrite(self, name: str, state: AssertionState) -> ...
    method mark_rewrite (line 272) | def mark_rewrite(self, *names: str) -> None:
    method _warn_already_imported (line 290) | def _warn_already_imported(self, name: str) -> None:
    method get_data (line 300) | def get_data(self, pathname: str | bytes) -> bytes:
    method get_resource_reader (line 305) | def get_resource_reader(self, name: str) -> TraversableResources:
  function _write_pyc_fp (line 309) | def _write_pyc_fp(
  function _write_pyc (line 327) | def _write_pyc(
  function _rewrite_test (line 352) | def _rewrite_test(fn: Path, config: Config) -> tuple[os.stat_result, typ...
  function _read_pyc (line 363) | def _read_pyc(
  function rewrite_asserts (line 412) | def rewrite_asserts(
  function _saferepr (line 422) | def _saferepr(obj: object) -> str:
  function _get_maxsize_for_saferepr (line 442) | def _get_maxsize_for_saferepr(config: Config | None) -> int | None:
  function _format_assertmsg (line 455) | def _format_assertmsg(obj: object) -> str:
  function _should_repr_global_name (line 477) | def _should_repr_global_name(obj: object) -> bool:
  function _format_boolop (line 488) | def _format_boolop(explanations: Iterable[str], is_or: bool) -> str:
  function _call_reprcompare (line 493) | def _call_reprcompare(
  function _call_assertion_pass (line 513) | def _call_assertion_pass(lineno: int, orig: str, expl: str) -> None:
  function _check_if_assertion_pass_impl (line 518) | def _check_if_assertion_pass_impl() -> bool:
  function traverse_node (line 553) | def traverse_node(node: ast.AST) -> Iterator[ast.AST]:
  function _get_assertion_exprs (line 561) | def _get_assertion_exprs(src: bytes) -> dict[int, str]:
  class AssertionRewriter (line 615) | class AssertionRewriter(ast.NodeVisitor):
    method __init__ (line 674) | def __init__(
    method run (line 692) | def run(self, mod: ast.Module) -> None:
    method is_rewrite_disabled (line 772) | def is_rewrite_disabled(docstring: str) -> bool:
    method variable (line 775) | def variable(self) -> str:
    method assign (line 782) | def assign(self, expr: ast.expr) -> ast.Name:
    method display (line 788) | def display(self, expr: ast.expr) -> ast.expr:
    method helper (line 792) | def helper(self, name: str, *args: ast.expr) -> ast.expr:
    method builtin (line 798) | def builtin(self, name: str) -> ast.Attribute:
    method explanation_param (line 803) | def explanation_param(self, expr: ast.expr) -> str:
    method push_format_context (line 815) | def push_format_context(self) -> None:
    method pop_format_context (line 828) | def pop_format_context(self, expl_expr: ast.expr) -> ast.Name:
    method generic_visit (line 848) | def generic_visit(self, node: ast.AST) -> tuple[ast.Name, str]:
    method visit_Assert (line 854) | def visit_Assert(self, assert_: ast.Assert) -> list[ast.stmt]:
    method visit_NamedExpr (line 975) | def visit_NamedExpr(self, name: ast.NamedExpr) -> tuple[ast.NamedExpr,...
    method visit_Name (line 987) | def visit_Name(self, name: ast.Name) -> tuple[ast.Name, str]:
    method visit_BoolOp (line 997) | def visit_BoolOp(self, boolop: ast.BoolOp) -> tuple[ast.Name, str]:
    method visit_UnaryOp (line 1043) | def visit_UnaryOp(self, unary: ast.UnaryOp) -> tuple[ast.Name, str]:
    method visit_BinOp (line 1049) | def visit_BinOp(self, binop: ast.BinOp) -> tuple[ast.Name, str]:
    method visit_Call (line 1059) | def visit_Call(self, call: ast.Call) -> tuple[ast.Name, str]:
    method visit_Starred (line 1092) | def visit_Starred(self, starred: ast.Starred) -> tuple[ast.Starred, str]:
    method visit_Attribute (line 1098) | def visit_Attribute(self, attr: ast.Attribute) -> tuple[ast.Name, str]:
    method visit_Compare (line 1110) | def visit_Compare(self, comp: ast.Compare) -> tuple[ast.expr, str]:
  function try_makedirs (line 1166) | def try_makedirs(cache_dir: Path) -> bool:
  function get_cache_dir (line 1191) | def get_cache_dir(file_path: Path) -> Path:

FILE: src/_pytest/assertion/truncate.py
  function truncate_if_required (line 19) | def truncate_if_required(explanation: list[str], item: Item) -> list[str]:
  function _get_truncation_parameters (line 31) | def _get_truncation_parameters(item: Item) -> tuple[bool, int, int]:
  function _truncate_explanation (line 52) | def _truncate_explanation(
  function _truncate_by_char_count (line 113) | def _truncate_by_char_count(input_lines: list[str], max_chars: int) -> l...

FILE: src/_pytest/assertion/util.py
  class _HighlightFunc (line 41) | class _HighlightFunc(Protocol):
    method __call__ (line 42) | def __call__(self, source: str, lexer: Literal["diff", "python"] = "py...
  function dummy_highlighter (line 46) | def dummy_highlighter(source: str, lexer: Literal["diff", "python"] = "p...
  function format_explanation (line 54) | def format_explanation(explanation: str) -> str:
  function _split_explanation (line 69) | def _split_explanation(explanation: str) -> list[str]:
  function _format_lines (line 86) | def _format_lines(lines: Sequence[str]) -> list[str]:
  function issequence (line 121) | def issequence(x: Any) -> bool:
  function istext (line 125) | def istext(x: Any) -> bool:
  function isdict (line 129) | def isdict(x: Any) -> bool:
  function isset (line 133) | def isset(x: Any) -> bool:
  function isnamedtuple (line 137) | def isnamedtuple(obj: Any) -> bool:
  function isdatacls (line 141) | def isdatacls(obj: Any) -> bool:
  function isattrs (line 145) | def isattrs(obj: Any) -> bool:
  function isiterable (line 149) | def isiterable(obj: Any) -> bool:
  function has_default_eq (line 157) | def has_default_eq(
  function assertrepr_compare (line 178) | def assertrepr_compare(
  function _compare_eq_any (line 248) | def _compare_eq_any(
  function _diff_text (line 285) | def _diff_text(
  function _compare_eq_iterable (line 340) | def _compare_eq_iterable(
  function _compare_eq_sequence (line 369) | def _compare_eq_sequence(
  function _compare_eq_set (line 429) | def _compare_eq_set(
  function _compare_gt_set (line 441) | def _compare_gt_set(
  function _compare_lt_set (line 453) | def _compare_lt_set(
  function _compare_gte_set (line 465) | def _compare_gte_set(
  function _compare_lte_set (line 474) | def _compare_lte_set(
  function _set_one_sided_diff (line 483) | def _set_one_sided_diff(
  function _compare_eq_dict (line 498) | def _compare_eq_dict(
  function _compare_eq_cls (line 544) | def _compare_eq_cls(
  function _notin_text (line 599) | def _notin_text(term: str, text: str, verbose: int = 0) -> list[str]:

FILE: src/_pytest/cacheprovider.py
  function _make_cachedir (line 58) | def _make_cachedir(target: Path) -> None:
  class Cache (line 91) | class Cache:
    method __init__ (line 103) | def __init__(
    method for_config (line 111) | def for_config(cls, config: Config, *, _ispytest: bool = False) -> Cache:
    method clear_cache (line 123) | def clear_cache(cls, cachedir: Path, _ispytest: bool = False) -> None:
    method cache_dir_from_config (line 135) | def cache_dir_from_config(config: Config, *, _ispytest: bool = False) ...
    method warn (line 143) | def warn(self, fmt: str, *, _ispytest: bool = False, **args: object) -...
    method _mkdir (line 159) | def _mkdir(self, path: Path) -> None:
    method mkdir (line 163) | def mkdir(self, name: str) -> Path:
    method _getvaluepath (line 184) | def _getvaluepath(self, key: str) -> Path:
    method get (line 187) | def get(self, key: str, default):
    method set (line 206) | def set(self, key: str, value: object) -> None:
    method _ensure_cache_dir_and_supporting_files (line 237) | def _ensure_cache_dir_and_supporting_files(self) -> None:
  class LFPluginCollWrapper (line 243) | class LFPluginCollWrapper:
    method __init__ (line 244) | def __init__(self, lfplugin: LFPlugin) -> None:
    method pytest_make_collect_report (line 249) | def pytest_make_collect_report(
  class LFPluginCollSkipfiles (line 295) | class LFPluginCollSkipfiles:
    method __init__ (line 296) | def __init__(self, lfplugin: LFPlugin) -> None:
    method pytest_make_collect_report (line 300) | def pytest_make_collect_report(
  class LFPlugin (line 313) | class LFPlugin:
    method __init__ (line 316) | def __init__(self, config: Config) -> None:
    method get_last_failed_paths (line 332) | def get_last_failed_paths(self) -> set[Path]:
    method pytest_report_collectionfinish (line 343) | def pytest_report_collectionfinish(self) -> str | None:
    method pytest_runtest_logreport (line 348) | def pytest_runtest_logreport(self, report: TestReport) -> None:
    method pytest_collectreport (line 354) | def pytest_collectreport(self, report: CollectReport) -> None:
    method pytest_collection_modifyitems (line 364) | def pytest_collection_modifyitems(
    method pytest_sessionfinish (line 415) | def pytest_sessionfinish(self, session: Session) -> None:
  class NFPlugin (line 426) | class NFPlugin:
    method __init__ (line 429) | def __init__(self, config: Config) -> None:
    method pytest_collection_modifyitems (line 436) | def pytest_collection_modifyitems(self, items: list[nodes.Item]) -> Ge...
    method _get_increasing_order (line 457) | def _get_increasing_order(self, items: Iterable[nodes.Item]) -> list[n...
    method pytest_sessionfinish (line 460) | def pytest_sessionfinish(self) -> None:
  function pytest_addoption (line 472) | def pytest_addoption(parser: Parser) -> None:
  function pytest_cmdline_main (line 537) | def pytest_cmdline_main(config: Config) -> int | ExitCode | None:
  function pytest_configure (line 546) | def pytest_configure(config: Config) -> None:
  function cache (line 560) | def cache(request: FixtureRequest) -> Cache:
  function pytest_report_header (line 575) | def pytest_report_header(config: Config) -> str | None:
  function cacheshow (line 591) | def cacheshow(config: Config, session: Session) -> int:

FILE: src/_pytest/capture.py
  function pytest_addoption (line 49) | def pytest_addoption(parser: Parser) -> None:
  function _colorama_workaround (line 68) | def _colorama_workaround() -> None:
  function _readline_workaround (line 83) | def _readline_workaround() -> None:
  function _windowsconsoleio_workaround (line 100) | def _windowsconsoleio_workaround(stream: TextIO) -> None:
  function pytest_load_initial_conftests (line 156) | def pytest_load_initial_conftests(early_config: Config) -> Generator[None]:
  class EncodedFile (line 186) | class EncodedFile(io.TextIOWrapper):
    method name (line 190) | def name(self) -> str:
    method mode (line 196) | def mode(self) -> str:
  class CaptureIO (line 203) | class CaptureIO(io.TextIOWrapper):
    method __init__ (line 204) | def __init__(self) -> None:
    method getvalue (line 207) | def getvalue(self) -> str:
  class TeeCaptureIO (line 212) | class TeeCaptureIO(CaptureIO):
    method __init__ (line 213) | def __init__(self, other: TextIO) -> None:
    method write (line 217) | def write(self, s: str) -> int:
  class DontReadFromInput (line 222) | class DontReadFromInput(TextIO):
    method encoding (line 224) | def encoding(self) -> str:
    method read (line 228) | def read(self, size: int = -1) -> str:
    method __next__ (line 235) | def __next__(self) -> str:
    method readlines (line 238) | def readlines(self, hint: int | None = -1) -> list[str]:
    method __iter__ (line 243) | def __iter__(self) -> Iterator[str]:
    method fileno (line 246) | def fileno(self) -> int:
    method flush (line 249) | def flush(self) -> None:
    method isatty (line 252) | def isatty(self) -> bool:
    method close (line 255) | def close(self) -> None:
    method readable (line 258) | def readable(self) -> bool:
    method seek (line 261) | def seek(self, offset: int, whence: int = 0) -> int:
    method seekable (line 264) | def seekable(self) -> bool:
    method tell (line 267) | def tell(self) -> int:
    method truncate (line 270) | def truncate(self, size: int | None = None) -> int:
    method write (line 273) | def write(self, data: str) -> int:
    method writelines (line 276) | def writelines(self, lines: Iterable[str]) -> None:
    method writable (line 279) | def writable(self) -> bool:
    method __enter__ (line 282) | def __enter__(self) -> Self:
    method __exit__ (line 285) | def __exit__(
    method buffer (line 294) | def buffer(self) -> BinaryIO:
  class CaptureBase (line 302) | class CaptureBase(abc.ABC, Generic[AnyStr]):
    method __init__ (line 306) | def __init__(self, fd: int) -> None:
    method start (line 310) | def start(self) -> None:
    method done (line 314) | def done(self) -> None:
    method suspend (line 318) | def suspend(self) -> None:
    method resume (line 322) | def resume(self) -> None:
    method writeorg (line 326) | def writeorg(self, data: AnyStr) -> None:
    method snap (line 330) | def snap(self) -> AnyStr:
  class NoCapture (line 337) | class NoCapture(CaptureBase[str]):
    method __init__ (line 340) | def __init__(self, fd: int) -> None:
    method start (line 343) | def start(self) -> None:
    method done (line 346) | def done(self) -> None:
    method suspend (line 349) | def suspend(self) -> None:
    method resume (line 352) | def resume(self) -> None:
    method snap (line 355) | def snap(self) -> str:
    method writeorg (line 358) | def writeorg(self, data: str) -> None:
  class SysCaptureBase (line 362) | class SysCaptureBase(CaptureBase[AnyStr]):
    method __init__ (line 363) | def __init__(
    method repr (line 377) | def repr(self, class_name: str) -> str:
    method __repr__ (line 386) | def __repr__(self) -> str:
    method _assert_state (line 395) | def _assert_state(self, op: str, states: tuple[str, ...]) -> None:
    method start (line 402) | def start(self) -> None:
    method done (line 407) | def done(self) -> None:
    method suspend (line 416) | def suspend(self) -> None:
    method resume (line 421) | def resume(self) -> None:
  class SysCaptureBinary (line 429) | class SysCaptureBinary(SysCaptureBase[bytes]):
    method snap (line 432) | def snap(self) -> bytes:
    method writeorg (line 440) | def writeorg(self, data: bytes) -> None:
  class SysCapture (line 447) | class SysCapture(SysCaptureBase[str]):
    method snap (line 450) | def snap(self) -> str:
    method writeorg (line 458) | def writeorg(self, data: str) -> None:
  class FDCaptureBase (line 464) | class FDCaptureBase(CaptureBase[AnyStr]):
    method __init__ (line 465) | def __init__(self, targetfd: int) -> None:
    method __repr__ (line 506) | def __repr__(self) -> str:
    method _assert_state (line 512) | def _assert_state(self, op: str, states: tuple[str, ...]) -> None:
    method start (line 519) | def start(self) -> None:
    method done (line 526) | def done(self) -> None:
    method suspend (line 542) | def suspend(self) -> None:
    method resume (line 550) | def resume(self) -> None:
  class FDCaptureBinary (line 559) | class FDCaptureBinary(FDCaptureBase[bytes]):
    method snap (line 567) | def snap(self) -> bytes:
    method writeorg (line 575) | def writeorg(self, data: bytes) -> None:
  class FDCapture (line 581) | class FDCapture(FDCaptureBase[str]):
    method snap (line 589) | def snap(self) -> str:
    method writeorg (line 597) | def writeorg(self, data: str) -> None:
  class CaptureResult (line 611) | class CaptureResult(NamedTuple, Generic[AnyStr]):
  class CaptureResult (line 619) | class CaptureResult(
  class MultiCapture (line 628) | class MultiCapture(Generic[AnyStr]):
    method __init__ (line 632) | def __init__(
    method __repr__ (line 642) | def __repr__(self) -> str:
    method start_capturing (line 648) | def start_capturing(self) -> None:
    method pop_outerr_to_orig (line 657) | def pop_outerr_to_orig(self) -> tuple[AnyStr, AnyStr]:
    method suspend_capturing (line 668) | def suspend_capturing(self, in_: bool = False) -> None:
    method resume_capturing (line 678) | def resume_capturing(self) -> None:
    method stop_capturing (line 689) | def stop_capturing(self) -> None:
    method is_started (line 701) | def is_started(self) -> bool:
    method readouterr (line 705) | def readouterr(self) -> CaptureResult[AnyStr]:
  function _get_multicapture (line 712) | def _get_multicapture(method: _CaptureMethod) -> MultiCapture[str]:
  class CaptureManager (line 729) | class CaptureManager:
    method __init__ (line 748) | def __init__(self, method: _CaptureMethod) -> None:
    method __repr__ (line 753) | def __repr__(self) -> str:
    method is_capturing (line 759) | def is_capturing(self) -> str | bool:
    method is_globally_capturing (line 768) | def is_globally_capturing(self) -> bool:
    method start_global_capturing (line 771) | def start_global_capturing(self) -> None:
    method stop_global_capturing (line 776) | def stop_global_capturing(self) -> None:
    method resume_global_capture (line 782) | def resume_global_capture(self) -> None:
    method suspend_global_capture (line 788) | def suspend_global_capture(self, in_: bool = False) -> None:
    method suspend (line 792) | def suspend(self, in_: bool = False) -> None:
    method resume (line 797) | def resume(self) -> None:
    method read_global_capture (line 801) | def read_global_capture(self) -> CaptureResult[str]:
    method set_fixture (line 807) | def set_fixture(self, capture_fixture: CaptureFixture[Any]) -> None:
    method unset_fixture (line 816) | def unset_fixture(self) -> None:
    method activate_fixture (line 819) | def activate_fixture(self) -> None:
    method deactivate_fixture (line 825) | def deactivate_fixture(self) -> None:
    method suspend_fixture (line 830) | def suspend_fixture(self) -> None:
    method resume_fixture (line 834) | def resume_fixture(self) -> None:
    method global_and_fixture_disabled (line 841) | def global_and_fixture_disabled(self) -> Generator[None]:
    method item_capture (line 858) | def item_capture(self, when: str, item: Item) -> Generator[None]:
    method pytest_make_collect_report (line 874) | def pytest_make_collect_report(
    method pytest_runtest_setup (line 893) | def pytest_runtest_setup(self, item: Item) -> Generator[None]:
    method pytest_runtest_call (line 898) | def pytest_runtest_call(self, item: Item) -> Generator[None]:
    method pytest_runtest_teardown (line 903) | def pytest_runtest_teardown(self, item: Item) -> Generator[None]:
    method pytest_keyboard_interrupt (line 908) | def pytest_keyboard_interrupt(self) -> None:
    method pytest_internalerror (line 912) | def pytest_internalerror(self) -> None:
  class CaptureFixture (line 916) | class CaptureFixture(Generic[AnyStr]):
    method __init__ (line 920) | def __init__(
    method _start (line 936) | def _start(self) -> None:
    method close (line 945) | def close(self) -> None:
    method readouterr (line 953) | def readouterr(self) -> CaptureResult[AnyStr]:
    method _suspend (line 970) | def _suspend(self) -> None:
    method _resume (line 975) | def _resume(self) -> None:
    method _is_started (line 980) | def _is_started(self) -> bool:
    method disabled (line 987) | def disabled(self) -> Generator[None]:
  function capsys (line 1000) | def capsys(request: SubRequest) -> Generator[CaptureFixture[str]]:
  function capteesys (line 1028) | def capteesys(request: SubRequest) -> Generator[CaptureFixture[str]]:
  function capsysbinary (line 1063) | def capsysbinary(request: SubRequest) -> Generator[CaptureFixture[bytes]]:
  function capfd (line 1091) | def capfd(request: SubRequest) -> Generator[CaptureFixture[str]]:
  function capfdbinary (line 1119) | def capfdbinary(request: SubRequest) -> Generator[CaptureFixture[bytes]]:

FILE: src/_pytest/compat.py
  function legacy_path (line 36) | def legacy_path(path: str | os.PathLike[str]) -> LEGACY_PATH:
  class NotSetType (line 44) | class NotSetType(enum.Enum):
  function iscoroutinefunction (line 50) | def iscoroutinefunction(func: object) -> bool:
  function is_async_function (line 62) | def is_async_function(func: object) -> bool:
  function signature (line 68) | def signature(obj: Callable[..., Any]) -> Signature:
  function getlocation (line 75) | def getlocation(function, curdir: str | os.PathLike[str] | None = None) ...
  function num_mock_patch_args (line 89) | def num_mock_patch_args(function) -> int:
  function getfuncargnames (line 108) | def getfuncargnames(
  function get_default_arg_names (line 176) | def get_default_arg_names(function: Callable[..., Any]) -> tuple[str, ...]:
  function ascii_escaped (line 196) | def ascii_escaped(val: bytes | str) -> str:
  function get_real_func (line 219) | def get_real_func(obj):
  function getimfunc (line 229) | def getimfunc(func):
  function safe_getattr (line 236) | def safe_getattr(object: Any, name: str, default: Any) -> Any:
  function safe_isclass (line 253) | def safe_isclass(obj: object) -> bool:
  function get_user_id (line 261) | def get_user_id() -> int | None:
  function assert_never (line 286) | def assert_never(value: NoReturn) -> NoReturn:
  class CallableBool (line 290) | class CallableBool:
    method __init__ (line 300) | def __init__(self, value: bool) -> None:
    method __bool__ (line 303) | def __bool__(self) -> bool:
    method __call__ (line 306) | def __call__(self) -> bool:
  function running_on_ci (line 310) | def running_on_ci() -> bool:
  function deprecated (line 325) | def deprecated(msg, /, *, category=None, stacklevel=1):

FILE: src/_pytest/config/__init__.py
  class ExitCode (line 100) | class ExitCode(enum.IntEnum):
  class ConftestImportFailure (line 124) | class ConftestImportFailure(Exception):
    method __init__ (line 125) | def __init__(
    method __str__ (line 134) | def __str__(self) -> str:
  function filter_traceback_for_conftest_import_failure (line 138) | def filter_traceback_for_conftest_import_failure(
  function print_conftest_import_error (line 149) | def print_conftest_import_error(e: ConftestImportFailure, file: TextIO) ...
  function print_usage_error (line 166) | def print_usage_error(e: UsageError, file: TextIO) -> None:
  function main (line 172) | def main(
  function console_main (line 218) | def console_main() -> int:
  class cmdline (line 236) | class cmdline:  # compatibility namespace
  function filename_arg (line 240) | def filename_arg(path: str, optname: str) -> str:
  function directory_arg (line 251) | def directory_arg(path: str, optname: str) -> str:
  function get_config (line 308) | def get_config(
  function get_plugin_manager (line 331) | def get_plugin_manager() -> PytestPluginManager:
  function _prepareconfig (line 342) | def _prepareconfig(
  function _get_directory (line 372) | def _get_directory(path: pathlib.Path) -> pathlib.Path:
  function _get_legacy_hook_marks (line 380) | def _get_legacy_hook_marks(
  class PytestPluginManager (line 413) | class PytestPluginManager(PluginManager):
    method __init__ (line 422) | def __init__(self) -> None:
    method parse_hookimpl_opts (line 474) | def parse_hookimpl_opts(
    method parse_hookspec_opts (line 501) | def parse_hookspec_opts(self, module_or_class, name: str) -> HookspecO...
    method register (line 513) | def register(self, plugin: _PluggyPlugin, name: str | None = None) -> ...
    method getplugin (line 538) | def getplugin(self, name: str):
    method hasplugin (line 543) | def hasplugin(self, name: str) -> bool:
    method pytest_configure (line 547) | def pytest_configure(self, config: Config) -> None:
    method _set_initial_conftests (line 568) | def _set_initial_conftests(
    method _is_in_confcutdir (line 619) | def _is_in_confcutdir(self, path: pathlib.Path) -> bool:
    method _try_load_conftest (line 634) | def _try_load_conftest(
    method _loadconftestmodules (line 659) | def _loadconftestmodules(
    method _getconftestmodules (line 691) | def _getconftestmodules(self, path: pathlib.Path) -> Sequence[types.Mo...
    method _rget_with_confmod (line 695) | def _rget_with_confmod(
    method _importconftest (line 708) | def _importconftest(
    method _check_non_top_pytest_plugins (line 761) | def _check_non_top_pytest_plugins(
    method consider_preparse (line 787) | def consider_preparse(
    method consider_pluginarg (line 812) | def consider_pluginarg(self, arg: str) -> None:
    method consider_conftest (line 841) | def consider_conftest(
    method consider_env (line 847) | def consider_env(self) -> None:
    method consider_module (line 851) | def consider_module(self, mod: types.ModuleType) -> None:
    method _import_plugin_specs (line 855) | def _import_plugin_specs(
    method import_plugin (line 862) | def import_plugin(self, modname: str, consider_entry_points: bool = Fa...
  function _get_plugin_specs_as_list (line 905) | def _get_plugin_specs_as_list(
  function _iter_rewritable_modules (line 926) | def _iter_rewritable_modules(package_files: Iterable[str]) -> Iterator[s...
  class _DeprecatedInicfgProxy (line 991) | class _DeprecatedInicfgProxy(MutableMapping[str, Any]):
    method __init__ (line 996) | def __init__(self, config: Config) -> None:
    method __getitem__ (line 999) | def __getitem__(self, key: str) -> Any:
    method __setitem__ (line 1002) | def __setitem__(self, key: str, value: Any) -> None:
    method __delitem__ (line 1005) | def __delitem__(self, key: str) -> None:
    method __iter__ (line 1008) | def __iter__(self) -> Iterator[str]:
    method __len__ (line 1011) | def __len__(self) -> int:
  class Config (line 1016) | class Config:
    class InvocationParams (line 1029) | class InvocationParams:
      method __init__ (line 1051) | def __init__(
    class ArgsSource (line 1062) | class ArgsSource(enum.Enum):
    method __init__ (line 1079) | def __init__(
    method inicfg (line 1141) | def inicfg(self) -> _DeprecatedInicfgProxy:
    method inicfg (line 1146) | def inicfg(self) -> _DeprecatedInicfgProxy:
    method rootpath (line 1154) | def rootpath(self) -> pathlib.Path:
    method inipath (line 1162) | def inipath(self) -> pathlib.Path | None:
    method add_cleanup (line 1169) | def add_cleanup(self, func: Callable[[], None]) -> None:
    method _do_configure (line 1175) | def _do_configure(self) -> None:
    method _ensure_unconfigure (line 1180) | def _ensure_unconfigure(self) -> None:
    method get_terminal_writer (line 1194) | def get_terminal_writer(self) -> TerminalWriter:
    method pytest_cmdline_parse (line 1201) | def pytest_cmdline_parse(
    method notify_exception (line 1228) | def notify_exception(
    method cwd_relative_nodeid (line 1246) | def cwd_relative_nodeid(self, nodeid: str) -> str:
    method fromdictargs (line 1258) | def fromdictargs(cls, option_dict: Mapping[str, Any], args: list[str])...
    method _processopt (line 1267) | def _processopt(self, opt: Argument) -> None:
    method pytest_load_initial_conftests (line 1272) | def pytest_load_initial_conftests(self, early_config: Config) -> None:
    method _consider_importhook (line 1298) | def _consider_importhook(self) -> None:
    method _mark_plugins_for_rewrite (line 1321) | def _mark_plugins_for_rewrite(
    method _configure_python_path (line 1344) | def _configure_python_path(self) -> None:
    method _unconfigure_python_path (line 1350) | def _unconfigure_python_path(self) -> None:
    method _validate_args (line 1356) | def _validate_args(self, args: list[str], via: str) -> list[str]:
    method _decide_args (line 1368) | def _decide_args(
    method pytest_collection (line 1414) | def pytest_collection(self) -> Generator[None, object, object]:
    method _checkversion (line 1422) | def _checkversion(self) -> None:
    method _validate_config_options (line 1435) | def _validate_config_options(self) -> None:
    method _validate_plugins (line 1439) | def _validate_plugins(self) -> None:
    method _warn_or_fail_if_strict (line 1472) | def _warn_or_fail_if_strict(self, message: str) -> None:
    method _get_unknown_ini_keys (line 1481) | def _get_unknown_ini_keys(self) -> set[str]:
    method parse (line 1485) | def parse(self, args: list[str], addopts: bool = True) -> None:
    method issue_config_time_warning (line 1593) | def issue_config_time_warning(self, warning: Warning, stacklevel: int)...
    method addinivalue_line (line 1628) | def addinivalue_line(self, name: str, line: str) -> None:
    method getini (line 1636) | def getini(self, name: str) -> Any:
    method _getini_unknown_type (line 1676) | def _getini_unknown_type(self, name: str, type: str, value: object):
    method _getini (line 1682) | def _getini(self, name: str):
    method _getini_ini (line 1719) | def _getini_ini(
    method _getini_toml (line 1780) | def _getini_toml(
    method _getconftest_pathlist (line 1864) | def _getconftest_pathlist(
    method getoption (line 1883) | def getoption(self, name: str, default: Any = NOTSET, skip: bool = Fal...
    method getvalue (line 1908) | def getvalue(self, name: str, path=None):
    method getvalueorskip (line 1912) | def getvalueorskip(self, name: str, path=None):
    method get_verbosity (line 1925) | def get_verbosity(self, verbosity_type: str | None = None) -> int:
    method _verbosity_ini_name (line 1980) | def _verbosity_ini_name(verbosity_type: str) -> str:
    method _add_verbosity_ini (line 1984) | def _add_verbosity_ini(parser: Parser, verbosity_type: str, help: str)...
    method _warn_about_missing_assertion (line 2001) | def _warn_about_missing_assertion(self, mode: str) -> None:
    method _warn_about_skipped_plugins (line 2022) | def _warn_about_skipped_plugins(self) -> None:
  function _assertion_supported (line 2030) | def _assertion_supported() -> bool:
  function create_terminal_writer (line 2039) | def create_terminal_writer(
  function _strtobool (line 2063) | def _strtobool(val: str) -> bool:
  function parse_warning_filter (line 2082) | def parse_warning_filter(
  function _resolve_warning_category (line 2162) | def _resolve_warning_category(category: str) -> type[Warning]:
  function apply_warning_filters (line 2184) | def apply_warning_filters(

FILE: src/_pytest/config/argparsing.py
  class Parser (line 25) | class Parser:
    method __init__ (line 32) | def __init__(
    method prog (line 61) | def prog(self) -> str:
    method prog (line 65) | def prog(self, value: str) -> None:
    method processoption (line 68) | def processoption(self, option: Argument) -> None:
    method getgroup (line 73) | def getgroup(
    method addoption (line 104) | def addoption(self, *opts: str, **attrs: Any) -> None:
    method parse (line 120) | def parse(
    method parse_known_args (line 144) | def parse_known_args(
    method parse_known_and_unknown_args (line 155) | def parse_known_and_unknown_args(
    method addini (line 180) | def addini(
  function get_ini_default_for_type (line 263) | def get_ini_default_for_type(
  class Argument (line 284) | class Argument:
    method __init__ (line 287) | def __init__(self, action: argparse.Action) -> None:
    method attrs (line 290) | def attrs(self) -> dict[str, Any]:
    method names (line 293) | def names(self) -> Sequence[str]:
    method dest (line 297) | def dest(self) -> str:
    method default (line 301) | def default(self) -> Any:
    method type (line 305) | def type(self) -> Any | None:
    method __repr__ (line 308) | def __repr__(self) -> str:
  class OptionGroup (line 318) | class OptionGroup:
    method __init__ (line 321) | def __init__(
    method addoption (line 334) | def addoption(self, *opts: str, **attrs: Any) -> None:
    method _addoption (line 356) | def _addoption(self, *opts: str, **attrs: Any) -> None:
    method _addoption_inner (line 361) | def _addoption_inner(
  class PytestArgumentParser (line 378) | class PytestArgumentParser(argparse.ArgumentParser):
    method __init__ (line 379) | def __init__(
    method error (line 395) | def error(self, message: str) -> NoReturn:
  class DropShorterLongHelpFormatter (line 407) | class DropShorterLongHelpFormatter(argparse.HelpFormatter):
    method __init__ (line 414) | def __init__(self, *args: Any, **kwargs: Any) -> None:
    method _format_action_invocation (line 420) | def _format_action_invocation(self, action: argparse.Action) -> str:
    method _split_lines (line 451) | def _split_lines(self, text: str, width: int) -> list[str]:
  class OverrideIniAction (line 462) | class OverrideIniAction(argparse.Action):
    method __init__ (line 470) | def __init__(
    method __call__ (line 484) | def __call__(

FILE: src/_pytest/config/exceptions.py
  class UsageError (line 7) | class UsageError(Exception):
  class PrintHelp (line 13) | class PrintHelp(Exception):

FILE: src/_pytest/config/findpaths.py
  class ConfigValue (line 23) | class ConfigValue:
  function _parse_ini_config (line 46) | def _parse_ini_config(path: Path) -> iniconfig.IniConfig:
  function load_config_dict_from_file (line 58) | def load_config_dict_from_file(
  function locate_config (line 158) | def locate_config(
  function get_common_ancestor (line 205) | def get_common_ancestor(
  function get_dirs_from_args (line 231) | def get_dirs_from_args(args: Iterable[str]) -> list[Path]:
  function parse_override_ini (line 253) | def parse_override_ini(override_ini: Sequence[str] | None) -> ConfigDict:
  function determine_setup (line 278) | def determine_setup(
  function is_fs_root (line 345) | def is_fs_root(p: Path) -> bool:

FILE: src/_pytest/debugging.py
  function _validate_usepdb_cls (line 30) | def _validate_usepdb_cls(value: str) -> tuple[str, str]:
  function pytest_addoption (line 41) | def pytest_addoption(parser: Parser) -> None:
  function pytest_configure (line 65) | def pytest_configure(config: Config) -> None:
  class pytestPDB (line 92) | class pytestPDB:
    method _is_capturing (line 104) | def _is_capturing(cls, capman: CaptureManager | None) -> str | bool:
    method _import_pdb_cls (line 110) | def _import_pdb_cls(cls, capman: CaptureManager | None):
    method _get_pdb_wrapper_class (line 148) | def _get_pdb_wrapper_class(cls, pdb_cls, capman: CaptureManager | None):
    method _init_pdb (line 240) | def _init_pdb(cls, method, *args, **kwargs):
    method set_trace (line 279) | def set_trace(cls, *args, **kwargs) -> None:
  class PdbInvoke (line 286) | class PdbInvoke:
    method pytest_exception_interact (line 287) | def pytest_exception_interact(
    method pytest_internalerror (line 299) | def pytest_internalerror(self, excinfo: ExceptionInfo[BaseException]) ...
  class PdbTrace (line 304) | class PdbTrace:
    method pytest_pyfunc_call (line 306) | def pytest_pyfunc_call(self, pyfuncitem) -> Generator[None, object, ob...
  function wrap_pytest_function_for_tracing (line 311) | def wrap_pytest_function_for_tracing(pyfuncitem) -> None:
  function maybe_wrap_pytest_function_for_tracing (line 330) | def maybe_wrap_pytest_function_for_tracing(pyfuncitem) -> None:
  function _enter_pdb (line 337) | def _enter_pdb(
  function _postmortem_exc_or_tb (line 368) | def _postmortem_exc_or_tb(
  function post_mortem (line 399) | def post_mortem(tb_or_exc: types.TracebackType | BaseException) -> None:

FILE: src/_pytest/deprecated.py
  function check_ispytest (line 97) | def check_ispytest(ispytest: bool) -> None:

FILE: src/_pytest/doctest.py
  function pytest_addoption (line 70) | def pytest_addoption(parser: Parser) -> None:
  function pytest_unconfigure (line 120) | def pytest_unconfigure() -> None:
  function pytest_collect_file (line 126) | def pytest_collect_file(
  function _is_setup_py (line 141) | def _is_setup_py(path: Path) -> bool:
  function _is_doctest (line 148) | def _is_doctest(config: Config, path: Path, parent: Collector) -> bool:
  function _is_main_py (line 155) | def _is_main_py(path: Path) -> bool:
  class ReprFailDoctest (line 159) | class ReprFailDoctest(TerminalRepr):
    method __init__ (line 160) | def __init__(
    method toterminal (line 165) | def toterminal(self, tw: TerminalWriter) -> None:
  class MultipleDoctestFailures (line 172) | class MultipleDoctestFailures(Exception):
    method __init__ (line 173) | def __init__(self, failures: Sequence[doctest.DocTestFailure]) -> None:
  function _init_runner_class (line 178) | def _init_runner_class() -> type[doctest.DocTestRunner]:
  function _get_runner (line 231) | def _get_runner(
  class DoctestItem (line 251) | class DoctestItem(Item):
    method __init__ (line 252) | def __init__(
    method from_parent (line 272) | def from_parent(  # type: ignore[override]
    method _initrequest (line 284) | def _initrequest(self) -> None:
    method setup (line 288) | def setup(self) -> None:
    method runtest (line 295) | def runtest(self) -> None:
    method _disable_output_capturing_for_darwin (line 305) | def _disable_output_capturing_for_darwin(self) -> None:
    method repr_failure (line 317) | def repr_failure(  # type: ignore[override]
    method reportinfo (line 381) | def reportinfo(self) -> tuple[os.PathLike[str] | str, int | None, str]:
  function _get_flag_lookup (line 385) | def _get_flag_lookup() -> dict[str, int]:
  function get_optionflags (line 401) | def get_optionflags(config: Config) -> int:
  function _get_continue_on_failure (line 410) | def _get_continue_on_failure(config: Config) -> bool:
  class DoctestTextfile (line 420) | class DoctestTextfile(Module):
    method collect (line 423) | def collect(self) -> Iterable[DoctestItem]:
  function _check_all_skipped (line 451) | def _check_all_skipped(test: doctest.DocTest) -> None:
  function _is_mocked (line 461) | def _is_mocked(obj: object) -> bool:
  function _patch_unwrap_mock_aware (line 471) | def _patch_unwrap_mock_aware() -> Generator[None]:
  class DoctestModule (line 500) | class DoctestModule(Module):
    method collect (line 501) | def collect(self) -> Iterable[DoctestItem]:
  function _init_checker_class (line 576) | def _init_checker_class() -> type[doctest.OutputChecker]:
  function _get_checker (line 663) | def _get_checker() -> doctest.OutputChecker:
  function _get_allow_unicode_flag (line 683) | def _get_allow_unicode_flag() -> int:
  function _get_allow_bytes_flag (line 690) | def _get_allow_bytes_flag() -> int:
  function _get_number_flag (line 697) | def _get_number_flag() -> int:
  function _get_report_choice (line 704) | def _get_report_choice(key: str) -> int:
  function doctest_namespace (line 722) | def doctest_namespace() -> dict[str, Any]:

FILE: src/_pytest/faulthandler.py
  function pytest_addoption (line 18) | def pytest_addoption(parser: Parser) -> None:
  function pytest_configure (line 33) | def pytest_configure(config: Config) -> None:
  function pytest_unconfigure (line 48) | def pytest_unconfigure(config: Config) -> None:
  function get_stderr_fileno (line 62) | def get_stderr_fileno() -> int:
  function get_timeout_config_value (line 78) | def get_timeout_config_value(config: Config) -> float:
  function get_exit_on_timeout_config_value (line 82) | def get_exit_on_timeout_config_value(config: Config) -> bool:
  function pytest_runtest_protocol (line 89) | def pytest_runtest_protocol(item: Item) -> Generator[None, object, object]:
  function pytest_enter_pdb (line 106) | def pytest_enter_pdb() -> None:
  function pytest_exception_interact (line 114) | def pytest_exception_interact() -> None:

FILE: src/_pytest/fixtures.py
  function pytest_sessionstart (line 108) | def pytest_sessionstart(session: Session) -> None:
  function get_scope_package (line 112) | def get_scope_package(
  function get_scope_node (line 124) | def get_scope_node(node: nodes.Node, scope: Scope) -> nodes.Node | None:
  function getfixturemarker (line 150) | def getfixturemarker(obj: object) -> FixtureFunctionMarker | None:
  class ParamArgKey (line 164) | class ParamArgKey:
  function get_param_argkeys (line 186) | def get_param_argkeys(item: nodes.Item, scope: Scope) -> Iterator[ParamA...
  function reorder_items (line 216) | def reorder_items(items: Sequence[nodes.Item]) -> list[nodes.Item]:
  function reorder_items_atscope (line 237) | def reorder_items_atscope(
  class FuncFixtureInfo (line 303) | class FuncFixtureInfo:
    method prune_dependency_tree (line 333) | def prune_dependency_tree(self) -> None:
  class FixtureRequest (line 356) | class FixtureRequest(abc.ABC):
    method __init__ (line 363) | def __init__(
    method _fixturemanager (line 394) | def _fixturemanager(self) -> FixtureManager:
    method _scope (line 399) | def _scope(self) -> Scope:
    method scope (line 403) | def scope(self) -> _ScopeName:
    method _check_scope (line 408) | def _check_scope(
    method fixturenames (line 416) | def fixturenames(self) -> list[str]:
    method node (line 424) | def node(self):
    method config (line 429) | def config(self) -> Config:
    method function (line 434) | def function(self):
    method cls (line 443) | def cls(self):
    method instance (line 452) | def instance(self):
    method module (line 459) | def module(self):
    method path (line 468) | def path(self) -> Path:
    method keywords (line 475) | def keywords(self) -> MutableMapping[str, Any]:
    method session (line 481) | def session(self) -> Session:
    method addfinalizer (line 486) | def addfinalizer(self, finalizer: Callable[[], object]) -> None:
    method applymarker (line 491) | def applymarker(self, marker: str | MarkDecorator) -> None:
    method raiseerror (line 502) | def raiseerror(self, msg: str | None) -> NoReturn:
    method _raise_teardown_lookup_error (line 510) | def _raise_teardown_lookup_error(self, argname: str) -> NoReturn:
    method getfixturevalue (line 520) | def getfixturevalue(self, argname: str) -> Any:
    method _iter_chain (line 553) | def _iter_chain(self) -> Iterator[SubRequest]:
    method _get_active_fixturedef (line 563) | def _get_active_fixturedef(self, argname: str) -> FixtureDef[object]:
    method _check_fixturedef_without_param (line 647) | def _check_fixturedef_without_param(self, fixturedef: FixtureDef[objec...
    method _get_fixturestack (line 680) | def _get_fixturestack(self) -> list[FixtureDef[Any]]:
  class TopRequest (line 687) | class TopRequest(FixtureRequest):
    method __init__ (line 690) | def __init__(self, pyfuncitem: Function, *, _ispytest: bool = False) -...
    method _scope (line 700) | def _scope(self) -> Scope:
    method _check_scope (line 703) | def _check_scope(
    method node (line 712) | def node(self):
    method __repr__ (line 715) | def __repr__(self) -> str:
    method _fillfixtures (line 718) | def _fillfixtures(self) -> None:
    method addfinalizer (line 724) | def addfinalizer(self, finalizer: Callable[[], object]) -> None:
  class SubRequest (line 729) | class SubRequest(FixtureRequest):
    method __init__ (line 733) | def __init__(
    method __repr__ (line 771) | def __repr__(self) -> str:
    method _scope (line 775) | def _scope(self) -> Scope:
    method node (line 779) | def node(self):
    method _check_scope (line 782) | def _check_scope(
    method _format_fixturedef_line (line 803) | def _format_fixturedef_line(self, fixturedef: FixtureDef[object]) -> str:
    method addfinalizer (line 811) | def addfinalizer(self, finalizer: Callable[[], object]) -> None:
  class FixtureLookupError (line 816) | class FixtureLookupError(LookupError):
    method __init__ (line 819) | def __init__(
    method formatrepr (line 827) | def formatrepr(self) -> FixtureLookupErrorRepr:
  class FixtureLookupErrorRepr (line 873) | class FixtureLookupErrorRepr(TerminalRepr):
    method __init__ (line 874) | def __init__(
    method toterminal (line 888) | def toterminal(self, tw: TerminalWriter) -> None:
  function call_fixture_func (line 907) | def call_fixture_func(
  function _teardown_yield_fixture (line 925) | def _teardown_yield_fixture(fixturefunc, it) -> None:
  function _eval_scope_callable (line 943) | def _eval_scope_callable(
  class FixtureDef (line 966) | class FixtureDef(Generic[FixtureValue]):
    method __init__ (line 973) | def __init__(
    method scope (line 1036) | def scope(self) -> _ScopeName:
    method addfinalizer (line 1040) | def addfinalizer(self, finalizer: Callable[[], object]) -> None:
    method finish (line 1043) | def finish(self, request: SubRequest) -> None:
    method execute (line 1068) | def execute(self, request: SubRequest) -> FixtureValue:
    method cache_key (line 1138) | def cache_key(self, request: SubRequest) -> object:
    method __repr__ (line 1141) | def __repr__(self) -> str:
  class RequestFixtureDef (line 1145) | class RequestFixtureDef(FixtureDef[FixtureRequest]):
    method __init__ (line 1151) | def __init__(self, request: FixtureRequest) -> None:
    method addfinalizer (line 1163) | def addfinalizer(self, finalizer: Callable[[], object]) -> None:
  function resolve_fixture_function (line 1167) | def resolve_fixture_function(
  function pytest_fixture_setup (line 1191) | def pytest_fixture_setup(
  class FixtureFunctionMarker (line 1229) | class FixtureFunctionMarker:
    method __post_init__ (line 1238) | def __post_init__(self, _ispytest: bool) -> None:
    method __call__ (line 1241) | def __call__(self, function: FixtureFunction) -> FixtureFunctionDefini...
  class FixtureFunctionDefinition (line 1272) | class FixtureFunctionDefinition:
    method __init__ (line 1273) | def __init__(
    method __repr__ (line 1295) | def __repr__(self) -> str:
    method __get__ (line 1298) | def __get__(self, instance, owner=None):
    method __call__ (line 1307) | def __call__(self, *args: Any, **kwds: Any) -> Any:
    method _get_wrapped_function (line 1316) | def _get_wrapped_function(self) -> Callable[..., Any]:
  function fixture (line 1321) | def fixture(
  function fixture (line 1333) | def fixture(
  function fixture (line 1344) | def fixture(
  function yield_fixture (line 1419) | def yield_fixture(
  function pytestconfig (line 1446) | def pytestconfig(request: FixtureRequest) -> Config:
  function pytest_addoption (line 1460) | def pytest_addoption(parser: Parser) -> None:
  function pytest_cmdline_main (line 1486) | def pytest_cmdline_main(config: Config) -> int | ExitCode | None:
  function _resolve_args_directness (line 1496) | def _resolve_args_directness(
  function _get_direct_parametrize_args (line 1535) | def _get_direct_parametrize_args(node: nodes.Node) -> set[str]:
  function deduplicate_names (line 1559) | def deduplicate_names(*seqs: Iterable[str]) -> tuple[str, ...]:
  class FixtureManager (line 1565) | class FixtureManager:
    method __init__ (line 1596) | def __init__(self, session: Session) -> None:
    method getfixtureinfo (line 1611) | def getfixtureinfo(
    method pytest_plugin_registered (line 1647) | def pytest_plugin_registered(self, plugin: _PluggyPlugin, plugin_name:...
    method _getautousenames (line 1671) | def _getautousenames(self, node: nodes.Node) -> Iterator[str]:
    method _getusefixturesnames (line 1678) | def _getusefixturesnames(self, node: nodes.Item) -> Iterator[str]:
    method getfixtureclosure (line 1689) | def getfixtureclosure(
    method pytest_generate_tests (line 1755) | def pytest_generate_tests(self, metafunc: Metafunc) -> None:
    method pytest_collection_modifyitems (line 1787) | def pytest_collection_modifyitems(self, items: list[nodes.Item]) -> None:
    method _register_fixture (line 1791) | def _register_fixture(
    method parsefactories (line 1848) | def parsefactories(
    method parsefactories (line 1855) | def parsefactories(
    method parsefactories (line 1862) | def parsefactories(
    method getfixturedefs (line 1928) | def getfixturedefs(
    method _matchfactories (line 1948) | def _matchfactories(
  function show_fixtures_per_test (line 1957) | def show_fixtures_per_test(config: Config) -> int | ExitCode:
  function _pretty_fixture_path (line 1966) | def _pretty_fixture_path(invocation_dir: Path, func) -> str:
  function _show_fixtures_per_test (line 1975) | def _show_fixtures_per_test(config: Config, session: Session) -> None:
  function showfixtures (line 2028) | def showfixtures(config: Config) -> int | ExitCode:
  function _showfixtures_main (line 2034) | def _showfixtures_main(config: Config, session: Session) -> None:
  function write_docstring (line 2091) | def write_docstring(tw: TerminalWriter, doc: str, indent: str = "    ") ...

FILE: src/_pytest/freeze_support.py
  function freeze_includes (line 10) | def freeze_includes() -> list[str]:
  function _iter_all_modules (line 19) | def _iter_all_modules(

FILE: src/_pytest/helpconfig.py
  class HelpAction (line 21) | class HelpAction(argparse.Action):
    method __init__ (line 34) | def __init__(
    method __call__ (line 46) | def __call__(
  function pytest_addoption (line 59) | def pytest_addoption(parser: Parser) -> None:
  function pytest_cmdline_parse (line 123) | def pytest_cmdline_parse() -> Generator[None, Config, Config]:
  function show_version_verbose (line 155) | def show_version_verbose(config: Config) -> None:
  function pytest_cmdline_main (line 166) | def pytest_cmdline_main(config: Config) -> int | ExitCode | None:
  function showhelp (line 180) | def showhelp(config: Config) -> None:
  function getpluginversioninfo (line 263) | def getpluginversioninfo(config: Config) -> list[str]:
  function pytest_report_header (line 275) | def pytest_report_header(config: Config) -> list[str]:

FILE: src/_pytest/hookspec.py
  function pytest_addhooks (line 54) | def pytest_addhooks(pluginmanager: PytestPluginManager) -> None:
  function pytest_plugin_registered (line 72) | def pytest_plugin_registered(
  function pytest_addoption (line 97) | def pytest_addoption(parser: Parser, pluginmanager: PytestPluginManager)...
  function pytest_configure (line 138) | def pytest_configure(config: Config) -> None:
  function pytest_cmdline_parse (line 162) | def pytest_cmdline_parse(
  function pytest_load_initial_conftests (line 185) | def pytest_load_initial_conftests(
  function pytest_cmdline_main (line 203) | def pytest_cmdline_main(config: Config) -> ExitCode | int | None:
  function pytest_collection (line 227) | def pytest_collection(session: Session) -> object | None:
  function pytest_collection_modifyitems (line 268) | def pytest_collection_modifyitems(
  function pytest_collection_finish (line 290) | def pytest_collection_finish(session: Session) -> None:
  function pytest_ignore_collect (line 303) | def pytest_ignore_collect(collection_path: Path, config: Config) -> bool...
  function pytest_collect_directory (line 337) | def pytest_collect_directory(path: Path, parent: Collector) -> Collector...
  function pytest_collect_file (line 366) | def pytest_collect_file(file_path: Path, parent: Collector) -> Collector...
  function pytest_collectstart (line 394) | def pytest_collectstart(collector: Collector) -> None:
  function pytest_itemcollected (line 409) | def pytest_itemcollected(item: Item) -> None:
  function pytest_collectreport (line 423) | def pytest_collectreport(report: CollectReport) -> None:
  function pytest_deselected (line 438) | def pytest_deselected(items: Sequence[Item]) -> None:
  function pytest_make_collect_report (line 460) | def pytest_make_collect_report(collector: Collector) -> CollectReport | ...
  function pytest_pycollect_makemodule (line 484) | def pytest_pycollect_makemodule(module_path: Path, parent) -> Module | N...
  function pytest_pycollect_makeitem (line 512) | def pytest_pycollect_makeitem(
  function pytest_pyfunc_call (line 538) | def pytest_pyfunc_call(pyfuncitem: Function) -> object | None:
  function pytest_generate_tests (line 555) | def pytest_generate_tests(metafunc: Metafunc) -> None:
  function pytest_make_parametrize_id (line 571) | def pytest_make_parametrize_id(config: Config, val: object, argname: str...
  function pytest_runtestloop (line 597) | def pytest_runtestloop(session: Session) -> object | None:
  function pytest_runtest_protocol (line 623) | def pytest_runtest_protocol(item: Item, nextitem: Item | None) -> object...
  function pytest_runtest_logstart (line 663) | def pytest_runtest_logstart(nodeid: str, location: tuple[str, int | None...
  function pytest_runtest_logfinish (line 681) | def pytest_runtest_logfinish(
  function pytest_runtest_setup (line 701) | def pytest_runtest_setup(item: Item) -> None:
  function pytest_runtest_call (line 720) | def pytest_runtest_call(item: Item) -> None:
  function pytest_runtest_teardown (line 736) | def pytest_runtest_teardown(item: Item, nextitem: Item | None) -> None:
  function pytest_runtest_makereport (line 761) | def pytest_runtest_makereport(item: Item, call: CallInfo[None]) -> TestR...
  function pytest_runtest_logreport (line 780) | def pytest_runtest_logreport(report: TestReport) -> None:
  function pytest_report_to_serializable (line 795) | def pytest_report_to_serializable(
  function pytest_report_from_serializable (line 814) | def pytest_report_from_serializable(
  function pytest_fixture_setup (line 837) | def pytest_fixture_setup(
  function pytest_fixture_post_finalizer (line 865) | def pytest_fixture_post_finalizer(
  function pytest_sessionstart (line 891) | def pytest_sessionstart(session: Session) -> None:
  function pytest_sessionfinish (line 904) | def pytest_sessionfinish(
  function pytest_unconfigure (line 920) | def pytest_unconfigure(config: Config) -> None:
  function pytest_assertrepr_compare (line 937) | def pytest_assertrepr_compare(
  function pytest_assertion_pass (line 960) | def pytest_assertion_pass(item: Item, lineno: int, orig: str, expl: str)...
  function pytest_report_header (line 1008) | def pytest_report_header(config: Config, start_path: Path) -> str | list...
  function pytest_report_collectionfinish (line 1035) | def pytest_report_collectionfinish(  # type: ignore[empty-body]
  function pytest_report_teststatus (line 1073) | def pytest_report_teststatus(  # type:ignore[empty-body]
  function pytest_terminal_summary (line 1105) | def pytest_terminal_summary(
  function pytest_warning_recorded (line 1127) | def pytest_warning_recorded(
  function pytest_markeval_namespace (line 1171) | def pytest_markeval_namespace(  # type:ignore[empty-body]
  function pytest_internalerror (line 1200) | def pytest_internalerror(
  function pytest_keyboard_interrupt (line 1219) | def pytest_keyboard_interrupt(
  function pytest_exception_interact (line 1233) | def pytest_exception_interact(
  function pytest_enter_pdb (line 1265) | def pytest_enter_pdb(config: Config, pdb: pdb.Pdb) -> None:
  function pytest_leave_pdb (line 1281) | def pytest_leave_pdb(config: Config, pdb: pdb.Pdb) -> None:

FILE: src/_pytest/junitxml.py
  function bin_xml_escape (line 37) | def bin_xml_escape(arg: object) -> str:
  function merge_family (line 64) | def merge_family(left, right) -> None:
  class _NodeReporter (line 86) | class _NodeReporter:
    method __init__ (line 87) | def __init__(self, nodeid: str | TestReport, xml: LogXML) -> None:
    method append (line 97) | def append(self, node: ET.Element) -> None:
    method add_property (line 101) | def add_property(self, name: str, value: object) -> None:
    method add_attribute (line 104) | def add_attribute(self, name: str, value: object) -> None:
    method make_properties_node (line 107) | def make_properties_node(self) -> ET.Element | None:
    method record_testreport (line 116) | def record_testreport(self, testreport: TestReport) -> None:
    method to_xml (line 146) | def to_xml(self) -> ET.Element:
    method _add_simple (line 154) | def _add_simple(self, tag: str, message: str, data: str | None = None)...
    method write_captured_output (line 159) | def write_captured_output(self, report: TestReport) -> None:
    method _prepare_content (line 182) | def _prepare_content(self, content: str, header: str) -> str:
    method _write_content (line 185) | def _write_content(self, report: TestReport, content: str, jheader: st...
    method append_pass (line 190) | def append_pass(self, report: TestReport) -> None:
    method append_failure (line 193) | def append_failure(self, report: TestReport) -> None:
    method append_collect_error (line 209) | def append_collect_error(self, report: TestReport) -> None:
    method append_collect_skipped (line 214) | def append_collect_skipped(self, report: TestReport) -> None:
    method append_error (line 217) | def append_error(self, report: TestReport) -> None:
    method append_skipped (line 231) | def append_skipped(self, report: TestReport) -> None:
    method finalize (line 253) | def finalize(self) -> None:
  function _warn_incompatibility_with_xunit2 (line 261) | def _warn_incompatibility_with_xunit2(
  function record_property (line 277) | def record_property(request: FixtureRequest) -> Callable[[str, object], ...
  function record_xml_attribute (line 300) | def record_xml_attribute(request: FixtureRequest) -> Callable[[str, obje...
  function _check_record_param_type (line 328) | def _check_record_param_type(param: str, v: str) -> None:
  function record_testsuite_property (line 338) | def record_testsuite_property(request: FixtureRequest) -> Callable[[str,...
  function pytest_addoption (line 376) | def pytest_addoption(parser: Parser) -> None:
  function pytest_configure (line 423) | def pytest_configure(config: Config) -> None:
  function pytest_unconfigure (line 440) | def pytest_unconfigure(config: Config) -> None:
  function mangle_test_address (line 447) | def mangle_test_address(address: str) -> list[str]:
  class LogXML (line 458) | class LogXML:
    method __init__ (line 459) | def __init__(
    method finalize (line 492) | def finalize(self, report: TestReport) -> None:
    method node_reporter (line 504) | def node_reporter(self, report: TestReport | str) -> _NodeReporter:
    method add_stats (line 522) | def add_stats(self, key: str) -> None:
    method _opentestcase (line 526) | def _opentestcase(self, report: TestReport) -> _NodeReporter:
    method pytest_runtest_logreport (line 531) | def pytest_runtest_logreport(self, report: TestReport) -> None:
    method update_testcase_duration (line 616) | def update_testcase_duration(self, report: TestReport) -> None:
    method pytest_collectreport (line 623) | def pytest_collectreport(self, report: TestReport) -> None:
    method pytest_internalerror (line 631) | def pytest_internalerror(self, excrepr: ExceptionRepr) -> None:
    method pytest_sessionstart (line 636) | def pytest_sessionstart(self) -> None:
    method pytest_sessionfinish (line 639) | def pytest_sessionfinish(self) -> None:
    method pytest_terminal_summary (line 677) | def pytest_terminal_summary(
    method add_global_property (line 683) | def add_global_property(self, name: str, value: object) -> None:
    method _get_global_properties_node (line 688) | def _get_global_properties_node(self) -> ET.Element | None:

FILE: src/_pytest/legacypath.py
  class Testdir (line 42) | class Testdir:
    method __init__ (line 55) | def __init__(self, pytester: Pytester, *, _ispytest: bool = False) -> ...
    method tmpdir (line 60) | def tmpdir(self) -> LEGACY_PATH:
    method test_tmproot (line 65) | def test_tmproot(self) -> LEGACY_PATH:
    method request (line 69) | def request(self):
    method plugins (line 73) | def plugins(self):
    method plugins (line 77) | def plugins(self, plugins):
    method monkeypatch (line 81) | def monkeypatch(self) -> MonkeyPatch:
    method make_hook_recorder (line 84) | def make_hook_recorder(self, pluginmanager) -> HookRecorder:
    method chdir (line 88) | def chdir(self) -> None:
    method finalize (line 92) | def finalize(self) -> None:
    method makefile (line 95) | def makefile(self, ext, *args, **kwargs) -> LEGACY_PATH:
    method makeconftest (line 107) | def makeconftest(self, source) -> LEGACY_PATH:
    method makeini (line 111) | def makeini(self, source) -> LEGACY_PATH:
    method getinicfg (line 115) | def getinicfg(self, source: str) -> SectionWrapper:
    method makepyprojecttoml (line 119) | def makepyprojecttoml(self, source) -> LEGACY_PATH:
    method makepyfile (line 123) | def makepyfile(self, *args, **kwargs) -> LEGACY_PATH:
    method maketxtfile (line 127) | def maketxtfile(self, *args, **kwargs) -> LEGACY_PATH:
    method syspathinsert (line 131) | def syspathinsert(self, path=None) -> None:
    method mkdir (line 135) | def mkdir(self, name) -> LEGACY_PATH:
    method mkpydir (line 139) | def mkpydir(self, name) -> LEGACY_PATH:
    method copy_example (line 143) | def copy_example(self, name=None) -> LEGACY_PATH:
    method getnode (line 147) | def getnode(self, config: Config, arg) -> Item | Collector | None:
    method getpathnode (line 151) | def getpathnode(self, path):
    method genitems (line 155) | def genitems(self, colitems: list[Item | Collector]) -> list[Item]:
    method runitem (line 159) | def runitem(self, source):
    method inline_runsource (line 163) | def inline_runsource(self, source, *cmdlineargs):
    method inline_genitems (line 167) | def inline_genitems(self, *args):
    method inline_run (line 171) | def inline_run(self, *args, plugins=(), no_reraise_ctrlc: bool = False):
    method runpytest_inprocess (line 177) | def runpytest_inprocess(self, *args, **kwargs) -> RunResult:
    method runpytest (line 181) | def runpytest(self, *args, **kwargs) -> RunResult:
    method parseconfig (line 185) | def parseconfig(self, *args) -> Config:
    method parseconfigure (line 189) | def parseconfigure(self, *args) -> Config:
    method getitem (line 193) | def getitem(self, source, funcname="test_func"):
    method getitems (line 197) | def getitems(self, source):
    method getmodulecol (line 201) | def getmodulecol(self, source, configargs=(), withinit=False):
    method collect_by_name (line 207) | def collect_by_name(self, modcol: Collector, name: str) -> Item | Coll...
    method popen (line 211) | def popen(
    method run (line 222) | def run(self, *cmdargs, timeout=None, stdin=CLOSE_STDIN) -> RunResult:
    method runpython (line 226) | def runpython(self, script) -> RunResult:
    method runpython_c (line 230) | def runpython_c(self, command):
    method runpytest_subprocess (line 234) | def runpytest_subprocess(self, *args, timeout=None) -> RunResult:
    method spawn_pytest (line 238) | def spawn_pytest(self, string: str, expect_timeout: float = 10.0) -> p...
    method spawn (line 242) | def spawn(self, cmd: str, expect_timeout: float = 10.0) -> pexpect.spawn:
    method __repr__ (line 246) | def __repr__(self) -> str:
    method __str__ (line 249) | def __str__(self) -> str:
  class LegacyTestdirPlugin (line 253) | class LegacyTestdirPlugin:
    method testdir (line 256) | def testdir(pytester: Pytester) -> Testdir:
  class TempdirFactory (line 268) | class TempdirFactory:
    method __init__ (line 281) | def __init__(
    method mktemp (line 287) | def mktemp(self, basename: str, numbered: bool = True) -> LEGACY_PATH:
    method getbasetemp (line 291) | def getbasetemp(self) -> LEGACY_PATH:
  class LegacyTmpdirPlugin (line 296) | class LegacyTmpdirPlugin:
    method tmpdir_factory (line 299) | def tmpdir_factory(request: FixtureRequest) -> TempdirFactory:
    method tmpdir (line 306) | def tmpdir(tmp_path: Path) -> LEGACY_PATH:
  function Cache_makedir (line 323) | def Cache_makedir(self: Cache, name: str) -> LEGACY_PATH:
  function FixtureRequest_fspath (line 331) | def FixtureRequest_fspath(self: FixtureRequest) -> LEGACY_PATH:
  function TerminalReporter_startdir (line 336) | def TerminalReporter_startdir(self: TerminalReporter) -> LEGACY_PATH:
  function Config_invocation_dir (line 346) | def Config_invocation_dir(self: Config) -> LEGACY_PATH:
  function Config_rootdir (line 357) | def Config_rootdir(self: Config) -> LEGACY_PATH:
  function Config_inifile (line 367) | def Config_inifile(self: Config) -> LEGACY_PATH | None:
  function Session_startdir (line 377) | def Session_startdir(self: Session) -> LEGACY_PATH:
  function Config__getini_unknown_type (line 387) | def Config__getini_unknown_type(self, name: str, type: str, value: str |...
  function Node_fspath (line 398) | def Node_fspath(self: Node) -> LEGACY_PATH:
  function Node_fspath_set (line 403) | def Node_fspath_set(self: Node, value: LEGACY_PATH) -> None:
  function pytest_load_initial_conftests (line 408) | def pytest_load_initial_conftests(early_config: Config) -> None:
  function pytest_configure (line 440) | def pytest_configure(config: Config) -> None:
  function pytest_plugin_registered (line 463) | def pytest_plugin_registered(plugin: object, manager: PytestPluginManage...

FILE: src/_pytest/logging.py
  function _remove_ansi_escape_sequences (line 57) | def _remove_ansi_escape_sequences(text: str) -> str:
  class DatetimeFormatter (line 61) | class DatetimeFormatter(logging.Formatter):
    method formatTime (line 67) | def formatTime(self, record: LogRecord, datefmt: str | None = None) ->...
  class ColoredLevelFormatter (line 80) | class ColoredLevelFormatter(DatetimeFormatter):
    method __init__ (line 95) | def __init__(self, terminalwriter: TerminalWriter, *args, **kwargs) ->...
    method add_color_level (line 104) | def add_color_level(self, level: int, *color_opts: str) -> None:
    method format (line 134) | def format(self, record: logging.LogRecord) -> str:
  class PercentStyleMultiline (line 140) | class PercentStyleMultiline(logging.PercentStyle):
    method __init__ (line 147) | def __init__(self, fmt: str, auto_indent: int | str | bool | None) -> ...
    method _get_auto_indent (line 152) | def _get_auto_indent(auto_indent_option: int | str | bool | None) -> int:
    method format (line 205) | def format(self, record: logging.LogRecord) -> str:
  function get_option_ini (line 229) | def get_option_ini(config: Config, *names: str):
  function pytest_addoption (line 238) | def pytest_addoption(parser: Parser) -> None:
  class catching_logs (line 342) | class catching_logs(Generic[_HandlerType]):
    method __init__ (line 347) | def __init__(self, handler: _HandlerType, level: int | None = None) ->...
    method __enter__ (line 351) | def __enter__(self) -> _HandlerType:
    method __exit__ (line 361) | def __exit__(
  class LogCaptureHandler (line 373) | class LogCaptureHandler(logging_StreamHandler):
    method __init__ (line 376) | def __init__(self) -> None:
    method emit (line 381) | def emit(self, record: logging.LogRecord) -> None:
    method reset (line 386) | def reset(self) -> None:
    method clear (line 390) | def clear(self) -> None:
    method handleError (line 394) | def handleError(self, record: logging.LogRecord) -> None:
  class LogCaptureFixture (line 404) | class LogCaptureFixture:
    method __init__ (line 407) | def __init__(self, item: nodes.Node, *, _ispytest: bool = False) -> None:
    method _finalize (line 415) | def _finalize(self) -> None:
    method handler (line 432) | def handler(self) -> LogCaptureHandler:
    method get_records (line 436) | def get_records(
    method text (line 452) | def text(self) -> str:
    method records (line 457) | def records(self) -> list[logging.LogRecord]:
    method record_tuples (line 462) | def record_tuples(self) -> list[tuple[str, int, str]]:
    method messages (line 473) | def messages(self) -> list[str]:
    method clear (line 491) | def clear(self) -> None:
    method _force_enable_logging (line 495) | def _force_enable_logging(
    method set_level (line 529) | def set_level(self, level: int | str, logger: str | None = None) -> None:
    method at_level (line 555) | def at_level(self, level: int | str, logger: str | None = None) -> Gen...
    method filtering (line 579) | def filtering(self, filter_: logging.Filter) -> Generator[None]:
  function caplog (line 596) | def caplog(request: FixtureRequest) -> Generator[LogCaptureFixture]:
  function get_log_level_for_setting (line 612) | def get_log_level_for_setting(config: Config, *setting_names: str) -> in...
  function pytest_configure (line 637) | def pytest_configure(config: Config) -> None:
  class LoggingPlugin (line 641) | class LoggingPlugin:
    method __init__ (line 644) | def __init__(self, config: Config) -> None:
    method _disable_loggers (line 711) | def _disable_loggers(self, loggers_to_disable: list[str]) -> None:
    method _create_formatter (line 719) | def _create_formatter(self, log_format, log_date_format, auto_indent):
    method set_log_path (line 737) | def set_log_path(self, fname: str) -> None:
    method _log_cli_enabled (line 759) | def _log_cli_enabled(self) -> bool:
    method pytest_sessionstart (line 775) | def pytest_sessionstart(self) -> Generator[None]:
    method pytest_collection (line 783) | def pytest_collection(self) -> Generator[None]:
    method pytest_runtestloop (line 791) | def pytest_runtestloop(self, session: Session) -> Generator[None, obje...
    method pytest_runtest_logstart (line 804) | def pytest_runtest_logstart(self) -> None:
    method pytest_runtest_logreport (line 809) | def pytest_runtest_logreport(self) -> None:
    method _runtest_for (line 813) | def _runtest_for(self, item: nodes.Item, when: str) -> Generator[None]:
    method pytest_runtest_setup (line 837) | def pytest_runtest_setup(self, item: nodes.Item) -> Generator[None]:
    method pytest_runtest_call (line 846) | def pytest_runtest_call(self, item: nodes.Item) -> Generator[None]:
    method pytest_runtest_teardown (line 853) | def pytest_runtest_teardown(self, item: nodes.Item) -> Generator[None]:
    method pytest_runtest_logfinish (line 864) | def pytest_runtest_logfinish(self) -> None:
    method pytest_sessionfinish (line 868) | def pytest_sessionfinish(self) -> Generator[None]:
    method pytest_unconfigure (line 876) | def pytest_unconfigure(self) -> None:
  class _FileHandler (line 882) | class _FileHandler(logging.FileHandler):
    method handleError (line 885) | def handleError(self, record: logging.LogRecord) -> None:
  class _LiveLoggingStreamHandler (line 890) | class _LiveLoggingStreamHandler(logging_StreamHandler):
    method __init__ (line 903) | def __init__(
    method reset (line 914) | def reset(self) -> None:
    method set_when (line 918) | def set_when(self, when: str | None) -> None:
    method emit (line 925) | def emit(self, record: logging.LogRecord) -> None:
    method handleError (line 944) | def handleError(self, record: logging.LogRecord) -> None:
  class _LiveLoggingNullHandler (line 949) | class _LiveLoggingNullHandler(logging.NullHandler):
    method reset (line 952) | def reset(self) -> None:
    method set_when (line 955) | def set_when(self, when: str) -> None:
    method handleError (line 958) | def handleError(self, record: logging.LogRecord) -> None:

FILE: src/_pytest/main.py
  function pytest_addoption (line 57) | def pytest_addoption(parser: Parser) -> None:
  function validate_basetemp (line 279) | def validate_basetemp(path: str) -> str:
  function wrap_session (line 304) | def wrap_session(
  function pytest_cmdline_main (line 363) | def pytest_cmdline_main(config: Config) -> int | ExitCode:
  function _main (line 367) | def _main(config: Config, session: Session) -> int | ExitCode | None:
  function pytest_collection (line 380) | def pytest_collection(session: Session) -> None:
  function pytest_runtestloop (line 384) | def pytest_runtestloop(session: Session) -> bool:
  function _in_venv (line 403) | def _in_venv(path: Path) -> bool:
  function pytest_ignore_collect (line 424) | def pytest_ignore_collect(collection_path: Path, config: Config) -> bool...
  function pytest_collect_directory (line 462) | def pytest_collect_directory(
  function pytest_collection_modifyitems (line 468) | def pytest_collection_modifyitems(items: list[nodes.Item], config: Confi...
  class FSHookProxy (line 486) | class FSHookProxy:
    method __init__ (line 487) | def __init__(
    method __getattr__ (line 495) | def __getattr__(self, name: str) -> pluggy.HookCaller:
  class Interrupted (line 501) | class Interrupted(KeyboardInterrupt):
  class Failed (line 507) | class Failed(Exception):
  class _bestrelpath_cache (line 512) | class _bestrelpath_cache(dict[Path, str]):
    method __missing__ (line 517) | def __missing__(self, path: Path) -> str:
  class Dir (line 524) | class Dir(nodes.Directory):
    method from_parent (line 537) | def from_parent(  # type: ignore[override]
    method collect (line 551) | def collect(self) -> Iterable[nodes.Item | nodes.Collector]:
  class Session (line 576) | class Session(nodes.Collector):
    method __init__ (line 590) | def __init__(self, config: Config) -> None:
    method from_config (line 617) | def from_config(cls, config: Config) -> Session:
    method __repr__ (line 621) | def __repr__(self) -> str:
    method shouldstop (line 630) | def shouldstop(self) -> bool | str:
    method shouldstop (line 634) | def shouldstop(self, value: bool | str) -> None:
    method shouldfail (line 648) | def shouldfail(self) -> bool | str:
    method shouldfail (line 652) | def shouldfail(self, value: bool | str) -> None:
    method startpath (line 666) | def startpath(self) -> Path:
    method _node_location_to_relpath (line 673) | def _node_location_to_relpath(self, node_path: Path) -> str:
    method pytest_collectstart (line 678) | def pytest_collectstart(self) -> None:
    method pytest_runtest_logreport (line 685) | def pytest_runtest_logreport(self, report: TestReport | CollectReport)...
    method isinitpath (line 694) | def isinitpath(
    method gethookproxy (line 718) | def gethookproxy(self, fspath: os.PathLike[str]) -> pluggy.HookRelay:
    method _collect_path (line 735) | def _collect_path(
    method perform_collect (line 767) | def perform_collect(
    method perform_collect (line 772) | def perform_collect(
    method perform_collect (line 776) | def perform_collect(
    method _collect_one_node (line 873) | def _collect_one_node(
    method collect (line 886) | def collect(self) -> Iterator[nodes.Item | nodes.Collector]:
    method genitems (line 1010) | def genitems(self, node: nodes.Item | nodes.Collector) -> Iterator[nod...
  function search_pypath (line 1027) | def search_pypath(
  class CollectionArgument (line 1064) | class CollectionArgument:
  function resolve_collection_argument (line 1074) | def resolve_collection_argument(
  function is_collection_argument_subsumed_by (line 1153) | def is_collection_argument_subsumed_by(
  function normalize_collection_arguments (line 1177) | def normalize_collection_arguments(

FILE: src/_pytest/mark/__init__.py
  function param (line 49) | def param(
  function pytest_addoption (line 88) | def pytest_addoption(parser: Parser) -> None:
  function pytest_cmdline_main (line 131) | def pytest_cmdline_main(config: Config) -> int | ExitCode | None:
  class KeywordMatcher (line 151) | class KeywordMatcher:
    method from_item (line 170) | def from_item(cls, item: Item) -> KeywordMatcher:
    method __call__ (line 200) | def __call__(self, subname: str, /, **kwargs: str | int | bool | None)...
  function deselect_by_keyword (line 207) | def deselect_by_keyword(items: list[Item], config: Config) -> None:
  class MarkMatcher (line 228) | class MarkMatcher:
    method from_markers (line 239) | def from_markers(cls, markers: Iterable[Mark]) -> MarkMatcher:
    method __call__ (line 245) | def __call__(self, name: str, /, **kwargs: str | int | bool | None) ->...
  function deselect_by_mark (line 255) | def deselect_by_mark(items: list[Item], config: Config) -> None:
  function _parse_expression (line 273) | def _parse_expression(expr: str, exc_message: str) -> Expression:
  function pytest_collection_modifyitems (line 282) | def pytest_collection_modifyitems(items: list[Item], config: Config) -> ...
  function pytest_configure (line 287) | def pytest_configure(config: Config) -> None:
  function pytest_unconfigure (line 300) | def pytest_unconfigure(config: Config) -> None:

FILE: src/_pytest/mark/expression.py
  class TokenType (line 51) | class TokenType(enum.Enum):
  class Token (line 65) | class Token:
  class Scanner (line 72) | class Scanner:
    method __init__ (line 75) | def __init__(self, input: str) -> None:
    method lex (line 80) | def lex(self, input: str) -> Iterator[Token]:
    method accept (line 133) | def accept(self, type: TokenType, *, reject: Literal[True]) -> Token: ...
    method accept (line 136) | def accept(
    method accept (line 140) | def accept(self, type: TokenType, *, reject: bool = False) -> Token | ...
    method reject (line 150) | def reject(self, expected: Sequence[TokenType]) -> NoReturn:
  function expression (line 166) | def expression(s: Scanner) -> ast.Expression:
  function expr (line 175) | def expr(s: Scanner) -> ast.expr:
  function and_expr (line 183) | def and_expr(s: Scanner) -> ast.expr:
  function not_expr (line 191) | def not_expr(s: Scanner) -> ast.expr:
  function single_kwarg (line 214) | def single_kwarg(s: Scanner) -> ast.keyword:
  function all_kwargs (line 248) | def all_kwargs(s: Scanner) -> list[ast.keyword]:
  class ExpressionMatcher (line 255) | class ExpressionMatcher(Protocol):
    method __call__ (line 279) | def __call__(self, name: str, /, **kwargs: str | int | bool | None) ->...
  class MatcherNameAdapter (line 283) | class MatcherNameAdapter:
    method __bool__ (line 287) | def __bool__(self) -> bool:
    method __call__ (line 290) | def __call__(self, **kwargs: str | int | bool | None) -> bool:
  class MatcherAdapter (line 294) | class MatcherAdapter(Mapping[str, MatcherNameAdapter]):
    method __init__ (line 297) | def __init__(self, matcher: ExpressionMatcher) -> None:
    method __getitem__ (line 300) | def __getitem__(self, key: str) -> MatcherNameAdapter:
    method __iter__ (line 303) | def __iter__(self) -> Iterator[str]:
    method __len__ (line 306) | def __len__(self) -> int:
  class Expression (line 311) | class Expression:
    method __init__ (line 319) | def __init__(self, input: str, code: types.CodeType) -> None:
    method compile (line 325) | def compile(cls, input: str) -> Expression:
    method evaluate (line 340) | def evaluate(self, matcher: ExpressionMatcher) -> bool:

FILE: src/_pytest/mark/structures.py
  class _HiddenParam (line 45) | class _HiddenParam(enum.Enum):
  function istestfunc (line 53) | def istestfunc(func) -> bool:
  function get_empty_parameterset_mark (line 57) | def get_empty_parameterset_mark(
  class ParameterSet (line 80) | class ParameterSet(NamedTuple):
    method param (line 113) | def param(
    method extract_from (line 138) | def extract_from(
    method _parse_parametrize_args (line 166) | def _parse_parametrize_args(
    method _parse_parametrize_parameters (line 184) | def _parse_parametrize_parameters(
    method _for_parametrize (line 193) | def _for_parametrize(
  class Mark (line 248) | class Mark:
    method __init__ (line 265) | def __init__(
    method _has_param_ids (line 284) | def _has_param_ids(self) -> bool:
    method combined_with (line 287) | def combined_with(self, other: Mark) -> Mark:
  class MarkDecorator (line 322) | class MarkDecorator:
    method __init__ (line 359) | def __init__(self, mark: Mark, *, _ispytest: bool = False) -> None:
    method name (line 365) | def name(self) -> str:
    method args (line 370) | def args(self) -> tuple[Any, ...]:
    method kwargs (line 375) | def kwargs(self) -> Mapping[str, Any]:
    method markname (line 380) | def markname(self) -> str:
    method with_args (line 384) | def with_args(self, *args: object, **kwargs: object) -> MarkDecorator:
    method __call__ (line 397) | def __call__(self, arg: Markable) -> Markable:  # type: ignore[overloa...
    method __call__ (line 401) | def __call__(self, *args: object, **kwargs: object) -> MarkDecorator:
    method __call__ (line 404) | def __call__(self, *args: object, **kwargs: object):
  function get_unpacked_marks (line 420) | def get_unpacked_marks(
  function normalize_mark_list (line 453) | def normalize_mark_list(
  function store_mark (line 470) | def store_mark(obj, mark: Mark) -> None:
  class _SkipMarkDecorator (line 494) | class _SkipMarkDecorator(MarkDecorator):
    method __call__ (line 496) | def __call__(self, arg: Markable) -> Markable: ...
    method __call__ (line 499) | def __call__(self, reason: str = ...) -> MarkDecorator: ...
  class _SkipifMarkDecorator (line 501) | class _SkipifMarkDecorator(MarkDecorator):
    method __call__ (line 502) | def __call__(  # type: ignore[override]
  class _XfailMarkDecorator (line 509) | class _XfailMarkDecorator(MarkDecorator):
    method __call__ (line 511) | def __call__(self, arg: Markable) -> Markable: ...
    method __call__ (line 514) | def __call__(
  class _ParametrizeMarkDecorator (line 527) | class _ParametrizeMarkDecorator(MarkDecorator):
    method __call__ (line 529) | def __call__(
    method __call__ (line 546) | def __call__(
  class _UsefixturesMarkDecorator (line 558) | class _UsefixturesMarkDecorator(MarkDecorator):
    method __call__ (line 559) | def __call__(self, *fixtures: str) -> MarkDecorator:  # type: ignore[o...
  class _FilterwarningsMarkDecorator (line 562) | class _FilterwarningsMarkDecorator(MarkDecorator):
    method __call__ (line 563) | def __call__(self, *filters: str) -> MarkDecorator:  # type: ignore[ov...
  class MarkGenerator (line 568) | class MarkGenerator:
    method __init__ (line 593) | def __init__(self, *, _ispytest: bool = False) -> None:
    method __getattr__ (line 598) | def __getattr__(self, name: str) -> MarkDecorator:
  class NodeKeywords (line 647) | class NodeKeywords(MutableMapping[str, Any]):
    method __init__ (line 650) | def __init__(self, node: Node) -> None:
    method __getitem__ (line 655) | def __getitem__(self, key: str) -> Any:
    method __setitem__ (line 663) | def __setitem__(self, key: str, value: Any) -> None:
    method __contains__ (line 669) | def __contains__(self, key: object) -> bool:
    method update (line 674) | def update(  # type: ignore[override]
    method __delitem__ (line 682) | def __delitem__(self, key: str) -> None:
    method __iter__ (line 685) | def __iter__(self) -> Iterator[str]:
    method __len__ (line 694) | def __len__(self) -> int:
    method __repr__ (line 698) | def __repr__(self) -> str:

FILE: src/_pytest/monkeypatch.py
  function monkeypatch (line 36) | def monkeypatch() -> Generator[MonkeyPatch]:
  function resolve (line 65) | def resolve(name: str) -> object:
  function annotated_getattr (line 93) | def annotated_getattr(obj: object, name: str, ann: str) -> object:
  function derive_importpath (line 103) | def derive_importpath(import_path: str, raising: bool) -> tuple[str, obj...
  class MonkeyPatch (line 114) | class MonkeyPatch:
    method __init__ (line 127) | def __init__(self) -> None:
    method context (line 135) | def context(cls) -> Generator[MonkeyPatch]:
    method setattr (line 161) | def setattr(
    method setattr (line 170) | def setattr(
    method setattr (line 178) | def setattr(
    method delattr (line 250) | def delattr(
    method setitem (line 288) | def setitem(self, dic: Mapping[K, V], name: K, value: V) -> None:
    method delitem (line 294) | def delitem(self, dic: Mapping[K, V], name: K, raising: bool = True) -...
    method setenv (line 308) | def setenv(self, name: str, value: str, prepend: str | None = None) ->...
    method delenv (line 328) | def delenv(self, name: str, raising: bool = True) -> None:
    method syspath_prepend (line 337) | def syspath_prepend(self, path) -> None:
    method chdir (line 379) | def chdir(self, path: str | os.PathLike[str]) -> None:
    method undo (line 389) | def undo(self) -> None:

FILE: src/_pytest/nodes.py
  function norm_sep (line 53) | def norm_sep(path: str | os.PathLike[str]) -> str:
  class NodeMeta (line 75) | class NodeMeta(abc.ABCMeta):
    method __call__ (line 90) | def __call__(cls, *k, **kw) -> NoReturn:
    method _create (line 99) | def _create(cls: type[_T], *k, **kw) -> _T:
  class Node (line 119) | class Node(abc.ABC, metaclass=NodeMeta):
    method __init__ (line 147) | def __init__(
    method from_parent (line 210) | def from_parent(cls, parent: Node, **kw) -> Self:
    method ihook (line 228) | def ihook(self) -> pluggy.HookRelay:
    method __repr__ (line 232) | def __repr__(self) -> str:
    method warn (line 235) | def warn(self, warning: Warning) -> None:
    method nodeid (line 273) | def nodeid(self) -> str:
    method __hash__ (line 277) | def __hash__(self) -> int:
    method setup (line 280) | def setup(self) -> None:
    method teardown (line 283) | def teardown(self) -> None:
    method iter_parents (line 286) | def iter_parents(self) -> Iterator[Node]:
    method listchain (line 297) | def listchain(self) -> list[Node]:
    method add_marker (line 308) | def add_marker(self, marker: str | MarkDecorator, append: bool = True)...
    method iter_markers (line 330) | def iter_markers(self, name: str | None = None) -> Iterator[Mark]:
    method iter_markers_with_node (line 338) | def iter_markers_with_node(
    method get_closest_marker (line 352) | def get_closest_marker(self, name: str) -> Mark | None: ...
    method get_closest_marker (line 355) | def get_closest_marker(self, name: str, default: Mark) -> Mark: ...
    method get_closest_marker (line 357) | def get_closest_marker(self, name: str, default: Mark | None = None) -...
    method listextrakeywords (line 366) | def listextrakeywords(self) -> set[str]:
    method listnames (line 373) | def listnames(self) -> list[str]:
    method addfinalizer (line 376) | def addfinalizer(self, fin: Callable[[], object]) -> None:
    method getparent (line 385) | def getparent(self, cls: type[_NodeType]) -> _NodeType | None:
    method _traceback_filter (line 397) | def _traceback_filter(self, excinfo: ExceptionInfo[BaseException]) -> ...
    method _repr_failure_py (line 400) | def _repr_failure_py(
    method repr_failure (line 458) | def repr_failure(
  function get_fslocation_from_item (line 472) | def get_fslocation_from_item(node: Node) -> tuple[str | Path, int | None]:
  class Collector (line 491) | class Collector(Node, abc.ABC):
    class CollectError (line 498) | class CollectError(Exception):
    method collect (line 502) | def collect(self) -> Iterable[Item | Collector]:
    method repr_failure (line 507) | def repr_failure(  # type: ignore[override]
    method _traceback_filter (line 528) | def _traceback_filter(self, excinfo: ExceptionInfo[BaseException]) -> ...
  function _check_initialpaths_for_relpath (line 539) | def _check_initialpaths_for_relpath(
  class FSCollector (line 552) | class FSCollector(Collector, abc.ABC):
    method __init__ (line 555) | def __init__(
    method from_parent (line 610) | def from_parent(
  class File (line 622) | class File(FSCollector, abc.ABC):
  class Directory (line 629) | class Directory(FSCollector, abc.ABC):
  class Item (line 647) | class Item(Node, abc.ABC):
    method __init__ (line 655) | def __init__(
    method _check_item_and_collector_diamond_inheritance (line 684) | def _check_item_and_collector_diamond_inheritance(self) -> None:
    method runtest (line 714) | def runtest(self) -> None:
    method add_report_section (line 723) | def add_report_section(self, when: str, key: str, content: str) -> None:
    method reportinfo (line 740) | def reportinfo(self) -> tuple[os.PathLike[str] | str, int | None, str]:
    method location (line 754) | def location(self) -> tuple[str, int | None, str]:

FILE: src/_pytest/outcomes.py
  class OutcomeException (line 13) | class OutcomeException(BaseException):
    method __init__ (line 17) | def __init__(self, msg: str | None = None, pytrace: bool = True) -> None:
    method __repr__ (line 28) | def __repr__(self) -> str:
  class Skipped (line 39) | class Skipped(OutcomeException):
    method __init__ (line 44) | def __init__(
  class Failed (line 59) | class Failed(OutcomeException):
  class Exit (line 65) | class Exit(Exception):
    method __init__ (line 68) | def __init__(
  class XFailed (line 76) | class XFailed(Failed):
  class _Exit (line 80) | class _Exit:
    method __call__ (line 97) | def __call__(self, reason: str = "", returncode: int | None = None) ->...
  class _Skip (line 105) | class _Skip:
    method __call__ (line 136) | def __call__(self, reason: str = "", allow_module_level: bool = False)...
  class _Fail (line 144) | class _Fail:
    method __call__ (line 160) | def __call__(self, reason: str = "", pytrace: bool = True) -> NoReturn:
  class _XFail (line 168) | class _XFail:
    method __call__ (line 190) | def __call__(self, reason: str = "") -> NoReturn:
  function importorskip (line 198) | def importorskip(

FILE: src/_pytest/pastebin.py
  function pytest_addoption (line 21) | def pytest_addoption(parser: Parser) -> None:
  function pytest_configure (line 35) | def pytest_configure(config: Config) -> None:
  function pytest_unconfigure (line 55) | def pytest_unconfigure(config: Config) -> None:
  function create_new_paste (line 72) | def create_new_paste(contents: str | bytes) -> str:
  function pytest_terminal_summary (line 101) | def pytest_terminal_summary(terminalreporter: TerminalReporter) -> None:

FILE: src/_pytest/pathlib.py
  function _ignore_error (line 62) | def _ignore_error(exception: Exception) -> bool:
  function get_lock_path (line 69) | def get_lock_path(path: _AnyPurePath) -> _AnyPurePath:
  function on_rm_rf_error (line 73) | def on_rm_rf_error(
  function ensure_extended_length_path (line 132) | def ensure_extended_length_path(path: Path) -> Path:
  function get_extended_length_path_str (line 150) | def get_extended_length_path_str(path: str) -> str:
  function rm_rf (line 162) | def rm_rf(path: Path) -> None:
  function find_prefixed (line 173) | def find_prefixed(root: Path, prefix: str) -> Iterator[os.DirEntry[str]]:
  function extract_suffixes (line 181) | def extract_suffixes(iter: Iterable[os.DirEntry[str]], prefix: str) -> I...
  function find_suffixes (line 192) | def find_suffixes(root: Path, prefix: str) -> Iterator[str]:
  function parse_num (line 197) | def parse_num(maybe_num: str) -> int:
  function _force_symlink (line 205) | def _force_symlink(root: Path, target: str | PurePath, link_to: str | Pa...
  function make_numbered_dir (line 225) | def make_numbered_dir(root: Path, prefix: str, mode: int = 0o700) -> Path:
  function create_cleanup_lock (line 246) | def create_cleanup_lock(p: Path) -> Path:
  function register_cleanup_lock_removal (line 263) | def register_cleanup_lock_removal(
  function maybe_delete_a_numbered_dir (line 282) | def maybe_delete_a_numbered_dir(path: Path) -> None:
  function ensure_deletable (line 310) | def ensure_deletable(path: Path, consider_lock_dead_if_created_before: f...
  function try_cleanup (line 338) | def try_cleanup(path: Path, consider_lock_dead_if_created_before: float)...
  function cleanup_candidates (line 344) | def cleanup_candidates(root: Path, prefix: str, keep: int) -> Iterator[P...
  function cleanup_dead_symlinks (line 356) | def cleanup_dead_symlinks(root: Path) -> None:
  function cleanup_numbered_dir (line 363) | def cleanup_numbered_dir(
  function make_numbered_dir_with_cleanup (line 377) | def make_numbered_dir_with_cleanup(
  function resolve_from_str (line 410) | def resolve_from_str(input: str, rootpath: Path) -> Path:
  function fnmatch_ex (line 419) | def fnmatch_ex(pattern: str, path: str | os.PathLike[str]) -> bool:
  function parts (line 455) | def parts(s: str) -> set[str]:
  function symlink_or_skip (line 460) | def symlink_or_skip(
  class ImportMode (line 472) | class ImportMode(Enum):
  class ImportPathMismatchError (line 480) | class ImportPathMismatchError(ImportError):
  function import_path (line 489) | def import_path(
  function _import_module_using_spec (line 615) | def _import_module_using_spec(
  function spec_matches_module_path (line 738) | def spec_matches_module_path(module_spec: ModuleSpec | None, module_path...
  function _is_same (line 761) | def _is_same(f1: str, f2: str) -> bool:
  function _is_same (line 766) | def _is_same(f1: str, f2: str) -> bool:
  function module_name_from_path (line 770) | def module_name_from_path(path: Path, root: Path) -> str:
  function insert_missing_modules (line 801) | def insert_missing_modules(modules: dict[str, ModuleType], module_name: ...
  function resolve_package_path (line 839) | def resolve_package_path(path: Path) -> Path | None:
  function resolve_pkg_root_and_module_name (line 856) | def resolve_pkg_root_and_module_name(
  function is_importable (line 900) | def is_importable(module_name: str, module_path: Path) -> bool:
  function compute_module_name (line 926) | def compute_module_name(root: Path, module_path: Path) -> str | None:
  class CouldNotResolvePathError (line 946) | class CouldNotResolvePathError(Exception):
  function scandir (line 950) | def scandir(
  function visit (line 982) | def visit(
  function absolutepath (line 998) | def absolutepath(path: str | os.PathLike[str]) -> Path:
  function commonpath (line 1007) | def commonpath(path1: Path, path2: Path) -> Path | None:
  function bestrelpath (line 1019) | def bestrelpath(directory: Path, dest: Path) -> str:
  function safe_exists (line 1048) | def safe_exists(p: Path) -> bool:
  function samefile_nofollow (line 1058) | def samefile_nofollow(p1: Path, p2: Path) -> bool:

FILE: src/_pytest/pytester.py
  function pytest_addoption (line 83) | def pytest_addoption(parser: Parser) -> None:
  function pytest_configure (line 108) | def pytest_configure(config: Config) -> None:
  class LsofFdLeakChecker (line 121) | class LsofFdLeakChecker:
    method get_open_files (line 122) | def get_open_files(self) -> list[tuple[str, str]]:
    method matching_platform (line 159) | def matching_platform(self) -> bool:
    method pytest_runtest_protocol (line 168) | def pytest_runtest_protocol(self, item: Item) -> Generator[None, objec...
  function _pytest (line 198) | def _pytest(request: FixtureRequest) -> PytestArg:
  class PytestArg (line 205) | class PytestArg:
    method __init__ (line 206) | def __init__(self, request: FixtureRequest) -> None:
    method gethookrecorder (line 209) | def gethookrecorder(self, hook) -> HookRecorder:
  function get_public_names (line 215) | def get_public_names(values: Iterable[str]) -> list[str]:
  class RecordedHookCall (line 221) | class RecordedHookCall:
    method __init__ (line 234) | def __init__(self, name: str, kwargs) -> None:
    method __repr__ (line 238) | def __repr__(self) -> str:
    method __getattr__ (line 245) | def __getattr__(self, key: str): ...
  class HookRecorder (line 249) | class HookRecorder:
    method __init__ (line 258) | def __init__(
    method finish_recording (line 275) | def finish_recording(self) -> None:
    method getcalls (line 278) | def getcalls(self, names: str | Iterable[str]) -> list[RecordedHookCall]:
    method assert_contains (line 284) | def assert_contains(self, entries: Sequence[tuple[str, str]]) -> None:
    method popcall (line 306) | def popcall(self, name: str) -> RecordedHookCall:
    method getcall (line 316) | def getcall(self, name: str) -> RecordedHookCall:
    method getreports (line 324) | def getreports(
    method getreports (line 330) | def getreports(
    method getreports (line 336) | def getreports(
    method getreports (line 344) | def getreports(
    method matchreport (line 353) | def matchreport(
    method getfailures (line 384) | def getfailures(
    method getfailures (line 390) | def getfailures(
    method getfailures (line 396) | def getfailures(
    method getfailures (line 404) | def getfailures(
    method getfailedcollections (line 413) | def getfailedcollections(self) -> Sequence[CollectReport]:
    method listoutcomes (line 416) | def listoutcomes(
    method countoutcomes (line 440) | def countoutcomes(self) -> list[int]:
    method assertoutcome (line 443) | def assertoutcome(self, passed: int = 0, skipped: int = 0, failed: int...
    method clear (line 455) | def clear(self) -> None:
  function linecomp (line 460) | def linecomp() -> LineComp:
  function LineMatcher_fixture (line 467) | def LineMatcher_fixture(request: FixtureRequest) -> type[LineMatcher]:
  function pytester (line 477) | def pytester(
  function _sys_snapshot (line 494) | def _sys_snapshot() -> Generator[None]:
  function _config_for_test (line 503) | def _config_for_test() -> Generator[Config]:
  class RunResult (line 518) | class RunResult:
    method __init__ (line 521) | def __init__(
    method __repr__ (line 548) | def __repr__(self) -> str:
    method parseoutcomes (line 556) | def parseoutcomes(self) -> dict[str, int]:
    method parse_summary_nouns (line 569) | def parse_summary_nouns(cls, lines) -> dict[str, int]:
    method assert_outcomes (line 592) | def assert_outcomes(
  class SysModulesSnapshot (line 626) | class SysModulesSnapshot:
    method __init__ (line 627) | def __init__(self, preserve: Callable[[str], bool] | None = None) -> N...
    method restore (line 631) | def restore(self) -> None:
  class SysPathsSnapshot (line 640) | class SysPathsSnapshot:
    method __init__ (line 641) | def __init__(self) -> None:
    method restore (line 644) | def restore(self) -> None:
  class Pytester (line 649) | class Pytester:
    class TimeoutExpired (line 662) | class TimeoutExpired(Exception):
    method __init__ (line 665) | def __init__(
    method path (line 712) | def path(self) -> Path:
    method __repr__ (line 716) | def __repr__(self) -> str:
    method _finalize (line 719) | def _finalize(self) -> None:
    method __take_sys_modules_snapshot (line 730) | def __take_sys_modules_snapshot(self) -> SysModulesSnapshot:
    method make_hook_recorder (line 742) | def make_hook_recorder(self, pluginmanager: PytestPluginManager) -> Ho...
    method chdir (line 748) | def chdir(self) -> None:
    method _makefile (line 755) | def _makefile(
    method makefile (line 792) | def makefile(self, ext: str, *args: str, **kwargs: str) -> Path:
    method makeconftest (line 824) | def makeconftest(self, source: str) -> Path:
    method makeini (line 832) | def makeini(self, source: str) -> Path:
    method maketoml (line 840) | def maketoml(self, source: str) -> Path:
    method getinicfg (line 850) | def getinicfg(self, source: str) -> SectionWrapper:
    method makepyprojecttoml (line 855) | def makepyprojecttoml(self, source: str) -> Path:
    method makepyfile (line 865) | def makepyfile(self, *args, **kwargs) -> Path:
    method maketxtfile (line 885) | def maketxtfile(self, *args, **kwargs) -> Path:
    method syspathinsert (line 905) | def syspathinsert(self, path: str | os.PathLike[str] | None = None) ->...
    method mkdir (line 919) | def mkdir(self, name: str | os.PathLike[str]) -> Path:
    method mkpydir (line 932) | def mkpydir(self, name: str | os.PathLike[str]) -> Path:
    method copy_example (line 943) | def copy_example(self, name: str | None = None) -> Path:
    method getnode (line 989) | def getnode(self, config: Config, arg: str | os.PathLike[str]) -> Coll...
    method getpathnode (line 1008) | def getpathnode(self, path: str | os.PathLike[str]) -> Collector | Item:
    method genitems (line 1028) | def genitems(self, colitems: Sequence[Item | Collector]) -> list[Item]:
    method runitem (line 1045) | def runitem(self, source: str) -> Any:
    method inline_runsource (line 1060) | def inline_runsource(self, source: str, *cmdlineargs) -> HookRecorder:
    method inline_genitems (line 1074) | def inline_genitems(self, *args) -> tuple[list[Item], HookRecorder]:
    method inline_run (line 1085) | def inline_run(
    method runpytest_inprocess (line 1163) | def runpytest_inprocess(
    method runpytest (line 1207) | def runpytest(self, *args: str | os.PathLike[str], **kwargs: Any) -> R...
    method _ensure_basetemp (line 1217) | def _ensure_basetemp(
    method parseconfig (line 1230) | def parseconfig(self, *args: str | os.PathLike[str]) -> Config:
    method parseconfigure (line 1253) | def parseconfigure(self, *args: str | os.PathLike[str]) -> Config:
    method getitem (line 1264) | def getitem(
    method getitems (line 1286) | def getitems(self, source: str | os.PathLike[str]) -> list[Item]:
    method getmodulecol (line 1295) | def getmodulecol(
    method collect_by_name (line 1329) | def collect_by_name(self, modcol: Collector, name: str) -> Item | Coll...
    method popen (line 1345) | def popen(
    method run (line 1383) | def run(
    method _dump_lines (line 1469) | def _dump_lines(self, lines, fp):
    method _getpytestargs (line 1476) | def _getpytestargs(self) -> tuple[str, ...]:
    method runpython (line 1479) | def runpython(self, script: os.PathLike[str]) -> RunResult:
    method runpython_c (line 1483) | def runpython_c(self, command: str) -> RunResult:
    method runpytest_subprocess (line 1487) | def runpytest_subprocess(
    method spawn_pytest (line 1519) | def spawn_pytest(self, string: str, expect_timeout: float = 10.0) -> p...
    method spawn (line 1533) | def spawn(self, cmd: str, expect_timeout: float = 10.0) -> pexpect.spawn:
  class LineComp (line 1550) | class LineComp:
    method __init__ (line 1551) | def __init__(self) -> None:
    method assert_contains_lines (line 1555) | def assert_contains_lines(self, lines2: Sequence[str]) -> None:
  class LineMatcher (line 1568) | class LineMatcher:
    method __init__ (line 1578) | def __init__(self, lines: list[str]) -> None:
    method __str__ (line 1582) | def __str__(self) -> str:
    method _getlines (line 1590) | def _getlines(self, lines2: str | Sequence[str] | Source) -> Sequence[...
    method fnmatch_lines_random (line 1597) | def fnmatch_lines_random(self, lines2: Sequence[str]) -> None:
    method re_match_lines_random (line 1602) | def re_match_lines_random(self, lines2: Sequence[str]) -> None:
    method _match_lines_random (line 1607) | def _match_lines_random(
    method get_lines_after (line 1622) | def get_lines_after(self, fnline: str) -> Sequence[str]:
    method _log (line 1632) | def _log(self, *args) -> None:
    method _log_text (line 1636) | def _log_text(self) -> str:
    method fnmatch_lines (line 1639) | def fnmatch_lines(
    method re_match_lines (line 1654) | def re_match_lines(
    method _match_lines (line 1675) | def _match_lines(
    method no_fnmatch_line (line 1742) | def no_fnmatch_line(self, pat: str) -> None:
    method no_re_match_line (line 1750) | def no_re_match_line(self, pat: str) -> None:
    method _no_match_line (line 1760) | def _no_match_line(
    method _fail (line 1783) | def _fail(self, msg: str) -> None:
    method str (line 1789) | def str(self) -> str:

FILE: src/_pytest/pytester_assertions.py
  function assertoutcome (line 15) | def assertoutcome(
  function assert_outcomes (line 37) | def assert_outcomes(

FILE: src/_pytest/python.py
  function pytest_addoption (line 85) | def pytest_addoption(parser: Parser) -> None:
  function pytest_generate_tests (line 121) | def pytest_generate_tests(metafunc: Metafunc) -> None:
  function pytest_configure (line 126) | def pytest_configure(config: Config) -> None:
  function async_fail (line 146) | def async_fail(nodeid: str) -> None:
  function pytest_pyfunc_call (line 160) | def pytest_pyfunc_call(pyfuncitem: Function) -> object | None:
  function pytest_collect_directory (line 180) | def pytest_collect_directory(
  function pytest_collect_file (line 194) | def pytest_collect_file(file_path: Path, parent: nodes.Collector) -> Mod...
  function path_matches_patterns (line 209) | def path_matches_patterns(path: Path, patterns: Iterable[str]) -> bool:
  function pytest_pycollect_makemodule (line 214) | def pytest_pycollect_makemodule(module_path: Path, parent) -> Module:
  function pytest_pycollect_makeitem (line 219) | def pytest_pycollect_makeitem(
  class PyobjMixin (line 254) | class PyobjMixin(nodes.Node):
    method module (line 263) | def module(self):
    method cls (line 269) | def cls(self):
    method instance (line 275) | def instance(self):
    method obj (line 285) | def obj(self):
    method obj (line 300) | def obj(self, value):
    method _getobj (line 303) | def _getobj(self):
    method getmodpath (line 310) | def getmodpath(self, stopatmodule: bool = True, includemodule: bool = ...
    method reportinfo (line 325) | def reportinfo(self) -> tuple[os.PathLike[str] | str, int | None, str]:
  class _EmptyClass (line 336) | class _EmptyClass: pass  # noqa: E701
  class PyCollector (line 352) | class PyCollector(PyobjMixin, nodes.Collector, abc.ABC):
    method funcnamefilter (line 353) | def funcnamefilter(self, name: str) -> bool:
    method isnosetest (line 356) | def isnosetest(self, obj: object) -> bool:
    method classnamefilter (line 365) | def classnamefilter(self, name: str) -> bool:
    method istestfunction (line 368) | def istestfunction(self, obj: object, name: str) -> bool:
    method istestclass (line 377) | def istestclass(self, obj: object, name: str) -> bool:
    method _matches_prefix_or_glob_option (line 384) | def _matches_prefix_or_glob_option(self, option_name: str, name: str) ...
    method collect (line 399) | def collect(self) -> Iterable[nodes.Item | nodes.Collector]:
    method _genfunctions (line 450) | def _genfunctions(self, name: str, funcobj) -> Iterator[Function]:
  function importtestmodule (line 500) | def importtestmodule(
  class Module (line 556) | class Module(nodes.File, PyCollector):
    method _getobj (line 559) | def _getobj(self):
    method collect (line 562) | def collect(self) -> Iterable[nodes.Item | nodes.Collector]:
    method _register_setup_module_fixture (line 568) | def _register_setup_module_fixture(self) -> None:
    method _register_setup_function_fixture (line 602) | def _register_setup_function_fixture(self) -> None:
  class Package (line 639) | class Package(nodes.Directory):
    method __init__ (line 654) | def __init__(
    method setup (line 676) | def setup(self) -> None:
    method collect (line 694) | def collect(self) -> Iterable[nodes.Item | nodes.Collector]:
  function _call_with_optional_argument (line 722) | def _call_with_optional_argument(func, arg) -> None:
  function _get_first_non_fixture_func (line 734) | def _get_first_non_fixture_func(obj: object, names: Iterable[str]) -> ob...
  class Class (line 745) | class Class(PyCollector):
    method from_parent (line 749) | def from_parent(cls, parent, *, name, obj=None, **kw) -> Self:  # type...
    method newinstance (line 753) | def newinstance(self):
    method collect (line 756) | def collect(self) -> Iterable[nodes.Item | nodes.Collector]:
    method _register_setup_class_fixture (line 785) | def _register_setup_class_fixture(self) -> None:
    method _register_setup_method_fixture (line 816) | def _register_setup_method_fixture(self) -> None:
  function hasinit (line 851) | def hasinit(obj: object) -> bool:
  function hasnew (line 858) | def hasnew(obj: object) -> bool:
  class IdMaker (line 867) | class IdMaker:
    method make_unique_parameterset_ids (line 896) | def make_unique_parameterset_ids(self) -> list[str | _HiddenParam]:
    method _strict_parametrization_ids_enabled (line 963) | def _strict_parametrization_ids_enabled(self) -> bool:
    method _resolve_ids (line 971) | def _resolve_ids(self) -> Iterable[str | _HiddenParam]:
    method _idval (line 995) | def _idval(self, val: object, argname: str, idx: int) -> str:
    method _idval_from_function (line 1008) | def _idval_from_function(self, val: object, argname: str, idx: int) ->...
    method _idval_from_hook (line 1024) | def _idval_from_hook(self, val: object, argname: str) -> str | None:
    method _idval_from_value (line 1034) | def _idval_from_value(self, val: object) -> str | None:
    method _idval_from_value_required (line 1054) | def _idval_from_value_required(self, val: object, idx: int) -> str:
    method _idval_from_argname (line 1069) | def _idval_from_argname(argname: str, idx: int) -> str:
    method _complain_multiple_hidden_parameter_sets (line 1074) | def _complain_multiple_hidden_parameter_sets(self) -> NoReturn:
    method _make_error_prefix (line 1081) | def _make_error_prefix(self) -> str:
  class CallSpec2 (line 1090) | class CallSpec2:
    method setmulti (line 1111) | def setmulti(
    method getparam (line 1141) | def getparam(self, name: str) -> object:
    method id (line 1148) | def id(self) -> str:
  function get_direct_param_fixture_func (line 1152) | def get_direct_param_fixture_func(request: FixtureRequest) -> Any:
  class Metafunc (line 1161) | class Metafunc:
    method __init__ (line 1169) | def __init__(
    method parametrize (line 1206) | def parametrize(
    method _resolve_parameter_set_ids (line 1404) | def _resolve_parameter_set_ids(
    method _validate_ids (line 1445) | def _validate_ids(
    method _validate_if_using_arg_names (line 1469) | def _validate_if_using_arg_names(
    method _recompute_direct_params_indices (line 1499) | def _recompute_direct_params_indices(self) -> None:
  function _find_parametrized_scope (line 1506) | def _find_parametrized_scope(
  function _ascii_escaped_by_config (line 1538) | def _ascii_escaped_by_config(val: str | bytes, config: Config | None) ->...
  class Function (line 1551) | class Function(PyobjMixin, nodes.Item):
    method __init__ (line 1583) | def __init__(
    method from_parent (line 1636) | def from_parent(cls, parent, **kw) -> Self:
    method _initrequest (line 1640) | def _initrequest(self) -> None:
    method function (line 1645) | def function(self):
    method instance (line 1650) | def instance(self):
    method _getinstance (line 1661) | def _getinstance(self):
    method _getobj (line 1668) | def _getobj(self):
    method _pyfuncitem (line 1678) | def _pyfuncitem(self):
    method runtest (line 1682) | def runtest(self) -> None:
    method setup (line 1686) | def setup(self) -> None:
    method _traceback_filter (line 1689) | def _traceback_filter(self, excinfo: ExceptionInfo[BaseException]) -> ...
    method repr_failure (line 1719) | def repr_failure(  # type: ignore[override]
  class FunctionDefinition (line 1729) | class FunctionDefinition(Function):
    method runtest (line 1733) | def runtest(self) -> None:

FILE: src/_pytest/python_api.py
  function _compare_approx (line 21) | def _compare_approx(
  class ApproxBase (line 50) | class ApproxBase:
    method __init__ (line 58) | def __init__(self, expected, rel=None, abs=None, nan_ok: bool = False)...
    method __repr__ (line 66) | def __repr__(self) -> str:
    method _repr_compare (line 69) | def _repr_compare(self, other_side: Any) -> list[str]:
    method __eq__ (line 76) | def __eq__(self, actual) -> bool:
    method __bool__ (line 81) | def __bool__(self):
    method __ne__ (line 90) | def __ne__(self, actual) -> bool:
    method _approx_scalar (line 93) | def _approx_scalar(self, x) -> ApproxScalar:
    method _yield_comparisons (line 98) | def _yield_comparisons(self, actual):
    method _check_type (line 105) | def _check_type(self) -> None:
  function _recursive_sequence_map (line 114) | def _recursive_sequence_map(f, x):
  class ApproxNumpy (line 125) | class ApproxNumpy(ApproxBase):
    method __repr__ (line 128) | def __repr__(self) -> str:
    method _repr_compare (line 134) | def _repr_compare(self, other_side: ndarray | list[Any]) -> list[str]:
    method __eq__ (line 198) | def __eq__(self, actual) -> bool:
    method _yield_comparisons (line 214) | def _yield_comparisons(self, actual):
  class ApproxMapping (line 229) | class ApproxMapping(ApproxBase):
    method __repr__ (line 233) | def __repr__(self) -> str:
    method _repr_compare (line 236) | def _repr_compare(self, other_side: Mapping[object, float]) -> list[str]:
    method __eq__ (line 295) | def __eq__(self, actual) -> bool:
    method _yield_comparisons (line 304) | def _yield_comparisons(self, actual):
    method _check_type (line 308) | def _check_type(self) -> None:
  class ApproxSequenceLike (line 316) | class ApproxSequenceLike(ApproxBase):
    method __repr__ (line 319) | def __repr__(self) -> str:
    method _repr_compare (line 325) | def _repr_compare(self, other_side: Sequence[float]) -> list[str]:
    method __eq__ (line 370) | def __eq__(self, actual) -> bool:
    method _yield_comparisons (line 378) | def _yield_comparisons(self, actual):
    method _check_type (line 381) | def _check_type(self) -> None:
  class ApproxScalar (line 389) | class ApproxScalar(ApproxBase):
    method __repr__ (line 397) | def __repr__(self) -> str:
    method __eq__ (line 432) | def __eq__(self, actual) -> bool:
    method tolerance (line 488) | def tolerance(self):
  class ApproxDecimal (line 535) | class ApproxDecimal(ApproxScalar):
    method __repr__ (line 541) | def __repr__(self) -> str:
  function approx (line 561) | def approx(expected, rel=None, abs=None, nan_ok: bool = False) -> Approx...
  function _is_sequence_like (line 789) | def _is_sequence_like(expected: object) -> bool:
  function _is_numpy_array (line 797) | def _is_numpy_array(obj: object) -> bool:
  function _as_numpy_array (line 805) | def _as_numpy_array(obj: object) -> ndarray | None:

FILE: src/_pytest/raises.py
  function raises (line 74) | def raises(
  function raises (line 83) | def raises(
  function raises (line 92) | def raises(*, check: Callable[[BaseException], bool]) -> RaisesExc[BaseE...
  function raises (line 96) | def raises(
  function raises (line 104) | def raises(
  function _match_pattern (line 314) | def _match_pattern(match: Pattern[str]) -> str | Pattern[str]:
  function repr_callable (line 319) | def repr_callable(fun: Callable[[BaseExcT_1], bool]) -> str:
  function backquote (line 327) | def backquote(s: str) -> str:
  function _exception_type_name (line 331) | def _exception_type_name(
  function _check_raw_type (line 341) | def _check_raw_type(
  function is_fully_escaped (line 364) | def is_fully_escaped(s: str) -> bool:
  function unescape (line 372) | def unescape(s: str) -> str:
  class AbstractRaises (line 382) | class AbstractRaises(ABC, Generic[BaseExcT_co]):
    method __init__ (line 385) | def __init__(
    method _parse_exc (line 437) | def _parse_exc(
    method fail_reason (line 475) | def fail_reason(self) -> str | None:
    method _check_check (line 481) | def _check_check(
    method _check_match (line 496) | def _check_match(self, e: BaseException) -> bool:
    method matches (line 532) | def matches(
  class RaisesExc (line 541) | class RaisesExc(AbstractRaises[BaseExcT_co_default]):
    method __init__ (line 588) | def __init__(
    method __init__ (line 600) | def __init__(
    method __init__ (line 610) | def __init__(self, /, *, check: Callable[[BaseException], bool]) -> No...
    method __init__ (line 612) | def __init__(
    method matches (line 640) | def matches(
    method __repr__ (line 675) | def __repr__(self) -> str:
    method _check_type (line 688) | def _check_type(self, exception: BaseException) -> TypeGuard[BaseExcT_...
    method __enter__ (line 692) | def __enter__(self) -> ExceptionInfo[BaseExcT_co_default]:
    method __exit__ (line 697) | def __exit__(
  class RaisesGroup (line 732) | class RaisesGroup(AbstractRaises[BaseExceptionGroup[BaseExcT_co]]):
    method __init__ (line 847) | def __init__(
    method __init__ (line 858) | def __init__(
    method __init__ (line 874) | def __init__(
    method __init__ (line 884) | def __init__(
    method __init__ (line 894) | def __init__(
    method __init__ (line 907) | def __init__(
    method __init__ (line 917) | def __init__(
    method __init__ (line 929) | def __init__(
    method __init__ (line 948) | def __init__(
    method _parse_excgroup (line 1011) | def _parse_excgroup(
    method __enter__ (line 1048) | def __enter__(
    method __enter__ (line 1052) | def __enter__(
    method __enter__ (line 1056) | def __enter__(self) -> ExceptionInfo[BaseExceptionGroup[BaseException]]:
    method __repr__ (line 1062) | def __repr__(self) -> str:
    method _unroll_exceptions (line 1078) | def _unroll_exceptions(
    method matches (line 1093) | def matches(
    method matches (line 1098) | def matches(
    method matches (line 1103) | def matches(
    method _check_expected (line 1227) | def _check_expected(
    method _repr_expected (line 1246) | def _repr_expected(e: type[BaseException] | AbstractRaises[BaseExcepti...
    method _check_exceptions (line 1254) | def _check_exceptions(
    method _check_exceptions (line 1260) | def _check_exceptions(
    method _check_exceptions (line 1266) | def _check_exceptions(
    method __exit__ (line 1409) | def __exit__(
    method expected_type (line 1443) | def expected_type(self) -> str:
  class NotChecked (line 1459) | class NotChecked:
  class ResultHolder (line 1463) | class ResultHolder:
    method __init__ (line 1468) | def __init__(
    method set_result (line 1479) | def set_result(self, expected: int, actual: int, result: str | None) -...
    method get_result (line 1482) | def get_result(self, expected: int, actual: int) -> str | None:
    method has_result (line 1488) | def has_result(self, expected: int, actual: int) -> bool:
    method no_match_for_expected (line 1491) | def no_match_for_expected(self, expected: list[int]) -> bool:
    method no_match_for_actual (line 1499) | def no_match_for_actual(self, actual: list[int]) -> bool:
  function possible_match (line 1508) | def possible_match(results: ResultHolder, used: set[int] | None = None) ...

FILE: src/_pytest/recwarn.py
  function recwarn (line 34) | def recwarn() -> Generator[WarningsRecorder]:
  function deprecated_call (line 46) | def deprecated_call(
  function deprecated_call (line 52) | def deprecated_call(func: Callable[..., T], *args: Any, **kwargs: Any) -...
  function deprecated_call (line 55) | def deprecated_call(
  function warns (line 90) | def warns(
  function warns (line 98) | def warns(
  function warns (line 106) | def warns(
  class WarningsRecorder (line 170) | class WarningsRecorder(warnings.catch_warnings):
    method __init__ (line 183) | def __init__(self, *, _ispytest: bool = False) -> None:
    method list (line 190) | def list(self) -> list[warnings.WarningMessage]:
    method __getitem__ (line 194) | def __getitem__(self, i: int) -> warnings.WarningMessage:
    method __iter__ (line 198) | def __iter__(self) -> Iterator[warnings.WarningMessage]:
    method __len__ (line 202) | def __len__(self) -> int:
    method pop (line 206) | def pop(self, cls: type[Warning] = Warning) -> warnings.WarningMessage:
    method clear (line 225) | def clear(self) -> None:
    method __enter__ (line 231) | def __enter__(self) -> Self:  # type: ignore[override]
    method __exit__ (line 242) | def __exit__(
  class WarningsChecker (line 260) | class WarningsChecker(WarningsRecorder):
    method __init__ (line 261) | def __init__(
    method matches (line 287) | def matches(self, warning: warnings.WarningMessage) -> bool:
    method __exit__ (line 293) | def __exit__(

FILE: src/_pytest/reports.py
  function getworkerinfoline (line 49) | def getworkerinfoline(node):
  class BaseReport (line 61) | class BaseReport:
    method __init__ (line 71) | def __init__(self, **kw: Any) -> None:
    method __getattr__ (line 76) | def __getattr__(self, key: str) -> Any: ...
    method toterminal (line 78) | def toterminal(self, out: TerminalWriter) -> None:
    method get_sections (line 98) | def get_sections(self, prefix: str) -> Iterator[tuple[str, str]]:
    method longreprtext (line 104) | def longreprtext(self) -> str:
    method caplog (line 118) | def caplog(self) -> str:
    method capstdout (line 128) | def capstdout(self) -> str:
    method capstderr (line 138) | def capstderr(self) -> str:
    method passed (line 148) | def passed(self) -> bool:
    method failed (line 153) | def failed(self) -> bool:
    method skipped (line 158) | def skipped(self) -> bool:
    method fspath (line 163) | def fspath(self) -> str:
    method count_towards_summary (line 168) | def count_towards_summary(self) -> bool:
    method head_line (line 180) | def head_line(self) -> str | None:
    method _get_verbose_word_with_markup (line 200) | def _get_verbose_word_with_markup(
    method _to_json (line 221) | def _to_json(self) -> dict[str, Any]:
    method _from_json (line 232) | def _from_json(cls, reportdict: dict[str, object]) -> Self:
  function _report_unserialization_failure (line 245) | def _report_unserialization_failure(
  function _format_failed_longrepr (line 259) | def _format_failed_longrepr(
  function _format_exception_group_all_skipped_longrepr (line 272) | def _format_exception_group_all_skipped_longrepr(
  class TestReport (line 305) | class TestReport(BaseReport):
    method __init__ (line 318) | def __init__(
    method __repr__ (line 380) | def __repr__(self) -> str:
    method from_item_and_call (line 384) | def from_item_and_call(cls, item: Item, call: CallInfo[None]) -> TestR...
  class CollectReport (line 457) | class CollectReport(BaseReport):
    method __init__ (line 465) | def __init__(
    method location (line 499) | def location(  # type:ignore[override]
    method __repr__ (line 504) | def __repr__(self) -> str:
  class CollectErrorRepr (line 508) | class CollectErrorRepr(TerminalRepr):
    method __init__ (line 509) | def __init__(self, msg: str) -> None:
    method toterminal (line 512) | def toterminal(self, out: TerminalWriter) -> None:
  function pytest_report_to_serializable (line 516) | def pytest_report_to_serializable(
  function pytest_report_from_serializable (line 527) | def pytest_report_from_serializable(
  function _report_to_json (line 541) | def _report_to_json(report: BaseReport) -> dict[str, Any]:
  function _report_kwargs_from_json (line 614) | def _report_kwargs_from_json(reportdict: dict[str, Any]) -> dict[str, Any]:

FILE: src/_pytest/runner.py
  function pytest_addoption (line 51) | def pytest_addoption(parser: Parser) -> None:
  function pytest_terminal_summary (line 72) | def pytest_terminal_summary(terminalreporter: TerminalReporter) -> None:
  function pytest_sessionstart (line 107) | def pytest_sessionstart(session: Session) -> None:
  function pytest_sessionfinish (line 111) | def pytest_sessionfinish(session: Session) -> None:
  function pytest_runtest_protocol (line 115) | def pytest_runtest_protocol(item: Item, nextitem: Item | None) -> bool:
  function runtestprotocol (line 123) | def runtestprotocol(
  function show_test_item (line 151) | def show_test_item(item: Item) -> None:
  function pytest_runtest_setup (line 163) | def pytest_runtest_setup(item: Item) -> None:
  function pytest_runtest_call (line 168) | def pytest_runtest_call(item: Item) -> None:
  function pytest_runtest_teardown (line 192) | def pytest_runtest_teardown(item: Item, nextitem: Item | None) -> None:
  function _update_current_test_var (line 198) | def _update_current_test_var(
  function pytest_report_teststatus (line 215) | def pytest_report_teststatus(report: BaseReport) -> tuple[str, str, str]...
  function call_and_report (line 231) | def call_and_report(
  function get_reraise_exceptions (line 257) | def get_reraise_exceptions(config: Config) -> tuple[type[BaseException],...
  function check_interactive_exception (line 265) | def check_interactive_exception(call: CallInfo[object], report: BaseRepo...
  class CallInfo (line 288) | class CallInfo(Generic[TResult]):
    method __init__ (line 303) | def __init__(
    method result (line 323) | def result(self) -> TResult:
    method from_call (line 336) | def from_call(
    method __repr__ (line 373) | def __repr__(self) -> str:
  function pytest_runtest_makereport (line 379) | def pytest_runtest_makereport(item: Item, call: CallInfo[None]) -> TestR...
  function pytest_make_collect_report (line 383) | def pytest_make_collect_report(collector: Collector) -> CollectReport:
  class SetupState (line 434) | class SetupState:
    method __init__ (line 498) | def __init__(self) -> None:
    method is_node_active (line 510) | def is_node_active(self, node: Node) -> bool:
    method setup (line 515) | def setup(self, item: Item) -> None:
    method addfinalizer (line 536) | def addfinalizer(self, finalizer: Callable[[], object], node: Node) ->...
    method teardown_exact (line 546) | def teardown_exact(self, nextitem: Item | None) -> None:
  function collect_one_node (line 581) | def collect_one_node(collector: Collector) -> CollectReport:

FILE: src/_pytest/scope.py
  class Scope (line 22) | class Scope(Enum):
    method next_lower (line 42) | def next_lower(self) -> Scope:
    method next_higher (line 49) | def next_higher(self) -> Scope:
    method __lt__ (line 56) | def __lt__(self, other: Scope) -> bool:
    method from_user (line 62) | def from_user(

FILE: src/_pytest/setuponly.py
  function pytest_addoption (line 15) | def pytest_addoption(parser: Parser) -> None:
  function pytest_fixture_setup (line 32) | def pytest_fixture_setup(
  function pytest_fixture_post_finalizer (line 53) | def pytest_fixture_post_finalizer(
  function _show_fixture_action (line 64) | def _show_fixture_action(
  function pytest_cmdline_main (line 95) | def pytest_cmdline_main(config: Config) -> int | ExitCode | None:

FILE: src/_pytest/setupplan.py
  function pytest_addoption (line 11) | def pytest_addoption(parser: Parser) -> None:
  function pytest_fixture_setup (line 23) | def pytest_fixture_setup(
  function pytest_cmdline_main (line 35) | def pytest_cmdline_main(config: Config) -> int | ExitCode | None:

FILE: src/_pytest/skipping.py
  function pytest_addoption (line 29) | def pytest_addoption(parser: Parser) -> None:
  function pytest_configure (line 50) | def pytest_configure(config: Config) -> None:
  function evaluate_condition (line 89) | def evaluate_condition(item: Item, mark: Mark, condition: object) -> tup...
  class Skip (line 163) | class Skip:
  function evaluate_skip_marks (line 169) | def evaluate_skip_marks(item: Item) -> Skip | None:
  class Xfail (line 198) | class Xfail:
  function evaluate_xfail_marks (line 214) | def evaluate_xfail_marks(item: Item) -> Xfail | None:
  function pytest_runtest_setup (line 248) | def pytest_runtest_setup(item: Item) -> None:
  function pytest_runtest_call (line 259) | def pytest_runtest_call(item: Item) -> Generator[None]:
  function pytest_runtest_makereport (line 277) | def pytest_runtest_makereport(
  function pytest_report_teststatus (line 315) | def pytest_report_teststatus(report: BaseReport) -> tuple[str, str, str]...

FILE: src/_pytest/stash.py
  class StashKey (line 16) | class StashKey(Generic[T]):
  class Stash (line 29) | class Stash:
    method __init__ (line 72) | def __init__(self) -> None:
    method __setitem__ (line 75) | def __setitem__(self, key: StashKey[T], value: T) -> None:
    method __getitem__ (line 79) | def __getitem__(self, key: StashKey[T]) -> T:
    method get (line 86) | def get(self, key: StashKey[T], default: D) -> T | D:
    method setdefault (line 94) | def setdefault(self, key: StashKey[T], default: T) -> T:
    method __delitem__ (line 103) | def __delitem__(self, key: StashKey[T]) -> None:
    method __contains__ (line 110) | def __contains__(self, key: StashKey[T]) -> bool:
    method __len__ (line 114) | def __len__(self) -> int:

FILE: src/_pytest/stepwise.py
  function pytest_addoption (line 23) | def pytest_addoption(parser: Parser) -> None:
  function pytest_configure (line 53) | def pytest_configure(config: Config) -> None:
  function pytest_sessionfinish (line 61) | def pytest_sessionfinish(session: Session) -> None:
  class StepwiseCacheInfo (line 71) | class StepwiseCacheInfo:
    method last_cache_date (line 84) | def last_cache_date(self) -> datetime:
    method empty (line 88) | def empty(cls) -> Self:
    method update_date_to_now (line 95) | def update_date_to_now(self) -> None:
  class StepwisePlugin (line 99) | class StepwisePlugin:
    method __init__ (line 100) | def __init__(self, config: Config) -> None:
    method _load_cached_info (line 110) | def _load_cached_info(self) -> StepwiseCacheInfo:
    method pytest_sessionstart (line 126) | def pytest_sessionstart(self, session: Session) -> None:
    method pytest_collection_modifyitems (line 129) | def pytest_collection_modifyitems(
    method pytest_runtest_logreport (line 174) | def pytest_runtest_logreport(self, report: TestReport) -> None:
    method pytest_report_collectionfinish (line 198) | def pytest_report_collectionfinish(self) -> list[str] | None:
    method pytest_sessionfinish (line 203) | def pytest_sessionfinish(self) -> None:

FILE: src/_pytest/subtests.py
  function pytest_addoption (line 46) | def pytest_addoption(parser: Parser) -> None:
  class SubtestContext (line 58) | class SubtestContext:
    method __post_init__ (line 64) | def __post_init__(self) -> None:
    method _to_json (line 70) | def _to_json(self) -> dict[str, Any]:
    method _from_json (line 75) | def _from_json(cls, d: dict[str, Any]) -> Self:
  class SubtestReport (line 80) | class SubtestReport(TestReport):
    method head_line (line 84) | def head_line(self) -> str:
    method _sub_test_description (line 88) | def _sub_test_description(self) -> str:
    method _to_json (line 99) | def _to_json(self) -> dict[str, Any]:
    method _from_json (line 107) | def _from_json(cls, reportdict: dict[str, Any]) -> SubtestReport:
    method _new (line 113) | def _new(
  function subtests (line 136) | def subtests(request: SubRequest) -> Subtests:
  class Subtests (line 145) | class Subtests:
    method __init__ (line 148) | def __init__(
    method test (line 161) | def test(
  class _SubTestContextManager (line 197) | class _SubTestContextManager:
    method __enter__ (line 215) | def __enter__(self) -> None:
    method __exit__ (line 230) | def __exit__(
  function capturing_output (line 288) | def capturing_output(request: SubRequest) -> Iterator[Captured]:
  function capturing_logs (line 317) | def capturing_logs(
  class Captured (line 335) | class Captured:
  class CapturedLogs (line 341) | class CapturedLogs:
  function pytest_report_to_serializable (line 345) | def pytest_report_to_serializable(report: TestReport) -> dict[str, Any] ...
  function pytest_report_from_serializable (line 351) | def pytest_report_from_serializable(data: dict[str, Any]) -> SubtestRepo...
  function pytest_configure (line 362) | def pytest_configure(config: Config) -> None:
  function pytest_report_teststatus (line 367) | def pytest_report_teststatus(

FILE: src/_pytest/terminal.py
  class MoreQuietAction (line 80) | class MoreQuietAction(argparse.Action):
    method __init__ (line 87) | def __init__(
    method __call__ (line 104) | def __call__(
  class TestShortLogReport (line 117) | class TestShortLogReport(NamedTuple):
  function pytest_addoption (line 137) | def pytest_addoption(parser: Parser) -> None:
  function pytest_configure (line 291) | def pytest_configure(config: Config) -> None:
  function getreportopt (line 308) | def getreportopt(config: Config) -> str:
  function pytest_report_teststatus (line 334) | def pytest_report_teststatus(report: BaseReport) -> tuple[str, str, str]:
  class WarningReport (line 350) | class WarningReport:
    method get_location (line 367) | def get_location(self, config: Config) -> str | None:
  class TerminalReporter (line 379) | class TerminalReporter:
    method __init__ (line 380) | def __init__(self, config: Config, file: TextIO | None = None) -> None:
    method _determine_show_progress_info (line 410) | def _determine_show_progress_info(
    method verbosity (line 436) | def verbosity(self) -> int:
    method showheader (line 441) | def showheader(self) -> bool:
    method no_header (line 445) | def no_header(self) -> bool:
    method no_summary (line 449) | def no_summary(self) -> bool:
    method showfspath (line 453) | def showfspath(self) -> bool:
    method showfspath (line 459) | def showfspath(self, value: bool | None) -> None:
    method showlongtestinfo (line 463) | def showlongtestinfo(self) -> bool:
    method reported_progress (line 467) | def reported_progress(self) -> int:
    method hasopt (line 474) | def hasopt(self, char: str) -> bool:
    method write_fspath_result (line 478) | def write_fspath_result(self, nodeid: str, res: str, **markup: bool) -...
    method write_ensure_prefix (line 489) | def write_ensure_prefix(self, prefix: str, extra: str = "", **kwargs) ...
    method ensure_newline (line 498) | def ensure_newline(self) -> None:
    method wrap_write (line 503) | def wrap_write(
    method write (line 525) | def write(self, content: str, *, flush: bool = False, **markup: bool) ...
    method write_raw (line 528) | def write_raw(self, content: str, *, flush: bool = False) -> None:
    method flush (line 531) | def flush(self) -> None:
    method write_line (line 534) | def write_line(self, line: str | bytes, **markup: bool) -> None:
    method rewrite (line 540) | def rewrite(self, line: str, **markup: bool) -> None:
    method write_sep (line 558) | def write_sep(
    method section (line 568) | def section(self, title: str, sep: str = "=", **kw: bool) -> None:
    method line (line 571) | def line(self, msg: str, **kw: bool) -> None:
    method _add_stats (line 574) | def _add_stats(self, category: str, items: Sequence[Any]) -> None:
    method pytest_internalerror (line 580) | def pytest_internalerror(self, excrepr: ExceptionRepr) -> bool:
    method pytest_warning_recorded (line 585) | def pytest_warning_recorded(
    method pytest_plugin_registered (line 600) | def pytest_plugin_registered(self, plugin: _PluggyPlugin) -> None:
    method pytest_deselected (line 608) | def pytest_deselected(self, items: Sequence[Item]) -> None:
    method pytest_runtest_logstart (line 611) | def pytest_runtest_logstart(
    method pytest_runtest_logreport (line 625) | def pytest_runtest_logreport(self, report: TestReport) -> None:
    method _is_last_item (line 702) | def _is_last_item(self) -> bool:
    method pytest_runtestloop (line 707) | def pytest_runtestloop(self) -> Generator[None, object, object]:
    method _get_progress_information_message (line 720) | def _get_progress_information_message(self) -> str:
    method _write_progress_information_if_past_edge (line 765) | def _write_progress_information_if_past_edge(self) -> None:
    method _write_progress_information_filling_space (line 781) | def _write_progress_information_filling_space(self) -> None:
    method _width_of_current_line (line 789) | def _width_of_current_line(self) -> int:
    method pytest_collection (line 793) | def pytest_collection(self) -> None:
    method pytest_collectreport (line 800) | def pytest_collectreport(self, report: CollectReport) -> None:
    method report_collect (line 810) | def report_collect(self, final: bool = False) -> None:
    method pytest_sessionstart (line 847) | def pytest_sessionstart(self, session: Session) -> None:
    method _write_report_lines_from_hooks (line 873) | def _write_report_lines_from_hooks(
    method pytest_report_header (line 883) | def pytest_report_header(self, config: Config) -> list[str]:
    method pytest_collection_finish (line 905) | def pytest_collection_finish(self, session: Session) -> None:
    method _printcollecteditems (line 927) | def _printcollecteditems(self, items: Sequence[Item]) -> None:
    method pytest_sessionfinish (line 958) | def pytest_sessionfinish(
    method pytest_terminal_summary (line 985) | def pytest_terminal_summary(self) -> Generator[None]:
    method pytest_keyboard_interrupt (line 999) | def pytest_keyboard_interrupt(self, excinfo: ExceptionInfo[BaseExcepti...
    method pytest_unconfigure (line 1002) | def pytest_unconfigure(self) -> None:
    method _report_keyboardinterrupt (line 1006) | def _report_keyboardinterrupt(self) -> None:
    method _locationline (line 1022) | def _locationline(
    method _getfailureheadline (line 1043) | def _getfailureheadline(self, rep):
    method _getcrashline (line 1049) | def _getcrashline(self, rep):
    method getreports (line 1061) | def getreports(self, name: str):
    method summary_warnings (line 1064) | def summary_warnings(self) -> None:
    method summary_passes (line 1118) | def summary_passes(self) -> None:
    method summary_xpasses (line 1121) | def summary_xpasses(self) -> None:
    method summary_passes_combined (line 1124) | def summary_passes_combined(
    method _get_teardown_reports (line 1140) | def _get_teardown_reports(self, nodeid: str) -> list[TestReport]:
    method _handle_teardown_sections (line 1148) | def _handle_teardown_sections(self, nodeid: str) -> None:
    method print_teardown_sections (line 1152) | def print_teardown_sections(self, rep: TestReport) -> None:
    method summary_failures (line 1165) | def summary_failures(self) -> None:
    method summary_xfailures (line 1169) | def summary_xfailures(self) -> None:
    method summary_failures_combined (line 1174) | def summary_failures_combined(
    method summary_errors (line 1200) | def summary_errors(self) -> None:
    method _outrep_summary (line 1215) | def _outrep_summary(self, rep: BaseReport) -> None:
    method summary_stats (line 1228) | def summary_stats(self) -> None:
    method short_test_summary (line 1265) | def short_test_summary(self) -> None:
    method _get_main_color (line 1373) | def _get_main_color(self) -> tuple[str, list[str]]:
    method _determine_main_color (line 1380) | def _determine_main_color(self, unknown_type_seen: bool) -> str:
    method _set_main_color (line 1392) | def _set_main_color(self) -> None:
    method build_summary_stats_line (line 1401) | def build_summary_stats_line(self) -> tuple[list[tuple[str, dict[str, ...
    method _get_reports_to_display (line 1426) | def _get_reports_to_display(self, key: str) -> list[Any]:
    method _build_normal_summary_stats_line (line 1431) | def _build_normal_summary_stats_line(
    method _build_collect_only_summary_stats_line (line 1450) | def _build_collect_only_summary_stats_line(
  function _get_node_id_with_markup (line 1483) | def _get_node_id_with_markup(tw: TerminalWriter, config: Config, rep: Ba...
  function _format_trimmed (line 1493) | def _format_trimmed(format: str, msg: str, available_width: int) -> str ...
  function _get_line_with_reprcrash_message (line 1518) | def _get_line_with_reprcrash_message(
  function _folded_skips (line 1554) | def _folded_skips(
  function pluralize (line 1596) | def pluralize(count: int, noun: str) -> tuple[int, str]:
  function _plugin_nameversions (line 1609) | def _plugin_nameversions(plugininfo) -> list[str]:
  function format_session_duration (line 1623) | def format_session_duration(seconds: float) -> str:
  function format_node_duration (line 1632) | def format_node_duration(seconds: float) -> str:
  function _get_raw_skip_reason (line 1655) | def _get_raw_skip_reason(report: TestReport) -> str:
  class TerminalProgressPlugin (line 1676) | class TerminalProgressPlugin:
    method __init__ (line 1687) | def __init__(self, tr: TerminalReporter) -> None:
    method _emit_progress (line 1692) | def _emit_progress(
    method pytest_sessionstart (line 1731) | def pytest_sessionstart(self, session: Session) -> None:
    method pytest_collection_finish (line 1737) | def pytest_collection_finish(self) -> None:
    method pytest_runtest_logreport (line 1744) | def pytest_runtest_logreport(self, report: TestReport) -> None:
    method pytest_sessionfinish (line 1761) | def pytest_sessionfinish(self) -> None:

FILE: src/_pytest/terminalprogress.py
  function pytest_configure (line 23) | def pytest_configure(config: Config) -> None:

FILE: src/_pytest/threadexception.py
  class ThreadExceptionMeta (line 27) | class ThreadExceptionMeta(NamedTuple):
  function collect_thread_exception (line 38) | def collect_thread_exception(config: Config) -> None:
  function cleanup (line 77) | def cleanup(
  function thread_exception_hook (line 92) | def thread_exception_hook(
  function pytest_configure (line 132) | def pytest_configure(config: Config) -> None:
  function pytest_runtest_setup (line 141) | def pytest_runtest_setup(item: Item) -> None:
  function pytest_runtest_call (line 146) | def pytest_runtest_call(item: Item) -> None:
  function pytest_runtest_teardown (line 151) | def pytest_runtest_teardown(item: Item) -> None:

FILE: src/_pytest/timing.py
  class Instant (line 25) | class Instant:
    method elapsed (line 43) | def elapsed(self) -> Duration:
    method as_utc (line 47) | def as_utc(self) -> datetime:
  class Duration (line 53) | class Duration:
    method seconds (line 60) | def seconds(self) -> float:
  class MockTiming (line 66) | class MockTiming:
    method sleep (line 80) | def sleep(self, seconds: float) -> None:
    method time (line 83) | def time(self) -> float:
    method patch (line 86) | def patch(self, monkeypatch: MonkeyPatch) -> None:

FILE: src/_pytest/tmpdir.py
  class TempPathFactory (line 42) | class TempPathFactory:
    method __init__ (line 54) | def __init__(
    method from_config (line 78) | def from_config(
    method _ensure_relative_to_basetemp (line 109) | def _ensure_relative_to_basetemp(self, basename: str) -> str:
    method mktemp (line 115) | def mktemp(self, basename: str, numbered: bool = True) -> Path:
    method getbasetemp (line 139) | def getbasetemp(self) -> Path:
  function get_user (line 199) | def get_user() -> str | None:
  function pytest_configure (line 211) | def pytest_configure(config: Config) -> None:
  function pytest_addoption (line 224) | def pytest_addoption(parser: Parser) -> None:
  function tmp_path_factory (line 243) | def tmp_path_factory(request: FixtureRequest) -> TempPathFactory:
  function _mk_tmp (line 249) | def _mk_tmp(request: FixtureRequest, factory: TempPathFactory) -> Path:
  function tmp_path (line 258) | def tmp_path(
  function pytest_sessionfinish (line 282) | def pytest_sessionfinish(session, exitstatus: int | ExitCode):
  function pytest_runtest_makereport (line 308) | def pytest_runtest_makereport(

FILE: src/_pytest/tracemalloc.py
  function tracemalloc_message (line 4) | def tracemalloc_message(source: object) -> str:

FILE: src/_pytest/unittest.py
  function pytest_pycollect_makeitem (line 58) | def pytest_pycollect_makeitem(
  class UnitTestCase (line 78) | class UnitTestCase(Class):
    method newinstance (line 83) | def newinstance(self):
    method collect (line 91) | def collect(self) -> Iterable[Item | Collector]:
    method _register_unittest_setup_class_fixture (line 122) | def _register_unittest_setup_class_fixture(self, cls: type) -> None:
    method _register_unittest_setup_method_fixture (line 178) | def _register_unittest_setup_method_fixture(self, cls: type) -> None:
  class TestCaseFunction (line 209) | class TestCaseFunction(Function):
    method _getinstance (line 214) | def _getinstance(self):
    method _testcase (line 221) | def _testcase(self):
    method setup (line 224) | def setup(self) -> None:
    method teardown (line 233) | def teardown(self) -> None:
    method startTest (line 241) | def startTest(self, testcase: unittest.TestCase) -> None:
    method _addexcinfo (line 244) | def _addexcinfo(self, rawexcinfo: _SysExcInfoType) -> None:
    method addError (line 278) | def addError(
    method addFailure (line 288) | def addFailure(
    method addSkip (line 293) | def addSkip(
    method addExpectedFailure (line 326) | def addExpectedFailure(
    method addUnexpectedSuccess (line 337) | def addUnexpectedSuccess(
    method addSuccess (line 351) | def addSuccess(self, testcase: unittest.TestCase) -> None:
    method stopTest (line 354) | def stopTest(self, testcase: unittest.TestCase) -> None:
    method addDuration (line 357) | def addDuration(self, testcase: unittest.TestCase, elapsed: float) -> ...
    method runtest (line 360) | def runtest(self) -> None:
    method _traceback_filter (line 393) | def _traceback_filter(
    method addSubTest (line 404) | def addSubTest(
    method _obtain_errors_and_skips (line 462) | def _obtain_errors_and_skips(self) -> tuple[list[Any], list[Any]]:
  function pytest_runtest_makereport (line 488) | def pytest_runtest_makereport(item: Item, call: CallInfo[None]) -> None:
  function _is_skipped (line 506) | def _is_skipped(obj) -> bool:
  function pytest_configure (line 511) | def pytest_configure() -> None:
  class TwistedVersion (line 520) | class TwistedVersion(Enum):
  function _get_twisted_version (line 535) | def _get_twisted_version() -> TwistedVersion:
  function pytest_runtest_protocol (line 561) | def pytest_runtest_protocol(item: Item) -> Iterator[None]:
  function _handle_twisted_exc_info (line 594) | def _handle_twisted_exc_info(

FILE: src/_pytest/unraisableexception.py
  function gc_collect_harder (line 31) | def gc_collect_harder(iterations: int) -> None:
  class UnraisableMeta (line 36) | class UnraisableMeta(NamedTuple):
  function collect_unraisable (line 47) | def collect_unraisable(config: Config) -> None:
  function cleanup (line 86) | def cleanup(
  function unraisable_hook (line 102) | def unraisable_hook(
  function pytest_configure (line 143) | def pytest_configure(config: Config) -> None:
  function pytest_runtest_setup (line 152) | def pytest_runtest_setup(item: Item) -> None:
  function pytest_runtest_call (line 157) | def pytest_runtest_call(item: Item) -> None:
  function pytest_runtest_teardown (line 162) | def pytest_runtest_teardown(item: Item) -> None:

FILE: src/_pytest/warning_types.py
  class PytestWarning (line 13) | class PytestWarning(UserWarning):
  class PytestAssertRewriteWarning (line 20) | class PytestAssertRewriteWarning(PytestWarning):
  class PytestCacheWarning (line 27) | class PytestCacheWarning(PytestWarning):
  class PytestConfigWarning (line 34) | class PytestConfigWarning(PytestWarning):
  class PytestCollectionWarning (line 41) | class PytestCollectionWarning(PytestWarning):
  class PytestDeprecationWarning (line 47) | class PytestDeprecationWarning(PytestWarning, DeprecationWarning):
  class PytestRemovedIn9Warning (line 53) | class PytestRemovedIn9Warning(PytestDeprecationWarning):
  class PytestRemovedIn10Warning (line 59) | class PytestRemovedIn10Warning(PytestDeprecationWarning):
  class PytestExperimentalApiWarning (line 66) | class PytestExperimentalApiWarning(PytestWarning, FutureWarning):
    method simple (line 76) | def simple(cls, apiname: str) -> PytestExperimentalApiWarning:
  class PytestReturnNotNoneWarning (line 81) | class PytestReturnNotNoneWarning(PytestWarning):
  class PytestUnknownMarkWarning (line 92) | class PytestUnknownMarkWarning(PytestWarning):
  class PytestUnraisableExceptionWarning (line 102) | class PytestUnraisableExceptionWarning(PytestWarning):
  class PytestUnhandledThreadExceptionWarning (line 114) | class PytestUnhandledThreadExceptionWarning(PytestWarning):
  class UnformattedWarning (line 128) | class UnformattedWarning(Generic[_W]):
    method format (line 138) | def format(self, **kwargs: Any) -> _W:
  class PytestFDWarning (line 144) | class PytestFDWarning(PytestWarning):
  function warn_explicit_for (line 150) | def warn_explicit_for(method: FunctionType, message: PytestWarning) -> N...

FILE: src/_pytest/warnings.py
  function catch_warnings_for_item (line 22) | def catch_warnings_for_item(
  function warning_record_to_str (line 73) | def warning_record_to_str(warning_message: warnings.WarningMessage) -> str:
  function pytest_runtest_protocol (line 85) | def pytest_runtest_protocol(item: Item) -> Generator[None, object, object]:
  function pytest_collection (line 93) | def pytest_collection(session: Session) -> Generator[None, object, object]:
  function pytest_terminal_summary (line 102) | def pytest_terminal_summary(
  function pytest_sessionfinish (line 113) | def pytest_sessionfinish(session: Session) -> Generator[None]:
  function pytest_load_initial_conftests (line 122) | def pytest_load_initial_conftests(
  function pytest_configure (line 131) | def pytest_configure(config: Config) -> None:

FILE: testing/_py/test_local.py
  function ignore_encoding_warning (line 20) | def ignore_encoding_warning():
  class CommonFSTests (line 26) | class CommonFSTests:
    method test_constructor_equality (line 27) | def test_constructor_equality(self, path1):
    method test_eq_nonstring (line 31) | def test_eq_nonstring(self, path1):
    method test_new_identical (line 36) | def test_new_identical(self, path1):
    method test_join (line 39) | def test_join(self, path1):
    method test_join_normalized (line 45) | def test_join_normalized(self, path1):
    method test_join_noargs (line 55) | def test_join_noargs(self, path1):
    method test_add_something (line 59) | def test_add_something(self, path1):
    method test_parts (line 67) | def test_parts(self, path1):
    method test_common (line 75) | def test_common(self, path1):
    method test_basename_checks (line 85) | def test_basename_checks(self, path1):
    method test_basename (line 91) | def test_basename(self, path1):
    method test_dirname (line 96) | def test_dirname(self, path1):
    method test_dirpath (line 100) | def test_dirpath(self, path1):
    method test_dirpath_with_args (line 104) | def test_dirpath_with_args(self, path1):
    method test_newbasename (line 108) | def test_newbasename(self, path1):
    method test_not_exists (line 114) | def test_not_exists(self, path1):
    method test_exists (line 118) | def test_exists(self, path1):
    method test_dir (line 125) | def test_dir(self, path1):
    method test_fnmatch_file (line 134) | def test_fnmatch_file(self, path1):
    method test_relto (line 146) | def test_relto(self, path1):
    method test_bestrelpath (line 153) | def test_bestrelpath(self, path1):
    method test_relto_not_relative (line 167) | def test_relto_not_relative(self, path1):
    method test_listdir (line 173) | def test_listdir(self, path1):
    method test_listdir_fnmatchstring (line 180) | def test_listdir_fnmatchstring(self, path1):
    method test_listdir_filter (line 185) | def test_listdir_filter(self, path1):
    method test_listdir_sorted (line 190) | def test_listdir_sorted(self, path1):
    method test_visit_nofilter (line 196) | def test_visit_nofilter(self, path1):
    method test_visit_norecurse (line 203) | def test_visit_norecurse(self, path1):
    method test_visit_filterfunc_is_string (line 210) | def test_visit_filterfunc_is_string(self, path1):
    method test_visit_ignore (line 218) | def test_visit_ignore(self, path1):
    method test_visit_endswith (line 222) | def test_visit_endswith(self, path1):
    method test_cmp (line 229) | def test_cmp(self, path1):
    method test_simple_read (line 235) | def test_simple_read(self, path1):
    method test_join_div_operator (line 240) | def test_join_div_operator(self, path1):
    method test_ext (line 245) | def test_ext(self, path1):
    method test_purebasename (line 251) | def test_purebasename(self, path1):
    method test_multiple_parts (line 255) | def test_multiple_parts(self, path1):
    method test_dotted_name_ext (line 265) | def test_dotted_name_ext(self, path1):
    method test_newext (line 271) | def test_newext(self, path1):
    method test_readlines (line 277) | def test_readlines(self, path1):
    method test_readlines_nocr (line 283) | def test_readlines_nocr(self, path1):
    method test_file (line 289) | def test_file(self, path1):
    method test_not_file (line 292) | def test_not_file(self, path1):
    method test_non_existent (line 296) | def test_non_existent(self, path1):
    method test_size (line 308) | def test_size(self, path1):
    method test_mtime (line 312) | def test_mtime(self, path1):
    method test_relto_wrong_type (line 316) | def test_relto_wrong_type(self, path1):
    method test_load (line 320) | def test_load(self, path1):
    method test_visit_filesonly (line 326) | def test_visit_filesonly(self, path1):
    method test_visit_nodotfiles (line 333) | def test_visit_nodotfiles(self, path1):
    method test_visit_breadthfirst (line 341) | def test_visit_breadthfirst(self, path1):
    method test_visit_sort (line 353) | def test_visit_sort(self, path1):
    method test_endswith (line 363) | def test_endswith(self, path1):
    method test_copy_file (line 371) | def test_copy_file(self, path1):
    method test_copy_dir (line 385) | def test_copy_dir(self, path1):
    method test_remove_file (line 399) | def test_remove_file(self, path1):
    method test_remove_dir_recursive_by_default (line 405) | def test_remove_dir_recursive_by_default(self, path1):
    method test_ensure_dir (line 412) | def test_ensure_dir(self, path1):
    method test_mkdir_and_remove (line 417) | def test_mkdir_and_remove(self, path1):
    method test_move_file (line 431) | def test_move_file(self, path1):
    method test_move_dir (line 446) | def test_move_dir(self, path1):
    method test_fspath_protocol_match_strpath (line 454) | def test_fspath_protocol_match_strpath(self, path1):
    method test_fspath_func_match_strpath (line 457) | def test_fspath_func_match_strpath(self, path1):
    method test_fspath_open (line 462) | def test_fspath_open(self, path1):
    method test_fspath_fsencode (line 467) | def test_fspath_fsencode(self, path1):
  function setuptestfs (line 473) | def setuptestfs(path):
  function path1 (line 528) | def path1(tmpdir_factory):
  function fake_fspath_obj (line 536) | def fake_fspath_obj(request):
  function batch_make_numbered_dirs (line 547) | def batch_make_numbered_dirs(rootdir, repeats):
  class TestLocalPath (line 560) | class TestLocalPath(CommonFSTests):
    method test_join_normpath (line 561) | def test_join_normpath(self, tmpdir):
    method test_dirpath_abs_no_abs (line 569) | def test_dirpath_abs_no_abs(self, tmpdir):
    method test_gethash (line 574) | def test_gethash(self, tmpdir):
    method test_remove_removes_readonly_file (line 586) | def test_remove_removes_readonly_file(self, tmpdir):
    method test_remove_removes_readonly_dir (line 592) | def test_remove_removes_readonly_dir(self, tmpdir):
    method test_remove_removes_dir_and_readonly_file (line 598) | def test_remove_removes_dir_and_readonly_file(self, tmpdir):
    method test_remove_routes_ignore_errors (line 605) | def test_remove_routes_ignore_errors(self, tmpdir, monkeypatch):
    method test_initialize_curdir (line 615) | def test_initialize_curdir(self):
    method test_chdir_gone (line 619) | def test_chdir_gone(self, path1):
    method test_chdir_gone_in_as_cwd (line 632) | def test_chdir_gone_in_as_cwd(self, path1):
    method test_as_cwd (line 640) | def test_as_cwd(self, path1):
    method test_as_cwd_exception (line 648) | def test_as_cwd_exception(self, path1):
    method test_initialize_reldir (line 656) | def test_initialize_reldir(self, path1):
    method test_tilde_expansion (line 661) | def test_tilde_expansion(self, monkeypatch, tmpdir):
    method test_eq_hash_are_case_insensitive_on_windows (line 669) | def test_eq_hash_are_case_insensitive_on_windows(self):
    method test_eq_with_strings (line 677) | def test_eq_with_strings(self, path1):
    method test_eq_with_none (line 686) | def test_eq_with_none(self, path1):
    method test_eq_non_ascii_unicode (line 689) | def test_eq_non_ascii_unicode(self, path1):
    method test_gt_with_strings (line 698) | def test_gt_with_strings(self, path1):
    method test_open_and_ensure (line 709) | def test_open_and_ensure(self, path1):
    method test_write_and_ensure (line 715) | def test_write_and_ensure(self, path1):
    method test_dump (line 721) | def test_dump(self, tmpdir, bin):
    method test_setmtime (line 734) | def test_setmtime(self):
    method test_normpath (line 751) | def test_normpath(self, path1):
    method test_mkdtemp_creation (line 756) | def test_mkdtemp_creation(self):
    method test_tmproot (line 763) | def test_tmproot(self):
    method test_chdir (line 772) | def test_chdir(self, tmpdir):
    method test_ensure_filepath_withdir (line 781) | def test_ensure_filepath_withdir(self, tmpdir):
    method test_ensure_filepath_withoutdir (line 790) | def test_ensure_filepath_withoutdir(self, tmpdir):
    method test_ensure_dirpath (line 796) | def test_ensure_dirpath(self, tmpdir):
    method test_ensure_non_ascii_unicode (line 802) | def test_ensure_non_ascii_unicode(self, tmpdir):
    method test_long_filenames (line 809) | def test_long_filenames(self, tmpdir):
    method test_visit_depth_first (line 825) | def test_visit_depth_first(self, tmpdir):
    method test_visit_rec_fnmatch (line 834) | def test_visit_rec_fnmatch(self, tmpdir):
    method test_fnmatch_file_abspath (line 842) | def test_fnmatch_file_abspath(self, tmpdir):
    method test_sysfind (line 848) | def test_sysfind(self):
    method test_fspath_protocol_other_class (line 857) | def test_fspath_protocol_other_class(self, fake_fspath_obj):
    method test_make_numbered_dir_multiprocess_safe (line 869) | def test_make_numbered_dir_multiprocess_safe(self, tmpdir):
  class TestExecutionOnWindows (line 880) | class TestExecutionOnWindows:
    method test_sysfind_bat_exe_before (line 883) | def test_sysfind_bat_exe_before(self, tmpdir, monkeypatch):
  class TestExecution (line 891) | class TestExecution:
    method test_sysfind_no_permission_ignored (line 894) | def test_sysfind_no_permission_ignored(self, monkeypatch, tmpdir):
    method test_sysfind_absolute (line 903) | def test_sysfind_absolute(self):
    method test_sysfind_multiple (line 910) | def test_sysfind_multiple(self, tmpdir, monkeypatch):
    method test_sysexec (line 920) | def test_sysexec(self):
    method test_sysexec_failing (line 926) | def test_sysexec_failing(self):
    method test_make_numbered_dir (line 935) | def test_make_numbered_dir(self, tmpdir):
    method test_make_numbered_dir_case (line 950) | def test_make_numbered_dir_case(self, tmpdir):
    method test_make_numbered_dir_NotImplemented_Error (line 974) | def test_make_numbered_dir_NotImplemented_Error(self, tmpdir, monkeypa...
    method test_locked_make_numbered_dir (line 983) | def test_locked_make_numbered_dir(self, tmpdir):
    method test_error_preservation (line 991) | def test_error_preservation(self, path1):
  class TestImport (line 1000) | class TestImport:
    method preserve_sys (line 1002) | def preserve_sys(self):
    method test_pyimport (line 1007) | def test_pyimport(self, path1):
    method test_pyimport_renamed_dir_creates_mismatch (line 1012) | def test_pyimport_renamed_dir_creates_mismatch(self, tmpdir, monkeypat...
    method test_pyimport_messy_name (line 1028) | def test_pyimport_messy_name(self, tmpdir):
    method test_pyimport_dir (line 1033) | def test_pyimport_dir(self, tmpdir):
    method test_pyimport_execfile_different_name (line 1041) | def test_pyimport_execfile_different_name(self, path1):
    method test_pyimport_a (line 1046) | def test_pyimport_a(self, path1):
    method test_pyimport_b (line 1052) | def test_pyimport_b(self, path1):
    method test_pyimport_c (line 1058) | def test_pyimport_c(self, path1):
    method test_pyimport_d (line 1063) | def test_pyimport_d(self, path1):
    method test_pyimport_and_import (line 1068) | def test_pyimport_and_import(self, tmpdir):
    method test_pyimport_check_filepath_consistency (line 1077) | def test_pyimport_check_filepath_consistency(self, monkeypatch, tmpdir):
    method test_issue131_pyimport_on__init__ (line 1100) | def test_issue131_pyimport_on__init__(self, tmpdir):
    method test_ensuresyspath_append (line 1110) | def test_ensuresyspath_append(self, tmpdir):
  class TestImportlibImport (line 1119) | class TestImportlibImport:
    method test_pyimport (line 1122) | def test_pyimport(self, path1):
    method test_pyimport_dir_fails (line 1127) | def test_pyimport_dir_fails(self, tmpdir):
    method test_pyimport_execfile_different_name (line 1133) | def test_pyimport_execfile_different_name(self, path1):
    method test_pyimport_relative_import_fails (line 1138) | def test_pyimport_relative_import_fails(self, path1):
    method test_pyimport_doesnt_use_sys_modules (line 1143) | def test_pyimport_doesnt_use_sys_modules(self, tmpdir):
  function test_pypkgdir (line 1150) | def test_pypkgdir(tmpdir):
  function test_pypkgdir_unimportable (line 1158) | def test_pypkgdir_unimportable(tmpdir):
  function test_isimportable (line 1167) | def test_isimportable():
  function test_homedir_from_HOME (line 1183) | def test_homedir_from_HOME(monkeypatch):
  function test_homedir_not_exists (line 1189) | def test_homedir_not_exists(monkeypatch):
  function test_samefile (line 1196) | def test_samefile(tmpdir):
  function test_samefile_symlink (line 1209) | def test_samefile_symlink(tmpdir):
  function test_listdir_single_arg (line 1222) | def test_listdir_single_arg(tmpdir):
  function test_mkdtemp_rootdir (line 1227) | def test_mkdtemp_rootdir(tmpdir):
  class TestWINLocalPath (line 1232) | class TestWINLocalPath:
    method test_owner_group_not_implemented (line 1235) | def test_owner_group_not_implemented(self, path1):
    method test_chmod_simple_int (line 1241) | def test_chmod_simple_int(self, path1):
    method test_path_comparison_lowercase_mixed (line 1253) | def test_path_comparison_lowercase_mixed(self, path1):
    method test_relto_with_mixed_case (line 1259) | def test_relto_with_mixed_case(self, path1):
    method test_allow_unix_style_paths (line 1264) | def test_allow_unix_style_paths(self, path1):
    method test_sysfind_in_currentdir (line 1272) | def test_sysfind_in_currentdir(self, path1):
    method test_fnmatch_file_abspath_posix_pattern_on_win32 (line 1279) | def test_fnmatch_file_abspath_posix_pattern_on_win32(self, tmpdir):
  class TestPOSIXLocalPath (line 1290) | class TestPOSIXLocalPath:
    method test_hardlink (line 1293) | def test_hardlink(self, tmpdir):
    method test_symlink_are_identical (line 1301) | def test_symlink_are_identical(self, tmpdir):
    method test_symlink_isfile (line 1308) | def test_symlink_isfile(self, tmpdir):
    method test_symlink_relative (line 1317) | def test_symlink_relative(self, tmpdir):
    method test_symlink_not_existing (line 1327) | def test_symlink_not_existing(self, tmpdir):
    method test_relto_with_root (line 1332) | def test_relto_with_root(self, path1, tmpdir):
    method test_visit_recursive_symlink (line 1336) | def test_visit_recursive_symlink(self, tmpdir):
    method test_symlink_isdir (line 1342) | def test_symlink_isdir(self
Condensed preview — 618 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (6,579K chars).
[
  {
    "path": ".git-blame-ignore-revs",
    "chars": 1299,
    "preview": "# List of revisions that can be ignored with git-blame(1).\n#\n# See `blame.ignoreRevsFile` in git-config(1) to enable it "
  },
  {
    "path": ".gitattributes",
    "chars": 21,
    "preview": "*.bat  text eol=crlf\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 262,
    "preview": "# info:\n# * https://help.github.com/en/articles/displaying-a-sponsor-button-in-your-repository\n# * https://tidelift.com/"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/1_bug_report.md",
    "chars": 358,
    "preview": "---\nname: 🐛 Bug Report\nabout: Report errors and problems\n\n---\n\n<!--\nThanks for submitting an issue!\n\nQuick check-list wh"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/2_feature_request.md",
    "chars": 829,
    "preview": "---\nname: 🚀 Feature Request\nabout: Ideas for new features and improvements\n\n---\n\n<!--\nThanks for suggesting a feature!\n\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 192,
    "preview": "blank_issues_enabled: false\ncontact_links:\n  - name: ❓ Support Question\n    url: https://github.com/pytest-dev/pytest/di"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 1660,
    "preview": "<!--\nThanks for submitting a PR, your contribution is really appreciated!\n\nHere is a quick checklist that should be pres"
  },
  {
    "path": ".github/chronographer.yml",
    "chars": 438,
    "preview": "---\n\nbranch-protection-check-name: Changelog entry\naction-hints:\n  check-title-prefix: \"Chronographer: \"\n  external-docs"
  },
  {
    "path": ".github/config.yml",
    "chars": 23,
    "preview": "rtd:\n  project: pytest\n"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 435,
    "preview": "version: 2\nupdates:\n- package-ecosystem: pip\n  directory: \"/testing/plugins_integration\"\n  schedule:\n    interval: weekl"
  },
  {
    "path": ".github/labels.toml",
    "chars": 3690,
    "preview": "[\"os: cygwin\"]\ncolor = \"006b75\"\ndescription = \"cygwin platform-specific problem\"\nname = \"os: cygwin\"\n\n[\"os: linux\"]\ncolo"
  },
  {
    "path": ".github/patchback.yml",
    "chars": 214,
    "preview": "---\n\nbackport_branch_prefix: patchback/backports/\nbackport_label_prefix: 'backport '  # IMPORTANT: the labels are space-"
  },
  {
    "path": ".github/workflows/deploy.yml",
    "chars": 3919,
    "preview": "name: deploy\n\non:\n  workflow_dispatch:\n    inputs:\n      version:\n        description: 'Release version'\n        require"
  },
  {
    "path": ".github/workflows/doc-check-links.yml",
    "chars": 858,
    "preview": "name: Doc Check Links\n\non:\n  schedule:\n    # At 00:00 on Sunday.\n    # https://crontab.guru\n    - cron: '0 0 * * 0'\n  wo"
  },
  {
    "path": ".github/workflows/prepare-release-pr.yml",
    "chars": 1773,
    "preview": "name: prepare release pr\n\non:\n  workflow_dispatch:\n    inputs:\n      branch:\n        description: 'Branch to base the re"
  },
  {
    "path": ".github/workflows/stale.yml",
    "chars": 919,
    "preview": "name: close needs-information issues\non:\n  schedule:\n    - cron: \"30 1 * * *\"\n  workflow_dispatch:\n\njobs:\n  close-issues"
  },
  {
    "path": ".github/workflows/test.yml",
    "chars": 8603,
    "preview": "name: test\n\non:\n  push:\n    branches:\n      - main\n      - \"[0-9]+.[0-9]+.x\"\n      - \"test-me-*\"\n    tags:\n      - \"[0-9"
  },
  {
    "path": ".github/workflows/update-plugin-list.yml",
    "chars": 2120,
    "preview": "name: Update Plugin List\n\non:\n  schedule:\n    # At 00:00 on Sunday.\n    # https://crontab.guru\n    - cron: '0 0 * * 0'\n "
  },
  {
    "path": ".gitignore",
    "chars": 747,
    "preview": "# Automatically generated by `hgimportsvn`\n.svn\n.hgsvn\n\n# Ignore local virtualenvs\nlib/\nbin/\ninclude/\n.Python/\n\n# These "
  },
  {
    "path": ".mailmap",
    "chars": 71,
    "preview": "Freya Bruhin <git@the-compiler.org>\nFreya Bruhin <me@the-compiler.org>\n"
  },
  {
    "path": ".pre-commit-config.yaml",
    "chars": 4895,
    "preview": "minimum_pre_commit_version: \"4.4.0\"\nrepos:\n- repo: https://github.com/astral-sh/ruff-pre-commit\n  rev: \"v0.14.14\"\n  hook"
  },
  {
    "path": ".readthedocs.yaml",
    "chars": 604,
    "preview": "version: 2\n\npython:\n   install:\n     # Install pytest first, then doc/en/requirements.txt.\n     # This order is importan"
  },
  {
    "path": "AUTHORS",
    "chars": 7640,
    "preview": "Holger Krekel, holger at merlinux eu\nmerlinux GmbH, Germany, office at merlinux eu\n\nContributors include::\n\nAaron Colema"
  },
  {
    "path": "CHANGELOG.rst",
    "chars": 230,
    "preview": "=========\nChangelog\n=========\n\nThe pytest CHANGELOG is located `here <https://docs.pytest.org/en/stable/changelog.html>`"
  },
  {
    "path": "CITATION",
    "chars": 1165,
    "preview": "NOTE: Change \"x.y\" by the version you use. If you are unsure about which version\nyou are using run: `pip show pytest`. D"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 3718,
    "preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, w"
  },
  {
    "path": "CONTRIBUTING.rst",
    "chars": 26744,
    "preview": "============================\nContributing\n============================\n\nContributions are highly welcomed and appreciate"
  },
  {
    "path": "LICENSE",
    "chars": 1091,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2004 Holger Krekel and others\n\nPermission is hereby granted, free of charge, to any"
  },
  {
    "path": "OPENCOLLECTIVE.rst",
    "chars": 1953,
    "preview": "==============\nOpenCollective\n==============\n\npytest has a collective setup at `OpenCollective`_. This document describe"
  },
  {
    "path": "README.rst",
    "chars": 5475,
    "preview": ".. image:: https://github.com/pytest-dev/pytest/raw/main/doc/en/img/pytest_logo_curves.svg\n   :target: https://docs.pyte"
  },
  {
    "path": "RELEASING.rst",
    "chars": 6572,
    "preview": "Release Procedure\n-----------------\n\nOur current policy for releasing is to aim for a bug-fix release every few weeks an"
  },
  {
    "path": "TIDELIFT.rst",
    "chars": 2412,
    "preview": "========\nTidelift\n========\n\npytest is a member of `Tidelift`_. This document describes how the core team manages\nTidelif"
  },
  {
    "path": "bench/bench.py",
    "chars": 383,
    "preview": "from __future__ import annotations\n\nimport sys\n\n\nif __name__ == \"__main__\":\n    import cProfile\n    import pstats\n\n    i"
  },
  {
    "path": "bench/bench_argcomplete.py",
    "chars": 631,
    "preview": "# 10000 iterations, just for relative comparison\n#                      2.7.5     3.3.2\n# FilesCompleter       75.1109  "
  },
  {
    "path": "bench/empty.py",
    "chars": 98,
    "preview": "from __future__ import annotations\n\n\nfor i in range(1000):\n    exec(f\"def test_func_{i}(): pass\")\n"
  },
  {
    "path": "bench/manyparam.py",
    "chars": 205,
    "preview": "from __future__ import annotations\n\nimport pytest\n\n\n@pytest.fixture(scope=\"module\", params=range(966))\ndef foo(request):"
  },
  {
    "path": "bench/skip.py",
    "chars": 166,
    "preview": "from __future__ import annotations\n\nimport pytest\n\n\nSKIP = True\n\n\n@pytest.mark.parametrize(\"x\", range(5000))\ndef test_fo"
  },
  {
    "path": "bench/unit_test.py",
    "chars": 291,
    "preview": "from __future__ import annotations\n\nfrom unittest import TestCase  # noqa: F401\n\n\nfor i in range(15000):\n    exec(\n     "
  },
  {
    "path": "bench/xunit.py",
    "chars": 236,
    "preview": "from __future__ import annotations\n\n\nfor i in range(5000):\n    exec(\n        f\"\"\"\nclass Test{i}:\n    @classmethod\n    de"
  },
  {
    "path": "changelog/.gitignore",
    "chars": 477,
    "preview": "*\n!.gitignore\n!_template.rst\n!README.rst\n!*.bugfix\n!*.bugfix.rst\n!*.bugfix.*.rst\n!*.breaking\n!*.breaking.rst\n!*.breaking"
  },
  {
    "path": "changelog/12444.bugfix.rst",
    "chars": 129,
    "preview": "Fixed :func:`pytest.approx` which now correctly takes into account :class:`~collections.abc.Mapping` keys order to compa"
  },
  {
    "path": "changelog/12689.contrib.rst",
    "chars": 200,
    "preview": "The test reports are now published to Codecov from GitHub Actions.\nThe test statistics is visible `on the web interface\n"
  },
  {
    "path": "changelog/12882.deprecation.rst",
    "chars": 272,
    "preview": "Calling :meth:`request.getfixturevalue() <pytest.FixtureRequest.getfixturevalue>` during teardown to request a fixture t"
  },
  {
    "path": "changelog/13192.bugfix.rst",
    "chars": 134,
    "preview": "Fixed `|` (pipe) not being treated as a regex meta-character that needs escaping in :func:`pytest.raises(match=...) <pyt"
  },
  {
    "path": "changelog/13388.doc.rst",
    "chars": 111,
    "preview": "Clarified documentation for ``-p`` vs ``PYTEST_PLUGINS`` plugin loading and fixed an incorrect ``-p`` example.\n"
  },
  {
    "path": "changelog/13409.deprecation.rst",
    "chars": 604,
    "preview": "Using non-:class:`~collections.abc.Collection` iterables (such as generators, iterators, or custom iterable objects) for"
  },
  {
    "path": "changelog/13634.bugfix.rst",
    "chars": 296,
    "preview": "Blocking a ``conftest.py`` file using the ``-p no:`` option is now explicitly disallowed.\n\nPreviously this resulted in a"
  },
  {
    "path": "changelog/13731.doc.rst",
    "chars": 222,
    "preview": "Clarified that capture fixtures (e.g. ``capsys`` and ``capfd``) take precedence over the ``-s`` / ``--capture=no`` comma"
  },
  {
    "path": "changelog/13734.bugfix.rst",
    "chars": 84,
    "preview": "Fixed crash when a test raises an exceptiongroup with ``__tracebackhide__ = True``.\n"
  },
  {
    "path": "changelog/13884.bugfix.rst",
    "chars": 93,
    "preview": "Fixed rare internal IndexError caused by `builtins.compile` being overridden in client code.\n"
  },
  {
    "path": "changelog/13917.bugfix.rst",
    "chars": 144,
    "preview": ":class:`unittest.SkipTest` is no longer considered an interactive exception, i.e. :hook:`pytest_exception_interact` is n"
  },
  {
    "path": "changelog/13946.deprecation.rst",
    "chars": 194,
    "preview": "The private ``config.inicfg`` attribute is now deprecated.\nUse :meth:`config.getini() <pytest.Config.getini>` to access "
  },
  {
    "path": "changelog/13963.bugfix.rst",
    "chars": 215,
    "preview": "Fixed subtests running with :pypi:`pytest-xdist` when their contexts contain objects that are not JSON-serializable.\n\nFi"
  },
  {
    "path": "changelog/14023.feature.rst",
    "chars": 40,
    "preview": "Added `--report-chars` long CLI option.\n"
  },
  {
    "path": "changelog/14026.improvement.rst",
    "chars": 90,
    "preview": "Added test coverage for compiled regex patterns in :func:`pytest.raises` match parameter.\n"
  },
  {
    "path": "changelog/14050.bugfix.rst",
    "chars": 117,
    "preview": "Display dictionary differences in assertion failures using the original key insertion order instead of sorted order.\n"
  },
  {
    "path": "changelog/14088.doc.rst",
    "chars": 142,
    "preview": "Clarified that the default :hook:`pytest_collection` hook sets ``session.items`` before it calls :hook:`pytest_collectio"
  },
  {
    "path": "changelog/14114.bugfix.rst",
    "chars": 156,
    "preview": "An exception from :hook:`pytest_fixture_post_finalizer` no longer prevents fixtures from being torn down, causing additi"
  },
  {
    "path": "changelog/14195.bugfix.rst",
    "chars": 99,
    "preview": "Fixed an issue where non-string messages passed to `unittest.TestCase.subTest()` were not printed.\n"
  },
  {
    "path": "changelog/14255.doc.rst",
    "chars": 74,
    "preview": "TOML integer log levels must be quoted: Updating reference documentation.\n"
  },
  {
    "path": "changelog/14303.doc.rst",
    "chars": 49,
    "preview": "The documentation is now built with Sphinx >= 9.\n"
  },
  {
    "path": "changelog/5848.bugfix.rst",
    "chars": 115,
    "preview": ":hook:`pytest_fixture_post_finalizer` is no longer called extra times for the same fixture teardown in some cases.\n"
  },
  {
    "path": "changelog/719.bugfix.rst",
    "chars": 312,
    "preview": "Fixed :ref:`@pytest.mark.parametrize <pytest.mark.parametrize ref>` not unpacking single-element tuple values when using"
  },
  {
    "path": "changelog/README.rst",
    "chars": 2463,
    "preview": "This directory contains \"newsfragments\" which are short files that contain a small **ReST**-formatted\ntext that will be "
  },
  {
    "path": "changelog/_template.rst",
    "chars": 939,
    "preview": "{% for section in sections %}\n{% set underline = \"-\" %}\n{% if section %}\n{{section}}\n{{ underline * section|length }}{% "
  },
  {
    "path": "codecov.yml",
    "chars": 267,
    "preview": "# reference: https://docs.codecov.io/docs/codecovyml-reference\n---\n\ncodecov:\n  token: 1eca3b1f-31a2-4fb8-a8c3-138b441b50"
  },
  {
    "path": "doc/en/Makefile",
    "chars": 1510,
    "preview": "# Minimal makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line, and also\n# from the "
  },
  {
    "path": "doc/en/_static/pytest-custom.css",
    "chars": 329,
    "preview": "/* Tweak how the sidebar logo is presented */\n.sidebar-logo {\n  width: 70%;\n}\n.sidebar-brand {\n  padding: 0;\n}\n\n/* The l"
  },
  {
    "path": "doc/en/_templates/links.html",
    "chars": 364,
    "preview": "<h3>Useful Links</h3>\n<ul>\n  <li><a href=\"https://pypi.org/project/pytest/\">pytest @ PyPI</a></li>\n  <li><a href=\"https:"
  },
  {
    "path": "doc/en/adopt.rst",
    "chars": 3997,
    "preview": ":orphan:\n\n.. warnings about this file not being included in any toctree will be suppressed by :orphan:\n\n\nApril 2015 is \""
  },
  {
    "path": "doc/en/announce/index.rst",
    "chars": 3238,
    "preview": "\nRelease announcements\n===========================================\n\n.. toctree::\n   :maxdepth: 2\n\n\n   release-9.0.2\n   r"
  },
  {
    "path": "doc/en/announce/release-2.0.0.rst",
    "chars": 5195,
    "preview": "py.test 2.0.0: asserts++, unittest++, reporting++, config++, docs++\n===================================================="
  },
  {
    "path": "doc/en/announce/release-2.0.1.rst",
    "chars": 3099,
    "preview": "py.test 2.0.1: bug fixes\n===========================================================================\n\nWelcome to pytest-"
  },
  {
    "path": "doc/en/announce/release-2.0.2.rst",
    "chars": 2798,
    "preview": "py.test 2.0.2: bug fixes, improved xfail/skip expressions, speed ups\n==================================================="
  },
  {
    "path": "doc/en/announce/release-2.0.3.rst",
    "chars": 1307,
    "preview": "py.test 2.0.3: bug fixes and speed ups\n===========================================================================\n\nWelc"
  },
  {
    "path": "doc/en/announce/release-2.1.0.rst",
    "chars": 2145,
    "preview": "py.test 2.1.0: perfected assertions and bug fixes\n======================================================================"
  },
  {
    "path": "doc/en/announce/release-2.1.1.rst",
    "chars": 1581,
    "preview": "py.test 2.1.1: assertion fixes and improved junitxml output\n============================================================"
  },
  {
    "path": "doc/en/announce/release-2.1.2.rst",
    "chars": 1286,
    "preview": "py.test 2.1.2: bug fixes and fixes for jython\n=========================================================================="
  },
  {
    "path": "doc/en/announce/release-2.1.3.rst",
    "chars": 1203,
    "preview": "py.test 2.1.3: just some more fixes\n===========================================================================\n\npytest-"
  },
  {
    "path": "doc/en/announce/release-2.2.0.rst",
    "chars": 4350,
    "preview": "py.test 2.2.0: test marking++, parametrization++ and duration profiling\n================================================"
  },
  {
    "path": "doc/en/announce/release-2.2.1.rst",
    "chars": 1555,
    "preview": "pytest-2.2.1: bug fixes, perfect teardowns\n===========================================================================\n\n"
  },
  {
    "path": "doc/en/announce/release-2.2.2.rst",
    "chars": 1619,
    "preview": "pytest-2.2.2: bug fixes\n===========================================================================\n\npytest-2.2.2 (updat"
  },
  {
    "path": "doc/en/announce/release-2.2.4.rst",
    "chars": 1454,
    "preview": "pytest-2.2.4: bug fixes, better junitxml/unittest/python3 compat\n======================================================="
  },
  {
    "path": "doc/en/announce/release-2.3.0.rst",
    "chars": 5567,
    "preview": "pytest-2.3: improved fixtures / better unittest integration\n============================================================"
  },
  {
    "path": "doc/en/announce/release-2.3.1.rst",
    "chars": 1115,
    "preview": "pytest-2.3.1: fix regression with factory functions\n===================================================================="
  },
  {
    "path": "doc/en/announce/release-2.3.2.rst",
    "chars": 1761,
    "preview": "pytest-2.3.2: some fixes and more traceback-printing speed\n============================================================="
  },
  {
    "path": "doc/en/announce/release-2.3.3.rst",
    "chars": 2089,
    "preview": "pytest-2.3.3: integration fixes, py24 support, ``*/**`` shown in traceback\n============================================="
  },
  {
    "path": "doc/en/announce/release-2.3.4.rst",
    "chars": 1696,
    "preview": "pytest-2.3.4: stabilization, more flexible selection via \"-k expr\"\n====================================================="
  },
  {
    "path": "doc/en/announce/release-2.3.5.rst",
    "chars": 3270,
    "preview": "pytest-2.3.5: bug fixes and little improvements\n========================================================================"
  },
  {
    "path": "doc/en/announce/release-2.4.0.rst",
    "chars": 9143,
    "preview": "pytest-2.4.0: new fixture features/hooks and bug fixes\n================================================================="
  },
  {
    "path": "doc/en/announce/release-2.4.1.rst",
    "chars": 881,
    "preview": "pytest-2.4.1: fixing three regressions compared to 2.3.5\n==============================================================="
  },
  {
    "path": "doc/en/announce/release-2.4.2.rst",
    "chars": 1428,
    "preview": "pytest-2.4.2: colorama on windows, plugin/tmpdir fixes\n================================================================="
  },
  {
    "path": "doc/en/announce/release-2.5.0.rst",
    "chars": 7274,
    "preview": "pytest-2.5.0: now down to ZERO reported bugs!\n=========================================================================="
  },
  {
    "path": "doc/en/announce/release-2.5.1.rst",
    "chars": 1713,
    "preview": "pytest-2.5.1: fixes and new home page styling\n=========================================================================="
  },
  {
    "path": "doc/en/announce/release-2.5.2.rst",
    "chars": 1908,
    "preview": "pytest-2.5.2: fixes\n===========================================================================\n\npytest is a mature Pyth"
  },
  {
    "path": "doc/en/announce/release-2.6.0.rst",
    "chars": 5814,
    "preview": "pytest-2.6.0: shorter tracebacks, new warning system, test runner compat\n==============================================="
  },
  {
    "path": "doc/en/announce/release-2.6.1.rst",
    "chars": 1989,
    "preview": "pytest-2.6.1: fixes and new xfail feature\n===========================================================================\n\np"
  },
  {
    "path": "doc/en/announce/release-2.6.2.rst",
    "chars": 1532,
    "preview": "pytest-2.6.2: few fixes and cx_freeze support\n=========================================================================="
  },
  {
    "path": "doc/en/announce/release-2.6.3.rst",
    "chars": 1678,
    "preview": "pytest-2.6.3: fixes and little improvements\n===========================================================================\n"
  },
  {
    "path": "doc/en/announce/release-2.7.0.rst",
    "chars": 3837,
    "preview": "pytest-2.7.0: fixes, features, speed improvements\n======================================================================"
  },
  {
    "path": "doc/en/announce/release-2.7.1.rst",
    "chars": 1941,
    "preview": "pytest-2.7.1: bug fixes\n=======================\n\npytest is a mature Python testing tool with more than 1100 tests\nagains"
  },
  {
    "path": "doc/en/announce/release-2.7.2.rst",
    "chars": 1728,
    "preview": "pytest-2.7.2: bug fixes\n=======================\n\npytest is a mature Python testing tool with more than 1100 tests\nagains"
  },
  {
    "path": "doc/en/announce/release-2.8.2.rst",
    "chars": 1296,
    "preview": "pytest-2.8.2: bug fixes\n=======================\n\npytest is a mature Python testing tool with more than 1100 tests\nagains"
  },
  {
    "path": "doc/en/announce/release-2.8.3.rst",
    "chars": 1790,
    "preview": "pytest-2.8.3: bug fixes\n=======================\n\npytest is a mature Python testing tool with more than 1100 tests\nagains"
  },
  {
    "path": "doc/en/announce/release-2.8.4.rst",
    "chars": 1375,
    "preview": "pytest-2.8.4\n============\n\npytest is a mature Python testing tool with more than 1100 tests\nagainst itself, passing on m"
  },
  {
    "path": "doc/en/announce/release-2.8.5.rst",
    "chars": 1114,
    "preview": "pytest-2.8.5\n============\n\npytest is a mature Python testing tool with more than 1100 tests\nagainst itself, passing on m"
  },
  {
    "path": "doc/en/announce/release-2.8.6.rst",
    "chars": 1906,
    "preview": "pytest-2.8.6\n============\n\npytest is a mature Python testing tool with more than 1100 tests\nagainst itself, passing on m"
  },
  {
    "path": "doc/en/announce/release-2.8.7.rst",
    "chars": 719,
    "preview": "pytest-2.8.7\n============\n\nThis is a hotfix release to solve a regression\nin the builtin monkeypatch plugin that got int"
  },
  {
    "path": "doc/en/announce/release-2.9.0.rst",
    "chars": 4892,
    "preview": "pytest-2.9.0\n============\n\npytest is a mature Python testing tool with more than 1100 tests\nagainst itself, passing on m"
  },
  {
    "path": "doc/en/announce/release-2.9.1.rst",
    "chars": 1481,
    "preview": "pytest-2.9.1\n============\n\npytest is a mature Python testing tool with more than 1100 tests\nagainst itself, passing on m"
  },
  {
    "path": "doc/en/announce/release-2.9.2.rst",
    "chars": 1747,
    "preview": "pytest-2.9.2\n============\n\npytest is a mature Python testing tool with more than 1100 tests\nagainst itself, passing on m"
  },
  {
    "path": "doc/en/announce/release-3.0.0.rst",
    "chars": 1769,
    "preview": "pytest-3.0.0\n============\n\nThe pytest team is proud to announce the 3.0.0 release!\n\npytest is a mature Python testing to"
  },
  {
    "path": "doc/en/announce/release-3.0.1.rst",
    "chars": 575,
    "preview": "pytest-3.0.1\n============\n\npytest 3.0.1 has just been released to PyPI.\n\nThis release fixes some regressions reported in"
  },
  {
    "path": "doc/en/announce/release-3.0.2.rst",
    "chars": 512,
    "preview": "pytest-3.0.2\n============\n\npytest 3.0.2 has just been released to PyPI.\n\nThis release fixes some regressions and bugs re"
  },
  {
    "path": "doc/en/announce/release-3.0.3.rst",
    "chars": 561,
    "preview": "pytest-3.0.3\n============\n\npytest 3.0.3 has just been released to PyPI.\n\nThis release fixes some regressions and bugs re"
  },
  {
    "path": "doc/en/announce/release-3.0.4.rst",
    "chars": 608,
    "preview": "pytest-3.0.4\n============\n\npytest 3.0.4 has just been released to PyPI.\n\nThis release fixes some regressions and bugs re"
  },
  {
    "path": "doc/en/announce/release-3.0.5.rst",
    "chars": 529,
    "preview": "pytest-3.0.5\n============\n\npytest 3.0.5 has just been released to PyPI.\n\nThis is a bug-fix release, being a drop-in repl"
  },
  {
    "path": "doc/en/announce/release-3.0.6.rst",
    "chars": 614,
    "preview": "pytest-3.0.6\n============\n\npytest 3.0.6 has just been released to PyPI.\n\nThis is a bug-fix release, being a drop-in repl"
  },
  {
    "path": "doc/en/announce/release-3.0.7.rst",
    "chars": 636,
    "preview": "pytest-3.0.7\n============\n\npytest 3.0.7 has just been released to PyPI.\n\nThis is a bug-fix release, being a drop-in repl"
  },
  {
    "path": "doc/en/announce/release-3.1.0.rst",
    "chars": 1196,
    "preview": "pytest-3.1.0\n=======================================\n\nThe pytest team is proud to announce the 3.1.0 release!\n\npytest is"
  },
  {
    "path": "doc/en/announce/release-3.1.1.rst",
    "chars": 492,
    "preview": "pytest-3.1.1\n=======================================\n\npytest 3.1.1 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-3.1.2.rst",
    "chars": 486,
    "preview": "pytest-3.1.2\n=======================================\n\npytest 3.1.2 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-3.1.3.rst",
    "chars": 497,
    "preview": "pytest-3.1.3\n=======================================\n\npytest 3.1.3 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-3.10.0.rst",
    "chars": 969,
    "preview": "pytest-3.10.0\n=======================================\n\nThe pytest team is proud to announce the 3.10.0 release!\n\npytest "
  },
  {
    "path": "doc/en/announce/release-3.10.1.rst",
    "chars": 513,
    "preview": "pytest-3.10.1\n=======================================\n\npytest 3.10.1 has just been released to PyPI.\n\nThis is a bug-fix "
  },
  {
    "path": "doc/en/announce/release-3.2.0.rst",
    "chars": 1024,
    "preview": "pytest-3.2.0\n=======================================\n\nThe pytest team is proud to announce the 3.2.0 release!\n\npytest is"
  },
  {
    "path": "doc/en/announce/release-3.2.1.rst",
    "chars": 487,
    "preview": "pytest-3.2.1\n=======================================\n\npytest 3.2.1 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-3.2.2.rst",
    "chars": 568,
    "preview": "pytest-3.2.2\n=======================================\n\npytest 3.2.2 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-3.2.3.rst",
    "chars": 482,
    "preview": "pytest-3.2.3\n=======================================\n\npytest 3.2.3 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-3.2.4.rst",
    "chars": 701,
    "preview": "pytest-3.2.4\n=======================================\n\npytest 3.2.4 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-3.2.5.rst",
    "chars": 408,
    "preview": "pytest-3.2.5\n=======================================\n\npytest 3.2.5 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-3.3.0.rst",
    "chars": 1026,
    "preview": "pytest-3.3.0\n=======================================\n\nThe pytest team is proud to announce the 3.3.0 release!\n\npytest is"
  },
  {
    "path": "doc/en/announce/release-3.3.1.rst",
    "chars": 530,
    "preview": "pytest-3.3.1\n=======================================\n\npytest 3.3.1 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-3.3.2.rst",
    "chars": 589,
    "preview": "pytest-3.3.2\n=======================================\n\npytest 3.3.2 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-3.4.0.rst",
    "chars": 1062,
    "preview": "pytest-3.4.0\n=======================================\n\nThe pytest team is proud to announce the 3.4.0 release!\n\npytest is"
  },
  {
    "path": "doc/en/announce/release-3.4.1.rst",
    "chars": 549,
    "preview": "pytest-3.4.1\n=======================================\n\npytest 3.4.1 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-3.4.2.rst",
    "chars": 565,
    "preview": "pytest-3.4.2\n=======================================\n\npytest 3.4.2 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-3.5.0.rst",
    "chars": 1058,
    "preview": "pytest-3.5.0\n=======================================\n\nThe pytest team is proud to announce the 3.5.0 release!\n\npytest is"
  },
  {
    "path": "doc/en/announce/release-3.5.1.rst",
    "chars": 612,
    "preview": "pytest-3.5.1\n=======================================\n\npytest 3.5.1 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-3.6.0.rst",
    "chars": 881,
    "preview": "pytest-3.6.0\n=======================================\n\nThe pytest team is proud to announce the 3.6.0 release!\n\npytest is"
  },
  {
    "path": "doc/en/announce/release-3.6.1.rst",
    "chars": 520,
    "preview": "pytest-3.6.1\n=======================================\n\npytest 3.6.1 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-3.6.2.rst",
    "chars": 607,
    "preview": "pytest-3.6.2\n=======================================\n\npytest 3.6.2 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-3.6.3.rst",
    "chars": 570,
    "preview": "pytest-3.6.3\n=======================================\n\npytest 3.6.3 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-3.6.4.rst",
    "chars": 502,
    "preview": "pytest-3.6.4\n=======================================\n\npytest 3.6.4 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-3.7.0.rst",
    "chars": 879,
    "preview": "pytest-3.7.0\n=======================================\n\nThe pytest team is proud to announce the 3.7.0 release!\n\npytest is"
  },
  {
    "path": "doc/en/announce/release-3.7.1.rst",
    "chars": 462,
    "preview": "pytest-3.7.1\n=======================================\n\npytest 3.7.1 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-3.7.2.rst",
    "chars": 521,
    "preview": "pytest-3.7.2\n=======================================\n\npytest 3.7.2 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-3.7.3.rst",
    "chars": 634,
    "preview": "pytest-3.7.3\n=======================================\n\npytest 3.7.3 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-3.7.4.rst",
    "chars": 473,
    "preview": "pytest-3.7.4\n=======================================\n\npytest 3.7.4 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-3.8.0.rst",
    "chars": 853,
    "preview": "pytest-3.8.0\n=======================================\n\nThe pytest team is proud to announce the 3.8.0 release!\n\npytest is"
  },
  {
    "path": "doc/en/announce/release-3.8.1.rst",
    "chars": 532,
    "preview": "pytest-3.8.1\n=======================================\n\npytest 3.8.1 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-3.8.2.rst",
    "chars": 584,
    "preview": "pytest-3.8.2\n=======================================\n\npytest 3.8.2 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-3.9.0.rst",
    "chars": 948,
    "preview": "pytest-3.9.0\n=======================================\n\nThe pytest team is proud to announce the 3.9.0 release!\n\npytest is"
  },
  {
    "path": "doc/en/announce/release-3.9.1.rst",
    "chars": 446,
    "preview": "pytest-3.9.1\n=======================================\n\npytest 3.9.1 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-3.9.2.rst",
    "chars": 492,
    "preview": "pytest-3.9.2\n=======================================\n\npytest 3.9.2 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-3.9.3.rst",
    "chars": 511,
    "preview": "pytest-3.9.3\n=======================================\n\npytest 3.9.3 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-4.0.0.rst",
    "chars": 733,
    "preview": "pytest-4.0.0\n=======================================\n\nThe pytest team is proud to announce the 4.0.0 release!\n\npytest is"
  },
  {
    "path": "doc/en/announce/release-4.0.1.rst",
    "chars": 491,
    "preview": "pytest-4.0.1\n=======================================\n\npytest 4.0.1 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-4.0.2.rst",
    "chars": 508,
    "preview": "pytest-4.0.2\n=======================================\n\npytest 4.0.2 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-4.1.0.rst",
    "chars": 948,
    "preview": "pytest-4.1.0\n=======================================\n\nThe pytest team is proud to announce the 4.1.0 release!\n\npytest is"
  },
  {
    "path": "doc/en/announce/release-4.1.1.rst",
    "chars": 554,
    "preview": "pytest-4.1.1\n=======================================\n\npytest 4.1.1 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-4.2.0.rst",
    "chars": 854,
    "preview": "pytest-4.2.0\n=======================================\n\nThe pytest team is proud to announce the 4.2.0 release!\n\npytest is"
  },
  {
    "path": "doc/en/announce/release-4.2.1.rst",
    "chars": 615,
    "preview": "pytest-4.2.1\n=======================================\n\npytest 4.2.1 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-4.3.0.rst",
    "chars": 837,
    "preview": "pytest-4.3.0\n=======================================\n\nThe pytest team is proud to announce the 4.3.0 release!\n\npytest is"
  },
  {
    "path": "doc/en/announce/release-4.3.1.rst",
    "chars": 575,
    "preview": "pytest-4.3.1\n=======================================\n\npytest 4.3.1 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-4.4.0.rst",
    "chars": 870,
    "preview": "pytest-4.4.0\n=======================================\n\nThe pytest team is proud to announce the 4.4.0 release!\n\npytest is"
  },
  {
    "path": "doc/en/announce/release-4.4.1.rst",
    "chars": 444,
    "preview": "pytest-4.4.1\n=======================================\n\npytest 4.4.1 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-4.4.2.rst",
    "chars": 641,
    "preview": "pytest-4.4.2\n=======================================\n\npytest 4.4.2 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-4.5.0.rst",
    "chars": 810,
    "preview": "pytest-4.5.0\n=======================================\n\nThe pytest team is proud to announce the 4.5.0 release!\n\npytest is"
  },
  {
    "path": "doc/en/announce/release-4.6.0.rst",
    "chars": 938,
    "preview": "pytest-4.6.0\n=======================================\n\nThe pytest team is proud to announce the 4.6.0 release!\n\npytest is"
  },
  {
    "path": "doc/en/announce/release-4.6.1.rst",
    "chars": 428,
    "preview": "pytest-4.6.1\n=======================================\n\npytest 4.6.1 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-4.6.2.rst",
    "chars": 411,
    "preview": "pytest-4.6.2\n=======================================\n\npytest 4.6.2 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-4.6.3.rst",
    "chars": 458,
    "preview": "pytest-4.6.3\n=======================================\n\npytest 4.6.3 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-4.6.4.rst",
    "chars": 483,
    "preview": "pytest-4.6.4\n=======================================\n\npytest 4.6.4 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-4.6.5.rst",
    "chars": 462,
    "preview": "pytest-4.6.5\n=======================================\n\npytest 4.6.5 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-4.6.6.rst",
    "chars": 444,
    "preview": "pytest-4.6.6\n=======================================\n\npytest 4.6.6 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-4.6.7.rst",
    "chars": 426,
    "preview": "pytest-4.6.7\n=======================================\n\npytest 4.6.7 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-4.6.8.rst",
    "chars": 440,
    "preview": "pytest-4.6.8\n=======================================\n\npytest 4.6.8 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-4.6.9.rst",
    "chars": 447,
    "preview": "pytest-4.6.9\n=======================================\n\npytest 4.6.9 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-5.0.0.rst",
    "chars": 979,
    "preview": "pytest-5.0.0\n=======================================\n\nThe pytest team is proud to announce the 5.0.0 release!\n\npytest is"
  },
  {
    "path": "doc/en/announce/release-5.0.1.rst",
    "chars": 532,
    "preview": "pytest-5.0.1\n=======================================\n\npytest 5.0.1 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-5.1.0.rst",
    "chars": 1128,
    "preview": "pytest-5.1.0\n=======================================\n\nThe pytest team is proud to announce the 5.1.0 release!\n\npytest is"
  },
  {
    "path": "doc/en/announce/release-5.1.1.rst",
    "chars": 513,
    "preview": "pytest-5.1.1\n=======================================\n\npytest 5.1.1 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-5.1.2.rst",
    "chars": 498,
    "preview": "pytest-5.1.2\n=======================================\n\npytest 5.1.2 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-5.1.3.rst",
    "chars": 485,
    "preview": "pytest-5.1.3\n=======================================\n\npytest 5.1.3 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-5.2.0.rst",
    "chars": 808,
    "preview": "pytest-5.2.0\n=======================================\n\nThe pytest team is proud to announce the 5.2.0 release!\n\npytest is"
  },
  {
    "path": "doc/en/announce/release-5.2.1.rst",
    "chars": 492,
    "preview": "pytest-5.2.1\n=======================================\n\npytest 5.2.1 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-5.2.2.rst",
    "chars": 600,
    "preview": "pytest-5.2.2\n=======================================\n\npytest 5.2.2 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-5.2.3.rst",
    "chars": 570,
    "preview": "pytest-5.2.3\n=======================================\n\npytest 5.2.3 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-5.2.4.rst",
    "chars": 469,
    "preview": "pytest-5.2.4\n=======================================\n\npytest 5.2.4 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-5.3.0.rst",
    "chars": 934,
    "preview": "pytest-5.3.0\n=======================================\n\nThe pytest team is proud to announce the 5.3.0 release!\n\npytest is"
  },
  {
    "path": "doc/en/announce/release-5.3.1.rst",
    "chars": 550,
    "preview": "pytest-5.3.1\n=======================================\n\npytest 5.3.1 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-5.3.2.rst",
    "chars": 548,
    "preview": "pytest-5.3.2\n=======================================\n\npytest 5.3.2 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-5.3.3.rst",
    "chars": 598,
    "preview": "pytest-5.3.3\n=======================================\n\npytest 5.3.3 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-5.3.4.rst",
    "chars": 439,
    "preview": "pytest-5.3.4\n=======================================\n\npytest 5.3.4 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-5.3.5.rst",
    "chars": 422,
    "preview": "pytest-5.3.5\n=======================================\n\npytest 5.3.5 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-5.4.0.rst",
    "chars": 1194,
    "preview": "pytest-5.4.0\n=======================================\n\nThe pytest team is proud to announce the 5.4.0 release!\n\npytest is"
  },
  {
    "path": "doc/en/announce/release-5.4.1.rst",
    "chars": 410,
    "preview": "pytest-5.4.1\n=======================================\n\npytest 5.4.1 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-5.4.2.rst",
    "chars": 478,
    "preview": "pytest-5.4.2\n=======================================\n\npytest 5.4.2 has just been released to PyPI.\n\nThis is a bug-fix re"
  },
  {
    "path": "doc/en/announce/release-5.4.3.rst",
    "chars": 454,
    "preview": "pytest-5.4.3\n=======================================\n\npytest 5.4.3 has just been released to PyPI.\n\nThis is a bug-fix re"
  }
]

// ... and 418 more files (download for full content)

About this extraction

This page contains the full source code of the pytest-dev/pytest GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 618 files (6.0 MB), approximately 1.6M tokens, and a symbol index with 5916 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!