sysmlpy 0.28.0__tar.gz → 0.28.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/PKG-INFO +22 -22
  2. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/README.md +21 -21
  3. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/pyproject.toml +2 -2
  4. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/__init__.py +1 -1
  5. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/antlr_visitor.py +133 -1
  6. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/grammar/classes.py +137 -1
  7. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/plantuml.py +148 -114
  8. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/LICENSE +0 -0
  9. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/__main__.py +0 -0
  10. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/antlr/README.md +0 -0
  11. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/antlr/SysMLv2Lexer.interp +0 -0
  12. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/antlr/SysMLv2Lexer.py +0 -0
  13. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/antlr/SysMLv2Lexer.tokens +0 -0
  14. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/antlr/SysMLv2Parser.interp +0 -0
  15. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/antlr/SysMLv2Parser.py +0 -0
  16. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/antlr/SysMLv2Parser.tokens +0 -0
  17. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/antlr/SysMLv2ParserListener.py +0 -0
  18. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/antlr/SysMLv2ParserVisitor.py +0 -0
  19. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/antlr/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.interp +0 -0
  20. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/antlr/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.py +0 -0
  21. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/antlr/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.tokens +0 -0
  22. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/antlr_parser.py +0 -0
  23. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/definition.py +0 -0
  24. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/examples/attribute_values.py +0 -0
  25. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/examples/part_attributes.py +0 -0
  26. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/examples/tuples_sequences.py +0 -0
  27. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/formatting.py +0 -0
  28. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/grammar/antlr4/README.md +0 -0
  29. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.g4 +0 -0
  30. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.interp +0 -0
  31. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.py +0 -0
  32. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.tokens +0 -0
  33. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.g4 +0 -0
  34. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.interp +0 -0
  35. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.py +0 -0
  36. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.tokens +0 -0
  37. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/grammar/antlr4/SysMLv2ParserListener.py +0 -0
  38. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/grammar/antlr4/SysMLv2ParserVisitor.py +0 -0
  39. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/grammar/antlr4/desc.xml +0 -0
  40. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/grammar/antlr4/examples/camera.sysml +0 -0
  41. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/grammar/antlr4/examples/toaster-system.sysml +0 -0
  42. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/grammar/antlr4/examples/vehicle-model.sysml +0 -0
  43. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/grammar/antlr4/pom.xml +0 -0
  44. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/LICENSE +0 -0
  45. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/README.md +0 -0
  46. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/__init__.py +0 -0
  47. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/domain/Analysis/AnalysisTooling.sysml +0 -0
  48. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/domain/Analysis/SampledFunctions.sysml +0 -0
  49. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/domain/Analysis/StateSpaceRepresentation.sysml +0 -0
  50. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/domain/Analysis/TradeStudies.sysml +0 -0
  51. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/domain/Cause and Effect/CausationConnections.sysml +0 -0
  52. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/domain/Cause and Effect/CauseAndEffect.sysml +0 -0
  53. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/domain/Geometry/ShapeItems.sysml +0 -0
  54. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/domain/Geometry/SpatialItems.sysml +0 -0
  55. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/domain/Metadata/ImageMetadata.sysml +0 -0
  56. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/domain/Metadata/ModelingMetadata.sysml +0 -0
  57. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/domain/Metadata/ParametersOfInterestMetadata.sysml +0 -0
  58. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/domain/Metadata/RiskMetadata.sysml +0 -0
  59. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/domain/Quantities and Units/ISQ.sysml +0 -0
  60. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/domain/Quantities and Units/ISQAcoustics.sysml +0 -0
  61. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/domain/Quantities and Units/ISQAtomicNuclear.sysml +0 -0
  62. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/domain/Quantities and Units/ISQBase.sysml +0 -0
  63. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/domain/Quantities and Units/ISQCharacteristicNumbers.sysml +0 -0
  64. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/domain/Quantities and Units/ISQChemistryMolecular.sysml +0 -0
  65. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/domain/Quantities and Units/ISQCondensedMatter.sysml +0 -0
  66. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/domain/Quantities and Units/ISQElectromagnetism.sysml +0 -0
  67. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/domain/Quantities and Units/ISQInformation.sysml +0 -0
  68. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/domain/Quantities and Units/ISQLight.sysml +0 -0
  69. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/domain/Quantities and Units/ISQMechanics.sysml +0 -0
  70. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/domain/Quantities and Units/ISQSpaceTime.sysml +0 -0
  71. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/domain/Quantities and Units/ISQThermodynamics.sysml +0 -0
  72. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/domain/Quantities and Units/MeasurementRefCalculations.sysml +0 -0
  73. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/domain/Quantities and Units/MeasurementReferences.sysml +0 -0
  74. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/domain/Quantities and Units/Quantities.sysml +0 -0
  75. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/domain/Quantities and Units/QuantityCalculations.sysml +0 -0
  76. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/domain/Quantities and Units/SI.sysml +0 -0
  77. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/domain/Quantities and Units/SIPrefixes.sysml +0 -0
  78. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/domain/Quantities and Units/TensorCalculations.sysml +0 -0
  79. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/domain/Quantities and Units/Time.sysml +0 -0
  80. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/domain/Quantities and Units/USCustomaryUnits.sysml +0 -0
  81. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/domain/Quantities and Units/VectorCalculations.sysml +0 -0
  82. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/domain/Requirement Derivation/DerivationConnections.sysml +0 -0
  83. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/domain/Requirement Derivation/RequirementDerivation.sysml +0 -0
  84. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/kernel/Base.kerml +0 -0
  85. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/kernel/BaseFunctions.kerml +0 -0
  86. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/kernel/BooleanFunctions.kerml +0 -0
  87. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/kernel/Clocks.kerml +0 -0
  88. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/kernel/CollectionFunctions.kerml +0 -0
  89. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/kernel/Collections.kerml +0 -0
  90. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/kernel/ComplexFunctions.kerml +0 -0
  91. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/kernel/ControlFunctions.kerml +0 -0
  92. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/kernel/ControlPerformances.kerml +0 -0
  93. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/kernel/DataFunctions.kerml +0 -0
  94. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/kernel/FeatureReferencingPerformances.kerml +0 -0
  95. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/kernel/IntegerFunctions.kerml +0 -0
  96. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/kernel/KerML.kerml +0 -0
  97. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/kernel/Links.kerml +0 -0
  98. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/kernel/Metaobjects.kerml +0 -0
  99. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/kernel/NaturalFunctions.kerml +0 -0
  100. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/kernel/NumericalFunctions.kerml +0 -0
  101. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/kernel/Objects.kerml +0 -0
  102. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/kernel/Observation.kerml +0 -0
  103. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/kernel/OccurrenceFunctions.kerml +0 -0
  104. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/kernel/Occurrences.kerml +0 -0
  105. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/kernel/Performances.kerml +0 -0
  106. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/kernel/RationalFunctions.kerml +0 -0
  107. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/kernel/RealFunctions.kerml +0 -0
  108. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/kernel/ScalarFunctions.kerml +0 -0
  109. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/kernel/ScalarValues.kerml +0 -0
  110. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/kernel/SequenceFunctions.kerml +0 -0
  111. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/kernel/SpatialFrames.kerml +0 -0
  112. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/kernel/StatePerformances.kerml +0 -0
  113. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/kernel/StringFunctions.kerml +0 -0
  114. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/kernel/Transfers.kerml +0 -0
  115. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/kernel/TransitionPerformances.kerml +0 -0
  116. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/kernel/TrigFunctions.kerml +0 -0
  117. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/kernel/Triggers.kerml +0 -0
  118. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/kernel/VectorFunctions.kerml +0 -0
  119. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/kernel/VectorValues.kerml +0 -0
  120. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/systems/Actions.sysml +0 -0
  121. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/systems/Allocations.sysml +0 -0
  122. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/systems/AnalysisCases.sysml +0 -0
  123. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/systems/Attributes.sysml +0 -0
  124. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/systems/Calculations.sysml +0 -0
  125. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/systems/Cases.sysml +0 -0
  126. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/systems/Connections.sysml +0 -0
  127. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/systems/Constraints.sysml +0 -0
  128. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/systems/Flows.sysml +0 -0
  129. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/systems/Interfaces.sysml +0 -0
  130. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/systems/Items.sysml +0 -0
  131. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/systems/Metadata.sysml +0 -0
  132. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/systems/Parts.sysml +0 -0
  133. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/systems/Ports.sysml +0 -0
  134. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/systems/Requirements.sysml +0 -0
  135. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/systems/StandardViewDefinitions.sysml +0 -0
  136. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/systems/States.sysml +0 -0
  137. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/systems/SysML.sysml +0 -0
  138. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/systems/UseCases.sysml +0 -0
  139. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/systems/VerificationCases.sysml +0 -0
  140. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/library/systems/Views.sysml +0 -0
  141. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/navigate.py +0 -0
  142. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/project.py +0 -0
  143. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/semantic.py +0 -0
  144. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/store.py +0 -0
  145. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/us_customary_units.txt +0 -0
  146. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/usage.py +0 -0
  147. {sysmlpy-0.28.0 → sysmlpy-0.28.1}/src/sysmlpy/validator.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sysmlpy
