sysmlpy 0.56.0__tar.gz → 0.59.0__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 (148) hide show
  1. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/PKG-INFO +1 -1
  2. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/pyproject.toml +1 -1
  3. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/__init__.py +1 -1
  4. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/antlr_visitor.py +14 -5
  5. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/definition.py +58 -19
  6. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/examples/attribute_values.py +7 -5
  7. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/examples/part_attributes.py +6 -4
  8. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/grammar/classes.py +5 -4
  9. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/usage.py +134 -71
  10. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/LICENSE +0 -0
  11. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/README.md +0 -0
  12. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/__main__.py +0 -0
  13. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/antlr/README.md +0 -0
  14. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/antlr/SysMLv2Lexer.interp +0 -0
  15. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/antlr/SysMLv2Lexer.py +0 -0
  16. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/antlr/SysMLv2Lexer.tokens +0 -0
  17. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/antlr/SysMLv2Parser.interp +0 -0
  18. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/antlr/SysMLv2Parser.py +0 -0
  19. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/antlr/SysMLv2Parser.tokens +0 -0
  20. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/antlr/SysMLv2ParserListener.py +0 -0
  21. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/antlr/SysMLv2ParserVisitor.py +0 -0
  22. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/antlr/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.interp +0 -0
  23. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/antlr/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.py +0 -0
  24. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/antlr/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.tokens +0 -0
  25. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/antlr_parser.py +0 -0
  26. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/boxes_view.py +0 -0
  27. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/examples/tuples_sequences.py +0 -0
  28. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/formatting.py +0 -0
  29. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/grammar/antlr4/README.md +0 -0
  30. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.g4 +0 -0
  31. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.interp +0 -0
  32. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.py +0 -0
  33. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.tokens +0 -0
  34. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.g4 +0 -0
  35. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.interp +0 -0
  36. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.py +0 -0
  37. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.tokens +0 -0
  38. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/grammar/antlr4/SysMLv2ParserListener.py +0 -0
  39. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/grammar/antlr4/SysMLv2ParserVisitor.py +0 -0
  40. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/grammar/antlr4/desc.xml +0 -0
  41. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/grammar/antlr4/examples/camera.sysml +0 -0
  42. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/grammar/antlr4/examples/toaster-system.sysml +0 -0
  43. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/grammar/antlr4/examples/vehicle-model.sysml +0 -0
  44. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/grammar/antlr4/pom.xml +0 -0
  45. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/LICENSE +0 -0
  46. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/README.md +0 -0
  47. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/__init__.py +0 -0
  48. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/domain/Analysis/AnalysisTooling.sysml +0 -0
  49. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/domain/Analysis/SampledFunctions.sysml +0 -0
  50. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/domain/Analysis/StateSpaceRepresentation.sysml +0 -0
  51. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/domain/Analysis/TradeStudies.sysml +0 -0
  52. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/domain/Cause and Effect/CausationConnections.sysml +0 -0
  53. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/domain/Cause and Effect/CauseAndEffect.sysml +0 -0
  54. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/domain/Geometry/ShapeItems.sysml +0 -0
  55. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/domain/Geometry/SpatialItems.sysml +0 -0
  56. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/domain/Metadata/ImageMetadata.sysml +0 -0
  57. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/domain/Metadata/ModelingMetadata.sysml +0 -0
  58. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/domain/Metadata/ParametersOfInterestMetadata.sysml +0 -0
  59. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/domain/Metadata/RiskMetadata.sysml +0 -0
  60. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/domain/Quantities and Units/ISQ.sysml +0 -0
  61. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/domain/Quantities and Units/ISQAcoustics.sysml +0 -0
  62. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/domain/Quantities and Units/ISQAtomicNuclear.sysml +0 -0
  63. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/domain/Quantities and Units/ISQBase.sysml +0 -0
  64. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/domain/Quantities and Units/ISQCharacteristicNumbers.sysml +0 -0
  65. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/domain/Quantities and Units/ISQChemistryMolecular.sysml +0 -0
  66. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/domain/Quantities and Units/ISQCondensedMatter.sysml +0 -0
  67. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/domain/Quantities and Units/ISQElectromagnetism.sysml +0 -0
  68. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/domain/Quantities and Units/ISQInformation.sysml +0 -0
  69. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/domain/Quantities and Units/ISQLight.sysml +0 -0
  70. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/domain/Quantities and Units/ISQMechanics.sysml +0 -0
  71. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/domain/Quantities and Units/ISQSpaceTime.sysml +0 -0
  72. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/domain/Quantities and Units/ISQThermodynamics.sysml +0 -0
  73. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/domain/Quantities and Units/MeasurementRefCalculations.sysml +0 -0
  74. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/domain/Quantities and Units/MeasurementReferences.sysml +0 -0
  75. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/domain/Quantities and Units/Quantities.sysml +0 -0
  76. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/domain/Quantities and Units/QuantityCalculations.sysml +0 -0
  77. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/domain/Quantities and Units/SI.sysml +0 -0
  78. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/domain/Quantities and Units/SIPrefixes.sysml +0 -0
  79. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/domain/Quantities and Units/TensorCalculations.sysml +0 -0
  80. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/domain/Quantities and Units/Time.sysml +0 -0
  81. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/domain/Quantities and Units/USCustomaryUnits.sysml +0 -0
  82. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/domain/Quantities and Units/VectorCalculations.sysml +0 -0
  83. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/domain/Requirement Derivation/DerivationConnections.sysml +0 -0
  84. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/domain/Requirement Derivation/RequirementDerivation.sysml +0 -0
  85. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/kernel/Base.kerml +0 -0
  86. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/kernel/BaseFunctions.kerml +0 -0
  87. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/kernel/BooleanFunctions.kerml +0 -0
  88. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/kernel/Clocks.kerml +0 -0
  89. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/kernel/CollectionFunctions.kerml +0 -0
  90. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/kernel/Collections.kerml +0 -0
  91. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/kernel/ComplexFunctions.kerml +0 -0
  92. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/kernel/ControlFunctions.kerml +0 -0
  93. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/kernel/ControlPerformances.kerml +0 -0
  94. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/kernel/DataFunctions.kerml +0 -0
  95. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/kernel/FeatureReferencingPerformances.kerml +0 -0
  96. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/kernel/IntegerFunctions.kerml +0 -0
  97. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/kernel/KerML.kerml +0 -0
  98. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/kernel/Links.kerml +0 -0
  99. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/kernel/Metaobjects.kerml +0 -0
  100. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/kernel/NaturalFunctions.kerml +0 -0
  101. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/kernel/NumericalFunctions.kerml +0 -0
  102. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/kernel/Objects.kerml +0 -0
  103. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/kernel/Observation.kerml +0 -0
  104. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/kernel/OccurrenceFunctions.kerml +0 -0
  105. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/kernel/Occurrences.kerml +0 -0
  106. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/kernel/Performances.kerml +0 -0
  107. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/kernel/RationalFunctions.kerml +0 -0
  108. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/kernel/RealFunctions.kerml +0 -0
  109. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/kernel/ScalarFunctions.kerml +0 -0
  110. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/kernel/ScalarValues.kerml +0 -0
  111. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/kernel/SequenceFunctions.kerml +0 -0
  112. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/kernel/SpatialFrames.kerml +0 -0
  113. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/kernel/StatePerformances.kerml +0 -0
  114. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/kernel/StringFunctions.kerml +0 -0
  115. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/kernel/Transfers.kerml +0 -0
  116. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/kernel/TransitionPerformances.kerml +0 -0
  117. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/kernel/TrigFunctions.kerml +0 -0
  118. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/kernel/Triggers.kerml +0 -0
  119. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/kernel/VectorFunctions.kerml +0 -0
  120. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/kernel/VectorValues.kerml +0 -0
  121. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/systems/Actions.sysml +0 -0
  122. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/systems/Allocations.sysml +0 -0
  123. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/systems/AnalysisCases.sysml +0 -0
  124. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/systems/Attributes.sysml +0 -0
  125. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/systems/Calculations.sysml +0 -0
  126. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/systems/Cases.sysml +0 -0
  127. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/systems/Connections.sysml +0 -0
  128. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/systems/Constraints.sysml +0 -0
  129. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/systems/Flows.sysml +0 -0
  130. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/systems/Interfaces.sysml +0 -0
  131. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/systems/Items.sysml +0 -0
  132. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/systems/Metadata.sysml +0 -0
  133. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/systems/Parts.sysml +0 -0
  134. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/systems/Ports.sysml +0 -0
  135. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/systems/Requirements.sysml +0 -0
  136. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/systems/StandardViewDefinitions.sysml +0 -0
  137. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/systems/States.sysml +0 -0
  138. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/systems/SysML.sysml +0 -0
  139. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/systems/UseCases.sysml +0 -0
  140. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/systems/VerificationCases.sysml +0 -0
  141. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/library/systems/Views.sysml +0 -0
  142. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/navigate.py +0 -0
  143. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/plantuml.py +0 -0
  144. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/project.py +0 -0
  145. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/semantic.py +0 -0
  146. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/store.py +0 -0
  147. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/us_customary_units.txt +0 -0
  148. {sysmlpy-0.56.0 → sysmlpy-0.59.0}/src/sysmlpy/validator.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sysmlpy
