【Python】Python解析ツール ~ Ruff ~

■ はじめに

Github Workflow で CI/CD を実装中だが、
PythonのLinter/Formatter についても実装してみようと思う。

PythonのLinter/Formatter については、過去、以下の関連記事で

https://dk521123.hatenablog.com/entry/2021/11/08/221219

調べたことがあったのだが、大分古くなったので、改めて調べてみた。

その中で「Ruff」が良さげだったので、深堀りしてみる

目次

【0】おさらい:これまで扱った Python の Linter / formatter
 1)各ツール詳細
【1】Ruff
【2】インストール
【3】主なコマンド
 1)ruff check - Linter
 2)ruff format - Formatter
【4】Hello world
 1)ruff check
 2)ruff format
【5】その他の事項
 1)設定
 2)ルール
【6】Github Actionでの利用

【0】おさらい:これまで扱った Python の Linter / formatter

* 以下の関連記事では、以下の4つツールが良さそうってなっていた
 => ただ、今回紹介する「Ruff」は、All in Oneらしい、、、

Python を奇麗に書くためのツール群
https://dk521123.hatenablog.com/entry/2021/11/08/221219

より抜粋
~~~~~~~~~~
* とりあえず、以下を入れとけばいいかなっと、、、
 + black
 + flake8
 + isort
 + mypy
~~~~~~~~~~

1)各ツール詳細

flake8 ~ Pythonコードチェック ~
https://dk521123.hatenablog.com/entry/2020/02/07/000000
black ~ Python formatter ~
https://dk521123.hatenablog.com/entry/2021/11/10/095258
Static Typing linter ~ mypy ~
https://dk521123.hatenablog.com/entry/2022/07/19/000000

【1】Ruff

* 2022年リリースされたPython静的解析ツール
* Rust製(なので圧倒的に高速)
* All in one (Flake8/Black/isort/pydocstyle/pyupgrade/autoflake and so on)

cf. Ruff (ラフ) = 切り札を使う

公式サイト

* パフォーマンス比較結果も見れる

https://docs.astral.sh/ruff/
Github
https://github.com/astral-sh/ruff

【2】インストール

Rust製って聞いてたから、ひょっとしたら簡単に入らないかもっと思ったら
pip で簡単にインストールできた

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

インストール例

$ pip install ruff

$ ruff --version
ruff 0.3.2

【3】主なコマンド

* 以下の項目以外でやりたいと思ったら、
 ドキュメントより、help を使ってみた方がいい

1)ruff check - Linter

* Pythonのリンター(Flake8, isort, pydocstyle, pyupgrade, autoflake)

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

ruff check hello.py

ruff check .

--fixオプション

* 自動修正

https://docs.astral.sh/ruff/linter/#fixes

ruff check --fix hello.py

ruff check . --fix

2)ruff format - Formatter

* Python コードフォーマット (Blackみたいな感じ)

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

# Format a single file.
ruff format hello.py

# Format all files in the current directory
ruff format .

--diffオプション

* 差分表示のみ

【4】Hello world

1)ruff check

# デモ用のPythonコードを作成(違反内容は「1行に複数インポート」など)
$ echo -e "import os, boto3\n\nprint('Hello World...')" > hello.py

# コードチェック
$ ruff check hello.py
hello.py:1:1: E401 [*] Multiple imports on one line
hello.py:1:8: F401 [*] `os` imported but unused
hello.py:1:12: F401 [*] `boto3` imported but unused
Found 3 errors.
[*] 3 fixable with the `--fix` option.

# 「[*] 3 fixable with the `--fix` option.」って言ってるのでやってみる
$ ruff check --fix hello.py
Found 3 errors (3 fixed, 0 remaining).

# 確認
$ cat hello.py

print('Hello World...')
# 使っていない import 文が消えている

2)ruff check

# Pythonコード生成
$ echo -e "import os, boto3\n\nprint('Hello World...')" > hello.py

# 差分表示のみ
$ ruff format --diff hello.py
--- hello.py
+++ hello.py
@@ -1,3 +1,3 @@
 import os, boto3

-print('Hello World...')
+print("Hello World...")

1 file would be reformatted

# フォーマッタ実行
$ ruff format hello.py
1 file reformatted

# 同じファイルを作ってみる
$ echo -e "import os, boto3\n\nprint('Hello World...')" > hello_src.py

# 差分比較(「'」が「"」に変更)
$ diff hello_src.py hello.py
3c3
< print('Hello World...')
---
> print("Hello World...")

【5】その他の事項

1)設定

* 変更したくなったら、以下を参照

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

2)ルール

* 700以上あるらしい、、、

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

【6】Github Actionでの利用

* 以下の関連記事を参照のこと

Github Actions ~ Python関連 ~
https://dk521123.hatenablog.com/entry/2022/06/21/143624

参考文献

https://gihyo.jp/article/2023/03/monthly-python-2303
https://qiita.com/ciscorn/items/bf78b7ad8e0e332f891b
https://qiita.com/yuji38kwmt/items/63e82126076204923520
https://dev.classmethod.jp/articles/python-ruff/

関連記事

Python を奇麗に書くためのツール群
https://dk521123.hatenablog.com/entry/2021/11/08/221219
flake8 ~ Pythonコードチェック ~
https://dk521123.hatenablog.com/entry/2020/02/07/000000
black ~ Python formatter ~
https://dk521123.hatenablog.com/entry/2021/11/10/095258
Static Typing linter ~ mypy ~
https://dk521123.hatenablog.com/entry/2022/07/19/000000
Github Actions ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2021/11/04/142835
Github Actions ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2022/06/16/151443
Github Actions ~ エラー処理 / continue-on-error ~
https://dk521123.hatenablog.com/entry/2024/01/01/232057
Github Actions ~ サンプル集 ~
https://dk521123.hatenablog.com/entry/2023/12/31/231438
Github Actions ~ Python関連 ~
https://dk521123.hatenablog.com/entry/2022/06/21/143624
Github Actions ~ SQL Linter ~
https://dk521123.hatenablog.com/entry/2024/03/04/180308