Skip to content

Commit c74e0fd

Browse files
committed
Fix Node.treerepr if mapping raises an exception on __getitem__.
1 parent fefbfe9 commit c74e0fd

File tree

2 files changed

+26
-4
lines changed

2 files changed

+26
-4
lines changed

src/node/behaviors/node.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -133,12 +133,19 @@ def collect_schema_members(cls):
133133
for name in schema_members
134134
], key=lambda x: x[0])
135135
if IMappingNode.providedBy(self):
136-
items = (
137-
self.items()
136+
items = list()
137+
for key in self:
138+
try:
139+
value = self[key]
140+
except Exception as e:
141+
value = repr(e)
142+
items.append((key, value))
143+
sorted_items = (
144+
items
138145
if IOrdered.providedBy(self)
139-
else sorted(self.items(), key=lambda x: safe_decode(x[0]))
146+
else sorted(items, key=lambda x: safe_decode(x[0]))
140147
)
141-
for item in items:
148+
for item in sorted_items:
142149
if item[0] not in schema_members:
143150
children.append(item)
144151
elif ISequenceNode.providedBy(self):

src/node/tests/test_node.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from node.behaviors import DefaultInit
2+
from node.behaviors import MappingNode
23
from node.behaviors import Node
34
from node.behaviors import NodeInit
45
from node.interfaces import IDefaultInit
@@ -31,6 +32,13 @@ class NodeObject(object):
3132
pass
3233

3334

35+
@plumbing(DefaultInit, Node, MappingNode)
36+
class BrokenMapping(object):
37+
38+
def __iter__(self):
39+
yield 'child'
40+
41+
3442
class NoInterface(Interface):
3543
pass
3644

@@ -98,3 +106,10 @@ def test_Node(self):
98106
node.noderepr,
99107
"<class 'node.tests.test_node.NodeObject'>: node"
100108
)
109+
110+
# treerepr
111+
broken = BrokenMapping(name='broken')
112+
self.checkOutput("""
113+
<class 'node.tests.test_node.BrokenMapping'>: broken
114+
__child: 'NotImplementedError()'
115+
""", broken.treerepr(prefix='_'))

0 commit comments

Comments
 (0)