pyproject.toml (12556B)
1 [project] 2 name = "pytest" 3 description = "pytest: simple powerful testing with Python" 4 readme = "README.rst" 5 keywords = [ 6 "test", 7 "unittest", 8 ] 9 license = {text = "MIT"} 10 authors = [ 11 {name = "Holger Krekel"}, 12 {name = "Bruno Oliveira"}, 13 {name = "Ronny Pfannschmidt"}, 14 {name = "Floris Bruynooghe"}, 15 {name = "Brianna Laugher"}, 16 {name = "Florian Bruhin"}, 17 {name = "Others (See AUTHORS)"}, 18 ] 19 requires-python = ">=3.8" 20 classifiers = [ 21 "Development Status :: 6 - Mature", 22 "Intended Audience :: Developers", 23 "License :: OSI Approved :: MIT License", 24 "Operating System :: MacOS", 25 "Operating System :: Microsoft :: Windows", 26 "Operating System :: POSIX", 27 "Operating System :: Unix", 28 "Programming Language :: Python :: 3 :: Only", 29 "Programming Language :: Python :: 3.8", 30 "Programming Language :: Python :: 3.9", 31 "Programming Language :: Python :: 3.10", 32 "Programming Language :: Python :: 3.11", 33 "Programming Language :: Python :: 3.12", 34 "Programming Language :: Python :: 3.13", 35 "Topic :: Software Development :: Libraries", 36 "Topic :: Software Development :: Testing", 37 "Topic :: Utilities", 38 ] 39 dynamic = [ 40 "version", 41 ] 42 dependencies = [ 43 'colorama; sys_platform == "win32"', 44 'exceptiongroup>=1.0.0rc8; python_version < "3.11"', 45 "iniconfig", 46 "packaging", 47 "pluggy<2.0,>=1.5", 48 'tomli>=1; python_version < "3.11"', 49 ] 50 [project.optional-dependencies] 51 dev = [ 52 "argcomplete", 53 "attrs>=19.2", 54 "hypothesis>=3.56", 55 "mock", 56 "pygments>=2.7.2", 57 "requests", 58 "setuptools", 59 "xmlschema", 60 ] 61 [project.urls] 62 Changelog = "https://docs.pytest.org/en/stable/changelog.html" 63 Homepage = "https://docs.pytest.org/en/latest/" 64 Source = "https://github.com/pytest-dev/pytest" 65 Tracker = "https://github.com/pytest-dev/pytest/issues" 66 Twitter = "https://twitter.com/pytestdotorg" 67 [project.scripts] 68 "py.test" = "pytest:console_main" 69 pytest = "pytest:console_main" 70 71 [build-system] 72 build-backend = "setuptools.build_meta" 73 requires = [ 74 "setuptools>=61", 75 "setuptools-scm[toml]>=6.2.3", 76 ] 77 78 [tool.setuptools.package-data] 79 "_pytest" = ["py.typed"] 80 "pytest" = ["py.typed"] 81 82 [tool.setuptools_scm] 83 write_to = "src/_pytest/_version.py" 84 85 [tool.black] 86 target-version = ['py38'] 87 88 [tool.ruff] 89 src = ["src"] 90 line-length = 88 91 92 [tool.ruff.format] 93 docstring-code-format = true 94 95 [tool.ruff.lint] 96 select = [ 97 "B", # bugbear 98 "D", # pydocstyle 99 "E", # pycodestyle 100 "F", # pyflakes 101 "I", # isort 102 "PYI", # flake8-pyi 103 "UP", # pyupgrade 104 "RUF", # ruff 105 "W", # pycodestyle 106 "PIE", # flake8-pie 107 "PGH004", # pygrep-hooks - Use specific rule codes when using noqa 108 "PLE", # pylint error 109 "PLW", # pylint warning 110 "PLR1714", # Consider merging multiple comparisons 111 ] 112 ignore = [ 113 # bugbear ignore 114 "B004", # Using `hasattr(x, "__call__")` to test if x is callable is unreliable. 115 "B007", # Loop control variable `i` not used within loop body 116 "B009", # Do not call `getattr` with a constant attribute value 117 "B010", # [*] Do not call `setattr` with a constant attribute value. 118 "B011", # Do not `assert False` (`python -O` removes these calls) 119 "B028", # No explicit `stacklevel` keyword argument found 120 # pycodestyle ignore 121 # pytest can do weird low-level things, and we usually know 122 # what we're doing when we use type(..) is ... 123 "E721", # Do not compare types, use `isinstance()` 124 # pydocstyle ignore 125 "D100", # Missing docstring in public module 126 "D101", # Missing docstring in public class 127 "D102", # Missing docstring in public method 128 "D103", # Missing docstring in public function 129 "D104", # Missing docstring in public package 130 "D105", # Missing docstring in magic method 131 "D106", # Missing docstring in public nested class 132 "D107", # Missing docstring in `__init__` 133 "D209", # [*] Multi-line docstring closing quotes should be on a separate line 134 "D205", # 1 blank line required between summary line and description 135 "D400", # First line should end with a period 136 "D401", # First line of docstring should be in imperative mood 137 "D402", # First line should not be the function's signature 138 "D404", # First word of the docstring should not be "This" 139 "D415", # First line should end with a period, question mark, or exclamation point 140 # ruff ignore 141 "RUF012", # Mutable class attributes should be annotated with `typing.ClassVar` 142 # pylint ignore 143 "PLW0603", # Using the global statement 144 "PLW0120", # remove the else and dedent its contents 145 "PLW2901", # for loop variable overwritten by assignment target 146 "PLR5501", # Use `elif` instead of `else` then `if` 147 ] 148 149 [tool.ruff.lint.pycodestyle] 150 # In order to be able to format for 88 char in ruff format 151 max-line-length = 120 152 153 [tool.ruff.lint.pydocstyle] 154 convention = "pep257" 155 156 [tool.ruff.lint.isort] 157 force-single-line = true 158 combine-as-imports = true 159 force-sort-within-sections = true 160 order-by-type = false 161 known-local-folder = ["pytest", "_pytest"] 162 lines-after-imports = 2 163 164 [tool.ruff.lint.per-file-ignores] 165 "src/_pytest/_py/**/*.py" = ["B", "PYI"] 166 "src/_pytest/_version.py" = ["I001"] 167 "testing/python/approx.py" = ["B015"] 168 169 [tool.pylint.main] 170 # Maximum number of characters on a single line. 171 max-line-length = 120 172 disable= [ 173 "abstract-method", 174 "arguments-differ", 175 "arguments-renamed", 176 "assigning-non-slot", 177 "attribute-defined-outside-init", 178 "bad-classmethod-argument", 179 "bad-mcs-method-argument", 180 "broad-exception-caught", 181 "broad-exception-raised", 182 "cell-var-from-loop", 183 "comparison-of-constants", 184 "comparison-with-callable", 185 "comparison-with-itself", 186 "condition-evals-to-constant", 187 "consider-using-dict-items", 188 "consider-using-enumerate", 189 "consider-using-from-import", 190 "consider-using-f-string", 191 "consider-using-in", 192 "consider-using-sys-exit", 193 "consider-using-ternary", 194 "consider-using-with", 195 "cyclic-import", 196 "disallowed-name", 197 "duplicate-code", 198 "eval-used", 199 "exec-used", 200 "expression-not-assigned", 201 "fixme", 202 "global-statement", 203 "implicit-str-concat", 204 "import-error", 205 "import-outside-toplevel", 206 "inconsistent-return-statements", 207 "invalid-bool-returned", 208 "invalid-name", 209 "invalid-repr-returned", 210 "invalid-str-returned", 211 "keyword-arg-before-vararg", 212 "line-too-long", 213 "method-hidden", 214 "misplaced-bare-raise", 215 "missing-docstring", 216 "missing-timeout", 217 "multiple-statements", 218 "no-else-break", 219 "no-else-continue", 220 "no-else-raise", 221 "no-else-return", 222 "no-member", 223 "no-name-in-module", 224 "no-self-argument", 225 "not-an-iterable", 226 "not-callable", 227 "pointless-exception-statement", 228 "pointless-statement", 229 "pointless-string-statement", 230 "protected-access", 231 "raise-missing-from", 232 "redefined-argument-from-local", 233 "redefined-builtin", 234 "redefined-outer-name", 235 "reimported", 236 "simplifiable-condition", 237 "simplifiable-if-expression", 238 "singleton-comparison", 239 "superfluous-parens", 240 "super-init-not-called", 241 "too-few-public-methods", 242 "too-many-ancestors", 243 "too-many-arguments", 244 "too-many-branches", 245 "too-many-function-args", 246 "too-many-instance-attributes", 247 "too-many-lines", 248 "too-many-locals", 249 "too-many-nested-blocks", 250 "too-many-public-methods", 251 "too-many-return-statements", 252 "too-many-statements", 253 "try-except-raise", 254 "typevar-name-incorrect-variance", 255 "unbalanced-tuple-unpacking", 256 "undefined-loop-variable", 257 "undefined-variable", 258 "unexpected-keyword-arg", 259 "unidiomatic-typecheck", 260 "unnecessary-comprehension", 261 "unnecessary-dunder-call", 262 "unnecessary-lambda", 263 "unnecessary-lambda-assignment", 264 "unpacking-non-sequence", 265 "unspecified-encoding", 266 "unsubscriptable-object", 267 "unused-argument", 268 "unused-import", 269 "unused-variable", 270 "used-before-assignment", 271 "use-dict-literal", 272 "use-implicit-booleaness-not-comparison", 273 "use-implicit-booleaness-not-len", 274 "useless-else-on-loop", 275 "useless-import-alias", 276 "useless-return", 277 "use-maxsplit-arg", 278 "using-constant-test", 279 "wrong-import-order", 280 ] 281 282 [tool.check-wheel-contents] 283 # check-wheel-contents is executed by the build-and-inspect-python-package action. 284 # W009: Wheel contains multiple toplevel library entries 285 ignore = "W009" 286 287 [tool.pyproject-fmt] 288 indent = 4 289 290 [tool.pytest.ini_options] 291 minversion = "2.0" 292 addopts = "-rfEX -p pytester --strict-markers" 293 python_files = ["test_*.py", "*_test.py", "testing/python/*.py"] 294 python_classes = ["Test", "Acceptance"] 295 python_functions = ["test"] 296 # NOTE: "doc" is not included here, but gets tested explicitly via "doctesting". 297 testpaths = ["testing"] 298 norecursedirs = [ 299 "testing/example_scripts", 300 ".*", 301 "build", 302 "dist", 303 ] 304 xfail_strict = true 305 filterwarnings = [ 306 "error", 307 "default:Using or importing the ABCs:DeprecationWarning:unittest2.*", 308 # produced by older pyparsing<=2.2.0. 309 "default:Using or importing the ABCs:DeprecationWarning:pyparsing.*", 310 "default:the imp module is deprecated in favour of importlib:DeprecationWarning:nose.*", 311 # distutils is deprecated in 3.10, scheduled for removal in 3.12 312 "ignore:The distutils package is deprecated:DeprecationWarning", 313 # produced by pytest-xdist 314 "ignore:.*type argument to addoption.*:DeprecationWarning", 315 # produced on execnet (pytest-xdist) 316 "ignore:.*inspect.getargspec.*deprecated, use inspect.signature.*:DeprecationWarning", 317 # pytest's own futurewarnings 318 "ignore::pytest.PytestExperimentalApiWarning", 319 # Do not cause SyntaxError for invalid escape sequences in py37. 320 # Those are caught/handled by pyupgrade, and not easy to filter with the 321 # module being the filename (with .py removed). 322 "default:invalid escape sequence:DeprecationWarning", 323 # ignore not yet fixed warnings for hook markers 324 "default:.*not marked using pytest.hook.*", 325 "ignore:.*not marked using pytest.hook.*::xdist.*", 326 # ignore use of unregistered marks, because we use many to test the implementation 327 "ignore::_pytest.warning_types.PytestUnknownMarkWarning", 328 # https://github.com/benjaminp/six/issues/341 329 "ignore:_SixMetaPathImporter\\.exec_module\\(\\) not found; falling back to load_module\\(\\):ImportWarning", 330 # https://github.com/benjaminp/six/pull/352 331 "ignore:_SixMetaPathImporter\\.find_spec\\(\\) not found; falling back to find_module\\(\\):ImportWarning", 332 # https://github.com/pypa/setuptools/pull/2517 333 "ignore:VendorImporter\\.find_spec\\(\\) not found; falling back to find_module\\(\\):ImportWarning", 334 # https://github.com/pytest-dev/execnet/pull/127 335 "ignore:isSet\\(\\) is deprecated, use is_set\\(\\) instead:DeprecationWarning", 336 ] 337 pytester_example_dir = "testing/example_scripts" 338 markers = [ 339 # dummy markers for testing 340 "foo", 341 "bar", 342 "baz", 343 # conftest.py reorders tests moving slow ones to the end of the list 344 "slow", 345 # experimental mark for all tests using pexpect 346 "uses_pexpect", 347 ] 348 349 [tool.towncrier] 350 package = "pytest" 351 package_dir = "src" 352 filename = "doc/en/changelog.rst" 353 directory = "changelog/" 354 title_format = "pytest {version} ({project_date})" 355 template = "changelog/_template.rst" 356 357 [[tool.towncrier.type]] 358 directory = "breaking" 359 name = "Breaking Changes" 360 showcontent = true 361 362 [[tool.towncrier.type]] 363 directory = "deprecation" 364 name = "Deprecations" 365 showcontent = true 366 367 [[tool.towncrier.type]] 368 directory = "feature" 369 name = "Features" 370 showcontent = true 371 372 [[tool.towncrier.type]] 373 directory = "improvement" 374 name = "Improvements" 375 showcontent = true 376 377 [[tool.towncrier.type]] 378 directory = "bugfix" 379 name = "Bug Fixes" 380 showcontent = true 381 382 [[tool.towncrier.type]] 383 directory = "vendor" 384 name = "Vendored Libraries" 385 showcontent = true 386 387 [[tool.towncrier.type]] 388 directory = "doc" 389 name = "Improved Documentation" 390 showcontent = true 391 392 [[tool.towncrier.type]] 393 directory = "trivial" 394 name = "Trivial/Internal Changes" 395 showcontent = true 396 397 [tool.mypy] 398 files = ["src", "testing", "scripts"] 399 mypy_path = ["src"] 400 check_untyped_defs = true 401 disallow_any_generics = true 402 disallow_untyped_defs = true 403 ignore_missing_imports = true 404 show_error_codes = true 405 strict_equality = true 406 warn_redundant_casts = true 407 warn_return_any = true 408 warn_unreachable = true 409 warn_unused_configs = true 410 no_implicit_reexport = true 411 warn_unused_ignores = true