trac-adminにコマンドを追加する
tracはweb uiだけでなく、CLIもtrac-adminという名前で提供しています。CLIのコマンドはメインプログラム内で制御されているケースが多いと思いますが、それではcoreを弄らずにコマンドを追加することができなくなります。tracの場合、trac-adminはコマンドを知りません。知っているのは、AdminCommandProviderインターフェースを実装しているプラグインの方で、trac-adminが知っているのはコマンドの問い合せ方だけです。前回のプラグインにAdminCommandProviderインターフェースの実装を追加してみます。
from trac.core import * from trac.timeline.api import ITimelineEventProvider from trac.admin import * from genshi.builder import tag from datetime import datetime from trac.util.datefmt import utc from trac.util.translation import _, tag_ revision = "$Rev: 0001 $" #url = "$URL: https://domain/plugins/modulename.py $" class HelloTimeline(Component): implements(ITimelineEventProvider, IAdminCommandProvider) # ITimelineEventProvider methods def get_timeline_filters(self, req): yield ('helloworld', _('hello opened and closed')) def get_timeline_events(self, req, start, stop, filters): author = 'author' yield ('helloworld', datetime.now(utc), author, ('#url', 'DESCRIPTION')) def render_timeline_event(self, context, field, event): url, desc = event[3] if field == 'url': return url elif field == 'title': return tag_('%(page)s created', page=tag.em('TITLE')) elif field == 'description': return tag(tag.a(href='###', title='Foo', accesskey=None)(desc)) # IAdminCommdandProvider methods def get_admin_commands(self): yield ("say hello", "", "hello trac-admin", None, self._say_hello) def _say_hello(self): print 'hello'
'trac-admin projectname'で開始します。'help say'でsay helloがコマンドとして登録されていることが確認できます。
Trac [/path/to/projectname]> help say
say hellohello trac-admin
'say hello'を実行してみると、期待通りの動きをしてくれました。
Trac [/path/to/projectname]> say hello
hello