体調不良で二日ほど穴をあけてしまったが、前回ひとまず完成したので、公開にむけたタスクを消化していく。Dive Into Pythonとか、setup スクリプトを書くとかを参考にしながら。
作り始めた当初はとりあえず作り始めてしまったので、プロジェクト名はtrac、プラグイン名/パッケージ名/モジュール名/クラス名は適当すぎるQueryStatusHelperPlugin, query, doubleclick, Checkbox になっている。これら、公開するにあたり不自然ではないか?
パッケージ名は、実行環境のほかのモジュールから、from __package__ import __module__ で一意に特定して参照できる必要がある。つまり、このままだとfrom query import doubleclickである。これではちょっとおこがましい。http://docs.python.jp/2/py-modindex.html に掲載されて、おいおい違うよ、と言われない程度の名前がいい。
そこで、from uiassist import query くらいでどうだろうか。ちょっと範囲が広い気がするけれども、さっきのよりかはずっといい。
先人いわく、自分のソフトウェアをオープンソースとしてリリースしたいのであれば、
これに従い、ライセンスを選択していこう。tracは今日時点では modified BSD licenseを選択しているので、これを踏襲するのがよいだろう。あるいはさらに「名前を借りてはならない」という制限がなくなった 2-clause BSD Licenseや MIT License、特許で訴えないことを表明している Apache License 2.0 などを選択するのもいい。GPLとの同梱を意識して、MIT or GPL のデュアルライセンスである例もよくみかける。
先人の教えに従い、分類情報をPyPIのリストに従って追加する。Programming Language, License, OS, Development Status, Framework くらいをつけておけばいいかな。
守るべきは、まずはTracのスタイル。すなわち、
あらら。javascriptの名前つき関数の作法*1JavaScript: the Good Parts のそれ*2 と矛盾する。自分のポリシーには反するけれど、コミュニティのポリシーに合わせておくべきなので、ここは素直に直すことにしよう。
少なくとも、setup.py の description, クラスのDOCSTRING はつけておく。tracのadminページと、我らがDeveloperPluginのAPI機能で表示してもらえるので。
from setuptools import setup, find_packages
version = '0.1'
setup(
name='QueryStatusHelper',
version=version,
classifiers=[
"Programming Language :: Python",
"Programming Language :: Python :: 2.6",
"Framework :: Trac",
"Operating System :: OS Independent",
"Development Status :: 3 - Alpha",
"Intended Audience :: Developers",
"Intended Audience :: Information Technology",
"License :: OSI Approved :: BSD License",
"Natural Language :: Japanese",
"Topic :: Software Development :: Bug Tracking",
],
license='Modified BSD',
author='MATOBA Akihiro',
author_email='moc.liamg@skcah-cart+aabotam',
url='http://trac-hacks.org/wiki/matobaa',
description='On Query page, flip checkbox status on double click it\'s label',
install_requires=['Trac >= 0.12'],
packages=find_packages(exclude=['*.tests*']),
package_data={
'uiassist': ['htdocs/*/*'],
},
entry_points={
'trac.plugins': [
'querystatushelper = uiassist.query',
],
},
)