diff --git a/masque/builder/builder.py b/masque/builder/builder.py index 41511fd..9cfa207 100644 --- a/masque/builder/builder.py +++ b/masque/builder/builder.py @@ -7,7 +7,7 @@ import numpy from numpy import pi from numpy.typing import ArrayLike -from ..pattern import Pattern +from ..pattern import Pattern, NamedPattern from ..ref import Ref from ..library import MutableLibrary from ..error import PortError, BuildError @@ -253,7 +253,7 @@ class Builder(PortList): def plug( self: BB, - other: Union[Abstract, str], + other: Union[Abstract, str, NamedPattern], map_in: Dict[str, str], map_out: Optional[Dict[str, Optional[str]]] = None, *, @@ -352,7 +352,7 @@ class Builder(PortList): def place( self: BB, - other: Union[Abstract, str], + other: Union[Abstract, str, NamedPattern], *, offset: ArrayLike = (0, 0), rotation: float = 0, diff --git a/masque/library.py b/masque/library.py index 2b085c0..72a4f60 100644 --- a/masque/library.py +++ b/masque/library.py @@ -25,7 +25,7 @@ from .label import Label from .abstract import Abstract if TYPE_CHECKING: - from .pattern import Pattern + from .pattern import Pattern, NamedPattern logger = logging.getLogger(__name__) @@ -447,7 +447,7 @@ class MutableLibrary(Library, MutableMapping[str, 'Pattern'], metaclass=ABCMeta) del self[old_name] return self - def create(self, base_name: str) -> Tuple[str, 'Pattern']: + def create(self, base_name: str) -> NamedPattern: """ Convenience method to create an empty pattern, choose a name for it, add it with that name, and return both the pattern and name. @@ -460,8 +460,9 @@ class MutableLibrary(Library, MutableMapping[str, 'Pattern'], metaclass=ABCMeta) """ from .pattern import Pattern name = self.get_name(base_name) - pat = Pattern() - self[name] = value + npat = NamedPattern(name) + self[name] = npat + return npat def name_and_set( self, @@ -748,6 +749,8 @@ class WrapLibrary(MutableLibrary): if callable(value): value = value() + elif hasattr(value, 'as_pattern'): + value = cast('NamedPattern', value).as_pattern() # don't want to carry along NamedPattern instances else: value = value self.mapping[key] = value diff --git a/masque/pattern.py b/masque/pattern.py index f62a265..f624b73 100644 --- a/masque/pattern.py +++ b/masque/pattern.py @@ -665,3 +665,50 @@ class Pattern(PortList, AnnotatableImpl, Mirrorable): pyplot.ylabel('y') pyplot.show() + +class NamedPattern(Pattern): + """ + TODO: Document NamedPattern + """ + __slots__ = ('_name',) + + _name: str + """ The pattern's name """ + + @property + def name(self) -> str: + return self._name + + def __init__(self, name: str) -> None: + """ + Creates an empty NamedPattern + + Args: + name: The pattern's name. Immutable. + + """ + Pattern.__init__(self) + self._name = name + + def __repr__(self) -> str: + s = f' Pattern: + return Pattern.__copy__(self) + + def __deepcopy__(self, memo: Optional[Dict] = None) -> Pattern: + return Pattern.__deepcopy__(self, memo) + + def as_pattern(self) -> Pattern: + return Pattern( + shapes=self.shapes, + labels=self.labels, + refs=self.refs, + annotations=self.annotations, + ports=self.ports, + )