pystacheのtestがコケる件。

mustacheのpython版であるpystacheをDebianパッケージにしようとしています。python3版のpython3-pystacheも作ってほしい、という要望ももらっているのですが、現時点ではpystacheはpython2.xのみサポートされているので、とりあえずそれは後回しにする予定です。

さて、今回テストがコケる問題ですが、pystacheのmasterブランチのHEAD(2011/11/30の7ccb55fd9)をnosetestsを実行すると56件あるテストのうち1つだけコケる、状況です。

$ nosetests
(snip)
FAIL: test_non_strings (test_pystache.TestPystache)
(snip)
Traceback (most recent call last):
  File "/home/kohei/devel/debpkg/pystache/pystache/tests/test_pystache.py", line 57, in test_non_strings
    self.assertEquals(ret, """(123 & ['something'])(chris & 0.9)""")
AssertionError: Markup(u'(123 & ['something'])(chris & 0.9)') != "(123 & ['something'])(chris & 0.9)"
(snip)

アポストロフィ(apostrophe)”’”が”'”に変換されているため、一致しないのが原因です。apostropheはHTML decimalで'ですね。

debugモードで実行すると、markupsafeのMarkup()で例外処理されています。

$ nosetests -d
(snip)
FAIL: test_non_strings (test_pystache.TestPystache)
(snip)
Traceback (most recent call last):
  File "/home/kohei/devel/debpkg/pystache/pystache/tests/test_pystache.py", line 57, in test_non_strings
    self.assertEquals(ret, """(123 & ['something'])(chris & 0.9)""")
AssertionError: Markup(u'(123 & ['something'])(chris & 0.9)') != "(123 & ['something'])(chris & 0.9)"
    'Markup(u\'(123 & ['something'])(chris & 0.9)\') != "(123 & [\'something\'])(chris & 0.9)"' = '%s != %s' % (safe_repr(Markup(u'(123 & ['something'])(chris & 0.9)')), safe_repr("(123 & ['something'])(chris & 0.9)"))
    'Markup(u\'(123 & ['something'])(chris & 0.9)\') != "(123 & [\'something\'])(chris & 0.9)"' = self._formatMessage('Markup(u\'(123 & ['something'])(chris & 0.9)\') != "(123 & [\'something\'])(chris & 0.9)"', 'Markup(u\'(123 & ['something'])(chris & 0.9)\') != "(123 & [\'something\'])(chris & 0.9)"')
>>  raise self.failureException('Markup(u\'(123 & ['something'])(chris & 0.9)\') != "(123 & [\'something\'])(chris & 0.9)"')


----------------------------------------------------------------------
Ran 56 tests in 0.052s

FAILED (failures=1)

原因は、markupsafeにありました。

FUNCTIONS
    escape(...)
        escape(s) -> markup

        Convert the characters &, <, >, ', and " in string s to HTML-safe
        sequences.  Use this if you need to display text that might contain
        such characters in HTML.  Marks return value as markup string.

developementブランチではこの問題は修正されているようなのですが、0.3.1から大分変わってしまうので、git cherry-pickで持ってきて修正する、というのは無理っぽいので、結局v0.3.1のタグをチェックアウトして、python2.7専用のDebianパッケージを作ってmentorsにアップロードしました。

タグを打たれていない0.4.0ではどうなん?

ちなみに、pystache 0.4.0だと一見nosetestsはうまく行くのですが、テストの一部がgit submoduledeでの管理になっていて、git submodule init; git submodule update後にnosetestsを実行すると盛大にコケましたよ、と…。