summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2017-04-12 23:16:05 +0100
committerMichael Williamson <mike@zwobble.org>2017-04-12 23:16:05 +0100
commit826a73a06ded47ee70d9d6c7da2ad394c447a9f9 (patch)
tree21cb0bccd563835d03a6d5e861a2565c9b28fdd1
parent438d88240b5bfa99494562fc39817967fbfbb2f0 (diff)
Fix recursion in transforms
-rw-r--r--mammoth/transforms.py2
-rw-r--r--tests/transforms_tests.py31
2 files changed, 31 insertions, 2 deletions
diff --git a/mammoth/transforms.py b/mammoth/transforms.py
index d126578..649b4db 100644
--- a/mammoth/transforms.py
+++ b/mammoth/transforms.py
@@ -18,7 +18,7 @@ def element_of_type(element_type, transform):
def _each_element(transform_element):
def transform_element_and_children(element):
if isinstance(element, documents.HasChildren):
- children = list(map(transform_element, element.children))
+ children = list(map(transform_element_and_children, element.children))
element = element.copy(children=children)
return transform_element(element)
diff --git a/tests/transforms_tests.py b/tests/transforms_tests.py
index e4f5360..0f0a05d 100644
--- a/tests/transforms_tests.py
+++ b/tests/transforms_tests.py
@@ -1,7 +1,36 @@
+import cobble
from nose.tools import assert_equal, istest
from mammoth import documents
-from mammoth.transforms import get_descendants, get_descendants_of_type
+from mammoth.transforms import get_descendants, get_descendants_of_type, _each_element
+
+
+@istest
+class EachElementTests(object):
+ @istest
+ def all_descendants_are_transformed(self):
+ @cobble.data
+ class Count(documents.HasChildren):
+ count = cobble.field()
+
+ root = Count(count=None, children=[
+ Count(count=None, children=[
+ Count(count=None, children=[]),
+ ]),
+ ])
+
+ current_count = [0]
+ def set_count(node):
+ current_count[0] += 1
+ return node.copy(count=current_count[0])
+
+ result = _each_element(set_count)(root)
+
+ assert_equal(Count(count=3, children=[
+ Count(count=2, children=[
+ Count(count=1, children=[]),
+ ]),
+ ]), result)
@istest