mirror of
https://github.com/astral-sh/ruff.git
synced 2026-10-28 10:45:37 +08:00
Co-authored-by: astral-automations-bot[bot] <305554984+astral-automations-bot[bot]@users.noreply.github.com> Co-authored-by: Brent Westbrook <brentrwestbrook@gmail.com>
351 lines
10 KiB
TOML
351 lines
10 KiB
TOML
[build-system]
|
|
requires = ["maturin>=1.9.3,<2.0"]
|
|
build-backend = "maturin"
|
|
|
|
[project]
|
|
name = "ruff"
|
|
version = "0.17.0"
|
|
description = "An extremely fast Python linter and code formatter, written in Rust."
|
|
authors = [{ name = "Astral Software Inc.", email = "hey@astral.sh" }]
|
|
readme = "README.md"
|
|
requires-python = ">=3.7"
|
|
license = "MIT"
|
|
license-files = ["LICENSE"]
|
|
keywords = [
|
|
"automation",
|
|
"flake8",
|
|
"pycodestyle",
|
|
"pyflakes",
|
|
"pylint",
|
|
"clippy",
|
|
]
|
|
classifiers = [
|
|
"Development Status :: 5 - Production/Stable",
|
|
"Environment :: Console",
|
|
"Intended Audience :: Developers",
|
|
"Operating System :: OS Independent",
|
|
"Programming Language :: Python",
|
|
"Programming Language :: Python :: 3.7",
|
|
"Programming Language :: Python :: 3.8",
|
|
"Programming Language :: Python :: 3.9",
|
|
"Programming Language :: Python :: 3.10",
|
|
"Programming Language :: Python :: 3.11",
|
|
"Programming Language :: Python :: 3.12",
|
|
"Programming Language :: Python :: 3.13",
|
|
"Programming Language :: Python :: 3.14",
|
|
"Programming Language :: Python :: 3.15",
|
|
"Programming Language :: Python :: 3 :: Only",
|
|
"Programming Language :: Rust",
|
|
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
"Topic :: Software Development :: Quality Assurance",
|
|
]
|
|
|
|
[project.urls]
|
|
Repository = "https://github.com/astral-sh/ruff"
|
|
Documentation = "https://docs.astral.sh/ruff/"
|
|
Changelog = "https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md"
|
|
|
|
[tool.maturin]
|
|
bindings = "bin"
|
|
manifest-path = "crates/ruff/Cargo.toml"
|
|
module-name = "ruff"
|
|
python-source = "python"
|
|
strip = true
|
|
exclude = [
|
|
"crates/ruff_linter/resources/test/fixtures/**/*",
|
|
"crates/ruff_linter/src/rules/*/snapshots/**/*"
|
|
]
|
|
|
|
[dependency-groups]
|
|
dev = [
|
|
"astral-dev-toolchain-cargo-codspeed>=5.0.1",
|
|
"astral-dev-toolchain-cargo-deny>=0.20.2",
|
|
"astral-dev-toolchain-cargo-fuzz>=0.13.2",
|
|
"astral-dev-toolchain-cargo-insta>=1.48.0",
|
|
"astral-dev-toolchain-cargo-nextest>=0.9.143",
|
|
"astral-dev-toolchain-cargo-shear>=1.13.4",
|
|
"astral-dev-toolchain-hyperfine>=2.0.0",
|
|
"prek==0.5.2",
|
|
]
|
|
release = [
|
|
"rooster==0.1.1",
|
|
]
|
|
docs = [
|
|
"mkdocs>=1.6.1",
|
|
"mkdocs-github-admonitions-plugin>=0.1.1",
|
|
"mkdocs-llmstxt>=0.2.0",
|
|
"mkdocs-material>=9.7.7",
|
|
"mkdocs-redirects>=1.2.3",
|
|
"pyyaml>=6.0.3",
|
|
]
|
|
ty-ecosystem = [
|
|
"ecosystem-analyzer",
|
|
]
|
|
typeshed-docstrings = [
|
|
"docstring-adder",
|
|
]
|
|
typeshed-formatting = [
|
|
"black",
|
|
]
|
|
|
|
[tool.uv]
|
|
no-build = true
|
|
# By default, uv records all `exclude-newer-package` exemptions in the lockfile for
|
|
# every script in the repo, even when the corresponding package is not in the
|
|
# lockfile for that script. This preview feature omits those entries, so changes
|
|
# to unrelated exemptions don't cause script lockfiles to be updated when refreshed.
|
|
# https://docs.astral.sh/uv/concepts/preview/#missing-exclude-newer-package-lock
|
|
preview-features = ["missing-exclude-newer-package-lock"]
|
|
# The `missing-exclude-newer-package-lock` preview feature requires uv 0.12.10 or later.
|
|
# Before uv 0.12.10, adding an unrelated `exclude-newer-package` exemption could
|
|
# also cause uv to update a script's lockfile the next time the script was run,
|
|
# leading to unexpected lockfile changes in PRs.
|
|
required-version = ">=0.12.10"
|
|
# CI installs the local ecosystem runner and tools pinned to Git revisions.
|
|
no-binary-package = [
|
|
"black",
|
|
"docstring-adder",
|
|
"ecosystem-analyzer",
|
|
"mypy-primer",
|
|
"ruff-ecosystem",
|
|
"typeshed-client",
|
|
]
|
|
# Pin the isolated build environment for source-build exceptions.
|
|
#
|
|
# docstring-adder uses flit-core as its build backend and pins it in its own
|
|
# build-system requirements, so we don't need to pin it here. A separate pin
|
|
# here would also make updating docstring-adder more cumbersome: if its
|
|
# flit-core pin changed, the conflicting pins would cause the build to fail
|
|
# until the pin here was updated to match.
|
|
build-constraint-dependencies = [
|
|
"hatch-fancy-pypi-readme==25.1.0",
|
|
"hatch-vcs==0.5.0",
|
|
"hatchling==1.32.0",
|
|
"packaging==26.3",
|
|
"pathspec==1.1.1",
|
|
"pluggy==1.6.0",
|
|
"setuptools==84.0.0",
|
|
"setuptools-scm==10.2.1",
|
|
"tomli==2.4.1; python_version < '3.11'",
|
|
"tomlkit==0.15.1",
|
|
"trove-classifiers==2026.6.1.19",
|
|
"typing-extensions==4.16.0; python_version < '3.11'",
|
|
"uv-build==0.12.3",
|
|
"vcs-versioning==2.2.4",
|
|
"wheel==0.47.0",
|
|
]
|
|
exclude-newer = "P7D"
|
|
|
|
[tool.uv.exclude-newer-package]
|
|
astral-dev-toolchain-cargo-deny = "2026-09-15T19:10:00Z"
|
|
astral-dev-toolchain-hyperfine = "2026-10-08T08:11:00Z"
|
|
astral-dev-toolchain-cargo-shear = "2026-08-27T00:00:00Z"
|
|
astral-dev-toolchain-cargo-codspeed = "2026-08-27T00:00:00Z"
|
|
astral-dev-toolchain-cargo-nextest = "2026-08-27T00:00:00Z"
|
|
astral-dev-toolchain-cargo-insta = "2026-08-27T00:00:00Z"
|
|
astral-dev-toolchain-cargo-fuzz = "2026-09-01T00:00:00Z"
|
|
|
|
[tool.uv.dependency-groups]
|
|
dev = { requires-python = ">=3.12" }
|
|
release = { requires-python = ">=3.12" }
|
|
docs = { requires-python = ">=3.12" }
|
|
ty-ecosystem = { requires-python = ">=3.13" }
|
|
typeshed-docstrings = { requires-python = ">=3.10" }
|
|
typeshed-formatting = { requires-python = ">=3.10" }
|
|
|
|
[tool.uv.sources]
|
|
docstring-adder = { git = "https://github.com/astral-sh/docstring-adder.git" }
|
|
# Switch to a released version once it includes
|
|
# https://github.com/psf/black/commit/f665703258bfa1916f8a6c1cbab0bc384b90cbac.
|
|
black = { git = "https://github.com/psf/black.git" }
|
|
# Keep scripts/setup_primer_project.py and its lockfile synchronized with
|
|
# ecosystem-analyzer's mypy-primer pin when updating its locked revision.
|
|
ecosystem-analyzer = { git = "https://github.com/astral-sh/ecosystem-analyzer" }
|
|
|
|
[tool.ruff]
|
|
target-version = "py38"
|
|
extend-exclude = [
|
|
"crates/ty_vendored/vendor/",
|
|
"crates/ruff/resources/",
|
|
"crates/ruff_linter/resources/",
|
|
"crates/ruff_python_formatter/resources/",
|
|
"crates/ruff_python_parser/resources/",
|
|
"crates/ruff_python_semantic/resources/"
|
|
]
|
|
|
|
[tool.ruff.lint]
|
|
preview = true
|
|
select = [
|
|
# Categories
|
|
"correctness",
|
|
"suspicious",
|
|
"complexity",
|
|
"performance",
|
|
"style",
|
|
|
|
# E # pycodestyle (error)
|
|
"ambiguous-class-name",
|
|
"ambiguous-function-name",
|
|
"ambiguous-variable-name",
|
|
"lambda-assignment",
|
|
"module-import-not-at-top-of-file",
|
|
"multiple-imports-on-one-line",
|
|
"multiple-leading-hashes-for-block-comment",
|
|
"no-indented-block",
|
|
"none-comparison",
|
|
"not-in-test",
|
|
"not-is-test",
|
|
"true-false-comparison",
|
|
"type-comparison",
|
|
"unexpected-indentation",
|
|
|
|
# F # pyflakes
|
|
"forward-annotation-syntax-error",
|
|
"undefined-local-with-import-star",
|
|
"undefined-local-with-import-star-usage",
|
|
|
|
# B # bugbear
|
|
"batched-without-explicit-strict",
|
|
"class-as-data-structure",
|
|
"map-without-explicit-strict",
|
|
"no-explicit-stacklevel",
|
|
"raise-without-from-inside-except",
|
|
"re-sub-positional-args",
|
|
"unused-loop-control-variable",
|
|
"zip-without-explicit-strict",
|
|
|
|
# C4 # flake8-comprehensions
|
|
"unnecessary-comprehension",
|
|
|
|
# SIM # flake8-simplify
|
|
"compare-with-tuple",
|
|
"dict-get-with-none-default",
|
|
"if-else-block-instead-of-dict-lookup",
|
|
"if-else-block-instead-of-if-exp",
|
|
"if-expr-with-twisted-arms",
|
|
"suppressible-exception",
|
|
"uncapitalized-environment-variables",
|
|
"yoda-conditions",
|
|
|
|
# I # isort
|
|
"missing-required-import",
|
|
|
|
# UP # pyupgrade
|
|
"convert-typed-dict-functional-to-class",
|
|
"redundant-open-modes",
|
|
|
|
# PGH # pygrep-hooks
|
|
"blanket-noqa",
|
|
"blanket-type-ignore",
|
|
|
|
# PYI # flake8-pyi
|
|
"argument-default-in-stub",
|
|
"collections-named-tuple",
|
|
"docstring-in-stub",
|
|
"numeric-literal-too-long",
|
|
"redundant-literal-union",
|
|
"string-or-bytes-too-long",
|
|
"typed-argument-default-in-stub",
|
|
"unsupported-method-call-on-all",
|
|
|
|
# RUF
|
|
"ambiguous-unicode-character-comment",
|
|
"ambiguous-unicode-character-docstring",
|
|
"ambiguous-unicode-character-string",
|
|
"asyncio-dangling-task",
|
|
"collection-literal-concatenation",
|
|
"incorrectly-parenthesized-tuple-in-subscript",
|
|
"non-empty-init-module",
|
|
"noqa-comments",
|
|
"parenthesize-chained-operators",
|
|
"rule-codes-in-selectors",
|
|
"unnecessary-assign-before-yield",
|
|
"unraw-re-pattern",
|
|
"unused-async",
|
|
"used-dummy-variable",
|
|
|
|
# S
|
|
"subprocess-popen-with-shell-equals-true",
|
|
]
|
|
|
|
ignore = [
|
|
# only relevant if you run a script with `python -0`,
|
|
# which seems unlikely for any of the scripts in this repo
|
|
"assert-false",
|
|
# Leave it to the formatter to split long lines and
|
|
# the judgement of all of us.
|
|
"line-too-long",
|
|
# This is often more readable in our scripts.
|
|
"repeated-append",
|
|
]
|
|
|
|
[tool.ruff.lint.isort]
|
|
required-imports = ["from __future__ import annotations"]
|
|
combine-as-imports = true
|
|
|
|
[tool.ruff.per-file-target-version]
|
|
"crates/ty_python_semantic/mdtest.py" = "py310"
|
|
"crates/ty_vendored/ty_extensions/*.pyi" = "py312"
|
|
"scripts/*.py" = "py312"
|
|
|
|
[tool.black]
|
|
force-exclude = '''
|
|
/(
|
|
| crates/ty_vendored/vendor
|
|
| crates/ruff_linter/resources
|
|
| crates/ruff_python_formatter/resources
|
|
| crates/ruff_python_parser/resources
|
|
)/
|
|
'''
|
|
|
|
[tool.rooster]
|
|
major_labels = [] # Ruff never uses the major version number
|
|
minor_labels = ["breaking"] # Bump the minor version on breaking changes
|
|
|
|
ignore_labels = [
|
|
"internal",
|
|
"ci",
|
|
"testing",
|
|
"ty",
|
|
"release",
|
|
"playground",
|
|
]
|
|
|
|
version_files = [
|
|
"README.md",
|
|
"pyproject.toml",
|
|
# Might become unneeded once Markdown formatting is stabilized.
|
|
"docs/formatter.md",
|
|
"docs/installation.md",
|
|
"docs/integrations.md",
|
|
"docs/tutorial.md",
|
|
"crates/ruff/Cargo.toml",
|
|
"crates/ruff_linter/Cargo.toml",
|
|
# Note that the value being replaced here needs to be kept in sync with the
|
|
# validation regex in the `violation_metadata` macro.
|
|
{ target = "crates/ruff_linter/src/rules/**/*.rs", replace = "NEXT_RUFF_VERSION" },
|
|
"crates/ruff_wasm/Cargo.toml",
|
|
"scripts/benchmarks/pyproject.toml",
|
|
{ target = ".github/ISSUE_TEMPLATE/1_bug_report.yaml" },
|
|
{ target = ".github/ISSUE_TEMPLATE/3_question.yaml" },
|
|
]
|
|
|
|
[tool.rooster.section-labels]
|
|
"Breaking changes" = ["breaking"]
|
|
"Preview features" = ["preview"]
|
|
"Bug fixes" = ["bug"]
|
|
"Rule changes" = [
|
|
"diagnostics",
|
|
"docstring",
|
|
"rule",
|
|
"fixes",
|
|
"isort",
|
|
]
|
|
"Performance" = ["performance"]
|
|
"Formatter" = ["formatter"]
|
|
"Server" = ["server"]
|
|
"CLI" = ["cli"]
|
|
"Configuration" = ["configuration"]
|
|
"Documentation" = ["documentation"]
|
|
"Other changes" = ["__unknown__"]
|