single quotes な Black を vendoring して packaging

2018/12/02
このエントリーをはてなブックマークに追加

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

2022/06/03
拡張子に Web アプリを関連付ける File Handling API の使い方

2022/03/22
<selectmenu> タグできる子; <select> に代わるカスタマイズ可能なドロップダウンリスト

2022/03/02
Java 15 のテキストブロックを横目に C# 11 の生文字列リテラルを眺めて ECMAScript String dedent プロポーザルを想う

2021/10/13
Angularによる開発をできるだけ型安全にするためのKabukuでの取り組み

2021/09/30
さようなら、Node.js

→
←

関連職種

Recruit

→
←

お客様のご要望に「Kabuku」はお応えいたします。
ぜひお気軽にご相談ください。

お電話でも受け付けております
03-6380-2750
営業時間:09:30~18:00
※土日祝は除く