« 2012年01月 | メイン | 2012年03月 »

2012年02月 アーカイブ

2012年02月22日

OS X 10.7(Lion)でTracを立ち上げる最短の方法

第5回Jenkins勉強会の帰り。
色々な葛藤の末、Tracをインストールすることにした(ナンデ???)。
Apacheとの連携なし、Subversionとの連携なし、日本語化なしの最低限のTracのインストールと起動方法。
% sudo easy_install Trac==0.12
% mkdir ~/trac
% cd ~/trac
% trac-admin ./testproject initenv
Project Name [My Project]> testproject
Database connection string [sqlite:db/trac.db]> 
% tracd -p 8080 ~/trac/testproject
~/trac配下に全てのプロジェクトを配置する場合は次のように指定すればOK。
% tracd -p 8080 -e ~/trac
「http://localhost:8080/」にアクセスするとTracが機能していることが確認できる。
参考 
以下、参考URL。
thx! @rch850

2012年02月25日

OS X 10.7(Lion)でTrac0.12の日本語化に挑戦

日本語済みのTracはインタアクトが公開してくれている。
手軽に日本語版のTracが欲しいのなら上記で良いと思う。
今回は、標準的なTracから環境を作って行きたいので色々調べたら、Tracの0.12以降はBabelという仕組みを使って日本語化するらしいことがわかった。
そこで、前回構築した環境で以下を実行してみた。
% sudo easy_install Babel
% sudo easy_install -U Trac==0.12
Tracを起動しにブラウザからアクセスすると「KeyError: 'trac/locale'」というエラーがでてまともに動かなくなった。
復旧しようと
% sudo easy_install -U Babel
% sudo easy_install -U Trac==0.12
を実行したり
% rm -rf ~/trac/testproject
% trac-admin ./testproject initenv
のようなことを繰り返していたらterminalでも「KeyError: 'trac/locale'」と出てきてどうしようもない状態に...。
色々調べたら、easy_installで入れられたeggというものを一旦削除すると良いとわかった。
% sudo mv /Library/Python/2.7/site-packages/Trac-0.12-py2.7.egg ~/.Trash
で、もう一度
% sudo easy_install Trac==0.12
% cd ~/trac
% trac-admin ./testproject initenv
を実行したらterminalに突然日本語が表示されはじめた。
前回同様初期化が始まったので、
プロジェクト名 [My Project]> testproject
データベース接続文字列 [sqlite:db/trac.db]> 
% tracd -p 8080 ~/trac/testproject
と実行して「http://localhost:8080/」にアクセスするとTracが日本語になっているのが確認できた。
これでTracの日本語化はできたが、Wikiのデータが英語のまま。
TracはヘルプがWiki上にあるので、Wikiが英語のだと使いにくい。
そこで、Wikiも日本語化することにした。
最初に挙げた日本語版Tracを公開しているページには、次のように書かれている。
Trac-ja から Wiki ページだけを使いたい場合、 Trac-X.X.X.jaX.zip を展開し、配布に含まれる trac/wiki/default-pages ディレクトリを trac-admin コマンドで wiki load してください。
そこで、日本語版Tracをダウンロードして解凍。
% cd ~/trac
% mkdir i-act
% cd i-act
% wget http://www.i-act.co.jp/project/products/downloads/Trac-0.12.2.ja1.zip
% unzip Trac-0.12.2.ja1.zip
wiki loadコマンドで日本語のWikiのデータをインポートした。
% cd ~/trac
% trac-admin ./testproject wiki load ./i-act/Trac-0.12.2.ja1/trac/wiki/default-pages
念のためTracを再起動してブラウザでアクセスすると、Wikiも日本語化されていることが確認できた。

2012年02月26日

OS X 10.7(Lion)でTracのダイジェスト認証を設定

前回からの続き。
Tracでダイジェスト認証に使うパスワードファイルの指定に相対パスが使えないのでTrac専用アカウントを作ることにした。
まず環境設定から専用ユーザを作る。
そして、terminalで作業する。
% su trac
$ mkdir trac
$ cd trac
$ trac-admin ./testproject initenv
Babelが連携できてないのか英語が表示された。
Project Name [My Project]> testproject
Database connection string [sqlite:db/trac.db]>
% htdigest -c users.htdigest trac Kanasansoft
$ wget http://www.i-act.co.jp/project/products/downloads/Trac-0.12.2.ja1.zip
$ unzip Trac-0.12.2.ja1.zip 
$ trac-admin ./testproject wiki load ./Trac-0.12.2.ja1/trac/wiki/default-pages
$ rm -rf Trac-0.12.2.ja1*
$ tracd -p 8080 --auth="*,/Users/trac/trac/users.htdigest,trac" -e ~/trac
ブラウザで「http://localhost:8080/testproject」にアクセスし画面右上のログインをクリックすると、ちゃんとダイジェスト認証が動いているのが確認できた。
tracdのオプションに設定した認証の文字列は、カンマ区切りで「プロジェクトのディレクトリ名」「ダイジェスト認証のパスワードファイルへの絶対パス」「パスワードファイル生成時に指定したレルム」で、プロジェクトのディレクトリ名に「*」を指定すると全プロジェクトが対象となる。

