1717
1818
1919from abc import ABC
20- from typing import TYPE_CHECKING , Iterator , Optional
20+ from typing import Iterable , Iterator , List , Optional
2121
2222from pydantic import Field , HttpUrl
2323
2424from ..mixin import ModelRefMixin
2525from .model_item import ModelItem , ModelItemIO
26-
27-
28- if TYPE_CHECKING :
29- from .relationship import Relationship
26+ from .relationship import Relationship , RelationshipIO
3027
3128
3229__all__ = ("ElementIO" , "Element" )
@@ -46,6 +43,7 @@ class ElementIO(ModelItemIO, ABC):
4643 name : str = Field (...)
4744 description : str = Field ("" )
4845 url : Optional [HttpUrl ] = Field (None )
46+ relationships : Optional [List [RelationshipIO ]] = Field ([])
4947
5048
5149class Element (ModelRefMixin , ModelItem , ABC ):
@@ -60,28 +58,44 @@ class Element(ModelRefMixin, ModelItem, ABC):
6058 """
6159
6260 def __init__ (
63- self , * , name : str , description : str = "" , url : Optional [str ] = None , ** kwargs
61+ self ,
62+ * ,
63+ name : str ,
64+ description : str = "" ,
65+ url : Optional [str ] = None ,
66+ relationships : Optional [Iterable [Relationship ]] = (),
67+ ** kwargs ,
6468 ) -> None :
6569 """Initialize an element with an empty 'private' model reference."""
6670 super ().__init__ (** kwargs )
6771 self .name = name
6872 self .description = description
6973 self .url = url
74+ self .relationships = set (relationships )
7075
71- def get_relationships (self ) -> Iterator ["Relationship" ]:
76+ def __repr__ (self ):
77+ """Return a string representation of this instance."""
78+ return f"{ type (self ).__name__ } (id={ self .id } , name={ self .name } )"
79+
80+ def get_relationships (self ) -> Iterator [Relationship ]:
7281 """Return a Iterator over all relationships involving this element."""
7382 return (
7483 r
7584 for r in self .get_model ().get_relationships ()
7685 if self is r .source or self is r .destination
7786 )
7887
79- def get_efferent_relationships (self ) -> Iterator [" Relationship" ]:
88+ def get_efferent_relationships (self ) -> Iterator [Relationship ]:
8089 """Return a Iterator over all outgoing relationships involving this element."""
8190 return (r for r in self .get_model ().get_relationships () if self is r .source )
8291
83- def get_afferent_relationships (self ) -> Iterator [" Relationship" ]:
92+ def get_afferent_relationships (self ) -> Iterator [Relationship ]:
8493 """Return a Iterator over all incoming relationships involving this element."""
8594 return (
8695 r for r in self .get_model ().get_relationships () if self is r .destination
8796 )
97+
98+ def add_relationship (self , relationship : Optional [Relationship ] = None , ** kwargs ):
99+ if relationship is None :
100+ relationship = Relationship (** kwargs )
101+ self .relationships .add (relationship )
0 commit comments