» time flake8 .
flake8 . 8.56s user 0.54s system 898% cpu 1.013 total
Which is **2.4x** times faster!
Integrations
We also significantly improved all the integrations!
`WPS` can now be used as first-class `pre-commit` hook with:
yaml
repos:
- repo: https://github.com/wemake-services/wemake-python-styleguide
rev: 1.0.0
hooks:
- id: wemake-python-styleguide
Our [GitHub Action](https://github.com/marketplace/actions/wemake-python-styleguide) also got a lot of new options and fixes.
Removals
- **Breaking**: Drops `python3.9` support
- **Breaking**: Drops `nitpick` support
- **Breaking**: Drops `flake8-commas`, `flake8-isort`,
`flake8-debugger`, `flake8-string-format`, `flake8-quotes`,
`flake8-comprehensions`, `flake8-bugbear`, `flake8-docstrings`,
`flake8-eradicate`, `flake8-bandit`, `flake8-broken-line`,
`flake8-rst-docstrings`, `pep8-naming`
support, use `ruff format` and `ruff check` instead
- **Breaking**: Drops `darglint` support, because it is unmaintained
- **Breaking**: Removes `WPS113`, because is covered by `pylint` linter
- **Breaking**: Removes `WPS119`, because is covered by `pylint` linter
- **Breaking**: Removes `WPS125`, because it is covered by `ruff` linter
- **Breaking**: Removes `WPS302`, because it is covered by `ruff` formatter
- **Breaking**: Removes `WPS304`, because it is covered by `ruff` formatter
- **Breaking**: Removes `WPS305`, because it is covered by `ruff` formatter
- **Breaking**: Removes `WPS306`, because it is covered by `ruff` formatter
- **Breaking**: Removes `WPS309`, because it is covered by `ruff` formatter
- **Breaking**: Removes `WPS310`, because it is covered by `ruff` formatter
- **Breaking**: Removes `WPS313`, because it is covered by `ruff` formatter
- **Breaking**: Removes `WPS315`, because it is covered by `ruff` formatter
- **Breaking**: Removes `WPS316`, because it is covered by `ruff` linter
- **Breaking**: Removes `WPS317`, because it is covered by `ruff` formatter
- **Breaking**: Removes `WPS318`, because it is covered by `ruff` formatter
- **Breaking**: Removes `WPS319`, because it is covered by `ruff` formatter
- **Breaking**: Removes `WPS320`, because it is covered by `ruff` formatter
- **Breaking**: Removes `WPS323`, because it is covered by `ruff` formatter
- **Breaking**: Removes `WPS326`, because it is covered by `ruff` linter
- **Breaking**: Removes `WPS329`, because it is covered by `ruff` linter
- **Breaking**: Removes `WPS331`, because it is covered by `ruff` linter
- **Breaking**: Removes `WPS333`, because is covered by `pylint` linter
- **Breaking**: Removes `WPS337`, because it is covered by `ruff` formatter
- **Breaking**: Removes `WPS340`, because it is covered by `ruff` formatter
- **Breaking**: Removes `WPS341`, because it is covered by `ruff` formatter
- **Breaking**: Removes `WPS343`, because it is covered by `ruff` formatter
- **Breaking**: Removes `WPS348`, because it conflicts with `ruff` formatter
- **Breaking**: Removes `WPS351`, because it is covered by `ruff` linter
- **Breaking**: Removes `WPS352`, because it is covered by `ruff` formatter
- **Breaking**: Removes `WPS355`, because it is covered by `ruff` formatter
- **Breaking**: Removes `WPS360`, because it is covered by `ruff` formatter
- **Breaking**: Removes `WPS361`, because it is covered by `ruff` formatter
- **Breaking**: Removes `WPS415`, because is covered by `ruff` linter
- **Breaking**: Removes `WPS417`, because is covered by `ruff` linter
- **Breaking**: Removes `WPS419`, because is covered by `ruff` linter
- **Breaking**: Removes `WPS423`, because is covered by `ruff` linter
- **Breaking**: Removes `WPS424`, because is covered by `ruff` linter
- **Breaking**: Removes `WPS425`, because is covered by `ruff` linter
- **Breaking**: Removes `WPS428`, because is covered by `ruff` linter
- **Breaking**: Removes `WPS433`, because is covered by `pylint` linter
- **Breaking**: Removes `WPS434`, because is covered by `pylint` linter
- **Breaking**: Removes `WPS436`, because is covered by `pylint` linter
- **Breaking**: Removes `WPS437`, because is covered by `ruff` linter
- **Breaking**: Removes `WPS440`, because
it was buggy and is covered by `mypy`, 3209
- **Breaking**: Removes `WPS442`, because
it was buggy and is covered by `mypy`, 3209
- **Breaking**: Removes `WPS450`, because is covered by `pylint` linter
- **Breaking**: Removes `WPS452`, because is covered by `ruff` linter
- **Breaking**: Removes `WPS454`, because is covered by `ruff` linter
- **Breaking**: Removes `WPS456`, because is covered by `ruff` linter
- **Breaking**: Removes `WPS465`, because `|` is now heavily used by typing
- **Breaking**: Removes `WPS467`, because is covered by `pylint` linter
- **Breaking**: Removes `WPS502`, because is covered by `ruff` linter
- **Breaking**: Removes `WPS503`, because is covered by `ruff` linter
- **Breaking**: Removes `WPS507`, because is covered by `pylint` linter
- **Breaking**: Removes `WPS508`, because is covered by `ruff` linter
- **Breaking**: Removes `WPS510`, because is covered by `pylint` linter
- **Breaking**: Removes `WPS514`, because is covered by `pylint` linter
- **Breaking**: Removes `WPS528`, because is covered by `pylint` linter
- **Breaking**: Removes `WPS525`, because is covered by `ruff` linter
- **Breaking**: Removes `WPS526`, because is covered by `ruff` linter
- **Breaking**: Removes `WPS521`, because is covered by `ruff` linter
- **Breaking**: Removes `WPS609`, because is covered by `pylint` linter
- **Breaking**: Removes `--i-control-code` setting,
if you want to disable some violations, just use ` noqa` or `--ignore`
with code that you want to exclude, there's no need
to create one more way of disabling some specific violations
Features
- Adds official `python3.13` support
- Allows any compares in `assert` statements for `WPS520`, 3112
- Allows walrus operator (`:=`) in comprehesions, 3121
- Allows `pass` in `case` bodies, 2642
- Allows subclassing builtins in `WPS600`, when creating an `Enum`, 2506
- Allows using variables after blocks for `WPS441` in `assert` statements, 2543
- Does not count `self`, `cls`, and `mcs` as arguments
for `WPS211` complexity check anymore, 2394
- Allows underscores (`_`) with exactly 3 digits after it in `WPS303`, 3120
- Allows class / instance attribute shadowing
in `dataclass`es for `WPS601`, 1926
- Allows any number of instance attributes on `dataclass`es in `WPS230`, 2448
- Allows any number of function parameters
in `overload` definitions for `WPS211`, 1957
- Allows using multiline strings when placed on separate lines, 3056
- Allows using `hasattr` builtin function, 2228
- Disallows using `is not` and `not in` as negated conditions in `WPS504`, 2617
- Allows all branches in `if/elif/else` to be negated in `WPS504`, 2617
- Adds a new rule to forbid `lambda` assigns to special attributes, 1733
- Adds a new rule to check problematic function params, 1343
- Adds a new rule to detect duplicate conditions in `if`s and `elif`s, 2241
- Adds a new rule to detect duplicate `case` pattens in `match`, 3206
- Adds a new rule to find too many `match` subjects, 3201
- Adds a new rule to detect too many `case` statements, 3202
- Adds a new rule to find too complex `except` with too many exceptions
- Adds a new rule to find too many `PEP695` type params
- Adds a new rule to find useless ternary expressions, 1706
- Adds a new rule to forbid `raise SystemExit`, use `sys.exit` instead, 1786
- Adds a new rule to forbid extra syntax in `match ...` subjects, 3217
- Adds new `--allowed-module-metadata` and `--forbidden-module-metadata`
configuration options for `WPS410`, 3060
- Now `--allowed-domain-names` also affect `WPS11`
to allow custom short variable names, 2554
- Adds support to run `wemake-python-styleguide` as a `pre-commit` hook, 2588
- GitHub Action can now use `cwd:` parameter to specify
where your configuration file is, 2474
- GitHub Action can now use `fail_workflow:` parameter to not fail
the workflow even if the check did find any issues
- GitHub Action can now use `filter_mode:` parameter to specify
how ReviewDog will filter found violations,
see https://github.com/reviewdog/reviewdog#filter-mode 2239
Bugfixes
- Fixes `WPS217` to allow simple calls in `f` strings, 3150
- Fixes `WPS217` not to raise on empty `f` strings,
because `ruff check` handles that now for us
- Fixes `OverusedStringViolation` not to include `'...'` string
- Removes `astor` package in favour of `ast.unparse`
- Fixes `WPS210` to not count nested local variables in nested scopes 3108
- Fixes `IterableUnpackingViolation` with generic types and `TypeVarTuple`
- Fixes `WPS469` detecting incorrect names of raised exceptions, 3109
- Fixes unnormalized paths in formatter output
- Fixes `WPS221` to ignore PEP695's `TypeAlias` from line complexity checks
- Fixes `WPS474` to only count import collisions in the same context, 2962
- Fixes `WPS612` to count defaults in function definitions, 2478
- Fixes several bugs in `WPS322` with multiline strings detection
- Fixes several violations not been detected in `case:` statements
- Fixes `WPS314` not detecting `match` statements
- Fixes `match` + `case` does not increase cognitive complexity
Misc
- Integration with `ondivi` doc for legacy codebases
- Fixes a documentation error for the Formatter (Showing statistic) section
- Source code is now formatted with `ruff`
- Removes deprecated `ast` nodes from code:
`ast.Num`, `ast.Bytes`, `ast.Str`, `ast.NamedConstant`, etc