Shibuya.trac.8

16
Tracのソース読んでみたー 2010/10/01 Shibuya.trac 8回勉強会 ゆかわ 2010930日木曜日

Transcript of Shibuya.trac.8

Page 1: Shibuya.trac.8

Tracのソース読んでみたー

2010/10/01 Shibuya.trac 第8回勉強会

ゆかわ2010年9月30日木曜日

Page 2: Shibuya.trac.8

自己紹介

ハンドルネーム:wyukawa(Wataru Yukawa)

ブログ:http://d.hatena.ne.jp/wyukawa

Twitter:http://twitter.com/wyukawa

メーカー系のなんちゃってSE  ほとんどJavaしか知りません(汗

2010年9月30日木曜日

Page 3: Shibuya.trac.8

アジェンダ

Tracプラグインの作り方

Tracのアーキテクチャ

Tracプラグインの処理フロー

まとめ

2010年9月30日木曜日

Page 4: Shibuya.trac.8

Tracプラグインの作り方

Componentクラスを継承

拡張ポイントをimplements

拡張ポイントのメソッドを実装

2010年9月30日木曜日

Page 5: Shibuya.trac.8

HelloWorldプラグインclass HelloWorldPlugin(Component): implements(INavigationContributor)

# INavigationContributor methods def get_active_navigation_item(self, req): return 'helloworld' def get_navigation_items(self, req): yield ('mainnav', 'helloworld', html.A('Hello world', href= req.href.helloworld

2010年9月30日木曜日

Page 6: Shibuya.trac.8

Tracのアーキテクチャ拡張が容易なプラグインアーキテクチャプラグインはコンポーネントからなる。Trac自身もプラグインとして実装されている。例:AdminModule, TicketModule, WikiModule, ...その点Eclipseに似ている。

2010年9月30日木曜日

Page 7: Shibuya.trac.8

で、それを実現しているのは

2010年9月30日木曜日

Page 8: Shibuya.trac.8

一応説明(翻訳)すると、ComponentクラスはシングルトンメタクラスはComponentMeta

ComponentManagerがComponentのライフサイクルを管理

拡張ポイントはInterfaceを継承

ExtensionPointで拡張ポイントを宣言

2010年9月30日木曜日

Page 10: Shibuya.trac.8

Tracプラグインの処理フロー例はTicketSubmitPolicyPluginの管理画面からのリンク

IAdminPanelProviderを宣言しているのはAdminModule

TicketSubmitPolicyPluginはIAdminPanelProviderをimplementsしている(実装するのは get_admin_panelsとrender_admin_panelメソッド)

2010年9月30日木曜日

Page 11: Shibuya.trac.8

図にするとこんな感じ

AdminModule

TicketSubmitPolicyPlugin

IAdminPanelProvider(get_admin_panels,

render_admin_panel)

2010年9月30日木曜日

Page 12: Shibuya.trac.8

class AdminModule(Component):...略...    panel_providers = ExtensionPoint(IAdminPanelProvider)...略... for provider in self.panel_providers: p = list(provider.get_admin_panels(req) or [])

class TicketSubmitPolicyPlugin(Component):...略... implements(IAdminPanelProvider,...) ...略... def get_admin_panels(self, req):...略... if req.perm.has_permission('TRAC_ADMIN'): yield ('ticket', u'チケットシステム', 'policy', u'サブミットポリシー')

ソースはこんな感じ

2010年9月30日木曜日

Page 13: Shibuya.trac.8

まとめ

プラグインアーキテクチャとしてTracのアーキテクチャは面白い

が、しかし、コア部分はメタクラス全開なのでよくわかりません。。。orz

2010年9月30日木曜日

Page 14: Shibuya.trac.8

結論として

に相当するような「Trac プラグイン開発 徹底攻略」きぼんぬ!

2010年9月30日木曜日

Page 16: Shibuya.trac.8

ご清聴ありがとうございました。_m( )m_

2010年9月30日木曜日