flake8-carrot 0.1.9
A plugin for Flake8; Ensuring that your Python code adheres to CarrotManMatt's opinionated style guide.
Requires Python: >=3.14
Keywords: flake8, flake8-plugin, linter, python, static analysis

# flake8-carrot

![flake8-carrot](https://img.shields.io/badge/%F0%9F%A5%95-flake8-%2Dcarrot-blue)
![PyPI Version](https://img.shields.io/pypi/v/flake8-carrot)
![Python Version](https://img.shields.io/pypi/pyversions/flake8-carrot?logo=Python&logoColor=white&label=Python)
![flake8 Version](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Ftoml-version-finder.carrotmanmatt.com%2Flock%2FCarrotManMatt%2Fflake8-carrot%2Fflake8&query=%24.package_version&label=flake8)
![Tests Status](https://github.com/CarrotManMatt/flake8-carrot/actions/workflows/check-build-publish.yaml/badge.svg)
![mypy Status](https://img.shields.io/badge/mypy-checked-%232EBB4E&label=mypy)
![pre-commit Status](https://img.shields.io/badge/pre-%2Dcommit-enabled-brightgreen?logo=pre-commit)
![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)
![uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)

A [plugin](https://flake8.pycqa.org/en/latest/plugin-development) for [Flake8](https://flake8.pycqa.org);
Ensuring that your [Python](https://python.org) code adheres to [CarrotManMatt](https://carrotmanmatt.com)'s opinionated style guide

## Rules

* **`CAR101` - `missing-all-export`**\
Every module should have an `__all__` export at the top
* **`CAR102` - `multiple-all-exports`**\
Each module should have only a single `__all__` export
* **`CAR103` - `incorrect-all-export-annotation`**\
An `__all__` export should be annotated as `Sequence[str]`
* **`CAR104` - `incorrect-all-export-type`**\
A simple `__all__` export should be of type `tuple`, not `list`
* **`CAR105` - `invalid-line-above-all-export`**\
Only import statements and the module’s docstring are allowed above an `__all__` export
* **`CAR110` - `incorrect-newlines-after-all-export`**\
A double newline is required after an `__all__` export
* **`CAR111` - `incorrect-newlines-separating-preamble`**\
Preamble lines should be separated by a single newline
* **`CAR120` - `incorrect-whitespace-in-ignore-comment`**\
Whitespace in `type: ignore` & `pass:[noqa: ]` comments should follow the standard formatting conventions
* **`CAR121` - `trailing-commas-after-ignore-comment`**\
`type: ignore` comments should have no trailing commas
* **`CAR122` - `trailing-commas-after-ignore-comment`**\
A `pass:[noqa: ]` comment should be placed after a `type: ignore` comment on the same line
* **`CAR123` - `trailing-commas-after-ignore-comment`**\
Line comments should be placed before a `type: ignore` or `pass:[noqa: ]` comment
* **`CAR124` - `found-noinspection-comment`**\
IDE specific ignore comments (E.g. `# noinspection ...`) should be removed
* **`CAR130` - ...**\
_Reserved for lint rules related to literal string flags (`r`, `f`, `b`, `u` & `t`)._
* **`CAR140` - `unnecessary-str-strip`**\
Unnecessary uses of the `str.strip()` function should be removed
* **`CAR141` - `str-function-output-not-stored`**\
The result from calling a `str` function should always be stored in a variable
* **`CAR150` - `args-or-kwargs-in-function-definition`**\
Do not use `**args` or `***kwargs` in function definitions (where possible)
* **`CAR151` - `args-or-kwargs-passed-to-super`**\
Do not pass `**args` or `***kwargs` to `super()` methods
* **`CAR160` - `class-defined-inside-function`**\
Classes should only be defined at the module top-level or inside another class, (not inside a function)
* **`CAR161` - `content-in-abstract-method`**\
The body of abstract methods should only contain a docstring (or `pass` if the function is an overload or is private and has no docstring)
* **`CAR162` - `classproperty-not-all-caps`**\
Class-property names should be in all caps
* **`CAR162` - `init-not-marked-with-override`**\
`__init__()` methods should always be marked with `@override`
* **`CAR170` - `union-in-isinstance-or-issubclass`**\
Use tuples of types in calls to `isinstance()` or `issubclass` rather than type unions
* **`CAR180` - `repeated-bool-op`**\
Use `any()` rather than repeated `... or ...` clauses and `all()` rather than repeated `... and ..` clauses
* **`CAR201` - `incorrect-logger-assignment-annotation`**\
Assignment of a `logging.Logger` object to a variable should be annotated as `Final[Logger]`
* **`CAR202` - `logger-variable-name-missing-logger`**\
A `logging.Logger` variable’s name should contain the word 'logger'
* **`CAR301` - `invalid-characters-in-pycord-slash-command-or-option-name`**\
Pycord slash-command/option names should only contain valid characters
* **`CAR302` - `invalid-pycord-cog-subclass-name`**\
Pycord cog subclass' should have a name that ends with `CommandCog` or `CommandsCog` (depending upon the number of commands in the cog)
* **`CAR303` - `incorrectly-formatted-pycord-slash-command-or-option-name`**\
Pycord slash-command/option names should be lowercase and have words separated by hyphens
* **`CAR304` - `missing-full-stop-in-pycord-slash-command-or-option-description`**\
Pycord slash-command/option descriptions should end with a full stop
* **`CAR305` - `pycord-context-command-name-uncapitalised`**\
Pycord user/message context command names should be capitalised
* **`CAR401` - `found-astpretty-pprint`**\
Debugging calls to `astpretty.pprint()` should be removed
* **`CAR501` - `used-dataclass`**\
Classes should have their attributes declared manually without `dataclass` "magic"
* **`CAR601` - `used-re-match`**\
`re.fullmatch()` should be used instead of `re.match()`
* **`CAR602` - `used-re-search-with-line-anchors`**\
`re.fullmatch()` should be used instead of `re.search()` when using beginning and ending line anchors
* **`CAR610` - `non-raw-string-for-regex-pattern`**\
Regex pattern string literals should be written with raw (`r` strings)