Pythonの各種ツールをまとめて呼び出すツール。
- Formatters
- pyupgrade
- autoflake
- isort
- black
- ruff format (既定では無効)
- ruff check --fix (既定では無効)
- Linters
- pflake8 + flake8-bugbear + flake8-tidy-imports
- mypy
- pylint
- pyright (既定では無効、
pip install pyfltr[pyright]でインストール可能)
- Testers
- pytest
- 各種ツールをまとめて呼び出したい (時間節約のために並列で)
- 各種ツールのバージョンにはできるだけ依存したくない (ので設定とかは面倒見ない)
- exclude周りは各種ツールで設定方法がバラバラなのでできるだけまとめて解消したい (のでpyfltr側で解決してツールに渡す)
- blackやisortはファイルを修正しつつエラーにもしたい (CIとかを想定) (pyupgradeはもともとそういう動作)
- 設定はできるだけ
pyproject.tomlにまとめる
pip install pyfltr
# pip install pyfltr[pyright] # pyrightを使う場合pyfltr [files and/or directories ...]対象を指定しなければカレントディレクトリを指定したのと同じ扱い。
指定したファイルやディレクトリの配下のうち、pytest以外は*.pyのみ、pytestは*_test.pyのみに対して実行される。
終了コード。
- 0: Formattersによるファイル変更無し、かつLinters/Testersでのエラー無し
- 1: 上記以外
--exit-zero-even-if-formattedを指定すると、Formattersによるファイル変更があっても
Linters/Testersでのエラー無しなら終了コードは0になる。
pyfltr \
--commands=pyupgrade,autoflake,isort,black,ruff-format,\
ruff-check,pflake8,mypy,pylint,pyright,pytest \
[files and/or directories ...]カンマ区切りで実行するツールだけ指定する。
以下のエイリアスも使用可能。(例: --commands=fast)
format:pyupgradeautoflakeisortblackruff-formatlint:ruff-checkpflake8mypypylintpyrighttest:pytestfast:pyupgradeautoflakeisortblackruff-formatruff-checkpflake8
※ 後述のpyproject.tomlの[tool.pyfltr]で無効になっているコマンドは無視される。
ターミナル上で実行すると、Textual ベースの TUI が自動的に有効になる。 各コマンドの出力をタブで切り替えて確認できる。
--no-ui: UIを無効化し、出力を直接ターミナルに表示--ci: CI環境向け (--no-shuffle --no-ui相当)
その他のオプションは pyfltr --help を参照。
pyproject.tomlで設定する。
[tool.pyfltr]
preset = "latest"
pyupgrade-args = ["--py38-plus"]
pylint-args = ["--jobs=4"]
extend-exclude = ["foo", "bar.py"]設定項目と既定値はpyfltr --generate-configで確認可能。
- preset : プリセット設定(後述)
- {command} : 各コマンドの有効/無効
- {command}-path : 実行するコマンド
- {command}-args : 追加のコマンドライン引数
- exclude : 除外するファイル名/ディレクトリ名パターン(既定値あり)
- extend-exclude : 追加で除外するファイル名/ディレクトリ名パターン(既定値は空)
presetを設定することで、一括して設定を変更できる。
"latest" または日付指定 ("20250710") が使用可能。
[tool.pyfltr]
preset = "latest"これらのプリセットは、以下の設定を自動的に適用する。
pyupgrade = falseautoflake = falsepflake8 = falseisort = falseblack = falseruff-format = trueruff-check = true
preset = "latest"は予告なく動作を変更する可能性あり。
[dependency-groups]
dev = [
...
"pyfltr",
]
...
[tool.pyfltr]
preset = "latest"
pyright = true
pylint-args = ["--jobs=4"]
mypy-args = ["--enable-error-code=unused-awaitable"]
[tool.ruff]
# https://docs.astral.sh/ruff/configuration/
line-length = 128
[tool.ruff.lint]
# https://docs.astral.sh/ruff/linter/#rule-selection
select = [
# pydocstyle
"D",
# pycodestyle
"E",
# Pyflakes
"F",
# pyupgrade
"UP",
# flake8-bugbear
"B",
# flake8-simplify
"SIM",
# flake8-import-conventions
"ICN",
# isort
"I",
]
ignore = [
"D107", # Missing docstring in `__init__`
"D415", # First line should end with a period
]
[tool.ruff.lint.pydocstyle]
convention = "google"
[tool.ruff.lint.per-file-ignores]
"**_test.py" = ["D"]
"**/__init__.py" = ["D104"] # Missing docstring in public package
[tool.mypy]
# https://mypy.readthedocs.io/en/stable/config_file.html
allow_redefinition = true
check_untyped_defs = true
ignore_missing_imports = true
strict_optional = true
strict_equality = true
warn_no_return = true
warn_redundant_casts = true
warn_unused_configs = true
show_error_codes = true
[tool.pytest.ini_options]
# https://docs.pytest.org/en/latest/reference/reference.html#ini-options-ref
addopts = "--showlocals -p no:cacheprovider --maxfail=5 --durations=30 --durations-min=0.5"
log_level = "DEBUG"
xfail_strict = true
asyncio_mode = "strict"
asyncio_default_fixture_loop_scope = "session"
asyncio_default_test_loop_scope = "session" - repo: https://github.com/DavidAnson/markdownlint-cli2
rev: v0.21.0
hooks:
- id: markdownlint-cli2
- repo: local
hooks:
- id: textlint
name: textlint
entry: textlint
language: node
files: \.(md|mdown|markdown)$
args: []
require_serial: false
additional_dependencies:
- textlint@15.5.1
- textlint-rule-preset-ja-technical-writing@12.0.2
- textlint-rule-preset-japanese@10.0.4
- repo: local
hooks:
- id: pyfltr
name: pyfltr
entry: uv run pyfltr --commands=fast
types: [python]
require_serial: true
language: system - uv install --no-interaction
- uv run pyfltr