mirror of
https://github.com/astral-sh/ruff.git
synced 2025-08-21 19:05:09 +00:00

<!-- Thank you for contributing to Ruff! To help us out with reviewing, please consider the following: - Does this pull request include a summary of the change? (See below.) - Does this pull request include a descriptive title? - Does this pull request include references to any relevant issues? --> ## Summary This PR introduces the `ruff_server` crate and a new `ruff server` command. `ruff_server` is a re-implementation of [`ruff-lsp`](https://github.com/astral-sh/ruff-lsp), written entirely in Rust. It brings significant performance improvements, much tighter integration with Ruff, a foundation for supporting entirely new language server features, and more! This PR is an early version of `ruff_lsp` that we're calling the **pre-release** version. Anyone is more than welcome to use it and submit bug reports for any issues they encounter - we'll have some documentation on how to set it up with a few common editors, and we'll also provide a pre-release VSCode extension for those interested. This pre-release version supports: - **Diagnostics for `.py` files** - **Quick fixes** - **Full-file formatting** - **Range formatting** - **Multiple workspace folders** - **Automatic linter/formatter configuration** - taken from any `pyproject.toml` files in the workspace. Many thanks to @MichaReiser for his [proof-of-concept work](https://github.com/astral-sh/ruff/pull/7262), which was important groundwork for making this PR possible. ## Architectural Decisions I've made an executive choice to go with `lsp-server` as a base framework for the LSP, in favor of `tower-lsp`. There were several reasons for this: 1. I would like to avoid `async` in our implementation. LSPs are mostly computationally bound rather than I/O bound, and `async` adds a lot of complexity to the API, while also making harder to reason about execution order. This leads into the second reason, which is... 2. Any handlers that mutate state should be blocking and run in the event loop, and the state should be lock-free. This is the approach that `rust-analyzer` uses (also with the `lsp-server`/`lsp-types` crates as a framework), and it gives us assurances about data mutation and execution order. `tower-lsp` doesn't support this, which has caused some [issues](https://github.com/ebkalderon/tower-lsp/issues/284) around data races and out-of-order handler execution. 3. In general, I think it makes sense to have tight control over scheduling and the specifics of our implementation, in exchange for a slightly higher up-front cost of writing it ourselves. We'll be able to fine-tune it to our needs and support future LSP features without depending on an upstream maintainer. ## Test Plan The pre-release of `ruff_server` will have snapshot tests for common document editing scenarios. An expanded test suite is on the roadmap for future version of `ruff_server`.
795 lines
27 KiB
Markdown
795 lines
27 KiB
Markdown
# Configuring Ruff
|
|
|
|
Ruff can be configured through a `pyproject.toml`, `ruff.toml`, or `.ruff.toml` file.
|
|
|
|
Whether you're using Ruff as a linter, formatter, or both, the underlying configuration strategy and
|
|
semantics are the same.
|
|
|
|
For a complete enumeration of the available configuration options, see [_Settings_](settings.md).
|
|
|
|
If left unspecified, Ruff's default configuration is equivalent to:
|
|
|
|
=== "pyproject.toml"
|
|
|
|
```toml
|
|
[tool.ruff]
|
|
# Exclude a variety of commonly ignored directories.
|
|
exclude = [
|
|
".bzr",
|
|
".direnv",
|
|
".eggs",
|
|
".git",
|
|
".git-rewrite",
|
|
".hg",
|
|
".ipynb_checkpoints",
|
|
".mypy_cache",
|
|
".nox",
|
|
".pants.d",
|
|
".pyenv",
|
|
".pytest_cache",
|
|
".pytype",
|
|
".ruff_cache",
|
|
".svn",
|
|
".tox",
|
|
".venv",
|
|
".vscode",
|
|
"__pypackages__",
|
|
"_build",
|
|
"buck-out",
|
|
"build",
|
|
"dist",
|
|
"node_modules",
|
|
"site-packages",
|
|
"venv",
|
|
]
|
|
|
|
# Same as Black.
|
|
line-length = 88
|
|
indent-width = 4
|
|
|
|
# Assume Python 3.8
|
|
target-version = "py38"
|
|
|
|
[tool.ruff.lint]
|
|
# Enable Pyflakes (`F`) and a subset of the pycodestyle (`E`) codes by default.
|
|
# Unlike Flake8, Ruff doesn't enable pycodestyle warnings (`W`) or
|
|
# McCabe complexity (`C901`) by default.
|
|
select = ["E4", "E7", "E9", "F"]
|
|
ignore = []
|
|
|
|
# Allow fix for all enabled rules (when `--fix`) is provided.
|
|
fixable = ["ALL"]
|
|
unfixable = []
|
|
|
|
# Allow unused variables when underscore-prefixed.
|
|
dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"
|
|
|
|
[tool.ruff.format]
|
|
# Like Black, use double quotes for strings.
|
|
quote-style = "double"
|
|
|
|
# Like Black, indent with spaces, rather than tabs.
|
|
indent-style = "space"
|
|
|
|
# Like Black, respect magic trailing commas.
|
|
skip-magic-trailing-comma = false
|
|
|
|
# Like Black, automatically detect the appropriate line ending.
|
|
line-ending = "auto"
|
|
|
|
# Enable auto-formatting of code examples in docstrings. Markdown,
|
|
# reStructuredText code/literal blocks and doctests are all supported.
|
|
#
|
|
# This is currently disabled by default, but it is planned for this
|
|
# to be opt-out in the future.
|
|
docstring-code-format = false
|
|
|
|
# Set the line length limit used when formatting code snippets in
|
|
# docstrings.
|
|
#
|
|
# This only has an effect when the `docstring-code-format` setting is
|
|
# enabled.
|
|
docstring-code-line-length = "dynamic"
|
|
```
|
|
|
|
=== "ruff.toml"
|
|
|
|
```toml
|
|
# Exclude a variety of commonly ignored directories.
|
|
exclude = [
|
|
".bzr",
|
|
".direnv",
|
|
".eggs",
|
|
".git",
|
|
".git-rewrite",
|
|
".hg",
|
|
".ipynb_checkpoints",
|
|
".mypy_cache",
|
|
".nox",
|
|
".pants.d",
|
|
".pyenv",
|
|
".pytest_cache",
|
|
".pytype",
|
|
".ruff_cache",
|
|
".svn",
|
|
".tox",
|
|
".venv",
|
|
".vscode",
|
|
"__pypackages__",
|
|
"_build",
|
|
"buck-out",
|
|
"build",
|
|
"dist",
|
|
"node_modules",
|
|
"site-packages",
|
|
"venv",
|
|
]
|
|
|
|
# Same as Black.
|
|
line-length = 88
|
|
indent-width = 4
|
|
|
|
# Assume Python 3.8
|
|
target-version = "py38"
|
|
|
|
[lint]
|
|
# Enable Pyflakes (`F`) and a subset of the pycodestyle (`E`) codes by default.
|
|
# Unlike Flake8, Ruff doesn't enable pycodestyle warnings (`W`) or
|
|
# McCabe complexity (`C901`) by default.
|
|
select = ["E4", "E7", "E9", "F"]
|
|
ignore = []
|
|
|
|
# Allow fix for all enabled rules (when `--fix`) is provided.
|
|
fixable = ["ALL"]
|
|
unfixable = []
|
|
|
|
# Allow unused variables when underscore-prefixed.
|
|
dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"
|
|
|
|
[format]
|
|
# Like Black, use double quotes for strings.
|
|
quote-style = "double"
|
|
|
|
# Like Black, indent with spaces, rather than tabs.
|
|
indent-style = "space"
|
|
|
|
# Like Black, respect magic trailing commas.
|
|
skip-magic-trailing-comma = false
|
|
|
|
# Like Black, automatically detect the appropriate line ending.
|
|
line-ending = "auto"
|
|
|
|
# Enable auto-formatting of code examples in docstrings. Markdown,
|
|
# reStructuredText code/literal blocks and doctests are all supported.
|
|
#
|
|
# This is currently disabled by default, but it is planned for this
|
|
# to be opt-out in the future.
|
|
docstring-code-format = false
|
|
|
|
# Set the line length limit used when formatting code snippets in
|
|
# docstrings.
|
|
#
|
|
# This only has an effect when the `docstring-code-format` setting is
|
|
# enabled.
|
|
docstring-code-line-length = "dynamic"
|
|
```
|
|
|
|
As an example, the following would configure Ruff to:
|
|
|
|
=== "pyproject.toml"
|
|
|
|
```toml
|
|
[tool.ruff.lint]
|
|
# 1. Enable flake8-bugbear (`B`) rules, in addition to the defaults.
|
|
select = ["E4", "E7", "E9", "F", "B"]
|
|
|
|
# 2. Avoid enforcing line-length violations (`E501`)
|
|
ignore = ["E501"]
|
|
|
|
# 3. Avoid trying to fix flake8-bugbear (`B`) violations.
|
|
unfixable = ["B"]
|
|
|
|
# 4. Ignore `E402` (import violations) in all `__init__.py` files, and in select subdirectories.
|
|
[tool.ruff.lint.per-file-ignores]
|
|
"__init__.py" = ["E402"]
|
|
"**/{tests,docs,tools}/*" = ["E402"]
|
|
|
|
[tool.ruff.format]
|
|
# 5. Use single quotes for non-triple-quoted strings.
|
|
quote-style = "single"
|
|
```
|
|
|
|
=== "ruff.toml"
|
|
|
|
```toml
|
|
[lint]
|
|
# 1. Enable flake8-bugbear (`B`) rules, in addition to the defaults.
|
|
select = ["E4", "E7", "E9", "F", "B"]
|
|
|
|
# 2. Avoid enforcing line-length violations (`E501`)
|
|
ignore = ["E501"]
|
|
|
|
# 3. Avoid trying to fix flake8-bugbear (`B`) violations.
|
|
unfixable = ["B"]
|
|
|
|
# 4. Ignore `E402` (import violations) in all `__init__.py` files, and in select subdirectories.
|
|
[lint.per-file-ignores]
|
|
"__init__.py" = ["E402"]
|
|
"**/{tests,docs,tools}/*" = ["E402"]
|
|
|
|
[format]
|
|
# 5. Use single quotes for non-triple-quoted strings.
|
|
quote-style = "single"
|
|
```
|
|
|
|
Linter plugin configurations are expressed as subsections, e.g.:
|
|
|
|
=== "pyproject.toml"
|
|
|
|
```toml
|
|
[tool.ruff.lint]
|
|
# Add "Q" to the list of enabled codes.
|
|
select = ["E4", "E7", "E9", "F", "Q"]
|
|
|
|
[tool.ruff.lint.flake8-quotes]
|
|
docstring-quotes = "double"
|
|
```
|
|
|
|
=== "ruff.toml"
|
|
|
|
```toml
|
|
[lint]
|
|
# Add "Q" to the list of enabled codes.
|
|
select = ["E4", "E7", "E9", "F", "Q"]
|
|
|
|
[lint.flake8-quotes]
|
|
docstring-quotes = "double"
|
|
```
|
|
|
|
Ruff respects `pyproject.toml`, `ruff.toml`, and `.ruff.toml` files. All three implement an
|
|
equivalent schema (though in the `ruff.toml` and `.ruff.toml` versions, the `[tool.ruff]` header and
|
|
`tool.ruff` section prefix is omitted).
|
|
|
|
For a complete enumeration of the available configuration options, see [_Settings_](settings.md).
|
|
|
|
## Config file discovery
|
|
|
|
Similar to [ESLint](https://eslint.org/docs/latest/user-guide/configuring/configuration-files#cascading-and-hierarchy),
|
|
Ruff supports hierarchical configuration, such that the "closest" config file in the
|
|
directory hierarchy is used for every individual file, with all paths in the config file
|
|
(e.g., `exclude` globs, `src` paths) being resolved relative to the directory containing that
|
|
config file.
|
|
|
|
There are a few exceptions to these rules:
|
|
|
|
1. In locating the "closest" `pyproject.toml` file for a given path, Ruff ignores any
|
|
`pyproject.toml` files that lack a `[tool.ruff]` section.
|
|
1. If a configuration file is passed directly via `--config`, those settings are used for _all_
|
|
analyzed files, and any relative paths in that configuration file (like `exclude` globs or
|
|
`src` paths) are resolved relative to the _current_ working directory.
|
|
1. If no config file is found in the filesystem hierarchy, Ruff will fall back to using
|
|
a default configuration. If a user-specific configuration file exists
|
|
at `${config_dir}/ruff/pyproject.toml`, that file will be used instead of the default
|
|
configuration, with `${config_dir}` being determined via the [`dirs`](https://docs.rs/dirs/4.0.0/dirs/fn.config_dir.html)
|
|
crate, and all relative paths being again resolved relative to the _current working directory_.
|
|
1. Any config-file-supported settings that are provided on the command-line (e.g., via
|
|
`--select`) will override the settings in _every_ resolved configuration file.
|
|
|
|
Unlike [ESLint](https://eslint.org/docs/latest/user-guide/configuring/configuration-files#cascading-and-hierarchy),
|
|
Ruff does not merge settings across configuration files; instead, the "closest" configuration file
|
|
is used, and any parent configuration files are ignored. In lieu of this implicit cascade, Ruff
|
|
supports an [`extend`](settings.md#extend) field, which allows you to inherit the settings from another
|
|
config file, like so:
|
|
|
|
=== "pyproject.toml"
|
|
|
|
```toml
|
|
[tool.ruff]
|
|
# Extend the `pyproject.toml` file in the parent directory...
|
|
extend = "../pyproject.toml"
|
|
|
|
# ...but use a different line length.
|
|
line-length = 100
|
|
```
|
|
|
|
=== "ruff.toml"
|
|
|
|
```toml
|
|
# Extend the `ruff.toml` file in the parent directory...
|
|
extend = "../ruff.toml"
|
|
|
|
# ...but use a different line length.
|
|
line-length = 100
|
|
```
|
|
|
|
All of the above rules apply equivalently to `pyproject.toml`, `ruff.toml`, and `.ruff.toml` files.
|
|
If Ruff detects multiple configuration files in the same directory, the `.ruff.toml` file will take
|
|
precedence over the `ruff.toml` file, and the `ruff.toml` file will take precedence over
|
|
the `pyproject.toml` file.
|
|
|
|
## Python file discovery
|
|
|
|
When passed a path on the command-line, Ruff will automatically discover all Python files in that
|
|
path, taking into account the [`exclude`](settings.md#exclude) and [`extend-exclude`](settings.md#extend-exclude)
|
|
settings in each directory's configuration file.
|
|
|
|
Files can also be selectively excluded from linting or formatting by scoping the `exclude` setting
|
|
to the tool-specific configuration tables. For example, the following would prevent `ruff` from
|
|
formatting `.pyi` files, but would continue to include them in linting:
|
|
|
|
=== "pyproject.toml"
|
|
|
|
```toml
|
|
[tool.ruff.format]
|
|
exclude = ["*.pyi"]
|
|
```
|
|
|
|
=== "ruff.toml"
|
|
|
|
```toml
|
|
[format]
|
|
exclude = ["*.pyi"]
|
|
```
|
|
|
|
By default, Ruff will also skip any files that are omitted via `.ignore`, `.gitignore`,
|
|
`.git/info/exclude`, and global `gitignore` files (see: [`respect-gitignore`](settings.md#respect-gitignore)).
|
|
|
|
Files that are passed to `ruff` directly are always analyzed, regardless of the above criteria.
|
|
For example, `ruff check /path/to/excluded/file.py` will always lint `file.py`.
|
|
|
|
### Default inclusions
|
|
|
|
By default, Ruff will discover files matching `*.py`, `*.ipy`, or `pyproject.toml`.
|
|
|
|
To lint or format files with additional file extensions, use the [`extend-include`](settings.md#extend-include) setting.
|
|
|
|
=== "pyproject.toml"
|
|
|
|
```toml
|
|
[tool.ruff]
|
|
extend-include = ["*.ipynb"]
|
|
```
|
|
|
|
=== "ruff.toml"
|
|
|
|
```toml
|
|
extend-include = ["*.ipynb"]
|
|
```
|
|
|
|
You can also change the default selection using the [`include`](settings.md#include) setting.
|
|
|
|
|
|
=== "pyproject.toml"
|
|
|
|
```toml
|
|
[tool.ruff]
|
|
include = ["pyproject.toml", "src/**/*.py", "scripts/**/*.py"]
|
|
```
|
|
|
|
=== "ruff.toml"
|
|
|
|
```toml
|
|
include = ["pyproject.toml", "src/**/*.py", "scripts/**/*.py"]
|
|
```
|
|
|
|
!!! warning
|
|
Paths provided to `include` _must_ match files. For example, `include = ["src"]` will fail since it
|
|
matches a directory.
|
|
|
|
## Jupyter Notebook discovery
|
|
|
|
Ruff has built-in support for [Jupyter Notebooks](https://jupyter.org/).
|
|
|
|
To opt in to linting and formatting Jupyter Notebook (`.ipynb`) files, add the `*.ipynb` pattern to
|
|
your [`extend-include`](settings.md#extend-include) setting, like so:
|
|
|
|
=== "pyproject.toml"
|
|
|
|
```toml
|
|
[tool.ruff]
|
|
extend-include = ["*.ipynb"]
|
|
```
|
|
|
|
=== "ruff.toml"
|
|
|
|
```toml
|
|
extend-include = ["*.ipynb"]
|
|
```
|
|
|
|
This will prompt Ruff to discover Jupyter Notebook (`.ipynb`) files in any specified
|
|
directories, then lint and format them accordingly.
|
|
|
|
If you'd prefer to either only lint or only format Jupyter Notebook files, you can use the
|
|
section specific `exclude` option to do so. For example, the following would only lint Jupyter
|
|
Notebook files and not format them:
|
|
|
|
=== "pyproject.toml"
|
|
|
|
```toml
|
|
[tool.ruff]
|
|
extend-include = ["*.ipynb"]
|
|
|
|
[tool.ruff.format]
|
|
exclude = ["*.ipynb"]
|
|
```
|
|
|
|
=== "ruff.toml"
|
|
|
|
```toml
|
|
extend-include = ["*.ipynb"]
|
|
|
|
[format]
|
|
exclude = ["*.ipynb"]
|
|
```
|
|
|
|
And, conversely, the following would only format Jupyter Notebook files and not lint them:
|
|
|
|
=== "pyproject.toml"
|
|
|
|
```toml
|
|
[tool.ruff]
|
|
extend-include = ["*.ipynb"]
|
|
|
|
[tool.ruff.lint]
|
|
exclude = ["*.ipynb"]
|
|
```
|
|
|
|
=== "ruff.toml"
|
|
|
|
```toml
|
|
extend-include = ["*.ipynb"]
|
|
|
|
[lint]
|
|
exclude = ["*.ipynb"]
|
|
```
|
|
|
|
Alternatively, pass the notebook file(s) to `ruff` on the command-line directly. For example,
|
|
`ruff check /path/to/notebook.ipynb` will always lint `notebook.ipynb`. Similarly,
|
|
`ruff format /path/to/notebook.ipynb` will always format `notebook.ipynb`.
|
|
|
|
## Command-line interface
|
|
|
|
Some configuration options can be provided or overridden via dedicated flags on the command line.
|
|
This includes those related to rule enablement and disablement,
|
|
file discovery, logging level, and more:
|
|
|
|
```shell
|
|
ruff check path/to/code/ --select F401 --select F403 --quiet
|
|
```
|
|
|
|
All other configuration options can be set via the command line
|
|
using the `--config` flag, detailed below.
|
|
|
|
### The `--config` CLI flag
|
|
|
|
The `--config` flag has two uses. It is most often used to point to the
|
|
configuration file that you would like Ruff to use, for example:
|
|
|
|
```shell
|
|
ruff check path/to/directory --config path/to/ruff.toml
|
|
```
|
|
|
|
However, the `--config` flag can also be used to provide arbitrary
|
|
overrides of configuration settings using TOML `<KEY> = <VALUE>` pairs.
|
|
This is mostly useful in situations where you wish to override a configuration setting
|
|
that does not have a dedicated command-line flag.
|
|
|
|
In the below example, the `--config` flag is the only way of overriding the
|
|
`dummy-variable-rgx` configuration setting from the command line,
|
|
since this setting has no dedicated CLI flag. The `per-file-ignores` setting
|
|
could also have been overridden via the `--per-file-ignores` dedicated flag,
|
|
but using `--config` to override the setting is also fine:
|
|
|
|
```shell
|
|
ruff check path/to/file --config path/to/ruff.toml --config "lint.dummy-variable-rgx = '__.*'" --config "lint.per-file-ignores = {'some_file.py' = ['F841']}"
|
|
```
|
|
|
|
Configuration options passed to `--config` are parsed in the same way
|
|
as configuration options in a `ruff.toml` file.
|
|
As such, options specific to the Ruff linter need to be prefixed with `lint.`
|
|
(`--config "lint.dummy-variable-rgx = '__.*'"` rather than simply
|
|
`--config "dummy-variable-rgx = '__.*'"`), and options specific to the Ruff formatter
|
|
need to be prefixed with `format.`.
|
|
|
|
If a specific configuration option is simultaneously overridden by
|
|
a dedicated flag and by the `--config` flag, the dedicated flag
|
|
takes priority. In this example, the maximum permitted line length
|
|
will be set to 90, not 100:
|
|
|
|
```shell
|
|
ruff format path/to/file --line-length=90 --config "line-length=100"
|
|
```
|
|
|
|
Specifying `--config "line-length=90"` will override the `line-length`
|
|
setting from *all* configuration files detected by Ruff,
|
|
including configuration files discovered in subdirectories.
|
|
In this respect, specifying `--config "line-length=90"` has
|
|
the same effect as specifying `--line-length=90`,
|
|
which will similarly override the `line-length` setting from
|
|
all configuration files detected by Ruff, regardless of where
|
|
a specific configuration file is located.
|
|
|
|
### Full command-line interface
|
|
|
|
See `ruff help` for the full list of Ruff's top-level commands:
|
|
|
|
<!-- Begin auto-generated command help. -->
|
|
|
|
```text
|
|
Ruff: An extremely fast Python linter.
|
|
|
|
Usage: ruff [OPTIONS] <COMMAND>
|
|
|
|
Commands:
|
|
check Run Ruff on the given files or directories (default)
|
|
rule Explain a rule (or all rules)
|
|
config List or describe the available configuration options
|
|
linter List all supported upstream linters
|
|
clean Clear any caches in the current directory and any subdirectories
|
|
format Run the Ruff formatter on the given files or directories
|
|
server Run the language server
|
|
version Display Ruff's version
|
|
help Print this message or the help of the given subcommand(s)
|
|
|
|
Options:
|
|
-h, --help Print help
|
|
-V, --version Print version
|
|
|
|
Log levels:
|
|
-v, --verbose Enable verbose logging
|
|
-q, --quiet Print diagnostics, but nothing else
|
|
-s, --silent Disable all logging (but still exit with status code "1" upon
|
|
detecting diagnostics)
|
|
|
|
Global options:
|
|
--config <CONFIG_OPTION>
|
|
Either a path to a TOML configuration file (`pyproject.toml` or
|
|
`ruff.toml`), or a TOML `<KEY> = <VALUE>` pair (such as you might
|
|
find in a `ruff.toml` configuration file) overriding a specific
|
|
configuration option. Overrides of individual settings using this
|
|
option always take precedence over all configuration files, including
|
|
configuration files that were also specified using `--config`
|
|
--isolated
|
|
Ignore all configuration files
|
|
|
|
For help with a specific command, see: `ruff help <command>`.
|
|
```
|
|
|
|
<!-- End auto-generated command help. -->
|
|
|
|
Or `ruff help check` for more on the linting command:
|
|
|
|
<!-- Begin auto-generated check help. -->
|
|
|
|
```text
|
|
Run Ruff on the given files or directories (default)
|
|
|
|
Usage: ruff check [OPTIONS] [FILES]...
|
|
|
|
Arguments:
|
|
[FILES]... List of files or directories to check [default: .]
|
|
|
|
Options:
|
|
--fix
|
|
Apply fixes to resolve lint violations. Use `--no-fix` to disable or
|
|
`--unsafe-fixes` to include unsafe fixes
|
|
--unsafe-fixes
|
|
Include fixes that may not retain the original intent of the code.
|
|
Use `--no-unsafe-fixes` to disable
|
|
--show-source
|
|
Show violations with source code. Use `--no-show-source` to disable.
|
|
(Deprecated: use `--output-format=full` or `--output-format=concise`
|
|
instead of `--show-source` and `--no-show-source`, respectively)
|
|
--show-fixes
|
|
Show an enumeration of all fixed lint violations. Use
|
|
`--no-show-fixes` to disable
|
|
--diff
|
|
Avoid writing any fixed files back; instead, output a diff for each
|
|
changed file to stdout. Implies `--fix-only`
|
|
-w, --watch
|
|
Run in watch mode by re-running whenever files change
|
|
--fix-only
|
|
Apply fixes to resolve lint violations, but don't report on leftover
|
|
violations. Implies `--fix`. Use `--no-fix-only` to disable or
|
|
`--unsafe-fixes` to include unsafe fixes
|
|
--ignore-noqa
|
|
Ignore any `# noqa` comments
|
|
--output-format <OUTPUT_FORMAT>
|
|
Output serialization format for violations. The default serialization
|
|
format is "concise". In preview mode, the default serialization
|
|
format is "full" [env: RUFF_OUTPUT_FORMAT=] [possible values: text,
|
|
concise, full, json, json-lines, junit, grouped, github, gitlab,
|
|
pylint, azure, sarif]
|
|
-o, --output-file <OUTPUT_FILE>
|
|
Specify file to write the linter output to (default: stdout)
|
|
--target-version <TARGET_VERSION>
|
|
The minimum Python version that should be supported [possible values:
|
|
py37, py38, py39, py310, py311, py312]
|
|
--preview
|
|
Enable preview mode; checks will include unstable rules and fixes.
|
|
Use `--no-preview` to disable
|
|
--extension <EXTENSION>
|
|
List of mappings from file extension to language (one of ["python",
|
|
"ipynb", "pyi"]). For example, to treat `.ipy` files as IPython
|
|
notebooks, use `--extension ipy:ipynb`
|
|
--statistics
|
|
Show counts for every rule with at least one violation
|
|
--add-noqa
|
|
Enable automatic additions of `noqa` directives to failing lines
|
|
--show-files
|
|
See the files Ruff will be run against with the current settings
|
|
--show-settings
|
|
See the settings Ruff will use to lint a given Python file
|
|
-h, --help
|
|
Print help
|
|
|
|
Rule selection:
|
|
--select <RULE_CODE>
|
|
Comma-separated list of rule codes to enable (or ALL, to enable all
|
|
rules)
|
|
--ignore <RULE_CODE>
|
|
Comma-separated list of rule codes to disable
|
|
--extend-select <RULE_CODE>
|
|
Like --select, but adds additional rule codes on top of those already
|
|
specified
|
|
--per-file-ignores <PER_FILE_IGNORES>
|
|
List of mappings from file pattern to code to exclude
|
|
--extend-per-file-ignores <EXTEND_PER_FILE_IGNORES>
|
|
Like `--per-file-ignores`, but adds additional ignores on top of
|
|
those already specified
|
|
--fixable <RULE_CODE>
|
|
List of rule codes to treat as eligible for fix. Only applicable when
|
|
fix itself is enabled (e.g., via `--fix`)
|
|
--unfixable <RULE_CODE>
|
|
List of rule codes to treat as ineligible for fix. Only applicable
|
|
when fix itself is enabled (e.g., via `--fix`)
|
|
--extend-fixable <RULE_CODE>
|
|
Like --fixable, but adds additional rule codes on top of those
|
|
already specified
|
|
|
|
File selection:
|
|
--exclude <FILE_PATTERN>
|
|
List of paths, used to omit files and/or directories from analysis
|
|
--extend-exclude <FILE_PATTERN>
|
|
Like --exclude, but adds additional files and directories on top of
|
|
those already excluded
|
|
--respect-gitignore
|
|
Respect file exclusions via `.gitignore` and other standard ignore
|
|
files. Use `--no-respect-gitignore` to disable
|
|
--force-exclude
|
|
Enforce exclusions, even for paths passed to Ruff directly on the
|
|
command-line. Use `--no-force-exclude` to disable
|
|
|
|
Miscellaneous:
|
|
-n, --no-cache
|
|
Disable cache reads [env: RUFF_NO_CACHE=]
|
|
--cache-dir <CACHE_DIR>
|
|
Path to the cache directory [env: RUFF_CACHE_DIR=]
|
|
--stdin-filename <STDIN_FILENAME>
|
|
The name of the file when passing it through stdin
|
|
-e, --exit-zero
|
|
Exit with status code "0", even upon detecting lint violations
|
|
--exit-non-zero-on-fix
|
|
Exit with a non-zero status code if any files were modified via fix,
|
|
even if no lint violations remain
|
|
|
|
Log levels:
|
|
-v, --verbose Enable verbose logging
|
|
-q, --quiet Print diagnostics, but nothing else
|
|
-s, --silent Disable all logging (but still exit with status code "1" upon
|
|
detecting diagnostics)
|
|
|
|
Global options:
|
|
--config <CONFIG_OPTION>
|
|
Either a path to a TOML configuration file (`pyproject.toml` or
|
|
`ruff.toml`), or a TOML `<KEY> = <VALUE>` pair (such as you might
|
|
find in a `ruff.toml` configuration file) overriding a specific
|
|
configuration option. Overrides of individual settings using this
|
|
option always take precedence over all configuration files, including
|
|
configuration files that were also specified using `--config`
|
|
--isolated
|
|
Ignore all configuration files
|
|
```
|
|
|
|
<!-- End auto-generated check help. -->
|
|
|
|
Or `ruff help format` for more on the formatting command:
|
|
|
|
<!-- Begin auto-generated format help. -->
|
|
|
|
```text
|
|
Run the Ruff formatter on the given files or directories
|
|
|
|
Usage: ruff format [OPTIONS] [FILES]...
|
|
|
|
Arguments:
|
|
[FILES]... List of files or directories to format [default: .]
|
|
|
|
Options:
|
|
--check
|
|
Avoid writing any formatted files back; instead, exit with a non-zero
|
|
status code if any files would have been modified, and zero otherwise
|
|
--diff
|
|
Avoid writing any formatted files back; instead, exit with a non-zero
|
|
status code and the difference between the current file and how the
|
|
formatted file would look like
|
|
--extension <EXTENSION>
|
|
List of mappings from file extension to language (one of ["python",
|
|
"ipynb", "pyi"]). For example, to treat `.ipy` files as IPython
|
|
notebooks, use `--extension ipy:ipynb`
|
|
--target-version <TARGET_VERSION>
|
|
The minimum Python version that should be supported [possible values:
|
|
py37, py38, py39, py310, py311, py312]
|
|
--preview
|
|
Enable preview mode; enables unstable formatting. Use `--no-preview`
|
|
to disable
|
|
-h, --help
|
|
Print help (see more with '--help')
|
|
|
|
Miscellaneous:
|
|
-n, --no-cache
|
|
Disable cache reads [env: RUFF_NO_CACHE=]
|
|
--cache-dir <CACHE_DIR>
|
|
Path to the cache directory [env: RUFF_CACHE_DIR=]
|
|
--stdin-filename <STDIN_FILENAME>
|
|
The name of the file when passing it through stdin
|
|
|
|
File selection:
|
|
--respect-gitignore
|
|
Respect file exclusions via `.gitignore` and other standard ignore
|
|
files. Use `--no-respect-gitignore` to disable
|
|
--exclude <FILE_PATTERN>
|
|
List of paths, used to omit files and/or directories from analysis
|
|
--force-exclude
|
|
Enforce exclusions, even for paths passed to Ruff directly on the
|
|
command-line. Use `--no-force-exclude` to disable
|
|
|
|
Format configuration:
|
|
--line-length <LINE_LENGTH> Set the line-length
|
|
|
|
Editor options:
|
|
--range <RANGE> When specified, Ruff will try to only format the code in
|
|
the given range.
|
|
It might be necessary to extend the start backwards or
|
|
the end forwards, to fully enclose a logical line.
|
|
The `<RANGE>` uses the format
|
|
`<start_line>:<start_column>-<end_line>:<end_column>`.
|
|
|
|
Log levels:
|
|
-v, --verbose Enable verbose logging
|
|
-q, --quiet Print diagnostics, but nothing else
|
|
-s, --silent Disable all logging (but still exit with status code "1" upon
|
|
detecting diagnostics)
|
|
|
|
Global options:
|
|
--config <CONFIG_OPTION>
|
|
Either a path to a TOML configuration file (`pyproject.toml` or
|
|
`ruff.toml`), or a TOML `<KEY> = <VALUE>` pair (such as you might
|
|
find in a `ruff.toml` configuration file) overriding a specific
|
|
configuration option. Overrides of individual settings using this
|
|
option always take precedence over all configuration files, including
|
|
configuration files that were also specified using `--config`
|
|
--isolated
|
|
Ignore all configuration files
|
|
```
|
|
|
|
<!-- End auto-generated format help. -->
|
|
|
|
## Shell autocompletion
|
|
|
|
Ruff supports autocompletion for most shells. A shell-specific completion script can be generated
|
|
by `ruff generate-shell-completion <SHELL>`, where `<SHELL>` is one of `bash`, `elvish`, `fig`, `fish`,
|
|
`powershell`, or `zsh`.
|
|
|
|
The exact steps required to enable autocompletion will vary by shell. For example instructions,
|
|
see the [Poetry](https://python-poetry.org/docs/#enable-tab-completion-for-bash-fish-or-zsh) or
|
|
[ripgrep](https://github.com/BurntSushi/ripgrep/blob/master/FAQ.md#complete) documentation.
|
|
|
|
As an example: to enable autocompletion for Zsh, run
|
|
`ruff generate-shell-completion zsh > ~/.zfunc/_ruff`. Then add the following line to your
|
|
`~/.zshrc` file, if they're not already present:
|
|
|
|
```zsh
|
|
fpath+=~/.zfunc
|
|
autoload -Uz compinit && compinit
|
|
```
|