• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

Westfall-io / sysml2py / 5672263635

pending completion
5672263635

push

github-actions

Christopher Cox
:sparkles: Flow Connector added to grammar and initial test built.

35 of 35 new or added lines in 1 file covered. (100.0%)

2315 of 2586 relevant lines covered (89.52%)

0.9 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

88.89
/src/sysml2py/grammar/classes.py
1
#!/usr/bin/env python3
2
# -*- coding: utf-8 -*-
3
"""
1✔
4
Created on Sat Jun  3 12:37:27 2023
5

6
@author: christophercox
7
"""
8

9
import json
1✔
10

11

12
def valid_definition(definition, name):
1✔
13
    if isinstance(definition, dict):
1✔
14
        if "name" in definition:
1✔
15
            if definition["name"] == name:
1✔
16
                return True
1✔
17
            else:
18
                print(definition["name"])
1✔
19
                raise ValueError("The name of the element did not match.")
1✔
20

21
        else:
22
            raise AttributeError("This does not seem to be valid.")
1✔
23
    else:
24
        print("\n\nDefinition: {}".format(definition))
1✔
25
        raise TypeError("This does not seem to be valid.")
1✔
26

27

28
def beautify(string):
1✔
29
    level = 0
1✔
30
    lines = string.split("\n")
1✔
31
    ns = []
1✔
32
    # print(lines)
33
    for line in lines:
1✔
34
        line = line.rstrip()
1✔
35
        if line == "}":
1✔
36
            level += -1
1✔
37

38
        ns.append(level * "   " + line)
1✔
39

40
        if line[-1] == "{":
1✔
41
            # Last character is new bracket
42
            level += 1
1✔
43

44
    return "\n".join(ns)
1✔
45

46

47
class RootNamespace:
1✔
48
    def __init__(self, definition):
1✔
49
        self.children = []
1✔
50
        try:
1✔
51
            if valid_definition(definition, "PackageBodyElement"):
1✔
52
                # This is a SysML Element
53
                self.load_package_body(definition["ownedRelationship"])
1✔
54
        except ValueError:
1✔
55
            try:
1✔
56
                if valid_definition(definition, "NamespaceBodyElement"):
1✔
57
                    # This is a KerML Element
58
                    pass
×
59
            except ValueError:
1✔
60
                print(definition)
1✔
61
                raise ValueError("Not expecting any other root node names.")
1✔
62

63
    def load_package_body(self, definition):
1✔
64
        for member in definition:
1✔
65
            if isinstance(member, dict):
1✔
66
                # Options here are PackageMember, ElementFilterMember, AliasMember, Import
67
                if member["name"] == "PackageMember":
1✔
68
                    memberclass = PackageMember(member)
1✔
69
                elif member["name"] == "ElementFilterMember":
×
70
                    raise NotImplementedError
×
71
                elif member["name"] == "AliasMember":
×
72
                    raise NotImplementedError
×
73
                elif member["name"] == "Import":
×
74
                    raise NotImplementedError
×
75
                else:
76
                    print(member["name"])
×
77
                    raise AttributeError("Error")
×
78

79
                self.children.append(memberclass)
1✔
80
            else:
81
                print(member)
×
82
                raise TypeError("Invalid definition, member was not type dict")
×
83

84
    def dump(self):
1✔
85
        output = []
1✔
86
        for child in self.children:
1✔
87
            output.append(child.dump())
1✔
88
        return beautify("\n".join(output))
1✔
89

90
    def get_definition(self):
1✔
91
        output = {
1✔
92
            "name": "PackageBodyElement",  # !TODO This isn't always the case
93
            "ownedRelationship": [],
94
        }
95
        for member in self.children:
1✔
96
            output["ownedRelationship"].append(member.get_definition())
1✔
97
        return output
1✔
98

99

100
class DefinitionElement:
1✔
101
    def __init__(self, definition):
1✔
102
        self.children = []
1✔
103
        if valid_definition(definition, "DefinitionElement"):
1✔
104
            # This is a SysML Element
105
            if isinstance(definition["ownedRelatedElement"], str):
1✔
106
                raise NotImplementedError
×
107

108
            de = definition["ownedRelatedElement"]["name"]
1✔
109
            if de == "Package":
1✔
110
                self.children.append(Package(definition["ownedRelatedElement"]))
1✔
111
            elif de == "PartDefinition":
1✔
112
                self.children.append(PartDefinition(definition["ownedRelatedElement"]))
1✔
113
            elif de == "AttributeDefinition":
1✔
114
                self.children.append(
1✔
115
                    AttributeDefinition(definition["ownedRelatedElement"])
116
                )
117
            elif de == "AnnotatingElement":
1✔
118
                self.children.append(
1✔
119
                    AnnotatingElement(definition["ownedRelatedElement"])
120
                )
121

122
            elif de == "EnumerationDefinition":
1✔
123
                self.children.append(
1✔
124
                    EnumerationDefinition(definition["ownedRelatedElement"])
125
                )
126
            elif de == "ItemDefinition":
1✔
127
                self.children.append(ItemDefinition(definition["ownedRelatedElement"]))
1✔
128
            elif de == "ConnectionDefinition":
1✔
129
                self.children.append(
1✔
130
                    ConnectionDefinition(definition["ownedRelatedElement"])
131
                )
132
            elif de == "PortDefinition":
1✔
133
                self.children.append(PortDefinition(definition["ownedRelatedElement"]))
1✔
134
            elif de == "InterfaceDefinition":
1✔
135
                self.children.append(
1✔
136
                    InterfaceDefinition(definition["ownedRelatedElement"])
137
                )
138
            else:
139
                print(de)
×
140
                raise NotImplementedError
×
141

142
    def dump(self):
1✔
143
        output = []
1✔
144
        for child in self.children:
1✔
145
            output.append(child.dump())
1✔
146

147
        return " ".join(filter(None, (output)))
1✔
148

149
    def get_definition(self):
1✔
150
        output = {"name": self.__class__.__name__, "ownedRelatedElement": []}
1✔
151

152
        for item in self.children:
1✔
153
            output["ownedRelatedElement"] = item.get_definition()
1✔
154
        return output
1✔
155

156

157
class InterfaceDefinition:
1✔
158
    def __init__(self, definition):
1✔
159
        if valid_definition(definition, self.__class__.__name__):
1✔
160
            self.prefix = None
1✔
161
            self.keyword = "interface def"
1✔
162
            self.declaration = None
1✔
163
            self.body = None
1✔
164

165
            if definition["prefix"] is not None:
1✔
166
                self.prefix = OccurrenceDefinitionPrefix(definition["prefix"])
×
167

168
            if definition["declaration"] is not None:
1✔
169
                self.declaration = DefinitionDeclaration(definition["declaration"])
1✔
170

171
            if definition["body"] is not None:
1✔
172
                self.body = InterfaceBody(definition["body"])
1✔
173

174
    def dump(self):
1✔
175
        output = []
1✔
176
        if self.prefix is not None:
1✔
177
            output.append(self.prefix.dump())
×
178
        output.append(self.keyword)
1✔
179
        if self.declaration is not None:
1✔
180
            output.append(self.declaration.dump())
1✔
181
        if self.body is not None:
1✔
182
            output.append(self.body.dump())
1✔
183
        return " ".join(output)
1✔
184

185

186
class InterfaceBody:
1✔
187
    def __init__(self, definition):
1✔
188
        if valid_definition(definition, self.__class__.__name__):
1✔
189
            self.items = []
1✔
190
            for item in definition["item"]:
1✔
191
                self.items.append(InterfaceBodyItem(item))
1✔
192

193
    def dump(self):
1✔
194
        if len(self.items) == 0:
1✔
195
            return ";"
1✔
196
        else:
197
            return "{\n" + "\n".join([child.dump() for child in self.items]) + "\n}"
1✔
198

199

200
class InterfaceBodyItem:
1✔
201
    def __init__(self, definition):
1✔
202
        if valid_definition(definition, self.__class__.__name__):
1✔
203
            self.children = []
1✔
204
            for relationship in definition["ownedRelationship"]:
1✔
205
                if relationship["name"] == "DefinitionMember":
1✔
206
                    self.children.append(DefinitionMember(relationship))
×
207
                elif relationship["name"] == "VariantUsageMember":
1✔
208
                    raise NotImplementedError
×
209
                elif relationship["name"] == "InterfaceNonOccurrenceUsageMember":
1✔
210
                    raise NotImplementedError
×
211
                elif relationship["name"] == "EmptySuccessionMember":
1✔
212
                    raise NotImplementedError
×
213
                elif relationship["name"] == "InterfaceOccurrenceUsageMember":
1✔
214
                    self.children.append(InterfaceOccurrenceUsageMember(relationship))
1✔
215
                elif relationship["name"] == "AliasMember":
×
216
                    self.children.append(AliasMember(relationship))
×
217
                elif relationship["name"] == "Import":
×
218
                    self.children.append(Import(relationship))
×
219

220
    def dump(self):
1✔
221
        return "\n".join([child.dump() for child in self.children])
1✔
222

223

224
class InterfaceOccurrenceUsageMember:
1✔
225
    def __init__(self, definition):
1✔
226
        if valid_definition(definition, self.__class__.__name__):
1✔
227
            self.prefix = None
1✔
228
            self.elements = []
1✔
229
            if definition["prefix"] is not None:
1✔
230
                self.prefix = MemberPrefix(definition["prefix"])
×
231

232
            for element in definition["ownedRelatedElement"]:
1✔
233
                self.elements.append(InterfaceOccurrenceUsageElement(element))
1✔
234

235
    def dump(self):
1✔
236
        output = []
1✔
237
        if self.prefix is not None:
1✔
238
            output.append(self.prefix.dump())
×
239

240
        for element in self.elements:
1✔
241
            output.append(element.dump())
1✔
242

243
        return "\n".join(output)
1✔
244

245

246
class InterfaceOccurrenceUsageElement:
1✔
247
    def __init__(self, definition):
1✔
248
        if valid_definition(definition, self.__class__.__name__):
1✔
249
            if definition["element"]["name"] == "DefaultInterfaceEnd":
1✔
250
                self.element = DefaultInterfaceEnd(definition["element"])
1✔
251
            elif definition["element"]["name"] == "StructureUsageElement":
1✔
252
                self.element = StructureUsageElement(definition["element"])
1✔
253
            else:
254
                raise NotImplementedError
×
255

256
    def dump(self):
1✔
257
        return self.element.dump()
1✔
258

259

260
class DefaultInterfaceEnd:
1✔
261
    def __init__(self, definition):
1✔
262
        if valid_definition(definition, self.__class__.__name__):
1✔
263
            self.direction = None
1✔
264
            self.isAbstract = definition["isAbstract"]
1✔
265
            self.isVariation = definition["isVariation"]
1✔
266
            self.isEnd = definition["isEnd"]
1✔
267
            self.usage = None
1✔
268

269
            if definition["direction"] is not None:
1✔
270
                self.direction = FeatureDirection(definition["direction"])
×
271

272
            if definition["usage"] is not None:
1✔
273
                self.usage = Usage(definition["usage"])
1✔
274

275
    def dump(self):
1✔
276
        output = []
1✔
277
        if self.direction is not None:
1✔
278
            output.append(self.direction.dump())
×
279
        if self.isAbstract:
1✔
280
            output.append("abstract")
×
281
        elif self.isVariation:
1✔
282
            output.append("variation")
×
283
        if self.isEnd:
1✔
284
            output.append("end")
1✔
285
        if self.usage is not None:
1✔
286
            output.append(self.usage.dump())
1✔
287
        return " ".join(output)
1✔
288

289

290
class PortDefinition:
1✔
291
    def __init__(self, definition=None):
1✔
292
        self.keyword = "port def"
1✔
293
        self.prefix = None
1✔
294
        if definition is not None:
1✔
295
            if valid_definition(definition, self.__class__.__name__):
1✔
296
                if definition["prefix"] is not None:
1✔
297
                    self.prefix = DefinitionPrefix(definition["prefix"])
×
298

299
                if definition["definition"] is not None:
1✔
300
                    self.definition = Definition(definition["definition"])
1✔
301
                else:
302
                    raise AttributeError("Definition is required.")
×
303
        else:
304
            self.definition = Definition()
1✔
305

306
    def dump(self):
1✔
307
        output = []
1✔
308
        if self.prefix is not None:
1✔
309
            output.append(self.prefix.dump())
×
310

311
        output.append(self.keyword)
1✔
312

313
        if self.definition is not None:
1✔
314
            output.append(self.definition.dump())
1✔
315

316
        return " ".join(output)
1✔
317

318
    def get_definition(self):
1✔
319
        output = {"name": self.__class__.__name__, "prefix": None}
1✔
320
        if self.prefix is not None:
1✔
321
            output["prefix"] = self.prefix.get_definition()
×
322

323
        output["definition"] = self.definition.get_definition()
1✔
324
        return output
1✔
325

326

327
class DefinitionPrefix:
1✔
328
    def __init__(self, definition):
1✔
329
        if valid_definition(definition, self.__class__.__name__):
×
330
            self.prefix = None
×
331
            self.keywords = []
×
332

333
            if definition["prefix"] is not None:
×
334
                self.prefix = BasicDefinitionPrefix(definition["prefix"])
×
335

336
            for keyword in definition["keyword"]:
×
337
                self.keywords.append(DefinitionExtensionKeyword(keyword))
×
338

339
    def dump(self):
1✔
340
        output = []
×
341
        if self.prefix is not None:
×
342
            output.append(self.prefix.dump())
×
343

344
        for keyword in self.keywords:
×
345
            output.append(keyword.dump())
×
346
        return "".join(output)
×
347

348

349
class DefinitionExtensionKeyword:
1✔
350
    def __init__(self, definition):
1✔
351
        if valid_definition(definition, self.__class__.__name__):
×
352
            self.relationships = []
×
353
            for relationship in definition["ownedRelationship"]:
×
354
                self.relationships.append(PrefixMetadataMember(relationship))
×
355

356
    def dump(self):
1✔
357
        return "".join([child.dump() for child in self.relationships])
×
358

359

360
class PrefixMetadataMember:
1✔
361
    def __init__(self, definition):
1✔
362
        if valid_definition(definition, self.__class__.__name__):
×
363
            raise NotImplementedError
×
364

365

366
class ConnectionDefinition:
1✔
367
    def __init__(self, definition):
1✔
368
        if valid_definition(definition, self.__class__.__name__):
1✔
369
            self.keyword = "connection def"
1✔
370
            self.prefix = None
1✔
371
            self.definition = None
1✔
372

373
            if definition["prefix"] is not None:
1✔
374
                self.prefix = OccurrenceDefinitionPrefix(definition["prefix"])
×
375

376
            if definition["definition"] is not None:
1✔
377
                self.definition = Definition(definition["definition"])
1✔
378

379
    def dump(self):
1✔
380
        output = []
1✔
381
        if self.prefix is not None:
1✔
382
            output.append(self.prefix.dump())
×
383

384
        output.append(self.keyword)
1✔
385
        if self.definition is not None:
1✔
386
            output.append(self.definition.dump())
1✔
387

388
        return " ".join(output)
1✔
389

390

391
class ItemDefinition:
1✔
392
    def __init__(self, definition=None):
1✔
393
        self.keyword = "item def"
1✔
394
        if definition is not None:
1✔
395
            if valid_definition(definition, self.__class__.__name__):
1✔
396
                if definition["prefix"] is not None:
1✔
397
                    self.prefix = OccurrenceDefinitionPrefix(definition["prefix"])
×
398
                else:
399
                    self.prefix = None
1✔
400
                self.definition = Definition(definition["definition"])
1✔
401
        else:
402
            self.prefix = None
1✔
403
            self.definition = Definition()
1✔
404

405
    def dump(self):
1✔
406
        output = []
1✔
407
        if self.prefix is not None:
1✔
408
            output.append(self.prefix.dump())
×
409

410
        output.append(self.keyword)
1✔
411
        output.append(self.definition.dump())
1✔
412
        return " ".join(output)
1✔
413

414
    def get_definition(self):
1✔
415
        output = {"name": self.__class__.__name__, "prefix": None}
1✔
416
        if self.prefix is not None:
1✔
417
            output["prefix"] = self.prefix.get_definition()
×
418
        output["definition"] = self.definition.get_definition()
1✔
419
        return output
1✔
420

421

422
class EnumerationDefinition:
1✔
423
    def __init__(self, definition):
1✔
424
        if valid_definition(definition, self.__class__.__name__):
1✔
425
            self.keyword = "enum def"
1✔
426
            self.declaration = DefinitionDeclaration(definition["declaration"])
1✔
427
            self.body = EnumerationBody(definition["body"])
1✔
428

429
    def dump(self):
1✔
430
        return " ".join([self.keyword, self.declaration.dump() + self.body.dump()])
1✔
431

432

433
class EnumerationBody:
1✔
434
    def __init__(self, definition):
1✔
435
        if valid_definition(definition, self.__class__.__name__):
1✔
436
            if len(definition["ownedRelationship"]) == 0:
1✔
437
                self.relationships = None
×
438
            else:
439
                self.relationships = []
1✔
440
                for relationship in definition["ownedRelationship"]:
1✔
441
                    if relationship["name"] == "AnnotatingMember":
1✔
442
                        self.relationships.append(AnnotatingMember(relationship))
×
443
                    else:
444
                        self.relationships.append(EnumerationUsageMember(relationship))
1✔
445

446
    def dump(self):
1✔
447
        if self.relationships is None:
1✔
448
            return ";"
×
449
        else:
450
            return (
1✔
451
                "{\n"
452
                + "\n".join([child.dump() for child in self.relationships])
453
                + "\n}"
454
            )
455

456

457
class EnumerationUsageMember:
1✔
458
    def __init__(self, definition):
1✔
459
        if valid_definition(definition, self.__class__.__name__):
1✔
460
            if definition["prefix"] is not None:
1✔
461
                self.prefix = MemberPrefix(definition["prefix"])
×
462
            else:
463
                self.prefix = None
1✔
464

465
            if len(definition["ownedRelatedElement"]) == 0:
1✔
466
                raise NotImplementedError
×
467
            else:
468
                self.relationships = []
1✔
469
                for element in definition["ownedRelatedElement"]:
1✔
470
                    self.relationships.append(EnumeratedValue(element))
1✔
471

472
    def dump(self):
1✔
473
        output = [child.dump() for child in self.relationships]
1✔
474
        if self.prefix is not None:
1✔
475
            output.insert(0, self.prefix.dump())
×
476

477
        return " ".join(output)
1✔
478

479

480
class EnumeratedValue:
1✔
481
    def __init__(self, definition):
1✔
482
        if valid_definition(definition, self.__class__.__name__):
1✔
483
            if definition["keyword"] is not None:
1✔
484
                self.keyword = definition["keyword"]
1✔
485
            else:
486
                self.keyword = None
1✔
487
            self.usage = Usage(definition["usage"])
1✔
488

489
    def dump(self):
1✔
490
        if self.keyword is not None:
1✔
491
            return self.keyword + " " + self.usage.dump()
1✔
492
        else:
493
            return self.usage.dump()
1✔
494

495

496
class AnnotatingMember:
1✔
497
    def __init__(self, definition):
1✔
498
        if valid_definition(definition, self.__class__.__name__):
×
499
            if len(definition["ownedRelatedElement"]) == 0:
×
500
                raise NotImplementedError
×
501
            else:
502
                self.children = []
×
503
                for element in definition["ownedRelatedElement"]:
×
504
                    self.children.append(AnnotatingElement(element))
×
505

506
    def dump(self):
1✔
507
        return " ".join([child.dump() for child in self.children])
×
508

509

510
class AnnotatingElement:
1✔
511
    def __init__(self, definition):
1✔
512
        if valid_definition(definition, "AnnotatingElement"):
1✔
513
            if definition["ownedRelatedElement"]["name"] == "Documentation":
1✔
514
                self.children = Documentation(definition["ownedRelatedElement"])
1✔
515
            elif definition["ownedRelatedElement"]["name"] == "CommentSysML":
1✔
516
                self.children = CommentSysML(definition["ownedRelatedElement"])
1✔
517
            else:
518
                raise NotImplementedError
×
519

520
    def dump(self):
1✔
521
        return self.children.dump()
1✔
522

523

524
class CommentSysML:
1✔
525
    def __init__(self, definition):
1✔
526
        if valid_definition(definition, "CommentSysML"):
1✔
527
            self.body = definition["body"]
1✔
528
            if definition["identification"] is not None:
1✔
529
                self.identification = Identification(definition["identification"])
1✔
530
            else:
531
                self.identification = None
1✔
532

533
            self.children = []
1✔
534
            for relationship in definition["ownedRelationship"]:
1✔
535
                self.children.append(Annotation(relationship))
1✔
536

537
    def dump(self):
1✔
538
        if len(self.children) > 0:
1✔
539
            if self.identification is not None:
1✔
540
                id_str = self.identification.dump()
×
541
            else:
542
                id_str = ""
1✔
543
            return (
1✔
544
                "comment "
545
                + id_str
546
                + "about "
547
                + ", ".join([child.dump() for child in self.children])
548
                + self.body
549
            )
550
        else:
551
            if self.identification is not None:
1✔
552
                return "comment " + self.identification.dump() + " " + self.body
1✔
553
            else:
554
                return self.body
1✔
555

556

557
class Annotation:
1✔
558
    def __init__(self, definition):
1✔
559
        if valid_definition(definition, "Annotation"):
1✔
560
            self.annotation = QualifiedName(definition["annotatedElement"])
1✔
561

562
    def dump(self):
1✔
563
        return self.annotation.dump()
1✔
564

565

566
class Documentation:
1✔
567
    def __init__(self, definition):
1✔
568
        if valid_definition(definition, "Documentation"):
1✔
569
            self.keyword = "doc"
1✔
570
            if definition["identification"] is not None:
1✔
571
                self.identification = Identification(definition["identification"])
1✔
572
            else:
573
                self.identification = None
1✔
574

575
            self.body = definition["body"]
1✔
576

577
    def dump(self):
1✔
578
        if self.identification is not None:
1✔
579
            return " ".join([self.keyword, self.identification.dump(), self.body])
1✔
580
        else:
581
            return " ".join([self.keyword, self.body])
1✔
582

583

584
class AttributeDefinition:
1✔
585
    def __init__(self, definition=None):
1✔
586
        self.keyword = "attribute def"
1✔
587
        if definition is not None:
1✔
588
            if valid_definition(definition, "AttributeDefinition"):
1✔
589
                if definition["prefix"] is not None:
1✔
590
                    raise NotImplementedError
×
591
                self.prefix = None
1✔
592
                self.definition = Definition(definition["definition"])
1✔
593
        else:
594
            self.prefix = None
1✔
595
            self.definition = Definition()
1✔
596

597
    def dump(self):
1✔
598
        return " ".join(
1✔
599
            filter(None, (self.prefix, self.keyword, self.definition.dump()))
600
        )
601

602
    def get_definition(self):
1✔
603
        output = {"name": self.__class__.__name__, "prefix": None}
1✔
604
        if self.prefix is not None:
1✔
605
            output["prefix"] = self.prefix.get_definition()
×
606
        output["definition"] = self.definition.get_definition()
1✔
607
        return output
1✔
608

609

610
class PartDefinition:
1✔
611
    def __init__(self, definition=None):
1✔
612
        if definition is not None:
1✔
613
            if valid_definition(definition, "PartDefinition"):
1✔
614
                if definition["prefix"] is not None:
1✔
615
                    self.prefix = OccurrenceDefinitionPrefix(definition["prefix"])
1✔
616
                else:
617
                    self.prefix = None
1✔
618
                self.keyword = "part def"
1✔
619
                self.definition = Definition(definition["definition"])
1✔
620
        else:
621
            self.prefix = None
1✔
622
            self.keyword = "part def"
1✔
623
            self.definition = Definition()
1✔
624

625
    def dump(self):
1✔
626
        output = []
1✔
627
        if self.prefix is not None:
1✔
628
            output.append(self.prefix.dump())
1✔
629

630
        output.append(self.keyword)
1✔
631
        output.append(self.definition.dump())
1✔
632

633
        return " ".join(output)
1✔
634

635
    def get_definition(self):
1✔
636
        output = {"name": self.__class__.__name__, "prefix": None}
1✔
637
        if self.prefix is not None:
1✔
638
            output["prefix"] = self.prefix.get_definition()
×
639

640
        output["definition"] = self.definition.get_definition()
1✔
641

642
        return output
1✔
643

644

645
class OccurrenceDefinitionPrefix:
1✔
646
    def __init__(self, definition):
1✔
647
        if valid_definition(definition, "OccurrenceDefinitionPrefix"):
1✔
648
            if definition["prefix"] is not None:
1✔
649
                self.prefix = BasicDefinitionPrefix(definition["prefix"])
1✔
650
            else:
651
                self.prefix = None
×
652

653
            self.isIndividual = definition["isIndividual"]
1✔
654

655
            self.children = []
1✔
656
            if len(definition["ownedRelationship"]) > 0:
1✔
657
                for relationship in definition["ownedRelationship"]:
×
658
                    self.children.append(LifeClassMembership(relationship))
×
659

660
            if len(definition["keyword"]) > 0:
1✔
661
                raise NotImplementedError
×
662

663
    def dump(self):
1✔
664
        output = []
1✔
665
        if self.prefix is not None:
1✔
666
            output.append(self.prefix.dump())
1✔
667

668
        if self.isIndividual:
1✔
669
            output.append("individual")
×
670

671
        for child in self.children:
1✔
672
            output.append(child.dump())
×
673

674
        return " ".join(output)
1✔
675

676

677
class BasicDefinitionPrefix:
1✔
678
    def __init__(self, definition):
1✔
679
        if valid_definition(definition, "BasicDefinitionPrefix"):
1✔
680
            self.isAbstract = definition["isAbstract"]
1✔
681
            self.isVariation = definition["isVariation"]
1✔
682

683
    def dump(self):
1✔
684
        # Only one or the other
685
        if self.isAbstract:
1✔
686
            output = "abstract"
1✔
687
        if self.isVariation:
1✔
688
            output = "variation"
×
689
        return output
1✔
690

691

692
class LifeClassMembership:
1✔
693
    def __init__(self, definition):
1✔
694
        if valid_definition(definition, "LifeClassMembership"):
×
695
            raise NotImplementedError
×
696

697
    def dump(self):
1✔
698
        raise NotImplementedError
×
699

700

701
class Definition:
1✔
702
    def __init__(self, definition=None):
1✔
703
        if definition is not None:
1✔
704
            if valid_definition(definition, "Definition"):
1✔
705
                self.declaration = DefinitionDeclaration(definition["declaration"])
1✔
706
                self.body = DefinitionBody(definition["body"])
1✔
707
        else:
708
            self.declaration = DefinitionDeclaration()
1✔
709
            self.body = DefinitionBody()
1✔
710

711
    def dump(self):
1✔
712
        return " ".join([self.declaration.dump(), self.body.dump()])
1✔
713

714
    def get_definition(self):
1✔
715
        return {
1✔
716
            "name": self.__class__.__name__,
717
            "body": self.body.get_definition(),
718
            "declaration": self.declaration.get_definition(),
719
        }
720

721

722
class DefinitionDeclaration:
1✔
723
    def __init__(self, definition=None):
1✔
724
        if definition is not None:
1✔
725
            if valid_definition(definition, self.__class__.__name__):
1✔
726
                if "identification" in definition:
1✔
727
                    if definition["identification"] is not None:
1✔
728
                        self.identification = Identification(
1✔
729
                            definition["identification"]
730
                        )
731
                    else:
732
                        self.identification = None
×
733
                else:
734
                    self.identification = None
×
735

736
                if "subclassificationpart" in definition:
1✔
737
                    if definition["subclassificationpart"] is not None:
1✔
738
                        self.subclassificationpart = SubclassificationPart(
1✔
739
                            definition["subclassificationpart"]
740
                        )
741
                    else:
742
                        self.subclassificationpart = None
1✔
743
                else:
744
                    self.subclassificationpart = None
×
745

746
        else:
747
            self.identification = Identification()
1✔
748
            self.subclassificationpart = None
1✔
749

750
    def dump(self):
1✔
751
        output = []
1✔
752
        if self.identification is not None:
1✔
753
            output.append(self.identification.dump())
1✔
754
        if self.subclassificationpart is not None:
1✔
755
            output.append(self.subclassificationpart.dump())
1✔
756
        return " ".join(output)
1✔
757

758
    def get_definition(self):
1✔
759
        output = {
1✔
760
            "name": self.__class__.__name__,
761
            "identification": None,
762
            "subclassificationpart": None,
763
        }
764
        if self.identification is not None:
1✔
765
            output["identification"] = self.identification.get_definition()
1✔
766

767
        if self.subclassificationpart is not None:
1✔
768
            output[
×
769
                "subclassificationpart"
770
            ] = self.subclassificationpart.get_definition()
771

772
        return output
1✔
773

774

775
class SubclassificationPart:
1✔
776
    def __init__(self, definition):
1✔
777
        if valid_definition(definition, "SubclassificationPart"):
1✔
778
            self.keyword = ":> "
1✔
779
            self.children = []
1✔
780
            for relationship in definition["ownedRelationship"]:
1✔
781
                self.children.append(OwnedSubclassification(relationship))
1✔
782

783
    def dump(self):
1✔
784
        return self.keyword + ", ".join([child.dump() for child in self.children])
1✔
785

786

787
class OwnedSubclassification:
1✔
788
    def __init__(self, definition):
1✔
789
        if valid_definition(definition, "OwnedSubclassification"):
1✔
790
            self.name = QualifiedName(definition["superclassifier"])
1✔
791

792
    def dump(self):
1✔
793
        return self.name.dump()
1✔
794

795

796
class DefinitionBody:
1✔
797
    def __init__(self, definition=None):
1✔
798
        if definition is not None:
1✔
799
            if valid_definition(definition, "DefinitionBody"):
1✔
800
                self.children = []
1✔
801
                if len(definition["ownedRelatedElement"]) > 0:
1✔
802
                    for item in definition["ownedRelatedElement"]:
1✔
803
                        self.children.append(DefinitionBodyItem(item))
1✔
804
        else:
805
            self.children = []
1✔
806

807
    def dump(self):
1✔
808
        if len(self.children) == 0:
1✔
809
            return ";"
1✔
810
        else:
811
            output = []
1✔
812
            for child in self.children:
1✔
813
                output.append(child.dump())
1✔
814
            return " {\n" + "\n".join(output) + "\n}"
1✔
815

816
    def get_definition(self):
1✔
817
        output = {"name": self.__class__.__name__, "ownedRelatedElement": []}
