single quotes な Black を vendoring して packaging
Python その2 Advent Calendar 2018 の 2 日目の記事です。
ソフトウェアエンジニアの花岡です。今回は Black にパッチを当てて single quotes を優先するようにしたものを vendoring して packaging する方法について紹介します。
Black とは、妥協なき Python コードフォーマッタ(The uncompromising Python code formatter)を掲げて、Python の core developer である Łukasz Langa さんが開発されたものです。pipenv、attrs、tox など多くのプロジェクトで使われるようになってきました。
Black での quotes の標準化については
- black#51 double quotes への標準化が決定
- black#118
--single-quote
オプションの提案が却下され、quotes の標準化をしない--skip-string-normalization
オプションが追加 - black#373
--single-quote
オプションの再提案が却下 - black#594
--single-quote
オプションの再々提案は現在のところ進捗なし
という状況です。
single quotes を好む場合、Black だけでは quotes の標準化ができないので flake8-quotes や pre-commit-hooks の double-quote-string-fixer などと組み合わせる必要があります。
そこで pip を参考にして、Black に patch を当てて vendoring することにしました。single quotes を優先させるには 1 文字変更するだけでした。
https://github.com/grktsh/ffffff
vendoring
https://github.com/pypa/pip/tree/9c0a1daace0bac75e247d045714178f800f40cc6/tasks をコピーして、tasks/vendoring/__init__.py
を Black の vendoring に合うように少し修正しました。
vendoring するパッケージは ffffff/_vendor/vendor.txt
に requirements file 形式で指定しています。
vendoring は invoke コマンドで実行します。開発時に必要なパッケージはすべて Pipfile の dev-packages で指定しているので pipenv install --dev
後にプロジェクトルートディレクトリで pipenv run invoke vendoring.update
することで vendoring できます。その際、tasks/vendoring/patches
にあるパッチファイルが適用されます。
また今回は single quotes を優先するだけでなく DEFAULT_LINE_LENGTH
を 79 にしています。PEP 8 では
Limit all lines to a maximum of 79 characters.
The Python standard library is conservative and requires limiting lines to 79 characters (and docstrings/comments to 72).
といっているので、ユーザが
it is okay to increase the nominal line length from 80 to 100 characters (effectively increasing the maximum length to 99 characters), provided that comments and docstrings are still wrapped at 72 characters.
に従って値を変更するは OK だとしてもコードフォーマッタのデフォルトは 79 にしたかったからです。
packaging
パッケージのメタデータは setup.cfg で指定しています。setup.py は setuptools_scm の設定のみです。
setuptools_scm は SCM のタグに基づいてメタデータの version
を生成してくれるライブラリです。さらに setup.py ではそのバージョンを ffffff/__init__.py
に書き出すように設定しています。
ffffff/__init__.py
は gitignore しているので GitHub では見えませんが、sdist、bdist_wheel したパッケージには
__version__ = '2018.11.15'
というような内容の ffffff/__init__.py
ファイルが含まれています。
さいごに
弊社では以下のようなエンジニアを募集しています。是非↓↓からご連絡をお願いします。
- ユーザー志向でものづくりができる方
- スピード感のある開発が出来る方
- 変化や挑戦に対して、ポジティブに捉えることができる方
- チームメンバーを尊重し合える人
- 新たな知識、技術の習得に積極的な人
- プロダクトの品質に妥協しない方
- 知らない事があっても自分で調べる、または積極的に相談ができる方
- 改善提案、機能提案が出来る方
その他の記事
Other Articles
関連職種
Recruit