rcmdnk's blog

ロバストPython ―クリーンで保守しやすいコードを書く

Pythonのプロジェクトでpre-commitを使う際に 結構いろいろなパッケージを用意したり同じ様なことを書くので 自分用のpre-commitパッケージを作りました。

Pythonプロジェクト用のpre-commit環境

pre-commitの設定ファイルを書く際、 .pre-commit-hooks.yamlというファイルがあるレポジトリを指定するとそのレポジトリにその中身をロードして あらかじめ設定が入ったidを使って簡単にツールの設定が書けます。

また、そのidの設定で black などのフォーマッターなどのツールを指定した状態で、 languagepythonとすればpipで、golangだったらgo installで そのツールをインストールもしてくれます。

ただし、このインストールはpre-commit用の仮想環境の中にインストールされるので 直接blackなどのコマンドは使えません。

各種ツールをエディタの中でも使ってフォーマットとかしていると 通常のPATH下にツールを起きたいし、かつ設定も通常状態で共有できるようにしたい。

ということで、特にPythonのプロジェクトでpoetry+pyproject.tomlを使った環境であれば ツールのパッケージをdev環境でインストールするようにして pre-commitの設定ではlanguagesystemにして環境にインストールされたものを使うようにし、 設定項目も全てpyproject.tomlで管理することで poetryの仮想環境下であればpre-commitでも通常作業でも同じツール、設定を使うことが出来ます。

ただ、現状Pythonのpre-commit環境で色々とやろうと思うと結構たくさんパッケージをインストールする必要があって 同じ様なものが増えてきたのでそれ用のレポジトリ/パッケージを作ってまとめて 簡単にかけるようにしてみました。

pyproject-pre-commit

上のブログポストで使っているツールに関して、 全てlanguage: systemでidを作っている.pre-commit-hooks.yamlを持っています。

これを使って

.pre-commit-config.yaml
1
2
3
4
5
6
7
8
9
repos:
  - repo: https://github.com/rcmdnk/pyproject-pre-commit
    rev: v0.0.5
    hooks:
      - id: black-diff
      - id: black
      - id: blacken-docs
      - id: autoflake-diff
...

みたいな感じでrepoは一つだけで後はidをリストしていくだけで各種ツールが実行されます。

language: systemで パッケージはインストールしない設定になっているので別途インストールする必要がありますが、 そちらはレポジトリの pyproject.toml の中にtool.poetry.dependenciesとして管理されています。

このレポジトリ自体がPyPIに公開されているので、

1
$ pip install pyproject-pre-commit

とすれば必要なツールが一通り入るようになっています。

pyproject-pre-commit · PyPI

poetryを使っている場合、

1
$ poetry add --group dev pyproject-pre-commit

で開発ように追加しておけば

pyproject.toml
1
2
3
4
5
6
7
...

[tool.poetry.group.dev.dependencies]
pyproject-pre-commit = "0.0.8"


...

のようにpyproject.tomlの中もスッキリとなります。

後はpyproject.tomlに各種ツールの設定を追加すればOK。

この設定に関してもある程度 .pre-commit-hooks.yamlの中で 書いてしまう事も考えられますが 上書きできないオプションとかで利用する側から変更できないのも嫌なので 一旦最小限のことだけにして各種設定は各プロジェクトの中で書くようにしています。

使用例

chatgpt-prompt-wrapper/.pre-commit-config.yaml at main · rcmdnk/chatgpt-prompt-wrapper · GitHub

chatgpt-prompt-wrapper/pyproject.toml at main · rcmdnk/chatgpt-prompt-wrapper · GitHub

Sponsored Links
Sponsored Links

« GitHub Actionsで`bash`を指定すると`pipefail`オプションが付く python-action: pytestなどを実行するGitHub Action »

}