tg-admin コマンドのプラグイン

ここではコマンドラインツールである tg-admin のプラグインをどのように作成することができるのかについて詳しく述べます。これを知ればあなたのサイトにぴったりのコマンドラインツールを作成することもできますし、他の人がインストールできるようにPyPIにアップロードしてしまうくらい十分に一般化された何かを作ることもできるでしょう。このコマンドプラグインシステムは思ったほど手強いものではありません。ただ少しばかり setuptools に通じている必要があります。

基本的なコマンドプラグイン

コマンドプラグインシステムがどのように動作するかということを説明するために、 testcommand という名前のとても基本的なコマンドプラグインを作ってみましょう。このプラグインはコマンドラインから実行したときに "This is a test" と出力すること以外は何もしません( tg-admin testcommand として実行する)。

ファイルの構成

このテストプラグインは2つのファイルしか必要としません。以下が必要なものです:

testcommand/setup.py
testcommand/testcommand/testcommand.py

setup.py ファイルはパッケージを定義します。 testcommand.py はコマンドライン引数を生成するために tg-admin に用いられます。

setup.py

始めるのに一番重要なのはsetup.pyですので、これを見てみましょう:

from setuptools import setup, find_packages
from turbogears.finddata import find_package_data

setup(
    name="testcommand",
    version=0.1,
    zip_safe=False,
    install_requires = ["TurboGears >= 1.0b1",],
    packages=find_packages(),
    package_data=find_package_data(),
    entry_points="""
    [turbogears.command]
        testcommand = testcommand.testcommand:TestCommand
    """)

ファイルの先頭にある2つの大切な宣言は後々便利になってくるコマンドをもたらしてくれます。 setup はsetuptoolsが新しいパッケージを定義するために使用されます。またTurboGearsがコマンドプラグインを定義するのにも使われます。 find_packagesfind_package_data はこのパッケージのリソースを集めるために使われます。

setup の呼び出しは新しいパッケージを定義するために使われます。ここではどのような引数が使われているのかちょっとまとめておきます:

  • name - パッケージの名前を定義する。これは他のパッケージの install_requires 引数の中で依存関係を処理するために用いられる。
  • version - パッケージのバージョンナンバー。これは他のパッケージの install_requires 引数の中で、このパッケージの正しいバージョンであることを確認するために用いられる。
  • zip_safe - このパッケージ内のファイルを圧縮アーカイブから安全に実行するかどうかを setuptools に伝える。アーカイブからコードを安全に実行することに何が関わっているのか不明であるのでここではfalseとしておく。
  • install_requires - このパッケージが依存しているパッケージの名前、あるいは名前とバージョンのセットのリスト。ここではバージョン1.0b1以上の TurboGears? を必要としておく(バージョン0.9のユーザは、これをそのバージョンへ書き換えても今回の場合は問題ない)。
  • packages - I have no information on this parameter
  • package_data - I have no information on this parameter
  • entry_points - ここに示された文字列は、このコードがどこから呼ばれるかを定義した設定ファイルとして再度書き直される。 tg-admin が起動すると、使用するモジュールとコマンドの名前のリストとして turbogears.command エントリポイントを探す。 testcommand = testcommand.testcommand.TestCommand? という宣言は、 testcommandtg-admin コマンドとして登録し、 TestCommand? クラスを testcommand.testcommand モジュールで使うように指示する。

setup() には他にも、パッケージについての情報をさらに定義するのに使われたり、PyPIにアップロードするのに使われたりする情報を提供するたくさんの引数があります。これらはまた後で説明されるでしょう。

testcommand.py

このファイルは、 tg-admin testcommand が実行されたときに setup.py ファイルが指示する TestCommand? クラスを含んでいます。このファイルの内容は以下のようになっています:

class TestCommand:
    """Tests command-line plugin"""
    desc = "Print test output from a command line plugin"
    need_project = False
    name = None
    package = None
    __version__="0.1"
    __author__="John Doe"

    def __init__(self, version):
        pass

    def run(self):
        print "This is a test"

このコマンドラインプラグインシステムはいくつかのアトリビュートとクラス内で定義された run メソッドを探します。ここでリストアップされたアトリビュートはプラグインが動作するためのぎりぎり最小限のものです。その他のオプションはあとで議論されるでしょう。この run メソッドはプラグインが実行されるときに呼ばれ、プラグインの機能をスタートするでしょう。

テストプラグインのインストール

TurboGears?がこのテストプラグインを使う前に、これはインストールされる必要があります。インストールするためには、プロジェクトのsetup.pyファイルがある場所へこのディレクトリを移動させて、次のコマンドを入力します:

python setup.py develop

develop 引数は setup.py の中にある setup() 関数に、このプラグインの開発ビルドをシステムへインストールするように指示します。これによってパッケージのegg情報が生成され、 /Lib/site-packages フォルダへ testcommand.egg-link を置きます。これはTurboGearsにカレントフォルダでこれらのファイルを見つけるように指示します。これで tg-admin testcommand を実行し、望ましい結果を見ることができるようになります。こんなふうに見えるはずです:

$ tg-admin testcommand
This is a test

派手な機能は何もありませんが、ちゃんと動いています。あなたがほしい機能を追加するためにこれを拡張するのはそれほど難しいことではありません。

PyPI?/Cheeseshopで入手可能にする

CogBin?へ登録する

turbogears.command キーワードでPyPI/Cheeseshopへ登録されると、自動的にCogBinの "tg-admin Commands" セクションへ登録されます。