鱒身(Masu_mi)のブログ

知った事をメモする場所。

Tinkerer の動き方

Tinkerer が動くための最初の流れをメモしておく。

このブログは Tinkerer で生成している。ようやくカスタマイズしたくなってきた。 だけど元々「reST形式で編集するブログ生成出来るらしい」って事しか知らずカスタマイズとか出来なかった。

概要

TinkererSphinx を使ってブログを生成する。Sphinx というreST形式から他の形式に変換するツールが存在する。 TinkererSphinx を呼ぶだけで実装は「 Sphinx 拡張 + コマンドラインフロントエンド」となっている。 Tinkerer 独自の処理はSphinx拡張で定義されており、 tinker -s で生成した設定ファイルでは最初から使う様に指定されている。

ちなみに Sphinx のマークアップは沢山ある。 Shinxの公式ドキュメント から ユーザードキュメント に辿り着ける。 ちゃんと調べてみるもんでマークアップが充実している。これから過去記事にタグ・カテゴリを振りながらマークアップも整理します。

設定ファイル

Sphinx はソースディレクトリ(Sphinxが処理する対象のトップレベルディレクトリ)に含まれる conf.py を設定ファイルとして使う。 extensionsに設定されている拡張が利用される。

extensions = ['tinkerer.ext.blog', 'tinkerer.ext.disqus']

上のはDisqus拡張も使う様に追加している。 モジュール tinkerer.ext.blog の挙動の説明は先に Sphinx 拡張の説明が必要なので別の機会に書く。

Sphinxが動くまで

コマンド tinker -b`Shpinx`_ を呼ぶまでを追う。 Sphinx が呼ばれるまでに解決される事が2つある。

  1. コマンド tinker の実行関数の特定
  2. tinkerのサブコマンド の識別

コマンド tinker の実行関数の特定

コマンドの実行コードの解決には pkg_resources/load_entry_point が使われていた。 実際に vim $(which tinker) してみたら以下の様に書かれていた。

# ...
from pkg_resources import load_entry_point
sys.exit(
  load_entry_point('Tinkerer==1.2.1', 'tinkerer')
)

上記は以下2つの事をしている。

  1. sys.exit はコマンドの実行ステータスを受け取り SystemExit を送出する。要するに明示的に終了している
  2. easy_install のサブモジュール pkg_resourcesload_entry_point でpkg情報とコマンド名からコマンドのエントリポイントを取得し実行する

load_entry_point で呼ばれる関数は PKGNAME-Ver-pyVer.egg-info/entry_points.txt ファイルに記述されいる。 自分の環境では以下となっている。

$ cat Tinkerer-1.2.1-py2.7.egg-info/entry_points.txt
...

[console_scripts]
tinker = tinkerer.cmdline:main

なのでコマンド tinkerer はlib内の tinkerer.cmdline:main を呼ぶ。 pkg_resources が 呼び出し可能オブジェクトを生成する部分は追っていない。

tinkerのサブコマンド の識別

tinker本体はディスパッチャで引数解析に`argparse`パッケージが使われている

ref. http://docs.python.jp/2/library/argparse.html

ビルド(“-b”)では tinkerer.cmdline:build が呼ばれる。 その中でフラグ類が設定されSphinxが呼ばれる。