Skip to content

v1.15.0 — 88 checks

Choose a tag to compare

@kratos0718 kratos0718 released this 20 Sep 15:40
· 21 commits to main since this release

18 new checks (CH071-CH088), bringing the total from 70 to 88.

Same discipline as every prior batch: every check verified empirically before implementation, corpus-scanned against ~30 real open-source frameworks, and narrowed against real false positives rather than shipped on first pass. Two candidate checks (enum member aliasing, bare-except swallowing asyncio.CancelledError) were built, corpus-scanned, and rejected outright — both independently rediscovered false-positive patterns this project had already rejected once before, using different real-world evidence. See docs/FINDINGS.md for the full precision notes.

New checks catch, among others:

  • A decorator's wrapper missing @functools.wraps — real hits across 17 projects
  • @abstractmethod on a class with no ABCMeta to enforce it — real hits across 17 more
  • A duplicate method definition silently shadowing the first
  • Dataclass/NamedTuple field ordering (kw_only, init=False, ClassVar, the KW_ONLY sentinel, all handled)
  • __slots__ conflicting with a class-level variable
  • Python 2 special methods (__nonzero__, __unicode__, ...) Python 3 silently never calls
  • A defaultdict subscript read as an if condition inserting the key as a side effect
  • json.dumps() on a raw datetime
  • A weakref to an object with no other reference
  • A regex flag landing in re.sub's count slot instead of flags

Zero runtime dependencies, verified via a fresh pip install into a clean venv.