Help us understand the problem. What is going on with this article?

pre-commit時にformatterを実行する

More than 1 year has passed since last update.

pre-commit時にformatterを実行する

はじめに

チームでコーディングルールが決ってないので、システム的に解決したいと考えました。
Gitにはhookという機能があり、cimmit時にshellを実行することができます。
commit時にformatを実行することで、リポジトリに綺麗なコードしかアップロードされないようにしようという試みです。

他の方法として、Lint系CIやCIでLintを実行することも考えていますが、別途試してみる予定です。

環境

pipenv
python3.7.1

設定方法

https://github.com/ikura1/test-pre-commit

  1. 環境のセットアップ
  2. formatterのインストール
  3. checkerのインストール
  4. pre-commitの設定

環境のセットアップ

pipenv --python 3.7.1
pipenv shell

仮想環境を使用しない場合は、なくても良い

formatterのインストール

pip install black

formatterの設定ファイルを作成

pyproject.toml
[tool.black]
line-length = 79
include = '\.pyi?$'
exclude = '''
/(
    \.git
  | \.hg
  | \.mypy_cache
  | \.tox
  | \.venv
  | _build
  | buck-out
  | build
  | dist
)/
'''

checkerのインストール

pip install flake8

checkerの設定ファイルを作成

.flake8
[flake8]
ignore = E203, E266, E501, W503, F403, F401
max-line-length = 79
max-complexity = 18
select = B,C,E,F,W,T4,B9

pre-commitをインストール

pip install pre-commit

pre-commit時に実行する設定を作成

.pre-commit-config.yaml
repos:
- repo: https://github.com/ambv/black
    rev: stable
    hooks:
    - id: black
      language_version: python3
- repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v1.2.3
    hooks:
    - id: flake8

pre-commitの設定

pre-commit install

動作

1.雑にダメなコードを書きます

hoge.py
    for i in range(1,10):
      text=''
      if i%3==0:
        text += 'Fizz'
      if i% 5== 0:
        text += "Buzz"
      print(text or i)

2.commitします

(Stady) bash-3.2$ git add hoge.py
(Stady) bash-3.2$ git commit -m'feat: add hoge.py'
black....................................................................Failed
hookid: black

Files were modified by this hook. Additional output:

reformatted hoge.py
All done! ✨ 🍰 ✨
1 file reformatted.

Flake8...................................................................Passed
(Stady) bash-3.2$

commitすると、blackとflake8が実行されます。blackのチェックが通らず、formatされることがあり、失敗しました。
ですが、blackでのformatが行われました。

3.ファイルを再度確認してみます。

hoge.py
for i in range(1, 10):
    text = ""
    if i % 3 == 0:
        text += "Fizz"
    if i % 5 == 0:
        text += "Buzz"
    print(text or i)

ファイルを確認すると、各所のスペースがなかった部分やシングルクォートになっていた部分が修正されており、formatterが実行されたことが確認できます。

4.もう一度addを実行後commitする

(Stady) bash-3.2$ git add hoge.py
(Stady) bash-3.2$ git commit -m'feat: add hoge.py'
black....................................................................Passed
Flake8...................................................................Passed
[master 093697f] feat: add hoge.py
 1 file changed, 7 insertions(+)
 create mode 100644 hoge.py
(Stady) bash-3.2$

blackとflake8ともにチェックが通過し、commitできたことが確認できました。

所感

pre-commitの動作としては、非常におもしろいとは思います。
ですが、目的であるチームのコード修正という意味では、一人一人の環境に対して準備する必要があるので、望ましい方法であるとは言えません。
また別の方法を模索してみます。なにかいい方法があれば御教授ください。

参考サイト

Automate Python workflow using pre-commits: black and flake8

ikura1
Pythonなんもわからん
https://ikura-lab.hatenablog.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした