2007年10月11日

Paster Template を作ってみる


paste.script の paster は、createコマンドで、プロジェクトテンプレートから初期状態のプロジェクトを作成できる。テンプレートを自分で作れるようになれば、サンプルコードをコピペするよりスマートだし、パッケージ名やモジュール名の修正ミスもなくなって便利だね。ということで、プロジェクトテンプレートの作り方。



プロジェクトテンプレートたる条件は、paste.paster_create_template への entry_point を持っていること。具体的には、setup.py に以下のように書く。


setup(
#snip
entry_points="""
# -*- Entry points: -*-
[paste.paster_create_template]
roadcones=roadcones.template:RoadConesTemplate
""",
)


まずは、paste.scriptをつかって、setuptools readyなプロジェクトベースを作ろう。



$ paster create RoadCones


(ちなみに、この例では、egg名をRoadConesという名前にしている。
RoadConesってのは、道においてある円錐上のあれのことで、Pylonsとも呼ばれる。
Pylonsプロジェクトがどんな由来で命名されてるのかは知らないけどね。)



プロジェクトベースを作成したら、setup.py にentry_pointsを追加する。
setup.pyを編集した後は、setup.py egg_info でメタデータファイルを更新しておこう。



$ python setup.py egg_info


では、実際のテンプレートを作成しよう。
テンプレートは、paste.script.template.Templateクラスのサブクラスとして作成する。
(このサブクラスを以下テンプレートクラスと呼ばせてもらうよ。)
テンプレートクラスは、テンプレートのメタデータを持つ。
そのプロジェクトが使うegg_pluginや、サマリー、テンプレートファイルの場所、そして、元にするテンプレートなど。
特に既存のテンプレートを指定できることを覚えておこう。



# -*- coding:utf-8 -*-

from paste.script import templates

class RoadConesTemplate(templates.Template):

egg_plugins = ['RoadCones']
required_templates = ['pylons']
_template_dir = 'templates/default'
summary = 'Pylons SqlObject template'


RoadConesTemplateクラスがテンプレートクラスだ。
pylonsベースで、追加の初期コードを提供するテンプレートを想定しているので、required_templatesにpylonsテンプレートを指定する。
こうしておくと、pylonsのテンプレートを展開した後に、roadconesのテンプレートを展開するようになる。
_template_dir は、実際のテンプレートの置き場所を指定する。
相対パスで書いてるけど、これが、template.py からの相対パスなのか、テンプレートプロジェクト内の相対パスなのか、確かめていない。
summary は、このテンプレートの説明で、 paster create --list-templates コマンドで確認できる。
テンプレートディレクトリを作成しておこう。



$ mkdir -p templates/default


paste.scriptプラグインの常として、egg_infoを登録しないといけない。
インストールしてしまえば、登録されるのだけど、このパッケージはまだ作成中だ。
developコマンドを使うと、編集中のコードベースをそのまま登録できる。



$ python setup.py egg_info
$ sudo python setup.py develop


とりあえずこの状態で、プロジェクトテンプレートとして使用できる。
まだ、固有のテンプレートを追加していないので、pylonsのテンプレートを展開するだけのプロジェクトテンプレートだ。



$ paster create --list-templates # テンプレート一覧で確認
$ paster create -t roadcones # プロジェクトを作成