Autodoc 作った

RubyAutodoc PerlTest::JsonAPI::Autodoc を真似て Python の Autodoc を作った。
GitHub - heavenshell/py-autodoc: Autodoc Python implementation.
# まだ PyPi にはアップしてないアップロードした。


もともと Jokk という Mock サーバを作った際に、レスポンスから同じようなの作ろうかなーと思ってたが、Autodoc を見てテストとして実行できるというのが素晴らしいアイディアだったので、単独のライブラリとして作った。


サンプル

# -*- coding: utf-8 -*-
from unittest import TestCase
from webtest import TestApp
from autodoc import autodoc
from tests.app import create_app


class TestUnittest(TestCase):
    def setUp(self):
        app = create_app
        self.client = TestApp(app)

    @classmethod
    @autodoc.generate('var/test_unittest.rst')
    def tearDownClass(cls):
        pass

    @autodoc.describe('GET /')
    def test_get(self):
        """ GET / """
        res = self.client.get('/')
        self.assertEqual(res.status_code, 200)

        return res

    @autodoc.describe('POST /')
    def test_post(self):
        """ POST / """
        res = self.client.post_json('/', params={'id': 1, 'message': 'foo'})
        self.assertEqual(res.status_code, 200)

        return res

    @autodoc.describe('POST /foo/bar')
    def test_foo_bar(self):
        """ POST /foo/bar """
        res = self.client.post_json('/foo/bar', params={'id': 1, 'message': 'foo'})
        self.assertEqual(res.status_code, 200)

        return res

上記のサンプルは UnitTest で書いてるけど、Py.Test でも使える。
試してないけど、おそらく nose も使える。
仕様として、ドキュメントを出力したいテストケースにデコレータつけて、テストケースが WebTest のレスポンスを返せばいいので、テストフレームワークに依存してない。
こんな感じで出力される。
py-autodoc/test_unittest.rst at master · heavenshell/py-autodoc · GitHub

依存ライブラリ

テストクライアントに WebTest を使ってる。
Flask や Werkzueg のテストクライアントも使えるようにしようかなーと思ったが、送信したリクエストが取得できないのでやめた。

ドキュメント生成の方法

@autodoc.describe でドキュメントを生成するテストを指定する。
@autodoc.generate でドキュメントを生成する。
1 テストケース 1 ドキュメントも出来るし、テストクラスのをまとめて 1 ファイルに出力する事もできる。
その場合 tearDownClass などのフィクスチャに @autodoc.generate をつける


出力される形式は Python なのでデフォルトは reST。
テンプレートファイルを指定すれば Markdown もいける。
テンプレートは @autodoc.generate('出力先', template='テンプレートファイル') となってるので、
template='my-template.md' とするとカレントディレクトリの my-template.md を探す。

制約

デコレータ内から実行したテストのレスポンスを取得したかったので、通常のテストとは異なり、return でレスポンスを返す必要がある


テンプレートエンジンに標準の String.Template を使っているので、基本的に変数のアサインしか出来ない。
なので、制御文やループなどは出来ない。
# Python の標準に制御文やループくらいできるテンプレートエンジン欲しい