OS X 10.7(Lion)でTracのHello Worldプラグインを作ってみた

前回からの続き。
Trac HacksにあったTracのプラグインの作り方を見ながらHello Worldプラグインを作ってみた。
% mkdir -p ~/trac_make_plugin/helloworld-plugin/helloworld/
% mkdir -p ~/trac_make_plugin/helloworld-plugin/TracHelloworld.egg-info/
「~/trac_make_plugin/helloworld-plugin/helloworld/」にhelloworld.pyを作成。
# Helloworld plugin

from trac.core import *
from trac.web.chrome import INavigationContributor
from trac.web.main import IRequestHandler
from trac.util import escape, Markup

class HelloWorldPlugin(Component):
    implements(INavigationContributor, IRequestHandler)

    # INavigationContributor methods
    def get_active_navigation_item(self, req):
        return 'helloworld'

    def get_navigation_items(self, req):
        yield 'mainnav', 'helloworld', Markup('<a href="%s">Hello</a>' % (
                self.env.href.helloworld() ) )

    # IRequestHandler methods
    def match_request(self, req):
        return req.path_info == '/helloworld'

    def process_request(self, req):
        req.send_response(200)
        abuffer = 'Hello world!'
        req.send_header('Content-Type', 'text/plain')
        req.send_header('Content-length', str(len(abuffer)))
        req.end_headers()
        req.write(abuffer)
「~/trac_make_plugin/helloworld-plugin/helloworld/」に__init__.pyを作成。
# Helloworld module
from helloworld import *
「~/trac_make_plugin/helloworld-plugin/」にsetup.pyを作成。
from setuptools import setup

PACKAGE = 'TracHelloworld'
VERSION = '0.1'

setup(name=PACKAGE,
      version=VERSION,
      packages=['helloworld'],
      entry_points={'trac.plugins': '%s = helloworld' % PACKAGE},
)
「~/trac_make_plugin/helloworld-plugin/TracHelloworld.egg-info/」にtrac_plugin.txtを作成。
helloworld
この後プラグインをビルドするらしい。
% cd ~/trac_make_plugin/helloworld-plugin/
% python setup.py bdist_egg
これで「dist」ディレクトリが生成され、配下にeggファイルができる。
% ls ~/trac_make_plugin/helloworld-plugin/dist
TracHelloworld-0.1-py2.7.egg
これをtracのpluginsディレクトリにコピーして、tracを起動するとプラグインが読み込まれる。
% cp ~/trac_make_plugin/helloworld-plugin/dist/TracHelloworld-0.1-py2.7.egg ~/trac/testproject/plugins
% tracd -p 8080 --auth="*,/Users/trac/trac/users.htdigest,trac" -e ~/trac

OS X 10.7(Lion)でTracのプラグインのライフサイクルを調べてみた

今回のエントリーはかなり憶測を含むので注意。
Tracのプラグインは初期化時に「__init__.py」が読み込まれるっぽい。
また、Pythonのパッケージはサブディレクトリ名をレシーバに指定しメソッドを呼ぶっぽい。
また、リファレンスを見ていると初期化メソッドとして「__init__()」を指定することがわかった。
Pythonのパッケージは少なくとも「__xxx___()」形式のメソッドの代わりに、「__xxx__.py」を使っていると推測できる。
インスタンスを解放する時には「__del__()」を実行するらしいので、パッケージだと「__del__.py」を作成すればよさそう。
ここで疑問に思うには、Tracのプラグインのライフサイクル。
つまり、「__init__.py」と「__del__.py」はどのタイミングで実行されるのか。
そこで、前回作ったHello Worldプラグインに、次のような「__init__.py」と「__del__.py」を作成した。
__init__.py
# Helloworld module
from helloworld import *

print "init!"
__del__.py
print "del!"
これをパッケージ化してTracにインストール、ブラウザからアクセスしてみる。
結果は、「__init__.py」は、Tracの起動時ではなく初回アクセス時だった。
「__init__.py」はと言うと...、Tracを終了しても実行されない。
(アクセス直後は何故かctrl+Cでは終了できないので、時間をあけてからctrl+Cを実行。)
憶測を誤ったか、終了時はコンソール出力ができないのかよくわからない。
__init__.pyはパッケージ独自の話で、もしかしてこのファイル内にメソッドを定義しないといけないんじゃないかと思い、次のように変更して試してみた。
__init__.py
# Helloworld module
from helloworld import *

print "init file!"

def __init__(self):
    print "init method!"

def __del__(self):
    print "del method!"
「init file!」しか実行されず。
完全に推測誤った...。
パッケージの後処理どうやるんだろう...。
Google

タグ クラウド