3
- Version: 0.28.0
3
+ Version: 0.28.1
4
4
  Summary: SysML v2.0 Parser
5
5
  License: MIT License
6
6
 
@@ -530,7 +530,7 @@ print(as_parametric_view(model, style="bw"))
530
530
  #### Action Flow View (AFV) — `as_action_flow_view()`
531
531
  Corresponds to SysML v2 ``ActionFlowView`` (short name ``afv``). Shows actions with their control and object flows. Auto-includes connected flow elements.
532
532
 
533
- ![Action Flow View](docs/plantuml-examples/09-action-flow-view.png)
533
+ ![Action Flow View](docs/plantuml-examples/13-action-flow-view.png)
534
534
 
535
535
  ```python
536
536
  from sysmlpy.plantuml import as_action_flow_view
@@ -550,7 +550,7 @@ print(as_interconnection_view(model, style="bw"))
550
550
  #### State Transition View (STV) — `as_state_transition_view()`
551
551
  Corresponds to SysML v2 ``StateTransitionView`` (short name ``stv``). State machine diagram with hierarchical states and transitions. Auto-includes connected transition elements.
552
552
 
553
- ![State Transition View](docs/plantuml-examples/10-state-transition-view.png)
553
+ ![State Transition View](docs/plantuml-examples/14-state-transition-view.png)
554
554
 
555
555
  ```python