1✔
818
        for child in self.children:
1✔
819
            output["ownedRelatedElement"].append(child.get_definition())
1✔
820

821
        return output
1✔
822

823

824
class DefinitionBodyItem:
1✔
825
    def __init__(self, definition):
1✔
826
        if valid_definition(definition, "DefinitionBodyItem"):
1✔
827
            self.children = []
1✔
828
            if len(definition["ownedRelationship"]) > 0:
1✔
829
                for item in definition["ownedRelationship"]:
1✔
830
                    if item["name"] == "OccurrenceUsageMember":
1✔
831
                        self.children.append(OccurrenceUsageMember(item))
1✔
832
                    elif item["name"] == "NonOccurrenceUsageMember":
1✔
833
                        self.children.append(NonOccurrenceUsageMember(item))
1✔
834
                    elif item["name"] == "DefinitionMember":
1✔
835
                        self.children.append(DefinitionMember(item))
1✔
836
                    else:
837
                        print(definition)
×
838
                        raise NotImplementedError
×
839

840
    def dump(self):
1✔
841
        output = []
1✔
842
        for child in self.children:
1✔
843
            output.append(child.dump())
1✔
844
        return "\n".join(output)
1✔
845

846
    def get_definition(self):
1✔
847
        output = {"name": self.__class__.__name__}
1✔
848
        items = []
1✔
849
        for item in self.children:
1✔
850
            items.append(item.get_definition())
1✔
851
        output["ownedRelationship"] = items
1✔
852
        return output
1✔
853

854

855
class DefinitionMember:
1✔
856
    def __init__(self, definition):
1✔
857
        if valid_definition(definition, "DefinitionMember"):
1✔
858
            if definition["prefix"] is not None:
1✔
859
                raise NotImplementedError
×
860
            else:
861
                self.prefix = None
1✔
862

863
            self.children = []
1✔
864
            for element in definition["ownedRelatedElement"]:
1✔
865
                self.children.append(DefinitionElement(element))
1✔
866

867
    def dump(self):
1✔
868
        return "\n".join([child.dump() for child in self.children])
1✔
869

870
    def get_definition(self):
1✔
871
        output = {
1✔
872
            "name": self.__class__.__name__,
873
            "prefix": None,
874
            "ownedRelatedElement": [],
875
        }
876
        if self.prefix is not None:
1✔
877
            output["prefix"] = self.prefix.get_definition()
×
878

879
        for item in self.children:
1✔
880
            output["ownedRelatedElement"].append(item.get_definition())
1✔
881
        return output
1✔
882

883

884
class OccurrenceUsageMember:
1✔
885
    def __init__(self, definition):
1✔
886
        if valid_definition(definition, "OccurrenceUsageMember"):
1✔
887
            if definition["prefix"] is not None:
1✔
888
                raise NotImplementedError
×
889
            else:
890
                self.prefix = None
1✔
891

892
            self.children = []
1✔
893
            for element in definition["ownedRelatedElement"]:
1✔
894
                self.children.append(OccurrenceUsageElement(element))
1✔
895

896
    def dump(self):
1✔
897
        output = []
1✔
898
        for child in self.children:
1✔
899
            output.append(child.dump())
1✔
900
        return "\n".join(output)
1✔
901

902
    def get_definition(self):
1✔
903
        output = {
1✔
904
            "name": self.__class__.__name__,
905
            "prefix": None,
906
            "ownedRelatedElement": [],
907
        }
908
        if self.prefix is not None:
1✔
909
            output["prefix"] = self.prefix.get_definition()
×
910

911
        for child in self.children:
1✔
912
            output["ownedRelatedElement"].append(child.get_definition())
1✔
913

914
        return output
1✔
915

916

917
class NonOccurrenceUsageMember:
1✔
918
    def __init__(self, definition):
1✔
919
        if valid_definition(definition, "NonOccurrenceUsageMember"):
1✔
920
            if definition["prefix"] is not None:
1✔
921
                raise NotImplementedError
×
922
            else:
923
                self.prefix = None
1✔
924

925
            self.children = []
1✔
926
            for element in definition["ownedRelatedElement"]:
1✔
927
                self.children.append(NonOccurrenceUsageElement(element))
1✔
928

929
    def dump(self):
1✔
930
        output = []
1✔
931
        for child in self.children:
1✔
932
            output.append(child.dump())
1✔
933
        return "\n".join(output)
1✔
934

935
    def get_definition(self):
1✔
936
        output = {
1✔
937
            "name": self.__class__.__name__,
938
            "prefix": None,
939
            "ownedRelatedElement": [],
940
        }
941
        if self.prefix is not None:
1✔
942
            output["prefix"] = self.prefix.get_definition()
×
943

944
        for child in self.children:
1✔
945
            output["ownedRelatedElement"].append(child.get_definition())
1✔
946

947
        return output
1✔
948

949

950
class UsageElement:
1✔
951
    def __init__(self, definition):
1✔
952
        if valid_definition(definition, "UsageElement"):
1✔
953
            if definition["ownedRelatedElement"]["name"] == "NonOccurrenceUsageElement":
1✔
954
                self.children = NonOccurrenceUsageElement(
1✔
955
                    definition["ownedRelatedElement"]
956
                )
957
            elif definition["ownedRelatedElement"]["name"] == "OccurrenceUsageElement":
1✔
958
                self.children = OccurrenceUsageElement(
1✔
959
                    definition["ownedRelatedElement"]
960
                )
961
            else:
962
                raise AttributeError("This does not seem to be valid.")
×
963

964
    def dump(self):
1✔
965
        return self.children.dump()
1✔
966

967
    def get_definition(self):
1✔
968
        output = {
1✔
969
            "name": self.__class__.__name__,
970
            "ownedRelatedElement": self.children.get_definition(),
971
        }
972
        return output
1✔
973

974

975
class NonOccurrenceUsageElement:
1✔
976
    def __init__(self, definition):
1✔
977
        if valid_definition(definition, "NonOccurrenceUsageElement"):
1✔
978
            if definition["ownedRelatedElement"]["name"] == "DefaultReferenceUsage":
1✔
979
                self.children = DefaultReferenceUsage(definition["ownedRelatedElement"])
1✔
980
            elif definition["ownedRelatedElement"]["name"] == "AttributeUsage":
1✔
981
                self.children = AttributeUsage(definition["ownedRelatedElement"])
1✔
982
            elif definition["ownedRelatedElement"]["name"] == "BindingConnector":
1✔
983
                self.children = BindingConnector(definition["ownedRelatedElement"])
1✔
984
            else:
985
                print(definition["ownedRelatedElement"]["name"])
×
986
                raise NotImplementedError
×
987

988
    def dump(self):
1✔
989
        return self.children.dump()
1✔
990

991
    def get_definition(self):
1✔
992
        output = {"name": self.__class__.__name__}
1✔
993
        output["ownedRelatedElement"] = self.children.get_definition()
1✔
994
        return output
1✔
995

996
class BindingConnector:
1✔
997
    def __init__(self, definition=None):
1✔
998
        self.prefix = None
1✔
999
        self.declaration = None
1✔
1000
        self.keyword = 'bind'
1✔
1001
        self.children = []
1✔
1002
        if definition is not None:
1✔
1003
            if valid_definition(definition, self.__class__.__name__):
1✔
1004
                if definition['prefix'] is not None:
1✔
1005
                    #self.prefix = UsagePrefix(definition['prefix'])
1006
                    pass
×
1007
                if definition['declaration'] is not None:
1✔
1008
                    self.declaration = UsageDeclaration(definition['declaration'])
×
1009
                
1010
                if len(definition['ownedRelationship']) == 0:
1✔
1011
                    pass
×
1012
                elif len(definition['ownedRelationship']) == 2:
1✔
1013
                    for child in definition['ownedRelationship']:
1✔
1014
                        self.children.append(ConnectorEndMember(child))
1✔
1015
                else:
1016
                    raise NotImplementedError
×
1017

1018
                self.body = DefinitionBody(definition['body'])
1✔
1019
                    
1020
    def dump(self):
1✔
1021
        output = []
1✔
1022
        if self.prefix is not None:
1✔
1023
            output.append(self.prefix.dump())
×
1024
        if self.declaration is not None:
1✔
1025
            output.append('binding')
×
1026
            output.append(self.declaration.dump())
×
1027
        output.append(self.keyword)
1✔
1028
        
1029
        connectors = []
1✔
1030
        for child in self.children:
1✔
1031
            connectors.append(child.dump())
1✔
1032
        output.append(' = '.join(connectors))
1✔
1033
        
1034
        output.append(self.body.dump())
1✔
1035
            
1036
        return ' '.join(output)
1✔
1037

1038
class DefaultReferenceUsage:
1✔
1039
    def __init__(self, definition=None):
1✔
1040
        self.prefix = None
1✔
1041
        self.valuepart = None
1✔
1042
        if definition is not None:
1✔
1043
            if valid_definition(definition, "DefaultReferenceUsage"):
1✔
1044
                if definition["prefix"] is not None:
1✔
1045
                    self.prefix = RefPrefix(definition["prefix"])
1✔
1046

1047
                self.declaration = UsageDeclaration(definition["declaration"])
1✔
1048
                if definition["valuepart"] is not None:
1✔
1049
                    self.valuepart = ValuePart(definition["valuepart"])
1✔
1050

1051
                self.body = UsageBody(definition["body"])
1✔
1052
        else:
1053
            self.declaration = UsageDeclaration()
1✔
1054
            self.body = UsageBody()
1✔
1055

1056
    def dump(self):
1✔
1057
        output = []
1✔
1058
        if self.prefix is not None:
1✔
1059
            output.append(self.prefix.dump())
1✔
1060
        output.append(self.declaration.dump())
1✔
1061
        if self.valuepart is not None:
1✔
1062
            output.append(self.valuepart.dump())
1✔
1063
        output.append(self.body.dump())
1✔
1064

1065
        return " ".join(output)
1✔
1066

1067
    def get_definition(self):
1✔
1068
        output = {"name": self.__class__.__name__, "prefix": None, "valuepart": None}
1✔
1069
        if self.prefix is not None:
1✔
1070
            output["prefix"] = self.prefix.get_definition()
1✔
1071

1072
        if self.valuepart is not None:
1✔
1073
            output["valuepart"] = self.valuepart.get_definition()
×
1074
        output["declaration"] = self.declaration.get_definition()
1✔
1075
        output["body"] = self.body.get_definition()
1✔
1076
        return output
1✔
1077

1078

1079
class ValuePart:
1✔
1080
    def __init__(self, definition):
1✔
1081
        if valid_definition(definition, "ValuePart"):
1✔
1082
            if len(definition["ownedRelationship"]) == 0:
1✔
1083
                raise NotImplementedError
×
1084
            else:
1085
                self.relationships = []
1✔
1086
                for relationship in definition["ownedRelationship"]:
1✔
1087
                    if relationship["name"] == "FeatureValue":
1✔
1088
                        self.relationships.append(FeatureValue(relationship))
1✔
1089
                    elif relationship["name"] == "FeatureValueExpression":
×
1090
                        raise NotImplementedError
×
1091
                    elif relationship["name"] == "EmptyAssignmentActionMember":
×
1092
                        raise NotImplementedError
×
1093
                    else:
1094
                        raise NotImplementedError
×
1095

1096
    def dump(self):
1✔
1097
        return "".join([child.dump() for child in self.relationships])
1✔
1098

1099
    def get_definition(self):
1✔
1100
        output = {"name": self.__class__.__name__, "ownedRelationship": []}
1✔
1101
        for child in self.relationships:
1✔
1102
            output["ownedRelationship"].append(child.get_definition())
1✔
1103
        return output
1✔
1104

1105

1106
class FeatureValue:
1✔
1107
    def __init__(self, definition):
1✔
1108
        if valid_definition(definition, self.__class__.__name__):
1✔
1109
            self.isDefault = definition["isDefault"]
1✔
1110
            self.isInitial = definition["isInitial"]
1✔
1111
            self.isEqual = definition["isEqual"]
1✔
1112
            self.elements = []
1✔
1113
            for element in definition["ownedRelatedElement"]:
1✔
1114
                self.elements.append(OwnedExpression(element))
1✔
1115

1116
    def dump(self):
1✔
1117
        output = ["="]
1✔
1118
        if self.isDefault:
1✔
1119
            output.append("default")
×
1120
        if self.isEqual:
1✔
1121
            output.append("=")
×
1122
        elif self.isInitial:
1✔
1123
            output.append(":=")
×
1124
        for child in self.elements:
1✔
1125
            output.append(child.dump())
1✔
1126
        return " ".join(output)
1✔
1127

1128
    def get_definition(self):
1✔
1129
        output = {"name": self.__class__.__name__, "ownedRelatedElement": []}
1✔
1130
        for child in self.elements:
1✔
1131
            output["ownedRelatedElement"].append(child.get_definition())
1✔
1132
        output["isEqual"] = self.isEqual
1✔
1133
        output["isInitial"] = self.isInitial
1✔
1134
        output["isDefault"] = self.isDefault
1✔
1135
        return output
1✔
1136

1137

1138
class OwnedExpression:
1✔
1139
    def __init__(self, definition):
1✔
1140
        if valid_definition(definition, self.__class__.__name__):
1✔
1141
            self.expression = ConditionalExpression(definition["expression"])
1✔
1142

1143
    def dump(self):
1✔
1144
        return self.expression.dump()
1✔
1145

1146
    def get_definition(self):
1✔
1147
        return {
1✔
1148
            "name": self.__class__.__name__,
1149
            "expression": self.expression.get_definition(),
1150
        }
1151

1152

1153
class ConditionalExpression:
1✔
1154
    def __init__(self, definition):
1✔
1155
        if valid_definition(definition, self.__class__.__name__):
1✔
1156
            if definition["operand"] is not None:
1✔
1157
                self.operands = []
1✔
1158
                for op in definition["operand"]:
1✔
1159
                    self.operands.append(NullCoalescingExpression(op))
1✔
1160
            else:
1161
                raise NotImplementedError
×
1162

1163
    def dump(self):
1✔
1164
        return "".join(child.dump() for child in self.operands)
1✔
1165

1166
    def get_definition(self):
1✔
1167
        output = {"name": self.__class__.__name__, "operator": [], "operand": []}
1✔
1168
        for child in self.operands:
1✔
1169
            output["operand"].append(child.get_definition())
1✔
1170
        return output
1✔
1171

1172

1173
class NullCoalescingExpression:
1✔
1174
    def __init__(self, definition):
1✔
1175
        if valid_definition(definition, self.__class__.__name__):
1✔
1176
            if definition["implies"] is not None:
1✔
1177
                self.implies = ImpliesExpression(definition["implies"])
1✔
1178
            else:
1179
                raise NotImplementedError
×
1180

1181
            if not (definition["operand"] == [] and definition["operator"] == []):
1✔
1182
                raise NotImplementedError
×
1183

1184
    def dump(self):
1✔
1185
        return self.implies.dump()
1✔
1186

1187
    def get_definition(self):
1✔
1188
        output = {
1✔
1189
            "name": self.__class__.__name__,
1190
            "operator": [],
1191
            "operand": [],
1192
            "implies": self.implies.get_definition(),
1193
        }
1194
        return output
1✔
1195

1196

1197
class ImpliesExpression:
1✔
1198
    def __init__(self, definition):
1✔
1199
        if valid_definition(definition, self.__class__.__name__):
1✔
1200
            if definition["or"] is not None:
1✔
1201
                self.orexpression = OrExpression(definition["or"])
1✔
1202
            else:
1203
                raise NotImplementedError
×
1204

1205
            if not (definition["operand"] == [] and definition["operator"] == []):
1✔
1206
                raise NotImplementedError
×
1207

1208
    def dump(self):
1✔
1209
        return self.orexpression.dump()
1✔
1210

1211
    def get_definition(self):
1✔
1212
        output = {
1✔
1213
            "name": self.__class__.__name__,
1214
            "operator": [],
1215
            "operand": [],
1216
            "or": self.orexpression.get_definition(),
1217
        }
1218
        return output
1✔
1219

1220

1221
class OrExpression:
1✔
1222
    def __init__(self, definition):
1✔
1223
        if valid_definition(definition, self.__class__.__name__):
1✔
1224
            if definition["xor"] is not None:
1✔
1225
                self.xor = XorExpression(definition["xor"])
1✔
1226
            else:
1227
                raise NotImplementedError
×
1228

1229
            if not (definition["operand"] == [] and definition["operator"] == []):
1✔
1230
                raise NotImplementedError
×
1231

1232
    def dump(self):
1✔
1233
        return self.xor.dump()
1✔
1234

1235
    def get_definition(self):
1✔
1236
        output = {
1✔
1237
            "name": self.__class__.__name__,
1238
            "operator": [],
1239
            "operand": [],
1240
            "xor": self.xor.get_definition(),
1241
        }
1242
        return output
1✔
1243

1244

1245
class XorExpression:
1✔
1246
    def __init__(self, definition):
1✔
1247
        if valid_definition(definition, self.__class__.__name__):
1✔
1248
            if definition["and"] is not None:
1✔
1249
                self.andexpression = AndExpression(definition["and"])
1✔
1250
            else:
1251
                raise NotImplementedError
×
1252

1253
            if not (definition["operand"] == [] and definition["operator"] == []):
1✔
1254
                raise NotImplementedError
×
1255

1256
    def dump(self):
1✔
1257
        return self.andexpression.dump()
1✔
1258

1259
    def get_definition(self):
1✔
1260
        output = {
1✔
1261
            "name": self.__class__.__name__,
1262
            "operator": [],
1263
            "operand": [],
1264
            "and": self.andexpression.get_definition(),
1265
        }
1266
        return output
1✔
1267

1268

1269
class AndExpression:
1✔
1270
    def __init__(self, definition):
1✔
1271
        if valid_definition(definition, self.__class__.__name__):
1✔
1272
            if definition["equality"] is not None:
1✔
1273
                self.equality = EqualityExpression(definition["equality"])
1✔
1274
            else:
1275
                raise NotImplementedError
×
1276

1277
            if not (definition["operand"] == [] and definition["operator"] == []):
1✔
1278
                raise NotImplementedError
×
1279

1280
    def dump(self):
1✔
1281
        return self.equality.dump()
1✔
1282

1283
    def get_definition(self):
1✔
1284
        output = {
1✔
1285
            "name": self.__class__.__name__,
1286
            "operator": [],
1287
            "operand": [],
1288
            "equality": self.equality.get_definition(),
1289
        }
1290
        return output
1✔
1291

1292

1293
class EqualityExpression:
1✔
1294
    def __init__(self, definition):
1✔
1295
        if valid_definition(definition, self.__class__.__name__):
1✔
1296
            if definition["classification"] is not None:
1✔
1297
                self.classification = ClassificationExpression(
1✔
1298
                    definition["classification"]
1299
                )
1300
            else:
1301
                raise NotImplementedError
×
1302

1303
            if not (definition["operand"] == [] and definition["operator"] == []):
1✔
1304
                raise NotImplementedError
×
1305

1306
    def dump(self):
1✔
1307
        return self.classification.dump()
1✔
1308

1309
    def get_definition(self):
1✔
1310
        output = {
1✔
1311
            "name": self.__class__.__name__,
1312
            "operator": [],
1313
            "operand": [],
1314
            "classification": self.classification.get_definition(),
1315
        }
1316
        return output
1✔
1317

1318

1319
class ClassificationExpression:
1✔
1320
    def __init__(self, definition):
1✔
1321
        if valid_definition(definition, self.__class__.__name__):
1✔
1322
            if definition["relational"] is not None:
1✔
1323
                self.relational = RelationalExpression(definition["relational"])
1✔
1324
            else:
1325
                raise NotImplementedError
×
1326

1327
            if not (definition["operand"] == [] and definition["operator"] is None):
1✔
1328
                raise NotImplementedError
×
1329

1330
    def dump(self):
1✔
1331
        return self.relational.dump()
1✔
1332

1333
    def get_definition(self):
1✔
1334
        output = {
1✔
1335
            "name": self.__class__.__name__,
1336
            "operator": None,
1337
            "operand": [],
1338
            "relational": self.relational.get_definition(),
1339
        }
1340
        return output
1✔
1341

1342

1343
class RelationalExpression:
1✔
1344
    def __init__(self, definition):
1✔
1345
        if valid_definition(definition, self.__class__.__name__):
1✔
1346
            if definition["range"] is not None:
1✔
1347
                self.range = RangeExpression(definition["range"])
1✔
1348
            else:
1349
                raise NotImplementedError
×
1350

1351
            if not (definition["operand"] == [] and definition["operator"] == []):
1✔
1352
                raise NotImplementedError
×
1353

1354
    def dump(self):
1✔
1355
        return self.range.dump()
1✔
1356

1357
    def get_definition(self):
1✔
1358
        output = {
1✔
1359
            "name": self.__class__.__name__,
1360
            "operator": [],
1361
            "operand": [],
1362
            "range": self.range.get_definition(),
1363
        }
1364
        return output
1✔
1365

1366

1367
class RangeExpression:
1✔
1368
    def __init__(self, definition):
1✔
1369
        if valid_definition(definition, self.__class__.__name__):
1✔
1370
            if definition["additive"] is not None:
1✔
1371
                self.additive = AdditiveExpression(definition["additive"])
1✔
1372
            else:
1373
                raise NotImplementedError
×
1374

1375
            if not (definition["operand"] == [] and definition["operator"] == ""):
1✔
1376
                raise NotImplementedError
×
1377

1378
    def dump(self):
1✔
1379
        return self.additive.dump()
1✔
1380

1381
    def get_definition(self):
1✔
1382
        output = {
1✔
1383
            "name": self.__class__.__name__,
1384
            "operator": "",
1385
            "operand": [],
1386
            "additive": self.additive.get_definition(),
1387
        }
1388
        return output
1✔
1389

1390

1391
class AdditiveExpression:
1✔
1392
    def __init__(self, definition):
1✔
1393
        if valid_definition(definition, self.__class__.__name__):
1✔
1394
            if definition["multiplicitive"] is not None:
1✔
1395
                self.multiplicitive = MultiplicativeExpression(
1✔
1396
                    definition["multiplicitive"]
1397
                )
1398
            else:
1399
                raise NotImplementedError
×
1400

1401
            if not (definition["operand"] == [] and definition["operator"] == []):
1✔
1402
                raise NotImplementedError
×
1403

1404
    def dump(self):
1✔
1405
        return self.multiplicitive.dump()
1✔
1406

1407
    def get_definition(self):
1✔
1408
        output = {
1✔
1409
            "name": self.__class__.__name__,
1410
            "operator": [],
1411
            "operand": [],
1412
            "multiplicitive": self.multiplicitive.get_definition(),
1413
        }
1414
        return output
1✔
1415

1416

1417
class MultiplicativeExpression:
1✔
1418
    def __init__(self, definition):
1✔
1419
        if valid_definition(definition, self.__class__.__name__):
1✔
1420
            if definition["exponential"] is not None:
1✔
1421
                self.exponential = ExponentiationExpression(definition["exponential"])
1✔
1422
            else:
1423
                raise NotImplementedError
×
1424

1425
            if not (definition["operand"] == [] and definition["operator"] == []):
1✔
1426
                raise NotImplementedError
×
1427

1428
    def dump(self):
1✔
1429
        return self.exponential.dump()
1✔
1430

1431
    def get_definition(self):
1✔
1432
        output = {
1✔
1433
            "name": self.__class__.__name__,
1434
            "operator": [],
1435
            "operand": [],
1436
            "exponential": self.exponential.get_definition(),
1437
        }
1438
        return output
1✔
1439

1440

1441
class ExponentiationExpression:
1✔
1442
    def __init__(self, definition):
1✔
1443
        if valid_definition(definition, self.__class__.__name__):
1✔
1444
            if definition["unary"] is not None:
1✔
1445
                self.unary = UnaryExpression(definition["unary"])
1✔
1446
            else:
1447
                raise NotImplementedError
×
1448

1449
            if not (definition["operand"] == [] and definition["operator"] == []):
1✔
1450
                raise NotImplementedError
×
1451

1452
    def dump(self):
1✔
1453
        return self.unary.dump()
1✔
1454

1455
    def get_definition(self):
1✔
1456
        output = {
1✔
1457
            "name": self.__class__.__name__,
1458
            "operator": [],
1459
            "operand": [],
1460
            "unary": self.unary.get_definition(),
1461
        }
1462
        return output
1✔
1463

1464

1465
class UnaryExpression:
1✔
1466
    def __init__(self, definition):
1✔
1467
        if valid_definition(definition, self.__class__.__name__):
1✔
1468
            if definition["extent"] is not None:
1✔
1469
                self.extent = ExtentExpression(definition["extent"])
1✔
1470
            else:
1471
                raise NotImplementedError
×
1472

1473
            if not (definition["operand"] == [] and definition["operator"] is None):
1✔
1474
                raise NotImplementedError
×
1475

1476
    def dump(self):
1✔
1477
        return self.extent.dump()
1✔
1478

1479
    def get_definition(self):
1✔
1480
        output = {
1✔
1481
            "name": self.__class__.__name__,
1482
            "operator": None,
1483
            "operand": [],
1484
            "extent": self.extent.get_definition(),
1485
        }
1486
        return output
1✔
1487

1488

1489
class ExtentExpression:
1✔
1490
    def __init__(self, definition):
1✔
1491
        if valid_definition(definition, self.__class__.__name__):
1✔
1492
            if definition["primary"] is not None:
1✔
1493
                self.primary = PrimaryExpression(definition["primary"])
1✔
1494
            else:
1495
                raise NotImplementedError
×
1496

1497
            if not (definition["operator"] == ""):
1✔
1498
                raise NotImplementedError
×
1499

1500
    def dump(self):
1✔
1501
        return self.primary.dump()
1✔
1502

1503
    def get_definition(self):
1✔
1504
        output = {
1✔
1505
            "name": self.__class__.__name__,
1506
            "operator": "",
1507
            "operand": [],
1508
            "primary": self.primary.get_definition(),
1509
            "ownedRelationship": [],
1510
        }
1511
        return output
1✔
1512

1513

1514
class PrimaryExpression:
1✔
1515
    def __init__(self, definition):
1✔
1516
        if valid_definition(definition, self.__class__.__name__):
1✔
1517
            if definition["base"] is not None:
1✔
1518
                self.base = BaseExpression(definition["base"])
1✔
1519
            else:
1520
                raise NotImplementedError
×
1521

1522
            if len(definition["ownedRelationship"]) > 0:
1✔
1523
                raise NotImplementedError
×
1524

1525
            self.operator = []
1✔
1526
            self.operand = []
1✔
1527

1528
            if not (definition["operand"] == [] and definition["operator"] == []):
1✔
1529
                for child in definition["operator"]:
1✔
1530
                    self.operator.append(child)
1✔
1531
                for child in definition["operand"]:
1✔
1532
                    if child["name"] == "SequenceExpression":
1✔
1533
                        self.operand.append(SequenceExpression(child))
1✔
1534

1535
    def dump(self):
1✔
1536
        output = [self.base.dump()]
1✔
1537
        for k, v in enumerate(self.operator):
1✔
1538
            if v == "#":
1✔
1539
                output.append("# ({})".format(self.operand[k].dump()))
×
1540

1541
            if v == "[":
1✔
1542
                output.append("[{}]".format(self.operand[k].dump()))
1✔
1543

1544
            if v == "." or v == ".?":
1✔
1545
                raise NotImplementedError
×
1546
        if len(output) == 1:
1✔
1547
            return str(output[0])
1✔
1548
        else:
1549
            return " ".join(output)
1✔
1550

1551
    def get_definition(self):
1✔
1552
        output = {
1✔
1553
            "name": self.__class__.__name__,
1554
            "operator": [],
1555
            "operand": [],
1556
            "base": self.base.get_definition(),
1557
            "ownedRelationship": [],
1558
        }
1559
        for child in self.operand:
1✔
1560
            output["operand"].append(child.get_definition())
1✔
1561

1562
        for child in self.operator:
1✔
1563
            output["operator"].append(child)
1✔
1564
        return output
1✔
1565

1566

1567
class SequenceExpression:
1✔
1568
    def __init__(self, definition):
1✔
1569
        if valid_definition(definition, self.__class__.__name__):
1✔
1570
            if not (definition["operand"] == [] and definition["operator"] == ""):
1✔
1571
                raise NotImplementedError
×
1572

1573
            self.child = None
1✔
1574
            if definition["ownedRelationship"] is not None:
1✔
1575
                if definition["ownedRelationship"]["name"] == "OwnedExpression":
1✔
1576
                    self.child = OwnedExpression(definition["ownedRelationship"])
1✔
1577

1578
    def dump(self):
1✔
1579
        return self.child.dump()
1✔
1580

1581
    def get_definition(self):
1✔
1582
        output = {
1✔
1583
            "name": self.__class__.__name__,
1584
            "operator": "",
1585
            "operand": [],
1586
            "ownedRelationship": self.child.get_definition(),
1587
        }
1588
        return output
1✔
1589

1590

1591
class BaseExpression:
1✔
1592
    def __init__(self, definition):
1✔
1593
        if valid_definition(definition, self.__class__.__name__):
1✔
1594
            if definition["ownedRelationship"]["name"] == "FeatureReferenceExpression":
1✔
1595
                self.relationship = FeatureReferenceExpression(
1✔
1596
                    definition["ownedRelationship"]
1597
                )
1598
            elif definition["ownedRelationship"]["name"] == "LiteralInteger":
1✔
1599
                self.relationship = LiteralInteger(definition["ownedRelationship"])
1✔
1600
            elif definition["ownedRelationship"]["name"] == "LiteralString":
1✔
1601
                self.relationship = LiteralString(definition["ownedRelationship"])
1✔
1602
            elif definition["ownedRelationship"]["name"] == "LiteralReal":
1✔
1603
                self.relationship = LiteralReal(definition["ownedRelationship"])
1✔
1604
            else:
1605
                raise NotImplementedError
×
1606

1607
    def dump(self):
1✔
1608
        return self.relationship.dump()
1✔
1609

1610
    def get_definition(self):
1✔
1611
        output = {
1✔
1612
            "name": self.__class__.__name__,
1613
            "ownedRelationship": self.relationship.get_definition(),
1614
        }
1615
        return output
1✔
1616

1617

1618
class FeatureReferenceExpression:
1✔
1619
    def __init__(self, definition):
1✔
1620
        if valid_definition(definition, self.__class__.__name__):
1✔
1621
            self.children = []
1✔
1622
            for relationship in definition["ownedRelationship"]:
1✔
1623
                self.children.append(FeatureReferenceMember(relationship))
1✔
1624

