Code Ownership

Ownership is measured by how many commits each author made to each file in the current tree. It highlights bus-factor risk (files only one person has ever touched) and where knowledge is concentrated. The bus factor is the smallest number of people who are, between them, primary owner of more than half of the files.

Files Tracked
731
in the current tree
Bus Factor
3
3 authors are primary owner of 370 of 731 files
Single-Owner Files
196
26.8% of tracked files
Contributors
932
authors who changed files

Bus factor risk — single-owner files

Files only one author has ever changed. The more a file has changed, the more knowledge is at risk if that person leaves.

FileSole ownerCommits
src/_pytest/assertion/_typing.pyPierre Sassoulas4
src/_pytest/assertion/_compare_set.pyPierre Sassoulas3
uv.lockRonny Pfannschmidt3
testing/test_assertrewrite_coverage.pyRonny Pfannschmidt3
testing/test_collect_imported_tests.pyBruno Oliveira3
doc/en/tidelift.rstBruno Oliveira3
doc/en/announce/release-7.0.0rc1.rstFreya Bruhin3
changelog/14445.bugfix.rstRonny Pfannschmidt2
scripts/diff-assert-rewrite.pyRonny Pfannschmidt2
changelog/14742.deprecation.rstRonny Pfannschmidt2
Table: the 100 most-changed of 196 single-owner files
FileSole ownerCommits
src/_pytest/assertion/_typing.pyPierre Sassoulas4
src/_pytest/assertion/_compare_set.pyPierre Sassoulas3
uv.lockRonny Pfannschmidt3
testing/test_assertrewrite_coverage.pyRonny Pfannschmidt3
testing/test_collect_imported_tests.pyBruno Oliveira3
doc/en/tidelift.rstBruno Oliveira3
doc/en/announce/release-7.0.0rc1.rstFreya Bruhin3
changelog/14445.bugfix.rstRonny Pfannschmidt2
scripts/diff-assert-rewrite.pyRonny Pfannschmidt2
changelog/14742.deprecation.rstRonny Pfannschmidt2
changelog/7940.bugfix.rstRonny Pfannschmidt2
src/_pytest/terminalprogress.pyRan Benita2
testing/example_scripts/collect/package_infinite_recursion/__init__.pyiRan Benita2
testing/example_scripts/config/collect_pytest_prefix/__init__.pyiRan Benita2
testing/example_scripts/conftest_usageerror/__init__.pyiRan Benita2
testing/example_scripts/fixtures/custom_item/__init__.pyiRan Benita2
testing/example_scripts/fixtures/fill_fixtures/test_extend_fixture_conftest_conftest/__init__.pyiRan Benita2
testing/example_scripts/fixtures/fill_fixtures/test_extend_fixture_conftest_module/__init__.pyiRan Benita2
testing/example_scripts/issue88_initial_file_multinodes/__init__.pyiRan Benita2
testing/example_scripts/marks/marks_considered_keywords/__init__.pyiRan Benita2
changelog/11783.bugfix.rst이강은2
changelog/14552.bugfix.rstFrank Hoffmann2
doc/en/announce/release-7.0.0.rstFreya Bruhin2
changelog/14791.improvement.rstPierre Sassoulas1
changelog/14675.bugfix.rstPierre Sassoulas1
changelog/14523.improvement.rstPierre Sassoulas1
changelog/14751.improvement.rstPierre Sassoulas1
src/_pytest/assertion/highlight.pyPierre Sassoulas1
changelog/7323.deprecation.rstLuana Bueno1
changelog/13431.improvement.rstPaneendra Kumar1
changelog/15190.contrib.rstLothnic1
changelog/9236.packaging.rstRonny Pfannschmidt1
changelog/15153.improvement.rstRonny Pfannschmidt1
changelog/12223.bugfix.rstRonny Pfannschmidt1
changelog/12175.bugfix.rstRonny Pfannschmidt1
changelog/14463.improvement.rstRonny Pfannschmidt1
changelog/4569.bugfix.rstRonny Pfannschmidt1
changelog/4569.doc.rstRonny Pfannschmidt1
changelog/4569.improvement.rstRonny Pfannschmidt1
changelog/15032.bugfix.rstRonny Pfannschmidt1
.git_archival.txtRonny Pfannschmidt1
changelog/11680.packaging.rstRonny Pfannschmidt1
changelog/15006.improvement.rstRonny Pfannschmidt1
changelog/15006.bugfix.2.rstRonny Pfannschmidt1
changelog/15006.bugfix.1.rstRonny Pfannschmidt1
changelog/15006.bugfix.rstRonny Pfannschmidt1
changelog/15005.bugfix.rstRonny Pfannschmidt1
changelog/993.breaking.rstRonny Pfannschmidt1
changelog/14921.contrib.rstRonny Pfannschmidt1
changelog/13292.bugfix.rstRonny Pfannschmidt1
changelog/10745.improvement.2.rstRonny Pfannschmidt1
changelog/10745.improvement.1.rstRonny Pfannschmidt1
changelog/14864.bugfix.rstRonny Pfannschmidt1
changelog/14884.bugfix.rstRonny Pfannschmidt1
changelog/14813.contrib.rstRonny Pfannschmidt1
changelog/2781.feature.rstRonny Pfannschmidt1
changelog/11502.bugfix.rstRonny Pfannschmidt1
changelog/14705.bugfix.rstRonny Pfannschmidt1
changelog/14716.breaking.rstRonny Pfannschmidt1
changelog/13564.improvement.rstRonny Pfannschmidt1
.github/actions/setup-tox/action.ymlRonny Pfannschmidt1
changelog/14635.bugfix.rstRonny Pfannschmidt1
changelog/6881.feature.rstRonny Pfannschmidt1
doc/en/announce/release-8.3.2.rstRonny Pfannschmidt1
testing/example_scripts/pytest.iniRonny Pfannschmidt1
testing/example_scripts/marks/marks_considered_keywords/conftest.pyRonny Pfannschmidt1
testing/example_scripts/perf_examples/collect_stats/.gitignoreRonny Pfannschmidt1
testing/example_scripts/fixtures/fill_fixtures/test_conftest_funcargs_only_available_in_subdir/sub1/__init__.pyRonny Pfannschmidt1
testing/example_scripts/fixtures/fill_fixtures/test_conftest_funcargs_only_available_in_subdir/sub2/__init__.pyRonny Pfannschmidt1
testing/example_scripts/fixtures/fill_fixtures/test_extend_fixture_conftest_conftest/pkg/__init__.pyRonny Pfannschmidt1
changelog/6750.bugfix.rstMinh Dau1
changelog/15145.bugfix.rstClaude1
changelog/9614.doc.rstDheeraj1
changelog/14412.bugfix.rstmarcelomarkus1
changelog/14912.bugfix.rstDevansh Awatramani1
changelog/15132.bugfix.rsthfycium1
changelog/9924.bugfix.rstPoorva Barve1
changelog/15043.bugfix.rstPoorva Barve1
changelog/15052.bugfix.rstRan Benita1
changelog/14942.bugfix.rstRan Benita1
changelog/14164.improvement.rstRan Benita1
doc/en/announce/release-9.1.1.rstRan Benita1
doc/en/announce/release-9.1.0.rstRan Benita1
doc/en/announce/release-9.0.3.rstRan Benita1
doc/en/announce/release-8.4.1.rstRan Benita1
doc/en/announce/release-8.2.2.rstRan Benita1
doc/en/announce/release-8.0.2.rstRan Benita1
doc/en/announce/release-8.0.1.rstRan Benita1
doc/en/announce/release-8.0.0.rstRan Benita1
doc/en/announce/release-8.0.0rc2.rstRan Benita1
doc/en/announce/release-7.4.4.rstRan Benita1
doc/en/example/customdirectory/pytest.iniRan Benita1
doc/en/example/customdirectory/tests/manifest.jsonRan Benita1
testing/example_scripts/customdirectory/pytest.iniRan Benita1
testing/example_scripts/customdirectory/tests/manifest.jsonRan Benita1
doc/en/announce/release-7.3.2.rstRan Benita1
doc/en/announce/release-7.1.1.rstRan Benita1
src/_pytest/py.typedRan Benita1
src/pytest/py.typedRan Benita1
changelog/14758.misc.rstBruno Oliveira1

