1target-version = "py314"
2
3# Ruff's default rules are deliberately in play — when a new ruff version
4# expands them, we address what it finds rather than freezing the set.
5# Determinism comes from plain-code's bounded ruff dependency: everyone on
6# the same plain-code release lints with the same ruff.
7
8[lint]
9extend-select = [
10 "ISC", # flake8-implicit-str-concat
11 "PT", # pytest
12]
13ignore = [
14 "ISC001", # Implicit string concatenation (conflicts with the formatter)
15 # getattr/setattr with a literal name is how dynamic-attribute code stays
16 # honest with the type checker — the "fix" trades a lint for a ty error.
17 "B009", # get-attr-with-constant
18 "B010", # set-attr-with-constant
19 # Broad catches at error boundaries and in best-effort cleanup are design,
20 # not accidents — narrow where the failure set is known, and comment the
21 # rest in place. Flagging every boundary would just breed noqa comments.
22 "BLE001", # blind-except
23 "S110", # try-except-pass
24 "S112", # try-except-continue
25]