astral-sh / ruff

An extremely fast Python linter and code formatter, written in Rust.
https://docs.astral.sh/ruff
MIT License
33.23k stars 1.11k forks source link

Add default linter rules #11415

Open AndreuCodina opened 6 months ago

AndreuCodina commented 6 months ago

In my company we have lots of microservices and nanoservices, and a Python project prototype I maintain to guide how Python projects must be developed and updated. It's a common complaint not to have default rules in our pyproject.toml files, and instead have "magic letters" just because "I chose them". My job is to ensure data engineers develop software as we do in .NET, i.e. with types.

I want to propose a group of default linter rules, and choose them with groups (letters), instead of choosing a subset.

pyproject.toml

[tool.ruff.lint]
select = ["F", "E", "W", "N", "I", "ANN"]
ignore = ["E501", "ANN101", "ANN102", "ANN401"]

Reasoning of select:

Reasoning of ignore:

Besides, I always use this configuration:

[tool.pyright]
typeCheckingMode = "strict"
zanieb commented 6 months ago

Hi!

We're going to recategorize all of the rules (roughly discussed in https://github.com/astral-sh/ruff/issues/1774) and define new defaults eventually. We're actively working on this, but I'm not sure when we'll be done because it's a big project and we want to get it right.

zanieb commented 6 months ago

Similarly, this request fits into https://github.com/astral-sh/ruff/issues/1773 which is a part of that effort.

dhruvmanila commented 6 months ago

@zanieb Do you think this can be merged into either of the linked issue?

zanieb commented 6 months ago

I'm okay with keeping it open for now unless there's a duplicate issue regarding defaults.

We should add a dedicated tracking issue for the full re-categorization work eventually.

AndreuCodina commented 3 months ago

Should we include default rules for some project types? For instance, there're FastAPI rules (https://docs.astral.sh/ruff/rules/#fastapi-fast). It's a library very used, but I don't know if Ruff knows if a package (fastapi in this case) is installed and then it doesn't waste resources with those rules.

AndreuCodina commented 1 month ago

Idea: how about declaring the rule "strict" as an alias for the linter rules I posted?

[tool.ruff.lint]
select = ["strict"]

This aligns with Pyright:

[tool.pyright]
typeCheckingMode = "strict"
Avasam commented 1 month ago

I'll link to https://github.com/astral-sh/ruff/issues/12352 and https://github.com/astral-sh/ruff/discussions/3363#discussioncomment-7266932 as well. With which you could make your own custom defaults for your needs and "levels of strictness"