1625
    def dump(self):
1✔
1626
        return "".join([child.dump() for child in self.children])
1✔
1627

1628
    def get_definition(self):
1✔
1629
        output = {
1✔
1630
            "name": self.__class__.__name__,
1631
            "ownedRelationship": [],
1632
        }
1633
        for child in self.children:
1✔
1634
            output["ownedRelationship"].append(child.get_definition())
1✔
1635
        return output
1✔
1636

1637

1638
class FeatureReferenceMember:
1✔
1639
    def __init__(self, definition):
1✔
1640
        if valid_definition(definition, self.__class__.__name__):
1✔
1641
            self.memberElement = QualifiedName(definition["memberElement"])
1✔
1642

1643
    def dump(self):
1✔
1644
        return self.memberElement.dump()
1✔
1645

1646
    def get_definition(self):
1✔
1647
        output = {
1✔
1648
            "name": self.__class__.__name__,
1649
            "memberElement": self.memberElement.get_definition(),
1650
        }
1651
        return output
1✔
1652

1653

1654
class OccurrenceUsageElement:
1✔
1655
    def __init__(self, definition):
1✔
1656
        if valid_definition(definition, "OccurrenceUsageElement"):
1✔
1657
            if definition["ownedRelatedElement"]["name"] == "StructureUsageElement":
1✔
1658
                self.children = StructureUsageElement(definition["ownedRelatedElement"])
1✔
1659
            else:
1660
                raise NotImplementedError
×
1661

1662
    def dump(self):
1✔
1663
        return self.children.dump()
1✔
1664

1665
    def get_definition(self):
1✔
1666
        return {
1✔
1667
            "name": self.__class__.__name__,
1668
            "ownedRelatedElement": self.children.get_definition(),
1669
        }
1670

1671

1672
class StructureUsageElement:
1✔
1673
    def __init__(self, definition):
1✔
1674
        if valid_definition(definition, "StructureUsageElement"):
1✔
1675
            if definition["ownedRelatedElement"]["name"] == "ItemUsage":
1✔
1676
                self.children = ItemUsage(definition["ownedRelatedElement"])
1✔
1677
            elif definition["ownedRelatedElement"]["name"] == "PartUsage":
1✔
1678
                self.children = PartUsage(definition["ownedRelatedElement"])
1✔
1679
            elif definition["ownedRelatedElement"]["name"] == "ConnectionUsage":
1✔
1680
                self.children = ConnectionUsage(definition["ownedRelatedElement"])
1✔
1681
            elif definition["ownedRelatedElement"]["name"] == "PortUsage":
1✔
1682
                self.children = PortUsage(definition["ownedRelatedElement"])
1✔
1683
            elif definition["ownedRelatedElement"]["name"] == "InterfaceUsage":
1✔
1684
                self.children = InterfaceUsage(definition["ownedRelatedElement"])
1✔
1685
            else:
1686
                raise NotImplementedError
×
1687

1688
    def dump(self):
1✔
1689
        return self.children.dump()
1✔
1690

1691
    def get_definition(self):
1✔
1692
        return {
1✔
1693
            "name": self.__class__.__name__,
1694
            "ownedRelatedElement": self.children.get_definition(),
1695
        }
1696

1697

1698
class InterfaceUsage:
1✔
1699
    def __init__(self, definition):
1✔
1700
        if valid_definition(definition, self.__class__.__name__):
1✔
1701
            self.prefix = None
1✔
1702
            self.keyword = "interface"
1✔
1703
            self.declaration = None
1✔
1704
            self.body = None
1✔
1705

1706
            if definition["prefix"] is not None:
1✔
1707
                self.prefix = OccurrenceUsagePrefix(definition["prefix"])
×
1708

1709
            if definition["declaration"] is not None:
1✔
1710
                self.declaration = InterfaceUsageDeclaration(definition["declaration"])
1✔
1711

1712
            if definition["body"] is not None:
1✔
1713
                self.body = InterfaceBody(definition["body"])
1✔
1714

1715
    def dump(self):
1✔
1716
        output = []
1✔
1717
        if self.prefix is not None:
1✔
1718
            output.append(self.prefix.dump())
×
1719
        output.append(self.keyword)
1✔
1720
        if self.declaration is not None:
1✔
1721
            output.append(self.declaration.dump())
1✔
1722
        if self.body is not None:
1✔
1723
            output.append(self.body.dump())
1✔
1724

1725
        return " ".join(output)
1✔
1726

1727

1728
class InterfaceUsageDeclaration:
1✔
1729
    def __init__(self, definition):
1✔
1730
        if valid_definition(definition, self.__class__.__name__):
1✔
1731
            self.declaration = None
1✔
1732
            self.keyword = None
1✔
1733
            self.part = None
1✔
1734

1735
            if definition["declaration"] is not None:
1✔
1736
                self.declaration = UsageDeclaration(definition["declaration"])
1✔
1737

1738
            if definition["part1"] is not None:
1✔
1739
                self.part = InterfacePart(definition["part1"])
1✔
1740
                # The connect usage was optional and it was used here.
1741
                self.keyword = "connect\n"
1✔
1742
            elif definition["part2"] is not None:
×
1743
                self.part = InterfacePart(definition["part2"])
×
1744

1745
    def dump(self):
1✔
1746
        output = []
1✔
1747
        if self.declaration is not None:
1✔
1748
            output.append(self.declaration.dump())
1✔
1749

1750
        if self.keyword is not None:
1✔
1751
            output.append(self.keyword)
1✔
1752

1753
        if self.part is not None:
1✔
1754
            output.append(self.part.dump())
1✔
1755

1756
        return " ".join(output)
1✔
1757

1758

1759
class InterfacePart:
1✔
1760
    def __init__(self, definition):
1✔
1761
        if valid_definition(definition, self.__class__.__name__):
1✔
1762
            if definition["binarypart"] is not None:
1✔
1763
                self.children = BinaryInterfacePart(definition["binarypart"])
1✔
1764
            elif definition["narypart"] is not None:
×
1765
                raise NotImplementedError
×
1766
            else:
1767
                raise NotImplementedError
×
1768

1769
    def dump(self):
1✔
1770
        return self.children.dump()
1✔
1771

1772

1773
class BinaryInterfacePart:
1✔
1774
    def __init__(self, definition):
1✔
1775
        if valid_definition(definition, self.__class__.__name__):
1✔
1776
            self.children = []
1✔
1777
            for relationship in definition["ownedRelationship"]:
1✔
1778
                self.children.append(InterfaceEndMember(relationship))
1✔
1779

1780
    def dump(self):
1✔
1781
        # Assume this is only ever 2 long
1782
        if len(self.children) > 2:
1✔
1783
            raise NotImplementedError
×
1784

1785
        return self.children[0].dump() + " to " + self.children[1].dump()
1✔
1786

1787

1788
class InterfaceEndMember:
1✔
1789
    def __init__(self, definition):
1✔
1790
        if valid_definition(definition, self.__class__.__name__):
1✔
1791
            self.child = InterfaceEnd(definition["ownedRelatedElement"])
1✔
1792

1793
    def dump(self):
1✔
1794
        return self.child.dump()
1✔
1795

1796

1797
class InterfaceEnd:
1✔
1798
    def __init__(self, definition):
1✔
1799
        if valid_definition(definition, self.__class__.__name__):
1✔
1800
            if definition["declaredName"] is not None:
1✔
1801
                self.name = definition["declaredName"]
1✔
1802
                self.keyword = "::>"
1✔
1803
            else:
1804
                self.name = None
×
1805

1806
            self.relationships = []
1✔
1807
            for relationship in definition["ownedRelationship"]:
1✔
1808
                if relationship["name"] == "OwnedReferenceSubsetting":
1✔
1809
                    self.relationships.append(OwnedReferenceSubsetting(relationship))
1✔
1810
                elif relationship["name"] == "OwnedMultiplicity":
×
1811
                    self.relationships.append(OwnedMultiplicity(relationship))
×
1812
                else:
1813
                    return NotImplementedError
×
1814

1815
    def dump(self):
1✔
1816
        output = []
1✔
1817
        if self.name is not None:
1✔
1818
            output.append(self.name)
1✔
1819
            output.append(self.keyword)
1✔
1820

1821
        for relationship in self.relationships:
1✔
1822
            output.append(relationship.dump())
1✔
1823

1824
        return " ".join(output)
1✔
1825

1826

1827
class PortUsage:
1✔
1828
    def __init__(self, definition=None):
1✔
1829
        self.keyword = "port"
1✔
1830
        if definition is not None:
1✔
1831
            if valid_definition(definition, self.__class__.__name__):
1✔
1832
                self.prefix = None
1✔
1833
                self.usage = None
1✔
1834

1835
                if definition["prefix"] is not None:
1✔
1836
                    self.prefix = OccurrenceUsagePrefix(definition["prefix"])
×
1837

1838
                if definition["usage"] is not None:
1✔
1839
                    self.usage = Usage(definition["usage"])
1✔
1840
        else:
1841
            self.prefix = None
1✔
1842
            self.usage = Usage()
1✔
1843

1844
    def dump(self):
1✔
1845
        output = []
1✔
1846
        if self.prefix is not None:
1✔
1847
            output.append(self.prefix.dump())
×
1848

1849
        output.append(self.keyword)
1✔
1850

1851
        if self.usage is not None:
1✔
1852
            output.append(self.usage.dump())
1✔
1853

1854
        return " ".join(output)
1✔
1855

1856
    def get_definition(self):
1✔
1857
        output = {"name": self.__class__.__name__, "prefix": None}
1✔
1858
        if self.prefix is not None:
1✔
1859
            output["prefix"] = self.prefix.get_definition()
×
1860

1861
        output["usage"] = self.usage.get_definition()
1✔
1862

1863
        return output
1✔
1864

1865

1866
class ConnectionUsage:
1✔
1867
    def __init__(self, definition):
1✔
1868
        if valid_definition(definition, self.__class__.__name__):
1✔
1869
            self.prefix = None
1✔
1870
            if definition["prefix"] is not None:
1✔
1871
                self.prefix = OccurrenceUsagePrefix(definition["prefix"])
×
1872

1873
            self.declaration = None
1✔
1874
            if definition["declaration"] is not None:
1✔
1875
                self.declaration = UsageDeclaration(definition["declaration"])
1✔
1876

1877
            self.keyword = "connection"
1✔
1878
            self.keyword2 = "connect\n"
1✔
1879

1880
            self.part = None
1✔
1881
            if definition["part"] is not None:
1✔
1882
                self.part = ConnectorPart(definition["part"])
1✔
1883

1884
            self.body = UsageBody(definition["body"])
1✔
1885

1886
    def dump(self):
1✔
1887
        output = []
1✔
1888
        if self.prefix is not None:
1✔
1889
            output.append(self.prefix.dump())
×
1890

1891
        if self.declaration is not None:
1✔
1892
            output.append(self.keyword)
1✔
1893
            output.append(self.declaration.dump())
1✔
1894

1895
        if self.part is not None:
1✔
1896
            output.append(self.keyword2)
1✔
1897
            output.append(self.part.dump())
1✔
1898

1899
        output.append(self.body.dump())
1✔
1900

1901
        return " ".join(output)
1✔
1902

1903

1904
class ConnectorPart:
1✔
1905
    def __init__(self, definition):
1✔
1906
        if valid_definition(definition, self.__class__.__name__):
1✔
1907
            if definition["part"]["name"] == "BinaryConnectorPart":
1✔
1908
                self.part = BinaryConnectorPart(definition["part"])
1✔
1909
            else:
1910
                raise NotImplementedError
×
1911

1912
    def dump(self):
1✔
1913
        return self.part.dump()
1✔
1914

1915

1916
class BinaryConnectorPart:
1✔
1917
    def __init__(self, definition):
1✔
1918
        if valid_definition(definition, self.__class__.__name__):
1✔
1919
            self.children = []
1✔
1920
            for relationship in definition["ownedRelationship"]:
1✔
1921
                self.children.append(ConnectorEndMember(relationship))
1✔
1922

1923
    def dump(self):
1✔
1924
        return " to ".join([child.dump() for child in self.children])
1✔
1925

1926

1927
class ConnectorEndMember:
1✔
1928
    def __init__(self, definition):
1✔
1929
        if valid_definition(definition, self.__class__.__name__):
1✔
1930
            self.children = []
1✔
1931
            for element in definition["ownedRelatedElement"]:
1✔
1932
                self.children.append(ConnectorEnd(element))
1✔
1933

1934
    def dump(self):
1✔
1935
        return "".join([child.dump() for child in self.children])
1✔
1936

1937

1938
class ConnectorEnd:
1✔
1939
    def __init__(self, definition):
1✔
1940
        if valid_definition(definition, self.__class__.__name__):
1✔
1941
            self.declaredName = None
1✔
1942
            if definition["declaredName"] is not None:
1✔
1943
                self.declaredName = definition["declaredName"]
1✔
1944

1945
            self.children = []
1✔
1946
            for relationship in definition["ownedRelationship"]:
1✔
1947
                if relationship["name"] == "OwnedReferenceSubsetting":
1✔
1948
                    self.children.append(OwnedReferenceSubsetting(relationship))
1✔
1949
                else:
1950
                    self.children.append(OwnedMultiplicity(relationship))
1✔
1951

1952
    def dump(self):
1✔
1953
        output = []
1✔
1954
        if self.declaredName is not None:
1✔
1955
            output.append(self.declaredName)
1✔
1956
            output.append("references")
1✔
1957

1958
        for child in self.children:
1✔
1959
            output.append(child.dump())
1✔
1960

1961
        return " ".join(output)
1✔
1962

1963

1964
class OwnedReferenceSubsetting:
1✔
1965
    def __init__(self, definition):
1✔
1966
        if valid_definition(definition, self.__class__.__name__):
1✔
1967
            self.referencedFeature = None
1✔
1968
            if definition["referencedFeature"] is not None:
1✔
1969
                self.referencedFeature = QualifiedName(definition["referencedFeature"])
1✔
1970

1971
            self.elements = []
1✔
1972
            for element in definition["ownedRelatedElement"]:
1✔
1973
                self.elements.append(OwnedFeatureChain(element))
1✔
1974

1975
    def dump(self):
1✔
1976
        if self.referencedFeature is not None:
1✔
1977
            return self.referencedFeature.dump()
1✔
1978
        else:
1979
            return "".join([child.dump() for child in self.elements])
1✔
1980

1981

1982
class AttributeUsage:
1✔
1983
    def __init__(self, definition=None):
1✔
1984
        self.keyword = "attribute"
1✔
1985
        if definition is not None:
1✔
1986
            if valid_definition(definition, self.__class__.__name__):
1✔
1987
                if definition["prefix"] is not None:
1✔
1988
                    raise NotImplementedError
×
1989
                else:
1990
                    self.prefix = None
1✔
1991
                self.usage = Usage(definition["usage"])
1✔
1992
        else:
1993
            self.prefix = None
1✔
1994
            self.usage = Usage()
1✔
1995

1996
    def dump(self):
1✔
1997
        return self.keyword + " " + self.usage.dump()
1✔
1998

1999
    def get_definition(self):
1✔
2000
        output = {"name": self.__class__.__name__, "prefix": None}
1✔
2001
        if self.prefix is not None:
1✔
2002
            output["prefix"] = self.prefix.get_definition()
×
2003

2004
        output["usage"] = self.usage.get_definition()
1✔
2005

2006
        return output
1✔
2007