556
556
  from sysmlpy.plantuml import as_state_transition_view
@@ -560,19 +560,17 @@ print(as_state_transition_view(model, style="bw"))
560
560
  #### Tree Diagram — `as_tree_diagram()`
561
561
  Hierarchical containment tree using nested PlantUML containers. Shows ownership hierarchy with sharp corners for definitions and rounded corners for usages.
562
562
 
563
- ![Tree Diagram](docs/plantuml-examples/11-tree-diagram.png)
563
+ ![Tree Diagram](docs/plantuml-examples/15-tree-diagram.png)
564
564
 
565
565
  ```python
566
566
  from sysmlpy.plantuml import as_tree_diagram
567
567
  print(as_tree_diagram(model, style="bw"))
568
568
  ```
569
569
 
570
- ### Tabular View Rendering Functions
571
-
572
570
  #### Element Table — `as_element_table()`
573
571
  A simple tabular listing with columns Name, Type, Kind, and Parent.
574
572
 
575
- ![Element Table](docs/plantuml-examples/12-element-table.png)
573
+ ![Element Table](docs/plantuml-examples/16-element-table.png)
576
574
 
577
575
  ```python
578
576
  from sysmlpy.plantuml import as_element_table
@@ -582,7 +580,7 @@ print(as_element_table(model, style="bw"))
582
580
  #### Textual Notation — `as_textual_notation()`
583
581
  Indented text representation inside a PlantUML note, similar to the SysML v2 textual concrete syntax.
584
582
 
585
- ![Textual Notation](docs/plantuml-examples/13-textual-notation.png)
583
+ ![Textual Notation](docs/plantuml-examples/17-textual-notation.png)
586
584
 
587
585
  ```python
588
586
  from sysmlpy.plantuml import as_textual_notation
@@ -593,20 +591,22 @@ print(as_textual_notation(model, style="bw"))
593
591
 
594
592
  Per the SysML v2 standard, ``GridView`` (short name ``grv``) presents exposed model elements and their relationships in a rectangular grid. It has three specializations, all supporting **three output formats**:
595
593
 
596
- | Format | Use case |
597
- |--------|----------|
598
- | `"plantuml"` (default) | PlantUML table / salt matrix embed in diagrams |
599
- | `"markdown"` | Standard pipe table — for GitHub, MkDocs, or Jupyter |
600
- | `"html"` | Rich `<table>` with CSS classesfor web dashboards |
594
+ | Format | Use case | Compatibility |
595
+ |--------|----------|---------------|
596
+ | `"markdown"` (default) | Standard pipe table for GitHub, MkDocs, or Jupyter | ✅ Universal |
597
+ | `"html"` | Rich `<table>` with CSS classes — for web dashboards | Universal |
598
+ | `"plantuml"` | PlantUML table / salt matrixembed in diagrams | ⚠️ PlantUML <1.2024.7 only |
599
+
600
+ **Note:** PlantUML 1.2024.7+ removed support for legacy table syntax. Use `"markdown"` or `"html"` output format for compatibility with all PlantUML versions.
601
601
 
602
602
  #### Tabular View — `as_tabular_view()`
603
603
  Extensible table with configurable columns. Default columns: Name, Type, Kind, Parent, Typed By, Specializes.
604
604
 
605
- ![Tabular View (BW)](docs/plantuml-examples/14-tabular-view.png)
605
+ See [`18-tabular-view.md`](docs/plantuml-examples/18-tabular-view.md) for example output.
606
606
 
607
607
  ```python
608
608
  from sysmlpy.plantuml import as_tabular_view
609
- print(as_tabular_view(model, output_format="markdown"))
609
+ print(as_tabular_view(model)) # Default: markdown output
610
610
  ```
