File: test_traversals.py

package info (click to toggle)
python-docutils 0.22%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 11,448 kB
  • sloc: python: 53,302; lisp: 14,475; xml: 1,807; javascript: 1,032; makefile: 102; sh: 96
file content (81 lines) | stat: -rwxr-xr-x 2,066 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
#! /usr/bin/env python3

# $Id: test_traversals.py 9914 2024-08-21 13:45:08Z milde $
# Author: Martin Blais <blais@furius.ca>
# Copyright: This module has been placed in the public domain.

"""
Test module for traversals.
"""

from pathlib import Path
import sys
import unittest

if __name__ == '__main__':
    # prepend the "docutils root" to the Python library path
    # so we import the local `docutils` package.
    sys.path.insert(0, str(Path(__file__).resolve().parents[1]))

import docutils
from docutils import core, nodes, writers


stop_traversal_input = '''
==================
   Train Travel
==================

Happily, happily going by train.

.. attention:: Attention, attention.  This is a public annoucement.
               You must get off the train now.

KaZoom! Train crashes.

- Told ya!!!  Get off the train next time.

'''


class AttentiveVisitor(nodes.SparseNodeVisitor):

    def visit_attention(self, node):
        raise nodes.StopTraversal

    def visit_bullet_list(self, node):
        raise RuntimeError("It's too late for attention, "
                           "more discipline is needed!.")


class AttentiveWriter(writers.Writer):

    def translate(self):
        self.visitor = visitor = AttentiveVisitor(self.document)

        # Test both kinds of traversals.
        self.document.walkabout(visitor)
        self.document.walk(visitor)


class StopTraversalTests(unittest.TestCase, docutils.SettingsSpec):

    """
    Test interrupting the visitor during traversal.  In this test we stop it
    when we reach an attention node.
    """
    def test_stop_traversal(self):
        # Load some document tree in memory.
        doctree = core.publish_doctree(
            source=stop_traversal_input,
            settings_spec=self)
        self.assertTrue(isinstance(doctree, nodes.document))

        core.publish_parts(
            reader='doctree', source_class=docutils.io.DocTreeInput,
            source=doctree, source_path='test',
            writer=AttentiveWriter())


if __name__ == '__main__':
    unittest.main()