2008

2009
class PartUsage:
1✔
2010
    def __init__(self, definition=None):
1✔
2011
        if definition is not None:
1✔
2012
            if valid_definition(definition, "PartUsage"):
1✔
2013
                if definition["prefix"] is not None:
1✔
2014
                    self.prefix = OccurrenceUsagePrefix(definition["prefix"])
1✔
2015
                else:
2016
                    self.prefix = None
1✔
2017

2018
                self.keyword = "part"
1✔
2019
                self.usage = Usage(definition["usage"])
1✔
2020
        else:
2021
            self.prefix = None
1✔
2022
            self.keyword = "part"
1✔
2023
            self.usage = Usage()
1✔
2024

2025
    def dump(self):
1✔
2026
        output = []
1✔
2027
        if self.prefix is not None:
1✔
2028
            output.append(self.prefix.dump())
1✔
2029

2030
        output.append(self.keyword)
1✔
2031
        output.append(self.usage.dump())
1✔
2032
        return " ".join(output)
1✔
2033

2034
    def get_definition(self):
1✔
2035
        pre = None
1✔
2036
        if self.prefix is not None:
1✔
2037
            pre = self.prefix.get_definition()
×
2038

2039
        u = None
1✔
2040
        if self.usage is not None:
1✔
2041
            u = self.usage.get_definition()
1✔
2042

2043
        return {"name": self.__class__.__name__, "prefix": pre, "usage": u}
1✔
2044

2045

2046
class OccurrenceUsagePrefix:
1✔
2047
    def __init__(self, definition):
1✔
2048
        if valid_definition(definition, "OccurrenceUsagePrefix"):
1✔
2049
            self.prefix = BasicUsagePrefix(definition["prefix"])
1✔
2050
            self.isIndividual = definition["isIndividual"]
1✔
2051
            if definition["portionKind"] is not None:
1✔
2052
                self.portionKind = PortionKind(definition["portionKind"])
×
2053
            else:
2054
                self.portionKind = None
1✔
2055

2056
            if len(definition["usageExtension"]) > 0:
1✔
2057
                raise NotImplementedError
×
2058

2059
    def dump(self):
1✔
2060
        output = []
1✔
2061
        output.append(self.prefix.dump())
1✔
2062
        if self.isIndividual:
1✔
2063
            output.append("individual")
×
2064

2065
        if self.portionKind is not None:
1✔
2066
            output.append(self.portionKind.dump())
×
2067

2068
        return " ".join(output)
1✔
2069

2070

2071
class PortionKind:
1✔
2072
    def __init__(self, definition):
1✔
2073
        if valid_definition(definition, "PortionKind"):
×
2074
            raise NotImplementedError
×
2075

2076
    def dump(self):
1✔
2077
        raise NotImplementedError
×
2078

2079

2080
class BasicUsagePrefix:
1✔
2081
    def __init__(self, definition):
1✔
2082
        if valid_definition(definition, "BasicUsagePrefix"):
1✔
2083
            if definition["prefix"] is not None:
1✔
2084
                self.prefix = RefPrefix(definition["prefix"])
1✔
2085
            else:
2086
                # This happens when nothing was found in RefPrefix.
2087
                self.prefix = None
1✔
2088
            self.isReference = definition["isReference"]
1✔
2089

2090
    def dump(self):
1✔
2091
        output = []
1✔
2092
        if self.prefix is not None:
1✔
2093
            output.append(self.prefix.dump())
1✔
2094

2095
        if self.isReference:
1✔
2096
            output.append("ref")
1✔
2097

2098
        return " ".join(output)
1✔
2099

2100

2101
class RefPrefix:
1✔
2102
    def __init__(self, definition=None):
1✔
2103
        self.direction = None
1✔
2104
        if definition is not None:
1✔
2105
            if valid_definition(definition, self.__class__.__name__):
1✔
2106
                if definition["direction"] is not None:
1✔
2107
                    self.direction = FeatureDirection(definition["direction"])
1✔
2108

2109
                self.isAbstract = definition["isAbstract"]
1✔
2110
                self.isVariation = definition["isVariation"]
1✔
2111
                self.isReadOnly = definition["isReadOnly"]
1✔
2112
                self.isDerived = definition["isDerived"]
1✔
2113
                self.isEnd = definition["isEnd"]
1✔
2114

2115
        else:
2116
            self.direction = FeatureDirection()
1✔
2117
            self.isAbstract = False
1✔
2118
            self.isVariation = False
1✔
2119
            self.isReadOnly = False
1✔
2120
            self.isDerived = False
1✔
2121
            self.isEnd = False
1✔
2122

2123
    def dump(self):
1✔
2124
        output = []
1✔
2125
        if self.direction is not None:
1✔
2126
            direction = self.direction.dump()
1✔
2127
            if not direction == "":
1✔
2128
                output.append(direction)
1✔
2129

2130
        if self.isAbstract:
1✔
2131
            output.append("abstract")
×
2132
        elif self.isVariation:
1✔
2133
            output.append("variation")
×
2134

2135
        if self.isReadOnly:
1✔
2136
            output.append("readonly")
×
2137

2138
        if self.isDerived:
1✔
2139
            output.append("derived")
×
2140

2141
        if self.isEnd:
1✔
2142
            output.append("end")
1✔
2143

2144
        return " ".join(output)
1✔
2145

2146
    def get_definition(self):
1✔
2147
        output = {"name": self.__class__.__name__}
1✔
2148
        output["isAbstract"] = self.isAbstract
1✔
2149
        output["isVariation"] = self.isVariation
1✔
2150
        output["isReadOnly"] = self.isReadOnly
1✔
2151
        output["isDerived"] = self.isDerived
1✔
2152
        output["isEnd"] = self.isEnd
1✔
2153
        output["direction"] = self.direction.get_definition()
1✔
2154
        return output
1✔
2155

2156

2157
class FeatureDirection:
1✔
2158
    def __init__(self, definition=None):
1✔
2159
        if definition is not None:
1✔
2160
            if valid_definition(definition, self.__class__.__name__):
1✔
2161
                self.isIn = definition["in"] == "in "
1✔
2162
                self.isOut = definition["out"] == "out"
1✔
2163
                self.isInOut = definition["inout"] == "inout"
1✔
2164
        else:
2165
            self.isIn = False
1✔
2166
            self.isOut = False
1✔
2167
            self.isInOut = False
1✔
2168

2169
    def dump(self):
1✔
2170
        if self.isInOut:
1✔
2171
            return "inout"
1✔
2172
        elif self.isIn:
1✔
2173
            return "in"
1✔
2174
        elif self.isOut:
1✔
2175
            return "out"
1✔
2176
        else:
2177
            return ""
×
2178

2179
    def get_definition(self):
1✔
2180
        output = {"name": self.__class__.__name__, "in": "", "out": "", "inout": ""}
1✔
2181
        if self.isIn:
1✔
2182
            output["in"] = "in "
1✔
2183

2184
        if self.isOut:
1✔
2185
            output["out"] = "out"
1✔
2186

2187
        if self.isInOut:
1✔
2188
            output["inout"] = "inout"
1✔
2189
        return output
1✔
2190

2191

2192
class ItemUsage:
1✔
2193
    def __init__(self, definition=None):
1✔
2194
        if definition is not None:
1✔
2195
            if valid_definition(definition, "ItemUsage"):
1✔
2196
                self.prefix = None
1✔
2197
                if definition["prefix"] is not None:
1✔
2198
                    self.prefix = OccurrenceUsagePrefix(definition["prefix"])
1✔
2199
                self.keyword = "item"
1✔
2200
                self.usage = Usage(definition["usage"])
1✔
2201
        else:
2202
            # Create an empty item
2203
            self.prefix = None
1✔
2204
            self.keyword = "item"
1✔
2205
            self.usage = Usage()
1✔
2206

2207
    def dump(self):
1✔
2208
        output = []
1✔
2209
        if self.prefix is not None:
1✔
2210
            output.append(self.prefix.dump())
1✔
2211
        output.append(self.keyword)
1✔
2212
        output.append(self.usage.dump())
1✔
2213
        return " ".join(output)
1✔
2214

2215
    def get_definition(self):
1✔
2216
        output = {}
1✔
2217
        output["name"] = self.__class__.__name__
1✔
2218
        if self.prefix is not None:
1✔
2219
            output["prefix"] = self.prefix.get_definition()
×
2220
        else:
2221
            output["prefix"] = None
1✔
2222
        output["usage"] = self.usage.get_definition()
1✔
2223
        return output
1✔
2224

2225

2226
class Usage:
1✔
2227
    def __init__(self, definition=None):
1✔
2228
        if definition is not None:
1✔
2229
            if valid_definition(definition, "Usage"):
1✔
2230
                self.declaration = UsageDeclaration(definition["declaration"])
1✔
2231
                self.completion = UsageCompletion(definition["completion"])
1✔
2232
        else:
2233
            self.declaration = UsageDeclaration()
1✔
2234
            self.completion = UsageCompletion()
1✔
2235

2236
    def dump(self):
1✔
2237
        return "".join([self.declaration.dump(), self.completion.dump()])
1✔
2238

2239
    def get_definition(self):
1✔
2240
        output = {}
1✔
2241
        output["name"] = self.__class__.__name__
1✔
2242
        output["declaration"] = self.declaration.get_definition()
1✔
2243
        output["completion"] = self.completion.get_definition()
1✔
2244
        return output
1✔
2245

2246

2247
class UsageDeclaration:
1✔
2248
    def __init__(self, definition=None):
1✔
2249
        if definition is not None:
1✔
2250
            if valid_definition(definition, "UsageDeclaration"):
1✔
2251
                self.declaration = FeatureDeclaration(definition["declaration"])
1✔
2252
        else:
2253
            self.declaration = FeatureDeclaration()
1✔
2254

2255
    def dump(self):
1✔
2256
        return self.declaration.dump()
1✔
2257

2258
    def get_definition(self):
1✔
2259
        return {
1✔
2260
            "name": self.__class__.__name__,
2261
            "declaration": self.declaration.get_definition(),
2262
        }
2263

2264

2265
class FeatureDeclaration:
1✔
2266
    def __init__(self, definition=None):
1✔
2267
        if definition is not None:
1✔
2268
            if valid_definition(definition, "FeatureDeclaration"):
1✔
2269
                if definition["identification"] is not None:
1✔
2270
                    self.identification = Identification(definition["identification"])
1✔
2271
                else:
2272
                    self.identification = None
1✔
2273

2274
                if definition["specialization"] is not None:
1✔
2275
                    self.specialization = FeatureSpecializationPart(
1✔
2276
                        definition["specialization"]
2277
                    )
2278
                else:
2279
                    self.specialization = None
1✔
2280
        else:
2281
            self.identification = None
1✔
2282
            self.specialization = None
1✔
2283

2284
    def dump(self):
1✔
2285
        output = []
1✔
2286
        if self.identification is not None:
1✔
2287
            output.append(self.identification.dump())
1✔
2288

2289
        if self.specialization is not None:
1✔
2290
            output.append(self.specialization.dump())
1✔
2291

2292
        return "".join(output)
1✔
2293

2294
    def get_definition(self):
1✔
2295
        iden = None
1✔
2296
        spec = None
1✔
2297
        if self.identification is not None:
1✔
2298
            iden = self.identification.get_definition()
1✔
2299

2300
        if self.specialization is not None:
1✔
2301
            spec = self.specialization.get_definition()
1✔
2302

2303
        return {
1✔
2304
            "name": self.__class__.__name__,
2305
            "identification": iden,
2306
            "specialization": spec,
2307
        }
2308

2309

2310
class FeatureSpecializationPart:
1✔
2311
    def __init__(self, definition=None):
1✔
2312
        if definition is not None:
1✔
2313
            if valid_definition(definition, "FeatureSpecializationPart"):
1✔
2314
                if definition["multiplicity"] is not None:
1✔
2315
                    # We found the set where one specialization came first
2316
                    # ( specialization+=FeatureSpecialization )+
2317
                    #    multiplicity=MultiplicityPart?
2318
                    #    specialization2+=FeatureSpecialization*
2319
                    self.multiplicity = MultiplicityPart(definition["multiplicity"])
1✔
2320
                elif definition["multiplicity2"] is not None:
1✔
2321
                    # We found the set where the multiplicity came first
2322
                    # multiplicity2=MultiplicityPart specialization+=FeatureSpecialization*
2323
                    self.multiplicity = MultiplicityPart(definition["multiplicity2"])
×
2324
                else:
2325
                    # We found the case where none were specified
2326
                    self.multiplicity = None
1✔
2327

2328
                self.specializations = []
1✔
2329
                for specialization in definition["specialization"]:
1✔
2330
                    self.specializations.append(FeatureSpecialization(specialization))
1✔
2331

2332
                self.specializations2 = []
1✔
2333
                if definition["specialization2"] is not None:
1✔
2334
                    for specialization in definition["specialization2"]:
1✔
2335
                        self.specializations2.append(
1✔
2336
                            FeatureSpecialization(specialization)
2337
                        )
2338
        else:
2339
            self.multiplicity = None
×
2340
            self.specializations = []
×
2341
            self.specializations2 = []
×
2342

2343
    def dump(self):
1✔
2344
        if len(self.specializations2) > 0:
1✔
2345
            # Multiplicity in between
2346
            output = [child.dump() for child in self.specializations]
1✔
2347
            if self.multiplicity is not None:
1✔
2348
                output.append(self.multiplicity.dump())
1✔
2349

2350
            for child in self.specializations2:
1✔
2351
                output.append(child.dump())
1✔
2352

2353
        elif len(self.specializations) == 1 and self.multiplicity is not None:
1✔
2354
            # Case 1 - modified for the case where specializations2 would be empty
2355
            output = [child.dump() for child in self.specializations]
1✔
2356
            output.append(self.multiplicity.dump())
1✔
2357

2358
        else:
2359
            # Multiplicity at start or no multiplicity found
2360
            output = []
1✔
2361
            if self.multiplicity is not None:
1✔
2362
                output.append(self.multiplicity.dump())
×
2363

2364
            for child in self.specializations:
1✔
2365
                output.append(child.dump())
1✔
2366

2367
        return "".join(output)
1✔
2368

2369
    def get_definition(self):
1✔
2370
        output = {
1✔
2371
            "name": self.__class__.__name__,
2372
            "multiplicity": None,
2373
            "multiplicity2": None,  # This is never used in this fashion.
2374
            "specialization": [],
2375
            "specialization2": [],
2376
        }
2377

2378
        if self.multiplicity is not None:
1✔
2379
            output["multiplicity"].get_definition()
×
2380

2381
        if len(self.specializations) > 0:
1✔
2382
            for child in self.specializations:
1✔
2383
                output["specialization"].append(child.get_definition())
1✔
2384

2385
        if len(self.specializations2) > 0:
1✔
2386
            for child in self.specializations2:
×
2387
                output["specialization2"].append(child.get_definition())
×
2388

2389
        return output
1✔
2390

2391

2392
class MultiplicityPart:
1✔
2393
    def __init__(self, definition):
1✔
2394
        if valid_definition(definition, "MultiplicityPart"):
1✔
2395
            self.isOrdered = definition["isOrdered"]
1✔
2396
            self.isNonunique = definition["isNonunique"]
1✔
2397
            self.isOrdered2 = definition["isOrdered"]
1✔
2398
            self.isNonunique2 = definition["isNonunique"]
1✔
2399

2400
            self.children = []