611
611
 
612
612
  Custom columns and other output formats:
@@ -617,18 +617,18 @@ print(as_tabular_view(model,
617
617
  columns=["Name", "Type", "Parent", "Typed By"],
618
618
  output_format="html"))
619
619
 
620
- # Markdown for documentation
620
+ # Markdown for documentation (default)
621
621
  print(as_tabular_view(model, output_format="markdown"))
622
622
  ```
623
623
 
624
624
  #### Data Value Tabular View — `as_data_value_tabular_view()`
625
625
  Attribute-specific version showing Element, Attribute, Value, Unit, and Type columns. Uses `Attribute.get_value()` for pint.Quantity extraction.
626
626
 
627
- ![Data Value View](docs/plantuml-examples/15-data-value-view.png)
627
+ See [`19-data-value-view.md`](docs/plantuml-examples/19-data-value-view.md) for example output.
628
628
 
629
629
  ```python
630
630
  from sysmlpy.plantuml import as_data_value_tabular_view
631
- print(as_data_value_tabular_view(model, output_format="html"))
631
+ print(as_data_value_tabular_view(model)) # Default: markdown output
632
632
  ```
633
633
 
634
634
  #### Relationship Matrix View — `as_relationship_matrix_view()`
@@ -639,11 +639,11 @@ Pairwise element×element matrix showing relationship types:
639
639
  - **G** = Specialization (generalization)
640
640
  - **B** = Binding, **F** = Flow, **R** = Redefinition, etc.
641
641
 
642
- ![Relationship Matrix](docs/plantuml-examples/16-relationship-matrix.png)
642
+ See [`20-relationship-matrix.md`](docs/plantuml-examples/20-relationship-matrix.md) for example output.
643
643
 
644
644
  ```python
645
645
  from sysmlpy.plantuml import as_relationship_matrix_view
646
- print(as_relationship_matrix_view(model, output_format="markdown"))
646
+ print(as_relationship_matrix_view(model)) # Default: markdown output
647
647
  ```
648
648
 
649
649
  Type filtering and HTML output:
@@ -660,10 +660,10 @@ All rendering functions accept `style="color"` for colored output with CSS-style
660
660
 
661
661
  ```python
662
662
  from sysmlpy.plantuml import as_tabular_view
663
- print(as_tabular_view(model, style="color"))
663
+ print(as_tabular_view(model, output_format="html", style="color"))
664
664
  ```
665
665
 
666
- ![Tabular View (Color)](docs/plantuml-examples/17-tabular-view-color.png)
666
+ See [`21-tabular-view-color.html`](docs/plantuml-examples/21-tabular-view-color.html) for example output.
667
667
 
668
668
  ### Complete Example Gallery
669
669
 
@@ -485,7 +485,7 @@ print(as_parametric_view(model, style="bw"))
485
485
  #### Action Flow View (AFV) — `as_action_flow_view()`
486
486
  Corresponds to SysML v2 ``ActionFlowView`` (short name ``afv``). Shows actions with their control and object flows. Auto-includes connected flow elements.
487
487
 
488
- ![Action Flow View](docs/plantuml-examples/09-action-flow-view.png)
488
+ ![Action Flow View](docs/plantuml-examples/13-action-flow-view.png)
489
489
 
490
490
  ```python
491
491
  from sysmlpy.plantuml import as_action_flow_view
@@ -505,7 +505,7 @@ print(as_interconnection_view(model, style="bw"))
505
505
  #### State Transition View (STV) — `as_state_transition_view()`
506
506
  Corresponds to SysML v2 ``StateTransitionView`` (short name ``stv``). State machine diagram with hierarchical states and transitions. Auto-includes connected transition elements.
507
507
 
508
- ![State Transition View](docs/plantuml-examples/10-state-transition-view.png)
508
+ ![State Transition View](docs/plantuml-examples/14-state-transition-view.png)
509
509
 
510
510
  ```python
511
511
  from sysmlpy.plantuml import as_state_transition_view
@@ -515,19 +515,17 @@ print(as_state_transition_view(model, style="bw"))
515
515
  #### Tree Diagram — `as_tree_diagram()`
516
516
  Hierarchical containment tree using nested PlantUML containers. Shows ownership hierarchy with sharp corners for definitions and rounded corners for usages.
517
517
 
518
- ![Tree Diagram](docs/plantuml-examples/11-tree-diagram.png)
518
+ ![Tree Diagram](docs/plantuml-examples/15-tree-diagram.png)
519
519
 
520
520
  ```python
521
521
  from sysmlpy.plantuml import as_tree_diagram
522
522
  print(as_tree_diagram(model, style="bw"))
