[build-system]
requires = ["maturin>=1.0,<2.0"]
build-backend = "maturin"

[project]
name = "ruff"
version = "0.11.2"
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 = { file = "LICENSE" }
keywords = [
    "automation",
    "flake8",
    "pycodestyle",
    "pyflakes",
    "pylint",
    "clippy",
]
classifiers = [
    "Development Status :: 5 - Production/Stable",
    "Environment :: Console",
    "Intended Audience :: Developers",
    "License :: OSI Approved :: MIT License",
    "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 :: 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/**/*"
]
include = [
    "rust-toolchain.toml"
]

[tool.ruff]
target-version = "py38"
extend-exclude = [
    "crates/red_knot_vendored/vendor/",
    "crates/ruff/resources/",
    "crates/ruff_linter/resources/",
    "crates/ruff_python_formatter/resources/",
    "crates/ruff_python_parser/resources/"
]

[tool.ruff.lint]
select = [
    "E", # pycodestyle (error)
    "F", # pyflakes
    "B", # bugbear
    "B9",
    "C4", # flake8-comprehensions
    "SIM", # flake8-simplify
    "I", # isort
    "UP", # pyupgrade
    "PIE", # flake8-pie
    "PGH", # pygrep-hooks
    "PYI", # flake8-pyi
    "RUF",
]

ignore = [
    # only relevant if you run a script with `python -0`,
    # which seems unlikely for any of the scripts in this repo
    "B011",
    # Leave it to the formatter to split long lines and
    # the judgement of all of us.
    "E501"
]

[tool.ruff.lint.isort]
required-imports = ["from __future__ import annotations"]

[tool.black]
force-exclude = '''
/(
  | crates/red_knot_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

changelog_ignore_labels = ["internal", "ci", "red-knot", "testing"]

changelog_sections.breaking = "Breaking changes"
changelog_sections.preview = "Preview features"
changelog_sections.bug = "Bug fixes"
changelog_sections.rule = "Rule changes"
changelog_sections.diagnostics = "Rule changes"
changelog_sections.docstring = "Rule changes"
changelog_sections.fixes = "Rule changes"
changelog_sections.isort = "Rule changes"
changelog_sections.performance = "Performance"
changelog_sections.formatter = "Formatter"
changelog_sections.server = "Server"
changelog_sections.cli = "CLI"
changelog_sections.configuration = "Configuration"
changelog_sections.documentation = "Documentation"
changelog_sections.__unknown__ = "Other changes"

# We exclude contributors from the CHANGELOG file
# Generate separately with `rooster contributors` for the GitHub release page
changelog_contributors = false

version_files = [
    "README.md",
    "docs/integrations.md",
    "docs/tutorial.md",
    "crates/ruff/Cargo.toml",
    "crates/ruff_linter/Cargo.toml",
    "crates/ruff_wasm/Cargo.toml",
    "scripts/benchmarks/pyproject.toml",
]
