Fixed #7441 -- Removed some of the shortcuts in the doctest output comparators, and added a wrapper to allow comparison of xml fragments. Thanks to Leo Soto for the report and fix.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@8003 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
55ebc2b594
commit
2f49d18071
|
@ -58,19 +58,10 @@ class OutputChecker(doctest.OutputChecker):
|
||||||
|
|
||||||
Based on http://codespeak.net/svn/lxml/trunk/src/lxml/doctestcompare.py
|
Based on http://codespeak.net/svn/lxml/trunk/src/lxml/doctestcompare.py
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# We use this to distinguish the output of repr() from an XML element:
|
|
||||||
_repr_re = re.compile(r'^<[^>]+ (at|object) ')
|
|
||||||
|
|
||||||
_norm_whitespace_re = re.compile(r'[ \t\n][ \t\n]+')
|
_norm_whitespace_re = re.compile(r'[ \t\n][ \t\n]+')
|
||||||
def norm_whitespace(v):
|
def norm_whitespace(v):
|
||||||
return _norm_whitespace_re.sub(' ', v)
|
return _norm_whitespace_re.sub(' ', v)
|
||||||
|
|
||||||
def looks_like_xml(s):
|
|
||||||
s = s.strip()
|
|
||||||
return (s.startswith('<')
|
|
||||||
and not _repr_re.search(s))
|
|
||||||
|
|
||||||
def child_text(element):
|
def child_text(element):
|
||||||
return ''.join([c.data for c in element.childNodes
|
return ''.join([c.data for c in element.childNodes
|
||||||
if c.nodeType == Node.TEXT_NODE])
|
if c.nodeType == Node.TEXT_NODE])
|
||||||
|
@ -104,12 +95,14 @@ class OutputChecker(doctest.OutputChecker):
|
||||||
want, got = self._strip_quotes(want, got)
|
want, got = self._strip_quotes(want, got)
|
||||||
want = want.replace('\\n','\n')
|
want = want.replace('\\n','\n')
|
||||||
got = got.replace('\\n','\n')
|
got = got.replace('\\n','\n')
|
||||||
|
|
||||||
# If what we want doesn't look like markup, don't bother trying
|
|
||||||
# to parse it.
|
|
||||||
if not looks_like_xml(want):
|
|
||||||
return False
|
|
||||||
|
|
||||||
|
# If the string is not a complete xml document, we may need to add a
|
||||||
|
# root element. This allow us to compare fragments, like "<foo/><bar/>"
|
||||||
|
if not want.startswith('<?xml'):
|
||||||
|
wrapper = '<root>%s</root>'
|
||||||
|
want = wrapper % want
|
||||||
|
got = wrapper % got
|
||||||
|
|
||||||
# Parse the want and got strings, and compare the parsings.
|
# Parse the want and got strings, and compare the parsings.
|
||||||
try:
|
try:
|
||||||
want_root = parseString(want).firstChild
|
want_root = parseString(want).firstChild
|
||||||
|
|
|
@ -29,6 +29,16 @@ r"""
|
||||||
... xml.endDocument()
|
... xml.endDocument()
|
||||||
... return stream.getvalue()
|
... return stream.getvalue()
|
||||||
|
|
||||||
|
>>> def produce_xml_fragment():
|
||||||
|
... stream = StringIO()
|
||||||
|
... xml = SimplerXMLGenerator(stream, encoding='utf-8')
|
||||||
|
... xml.startElement("foo", {"aaa" : "1.0", "bbb": "2.0"})
|
||||||
|
... xml.characters("Hello")
|
||||||
|
... xml.endElement("foo")
|
||||||
|
... xml.startElement("bar", {})
|
||||||
|
... xml.endElement("bar")
|
||||||
|
... return stream.getvalue()
|
||||||
|
|
||||||
# Long values are normalized and are comparable to normal integers ...
|
# Long values are normalized and are comparable to normal integers ...
|
||||||
>>> produce_long()
|
>>> produce_long()
|
||||||
42
|
42
|
||||||
|
@ -53,5 +63,10 @@ r"""
|
||||||
>>> produce_xml()
|
>>> produce_xml()
|
||||||
'<?xml version="1.0" encoding="UTF-8"?>\n<foo bbb="2.0" aaa="1.0"><bar ccc="3.0">Hello</bar><whiz>Goodbye</whiz></foo>'
|
'<?xml version="1.0" encoding="UTF-8"?>\n<foo bbb="2.0" aaa="1.0"><bar ccc="3.0">Hello</bar><whiz>Goodbye</whiz></foo>'
|
||||||
|
|
||||||
|
>>> produce_xml_fragment()
|
||||||
|
'<foo aaa="1.0" bbb="2.0">Hello</foo><bar></bar>'
|
||||||
|
|
||||||
|
>>> produce_xml_fragment()
|
||||||
|
'<foo bbb="2.0" aaa="1.0">Hello</foo><bar></bar>'
|
||||||
|
|
||||||
"""
|
"""
|
Loading…
Reference in New Issue