trac-adminにコマンドを追加する

tracはweb uiだけでなく、CLItrac-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 hello

hello trac-admin


'say hello'を実行してみると、期待通りの動きをしてくれました。

Trac [/path/to/projectname]> say hello
hello