Skip to content

Commit 40d007a

Browse files
committed
Fix the moduleFactoryFactory to cache based on *args and **kwargs.
1 parent e1d9a5b commit 40d007a

File tree

3 files changed

+16
-8
lines changed

3 files changed

+16
-8
lines changed

html5lib/tests/test_parser2.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,12 @@ def test_namespace_html_elements_1_dom(self):
4040
def test_namespace_html_elements_0_etree(self):
4141
parser = html5parser.HTMLParser(namespaceHTMLElements=True)
4242
doc = parser.parse("<html></html>")
43-
self.assertTrue(list(doc)[0].tag == "{%s}html" % (namespaces["html"],))
43+
self.assertTrue(doc.tag == "{%s}html" % (namespaces["html"],))
4444

4545
def test_namespace_html_elements_1_etree(self):
4646
parser = html5parser.HTMLParser(namespaceHTMLElements=False)
4747
doc = parser.parse("<html></html>")
48-
self.assertTrue(list(doc)[0].tag == "html")
48+
self.assertTrue(doc.tag == "html")
4949

5050
def test_unicode_file(self):
5151
parser = html5parser.HTMLParser()

html5lib/tests/test_treewalkers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ def PullDOMAdapter(node):
6060
pass
6161
else:
6262
treeTypes['ElementTree'] = \
63-
{"builder": treebuilders.getTreeBuilder("etree", ElementTree),
63+
{"builder": treebuilders.getTreeBuilder("etree", ElementTree, fullTree=True),
6464
"walker": treewalkers.getTreeWalker("etree", ElementTree)}
6565

6666
try:
@@ -69,7 +69,7 @@ def PullDOMAdapter(node):
6969
pass
7070
else:
7171
treeTypes['cElementTree'] = \
72-
{"builder": treebuilders.getTreeBuilder("etree", ElementTree),
72+
{"builder": treebuilders.getTreeBuilder("etree", ElementTree, fullTree=True),
7373
"walker": treewalkers.getTreeWalker("etree", ElementTree)}
7474

7575

html5lib/utils.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,13 +91,21 @@ def moduleFactory(baseModule, *args, **kwargs):
9191
else:
9292
name = b"_%s_factory" % baseModule.__name__
9393

94-
if name in moduleCache:
95-
return moduleCache[name]
96-
else:
94+
kwargs_tuple = tuple(kwargs.items())
95+
96+
try:
97+
return moduleCache[name][args][kwargs_tuple]
98+
except KeyError:
9799
mod = ModuleType(name)
98100
objs = factory(baseModule, *args, **kwargs)
99101
mod.__dict__.update(objs)
100-
moduleCache[name] = mod
102+
if "name" not in moduleCache:
103+
moduleCache[name] = {}
104+
if "args" not in moduleCache[name]:
105+
moduleCache[name][args] = {}
106+
if "kwargs" not in moduleCache[name][args]:
107+
moduleCache[name][args][kwargs_tuple] = {}
108+
moduleCache[name][args][kwargs_tuple] = mod
101109
return mod
102110

103111
return moduleFactory

0 commit comments

Comments
 (0)