1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
|
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: Filip Wasilewski
# Date: $Date: 2007-09-11 22:46:56 +0200 (wto, 11.09.2007) $
"""
Extracts code-blocks from reStructuredText and produces Python doctests.
(I hate when examples from documentation do not work)
Usage: rst2doctest.py input.rst > test_doc.py
"""
import sys, os.path
import docutils.writers
import docutils.parsers.rst
from docutils.core import publish_cmdline, publish_programmatically
if len(sys.argv) != 2:
print "Usage: %s input.rst > test_doc.py" % os.path.basename(sys.argv[0])
raise SystemExit
input = sys.argv[1]
class NullWriter(docutils.writers.Writer):
def translate(self):
pass
def write(self, document, destination):
pass
doctest = []
codeblock_no = 1
def code_block( name, arguments, options, content, lineno,
content_offset, block_text, state, state_machine ):
"""
Creates Python doctests from code-blocks
.. code-block:: Python
>>> print 1+2
>>> 3
"""
global doctest, codeblock_no
doctest.append('\n')
doctest.append('def test_%d_on_line_%d():\n' % (codeblock_no, lineno))
codeblock_no += 1
doctest.append(' """\n')
for line in content:
doctest.append(' ' + line + '\n')
doctest.append(' """\n')
doctest.append('\n')
#raw = docutils.nodes.doctest_block(content,'\n'.join(content))
#return [raw]
code_block.arguments = (1,0,0)
code_block.options = {'language' : docutils.parsers.rst.directives.unchanged }
code_block.content = 1
docutils.parsers.rst.directives.register_directive('code-block', code_block )
publish_programmatically(source_class=docutils.io.FileInput, source=None,
source_path=input, destination_class=docutils.io.FileOutput, destination=None,
destination_path=None, reader=None, reader_name='standalone',
parser=None, parser_name='restructuredtext', writer=NullWriter(),
writer_name=None, settings=None, settings_spec=None,
settings_overrides=None, config_section=None, enable_exit_status=None) # wow 8-)
f = sys.stdout
doctest_head = """#!/usr/bin/env python\n\n# Doctest for %s document\n"""
doctest_stub = """
def _test():
import doctest
doctest.testmod()
if __name__ == "__main__":
_test()
"""
f.write(doctest_head % input)
f.writelines(doctest)
f.write(doctest_stub)
f.close()
|