SphinxでドキュメンテーションコメントをHTMLに変換する方法
前フリ
Pythonにはpydocというモジュールがあって、これを使うと同じようにAPIリストが出力できると思っていた。今までDjangoのコードを書いてみて、いわゆるヘッダーコメントとかドキュメンテーションコメントと言われているものをなんとなくjavadocライクに書いていたが、pydocだとあんまり期待した通りのHTMLを出力してくれないことが分かった。
自分が期待していたのは、
- @タグでクラス、関数属性に関する情報を出力
- phpDocumentorのように、テンプレートを変更可能
というものだったが、あんまりよろしくなかった。調べてみると、epydocというツールで実現できそうだったが、テンプレートはないらしい。もうちょっと調べてみると、Sphinxというドキュメンテーションツールがあるそうだ。すでに、以前のエントリーでちょっとした使い方について書いたが、インストール方法とかを書いてなかったので、ここにまとめておく。何かを作り始める時には、
- テスト
- ロギング
- ドキュメンテーション
- 国際化・地域化
をどうするか、最初に考えておくのはすごく大事だと思った。
Sphinxについて
すでにかなり有名なツールだそうなので、渋日記 Sphinxのドキュメントの日本語訳しましたにまとまってます。ブログでsphinxを検索すると、sphinx関連のエントリーがずらっと並びます。すげぇっす。特徴的なのは、reST(reStructeredText)形式でxxx.rstファイルを構築していくという点。pythonでドキュメンテーションコメントを書く場合は、docstringに書くことになっていると思うが、Sphinxではautodocという機能拡張を使って、半自動的にdocstringを取得して、rstファイルを生成してくれる。「半自動的」と書いたのは、どのモジュールのdocstringを出力するかを設定しなければ出力されないから。docstringを書いたからといって、それがそのまま出力されるわけではないので、この点は注意が必要。
使い方
以下、Windows 7での作業方法。きっとLinuxでもあまり変わらないはず。
easy_installでインストール
SphinxはPyPIで公開されているので、easy_installでインストール可能。
WindowsだとPYTHON_ROOT/Scripts
に必要なコマンドがインストールされるので、ここにパスが通ってなかったら適宜設定する。
初期設定
ドキュメントを出力する前にsphinx-quickstartというコマンドで初期設定する必要がある。Djangoではプロジェクトルートのディレクトリで、実行する。
このコマンドを実行すると、いくつか質問されるので、これに答えていく。
これが終わると、いくつかのファイルとディレクトリが作成される。
ビルド方法
sphinx-build
というコマンドを実行すると、htmlファイルが作成される。
aオプションを付けると、生成済みかどうかに関わらず、強制的にドキュメントを生成することができる。bオプションは出力方法を指定するためのオプション。ビルダーの指定、なのでbオプション。他にもpdfとかlatexなんかがあった気がするが、とりあえず使わないので、htmlで。第一引数はドキュメント化の対象となるディレクトリを指定する。第二引数は作成したドキュメントの出力先ディレクトリを指定する。このコマンドを実行すると、
というディレクトリが作成され、docディレクトリの中に作成されたドキュメントが出力されている。
autodoc
ドキュメントを作成していくには、rstファイルに出力するドキュメントを書いていくことになるが、Django、というかpythonの場合はdocstringにドキュメントを書いていくので、autodocという拡張機能を使って、出力することになる。
rstファイルの中に、automoduleというディレクティブを書くと、指定したモジュールのdocstringを読み込むようになる。
config.pyに設定すること
automoduleで指定する際には、いくつかのロールを設定しておく必要がある。基本的には必要なものはデフォルトで設定しておいて、設定されたくないロールがあるモジュールがある場合には、そのロールを外す、という方針とすると、rstファイルに書く内容が減る。
keep_warningsは、Sphinxの警告をドキュメントに出力するかどうか。メンテナンスの観点から、Trueにしておいた方がいいと思う。
autodocdefaultflagsに指定しているのは次の通り。
- members : 自動的にメンバーの関数やプロパティのドキュメントも取り込む
- undoc-members : docstringの付いていないメンバーも取り込む
- show-inheritance : クラスのシグニチャの直前に、継承しているベースクラスのリストを表示
phpDocumentorみたいに継承しているクラス・メソッドの一覧をまとめて出力してくれると便利なんだけど、これはどうするんだろう。
todolist
ソース中に書いてあるtodoを一か所に出力するtodolistというディレクティブもある。これを使うと、todoの内容と、どこに書いてあるtodoか、という情報が出力されるようになる。
ドキュメンテーションコメントの書き方
docstringの書き方はjavadocだと@タグを使って書いていくが、Sphinxでは:field:というフィールドを使って書いていくことになる。pythonで使用できるフィールドは詳細情報フィールドのリストに載っている。
例えば、functionやmethodの場合、
というように書く。
自動化
sphinx-build
でドキュメント生成できるなら、バッチファイルなり、シェルスクリプトに書いておいて、ApacheのDocumentRootに出力できると便利。gitにコミットした時点で自動的に実行するなら、hook?フォルダに入れておけばいいのかな。この辺は要調査。
出力対象が増えた時点で、rstファイルのメンテナンスが発生するので、そこはめんどくささとのトレードオフだと思うが、これだけいいものが使えるなら、それは許容すべきだと思う。こういった便利ツールがあるのとないのだと、継続的な開発はきびしいのかも。というより、2人以上が関わるようなシステムであれば、ドキュメントは作られるべき。
設計ツールとしてのSphinx:シーケンス図も書けます
疑似コードからシーケンス図を出力する拡張機能もあるみたいだし、こりゃぁ便利。ドキュメントも日本語化されてます。ありがたや。
ちょっとしたバグ
ブラウザによっては、クイック検索用のテキストボックスの長さがうまく設定されない。具体的にはinputタグのsize属性がうまく解釈されないらしい。cssにもwidthが設定されていないので、input textがはみ出す。cssを直せば済む話なので、気になる人は設定しておくといいかもしれない。