File: rst2doctest.py

package info (click to toggle)
pywavelets 0.1.7~svn97-1
  • links: PTS, VCS
  • area: main
  • in suites: lenny
  • size: 2,408 kB
  • ctags: 1,492
  • sloc: ansic: 3,375; python: 1,910; makefile: 44
file content (90 lines) | stat: -rw-r--r-- 2,384 bytes parent folder | download
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()