3
- Version: 0.56.0
3
+ Version: 0.59.0
4
4
  Summary:
5
5
  License-File: LICENSE
6
6
  Author: Jon R. Fox (mycr0ft)
@@ -6,7 +6,7 @@ build-backend = "poetry.core.masonry.api"
6
6
 
7
7
  [project]
8
8
  name = "sysmlpy"
9
- version = "0.56.0"
9
+ version = "0.59.0"
10
10
  description = ""
11
11
  authors = [{ name = "Jon R. Fox (mycr0ft)", email = "jon.fox@drfox.com" }]
12
12
  readme = "README.md"
@@ -25,7 +25,7 @@ __all__ = [
25
25
  "render_state_transition_view_svg", "boxes_view",
26
26
  ]
27
27
  __author__ = "Jon Fox"
28
- __version__ = "0.56.0"
28
+ __version__ = "0.59.0"
29
29
 
30
30
  from sysmlpy.usage import (
31
31
  Item, Attribute, Part, Port, Action, Reference, UseCase, Requirement, Interface, Message,
@@ -7148,10 +7148,12 @@ def _extract_multiplicity_from_mp(mp_ctx):
7148
7148
  else:
7149
7149
  return None
7150
7150
 
7151
+ is_ordered = bool(mp_ctx.ORDERED()) if hasattr(mp_ctx, 'ORDERED') else False
7152
+ is_nonunique = bool(mp_ctx.NONUNIQUE()) if hasattr(mp_ctx, 'NONUNIQUE') else False
7151
7153
  return {
7152
7154
  "name": "MultiplicityPart",
7153
- "isOrdered": False,
7154
- "isNonunique": False,
7155
+ "isOrdered": is_ordered,
7156
+ "isNonunique": is_nonunique,
7155
7157
  "ownedRelationship": [
7156
7158
  {
7157
7159
  "name": "OwnedMultiplicity",
@@ -13597,11 +13599,18 @@ def _get_multiplicity_part(fsp_ctx):
13597
13599
  bound_dicts = [_make_bound(members[0].getText()), _make_bound(members[1].getText())]
13598
13600
  else:
13599
13601
  return None
13600
-
13602
+
13603
+ # ORDERED / NONUNIQUE indicators follow ownedMultiplicity in
13604
+ # multiplicityPart (grammar: `ownedMultiplicity ( ORDERED ( NONUNIQUE )?
13605
+ # | NONUNIQUE ( ORDERED )? )?`). Previously hardcoded False, silently
13606
+ # dropping the keywords on dump.
13607
+ is_ordered = bool(mp_ctx.ORDERED()) if hasattr(mp_ctx, 'ORDERED') else False
13608
+ is_nonunique = bool(mp_ctx.NONUNIQUE()) if hasattr(mp_ctx, 'NONUNIQUE') else False
13609
+
13601
13610
  return {
13602
13611
  "name": "MultiplicityPart",
13603
- "isOrdered": False,
13604
- "isNonunique": False,
13612
+ "isOrdered": is_ordered,
13613
+ "isNonunique": is_nonunique,
13605
13614
  "ownedRelationship": [
13606
13615
  {
13607
13616
  "name": "OwnedMultiplicity",
@@ -170,28 +170,46 @@ class Model(Searchable):
170
170
  def _ensure_body(self):
171
171
  """Rebuild the grammar body from current children and imports.
172
172
 
173
- Serializes all child elements into PackageMember wrappers and
174
- preserves any existing Import or AliasMember entries. Updates
175
- self.grammar with the reconstructed RootNamespace.
173
+ Serializes all child elements into PackageMember wrappers while
174
+ preserving ``Import`` and ``AliasMember`` declarations **at their
175
+ original source positions** (v0.58.0). The existing grammar body
176
+ is used as the ordering template: each ``PackageMember`` slot is
177
+ refilled with the fresh serialization of the next child, and any
178
+ children beyond the recorded slots are appended at the end.
176
179
 
177
180
  Returns
178
181
  -------
179
182
  Model
180
183
  Self for chaining.
181
184
  """
182
- body = []
185
+ # Serialize all current children into PackageMember definitions
186
+ child_defs = []
183
187
  for abc in self.children:
184
188
  v = abc._get_definition(child="PackageBody")
185
189
  if isinstance(v, list):
186
190
  for subchild in v:
187
- body.append(PackageMember(subchild).get_definition())
191
+ child_defs.append(PackageMember(subchild).get_definition())
188
192
  else:
189
- body.append(PackageMember(v).get_definition())
193
+ child_defs.append(PackageMember(v).get_definition())
190
194
 
191
- if hasattr(self, 'grammar') and self.grammar:
192
- for child in self.grammar.children:
193
- if child.__class__.__name__ in ('Import', 'AliasMember'):
194
- body.append(child.get_definition())
195
+ existing = getattr(getattr(self, 'grammar', None), 'children', None)
196
+
197
+ body = []
198
+ if existing:
199
+ member_iter = iter(child_defs)
200
+ for item in existing:
201
+ cn = item.__class__.__name__
202
+ if cn in ('Import', 'AliasMember'):
203
+ body.append(item.get_definition())
204
+ elif cn == 'PackageMember':
205
+ try:
206
+ body.append(next(member_iter))
207
+ except StopIteration:
208
+ break # children shrank; drop stale members
209
+ # children added programmatically beyond recorded slots
210
+ body.extend(member_iter)
211
+ else:
212
+ body = child_defs
195
213
 
196
214
  if len(body) > 0:
197
215
  self.grammar = RootNamespace(
@@ -567,22 +585,43 @@ class Package(Searchable):
567
585
  def _ensure_body(self):
568
586
  """Rebuild the package grammar body from current children and imports.
569
587
 
570
- Serializes all child elements into PackageMember wrappers and
571
- preserves any existing Import or AliasMember entries.
588
+ Serializes all child elements into PackageMember wrappers while
589
+ preserving ``Import`` and ``AliasMember`` declarations **at their
590
+ original source positions** (v0.58.0). The existing grammar body
591
+ is used as the ordering template: each ``PackageMember`` slot is
592
+ refilled with the fresh serialization of the next child, and any
593
+ children beyond the recorded slots are appended at the end.
572
594
  """
573
- body = []
595
+ # Serialize all current children into PackageMember definitions
596
+ child_defs = []
574
597
  for abc in self.children:
575
598
  v = abc._get_definition(child="PackageBody")
576
599
  if isinstance(v, list):
577
600
  for subchild in v:
578
- body.append(PackageMember(subchild).get_definition())
601
+ child_defs.append(PackageMember(subchild).get_definition())
579
602
  else:
580
- body.append(PackageMember(v).get_definition())
603
+ child_defs.append(PackageMember(v).get_definition())
581
604
 
582
- if hasattr(self.grammar, 'body') and self.grammar.body:
583
- for child in self.grammar.body.children:
584
- if child.__class__.__name__ in ('Import', 'AliasMember'):
585
- body.append(child.get_definition())
605
+ body_children = getattr(
606
+ getattr(getattr(self, 'grammar', None), 'body', None), 'children', None
607
+ )
608
+
609
+ body = []
610
+ if body_children:
611
+ member_iter = iter(child_defs)
612
+ for item in body_children:
613
+ cn = item.__class__.__name__
614
+ if cn in ('Import', 'AliasMember'):
615
+ body.append(item.get_definition())
616
+ elif cn == 'PackageMember':
617
+ try:
618
+ body.append(next(member_iter))
619
+ except StopIteration:
620
+ break # children shrank; drop stale members
621
+ # children added programmatically beyond recorded slots
622
+ body.extend(member_iter)
623
+ else:
624
+ body = child_defs
586
625
 
587
626
  if len(body) > 0:
588
627
  self.grammar.body = PackageBody(
@@ -107,8 +107,9 @@ print(f"\nColors as list: {colors}")
107
107
  # 5. Type Resolution
108
108
  # =============================================================================
109
109
 
110
- # The type is stored in the grammar structure.
111
- # typedby may not be populated during load_from_grammar (known issue).
110
+ # The declared type name is preserved on load (v0.57.0): use
111
+ # attr.typed_by_name. The resolved definition object (`typedby`) still
112
+ # requires programmatic wiring via set_typed_by().
112
113
 
113
114
  model = loads('''
114
115
  package Example {
@@ -122,15 +123,16 @@ package Example {
122
123
  vehicle = model.children[0].children[0]
123
124
 
124
125
  for attr in vehicle.children:
125
- # Access grammar to see type info
126
- print(f"{attr.name}: grammar type = {type(attr.grammar).__name__}")
126
+ # typed_by_name carries the declared type name since v0.57.0
127
+ print(f"{attr.name}: declared type = {attr.typed_by_name}")
127
128
 
128
129
  # =============================================================================
129
130
  # 6. Attribute Multiplicity
130
131
  # =============================================================================
131
132
 
132
133
  # Attributes can have multiplicity like Real[3] for arrays
133
- # The type information is stored in the grammar but not yet exposed via Python API
134
+ # Note: top-level (package-level) attribute multiplicity is still a known
135
+ # visitor gap; multiplicity on attributes inside definitions is preserved.
134
136
 
135
137
  model = loads('''
136
138
  package Example {
@@ -97,7 +97,9 @@ print(f"\nAfter setting: {attr.get_value()}")
97
97
  # 5. Checking Type
98
98
  # =============================================================================
99
99
 
100
- # NOTE: typedby is populated during load_from_grammar but may need verification
100
+ # NOTE (v0.57.0): the declared type name is preserved on load via
101
+ # `typed_by_name`; the resolved definition object (`typedby`) requires
102
+ # programmatic wiring via set_typed_by().
101
103
 
102
104
  model = loads('''
103
105
  package Example {
@@ -111,11 +113,11 @@ package Example {
111
113
  vehicle = model.children[0].children[0]
112
114
 
113
115
  for attr in vehicle.children:
114
- if attr.typedby:
115
- print(f"{attr.name} : {attr.typedby.name}")
116
+ if attr.typed_by_name:
117
+ print(f"{attr.name} : {attr.typed_by_name}")
116
118
  else:
117
119
  # Access type from grammar structure
118
- print(f"{attr.name} : (type in grammar, typedby not populated)")
120
+ print(f"{attr.name} : (type in grammar, typing not declared)")
119
121
 
120
122
  # =============================================================================
121
123
  # 6. Nested Parts
@@ -8380,15 +8380,16 @@ class MultiplicityPart:
8380
8380
  def dump(self):
8381
8381
  output = [child.dump() for child in self.children]
8382
8382
 
8383
- if self.isOrdered and not self.isOrdered2:
8383
+ # isOrdered/isOrdered2 are populated from the same dict field during
8384
+ # round-trip (the ANTLR dict carries a single isOrdered flag), so the
8385
+ # X OR Y logic below never fired — silently dropping the keyword on
8386
+ # `attribute x[3] ordered;`. Emit whichever flag is set (v0.59.0).
8387
+ if self.isOrdered or self.isOrdered2:
8384
8388
  output.append("ordered")
8385
8389
 
8386
8390
  if self.isNonunique or self.isNonunique2:
8387
8391
  output.append("nonunique")
8388
8392
 
8389
- if self.isOrdered2 and not self.isOrdered:
8390
- output.append("ordered")
8391
-
8392
8393
  return " ".join(output)
8393
8394
 
8394
8395
  def get_definition(self):
@@ -167,6 +167,13 @@ class Usage(Searchable):
167
167
  self.typedby = None
168
168
  self._is_definition = None # overridden via the setter below
169
169
  self.parent = None
170
+ # Re-declaration chains captured from grammar (v0.57.0).
171
+ # Previously only Action initialized these; all other usage kinds
172
+ # loaded from grammar lost their typing / subsetting information.
173
+ self._typed_by_name = None
174
+ self._specializes_names = []
175
+ self._redefined_refs = []
176
+ self._referenced_refs = []
170
177
 
171
178
  @property
172
179
  def is_definition(self):
@@ -354,6 +361,22 @@ class Usage(Searchable):
354
361
  return rn
355
362
  return ""
356
363
 
364
+ @property
365
+ def typed_by_name(self):
366
+ """The declared type of this usage as a name string (v0.57.0).
367
+
368
+ Populated by ``load_from_grammar`` from the grammar's feature
369
+ specialization (``part engine : Engine`` → ``"Engine"``,
370
+ ``attribute mass : ScalarValues::Real`` → ``"ScalarValues::Real"``).
371
+ ``None`` when the element was not loaded from grammar or carries
372
+ no typing relationship.
373
+
374
+ Note: this is the *declared name*; ``self.typedby`` holds the
375
+ resolved definition object (only when set programmatically via
376
+ ``set_typed_by`` or when a second resolution pass has run).
377
+ """
378
+ return getattr(self, '_typed_by_name', None)
379
+
357
380
  def _get_definition(self, child=None):
358
381
  """Build the grammar tree dict for this element.
359
382
 
@@ -1038,6 +1061,96 @@ class Usage(Searchable):
1038
1061
  c.parent = self
1039
1062
  self.children.append(c)
1040
1063
 
1064
+ self._extract_specialization_info(grammar)
1065
+
1066
+ return self
1067
+
1068
+ def _extract_specialization_info(self, grammar):
1069
+ """Capture Typings / Subsettings / Redefinitions / References names
1070
+ from the grammar's feature specialization so ``_typed_by_name`` and
1071
+ friends are populated on every usage kind loaded from grammar
1072
+ (v0.57.0 — previously only ``Action`` did this, leaving ``Part``,
1073
+ ``Attribute``, ``Item``, ``Port``, etc. without typing information
1074
+ on the public-API object even though the grammar object kept it).
1075
+
1076
+ Handles both grammar layouts:
1077
+ - usage-style: ``grammar.usage.declaration.declaration.specialization``
1078
+ (PartUsage, AttributeUsage, ItemUsage, PortUsage, ...)
1079
+ - behavior-style: ``grammar.declaration.declaration.declaration.specialization``
1080
+ (ActionUsage, ...)
1081
+ """
1082
+ spec = None
1083
+ g = getattr(grammar, 'grammar', grammar)
1084
+ ud = getattr(g, 'usage', None)
1085
+ if ud is not None and getattr(ud, 'declaration', None) is not None:
1086
+ d = ud.declaration
1087
+ if not hasattr(d, 'declaration'):
1088
+ spec = getattr(d, 'specialization', None)
1089
+ else:
1090
+ inner = getattr(d, 'declaration', None)
1091
+ spec = getattr(inner, 'specialization', None) if inner is not None else None
1092
+ else:
1093
+ node = getattr(g, 'declaration', None)
1094
+ for _ in range(3):
1095
+ if node is None or hasattr(node, 'specialization'):
1096
+ break
1097
+ node = getattr(node, 'declaration', None)
1098
+ spec = getattr(node, 'specialization', None) if node is not None else None
1099
+ if spec is None:
1100
+ return
1101
+ for fs in getattr(spec, 'specializations', None) or []:
1102
+ rel = getattr(fs, 'relationship', None)
1103
+ kind = rel.__class__.__name__ if rel is not None else None
1104
+ if kind == 'Typings':
1105
+ tb = getattr(rel, 'typing', None)
1106
+ for ft in getattr(tb, 'relationships', []) or []:
1107
+ rel2 = getattr(ft, 'relationship', None)
1108
+ ftype = getattr(rel2, 'type', None)
1109
+ qn = getattr(ftype, 'type', None)
1110
+ names = getattr(qn, 'names', None)
1111
+ if names:
1112
+ self._typed_by_name = '::'.join(names)
1113
+ break
1114
+ elements = getattr(ftype, 'elements', None) or []
1115
+ seg_names = []
1116
+ for el in elements:
1117
+ if hasattr(el, 'names') and el.names:
1118
+ seg_names.extend(el.names)
1119
+ elif hasattr(el, 'feature'):
1120
+ for seg in getattr(el.feature, 'children', []) or []:
1121
+ cf = getattr(seg, 'chainingFeature', None)
1122
+ if cf is not None and getattr(cf, 'names', None):
1123
+ seg_names.extend(cf.names)
1124
+ if seg_names:
1125
+ self._typed_by_name = '.'.join(seg_names)
1126
+ break
1127
+ elif kind in ('Subsettings', 'Redefinitions', 'References'):
1128
+ target = (
1129
+ self._specializes_names if kind == 'Subsettings'
1130
+ else self._redefined_refs if kind == 'Redefinitions'
1131
+ else self._referenced_refs
1132
+ )
1133
+ for child in getattr(rel, 'children', None) or []:
1134
+ qn = (
1135
+ getattr(child, 'redefinedFeature', None)
1136
+ or getattr(child, 'referencedFeature', None)
1137
+ )
1138
+ if qn is not None and getattr(qn, 'names', None):
1139
+ target.append('::'.join(qn.names))
1140
+ continue
1141
+ elements = getattr(child, 'elements', None) or []
1142
+ seg_names = []
1143
+ for el in elements:
1144
+ if hasattr(el, 'names') and el.names:
1145
+ seg_names.extend(el.names)
1146
+ elif hasattr(el, 'feature'):
1147
+ for seg in getattr(el.feature, 'children', []) or []:
1148
+ cf = getattr(seg, 'chainingFeature', None)
1149
+ if cf is not None and getattr(cf, 'names', None):
1150
+ seg_names.extend(cf.names)
1151
+ if seg_names:
1152
+ target.append('.'.join(seg_names))
1153
+
1041
1154
  return self
1042
1155
 
1043
1156
  def add_directed_feature(self, direction, name=str(uuidlib.uuid4())):
@@ -1131,25 +1244,31 @@ def _load_behavior_child(parent, inner, inner_name):
1131
1244
  return name_obj.getText()
1132
1245
  return None
1133
1246
 
1247
+ # Behavior usages created without load_from_grammar still capture their
1248
+ # typing from the grammar's feature specialization (v0.57.0).
1134
1249
  if inner_name == "AssertConstraintUsage":
1135
1250
  c = Constraint()
1136
1251
  c.grammar = inner
1137
1252
  c.name = _name_from_declaration(inner)
1253
+ c._extract_specialization_info(inner)
1138
1254
  return c
1139
1255
  if inner_name == "ConstraintUsage":
1140
1256
  c = Constraint()
1141
1257
  c.grammar = inner
1142
1258
  c.name = _name_from_declaration(inner)
1259
+ c._extract_specialization_info(inner)
1143
1260
  return c
1144
1261
  if inner_name == "CalculationUsage":
1145
1262
  c = Calculation()
1146
1263
  c.grammar = inner
1147
1264
  c.name = _name_from_declaration(inner)
1265
+ c._extract_specialization_info(inner)
1148
1266
  return c
1149
1267
  if inner_name == "StateUsage":
1150
1268
  c = State()
1151
1269
  c.grammar = inner
1152
1270
  c.name = _name_from_declaration(inner)
1271
+ c._extract_specialization_info(inner)
1153
1272
  return c
1154
1273
  if inner_name == "ActionUsage":
1155
1274
  c = Action(grammar=inner).load_from_grammar(inner)
@@ -1158,16 +1277,19 @@ def _load_behavior_child(parent, inner, inner_name):
1158
1277
  c = Requirement()
1159
1278
  c.grammar = inner
1160
1279
  c.name = _name_from_declaration(inner)
1280
+ c._extract_specialization_info(inner)
1161
1281
  return c
1162
1282
  if inner_name == "SatisfyRequirementUsage":
1163
1283
  c = Requirement()
1164
1284
  c.grammar = inner
1165
1285
  c.name = _name_from_declaration(inner)
1286
+ c._extract_specialization_info(inner)
1166
1287
  return c
1167
1288
  if inner_name == "AllocationUsage":
1168
1289
  c = Allocation()
1169
1290
  c.grammar = inner
1170
1291
  c.name = _name_from_declaration(inner)
1292
+ c._extract_specialization_info(inner)
1171
1293
  return c
1172
1294
  return None
1173
1295
 
@@ -1910,7 +2032,9 @@ class Interface(Usage):
1910
2032
  feat_decl = inner_decl.declaration
1911
2033
  if hasattr(feat_decl, 'identification') and feat_decl.identification:
1912
2034
  self.name = feat_decl.identification.declaredName
1913
-
2035
+
2036
+ self._extract_specialization_info(grammar)
2037
+
1914
2038
  return self
1915
2039
 
1916
2040
 
@@ -2099,73 +2223,6 @@ class Action(Usage):
2099
2223
 
2100
2224
  return self
2101
2225
 
2102
- def _extract_specialization_info(self, grammar):
2103
- """Capture Typings / Subsettings / Redefinitions / References names
2104
- from the grammar's feature specialization so ``dump()`` can render
2105
- them (v0.41.0)."""
2106
- fd = None
2107
- if getattr(grammar, 'declaration', None) is not None:
2108
- ud = getattr(grammar.declaration, 'declaration', None)
2109
- if ud is not None:
2110
- fd = getattr(ud, 'declaration', None)
2111
- spec = getattr(fd, 'specialization', None) if fd is not None else None
2112
- if spec is None:
2113
- return
2114
- for fs in getattr(spec, 'specializations', None) or []:
2115
- rel = getattr(fs, 'relationship', None)
2116
- kind = rel.__class__.__name__ if rel is not None else None
2117
- if kind == 'Typings':
2118
- tb = getattr(rel, 'typing', None)
2119
- for ft in getattr(tb, 'relationships', []) or []:
2120
- rel2 = getattr(ft, 'relationship', None)
2121
- ftype = getattr(rel2, 'type', None)
2122
- qn = getattr(ftype, 'type', None)
2123
- names = getattr(qn, 'names', None)
2124
- if names:
2125
- self._typed_by_name = '::'.join(names)
2126
- break
2127
- elements = getattr(ftype, 'elements', None) or []
2128
- seg_names = []
2129
- for el in elements:
2130
- if hasattr(el, 'names') and el.names:
2131
- seg_names.extend(el.names)
2132
- elif hasattr(el, 'feature'):
2133
- for seg in getattr(el.feature, 'children', []) or []:
2134
- cf = getattr(seg, 'chainingFeature', None)
2135
- if cf is not None and getattr(cf, 'names', None):
2136
- seg_names.extend(cf.names)
2137
- if seg_names:
2138
- self._typed_by_name = '.'.join(seg_names)
2139
- break
2140
- elif kind in ('Subsettings', 'Redefinitions', 'References'):
2141
- target = (
2142
- self._specializes_names if kind == 'Subsettings'
2143
- else self._redefined_refs if kind == 'Redefinitions'
2144
- else self._referenced_refs
2145
- )
2146
- for child in getattr(rel, 'children', None) or []:
2147
- qn = (
2148
- getattr(child, 'redefinedFeature', None)
2149
- or getattr(child, 'referencedFeature', None)
2150
- )
2151
- if qn is not None and getattr(qn, 'names', None):
2152
- target.append('::'.join(qn.names))
2153
- continue
2154
- elements = getattr(child, 'elements', None) or []
2155
- seg_names = []
2156
- for el in elements:
2157
- if hasattr(el, 'names') and el.names:
2158
- seg_names.extend(el.names)
2159
- elif hasattr(el, 'feature'):
2160
- for seg in getattr(el.feature, 'children', []) or []:
2161
- cf = getattr(seg, 'chainingFeature', None)
2162
- if cf is not None and getattr(cf, 'names', None):
2163
- seg_names.extend(cf.names)
2164
- if seg_names:
2165
- target.append('.'.join(seg_names))
2166
-
2167
- return self
2168
-
2169
2226
  def _extract_initial_node(self, node):
2170
2227
  """Extract the source name from an InitialNodeMember."""
2171
2228
  if hasattr(node, 'child') and node.child:
@@ -2766,7 +2823,9 @@ class UseCase(Usage):
2766
2823
  feat_decl = inner_decl.declaration
2767
2824
  if hasattr(feat_decl, 'identification') and feat_decl.identification:
2768
2825
  self.name = feat_decl.identification.declaredName
2769
-
2826
+
2827
+ self._extract_specialization_info(grammar)
2828
+
2770
2829
  return self
2771
2830
 
2772
2831
 
@@ -3044,7 +3103,9 @@ class Requirement(Usage):
3044
3103
  pass # could extract subject
3045
3104
  elif child_class == "ActorMember":
3046
3105
  pass # could extract actors
3047
-
3106
+
3107
+ self._extract_specialization_info(grammar)
3108
+
3048
3109
  return self
3049
3110
 
3050
3111
  def _extract_nested_requirements(self, def_body_item):
@@ -3611,7 +3672,9 @@ class State(_BehaviorUsage):
3611
3672
  decl = decl.declaration
3612
3673
  if hasattr(decl, 'identification') and decl.identification:
3613
3674
  self.name = decl.identification.declaredName
3614
-
3675
+
3676
+ self._extract_specialization_info(grammar)
3677
+
3615
3678
  # Extract nested states, transitions, and actions from body
3616
3679
  # StateDefinition: grammar.body -> StateDefBody -> children -> StateBodyPart -> children -> items
3617
3680
  # StateUsage: grammar.body -> StateUsageBody -> children -> StateDefBody -> children -> StateBodyPart -> children -> items
File without changes
File without changes
File without changes