Twitter でクソコードと非難される時代になりました。今回は pre-commit 用いて Python のクソコードを綺麗にします。
使用する Hook は、black、isort、flake8 になります。
pre-commit とは
pre-commit は GitHook スクリプトをコミット前に実行する。つまり、コミット前に自動的に実行できるため、linter やオートフォーマットを自動実行できる。
以下のようなイメージである。
ステージング -> pre-commit -(コーディング規約を遵守していれば)-> コミット
したがってクソコードを強制的にに防ぐことができるようになる。本記事では Python による用途で紹介するが、別のプログラミング言語でも GitHook さえあれば問題ない。
環境構築
Windows10+venv+Python で環境構築する。詳細は、以下の記事を参照。
virtualenv.exe pre-commit-example
cd pre-commit-example
# 仮想環境にアタッチする。
source Scripts/activate
pip install pre-commit
pre-commit の設定
pre-commit 用の設定ファイルとして.pre-commit-config.yaml
、Python プロジェクトファイルのpyproject.toml
を作成する。
touch .pre-commit-config.yaml
touch pyproject.toml
エディタから以下のように追記する。
.pre-commit-config.yaml
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v3.2.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
- id: check-added-large-files
- repo: https://github.com/psf/black
rev: 22.3.0
hooks:
- id: black
language: python
types: [python]
exclude: ^.*\b(migrations)\b.*$
- repo: https://github.com/pycqa/isort
rev: 5.10.1
hooks:
- id: isort
name: isort (python)
args: ["--profile", "black", "--filter-files"]
- repo: https://gitlab.com/pycqa/flake8
rev: 5.0.4
hooks:
- id: flake8
データ構成は以下のようになる。
- repo: [該当リポジトリ URL]
- rev: [リポジトリのリビジョン]
- hooks:
- id: [linter 名的なやつ]
- 引数や無視したいディレクトリを指定できる
- id: [linter 名的なやつ]
black 用の設定を追記する。
pyproject.toml
[tool.black]
py310 = true
line-length = 80
include = '\.pyi?$'
exclude = '''
/(
\.git
| \.hg
| \.mypy_cache
| \.tox
| \.venv
| _build
| buck-out
| build
| dist
| doc
)/
'''
以下のコマンドで準備完了です。
pre-commit install
クソコードを commit してみる
以下のようなコードをコミットする。
import sys
import black
import os
a =1
print("test" )
git commit -m ""
すると以下のようにコミットされずにコマンドが終了した。
ちなみに以下のコマンドで commit する前にチェックすることができる。
pre-commit run
この時点で、自動でファイルが整形されている。
まとめ
pre-commit はいいぞ