523
523
  ```
524
524
 
525
- ### Tabular View Rendering Functions
526
-
527
525
  #### Element Table — `as_element_table()`
528
526
  A simple tabular listing with columns Name, Type, Kind, and Parent.
529
527
 
530
- ![Element Table](docs/plantuml-examples/12-element-table.png)
528
+ ![Element Table](docs/plantuml-examples/16-element-table.png)
531
529
 
532
530
  ```python
533
531
  from sysmlpy.plantuml import as_element_table
@@ -537,7 +535,7 @@ print(as_element_table(model, style="bw"))
537
535
  #### Textual Notation — `as_textual_notation()`
538
536
  Indented text representation inside a PlantUML note, similar to the SysML v2 textual concrete syntax.
539
537
 
540
- ![Textual Notation](docs/plantuml-examples/13-textual-notation.png)
538
+ ![Textual Notation](docs/plantuml-examples/17-textual-notation.png)
541
539
 
542
540
  ```python
543
541
  from sysmlpy.plantuml import as_textual_notation
@@ -548,20 +546,22 @@ print(as_textual_notation(model, style="bw"))
548
546
 
549
547
  Per the SysML v2 standard, ``GridView`` (short name ``grv``) presents exposed model elements and their relationships in a rectangular grid. It has three specializations, all supporting **three output formats**:
550
548
 
551
- | Format | Use case |
552
- |--------|----------|
553
- | `"plantuml"` (default) | PlantUML table / salt matrix embed in diagrams |
554
- | `"markdown"` | Standard pipe table — for GitHub, MkDocs, or Jupyter |
555
- | `"html"` | Rich `<table>` with CSS classesfor web dashboards |
549
+ | Format | Use case | Compatibility |
550
+ |--------|----------|---------------|
551
+ | `"markdown"` (default) | Standard pipe table for GitHub, MkDocs, or Jupyter | ✅ Universal |
552
+ | `"html"` | Rich `<table>` with CSS classes — for web dashboards | Universal |
553
+ | `"plantuml"` | PlantUML table / salt matrixembed in diagrams | ⚠️ PlantUML <1.2024.7 only |
554
+
555
+ **Note:** PlantUML 1.2024.7+ removed support for legacy table syntax. Use `"markdown"` or `"html"` output format for compatibility with all PlantUML versions.
556
556
 
557
557
  #### Tabular View — `as_tabular_view()`
558
558
  Extensible table with configurable columns. Default columns: Name, Type, Kind, Parent, Typed By, Specializes.
559
559
 
560
- ![Tabular View (BW)](docs/plantuml-examples/14-tabular-view.png)
560
+ See [`18-tabular-view.md`](docs/plantuml-examples/18-tabular-view.md) for example output.
561
561
 
562
562
  ```python
563
563
  from sysmlpy.plantuml import as_tabular_view
564
- print(as_tabular_view(model, output_format="markdown"))
564
+ print(as_tabular_view(model)) # Default: markdown output
565
565
  ```
566
566
 
567
567
  Custom columns and other output formats:
@@ -572,18 +572,18 @@ print(as_tabular_view(model,
572
572
  columns=["Name", "Type", "Parent", "Typed By"],
573
573
  output_format="html"))
574
574
 
575
- # Markdown for documentation
575
+ # Markdown for documentation (default)
576
576
  print(as_tabular_view(model, output_format="markdown"))
577
577
  ```
578
578
 
579
579
  #### Data Value Tabular View — `as_data_value_tabular_view()`
580
580
  Attribute-specific version showing Element, Attribute, Value, Unit, and Type columns. Uses `Attribute.get_value()` for pint.Quantity extraction.
581
581
 
582
- ![Data Value View](docs/plantuml-examples/15-data-value-view.png)
582
+ See [`19-data-value-view.md`](docs/plantuml-examples/19-data-value-view.md) for example output.
583
583
 
584
584
  ```python
585
585
  from sysmlpy.plantuml import as_data_value_tabular_view
586
- print(as_data_value_tabular_view(model, output_format="html"))
586
+ print(as_data_value_tabular_view(model)) # Default: markdown output
587
587
  ```
588
588
 
589
589
  #### Relationship Matrix View — `as_relationship_matrix_view()`
@@ -594,11 +594,11 @@ Pairwise element×element matrix showing relationship types:
594
594
  - **G** = Specialization (generalization)
595
595
  - **B** = Binding, **F** = Flow, **R** = Redefinition, etc.
596
596
 
597
- ![Relationship Matrix](docs/plantuml-examples/16-relationship-matrix.png)
597
+ See [`20-relationship-matrix.md`](docs/plantuml-examples/20-relationship-matrix.md) for example output.
598
598
 
599
599
  ```python
600
600
  from sysmlpy.plantuml import as_relationship_matrix_view
601
- print(as_relationship_matrix_view(model, output_format="markdown"))
601
+ print(as_relationship_matrix_view(model)) # Default: markdown output
602
602
  ```
