Skip to content

Commit 06fade8

Browse files
committed
Move to a single definition of treeTypes for all tests
1 parent b5b91cc commit 06fade8

File tree

3 files changed

+52
-60
lines changed

3 files changed

+52
-60
lines changed

html5lib/tests/support.py

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,24 @@
1313
os.path.pardir,
1414
os.path.pardir)))
1515

16-
from html5lib import treebuilders
16+
from html5lib import treebuilders, treewalkers, treeadapters
1717
del base_path
1818

1919
# Build a dict of available trees
20-
treeTypes = {"DOM": treebuilders.getTreeBuilder("dom")}
20+
treeTypes = {}
2121

22-
# Try whatever etree implementations are available from a list that are
23-
#"supposed" to work
22+
# DOM impls
23+
treeTypes["DOM"] = {
24+
"builder": treebuilders.getTreeBuilder("dom"),
25+
"walker": treewalkers.getTreeWalker("dom")
26+
}
27+
28+
# ElementTree impls
2429
import xml.etree.ElementTree as ElementTree
25-
treeTypes['ElementTree'] = treebuilders.getTreeBuilder("etree", ElementTree, fullTree=True)
30+
treeTypes['ElementTree'] = {
31+
"builder": treebuilders.getTreeBuilder("etree", ElementTree, fullTree=True),
32+
"walker": treewalkers.getTreeWalker("etree", ElementTree)
33+
}
2634

2735
try:
2836
import xml.etree.cElementTree as cElementTree
@@ -33,14 +41,32 @@
3341
if cElementTree.Element is ElementTree.Element:
3442
treeTypes['cElementTree'] = None
3543
else:
36-
treeTypes['cElementTree'] = treebuilders.getTreeBuilder("etree", cElementTree, fullTree=True)
44+
treeTypes['cElementTree'] = {
45+
"builder": treebuilders.getTreeBuilder("etree", cElementTree, fullTree=True),
46+
"walker": treewalkers.getTreeWalker("etree", cElementTree)
47+
}
3748

3849
try:
3950
import lxml.etree as lxml # flake8: noqa
4051
except ImportError:
4152
treeTypes['lxml'] = None
4253
else:
43-
treeTypes['lxml'] = treebuilders.getTreeBuilder("lxml")
54+
treeTypes['lxml'] = {
55+
"builder": treebuilders.getTreeBuilder("lxml"),
56+
"walker": treewalkers.getTreeWalker("lxml")
57+
}
58+
59+
# Genshi impls
60+
try:
61+
import genshi # flake8: noqa
62+
except ImportError:
63+
pass
64+
else:
65+
treeTypes["genshi"] = {
66+
"builder": treebuilders.getTreeBuilder("dom"),
67+
"adapter": lambda tree: treeadapters.genshi.to_genshi(treewalkers.getTreeWalker("dom")(tree)),
68+
"walker": treewalkers.getTreeWalker("genshi")
69+
}
4470

4571

4672
def get_data_files(subdirectory, files='*.dat'):

html5lib/tests/test_treewalkers.py

Lines changed: 10 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -11,57 +11,12 @@
1111
except AttributeError:
1212
unittest.TestCase.assertEqual = unittest.TestCase.assertEquals
1313

14-
from .support import get_data_files, TestData, convertExpected
14+
import pytest
1515

16-
from html5lib import html5parser, treewalkers, treebuilders, treeadapters, constants
17-
from html5lib.filters.lint import Filter as Lint
18-
19-
20-
treeTypes = {
21-
"DOM": {"builder": treebuilders.getTreeBuilder("dom"),
22-
"walker": treewalkers.getTreeWalker("dom")},
23-
}
24-
25-
# Try whatever etree implementations are available from a list that are
26-
#"supposed" to work
27-
try:
28-
import xml.etree.ElementTree as ElementTree
29-
except ImportError:
30-
pass
31-
else:
32-
treeTypes['ElementTree'] = \
33-
{"builder": treebuilders.getTreeBuilder("etree", ElementTree, fullTree=True),
34-
"walker": treewalkers.getTreeWalker("etree", ElementTree)}
35-
36-
try:
37-
import xml.etree.cElementTree as ElementTree
38-
except ImportError:
39-
pass
40-
else:
41-
treeTypes['cElementTree'] = \
42-
{"builder": treebuilders.getTreeBuilder("etree", ElementTree, fullTree=True),
43-
"walker": treewalkers.getTreeWalker("etree", ElementTree)}
16+
from .support import get_data_files, TestData, convertExpected, treeTypes
4417

45-
46-
try:
47-
import lxml.etree as ElementTree # flake8: noqa
48-
except ImportError:
49-
pass
50-
else:
51-
treeTypes['lxml_native'] = \
52-
{"builder": treebuilders.getTreeBuilder("lxml"),
53-
"walker": treewalkers.getTreeWalker("lxml")}
54-
55-
56-
try:
57-
import genshi # flake8: noqa
58-
except ImportError:
59-
pass
60-
else:
61-
treeTypes["genshi"] = \
62-
{"builder": treebuilders.getTreeBuilder("dom"),
63-
"adapter": lambda tree: treeadapters.genshi.to_genshi(treewalkers.getTreeWalker("dom")(tree)),
64-
"walker": treewalkers.getTreeWalker("genshi")}
18+
from html5lib import html5parser, treewalkers, constants
19+
from html5lib.filters.lint import Filter as Lint
6520

6621
import re
6722
attrlist = re.compile(r"^(\s+)\w+=.*(\n\1\w+=.*)+", re.M)
@@ -89,6 +44,8 @@ def test_all_tokens(self):
8944
{'type': 'EndTag', 'namespace': 'http://www.w3.org/1999/xhtml', 'name': 'html'}
9045
]
9146
for treeName, treeCls in sorted(treeTypes.items()):
47+
if treeCls is None:
48+
continue
9249
p = html5parser.HTMLParser(tree=treeCls["builder"])
9350
document = p.parse("<html><head></head><body>a<div>b</div>c</body></html>")
9451
document = treeCls.get("adapter", lambda x: x)(document)
@@ -98,6 +55,8 @@ def test_all_tokens(self):
9855

9956

10057
def runTreewalkerTest(innerHTML, input, expected, errors, treeClass):
58+
if treeClass is None:
59+
pytest.skip("Treebuilder not loaded")
10160
warnings.resetwarnings()
10261
warnings.simplefilter("error")
10362
try:
@@ -164,6 +123,8 @@ def set_attribute_on_first_child(docfrag, name, value, treeName):
164123
def runTreewalkerEditTest(intext, expected, attrs_to_add, tree):
165124
"""tests what happens when we add attributes to the intext"""
166125
treeName, treeClass = tree
126+
if treeClass is None:
127+
pytest.skip("Treebuilder not loaded")
167128
parser = html5parser.HTMLParser(tree=treeClass["builder"])
168129
document = parser.parseFragment(intext)
169130
for nom, val in attrs_to_add:

html5lib/tests/tree_construction.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,23 @@ class TreeConstructionFile(pytest.File):
1313
def collect(self):
1414
tests = TestData(str(self.fspath), "data")
1515
for i, test in enumerate(tests):
16-
for treeName, treeClass in sorted(treeTypes.items()):
16+
for treeName, treeAPIs in sorted(treeTypes.items()):
17+
if treeAPIs is not None and "adapter" in treeAPIs:
18+
continue
1719
for namespaceHTMLElements in (True, False):
1820
if namespaceHTMLElements:
1921
nodeid = "%d::%s::namespaced" % (i, treeName)
2022
else:
2123
nodeid = "%d::%s::void-namespace" % (i, treeName)
22-
item = ParserTest(nodeid, self,
23-
test, treeClass, namespaceHTMLElements)
24+
item = ParserTest(nodeid,
25+
self,
26+
test,
27+
treeAPIs["builder"] if treeAPIs is not None else None,
28+
namespaceHTMLElements)
2429
item.add_marker(getattr(pytest.mark, treeName))
2530
if namespaceHTMLElements:
2631
item.add_marker(pytest.mark.namespaced)
27-
if treeClass is None:
32+
if treeAPIs is None:
2833
item.add_marker(pytest.mark.skipif(True, reason="Treebuilder not loaded"))
2934
yield item
3035

0 commit comments

Comments
 (0)