🐍

異星のruff

2024/09/23に公開

なにこれ

Python用のツール。
以下の役割を担う。

  • 静的解析
  • フォーマッター
  • リンター
  • インポートソーター

なにが嬉しいの?

  1. 1個だけ入れればOKになる。
    • プラグインの追加が不要。
    • isortとかflake8とか不要。
  2. 動作が早い。
    • Rustでできてる。
    • ruff-lspという専用LSP内蔵。
  3. 自動修正機能搭載。
    • エディタからもCLIからも修正可能。
  4. 設定しやすい。
    • 既存のライブラリ(isortやflake8とか)のルールがそのまま使えると思ってOK
    • pyproject.tomlとかruff.tomlにルールを設定できる。
  5. 様々なエディタで利用可能。
    • vscode
    • vim
    • emacs
    • zed
    • etc

引用

  • ⚡️ (Flake8のような)既存のリンターや(Blackのような)フォーマッタよりも10-100倍高速
  • 🐍 pip経由でインストール可能
  • 🛠️ pyproject.tomlのサポート
  • 🤝 Python 3.13との互換性
  • ⚖️ Flake8、isort、Blackとのドロップインパリティ
  • 📦 未変更ファイルの再分析を回避するためのキャッシュ機能内蔵
  • 🔧 自動エラー修正(例えば、未使用のインポートを自動的に削除)のための修正サポート
  • 📏 800以上の組み込みルール、 800 以上の組み込みルール。flake8-bugbear のような一般的な Flake8 プラグインをネイティブで再実装
  • ⌨️ VS Code などのファーストパーティエディタとの統合
  • 🌎 階層的でカスケード可能なコンフィギュレーションでモノレポフレンドリー。

設定方法は?

ruffではflake8blackなどデフォルトで有効になっているルールがある。
つまりデフォルトで無効になっているルールもある。

デフォルトで有効のものは上書きで設定することになり、デフォルトで無効になっているものは有効にする必要がある。

設定方法の例

  • selectで有効、ignoreで無効
  • FやIとすると関連するルールを全て設定できる。
  • E501とすると特定のルールのみ指定することになる。
  • ルールの適用をディレクトリやファイルで絞り込める。
pyproject.toml
[tool.ruff]
select = ["E502", "F", "I"]  
ignore = ["E501", "F841"]

[tool.ruff.per-file-ignores]
"tests/*.py" = ["E501", "F841"]  

設定例の引用

pyproject.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"

本家

https://docs.astral.sh/ruff/

設定

ルール

https://docs.astral.sh/ruff/rules/

設定方法

https://docs.astral.sh/ruff/settings/

VScodeプラグイン

https://marketplace.visualstudio.com/items?itemName=charliermarsh.ruff

使い方

# checkの後にPATHを指定できる。省略すると全てが範囲に指定される。
ruff check

# --fixで修正できる。
ruff check --fix

参考文献

異星の客

Discussion