603
603
 
604
604
  Type filtering and HTML output:
@@ -615,10 +615,10 @@ All rendering functions accept `style="color"` for colored output with CSS-style
615
615
 
616
616
  ```python
617
617
  from sysmlpy.plantuml import as_tabular_view
618
- print(as_tabular_view(model, style="color"))
618
+ print(as_tabular_view(model, output_format="html", style="color"))
619
619
  ```
620
620
 
621
- ![Tabular View (Color)](docs/plantuml-examples/17-tabular-view-color.png)
621
+ See [`21-tabular-view-color.html`](docs/plantuml-examples/21-tabular-view-color.html) for example output.
622
622
 
623
623
  ### Complete Example Gallery
624
624
 
@@ -6,7 +6,7 @@ build-backend = "poetry.core.masonry.api"
6
6
 
7
7
  [project]
8
8
  name = "sysmlpy"
9
- version = "0.28.0"
9
+ version = "0.28.1"
10
10
  description = "SysML v2.0 Parser"
11
11
  authors = [
12
12
  { name="Jon R. Fox (mycr0ft)", email="jon.fox@drfox.com" },
@@ -114,7 +114,7 @@ build_command = "pip install poetry && poetry build"
114
114
 
115
115
  [tool.poetry]
116
116
  name = "sysmlpy"
117
- version = "0.28.0"
117
+ version = "0.28.1"
118
118
  description = ""
119
119
  authors = ["Jon R. Fox (mycr0ft) <jon.fox@drfox.com>"]
120
120
  readme = "README.md"
@@ -20,7 +20,7 @@ __all__ = [
20
20
  "analyze", "SemanticIssue", "SemanticAnalyzer",
21
21
  ]
22
22
  __author__ = "Jon Fox"
23
- __version__ = "0.28.0"
23
+ __version__ = "0.28.1"
24
24
 
25
25
  from sysmlpy.usage import (
26
26
  Item, Attribute, Part, Port, Action, Reference, UseCase, Requirement, Interface, Message,
@@ -245,10 +245,138 @@ def _visit_comment_dict(ctx):
245
245
  }
246
246
 
247
247
 
248
+ def _visit_textual_representation_dict(ctx):
249
+ """Visit a textualRepresentation context and return a TextualRepresentation dictionary.
250
+
251
+ Grammar: (REP identification?)? LANGUAGE DOUBLE_STRING REGULAR_COMMENT
252
+ """
253
+ identification = None
254
+ if ctx.identification():
255
+ identification = _build_identification_dict(ctx.identification())
256
+
257
+ language = ""
258
+ if ctx.DOUBLE_STRING():
259
+ language = ctx.DOUBLE_STRING().getText().strip('"')
260
+
261
+ body = ""
262
+ if ctx.REGULAR_COMMENT():
263
+ body = ctx.REGULAR_COMMENT().getText()
264
+
265
+ return {
266
+ "name": "TextualRepresentation",
267
+ "identification": identification,
268
+ "language": language,
269
+ "body": body
270
+ }
271
+
272
+
273
+ def _visit_metadata_feature_dict(ctx):
274
+ """Visit a metadataFeature context and return a MetadataFeature dictionary.
275
+
276
+ Grammar: (prefixMetadataMember)* (AT_SIGN | METADATA) metadataFeatureDeclaration (
277
+ ABOUT annotation ( COMMA annotation)*
278
+ )? metadataBody
279
+ """
280
+ prefix_members = []
281
+ for pm in ctx.prefixMetadataMember():
282
+ prefix_members.append(_visit_prefix_metadata_member_dict(pm))
283
+
284
+ identification = None
285
+ owned_feature_typing = None
286
+ if ctx.metadataFeatureDeclaration():
287
+ mfd = ctx.metadataFeatureDeclaration()
288
+ if mfd.identification():
289
+ identification = _build_identification_dict(mfd.identification())
290
+ if mfd.ownedFeatureTyping():
291
+ owned_feature_typing = _visit_owned_feature_typing_dict(mfd.ownedFeatureTyping())
292
+
293
+ annotations = []
294
+ if ctx.ABOUT():
295
+ for ann_idx in range(len(ctx.annotation())):
296
+ ann_ctx = ctx.annotation(ann_idx)
297
+ if ann_ctx and ann_ctx.qualifiedName():
298
+ qn_text = ann_ctx.qualifiedName().getText()
299
+ annotations.append({
300
+ "name": "Annotation",
301
+ "annotatedElement": {
302
+ "name": "QualifiedName",
303
+ "names": qn_text.split("::")
304
+ }
305
+ })
306
+
307
+ body = ""
308
+ if ctx.metadataBody() and ctx.metadataBody().SEMI():
309
+ body = ";"
310
+
311
+ return {
312
+ "name": "MetadataFeature",
313
+ "prefixMetadataMember": prefix_members,
314
+ "identification": identification,
315
+ "ownedFeatureTyping": owned_feature_typing,
316
+ "ownedRelationship_about": annotations,
317
+ "body": body
318
+ }
319
+
320
+
321
+ def _visit_prefix_metadata_member_dict(ctx):
322
+ """Visit a prefixMetadataMember context."""
323
+ visibility = ""
324
+ direction = ""
325
+
326
+ if ctx.PRIVATE():
327
+ visibility = "private"
328
+ elif ctx.PROTECTED():
329
+ visibility = "protected"
330
+ elif ctx.PUBLIC():
331
+ visibility = "public"
332
+
333
+ if ctx.IN():
334
+ direction = "in"
335
+ elif ctx.OUT():
336
+ direction = "out"
337
+ elif ctx.INOUT():
338
+ direction = "inout"
339
+
340
+ return {
341
+ "name": "PrefixMetadataMember",
342
+ "visibility": visibility,
343
+ "direction": direction
344
+ }
345
+
346
+
347
+ def _visit_owned_feature_typing_dict(ctx):
348
+ """Visit an ownedFeatureTyping context and return an OwnedFeatureTyping dictionary."""
349
+ if ctx is None:
350
+ return None
351
+
352
+ if hasattr(ctx, 'qualifiedName') and ctx.qualifiedName():
353
+ qns = ctx.qualifiedName()
354
+ if not isinstance(qns, list):
355
+ qns = [qns]
356
+ names = []
357
+ for qn in qns:
358
+ if qn:
359
+ names.append(qn.getText())
360
+ if names:
361
+ return {
362
+ "name": "OwnedFeatureTyping",
363
+ "type": {
364
+ "name": "FeatureType",
365
+ "type": {
366
+ "name": "QualifiedName",
367
+ "names": names
368
+ },
369
+ "ownedRelatedElement": []
370
+ },
371
+ "ownedRelatedElement": []
372
+ }
373
+ return None
374
+
375
+
248
376
  def _visit_annotating_element_dict(annot_elem_ctx):
249
377
  """Visit an annotating element context and return an AnnotatingElement dictionary.
250
378
 
251
- Dispatches to documentation or comment based on the context.
379
+ Dispatches to documentation, comment, textualRepresentation, or metadataFeature.
252
380
  """
253
381
  if annot_elem_ctx is None:
254
382
  return None
@@ -258,6 +386,10 @@ def _visit_annotating_element_dict(annot_elem_ctx):
258
386
  inner = _visit_documentation_dict(annot_elem_ctx.documentation())
259
387
  elif hasattr(annot_elem_ctx, 'comment') and annot_elem_ctx.comment():
260
388
  inner = _visit_comment_dict(annot_elem_ctx.comment())
389
+ elif hasattr(annot_elem_ctx, 'textualRepresentation') and annot_elem_ctx.textualRepresentation():
390
+ inner = _visit_textual_representation_dict(annot_elem_ctx.textualRepresentation())
391
+ elif hasattr(annot_elem_ctx, 'metadataFeature') and annot_elem_ctx.metadataFeature():
392
+ inner = _visit_metadata_feature_dict(annot_elem_ctx.metadataFeature())
261
393
 
262
394
  if inner is None:
263
395
  return None
@@ -4225,6 +4225,142 @@ class Documentation:
4225
4225
  return output
4226
4226
 
4227
4227
 
4228
+ class TextualRepresentation:
4229
+ # textualRepresentation
4230
+ # : (REP identification?)? LANGUAGE DOUBLE_STRING REGULAR_COMMENT
4231
+ # ;
4232
+ def __init__(self, definition):
4233
+ if valid_definition(definition, "TextualRepresentation"):
4234
+ self.identification = None
4235
+ if definition.get("identification") is not None:
4236
+ self.identification = Identification(definition["identification"])
4237
+
4238
+ self.language = definition.get("language", "")
4239
+ self.body = definition.get("body", "")
4240
+
4241
+ def dump(self):
4242
+ output = []
4243
+ if self.identification is not None:
4244
+ output.append("rep")
4245
+ output.append(self.identification.dump())
4246
+ output.append("language")
4247
+ output.append(f'"{self.language}"')
4248
+ output.append(self.body)
4249
+ return " ".join(output)
4250
+
4251
+ def get_definition(self):
4252
+ output = {
4253
+ "name": self.__class__.__name__,
4254
+ "identification": self.identification.get_definition() if self.identification else None,
4255
+ "language": self.language,
4256
+ "body": self.body
4257
+ }
4258
+ return output
4259
+
4260
+
4261
+ class MetadataFeature:
4262
+ # metadataFeature
4263
+ # : (prefixMetadataMember)* (AT_SIGN | METADATA) metadataFeatureDeclaration (
4264
+ # ABOUT annotation ( COMMA annotation)*
4265
+ # )? metadataBody
4266
+ # ;
4267
+ def __init__(self, definition):
4268
+ if valid_definition(definition, "MetadataFeature"):
4269
+ self.prefix = []
4270
+ for p in definition.get("prefixMetadataMember", []):
4271
+ self.prefix.append(PrefixMetadataMember(p))
4272
+
4273
+ self.identification = None
4274
+ if definition.get("identification") is not None:
4275
+ self.identification = Identification(definition["identification"])
4276
+
4277
+ self.typing = None
4278
+ if definition.get("ownedFeatureTyping") is not None:
4279
+ self.typing = OwnedFeatureTyping(definition["ownedFeatureTyping"])
4280
+
4281
+ self.annotations = []
4282
+ for ann in definition.get("ownedRelationship_about", []):
4283
+ self.annotations.append(Annotation(ann))
4284
+
4285
+ self.body = definition.get("body", "")
4286
+
4287
+ def dump(self):
4288
+ output = []
4289
+ for p in self.prefix:
4290
+ output.append(p.dump())
4291
+ output.append("@")
4292
+ if self.identification is not None:
4293
+ output.append(self.identification.dump())
4294
+ if self.typing is not None:
4295
+ output.append(":")
4296
+ output.append(self.typing.dump())
4297
+ if self.annotations:
4298
+ output.append("about")
4299
+ output.append(", ".join([a.dump() for a in self.annotations]))
4300
+ if self.body:
4301
+ output.append(self.body)
4302
+ return " ".join(output)
4303
+
4304
+ def get_definition(self):
4305
+ output = {
4306
+ "name": self.__class__.__name__,
4307
+ "prefixMetadataMember": [p.get_definition() for p in self.prefix],
4308
+ "identification": self.identification.get_definition() if self.identification else None,
4309
+ "ownedFeatureTyping": self.typing.get_definition() if self.typing else None,
4310
+ "ownedRelationship_about": [a.get_definition() for a in self.annotations],
4311
+ "body": self.body
4312
+ }
4313
+ return output
4314
+
4315
+
4316
+ class PrefixMetadataMember:
4317
+ def __init__(self, definition):
4318
+ if valid_definition(definition, "PrefixMetadataMember"):
4319
+ self.visibility = definition.get("visibility", "")
4320
+ self.direction = definition.get("direction", "")
4321
+
4322
+ def dump(self):
4323
+ output = []
4324
+ if self.visibility:
4325
+ output.append(self.visibility)
4326
+ if self.direction:
4327
+ output.append(self.direction)
4328
+ return " ".join(output)
4329
+
4330
+ def get_definition(self):
4331
+ return {
4332
+ "name": self.__class__.__name__,
4333
+ "visibility": self.visibility,
4334
+ "direction": self.direction
4335
+ }
4336
+
4337
+
4338
+ class OccurrenceUsageBody:
4339
+ # OccurrenceUsageBody — used by non-action occurrence usages
4340
+ # Similar to ActionBody but for general occurrence usages
4341
+ def __init__(self, definition):
4342
+ if valid_definition(definition, "OccurrenceUsageBody"):
4343
+ self.children = []
4344
+ for item in definition.get("ownedRelationship", []):
4345
+ if item.get("name") == "InitialNodeMember":
4346
+ self.children.append(InitialNodeMember(item))
4347
+ elif item.get("name") == "ActionNodeMember":
4348
+ self.children.append(ActionNodeMember(item))
4349
+ else:
4350
+ print(f"OccurrenceUsageBody: Unknown item type {item.get('name')}")
4351
+
4352
+ def dump(self):
4353
+ if not self.children:
4354
+ return ";"
4355
+ return " { " + "; ".join([c.dump() for c in self.children]) + " }"
4356
+
4357
+ def get_definition(self):
4358
+ return {
4359
+ "name": self.__class__.__name__,
4360
+ "ownedRelationship": [c.get_definition() for c in self.children]
4361
+ }
4362
+
4363
+
4228
4364
  class AttributeDefinition:
4229
4365
  def __init__(self, definition=None):
4230
4366
  self.keyword = "attribute def"
@@ -6833,7 +6969,7 @@ class InterfaceEnd:
6833
6969
  elif relationship["name"] == "OwnedMultiplicity":
6834
6970
  self.relationships.append(OwnedMultiplicity(relationship))
6835
6971
  else:
6836
- return NotImplementedError
6972
+ print(f"InterfaceEnd: Unknown relationship type {relationship['name']}")
6837
6973
 
6838
6974
  def dump(self):
6839
6975
  output = []