所以我写了很多sphinxdoc扩展,例如这个(作为一个例子,因为它是最简单的一个):
from docutils import nodes
from docutils.statemachine import StringList
from sphinx.util.compat import Directive
class SvnRevisionDirective(Directive):
"""Directive to display subversion revision of the path.
"""
has_content = True
required_arguments = 1
optional_arguments = 1
final_argument_whitespace = False
option_spec = {}
def run(self):
path = self.arguments[0]
# rev = svntools.Revision(path)
rev = 42
paragraph = nodes.paragraph()
self.state.nested_parse(
StringList([
'**Revision:** r%d' % rev
]), 0, paragraph)
return [paragraph]
def setup(app):
"""Directive framework code.
"""
app.add_directive('svnrevision', SvnRevisionDirective)
在将扩展的路径添加到文档的conf.py
中的extensions
后,可以使用如下方式:
并将产生:
修订版:r42
为了测试它是否正常工作,我可以创建一个tests/testproj
目录,并用docs
目录、conf.py
文件和包含该指令的index.rst
文件填充,并使用:
import os
import pytest
DIRNAME = os.path.dirname(__file__)
@pytest.mark.django_db
def test_svnrevision(monkeypatch):
testprojdir = os.path.join(DIRNAME, 'testproj')
monkeypatch.setenv('PYTHONPATH', testprojdir, os.pathsep)
monkeypatch.setenv('DJANGO_SETTINGS_MODULE', 'testingapp.settings')
monkeypatch.chdir(DIRNAME)
cmd = 'sphinx-build -bhtml -a -E testproj/docs testproj/build'
os.system(cmd)
但是这使得测试和代码之间有很大的距离,并且不能提供代码覆盖范围,至少在PyCharm下运行时没有。在
我想要更直接的,类似于:
def test_svnrevision():
rst = """
.. svnrevision:: mypackage/__init__.py
"""
svndirective = SvnRevisionDirective(...., rst, ...)
result = svndirective.run()
assert result.___ == '**Revision:** 42'
这可能吗?在
如果您使用的是unittest或nose,那么可以尝试使用sphinx-testing模块,这在PyPI上是可用的。在
{基于py的单元测试}。在
从sphinx1.6.1开始,您可以使用pytest插件
sphinx.testing.fixtures
,如{a3}所述。虽然这个特性还处于试验阶段,但与下面描述的另一个相比,它似乎是更好的选择。在对于Sphinx<;=1.6.0的pytest测试,无法直接重用Sphinx测试夹具。您可以尝试将} directory 复制到您自己的项目中,并对
contest.py
、path.py
和util.py
文件从^{util.py
文件进行一点修改,使其在没有自定义sphinx runner(run.py
文件)的情况下正常工作:然后,您可以按照Sphinx单元测试中看到的相同方式编写单元测试。在
相关问题 更多 >
编程相关推荐