もう18時半ですよ

な、なんだってー

urls.pyだけ書いた。URLとビューのマッピングが取れているんだからドキュメントはビューのdocstringに置いて自動でAPIリファレンスを出力とかできるよなぁ、なんて思ったけど中途半端なフレームワーク作り始めるといつまでたっても完成品ができないので我慢する。

# -*- coding: utf-8 -*-
from django.conf.urls.defaults import *
import views
urlpatterns = patterns(
    'saichugen.views',
    (r'^$', 'index'),
    (r'^rule_ja.html$', 'rule_ja'),

### API

    (r'start_game/', 'start_game'),
# POST ゲームを開始する
# return game_id

    (r'join/(?P<game_id>.*)/', 'join'),
# POST ゲームに着席する
# return seat_id

    (r'add_player/(?P<game_id>.*)/(?P<player_id>.*)/', 'add_player'),
# POST Passiveなプレイヤーを追加する
# return seat_id(? FIXME)

    (r'seat/(?P<seat_id>.*)/', 'seat'),
# GET 盤面状況の取得
# return what? FIXME

    (r'play/(?P<seat_id>.*)/', 'play'),
# POST 手を出す
# @arg hand=0..52 
# @return 0: 問題なく終了, 1: 無効な手だったのでランダムに選択した, 2: 手を出せる状態ではない

    (r'game/(?P<game_id>.*)/', 'game'),
# GET 非プレイヤー用観戦画面。ゲームが終わるまでは手札も見えない。
# ゲーム終了後は観戦に適した表示にする(htmlの場合)

)



出かけてお酒を飲んで帰ってきた。

さっき書いたこれ、こうすればいいと思った。
# urls.py (前略)

api_urlpatterns = (
    (r'start_game/', 'start_game'),
    (r'join/(?P<game_id>.*)/', 'join'),
    (r'add_player/(?P<game_id>.*)/(?P<player_id>.*)/', 'add_player'),
    (r'seat/(?P<seat_id>.*)/', 'seat'),
    (r'play/(?P<seat_id>.*)/', 'play'),
    (r'game/(?P<game_id>.*)/', 'game'),
)

urlpatterns += patterns(
    'saichugen.api_views',
    *api_urlpatterns
)

# views.py 一部抜粋

def api_doc(request):
    import urls, api_views
    api_list = []
    for (url, view_name) in urls.api_urlpatterns:
        view = getattr(api_views, view_name)
        api_list.append(
            (url, view.__doc__))
                
    return render_to_response(
        request, 
        'saichugen/api_doc.html',
        dict(api_list=api_list))

レンダリング結果

単にリファレンスに入れる対象だけ後で再利用できるようにリストをわけておいて、docstringを読んで表示するビューを追加しただけ。

def start_game(request):
    """
    POST ゲームを開始する
    @return game_id
    """
(以下略)