Tracプラグインの作り方

マクロは書いたことがあるけどプラグインをちゃんと作るにはeggにしないといけない。そのへんのこと。

手順

  1. Componentを継承したクラスを作る
  2. setup.pyを書く
    • name (ex. FooBarPlugin)
    • version (ex. 0.0.1)
    • entry_points (ex. [trac.plugins]\ntracfoobar = tracfoobar)
      • この書き方の場合、__init__.py で必要なモジュールやパッケージを全部importしておく。
  3. python setup.py bdist_egg
    • TracPythonと同じバージョンでビルドすること
  4. dist/*.eggをプロジェクトのplugins/にコピー
    • 開発中は、開発中のソースを直接読む設定が便利。 python setup.py develop --multi-version --install-dir /path/to/projenv/plugins
    • この場合、trac.iniの[components]で.*=enabled が必要

名前

  • eggの名前は「FooBarPlugin」
  • パッケージ名は「tracfoobar」
    • というのがTrac-Hacksの流儀みたいだ

DBを使うプラグイン

テーブル作成などの初期化は、IEnvironmentSetupParticipantを利用する。これがあるとtrac-admin upgradeが必要になるのね。

TagsPluginのこのへん参照。 http://trac-hacks.org/browser/tagsplugin/trunk/tractags/api.py#L377

自分でインターフェースを作る

自分でインターフェースを作って自分で拡張することができる。コンポーネント間の結合を疎にできる、とか、いろんな機能のを作っておいてまとめる、みたいなことができる。

1.インターフェースとなるクラスを作る。

class IFooBar(Interface):
    def method1(self):
        pass
    def method2(self, arg):
        pass

2.実装クラスを作る。

class FooBar(Component):
    implements(IFooBar):
    def method1(self):
        # 実装

    def method2(self, arg):
        # 実装

3.この実装をコンポーネントマネージャ経由で呼び出す方法。

components = ExtensionPoint(IFooBar).extensions(comp)
for c in components:
    c.method1()

おまけ: tracdで認証する

http://bitten.edgewall.org/wiki/TracStandalone

$ tracd -p 8080 --auth project1,/path/to/users.htdigest,mycompany.com /path/to/project1

RewriteRuleを使ってApacheからTracに連携していると、Apache側の認証情報がTrac側に渡らない(当たり前?)。なので、tracdで認証できるようにする。気づかずにmod_rewriteとか調べてちょっとはまった。