読者です 読者をやめる 読者になる 読者になる

FakeSphinx は Sphinx 1.2系では動かない

昨日見かけた FakeSphinx を自分のテストコードの参考にしようといじっていたのですが、
その際に FakeSphinx は Sphinx 1.2系では動かないことが判明しました。

  File "/Users/tkomiya/work/sphinx-contrib/sadisplay/tests/test_directive.py", line 29, in setup
    app = FakeSphinx()
  File "/Users/tkomiya/work/sphinx-contrib/sadisplay/tests/test_directive.py", line 19, in __init__
    self.config = Config(None, None, None, None)
  File "/Users/tkomiya/work/sphinx-contrib/sadisplay/foo/lib/python2.7/site-packages/Sphinx-1.2b3-py2.7.egg/sphinx/config.py", line 217, in __init__
    if "extensions" in overrides:
TypeError: argument of type 'NoneType' is not iterable

パラメータの解釈が変わっていたり、必要な属性の初期化などが不足してしまっているようです。

実装を参考にするのは諦めて、インターフェースだけ参考にしたのがこちらになります

どういうインターフェースにすると使いやすいのか模索中ですが、
@with_app デコレータ (Sphinx 本体の tests/util.py 由来)と @with_parsed デコレータ (FakeSphinx 由来)を使って
こういったテストを書くことができます。
もう少しインターフェースを模索していこうと思うので、Sphinx 拡張の作者からのツッコミをお待ちしております。

余談

Sphinx (というか docutils) が一度インストールしたディレクティブやロールを開放する方法を提供していないので、
setup() 関数でディレクティブを登録して、teardown() 関数で登録解除するようなテストが書けません。
状態を持ったテストになってしまうのはとても残念ですね。

なんとかならないものでしょうか…