Ownership by author

Primary owner = the author with the most commits to a file. Solely owned = files only that author has touched.

AuthorFiles ownedSolely ownedFiles touched
Ronny Pfannschmidt12745408
Bruno Oliveira12629436
Ran Benita11730286
oleg.hoefling1020128
Anthony Sottile431228
Pierre Sassoulas247187
holger krekel23572
Freya Bruhin195178
Sorin Sbarnea11219
Daniel Hahler70132
Zac Hatfield-Dodds76107
andrewdotn6012
Daniele Procida5042
Chris NeJame5521
Simon K4148
Thomas Grainger4142
Sviatoslav Sydorenko4231
pytest bot4217
Steffen Schroeder4017
Hugo van Kemenade31107
jakkdl3049
Ronald Eddy Jr3035
t2y3315
Raphael Pierzina3014
Josh Soref2046

Showing top 25 of 932 contributors.

Most shared files

Files touched by the most people — shared code where changes are most likely to need coordination.

FileContributorsPrimary ownerOwner share
AUTHORS481holger krekel5.5%
CHANGELOG.rst109Bruno Oliveira45.7%
testing/test_terminal.py74Bruno Oliveira14.0%
doc/en/reference/reference.rst73Ran Benita33.3%
src/_pytest/config/__init__.py68Ran Benita32.3%
testing/test_config.py68Bruno Oliveira17.4%
src/_pytest/terminal.py61Daniel Hahler21.6%
src/_pytest/python.py56Ran Benita38.0%
testing/test_assertion.py55Bruno Oliveira12.7%
testing/test_assertrewrite.py54Bruno Oliveira15.3%
testing/test_junitxml.py54Bruno Oliveira16.4%
src/_pytest/fixtures.py53Ran Benita47.3%
testing/acceptance_test.py51holger krekel23.3%
doc/en/example/simple.rst47Bruno Oliveira42.2%
doc/en/getting-started.rst45Bruno Oliveira36.2%
testing/code/test_excinfo.py45Ran Benita16.4%
CONTRIBUTING.rst45Bruno Oliveira21.8%
testing/test_collection.py44Ran Benita18.0%
testing/test_doctest.py43Bruno Oliveira16.1%
tox.ini42holger krekel27.7%