sysmlpy 0.67.0__tar.gz → 0.69.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 (159) hide show
  1. sysmlpy-0.67.0/README.md → sysmlpy-0.69.0/PKG-INFO +55 -1
  2. sysmlpy-0.67.0/PKG-INFO → sysmlpy-0.69.0/README.md +25 -29
  3. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/pyproject.toml +3 -1
  4. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/__init__.py +19 -6
  5. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/__main__.py +80 -1
  6. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/antlr_visitor.py +119 -20
  7. sysmlpy-0.69.0/src/sysmlpy/boxes_view.py +1689 -0
  8. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/grammar/classes.py +8 -0
  9. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/plantuml.py +776 -96
  10. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/semantic.py +97 -0
  11. sysmlpy-0.69.0/src/sysmlpy/sim.py +781 -0
  12. sysmlpy-0.67.0/src/sysmlpy/boxes_view.py +0 -841
  13. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/LICENSE +0 -0
  14. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/antlr/README.md +0 -0
  15. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/antlr/SysMLv2Lexer.interp +0 -0
  16. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/antlr/SysMLv2Lexer.py +0 -0
  17. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/antlr/SysMLv2Lexer.tokens +0 -0
  18. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/antlr/SysMLv2Parser.interp +0 -0
  19. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/antlr/SysMLv2Parser.py +0 -0
  20. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/antlr/SysMLv2Parser.tokens +0 -0
  21. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/antlr/SysMLv2ParserListener.py +0 -0
  22. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/antlr/SysMLv2ParserVisitor.py +0 -0
  23. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/antlr/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.interp +0 -0
  24. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/antlr/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.py +0 -0
  25. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/antlr/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.tokens +0 -0
  26. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/antlr_parser.py +0 -0
  27. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/definition.py +0 -0
  28. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/evaluator.py +0 -0
  29. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/examples/attribute_values.py +0 -0
  30. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/examples/part_attributes.py +0 -0
  31. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/examples/tuples_sequences.py +0 -0
  32. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/formatting.py +0 -0
  33. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/grammar/antlr4/README.md +0 -0
  34. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.g4 +0 -0
  35. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.interp +0 -0
  36. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.py +0 -0
  37. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.tokens +0 -0
  38. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.g4 +0 -0
  39. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.interp +0 -0
  40. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.py +0 -0
  41. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.tokens +0 -0
  42. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/grammar/antlr4/SysMLv2ParserListener.py +0 -0
  43. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/grammar/antlr4/SysMLv2ParserVisitor.py +0 -0
  44. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/grammar/antlr4/desc.xml +0 -0
  45. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/grammar/antlr4/examples/camera.sysml +0 -0
  46. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/grammar/antlr4/examples/toaster-system.sysml +0 -0
  47. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/grammar/antlr4/examples/vehicle-model.sysml +0 -0
  48. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/grammar/antlr4/pom.xml +0 -0
  49. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/interchange.py +0 -0
  50. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/LICENSE +0 -0
  51. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/README.md +0 -0
  52. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/__init__.py +0 -0
  53. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Analysis/AnalysisTooling.sysml +0 -0
  54. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Analysis/SampledFunctions.sysml +0 -0
  55. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Analysis/StateSpaceRepresentation.sysml +0 -0
  56. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Analysis/TradeStudies.sysml +0 -0
  57. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Cause and Effect/CausationConnections.sysml +0 -0
  58. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Cause and Effect/CauseAndEffect.sysml +0 -0
  59. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Geometry/ShapeItems.sysml +0 -0
  60. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Geometry/SpatialItems.sysml +0 -0
  61. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Metadata/ImageMetadata.sysml +0 -0
  62. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Metadata/ModelingMetadata.sysml +0 -0
  63. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Metadata/ParametersOfInterestMetadata.sysml +0 -0
  64. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Metadata/RiskMetadata.sysml +0 -0
  65. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/ISQ.sysml +0 -0
  66. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/ISQAcoustics.sysml +0 -0
  67. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/ISQAtomicNuclear.sysml +0 -0
  68. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/ISQBase.sysml +0 -0
  69. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/ISQCharacteristicNumbers.sysml +0 -0
  70. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/ISQChemistryMolecular.sysml +0 -0
  71. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/ISQCondensedMatter.sysml +0 -0
  72. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/ISQElectromagnetism.sysml +0 -0
  73. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/ISQInformation.sysml +0 -0
  74. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/ISQLight.sysml +0 -0
  75. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/ISQMechanics.sysml +0 -0
  76. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/ISQSpaceTime.sysml +0 -0
  77. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/ISQThermodynamics.sysml +0 -0
  78. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/MeasurementRefCalculations.sysml +0 -0
  79. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/MeasurementReferences.sysml +0 -0
  80. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/Quantities.sysml +0 -0
  81. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/QuantityCalculations.sysml +0 -0
  82. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/SI.sysml +0 -0
  83. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/SIPrefixes.sysml +0 -0
  84. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/TensorCalculations.sysml +0 -0
  85. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/Time.sysml +0 -0
  86. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/USCustomaryUnits.sysml +0 -0
  87. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/VectorCalculations.sysml +0 -0
  88. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Requirement Derivation/DerivationConnections.sysml +0 -0
  89. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Requirement Derivation/RequirementDerivation.sysml +0 -0
  90. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/Base.kerml +0 -0
  91. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/BaseFunctions.kerml +0 -0
  92. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/BooleanFunctions.kerml +0 -0
  93. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/Clocks.kerml +0 -0
  94. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/CollectionFunctions.kerml +0 -0
  95. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/Collections.kerml +0 -0
  96. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/ComplexFunctions.kerml +0 -0
  97. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/ControlFunctions.kerml +0 -0
  98. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/ControlPerformances.kerml +0 -0
  99. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/DataFunctions.kerml +0 -0
  100. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/FeatureReferencingPerformances.kerml +0 -0
  101. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/IntegerFunctions.kerml +0 -0
  102. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/KerML.kerml +0 -0
  103. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/Links.kerml +0 -0
  104. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/Metaobjects.kerml +0 -0
  105. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/NaturalFunctions.kerml +0 -0
  106. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/NumericalFunctions.kerml +0 -0
  107. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/Objects.kerml +0 -0
  108. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/Observation.kerml +0 -0
  109. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/OccurrenceFunctions.kerml +0 -0
  110. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/Occurrences.kerml +0 -0
  111. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/Performances.kerml +0 -0
  112. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/RationalFunctions.kerml +0 -0
  113. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/RealFunctions.kerml +0 -0
  114. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/ScalarFunctions.kerml +0 -0
  115. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/ScalarValues.kerml +0 -0
  116. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/SequenceFunctions.kerml +0 -0
  117. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/SpatialFrames.kerml +0 -0
  118. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/StatePerformances.kerml +0 -0
  119. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/StringFunctions.kerml +0 -0
  120. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/Transfers.kerml +0 -0
  121. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/TransitionPerformances.kerml +0 -0
  122. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/TrigFunctions.kerml +0 -0
  123. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/Triggers.kerml +0 -0
  124. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/VectorFunctions.kerml +0 -0
  125. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/VectorValues.kerml +0 -0
  126. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/Actions.sysml +0 -0
  127. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/Allocations.sysml +0 -0
  128. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/AnalysisCases.sysml +0 -0
  129. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/Attributes.sysml +0 -0
  130. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/Calculations.sysml +0 -0
  131. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/Cases.sysml +0 -0
  132. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/Connections.sysml +0 -0
  133. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/Constraints.sysml +0 -0
  134. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/Flows.sysml +0 -0
  135. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/Interfaces.sysml +0 -0
  136. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/Items.sysml +0 -0
  137. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/Metadata.sysml +0 -0
  138. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/Parts.sysml +0 -0
  139. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/Ports.sysml +0 -0
  140. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/Requirements.sysml +0 -0
  141. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/StandardViewDefinitions.sysml +0 -0
  142. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/States.sysml +0 -0
  143. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/SysML.sysml +0 -0
  144. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/UseCases.sysml +0 -0
  145. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/VerificationCases.sysml +0 -0
  146. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/Views.sysml +0 -0
  147. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/lsp/__init__.py +0 -0
  148. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/lsp/__main__.py +0 -0
  149. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/lsp/protocol.py +0 -0
  150. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/lsp/server.py +0 -0
  151. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/lsp/stdio.py +0 -0
  152. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/navigate.py +0 -0
  153. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/project.py +0 -0
  154. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/spreadsheet.py +0 -0
  155. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/store.py +0 -0
  156. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/traceability.py +0 -0
  157. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/us_customary_units.txt +0 -0
  158. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/usage.py +0 -0
  159. {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/validator.py +0 -0
@@ -1,3 +1,32 @@
1
+ Metadata-Version: 2.4
2
+ Name: sysmlpy
3
+ Version: 0.69.0
4
+ Summary:
5
+ License-File: LICENSE
6
+ Author: Jon R. Fox (mycr0ft)
7
+ Author-email: jon.fox@drfox.com
8
+ Requires-Python: >=3.9,<4.0
9
+ Classifier: Programming Language :: Python :: 3
10
+ Classifier: Programming Language :: Python :: 3.9
11
+ Classifier: Programming Language :: Python :: 3.10
12
+ Classifier: Programming Language :: Python :: 3.11
13
+ Classifier: Programming Language :: Python :: 3.12
14
+ Classifier: Programming Language :: Python :: 3.13
15
+ Classifier: Programming Language :: Python :: 3.14
16
+ Provides-Extra: graph
17
+ Provides-Extra: kuzu
18
+ Provides-Extra: sim
19
+ Provides-Extra: xlsx
20
+ Requires-Dist: antlr4-python3-runtime (>=4.13)
21
+ Requires-Dist: arrow (>=1.4.0,<2.0.0)
22
+ Requires-Dist: kuzu (>=0.7,<0.12) ; extra == "kuzu"
23
+ Requires-Dist: networkx (>=3.0) ; extra == "graph"
24
+ Requires-Dist: openpyxl (>=3.1) ; extra == "xlsx"
25
+ Requires-Dist: pint (>=0.24)
26
+ Requires-Dist: pyyaml (>=6.0)
27
+ Requires-Dist: transitions (>=0.9,<0.10) ; extra == "sim"
28
+ Description-Content-Type: text/markdown
29
+
1
30
  # sysmlpy
2
31
  [![PyPI version](https://badge.fury.io/py/sysmlpy.svg)](https://badge.fury.io/py/sysmlpy)[![PyPI status](https://img.shields.io/pypi/status/sysmlpy.svg)](https://pypi.python.org/pypi/sysmlpy/)[![MIT license](https://img.shields.io/badge/License-MIT-blue.svg)](https://lbesson.mit-license.org/)
3
32
 
@@ -577,7 +606,7 @@ print(as_package_view(model, style="bw"))
577
606
  ```
578
607
 
579
608
  #### Action Flow View (AFV) — `as_action_flow_view()`
580
- Corresponds to SysML v2 ``ActionFlowView`` (short name ``afv``). Shows actions with their control and object flows. Auto-includes connected flow elements.
609
+ Corresponds to SysML v2 ``ActionFlowView`` (short name ``afv``). Shows actions with their control and object flows. Auto-includes connected flow elements. Control nodes render too: `first start` → solid initial dot, `decide`/`merge`/`fork`/`join` → hexagon nodes, `done`/`terminate` targets → final circle, with dotted succession edges (`..>`) and guard conditions as labels.
581
610
 
582
611
  ![Action Flow View](docs/plantuml-examples/10-action-flow-view.png)
583
612
 
@@ -586,6 +615,30 @@ from sysmlpy.plantuml import as_action_flow_view
586
615
  print(as_action_flow_view(model, style="bw"))
587
616
  ```
588
617
 
618
+ #### Boxes Views — Java-free braille + SVG (v0.68.0)
619
+ Native text/graphics rendering through the sibling `diagramboxes`
620
+ package — no PlantUML/Java required. Interconnection, action flow and
621
+ state transition views render to Unicode-braille text (terminal) or
622
+ SVG. Monochrome by design (color-vision friendly).
623
+
624
+ ![Interconnection View (boxes)](docs/plantuml-examples/20-interconnection-boxes.svg)
625
+
626
+ ```python
627
+ from sysmlpy.boxes_view import (
628
+ render_interconnection_view_boxes, # iv: parts + ports + connection edges
629
+ render_action_flow_view_boxes, # afv: actions + in/out ports + flows
630
+ render_state_transition_view, # stv: nested composite state boxes
631
+ )
632
+ print(render_interconnection_view_boxes(model))
633
+ ```
634
+
635
+ ```
636
+ ⡰⠊⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠲⡀ ⡰⠊⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠲⡀
637
+ ⡇ «part» ⡇ ⡇ «part» ⡇
638
+ ⡇ engine ⡇ ⡇ pump ⡇
639
+ ⡇ ⡇ ⡇ ⡇
640
+ ```
641
+
589
642
  #### Interconnection View (IV) — `as_interconnection_view()` / `as_interconnection_diagram()`
590
643
  Corresponds to SysML v2 ``InterconnectionView`` (short name ``iv``). Focuses on connectors, bindings, and flow paths between ports and parts.
591
644
 
@@ -750,3 +803,4 @@ Two companion tools for the SysML v2 community, created by the same author:
750
803
 
751
804
  ## License
752
805
  sysmlpy is released under the MIT license, hence allowing commercial use of the library.
806
+
@@ -1,30 +1,3 @@
1
- Metadata-Version: 2.4
2
- Name: sysmlpy
3
- Version: 0.67.0
4
- Summary:
5
- License-File: LICENSE
6
- Author: Jon R. Fox (mycr0ft)
7
- Author-email: jon.fox@drfox.com
8
- Requires-Python: >=3.9,<4.0
9
- Classifier: Programming Language :: Python :: 3
10
- Classifier: Programming Language :: Python :: 3.9
11
- Classifier: Programming Language :: Python :: 3.10
12
- Classifier: Programming Language :: Python :: 3.11
13
- Classifier: Programming Language :: Python :: 3.12
14
- Classifier: Programming Language :: Python :: 3.13
15
- Classifier: Programming Language :: Python :: 3.14
16
- Provides-Extra: graph
17
- Provides-Extra: kuzu
18
- Provides-Extra: xlsx
19
- Requires-Dist: antlr4-python3-runtime (>=4.13)
20
- Requires-Dist: arrow (>=1.4.0,<2.0.0)
21
- Requires-Dist: kuzu (>=0.7,<0.12) ; extra == "kuzu"
22
- Requires-Dist: networkx (>=3.0) ; extra == "graph"
23
- Requires-Dist: openpyxl (>=3.1) ; extra == "xlsx"
24
- Requires-Dist: pint (>=0.24)
25
- Requires-Dist: pyyaml (>=6.0)
26
- Description-Content-Type: text/markdown
27
-
28
1
  # sysmlpy
29
2
  [![PyPI version](https://badge.fury.io/py/sysmlpy.svg)](https://badge.fury.io/py/sysmlpy)[![PyPI status](https://img.shields.io/pypi/status/sysmlpy.svg)](https://pypi.python.org/pypi/sysmlpy/)[![MIT license](https://img.shields.io/badge/License-MIT-blue.svg)](https://lbesson.mit-license.org/)
30
3
 
@@ -604,7 +577,7 @@ print(as_package_view(model, style="bw"))
604
577
  ```
605
578
 
606
579
  #### Action Flow View (AFV) — `as_action_flow_view()`
607
- Corresponds to SysML v2 ``ActionFlowView`` (short name ``afv``). Shows actions with their control and object flows. Auto-includes connected flow elements.
580
+ Corresponds to SysML v2 ``ActionFlowView`` (short name ``afv``). Shows actions with their control and object flows. Auto-includes connected flow elements. Control nodes render too: `first start` → solid initial dot, `decide`/`merge`/`fork`/`join` → hexagon nodes, `done`/`terminate` targets → final circle, with dotted succession edges (`..>`) and guard conditions as labels.
608
581
 
609
582
  ![Action Flow View](docs/plantuml-examples/10-action-flow-view.png)
610
583
 
@@ -613,6 +586,30 @@ from sysmlpy.plantuml import as_action_flow_view
613
586
  print(as_action_flow_view(model, style="bw"))
614
587
  ```
615
588
 
589
+ #### Boxes Views — Java-free braille + SVG (v0.68.0)
590
+ Native text/graphics rendering through the sibling `diagramboxes`
591
+ package — no PlantUML/Java required. Interconnection, action flow and
592
+ state transition views render to Unicode-braille text (terminal) or
593
+ SVG. Monochrome by design (color-vision friendly).
594
+
595
+ ![Interconnection View (boxes)](docs/plantuml-examples/20-interconnection-boxes.svg)
596
+
597
+ ```python
598
+ from sysmlpy.boxes_view import (
599
+ render_interconnection_view_boxes, # iv: parts + ports + connection edges
600
+ render_action_flow_view_boxes, # afv: actions + in/out ports + flows
601
+ render_state_transition_view, # stv: nested composite state boxes
602
+ )
603
+ print(render_interconnection_view_boxes(model))
604
+ ```
605
+
606
+ ```
607
+ ⡰⠊⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠲⡀ ⡰⠊⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠲⡀
608
+ ⡇ «part» ⡇ ⡇ «part» ⡇
609
+ ⡇ engine ⡇ ⡇ pump ⡇
610
+ ⡇ ⡇ ⡇ ⡇
611
+ ```
612
+
616
613
  #### Interconnection View (IV) — `as_interconnection_view()` / `as_interconnection_diagram()`
617
614
  Corresponds to SysML v2 ``InterconnectionView`` (short name ``iv``). Focuses on connectors, bindings, and flow paths between ports and parts.
618
615
 
@@ -777,4 +774,3 @@ Two companion tools for the SysML v2 community, created by the same author:
777
774
 
778
775
  ## License
779
776
  sysmlpy is released under the MIT license, hence allowing commercial use of the library.
780
-
@@ -6,7 +6,7 @@ build-backend = "poetry.core.masonry.api"
6
6
 
7
7
  [project]
8
8
  name = "sysmlpy"
9
- version = "0.67.0"
9
+ version = "0.69.0"
10
10
  description = ""
11
11
  authors = [{ name = "Jon R. Fox (mycr0ft)", email = "jon.fox@drfox.com" }]
12
12
  readme = "README.md"
@@ -21,11 +21,13 @@ networkx = { version = ">=3.0", optional = true }
21
21
  kuzu = { version = ">=0.7,<0.12", optional = true }
22
22
  openpyxl = { version = ">=3.1", optional = true }
23
23
  arrow = "^1.4.0"
24
+ transitions = {version = "^0.9", optional = true}
24
25
 
25
26
  [tool.poetry.extras]
26
27
  graph = ["networkx"]
27
28
  kuzu = ["kuzu"]
28
29
  xlsx = ["openpyxl"]
30
+ sim = ["transitions"]
29
31
 
30
32
  [tool.poetry.scripts]
31
33
  sysmlpy = "sysmlpy.__main__:main"
@@ -28,12 +28,13 @@ __all__ = [
28
28
  "analyze", "AnalysisResult", "SemanticIssue", "SemanticAnalyzer",
29
29
  "SysMLSyntaxError", "PartialParseError",
30
30
  "loads_partial", "load_partial",
31
- # boxes-backed optional renderers (require pip install -e ../boxes)
31
+ # diagramboxes-backed optional renderers (the sibling package formerly
32
+ # named `boxes` — renamed in its v0.3.0; install with pip install -e ../boxes)
32
33
  "as_state_transition_view_boxes", "render_state_transition_view",
33
34
  "render_state_transition_view_svg", "boxes_view",
34
35
  ]
35
36
  __author__ = "Jon Fox"
36
- __version__ = "0.67.0"
37
+ __version__ = "0.69.0"
37
38
 
38
39
  from sysmlpy.usage import (
39
40
  Item, Attribute, Part, Port, Action, Reference, UseCase, Requirement, Interface, Message,
@@ -413,10 +414,11 @@ from sysmlpy.semantic import analyze, AnalysisResult, SemanticIssue, SemanticAna
413
414
 
414
415
  from sysmlpy.project import load_files, load_project, load_with_dependencies
415
416
 
416
- # Optional boxes-backed state-machine renderer (lazy import on first use so
417
- # `import sysmlpy` works without `boxes` installed). The first call to any of
418
- # the functions below triggers `import sysmlpy.boxes_view`, which itself
419
- # raises ImportError with installation instructions if `boxes` is missing.
417
+ # Optional diagramboxes-backed state-machine renderer (lazy import on first
418
+ # use so `import sysmlpy` works without `diagramboxes` installed). The first
419
+ # call to any of the functions below triggers `import sysmlpy.boxes_view`,
420
+ # which itself raises ImportError with installation instructions if the
421
+ # `diagramboxes` package is missing.
420
422
  def __getattr__(name):
421
423
  if name == "boxes_view":
422
424
  import sysmlpy.boxes_view as bv
@@ -429,5 +431,16 @@ def __getattr__(name):
429
431
  fn = getattr(bv, name)
430
432
  globals()[name] = fn
431
433
  return fn
434
+ if name in ("StateSimulator", "SimulationError",
435
+ "build_state_machine", "run_tui"):
436
+ from sysmlpy import sim as _sim
437
+ fn = getattr(sim, name)
438
+ globals()[name] = fn
439
+ return fn
440
+ if name == "set_stereotype_palette":
441
+ from sysmlpy import plantuml as _pu
442
+ fn = _pu.set_stereotype_palette
443
+ globals()[name] = fn
444
+ return fn
432
445
  raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
433
446
 
@@ -31,7 +31,8 @@ import sysmlpy
31
31
  from sysmlpy import loads
32
32
 
33
33
  # Subcommand table, also used to detect the legacy flat invocation form.
34
- SUBCOMMANDS = ("parse", "analyze", "view", "trace", "export", "import", "eval", "xlsx", "format", "fmt")
34
+ SUBCOMMANDS = ("parse", "analyze", "view", "trace", "export", "import",
35
+ "eval", "xlsx", "sim", "format", "fmt")
35
36
 
36
37
 
37
38
  # ---------------------------------------------------------------------------
@@ -498,6 +499,52 @@ def _format_value(value):
498
499
  return str(value)
499
500
 
500
501
 
502
+ def cmd_sim(args) -> int:
503
+ """Simulate the state machine of a model (interactive TUI)."""
504
+ try:
505
+ from sysmlpy.sim import run_tui
506
+ except ImportError as e:
507
+ print(f"Error: {e}", file=sys.stderr)
508
+ return 2
509
+
510
+ paths = [Path(args.file)]
511
+ for p_ in _missing_files(paths):
512
+ print(f"Error: File '{p_}' not found.", file=sys.stderr)
513
+ return 2
514
+ try:
515
+ model = sysmlpy.load_files(paths, library=args.library)
516
+ except Exception as e:
517
+ print(f"Parse error: {e}", file=sys.stderr)
518
+ return 2
519
+
520
+ values = {}
521
+ for spec in args.set or []:
522
+ if "=" not in spec:
523
+ print(f"Error: --set expects NAME=VALUE, got {spec!r}",
524
+ file=sys.stderr)
525
+ return 2
526
+ name, _, raw = spec.partition("=")
527
+ values[name.strip()] = _parse_eval_value(raw)
528
+
529
+ script = [t.strip() for t in (args.run or "").split(";") if t.strip()]
530
+ try:
531
+ from sysmlpy.sim import StateSimulator, SimulationError
532
+ sim = StateSimulator(model, focus=args.focus, values=values)
533
+ except (ImportError, SimulationError) as e:
534
+ print(f"Simulation error: {e}", file=sys.stderr)
535
+ return 2
536
+ for note in sim.notes:
537
+ print(f"note: {note}")
538
+ if script:
539
+ for trigger in script:
540
+ fired = sim.send(trigger)
541
+ print(f"{trigger}: {'fired' if fired else 'blocked'} "
542
+ f"-> {sim.state!r}")
543
+ return 0
544
+ run_tui(model, focus=args.focus, values=values)
545
+ return 0
546
+
547
+
501
548
  def cmd_xlsx(args) -> int:
502
549
  """Export tabular views to an Excel workbook (v0.66.0, Goal 7)."""
503
550
  from sysmlpy.spreadsheet import write_xlsx
@@ -832,6 +879,38 @@ def build_parser() -> argparse.ArgumentParser:
832
879
  )
833
880
  p_eval.set_defaults(func=cmd_eval)
834
881
 
882
+ # -- sim (state-machine simulation, optional 'transitions' extra) -----
883
+ p_sim = sub.add_parser(
884
+ "sim",
885
+ help="Simulate a state machine (guards evaluated for real)",
886
+ description="Cameo-style state-machine simulation: fires "
887
+ "transitions on triggers, evaluates guards against "
888
+ "the model's attribute values (plus --set "
889
+ "overrides), and logs effects. Interactive TUI "
890
+ "(or a scripted run with --run). Requires the "
891
+ "'sim' extra: pip install 'sysmlpy[sim]'.",
892
+ )
893
+ p_sim.add_argument("file", help="SysML v2 file with a state machine")
894
+ p_sim.add_argument(
895
+ "--focus",
896
+ help="Name of the state def/state machine to simulate "
897
+ "(default: the first one found)",
898
+ )
899
+ p_sim.add_argument(
900
+ "--set", action="append", metavar="NAME=VALUE",
901
+ help="Starting value for guards (repeatable)",
902
+ )
903
+ p_sim.add_argument(
904
+ "--run", metavar="TRIG1;TRIG2",
905
+ help="Fire this ';'-separated trigger sequence instead of "
906
+ "entering the interactive loop",
907
+ )
908
+ p_sim.add_argument(
909
+ "-l", "--library",
910
+ help="Path to SysML v2 library files to use for parsing",
911
+ )
912
+ p_sim.set_defaults(func=cmd_sim)
913
+
835
914
  # -- xlsx (v0.66.0, Goal 7) -------------------------------------------------
836
915
  p_xlsx = sub.add_parser(
837
916
  "xlsx",
@@ -5739,37 +5739,136 @@ def _visit_guard_expression_member(ctx):
5739
5739
  }
5740
5740
 
5741
5741
 
5742
+ def _ctx_spaced_text(ctx):
5743
+ """Source text of an ANTLR context with single spaces between
5744
+ tokens (``getText()`` glues terminals: ``send Alert to logger``
5745
+ would come out ``sendAlerttologger``)."""
5746
+ if ctx is None:
5747
+ return None
5748
+
5749
+ parts = []
5750
+
5751
+ def _collect(node):
5752
+ n = node.getChildCount() if hasattr(node, "getChildCount") else 0
5753
+ if n == 0:
5754
+ text = node.getText()
5755
+ if text:
5756
+ parts.append(text)
5757
+ return
5758
+ for i in range(n):
5759
+ _collect(node.getChild(i))
5760
+
5761
+ _collect(ctx)
5762
+ return " ".join(parts).strip() or None
5763
+
5764
+
5742
5765
  def _visit_effect_behavior_member(ctx):
5743
- """Visit an effectBehaviorMember context."""
5766
+ """Visit an effectBehaviorMember context.
5767
+
5768
+ effectBehaviorMember : DO effectBehaviorUsage ;
5769
+ effectBehaviorUsage : emptyActionUsage_ | transitionPerformActionUsage
5770
+ | transitionAcceptActionUsage | transitionSendActionUsage
5771
+ | transitionAssignmentActionUsage ;
5772
+
5773
+ ``do <behavior-reference>`` (by far the common transition effect)
5774
+ rides through transitionPerformActionUsage ->
5775
+ performActionUsageDeclaration -> ownedReferenceSubsetting, whose
5776
+ qualifiedName is the referenced behavior's name. We emit the shape
5777
+ the grammar classes expect (EffectBehaviorUsage / PerformedActionUsage
5778
+ / PerformActionUsageDeclaration) so ``EffectBehaviorMember.dump()``
5779
+ round-trips the effect. The send/accept/assignment alternatives are
5780
+ emitted as ``text`` fallbacks (readable, not class-constructed).
5781
+ """
5744
5782
  if ctx is None:
5745
5783
  return None
5746
-
5747
- behavior = None
5748
- if hasattr(ctx, 'transitionEffect') and ctx.transitionEffect():
5749
- te = ctx.transitionEffect()
5750
- if isinstance(te, list):
5751
- te = te[0]
5752
- if te:
5753
- behavior = _visit_transition_effect(te)
5754
-
5755
- return {
5784
+
5785
+ behavior, fallback_text = None, None
5786
+ if hasattr(ctx, 'effectBehaviorUsage') and ctx.effectBehaviorUsage():
5787
+ behavior, fallback_text = _visit_effect_behavior_usage(
5788
+ ctx.effectBehaviorUsage())
5789
+
5790
+ member = {
5756
5791
  "name": "EffectBehaviorMember",
5757
5792
  "ownedRelatedElement": behavior
5758
5793
  }
5794
+ if fallback_text:
5795
+ # Sibling key: read by the view extractors, ignored (and so
5796
+ # safely dropped) by the grammar classes.
5797
+ member["text"] = fallback_text
5798
+ return member
5759
5799
 
5760
5800
 
5761
- def _visit_transition_effect(ctx):
5762
- """Visit a transitionEffect context."""
5801
+ def _visit_effect_behavior_usage(ctx):
5802
+ """Visit an effectBehaviorUsage context (one of five alternatives)."""
5763
5803
  if ctx is None:
5764
5804
  return None
5765
-
5766
- body = None
5767
- if hasattr(ctx, 'actionBody') and ctx.actionBody():
5768
- body = _visit_action_body(ctx.actionBody())
5769
-
5805
+
5806
+ if hasattr(ctx, 'transitionPerformActionUsage') and \
5807
+ ctx.transitionPerformActionUsage():
5808
+ pu = ctx.transitionPerformActionUsage()
5809
+ if isinstance(pu, list):
5810
+ pu = pu[0]
5811
+ return _visit_transition_perform_action_usage(pu), None
5812
+
5813
+ # send / accept / assignment: no class-constructable shape yet —
5814
+ # the caller surfaces the declaration via a sibling ``text`` on the
5815
+ # EffectBehaviorMember dict (see _visit_effect_behavior_member).
5816
+ for alt_name, kind in (
5817
+ ('transitionSendActionUsage', 'send'),
5818
+ ('transitionAcceptActionUsage', 'accept'),
5819
+ ('transitionAssignmentActionUsage', 'assign'),
5820
+ ):
5821
+ if hasattr(ctx, alt_name):
5822
+ sub = getattr(ctx, alt_name)()
5823
+ if sub:
5824
+ if isinstance(sub, list):
5825
+ sub = sub[0]
5826
+ node = None
5827
+ for decl_name in ('sendNodeDeclaration',
5828
+ 'acceptNodeDeclaration',
5829
+ 'assignmentNodeDeclaration'):
5830
+ if hasattr(sub, decl_name):
5831
+ node = getattr(sub, decl_name)()
5832
+ if node:
5833
+ break
5834
+ # Spaced text; the ``send``/``accept`` keyword already
5835
+ # sits in the declaration, no kind prefix needed.
5836
+ text = _ctx_spaced_text(
5837
+ node if node is not None else sub)
5838
+ return None, text
5839
+ # emptyActionUsage_
5840
+ return None, None
5841
+
5842
+
5843
+ def _visit_transition_perform_action_usage(ctx):
5844
+ """transitionPerformActionUsage : performActionUsageDeclaration
5845
+ ( LBRACE actionBodyItem* RBRACE )? ;"""
5846
+ if ctx is None:
5847
+ return None
5848
+
5849
+ declaration = None
5850
+ if hasattr(ctx, 'performActionUsageDeclaration') and \
5851
+ ctx.performActionUsageDeclaration():
5852
+ declaration = _visit_perform_action_usage_declaration(
5853
+ ctx.performActionUsageDeclaration())
5854
+
5855
+ items = []
5856
+ if hasattr(ctx, 'actionBodyItem') and ctx.actionBodyItem():
5857
+ body_items = ctx.actionBodyItem()
5858
+ if not isinstance(body_items, list):
5859
+ body_items = [body_items]
5860
+ for item_ctx in body_items:
5861
+ item_dict = _visit_action_body_item(item_ctx)
5862
+ if item_dict:
5863
+ items.append(item_dict)
5864
+
5770
5865
  return {
5771
- "name": "TransitionEffect",
5772
- "body": body
5866
+ "name": "EffectBehaviorUsage",
5867
+ "usage": {
5868
+ "name": "PerformedActionUsage",
5869
+ "declaration": declaration,
5870
+ },
5871
+ "item": items,
5773
5872
  }
5774
5873
 
5775
5874