こんにちわ。今日から10月が始まります。nginxでbasic認証ためのパスワードを生成するときに、通常Apacheに 付属しているhtpasswdを使うことになる。けど、私の環境ではApacheはいれてない。opensslで生成することも可能 なんだけど、docoptというCLIを簡単に作成できるライブラリ があるので、それを使って実装します。pythonにはhtpasswdという ライブラリがすでにあるのでwrapするだけの実装です。もう一つ、車輪の再発明ですがpypiにもuploadします。 そういえば、CLIというと、paverも気になりますね。
docoptでCLIを作成
docoptはmoduleにコメントを書いておけばそれをparseして、結果をdictで返します。それで
どんな引数があるかわかる。下記のコードは動作しているもので、htpasswd-cli hoge
とコンソールから入力すると、
<password>に、引数としてhogeが入ります。今回の要件はpasswordをhashして、htpasswdに渡すだけ
なので簡単でした。argparseを使ったことがないからわからないけど、もう少し複雑になるんでしょ。
パッケージングに何をつかうの?
pypiへuploadするために必要なことは、パッケージングすることです。パッケージングするには、 何を使えばいいのか。Distutils, setuptools, distributeがありますが、2013年10月時点では、 setuptoolsです。経緯についてはdistribute と setuptools がマージされた をご覧ください。公式のPython モジュールの配布を 見るとdistutilsを使ってますが、setuptoolsです。documentは英語しかないので、 Building and Distributing Packages with Setuptools を読みました。あまり読めなかったけど。
何をかけばいいの?
何をかけばいいのかわからなかったので、 httpieと setup スクリプトを書くを参考にしました。 大まかに二つあり、何をインストールするかとメタデータです。何をインストールするかとは、 パッケージをインストールするかスクリプトをインストールするかなどです。依存関係も含まれます。 メタデータは、パッケージ名やバージョンや著者などがあります。詳しくは Additional meta-data をご覧ください。
メタデータで困ったのは、licenseとclassifiersでした。licenseに関してこの際に調べようと思い、 ライセンスの選択を恐れる必要はありません を参考にして、MIT LICENSEにしました。classifiersはhttpieと list_classifiersを参考にして、 以下の項目を記しました。
- Development Status
- Programming Language
- Environment
- Intended Audience
- License
- Topic
それで、要件はscriptです。scriptsで書けますが、 entry_points で書くことにしました。moduleを指定したあとに:で区切って関数を指定します。メタデータと 合わせて書いています。
localで試す
pypiにあげる前に、localでうまく動作するか試したいですね。調べるとありました。pipでローカルの ファイルをinstall, uninstallできます。
# install pip install -e . # uninstall pip uninstall htpasswd-cli
大丈夫であれば、pypiにuploadして完成です。
問題だったとこ
moduleの命名規則とパッケージの配布物ではまりました。htpasswd-cliと名付けているんですが、このままつけると
python setup.py sdist
でエラーが起きるんですよね。
moduleの名前規則
を見ると当然のことで、-は使えませんでした。そういえば、-とかいままで一切使わなかった。scriptの名前として
はこのまま利用できます。次へすすんで、setup.pyのlong_descriptionのところをみると、markdownを読み出して
います。python setup.py sdist
でパッケージしても、markdownをパッケージしてくれません。そのため、
エラーになります。 パッケージに直接関係のない配布物を含めるには、MANIFEST.inを利用します。
最後に
これにて、toenobu.nameのblogは終わります。読んでいただいた方がいたら、幸いです。