Skip to content

Commit 02759ad

Browse files
author
Steve Canny
committed
add OpcPackage._walk_parts()
1 parent 3b57bfa commit 02759ad

2 files changed

Lines changed: 33 additions & 0 deletions

File tree

opc/package.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,18 @@ def _walk_parts(rels, visited_parts=None):
6666
Generate exactly one reference to each of the parts in the package by
6767
performing a depth-first traversal of the rels graph.
6868
"""
69+
if visited_parts is None:
70+
visited_parts = []
71+
for rel in rels:
72+
if rel.is_external:
73+
continue
74+
part = rel.target_part
75+
if part in visited_parts:
76+
continue
77+
visited_parts.append(part)
78+
yield part
79+
for part in OpcPackage._walk_parts(part._rels, visited_parts):
80+
yield part
6981

7082

7183
class Part(object):

tests/test_package.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,27 @@ def it_has_an_immutable_sequence_containing_its_parts(self):
8181
with patch.object(OpcPackage, '_walk_parts', return_value=parts):
8282
assert pkg.parts == (parts[0], parts[1])
8383

84+
def it_can_iterate_over_parts_by_walking_rels_graph(self):
85+
# +----------+ +--------+
86+
# | pkg_rels |-----> | part_1 |
87+
# +----------+ +--------+
88+
# | | ^
89+
# v v |
90+
# external +--------+
91+
# | part_2 |
92+
# +--------+
93+
part1, part2 = (Mock(name='part1'), Mock(name='part2'))
94+
part1._rels = [Mock(name='rel1', is_external=False, target_part=part2)]
95+
part2._rels = [Mock(name='rel2', is_external=False, target_part=part1)]
96+
pkg_rels = [
97+
Mock(name='rel3', is_external=False, target_part=part1),
98+
Mock(name='rel3', is_external=True),
99+
]
100+
# exercise ---------------------
101+
generated_parts = [part for part in OpcPackage._walk_parts(pkg_rels)]
102+
# verify -----------------------
103+
assert generated_parts == [part1, part2]
104+
84105

85106
class DescribePart(object):
86107

0 commit comments

Comments
 (0)