車輪の再発明

またつまらぬコードを書いてしまった

.gitignoreをテンプレートから生成するツールを作った

はい、車輪の再発明です。

Git-ignore ~ template helper

github.com

インストール

pip install git-ignore

使い方

git-ignore python sass

複数のテンプレートを指定できます。この場合PythonのgitignoreとSassのgitignoreを合わせて.gitignoreに書き出します。


どうして作ったか

.gitignoreファイルってみんなどう書いてるんでしょう。これと決めたテンプレートから持ってくるのがお手頃だと思うけど、他の人がどうやっているのかよく知らん。

ググってみるとこの手のツールはあるにはありそうで、だけど一強ぽいのが無い&Python製のは2系のままだった*1ので、再発明することにしました。

テンプレートはありがたいことに天下のGitHubが公開しているもの*2があったので、submoduleで取ってきて使うことに。

書き慣れていてインストールも簡単なPythonで書きます。click大好きおじさんです。

今回の新しい発見は、モジュールを作る際にモジュールの中に置いたファイルを利用する方法です。 何も考えずにwith open(...)とか書くと実行時にファイルがありませんと怒られます。当然ですね。 で、モジュールの中のファイルをどうやって開くかというと、pkg_resourcesを使います。*3*4

pkg_resources.resource_string() バイト文字列として開きます。
pkg_resources.resource_stream() ファイルぽく開くそうです。(StringIOか?)
pkg_resources.listdir() ディレクトリ内をリスト形式で取得できます。os.path.listdir()と同じ形の返り値。

しかしこれだけではビルドするときにファイルが含まれません。 色々調べたのですが、 MANIFEST.in + include_package_data=True 説*5*6 とか見つかったものの機能せず。そもそもMANIFESTは自動生成されるっぽいのですが、それを手動で書いて何が嬉しいのかよくわかりませんでした。 結局setup.pyのドキュメントを読んで色々試した結果、

2. Writing the Setup Script — Python 3.7.0 documentation

package_dataという引数を指定することで解決しました。

あと、ヘルプメッセージを出力するのに標準モジュールのtextwrapが便利だなと感じました。 textwrap — Text wrapping and filling — Python 3.7.0 documentation