Tinkerer の動き方
このブログは Tinkererで生成している。 Tinkererが動くための最初の流れをメモしておく。
TinkererとSphinxの関係
SphinxというreST形式から他の形式に変換するツールが存在する。 TinkererはSphinxを使ってブログを生成する。 TinkererはSphinxを呼ぶだけで実装は Sphinx拡張 + コマンドラインフロントエンドとなっている。
Tinkerer独自の処理はSphinx拡張で定義されていて
tinker -s
コマンドで生成した設定ファイルに最初から使う様に指定されている。
ちなみに Sphinx のマークアップは沢山ある。 Shinxの公式ドキュメントからユーザードキュメントに辿り着ける。
設定ファイル
Sphinxはソースディレクトリ(Sphinxが処理する対象のトップレベルディレクトリ)に含まれる
conf.py
を設定ファイルとして使う。extensionsに設定されている拡張が利用される。
|
|
上のはDisqus拡張も使う様に追加している。
モジュールtinkerer.ext.blog
の挙動の説明は先にSphinx拡張の説明が必要なので別の機会に書く。
Sphinxが動くまで
コマンドtinker -b
がSphinxを呼ぶまでを追う。
Sphinxが呼ばれるまでに解決される事が2つある。
- コマンド
tinker
の実行関数の特定 - tinkerのサブコマンド の識別
コマンド tinker の実行関数の特定
コマンドの実行コードの解決にはpkg_resources/load_entry_point
が使われていた。 実際に vim $(which tinker)
したら以下の様に書かれていた。
|
|
上記は以下2つの事をしている。
- sys.exit はコマンドの実行ステータスを受け取り SystemExit を送出する。要するに明示的に終了している
easy_install
のサブモジュールpkg_resources
のload_entry_point
でpkg情報とコマンド名からコマンドのエントリポイントを取得し実行する
load_entry_point
で呼ばれる関数はPKGNAME-Ver-pyVer.egg-info/entry_points.txt
ファイルに記述されいる。
自分の環境では以下となっている。
|
|
なのでコマンドtinkererはlib内のtinkerer.cmdline:main
を呼ぶ。
pkg_resources
が呼び出し可能オブジェクトを生成する部分は追っていない。
tinkerのサブコマンド の識別
tinker本体はディスパッチャで引数解析にargparse
パッケージが使われている
ref. http://docs.python.jp/2/library/argparse.html
ビルド(-b
)では tinkerer.cmdline:build が呼ばれる。
その中でフラグ類が設定されSphinxが呼ばれる。