こんにちわ。今日から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 を読みました。あまり読めなかったけど。

何をかけばいいの?

何をかけばいいのかわからなかったので、 httpiesetup スクリプトを書くを参考にしました。 大まかに二つあり、何をインストールするかとメタデータです。何をインストールするかとは、 パッケージをインストールするかスクリプトをインストールするかなどです。依存関係も含まれます。 メタデータは、パッケージ名やバージョンや著者などがあります。詳しくは Additional meta-data をご覧ください。

メタデータで困ったのは、licenseとclassifiersでした。licenseに関してこの際に調べようと思い、 ライセンスの選択を恐れる必要はありません を参考にして、MIT LICENSEにしました。classifiersはhttpielist_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は終わります。読んでいただいた方がいたら、幸いです。

« NginxでREST認証してS3へリバースプロキシー

AMI作成の概略図 »

blog comments powered by Disqus

Categories

Uncategorized (rss) (2) | blogofile (rss) (2) | designpettern (rss) (3) | flask (rss) (2) | fluxflex (rss) (3) | java (rss) (6) | nginx (rss) (6) | python (rss) (8) | sacloud (rss) (3) | spdy (rss) (2) | thistownneedsguns (rss) (2) | webService (rss) (2) | zabbix (rss) (3) | さくらVPS (rss) (4) | 芸術は爆発しろ (rss) (3) |