1✔
2401
            for relationship in definition["ownedRelationship"]:
1✔
2402
                self.children.append(OwnedMultiplicity(relationship))
1✔
2403

2404
    def dump(self):
1✔
2405
        output = [child.dump() for child in self.children]
1✔
2406

2407
        if self.isOrdered and not self.isOrdered2:
1✔
2408
            output.append("ordered")
×
2409

2410
        if self.isNonunique or self.isNonunique2:
1✔
2411
            output.append("nonunique")
×
2412

2413
        if self.isOrdered2 and not self.isOrdered:
1✔
2414
            output.append("ordered")
×
2415

2416
        return " ".join(output)
1✔
2417

2418

2419
class OwnedMultiplicity:
1✔
2420
    def __init__(self, definition):
1✔
2421
        if valid_definition(definition, "OwnedMultiplicity"):
1✔
2422
            self.children = []
1✔
2423
            for element in definition["ownedRelatedElement"]:
1✔
2424
                self.children.append(MultiplicityRange(element))
1✔
2425

2426
    def dump(self):
1✔
2427
        output = [child.dump() for child in self.children]
1✔
2428
        return "".join(output)
1✔
2429

2430

2431
class MultiplicityRange:
1✔
2432
    def __init__(self, definition):
1✔
2433
        if valid_definition(definition, "MultiplicityRange"):
1✔
2434
            self.children = []
1✔
2435
            for relationship in definition["ownedRelationship"]:
1✔
2436
                self.children.append(MultiplicityExpressionMember(relationship))
1✔
2437

2438
    def dump(self):
1✔
2439
        output = [child.dump() for child in self.children]
1✔
2440
        return "[" + "..".join(output) + "]"
1✔
2441

2442

2443
class MultiplicityExpressionMember:
1✔
2444
    def __init__(self, definition):
1✔
2445
        if valid_definition(definition, "MultiplicityExpressionMember"):
1✔
2446
            self.children = []
1✔
2447
            for element in definition["ownedRelatedElement"]:
1✔
2448
                self.children.append(MultiplicityRelatedElement(element))
1✔
2449

2450
    def dump(self):
1✔
2451
        return "".join([child.dump() for child in self.children])
1✔
2452

2453

2454
class MultiplicityRelatedElement:
1✔
2455
    def __init__(self, definition):
1✔
2456
        if valid_definition(definition, "MultiplicityRelatedElement"):
1✔
2457
            if "name" in definition["ownedRelatedElement"]:
1✔
2458
                if definition["ownedRelatedElement"]["name"] == "LiteralInteger":
1✔
2459
                    self.element = LiteralInteger(definition["ownedRelatedElement"])
1✔
2460
                elif definition["ownedRelatedElement"]["name"] == "LiteralInfinity":
1✔
2461
                    self.element = LiteralInfinity(definition["ownedRelatedElement"])
1✔
2462
                else:
2463
                    raise NotImplementedError
×
2464

2465
    def dump(self):
1✔
2466
        return str(self.element.dump())
1✔
2467

2468

2469
class LiteralString:
1✔
2470
    def __init__(self, definition):
1✔
2471
        if valid_definition(definition, self.__class__.__name__):
1✔
2472
            self.element = definition["value"]
1✔
2473

2474
    def dump(self):
1✔
2475
        return self.element
1✔
2476

2477

2478
class LiteralInteger:
1✔
2479
    def __init__(self, definition):
1✔
2480
        if valid_definition(definition, "LiteralInteger"):
1✔
2481
            self.element = definition["value"]
1✔
2482

2483
    def dump(self):
1✔
2484
        return self.element
1✔
2485

2486
    def get_definition(self):
1✔
2487
        return {"name": self.__class__.__name__, "value": self.element}
1✔
2488

2489

2490
class LiteralReal:
1✔
2491
    def __init__(self, definition):
1✔
2492
        if valid_definition(definition, self.__class__.__name__):
1✔
2493
            self.element = definition["value"]
1✔
2494

2495
    def dump(self):
1✔
2496
        return self.element
1✔
2497

2498

2499
class LiteralInfinity:
1✔
2500
    def __init__(self, definition):
1✔
2501
        if valid_definition(definition, self.__class__.__name__):
1✔
2502
            self.element = "*"
1✔
2503

2504
    def dump(self):
1✔
2505
        return self.element
1✔
2506

2507

2508
class FeatureSpecialization:
1✔
2509
    def __init__(self, definition):
1✔
2510
        if valid_definition(definition, "FeatureSpecialization"):
1✔
2511
            if definition["ownedRelationship"]["name"] == "Typings":
1✔
2512
                self.relationship = Typings(definition["ownedRelationship"])
1✔
2513
            elif definition["ownedRelationship"]["name"] == "Subsettings":
1✔
2514
                self.relationship = Subsettings(definition["ownedRelationship"])
1✔
2515
            elif definition["ownedRelationship"]["name"] == "References":
1✔
2516
                raise NotImplementedError
×
2517
            elif definition["ownedRelationship"]["name"] == "Redefinitions":
1✔
2518
                self.relationship = Redefinitions(definition["ownedRelationship"])
1✔
2519
            else:
2520
                raise NotImplementedError
×
2521

2522
    def dump(self):
1✔
2523
        return self.relationship.dump()
1✔
2524

2525
    def get_definition(self):
1✔
2526
        output = {
1✔
2527
            "name": self.__class__.__name__,
2528
            "ownedRelationship": self.relationship.get_definition(),
2529
        }
2530
        return output
1✔
2531

2532

2533
class Redefinitions:
1✔
2534
    def __init__(self, definition):
1✔
2535
        if valid_definition(definition, "Redefinitions"):
1✔
2536
            if len(definition["ownedRelationship"]) > 0:
1✔
2537
                raise NotImplementedError
×
2538

2539
            self.children = Redefines(definition["redefines"])
1✔
2540

2541
    def dump(self):
1✔
2542
        return self.children.dump()
1✔
2543

2544

2545
class Redefines:
1✔
2546
    def __init__(self, definition):
1✔
2547
        if valid_definition(definition, "Redefines"):
1✔
2548
            self.keyword = " :>>"
1✔
2549
            self.children = []
1✔
2550
            for relationship in definition["ownedRelationship"]:
1✔
2551
                self.children.append(OwnedRedefinition(relationship))
1✔
2552

2553
    def dump(self):
1✔
2554
        output = [child.dump() for child in self.children]
1✔
2555
        output.insert(0, self.keyword)
1✔
2556
        return " ".join(output)
1✔
2557

2558

2559
class OwnedRedefinition:
1✔
2560
    def __init__(self, definition):
1✔
2561
        if valid_definition(definition, "OwnedRedefinition"):
1✔
2562
            if len(definition["ownedRelatedElement"]) > 0:
1✔
2563
                raise NotImplementedError
×
2564

2565
            self.redefinedFeature = QualifiedName(definition["redefinedFeature"])
1✔
2566

2567
    def dump(self):
1✔
2568
        return self.redefinedFeature.dump()
1✔
2569

2570

2571
class Subsettings:
1✔
2572
    def __init__(self, definition):
1✔
2573
        if valid_definition(definition, "Subsettings"):
1✔
2574
            # Subsets ( ',' ownedRelationship += OwnedSubsetting )*
2575
            self.keyword = ":>"
1✔
2576
            if len(definition["ownedRelationship"]) > 0:
1✔
2577
                self.children = []
1✔
2578
                for relationship in definition["ownedRelationship"]:
1✔
2579
                    self.children.append(OwnedSubsetting(relationship))
1✔
2580
            else:
2581
                raise NotImplementedError
×
2582

2583
    def dump(self):
1✔
2584
        return self.keyword + ", ".join([child.dump() for child in self.children])
1✔
2585

2586

2587
class OwnedSubsetting:
1✔
2588
    def __init__(self, definition):
1✔
2589
        if valid_definition(definition, "OwnedSubsetting"):
1✔
2590
            # subsettedFeature = QualifiedName | ownedRelatedElement += OwnedFeatureChain
2591
            if definition["subsettedFeature"] is not None:
1✔
2592
                self.elements = [QualifiedName(definition["subsettedFeature"])]
1✔
2593
            else:
2594
                self.elements = []
×
2595
                for element in definition["ownedRelatedElement"]:
×
2596
                    self.elements.append(OwnedFeatureChain(element))
×
2597

2598
    def dump(self):
1✔
2599
        return " ".join([child.dump() for child in self.elements])
1✔
2600

2601

2602
class OwnedFeatureChain:
1✔
2603
    def __init__(self, definition):
1✔
2604
        if valid_definition(definition, self.__class__.__name__):
1✔
2605
            self.feature = FeatureChain(definition["feature"])
1✔
2606

2607
    def dump(self):
1✔
2608
        return self.feature.dump()
1✔
2609

2610

2611
class FeatureChain:
1✔
2612
    def __init__(self, definition):
1✔
2613
        if valid_definition(definition, self.__class__.__name__):
1✔
2614
            self.children = []
1✔
2615
            for relationship in definition["ownedRelationship"]:
1✔
2616
                self.children.append(OwnedFeatureChaining(relationship))
1✔
2617

2618
    def dump(self):
1✔
2619
        return ".".join([child.dump() for child in self.children])
1✔
2620

2621

2622
class OwnedFeatureChaining:
1✔
2623
    def __init__(self, definition):
1✔
2624
        if valid_definition(definition, self.__class__.__name__):
1✔
2625
            self.chainingFeature = QualifiedName(definition["chainingFeature"])
1✔
2626

2627
    def dump(self):
1✔
2628
        return self.chainingFeature.dump()
1✔
2629

2630

2631
class Typings:
1✔
2632
    def __init__(self, definition):
1✔
2633
        if valid_definition(definition, "Typings"):
1✔
2634
            if len(definition["ownedRelationship"]) > 0:
1✔
2635
                raise NotImplementedError
×
2636
            else:
2637
                self.relationships = []
1✔
2638

2639
            self.typing = TypedBy(definition["typedby"])
1✔
2640

2641
    def dump(self):
1✔
2642
        return self.typing.dump()
1✔
2643

2644
    def get_definition(self):
1✔
2645
        output = {
1✔
2646
            "name": self.__class__.__name__,
2647
            "ownedRelationship": self.relationships,
2648
            "typedby": self.typing.get_definition(),
2649
        }
2650
        return output
1✔
2651

2652

2653
class TypedBy:
1✔
2654
    def __init__(self, definition):
1✔
2655
        if valid_definition(definition, "TypedBy"):
1✔
2656
            self.keyword = " : "
1✔
2657

2658
            self.relationships = []
1✔
2659
            for relationship in definition["ownedRelationship"]:
1✔
2660
                if "FeatureTyping" == relationship["name"]:
1✔
2661
                    self.relationships.append(FeatureTyping(relationship))
1✔
2662
                else:
2663
                    raise NotImplementedError
×
2664

2665
    def dump(self):
1✔
2666
        output = []
1✔
2667
        for relationship in self.relationships:
1✔
2668
            output.append(relationship.dump())
1✔
2669
        return self.keyword + "".join(output)
1✔
2670

2671
    def get_definition(self):
1✔
2672
        output = {"name": self.__class__.__name__, "ownedRelationship": []}
1✔
2673
        for child in self.relationships:
1✔
2674
            output["ownedRelationship"].append(child.get_definition())
1✔
2675

2676
        return output
1✔
2677

2678

2679
class FeatureTyping:
1✔
2680
    def __init__(self, definition):
1✔
2681
        if valid_definition(definition, self.__class__.__name__):
1✔
2682
            if definition["ownedRelationship"]["name"] == "OwnedFeatureTyping":
1✔
2683
                self.relationship = OwnedFeatureTyping(definition["ownedRelationship"])
1✔
2684
            elif definition["ownedRelationship"]["name"] == "ConjugatedPortTyping":
1✔
2685
                self.relationship = ConjugatedPortTyping(
1✔
2686
                    definition["ownedRelationship"]
2687
                )
2688
            else:
2689
                raise NotImplementedError
×
2690

2691
    def dump(self):
1✔
2692
        return self.relationship.dump()
1✔
2693

2694
    def get_definition(self):
1✔
2695
        output = {
1✔
2696
            "name": self.__class__.__name__,
2697
            "ownedRelationship": self.relationship.get_definition(),
2698
        }
2699

2700
        return output
1✔
2701

2702

2703
class ConjugatedPortTyping:
1✔
2704
    def __init__(self, definition):
1✔
2705
        if valid_definition(definition, self.__class__.__name__):
1✔
2706
            self.keyword = "~"
1✔
2707
            # We skip a step in the grammar here.
2708
            self.name = QualifiedName(definition["conjugatedPortDefinition"])
1✔
2709

2710
    def dump(self):
1✔
2711
        return self.keyword + self.name.dump()
1✔
2712

2713

2714
class OwnedFeatureTyping:
1✔
2715
    def __init__(self, definition):
1✔
2716
        if valid_definition(definition, self.__class__.__name__):
1✔
2717
            if definition["type"]["name"] == "FeatureType":
1✔
2718
                self.type = FeatureType(definition["type"])
1✔
2719
            else:
2720
                raise NotImplementedError
×
2721

2722
    def dump(self):
1✔
2723
        return self.type.dump()
1✔
2724

2725
    def get_definition(self):
1✔
2726
        output = {"name": self.__class__.__name__, "type": self.type.get_definition()}
1✔
2727

2728
        return output
1✔
2729

2730

2731
class FeatureType:
1✔
2732
    def __init__(self, definition):
1✔
2733
        if valid_definition(definition, "FeatureType"):
1✔
2734
            if len(definition["ownedRelatedElement"]) > 0:
1✔
2735
                raise NotImplementedError
×
2736
            else:
2737
                self.type = QualifiedName(definition["type"])
1✔
2738

2739
    def dump(self):
1✔
2740
        return self.type.dump()
1✔
2741

2742
    def get_definition(self):
1✔
2743
        output = {
1✔
2744
            "name": self.__class__.__name__,
2745
            "ownedRelatedElement": [],
2746
            "type": self.type.get_definition(),
2747
        }
2748
        return output
1✔
2749

2750

2751
class UsageCompletion:
1✔
2752
    def __init__(self, definition=None):
1✔
2753
        if definition is not None:
1✔
2754
            if valid_definition(definition, "UsageCompletion"):
1✔
2755
                if definition["valuepart"] is None:
1✔
2756
                    self.valuepart = None
1✔
2757
                else:
2758
                    self.valuepart = ValuePart(definition["valuepart"])
1✔
2759
                self.body = UsageBody(definition["body"])
1✔
2760
        else:
2761
            self.valuepart = None
1✔
2762
            self.body = UsageBody()
1✔
2763

2764
    def dump(self):
1✔
2765
        output = []
1✔
2766
        if self.valuepart is not None:
1✔
2767
            output.append(self.valuepart.dump())
1✔
2768

2769
        output.append(self.body.dump())
1✔
2770
        return "".join(output)
1✔
2771

2772
    def get_definition(self):
1✔
2773
        vp = None
1✔
2774
        if self.valuepart is not None:
1✔
2775
            vp = self.valuepart.get_definition()
1✔
2776

2777
        return {
1✔
2778
            "name": self.__class__.__name__,
2779
            "valuepart": vp,
2780
            "body": self.body.get_definition(),
2781
        }
2782

2783

2784
class UsageBody:
1✔
2785
    def __init__(self, definition=None):
1✔
2786
        if definition is not None:
