-
-
Notifications
You must be signed in to change notification settings - Fork 10.8k
Expand file tree
/
Copy pathruff-tests.toml
More file actions
36 lines (34 loc) · 2.25 KB
/
Copy pathruff-tests.toml
File metadata and controls
36 lines (34 loc) · 2.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# Lint config for the test tree, which ruff.toml excludes from `ruff check`.
#
# Every rule here catches a test that cannot fail. Rules land one at a time, each
# with its existing violations already fixed, so this list never needs a budget
# file or a ratchet.
#
# F821 a name that does not exist raises NameError, and a test body wrapped in
# `except Exception: pass` swallows that NameError and reports green
# B011 `assert False` inside `try:` raises AssertionError, which the `except
# Exception` below it catches. `pytest.fail` raises BaseException and escapes
# PT015 same site as B011, from the pytest ruleset
# B015 a bare `a == b` statement is evaluated and thrown away; the missing `assert`
# means the test checks nothing
# B018 a bare attribute access or literal, usually a call missing its parens
# PLW0127 `x = x` self-assignment, dead code that reads like a narrowing or a fixup
# PLR0133 comparison of two constants, e.g. `assert True == True`
# B017 `pytest.raises(Exception)` accepts the TypeError a refactor introduced just as
# readily as the rejection under test, so a crash reads as a pass. Narrow to the
# real type, or add `match=` where the code genuinely raises a bare Exception
# PT012 a `pytest.raises` block that runs on past the raising call. Everything after
# that call is dead, so an `assert` sitting there is never checked. Keep the
# block to the call itself and put the assertions below it
# PT011 `pytest.raises(Exception)` / `(ValueError)` / `(OSError)` with no `match=`. The
# block passes on any error that broad, so the TypeError a refactor introduced
# reads as the rejection under test. Pin the message the code actually raises
# PT014 the same `parametrize` case listed twice. The copy re-runs an assertion that
# already passed and adds no coverage, and it usually marks a case someone meant
# to vary and forgot to edit
#
# No target-version here on purpose: it resolves from requires-python (>=3.10), so
# 3.11-only builtins like BaseExceptionGroup are correctly flagged in a tree that
# still has to run on 3.10.
line-length = 120
lint.select = ["F821", "B011", "B015", "B017", "B018", "PT011", "PT012", "PT014", "PT015", "PLR0133", "PLW0127"]