You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
165 lines
6.0 KiB
165 lines
6.0 KiB
7 years ago
|
#!/usr/bin/env python
|
||
|
|
||
|
# $Id: test_publisher.py 7539 2012-11-26 13:50:06Z milde $
|
||
|
# Author: Martin Blais <blais@furius.ca>
|
||
|
# Copyright: This module has been placed in the public domain.
|
||
|
|
||
|
"""
|
||
|
Test the `Publisher` facade and the ``publish_*`` convenience functions.
|
||
|
"""
|
||
|
|
||
|
import pickle
|
||
|
import DocutilsTestSupport # must be imported before docutils
|
||
|
import docutils
|
||
|
from docutils import core, nodes, io
|
||
|
from docutils._compat import b, bytes, u_prefix
|
||
|
|
||
|
|
||
|
test_document = """\
|
||
|
Test Document
|
||
|
=============
|
||
|
|
||
|
This is a test document with a broken reference: nonexistent_
|
||
|
"""
|
||
|
pseudoxml_output = b("""\
|
||
|
<document ids="test-document" names="test\ document" source="<string>" title="Test Document">
|
||
|
<title>
|
||
|
Test Document
|
||
|
<paragraph>
|
||
|
This is a test document with a broken reference: \n\
|
||
|
<problematic ids="id2" refid="id1">
|
||
|
nonexistent_
|
||
|
<section classes="system-messages">
|
||
|
<title>
|
||
|
Docutils System Messages
|
||
|
<system_message backrefs="id2" ids="id1" level="3" line="4" source="<string>" type="ERROR">
|
||
|
<paragraph>
|
||
|
Unknown target name: "nonexistent".
|
||
|
""")
|
||
|
exposed_pseudoxml_output = b("""\
|
||
|
<document ids="test-document" internal:refnames="{%s\'nonexistent\': [<reference: <#text: \'nonexistent\'>>]}" names="test\ document" source="<string>" title="Test Document">
|
||
|
<title>
|
||
|
Test Document
|
||
|
<paragraph>
|
||
|
This is a test document with a broken reference: \n\
|
||
|
<problematic ids="id2" refid="id1">
|
||
|
nonexistent_
|
||
|
<section classes="system-messages">
|
||
|
<title>
|
||
|
Docutils System Messages
|
||
|
<system_message backrefs="id2" ids="id1" level="3" line="4" source="<string>" type="ERROR">
|
||
|
<paragraph>
|
||
|
Unknown target name: "nonexistent".
|
||
|
""" % u_prefix)
|
||
|
|
||
|
|
||
|
class PublisherTests(DocutilsTestSupport.StandardTestCase):
|
||
|
|
||
|
def test_input_error_handling(self):
|
||
|
# core.publish_cmdline(argv=['nonexisting/path'])
|
||
|
# exits with a short message, if `traceback` is False,
|
||
|
|
||
|
# pass IOErrors to calling application if `traceback` is True
|
||
|
try:
|
||
|
core.publish_cmdline(argv=['nonexisting/path'],
|
||
|
settings_overrides={'traceback': True})
|
||
|
except IOError, e:
|
||
|
self.assertTrue(isinstance(e, io.InputError))
|
||
|
|
||
|
|
||
|
def test_output_error_handling(self):
|
||
|
# pass IOErrors to calling application if `traceback` is True
|
||
|
try:
|
||
|
core.publish_cmdline(argv=['data/include.txt', 'nonexisting/path'],
|
||
|
settings_overrides={'traceback': True})
|
||
|
except IOError, e:
|
||
|
self.assertTrue(isinstance(e, io.OutputError))
|
||
|
|
||
|
|
||
|
class PublishDoctreeTestCase(DocutilsTestSupport.StandardTestCase, docutils.SettingsSpec):
|
||
|
|
||
|
settings_default_overrides = {
|
||
|
'_disable_config': True,
|
||
|
'warning_stream': io.NullOutput()}
|
||
|
|
||
|
def test_publish_doctree(self):
|
||
|
# Test `publish_doctree` and `publish_from_doctree`.
|
||
|
|
||
|
# Produce the document tree.
|
||
|
doctree = core.publish_doctree(
|
||
|
source=test_document, reader_name='standalone',
|
||
|
parser_name='restructuredtext', settings_spec=self,
|
||
|
settings_overrides={'expose_internals':
|
||
|
['refnames', 'do_not_expose'],
|
||
|
'report_level': 5})
|
||
|
self.assertTrue(isinstance(doctree, nodes.document))
|
||
|
|
||
|
# Confirm that transforms have been applied (in this case, the
|
||
|
# DocTitle transform):
|
||
|
self.assertTrue(isinstance(doctree[0], nodes.title))
|
||
|
self.assertTrue(isinstance(doctree[1], nodes.paragraph))
|
||
|
# Confirm that the Messages transform has not yet been applied:
|
||
|
self.assertEqual(len(doctree), 2)
|
||
|
|
||
|
# The `do_not_expose` attribute may not show up in the
|
||
|
# pseudoxml output because the expose_internals transform may
|
||
|
# not be applied twice.
|
||
|
doctree.do_not_expose = 'test'
|
||
|
# Write out the document:
|
||
|
output = core.publish_from_doctree(
|
||
|
doctree, writer_name='pseudoxml',
|
||
|
settings_spec=self,
|
||
|
settings_overrides={'expose_internals':
|
||
|
['refnames', 'do_not_expose'],
|
||
|
'report_level': 1})
|
||
|
self.assertEqual(output, exposed_pseudoxml_output)
|
||
|
|
||
|
# Test publishing parts using document as the source.
|
||
|
parts = core.publish_parts(
|
||
|
reader_name='doctree', source_class=io.DocTreeInput,
|
||
|
source=doctree, source_path='test', writer_name='html',
|
||
|
settings_spec=self)
|
||
|
self.assertTrue(isinstance(parts, dict))
|
||
|
|
||
|
def test_publish_pickle(self):
|
||
|
# Test publishing a document tree with pickling and unpickling.
|
||
|
|
||
|
# Produce the document tree.
|
||
|
doctree = core.publish_doctree(
|
||
|
source=test_document,
|
||
|
reader_name='standalone',
|
||
|
parser_name='restructuredtext',
|
||
|
settings_spec=self)
|
||
|
self.assertTrue(isinstance(doctree, nodes.document))
|
||
|
|
||
|
# Pickle the document. Note: if this fails, some unpickleable
|
||
|
# reference has been added somewhere within the document tree.
|
||
|
# If so, you need to fix that.
|
||
|
#
|
||
|
# Note: Please do not remove this test, this is an important
|
||
|
# requirement, applications will be built on the assumption
|
||
|
# that we can pickle the document.
|
||
|
|
||
|
# Remove the reporter and the transformer before pickling.
|
||
|
doctree.reporter = None
|
||
|
doctree.transformer = None
|
||
|
|
||
|
doctree_pickled = pickle.dumps(doctree)
|
||
|
self.assertTrue(isinstance(doctree_pickled, bytes))
|
||
|
del doctree
|
||
|
|
||
|
# Unpickle the document.
|
||
|
doctree_zombie = pickle.loads(doctree_pickled)
|
||
|
self.assertTrue(isinstance(doctree_zombie, nodes.document))
|
||
|
|
||
|
# Write out the document:
|
||
|
output = core.publish_from_doctree(
|
||
|
doctree_zombie, writer_name='pseudoxml',
|
||
|
settings_spec=self)
|
||
|
self.assertEqual(output, pseudoxml_output)
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
import unittest
|
||
|
unittest.main()
|