@@ -100,6 +100,13 @@ def validate(self) -> bool:
100
100
"""
101
101
return True
102
102
103
+ @property
104
+ def present (self ) -> bool :
105
+ """
106
+ Is the mapping component present?
107
+ """
108
+ raise NotImplementedError ()
109
+
103
110
104
111
class Segment (AbstractMappingComponent ):
105
112
"""
@@ -113,6 +120,7 @@ def __init__(self, tag: str, *elements, **kwargs):
113
120
self .__component__ = SegmentFactory .create_segment (
114
121
tag , * elements , validate = False
115
122
)
123
+ self .__present__ = True
116
124
117
125
@property
118
126
def tag (self ) -> str :
@@ -126,6 +134,8 @@ def __getitem__(self, key):
126
134
127
135
def __setitem__ (self , key , value ):
128
136
self .__component__ [key ] = value
137
+ if not self .__present__ :
138
+ self .__present__ = True
129
139
130
140
def validate (self ) -> bool :
131
141
return self .__component__ .validate ()
@@ -135,16 +145,23 @@ def from_segments(self, iterator: BiDirectionalIterator):
135
145
136
146
if self .tag == segment .tag :
137
147
self .__component__ = segment
148
+ self .__present__ = True
138
149
return
139
150
140
151
if self .mandatory :
141
152
raise EDISyntaxError ("Missing %s, found %s" % (self .tag , segment ))
142
153
154
+ self .__present__ = False
155
+
143
156
iterator .prev ()
144
157
145
158
def to_segments (self ):
146
159
return self .__component__
147
160
161
+ @property
162
+ def present (self ) -> bool :
163
+ return self .__present__
164
+
148
165
149
166
class SegmentGroupMetaClass (type ):
150
167
"""
@@ -220,6 +237,10 @@ def __str__(self) -> str:
220
237
res .append (str (component ))
221
238
return "\n " .join (res )
222
239
240
+ @property
241
+ def present (self ) -> bool :
242
+ return any (getattr (self , component_name ).present for component_name in self .__components__ )
243
+
223
244
224
245
class Loop (AbstractMappingComponent ):
225
246
"""
@@ -284,3 +305,7 @@ def append(self, value: AbstractMappingComponent):
284
305
Append an item to the loop
285
306
"""
286
307
self .value .append (value )
308
+
309
+ @property
310
+ def present (self ) -> bool :
311
+ return any (value .present for value in self .value )
0 commit comments