[ILibraryView] child_order shouldn't leak graphlib.CycleErrror
This commit is contained in:
parent
09a95a6608
commit
ae314cce93
2 changed files with 28 additions and 2 deletions
|
|
@ -22,7 +22,7 @@ import copy
|
||||||
from pprint import pformat
|
from pprint import pformat
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
from abc import ABCMeta, abstractmethod
|
from abc import ABCMeta, abstractmethod
|
||||||
from graphlib import TopologicalSorter
|
from graphlib import TopologicalSorter, CycleError
|
||||||
|
|
||||||
import numpy
|
import numpy
|
||||||
from numpy.typing import ArrayLike, NDArray
|
from numpy.typing import ArrayLike, NDArray
|
||||||
|
|
@ -618,7 +618,13 @@ class ILibraryView(Mapping[str, 'Pattern'], metaclass=ABCMeta):
|
||||||
Return:
|
Return:
|
||||||
Topologically sorted list of pattern names.
|
Topologically sorted list of pattern names.
|
||||||
"""
|
"""
|
||||||
|
try:
|
||||||
return cast('list[str]', list(TopologicalSorter(self.child_graph(dangling=dangling)).static_order()))
|
return cast('list[str]', list(TopologicalSorter(self.child_graph(dangling=dangling)).static_order()))
|
||||||
|
except CycleError as exc:
|
||||||
|
cycle = exc.args[1] if len(exc.args) > 1 else None
|
||||||
|
if cycle is None:
|
||||||
|
raise LibraryError('Cycle found while building child order') from exc
|
||||||
|
raise LibraryError(f'Cycle found while building child order: {cycle}') from exc
|
||||||
|
|
||||||
def find_refs_local(
|
def find_refs_local(
|
||||||
self,
|
self,
|
||||||
|
|
|
||||||
|
|
@ -293,6 +293,26 @@ def test_library_subtree() -> None:
|
||||||
assert "c" not in sub
|
assert "c" not in sub
|
||||||
|
|
||||||
|
|
||||||
|
def test_library_child_order_cycle_raises_library_error() -> None:
|
||||||
|
lib = Library()
|
||||||
|
lib["a"] = Pattern()
|
||||||
|
lib["a"].ref("b")
|
||||||
|
lib["b"] = Pattern()
|
||||||
|
lib["b"].ref("a")
|
||||||
|
|
||||||
|
with pytest.raises(LibraryError, match="Cycle found while building child order"):
|
||||||
|
lib.child_order()
|
||||||
|
|
||||||
|
|
||||||
|
def test_library_find_refs_global_cycle_raises_library_error() -> None:
|
||||||
|
lib = Library()
|
||||||
|
lib["a"] = Pattern()
|
||||||
|
lib["a"].ref("a")
|
||||||
|
|
||||||
|
with pytest.raises(LibraryError, match="Cycle found while building child order"):
|
||||||
|
lib.find_refs_global("a")
|
||||||
|
|
||||||
|
|
||||||
def test_library_get_name() -> None:
|
def test_library_get_name() -> None:
|
||||||
lib = Library()
|
lib = Library()
|
||||||
lib["cell"] = Pattern()
|
lib["cell"] = Pattern()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue