ひよっこ。

I want to…

bazaarのプラグインを作る(1)

Posted by hikaruworld : 2011 12月 25

bazaarのよいところの一つはpythonで簡単にプラグインを書ける事です。
知ってはいたんですが、作った事なかったのでHelloWorldしてみました。

1.基本的なルール

1-1.プラグインのインストール場所

bzrのプラグインは$HOME/.bazaar/plugins以下に配備すると自動でモジュールをロードしてくれます。
実際にどんなプラグインをインストールしているかは、

bzr plugins

とコマンドを打つことで確認できます。

1-2.参考にする実装

bzrは起動時にビルドインコマンドを読み込みます(bzr infoとかです)。
そのコマンド自体はbzrlib/builtins.pyで定義されているのでプラグインを作成するときには参考にしましょう。

2.helloプラグインの実装

2-1.プラグインの作成

プラグイン自体をbzrに認識させる方法は3つありますが、1つはビルドインコマンドなどが使う方法なので、通常は$HOME/.bazaar/pluginsに配備する方法で実現します。

1つ目のもっとも単純な方法は、plugins以下に任意のpythonファイルを置くことです。
例えば今回の場合であれば、以下のように配置し、bzr pluginsで確認してみると

$ cd ~/.bazaar/plugins
$ touch hello.py

hello
(no description)

という風に認識してくれます。

もう一つは、任意のディレクトリを作成して、__init__.pyを置くことです。
こちらの方が主流ですね(って、スクリプトだけのプラグインってみたことないですが)。

$ cd ~/.bazaar/plugins
$ mkdir hello
$ touch hello/__init__.py

但し、この状態ではプラグインのコマンドなどは定義されていないので、

$ bzr hello

とかやっても、こんな感じで怒られます。

invalid syntax (, line 1)
Unable to load ‘.hello’ in ‘~/.bazaar/plugins’ as a plugin because the file path isn’t a valid module name; try renaming it to ‘_hello’.
bzr: ERROR: unknown command “hello”

2-2.helloコマンドの作成

今回の目的はbzr helloとコマンドを打つと、
標準出力にHello Worldと出力するプラグインなので、
helloコマンドを新しく定義します。

bzrのコマンド(infoやbranchのようなもの)は
bzrlib.commands.Commandクラスを継承して実装する必要があります。
今回はhelloコマンドなので定義だけならこんな感じになります。
Defining a new commandに書いてあるままです。

from bzrlib.commands import Command, register_command

class cmd_hello(Command):
     pass

register_command(cmd_hello)

注意点は、クラス名のprefixとしてcmd_が付与されること、
アンダースコア(_)でつないだ場合にはコマンド時にはハイフンつなぎになる事くらいです。
# cmd_hoge_piyoはhoge-piyoというコマンドになります。

但し、このままではhelloコマンドを実行してもエラーになってしまいます。

bzr: ERROR: exceptions.NotImplementedError: no implementation of command ‘hello’

新しいコマンドを作成した場合は、run関数を実装してあげる必要があります。

from bzrlib.commands import Command, register_command

class cmd_hello(Command):
    def run(self):
        print “Hello World”

register_command(cmd_hello)

これでbzr helloと実行するとHelloWorldと表示してくれるプラグインが出来上がります。

$ bzr hello
Hello World

2-3.helloコマンドのプラグイン情報の記述

bzr pluginsやbzr help XXX(プラグインのコマンドとか)をしてみるとわかりますが、
プラグインにはさまざまなメタ情報が設定されています。

launchpad 2.4.1
Launchpad.net integration plugin for Bazaar.

この設定を行います。

バージョンの記述

バージョンの記述はプラグインを定義しているファイルにversion_infoという値をタプルで定義します。

version_info  = (0, 1, 2, "dev", 0)

上記のように定義してbzr pluginsで確認してみると0.1.2devという風に表示されます。
5番目の要素に0を指定した場合は空気読んで表示されないみたいですね。

プラグインの概要を記述する

bzr pluginsを実行したときにそのプラグインに関する概要が表示されると思います。
この設定もプラグインファイルの冒頭にコメントを記述することで表記可能です。

""" This plugin description"""

複数行書いても概要で表示されるのは1行目だけです。

これでHelloWorldプラグインは完成です。
こんな感じになります。

"""This plugin is print HelloWorld
"""
from bzrlib.commands import Command, register_command

class cmd_hello(Command):
    def run(self):
        print “Hello World”

version_info = (0, 1, 2, "dev", 0)

register_command(cmd_hello)

長くなってきたのでに続きます…。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

 
%d人のブロガーが「いいね」をつけました。