1✔
2787
            if valid_definition(definition, "UsageBody"):
1✔
2788
                self.body = DefinitionBody(definition["body"])
1✔
2789
        else:
2790
            self.body = DefinitionBody()
1✔
2791

2792
    def dump(self):
1✔
2793
        return self.body.dump()
1✔
2794

2795
    def get_definition(self):
1✔
2796
        return {"name": self.__class__.__name__, "body": self.body.get_definition()}
1✔
2797

2798

2799
class PackageMember:
1✔
2800
    def __init__(self, definition):
1✔
2801
        self.children = []
1✔
2802
        if valid_definition(definition, "PackageMember"):
1✔
2803
            # This is a SysML Element
2804
            if definition["prefix"] is not None:
1✔
2805
                self.prefix = MemberPrefix(definition["prefix"])
1✔
2806
            else:
2807
                self.prefix = None
1✔
2808

2809
            if definition["ownedRelatedElement"]["name"] == "DefinitionElement":
1✔
2810
                self.children.append(
1✔
2811
                    DefinitionElement(definition["ownedRelatedElement"])
2812
                )
2813
            elif definition["ownedRelatedElement"]["name"] == "UsageElement":
1✔
2814
                self.children.append(UsageElement(definition["ownedRelatedElement"]))
1✔
2815
            else:
2816
                raise AttributeError("This does not seem to be valid.")
×
2817

2818
    def dump(self):
1✔
2819
        output = []
1✔
2820
        for child in self.children:
1✔
2821
            output.append(child.dump())
1✔
2822

2823
        if self.prefix is not None:
1✔
2824
            return " ".join(filter(None, (self.prefix.dump(), "".join(output))))
1✔
2825
        else:
2826
            return "".join(output)
1✔
2827

2828
    def get_definition(self):
1✔
2829
        output = {
1✔
2830
            "name": self.__class__.__name__,
2831
            "prefix": None,
2832
            "ownedRelationship": [],
2833
        }
2834
        if self.prefix is not None:
1✔
2835
            output["prefix"] = self.prefix.get_definition()
×
2836

2837
        for child in self.children:
1✔
2838
            output["ownedRelatedElement"] = child.get_definition()
1✔
2839

2840
        return output
1✔
2841

2842

2843
class MemberPrefix:
1✔
2844
    def __init__(self, definition):
1✔
2845
        if valid_definition(definition, "MemberPrefix"):
1✔
2846
            self.visibility = VisibilityIndicator(definition["visibility"])
1✔
2847

2848
    def dump(self):
1✔
2849
        return self.visibility.dump()
1✔
2850

2851
    def get_definition(self):
1✔
2852
        output = {"name": self.__class__.__name__}
×
2853
        output["visibility"] = self.visibility.get_definition()
×
2854
        return output
×
2855

2856

2857
class Package:
1✔
2858
    def __init__(self, definition=None):
1✔
2859
        if definition is not None:
1✔
2860
            if valid_definition(definition, self.__class__.__name__):
1✔
2861
                # Elements inside of a package
2862
                # ownedRelationship += PrefixMetadataMember
2863
                # declaration = PackageDeclaration
2864
                # body = PackageBody
2865
                self.relationships = []
1✔
2866
                for rel in definition["ownedRelationship"]:
1✔
2867
                    self.relationships.append(json.dumps(rel))
×
2868
                self.declaration = PackageDeclaration(definition["declaration"])
1✔
2869
                self.body = PackageBody(definition["body"])
1✔
2870
        else:
2871
            self.relationships = []
1✔
2872
            self.declaration = PackageDeclaration()
1✔
2873
            self.body = PackageBody()
1✔
2874

2875
    def dump(self):
1✔
2876
        return "".join([self.declaration.dump(), self.body.dump()])
1✔
2877

2878
    def get_definition(self):
1✔
2879
        output = {"name": self.__class__.__name__, "ownedRelationship": []}
1✔
2880
        for rel in self.relationships:
1✔
2881
            output["ownedRelationship"] = rel.get_definition()
×
2882
        output["declaration"] = self.declaration.get_definition()
1✔
2883
        output["body"] = self.body.get_definition()
1✔
2884

2885
        return output
1✔
2886

2887

2888
class Identification:
1✔
2889
    def __init__(self, definition=None):
1✔
2890
        if definition is not None:
1✔
2891
            if valid_definition(definition, "Identification"):
1✔
2892
                if definition["declaredShortName"] == None:
1✔
2893
                    self.declaredShortName = None
1✔
2894
                else:
2895
                    if definition["declaredShortName"][0] == "<":
1✔
2896
                        definition["declaredShortName"] = definition[
1✔
2897
                            "declaredShortName"
2898
                        ][1:]
2899
                    if definition["declaredShortName"][-1] == ">":
1✔
2900
                        definition["declaredShortName"] = definition[
1✔
2901
                            "declaredShortName"
2902
                        ][:-1]
2903
                    self.declaredShortName = "<" + definition["declaredShortName"] + ">"
1✔
2904
                self.declaredName = definition["declaredName"]
1✔
2905
        else:
2906
            self.declaredName = None
1✔
2907
            self.declaredShortName = None
1✔
2908

2909
    def dump(self):
1✔
2910
        return " ".join(filter(None, (self.declaredShortName, self.declaredName)))
1✔
2911

2912
    def get_definition(self):
1✔
2913
        output = {"name": self.__class__.__name__}
1✔
2914
        output["declaredShortName"] = self.declaredShortName
1✔
2915
        output["declaredName"] = self.declaredName
1✔
2916
        return output
1✔
2917

2918

2919
class PackageDeclaration:
1✔
2920
    def __init__(self, definition=None):
1✔
2921
        if definition is not None:
1✔
2922
            if valid_definition(definition, "PackageDeclaration"):
1✔
2923
                self.identification = Identification(definition["identification"])
1✔
2924
        else:
2925
            self.identification = Identification()
1✔
2926

2927
    def dump(self):
1✔
2928
        return "package " + self.identification.dump()
1✔
2929

2930
    def get_definition(self):
1✔
2931
        return {
1✔
2932
            "name": self.__class__.__name__,
2933
            "identification": self.identification.get_definition(),
2934
        }
2935

2936

2937
class PackageBody:
1✔
2938
    def __init__(self, definition=None):
1✔
2939
        self.children = []
1✔
2940
        if definition is not None:
1✔
2941
            if valid_definition(definition, "PackageBody"):
1✔
2942
                if "ownedRelationship" in definition:
1✔
2943
                    for relationship in definition["ownedRelationship"]:
1✔
2944
                        if "name" in relationship:
1✔
2945
                            if relationship["name"] == "PackageMember":
1✔
2946
                                self.children.append(PackageMember(relationship))
1✔
2947
                            elif relationship["name"] == "ElementFilterMember":
1✔
2948
                                raise NotImplementedError
×
2949
                            elif relationship["name"] == "AliasMember":
1✔
2950
                                self.children.append(AliasMember(relationship))
1✔
2951
                            elif relationship["name"] == "Import":
1✔
2952
                                self.children.append(Import(relationship))
1✔
2953
                            else:
2954
                                raise AttributeError(
×
2955
                                    "Failed to match this relationship"
2956
                                )
2957
                        else:
2958
                            raise NotImplementedError
×
2959
                else:
2960
                    raise NotImplementedError
×
2961
            # else: handled inside function
2962
        # else: no new definitions needed
2963

2964
    def dump(self):
1✔
2965
        #!TODO This won't work
2966
        if len(self.children) == 0:
1✔
2967
            return ";"
1✔
2968
        else:
2969
            output = []
1✔
2970
            for child in self.children:
1✔
2971
                output.append(child.dump())
1✔
2972
            return " { \n" + "\n".join(output) + "\n}"
1✔
2973

2974
    def get_definition(self):
1✔
2975
        output = {"name": self.__class__.__name__, "ownedRelationship": []}
1✔
2976
        for child in self.children:
1✔
2977
            output["ownedRelationship"].append(child.get_definition())
1✔
2978
        return output
1✔
2979

2980

2981
class AliasMember:
1✔
2982
    def __init__(self, definition):
1✔
2983
        if valid_definition(definition, "AliasMember"):
1✔
2984
            if definition["prefix"] is not None:
1✔
2985
                self.prefix = MemberPrefix(definition["prefix"])
1✔
2986
            else:
2987
                self.prefix = None
1✔
2988

2989
            self.body = RelationshipBody(definition["body"])
1✔
2990

2991
            self.memberShortName = definition["memberShortName"]
1✔
2992
            self.memberName = definition["memberName"]
1✔
2993
            self.memberElement = QualifiedName(definition["memberElement"])
1✔
2994

2995
    def dump(self):
1✔
2996
        if self.memberShortName is None:
1✔
2997
            shortName = ""
1✔
2998
        else:
2999
            shortName = "<" + self.memberShortName + "> "
×
3000

3001
        if self.prefix is None:
1✔
3002
            prefix = ""
1✔
3003
        else:
3004
            prefix = self.prefix.dump() + " "
1✔
3005

3006
        return (
1✔
3007
            prefix
3008
            + "alias "
3009
            + shortName
3010
            + self.memberName
3011
            + " for "
3012
            + self.memberElement.dump()
3013
            + self.body.dump()
3014
        )
3015

3016

3017
class RelationshipBody:
1✔
3018
    def __init__(self, definition):
1✔
3019
        self.children = []
1✔
3020
        for relationship in definition["ownedRelationship"]:
1✔
3021
            if relationship["name"] == "OwnedAnnotation":
1✔
3022
                self.children.append(OwnedAnnotation(relationship))
1✔
3023
            else:
3024
                raise NotImplementedError
×
3025

3026
    def dump(self):
1✔
3027
        if len(self.children) == 0:
1✔
3028
            return ";"
1✔
3029
        else:
3030
            return "{" + "\n".join([child.dump() for child in self.children]) + "}"
1✔
3031

3032

3033
class OwnedAnnotation:
1✔
3034
    def __init__(self, definition):
1✔
3035
        if valid_definition(definition, "OwnedAnnotation"):
1✔
3036
            self.children = []
1✔
3037
            for element in definition["ownedRelatedElement"]:
1✔
3038
                self.children.append(AnnotatingElement(element))
1✔
3039

3040
    def dump(self):
1✔
3041
        return "\n".join([child.dump() for child in self.children])
1✔
3042

3043

3044
class Import:
1✔
3045
    def __init__(self, definition):
1✔
3046
        if valid_definition(definition, "Import"):
1✔
3047
            self.body = RelationshipBody(definition["body"])
1✔
3048
            self.children = []
1✔
3049
            relationship = definition["ownedRelationship"]
1✔
3050
            if relationship["name"] == "NamespaceImport":
1✔
3051
                self.children.append(NamespaceImport(relationship))
1✔
3052
            elif relationship["name"] == "MembershipImport":
1✔
3053
                self.children.append(MembershipImport(relationship))
1✔
3054
            else:
3055
                raise AttributeError("This does not seem to be valid")
×
3056

3057
    def dump(self):
1✔
3058
        output = []
1✔
3059
        for child in self.children:
1✔
3060
            output.append(child.dump())
1✔
3061
        return "".join(output) + self.body.dump()
1✔
3062

3063

3064
class MembershipImport:
1✔
3065
    def __init__(self, definition):
1✔
3066
        if valid_definition(definition, "MembershipImport"):
1✔
3067
            self.prefix = ImportPrefix(definition["prefix"])
1✔
3068
            self.membership = ImportedMembership(definition["membership"])
1✔
3069

3070
    def dump(self):
1✔
3071
        return " ".join([self.prefix.dump(), self.membership.dump()])
1✔
3072

3073

3074
class ImportedMembership:
1✔
3075
    def __init__(self, definition):
1✔
3076
        if valid_definition(definition, "ImportedMembership"):
1✔
3077
            self.name = QualifiedName(definition["importedMembership"])
1✔
3078
            self.isRecursive = definition["isRecursive"]
1✔
3079

3080
    def dump(self):
1✔
3081
        if not self.isRecursive:
1✔
3082
            return self.name.dump()
1✔
3083
        else:
3084
            return self.name.dump() + "::**"
×
3085

3086

3087
class NamespaceImport:
1✔
3088
    def __init__(self, definition):
1✔
3089
        if valid_definition(definition, "NamespaceImport"):
1✔
3090
            self.prefix = ImportPrefix(definition["prefix"])
1✔
3091

3092
            if len(definition["ownedRelatedElement"]) > 0:
1✔
3093
                raise NotImplementedError
×
3094
            else:
3095
                self.children = []
1✔
3096

3097
            self.namespace = ImportedNamespace(definition["namespace"])
1✔
3098

3099
    def dump(self):
1✔
3100
        return self.prefix.dump() + self.namespace.dump()
1✔
3101

3102

3103
class ImportPrefix:
1✔
3104
    def __init__(self, definition):
1✔
3105
        if valid_definition(definition, "ImportPrefix"):
1✔
3106
            if definition["visibility"] is not None:
1✔
3107
                self.visibility = VisibilityIndicator(definition["visibility"])
1✔
3108
            else:
3109
                self.visibility = None
1✔
3110

3111
            if definition["isImportAll"]:
1✔
3112
                self.keyword = "import all "
×
3113
            else:
3114
                self.keyword = "import "
1✔
3115

3116
    def dump(self):
1✔
3117
        if self.visibility is None:
1✔
3118
            return self.keyword
1✔
3119
        else:
3120
            return self.visibility.dump() + self.keyword
1✔
3121

3122

3123
class ImportedNamespace:
1✔
3124
    # The grammar for this file is currently broken.
3125
    def __init__(self, definition):
1✔
3126
        if valid_definition(definition, self.__class__.__name__):
1✔
3127
            self.namespaces = QualifiedName(definition["namespace"])
1✔
3128

3129
    def dump(self):
1✔
3130
        return self.namespaces.dump() + "::*"
1✔
3131

3132

3133
class QualifiedName:
1✔
3134
    def __init__(self, definition):
1✔
3135
        if valid_definition(definition, self.__class__.__name__):
1✔
3136
            self.names = [definition["name1"]]
1✔
3137
            for name in definition["names"]:
1✔
3138
                self.names.append(name)
1✔
3139

3140
    def dump(self):
1✔
3141
        return "::".join(self.names)
1✔
3142

3143
    def get_definition(self):
1✔
3144
        output = {"name": self.__class__.__name__}
1✔
3145
        output["name1"] = self.names[0]
1✔
3146
        output["names"] = self.names[1:]
1✔
3147
        return output
1✔
3148

3149

3150
class VisibilityIndicator:
1✔
3151
    def __init__(self, definition):
1✔
3152
        if valid_definition(definition, "VisibilityIndicator"):
1✔
3153
            if (
1✔
3154
                definition["private"] == "private"
3155
                and definition["protected"] == ""
3156
                and definition["public"] == ""
3157
            ):
3158
                self.keyword = "private "
1✔
3159
            elif (
1✔
3160
                definition["private"] == ""
3161
                and definition["protected"] == "protected"
3162
                and definition["public"] == ""
3163
            ):
3164
                self.keyword = "protected "
×
3165
            elif (
1✔
3166
                definition["private"] == ""
3167
                and definition["protected"] == ""
3168
                and definition["public"] == "public"
3169
            ):
3170
                self.keyword = "public "
1✔
3171
            else:
3172
                self.keyword = ""
×
3173

3174
    def dump(self):
1✔
3175
        return self.keyword
1✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc