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を実行すると盛大にコケましたよ、と…。