sysmlpy 0.77.0__tar.gz → 0.78.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.77.0 → sysmlpy-0.78.0}/PKG-INFO +83 -60
  2. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/README.md +82 -59
  3. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/pyproject.toml +1 -1
  4. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/__init__.py +6 -3
  5. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/formatting.py +17 -0
  6. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/usage.py +7 -4
  7. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/LICENSE +0 -0
  8. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/__main__.py +0 -0
  9. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/antlr/README.md +0 -0
  10. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/antlr/SysMLv2Lexer.interp +0 -0
  11. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/antlr/SysMLv2Lexer.py +0 -0
  12. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/antlr/SysMLv2Lexer.tokens +0 -0
  13. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/antlr/SysMLv2Parser.interp +0 -0
  14. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/antlr/SysMLv2Parser.py +0 -0
  15. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/antlr/SysMLv2Parser.tokens +0 -0
  16. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/antlr/SysMLv2ParserListener.py +0 -0
  17. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/antlr/SysMLv2ParserVisitor.py +0 -0
  18. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/antlr/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.interp +0 -0
  19. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/antlr/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.py +0 -0
  20. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/antlr/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.tokens +0 -0
  21. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/antlr_parser.py +0 -0
  22. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/antlr_visitor.py +0 -0
  23. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/boxes_view.py +0 -0
  24. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/definition.py +0 -0
  25. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/diff.py +0 -0
  26. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/evaluator.py +0 -0
  27. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/examples/attribute_values.py +0 -0
  28. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/examples/part_attributes.py +0 -0
  29. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/examples/tuples_sequences.py +0 -0
  30. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/grammar/antlr4/README.md +0 -0
  31. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.g4 +0 -0
  32. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.interp +0 -0
  33. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.py +0 -0
  34. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.tokens +0 -0
  35. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.g4 +0 -0
  36. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.interp +0 -0
  37. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.py +0 -0
  38. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.tokens +0 -0
  39. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/grammar/antlr4/SysMLv2ParserListener.py +0 -0
  40. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/grammar/antlr4/SysMLv2ParserVisitor.py +0 -0
  41. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/grammar/antlr4/desc.xml +0 -0
  42. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/grammar/antlr4/examples/camera.sysml +0 -0
  43. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/grammar/antlr4/examples/toaster-system.sysml +0 -0
  44. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/grammar/antlr4/examples/vehicle-model.sysml +0 -0
  45. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/grammar/antlr4/pom.xml +0 -0
  46. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/grammar/classes.py +0 -0
  47. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/interchange.py +0 -0
  48. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/LICENSE +0 -0
  49. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/README.md +0 -0
  50. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/__init__.py +0 -0
  51. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/domain/Analysis/AnalysisTooling.sysml +0 -0
  52. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/domain/Analysis/SampledFunctions.sysml +0 -0
  53. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/domain/Analysis/StateSpaceRepresentation.sysml +0 -0
  54. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/domain/Analysis/TradeStudies.sysml +0 -0
  55. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/domain/Cause and Effect/CausationConnections.sysml +0 -0
  56. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/domain/Cause and Effect/CauseAndEffect.sysml +0 -0
  57. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/domain/Geometry/ShapeItems.sysml +0 -0
  58. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/domain/Geometry/SpatialItems.sysml +0 -0
  59. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/domain/Metadata/ImageMetadata.sysml +0 -0
  60. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/domain/Metadata/ModelingMetadata.sysml +0 -0
  61. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/domain/Metadata/ParametersOfInterestMetadata.sysml +0 -0
  62. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/domain/Metadata/RiskMetadata.sysml +0 -0
  63. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/domain/Quantities and Units/ISQ.sysml +0 -0
  64. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/domain/Quantities and Units/ISQAcoustics.sysml +0 -0
  65. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/domain/Quantities and Units/ISQAtomicNuclear.sysml +0 -0
  66. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/domain/Quantities and Units/ISQBase.sysml +0 -0
  67. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/domain/Quantities and Units/ISQCharacteristicNumbers.sysml +0 -0
  68. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/domain/Quantities and Units/ISQChemistryMolecular.sysml +0 -0
  69. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/domain/Quantities and Units/ISQCondensedMatter.sysml +0 -0
  70. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/domain/Quantities and Units/ISQElectromagnetism.sysml +0 -0
  71. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/domain/Quantities and Units/ISQInformation.sysml +0 -0
  72. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/domain/Quantities and Units/ISQLight.sysml +0 -0
  73. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/domain/Quantities and Units/ISQMechanics.sysml +0 -0
  74. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/domain/Quantities and Units/ISQSpaceTime.sysml +0 -0
  75. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/domain/Quantities and Units/ISQThermodynamics.sysml +0 -0
  76. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/domain/Quantities and Units/MeasurementRefCalculations.sysml +0 -0
  77. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/domain/Quantities and Units/MeasurementReferences.sysml +0 -0
  78. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/domain/Quantities and Units/Quantities.sysml +0 -0
  79. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/domain/Quantities and Units/QuantityCalculations.sysml +0 -0
  80. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/domain/Quantities and Units/SI.sysml +0 -0
  81. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/domain/Quantities and Units/SIPrefixes.sysml +0 -0
  82. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/domain/Quantities and Units/TensorCalculations.sysml +0 -0
  83. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/domain/Quantities and Units/Time.sysml +0 -0
  84. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/domain/Quantities and Units/USCustomaryUnits.sysml +0 -0
  85. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/domain/Quantities and Units/VectorCalculations.sysml +0 -0
  86. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/domain/Requirement Derivation/DerivationConnections.sysml +0 -0
  87. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/domain/Requirement Derivation/RequirementDerivation.sysml +0 -0
  88. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/kernel/Base.kerml +0 -0
  89. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/kernel/BaseFunctions.kerml +0 -0
  90. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/kernel/BooleanFunctions.kerml +0 -0
  91. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/kernel/Clocks.kerml +0 -0
  92. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/kernel/CollectionFunctions.kerml +0 -0
  93. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/kernel/Collections.kerml +0 -0
  94. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/kernel/ComplexFunctions.kerml +0 -0
  95. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/kernel/ControlFunctions.kerml +0 -0
  96. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/kernel/ControlPerformances.kerml +0 -0
  97. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/kernel/DataFunctions.kerml +0 -0
  98. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/kernel/FeatureReferencingPerformances.kerml +0 -0
  99. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/kernel/IntegerFunctions.kerml +0 -0
  100. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/kernel/KerML.kerml +0 -0
  101. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/kernel/Links.kerml +0 -0
  102. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/kernel/Metaobjects.kerml +0 -0
  103. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/kernel/NaturalFunctions.kerml +0 -0
  104. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/kernel/NumericalFunctions.kerml +0 -0
  105. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/kernel/Objects.kerml +0 -0
  106. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/kernel/Observation.kerml +0 -0
  107. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/kernel/OccurrenceFunctions.kerml +0 -0
  108. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/kernel/Occurrences.kerml +0 -0
  109. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/kernel/Performances.kerml +0 -0
  110. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/kernel/RationalFunctions.kerml +0 -0
  111. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/kernel/RealFunctions.kerml +0 -0
  112. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/kernel/ScalarFunctions.kerml +0 -0
  113. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/kernel/ScalarValues.kerml +0 -0
  114. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/kernel/SequenceFunctions.kerml +0 -0
  115. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/kernel/SpatialFrames.kerml +0 -0
  116. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/kernel/StatePerformances.kerml +0 -0
  117. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/kernel/StringFunctions.kerml +0 -0
  118. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/kernel/Transfers.kerml +0 -0
  119. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/kernel/TransitionPerformances.kerml +0 -0
  120. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/kernel/TrigFunctions.kerml +0 -0
  121. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/kernel/Triggers.kerml +0 -0
  122. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/kernel/VectorFunctions.kerml +0 -0
  123. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/kernel/VectorValues.kerml +0 -0
  124. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/systems/Actions.sysml +0 -0
  125. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/systems/Allocations.sysml +0 -0
  126. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/systems/AnalysisCases.sysml +0 -0
  127. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/systems/Attributes.sysml +0 -0
  128. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/systems/Calculations.sysml +0 -0
  129. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/systems/Cases.sysml +0 -0
  130. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/systems/Connections.sysml +0 -0
  131. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/systems/Constraints.sysml +0 -0
  132. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/systems/Flows.sysml +0 -0
  133. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/systems/Interfaces.sysml +0 -0
  134. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/systems/Items.sysml +0 -0
  135. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/systems/Metadata.sysml +0 -0
  136. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/systems/Parts.sysml +0 -0
  137. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/systems/Ports.sysml +0 -0
  138. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/systems/Requirements.sysml +0 -0
  139. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/systems/StandardViewDefinitions.sysml +0 -0
  140. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/systems/States.sysml +0 -0
  141. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/systems/SysML.sysml +0 -0
  142. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/systems/UseCases.sysml +0 -0
  143. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/systems/VerificationCases.sysml +0 -0
  144. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/library/systems/Views.sysml +0 -0
  145. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/lsp/__init__.py +0 -0
  146. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/lsp/__main__.py +0 -0
  147. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/lsp/protocol.py +0 -0
  148. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/lsp/server.py +0 -0
  149. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/lsp/stdio.py +0 -0
  150. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/navigate.py +0 -0
  151. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/plantuml.py +0 -0
  152. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/project.py +0 -0
  153. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/semantic.py +0 -0
  154. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/sim.py +0 -0
  155. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/spreadsheet.py +0 -0
  156. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/store.py +0 -0
  157. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/traceability.py +0 -0
  158. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/us_customary_units.txt +0 -0
  159. {sysmlpy-0.77.0 → sysmlpy-0.78.0}/src/sysmlpy/validator.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sysmlpy
3
- Version: 0.77.0
3
+ Version: 0.78.0
4
4
  Summary:
5
5
  License-File: LICENSE
6
6
  Author: Jon R. Fox (mycr0ft)
@@ -45,23 +45,19 @@ and dropped the textX parser in favor of [an ANTLR4 parser grammar](https://gith
45
45
  changed our unit library to pint.
46
46
  The project had diverged so much from sysml2py that a new name, sysmlpy, was selected.
47
47
 
48
- > **⚠️ Constraints are changing.** As of v0.55.0, `analyze()` performs
49
- > full expression validation: identifiers are **resolved against the
50
- > symbol table** (v0.54.0) and operators are **type- and
51
- > unit-checked** — `flag and n`, `"a" + 5`, and `[m] + [kg]` all raise
52
- > `OPERAND_TYPE_MISMATCH` / `UNIT_DIMENSION_MISMATCH` errors. Deterministic
53
- > literal expressions can be reduced with `const_fold()` (v0.55.0).
54
- > v0.56.0 adds two-stage SLL→LL parsing (38% faster on large models)
55
- > and graph query extensions (`all_paths`, `impact_analysis`,
56
- > `execute_cypher`, …). Track progress in
57
- > [docs/DEVELOPMENT_PLAN.md](docs/DEVELOPMENT_PLAN.md).
58
-
59
- > **Scope reminder** — a green parse result means the file **parsed
60
- > syntactically**. Expression validation (name resolution, type and
61
- > unit checks) runs only when you call `analyze(model)` explicitly.
62
- > Multiplication/division dimension *derivation* (inferring
63
- > `[N]` from `[kg] * [m/s^2]`) is not yet implemented. See
64
- > [STATUS.md §Known Issues](STATUS.md#known-issues).
48
+ **What you get**: full SysML v2 parsing (ANTLR4, 123/123 OMG XPect
49
+ conformance), round-trip `dump()`, a semantic analyzer with 31 rule
50
+ codes (name resolution, type/unit-checked expressions, OCL
51
+ well-formedness), 17 PlantUML views + Java-free boxes rendering,
52
+ state-machine simulation, Excel export, a `sysmlpy diff` semantic
53
+ model differ, and graph storage backends (memory / NetworkX / Kùzu /
54
+ Cayley).
55
+
56
+ > **Scope note** — a green parse result means the file **parsed
57
+ > syntactically**. Expression validation (name resolution, type,
58
+ > unit, and dimension checks) runs when you call `analyze(model)`.
59
+ > Expression validation also derives dimensions through `*` and `/`
60
+ > (`[N]` inferred from `[kg] * [m/s^2]`, v0.75.0).
65
61
 
66
62
  For release history, see [CHANGELOG.md](CHANGELOG.md).
67
63
 
@@ -88,6 +84,50 @@ Multiple installation methods are supported by sysmlpy, including:
88
84
  | ![PyPI logo](https://simpleicons.org/icons/pypi.svg) | PyPI | ``python -m pip install sysmlpy[cayley]`` (with Cayley graph DB) |
89
85
  | ![GitHub logo](https://simpleicons.org/icons/github.svg) | GitHub | ``python -m pip install https://github.com/mycr0ft/sysmlpy/archive/refs/heads/main.zip`` |
90
86
 
87
+ ## Command-Line Tools
88
+
89
+ sysmlpy ships a CLI (`sysmlpy`, plus `sysmlpy-lsp` for editor support).
90
+ Exit codes: `0` = success/clean, `1` = findings at/above the failure
91
+ threshold or operational error, `2` = parse/load failure — so
92
+ `analyze` and `diff` drop straight into CI pipelines.
93
+
94
+ | Command | Purpose |
95
+ |---------|---------|
96
+ | `sysmlpy parse <file>` | Parse a file and print a representation |
97
+ | `sysmlpy analyze <file...>` | Semantic analysis; CI-friendly exit codes |
98
+ | `sysmlpy diff <old> <new>` | Semantic model diff (text/markdown/json) |
99
+ | `sysmlpy view <file>` | Render a PlantUML / Markdown / HTML view |
100
+ | `sysmlpy format <file...>` | Pretty-print (canonicalize) SysML files (alias `fmt`) |
101
+ | `sysmlpy trace <file>` | Requirement traceability & verification coverage |
102
+ | `sysmlpy export <file>` | Export to the JSON interchange format |
103
+ | `sysmlpy import <file>` | Import a JSON interchange document as SysML text |
104
+ | `sysmlpy eval <file>` | Evaluate expressions, attribute values, constraints |
105
+ | `sysmlpy sim <file>` | Simulate a state machine (guards evaluated for real) |
106
+ | `sysmlpy xlsx <file>` | Export tabular views to an Excel workbook |
107
+ | `sysmlpy-lsp` | Language server (stdio) for SysML v2 editors |
108
+
109
+ Examples:
110
+
111
+ ```bash
112
+ # CI gate: fail the build when analysis finds errors (threshold via --fail-on)
113
+ sysmlpy analyze model.sysml
114
+
115
+ # What changed between two revisions?
116
+ sysmlpy diff old.sysml new.sysml --format markdown > changes.md
117
+
118
+ # Canonicalize a model in place, and render a BDD-style view
119
+ sysmlpy format model.sysml
120
+ sysmlpy view model.sysml --view sv > model.puml
121
+
122
+ # Drive a state machine interactively
123
+ sysmlpy sim traffic_light.sysml
124
+
125
+ # Excel workbook of the tabular views
126
+ sysmlpy xlsx bill_of_materials.sysml -o bom.xlsx
127
+ ```
128
+
129
+ Every subcommand accepts `--help` for its own flags.
130
+
91
131
  ## Documentation
92
132
 
93
133
  Documentation can be found [here.](https://mycr0ft.github.io/sysmlpy/)
@@ -130,36 +170,8 @@ for child in sensor:
130
170
  "camera" in sensor # → True
131
171
  ```
132
172
 
133
- It will output the following:
134
- ```
135
- part <'3.1'> Stage_1 {
136
- attribute mass= 100 [kilogram];
137
- attribute thrust= 1199.0 [newton];
138
- }
139
- ```
140
-
141
- The package is able to handle Items, Parts, and Attributes.
142
-
143
- ```python
144
- a = Part(name='camera')
145
- b = Item(name='lens')
146
- d = Attribute(name='mass')
147
- c = Part(name='sensor')
148
- c.add_child(a)
149
- c.add_child(b)
150
- a.add_child(d)
151
- print(c.dump())
152
- ```
153
-
154
- will return:
155
- ```
156
- part sensor {
157
- part camera {
158
- attribute mass;
159
- }
160
- item lens;
161
- }
162
- ```
173
+ `print(sensor.dump())` renders the SysML text shown above:
174
+ `part sensor { part camera { attribute mass= 100[kilogram]; } item lens; }`.
163
175
 
164
176
  Actions
165
177
  -------
@@ -268,10 +280,11 @@ len(model) # → number of direct children
268
280
  print(str(model))
269
281
  # → package Vehicle { ... }
270
282
 
271
- # Typed property accessors
272
- model.packages # direct Package children
273
- model.parts # direct Part children
274
- model.actions # direct Action children
283
+ # Typed property accessors (available on packages and usage elements;
284
+ # a Model root exposes .packages, package nodes expose .parts, etc.)
285
+ model.packages # direct Package children of the model root
286
+ pkg = model.find_one("Vehicle")
287
+ pkg.parts # direct Part children (definitions and usages)
275
288
  ```
276
289
 
277
290
  All search methods accept `sysml_type=` (keyword string or class) and `recursive=`:
@@ -341,9 +354,9 @@ model = loads("""
341
354
  part def Engine;
342
355
  }
343
356
  package Vehicle {
344
- import Types::*;
345
- part myCar : Engine; # resolved via import
346
- part myWheel : Wheel; # undefined!
357
+ private import Types::*;
358
+ part myCar : Engine; // resolved via import
359
+ part myWheel : Wheel; // undefined!
347
360
  }
348
361
  """)
349
362
 
@@ -397,6 +410,11 @@ The analyzer resolves three import patterns with visibility enforcement:
397
410
 
398
411
  ### OCL Well-Formedness Checks
399
412
 
413
+ The analyzer implements **31 rule codes** in total (severity-tagged
414
+ `error`/`warning`), spanning OCL well-formedness, state machines,
415
+ requirements, traceability, connectors, and unit-dimension checks —
416
+ see [STATUS.md](STATUS.md) for the complete catalogue. Highlights:
417
+
400
418
  | Code | Rule | Description |
401
419
  |------|------|-------------|
402
420
  | `DUPLICATE_NAME` | Namespace.duplicate_names | No two members may share the same name in a scope |
@@ -523,16 +541,21 @@ centrality = store.centrality()
523
541
  store.export_graphml("model.graphml")
524
542
  ```
525
543
 
526
- **Running Cayley with Docker:**
544
+ **Running Cayley with Podman or Docker:**
527
545
 
528
546
  ```bash
529
- # In-memory backend
530
- docker run -p 64210:64210 --rm cayley/cayley
547
+ # Simplest (tested): persistent BoltDB inside the container
548
+ podman run -d --name cayley -p 64210:64210 docker.io/cayleygraph/cayley
531
549
 
532
- # Persistent BoltDB backend
533
- docker run -p 64210:64210 -v /data:/data --rm cayley/cayley -db boltdb -dbpath /data/cayley.db
550
+ # Docker equivalents
551
+ docker run -p 64210:64210 --rm cayley/cayley # in-memory backend
552
+ docker run -p 64210:64210 -v /data:/data --rm cayley/cayley \
553
+ -db boltdb -dbpath /data/cayley.db # persistent
534
554
  ```
535
555
 
556
+ Stored subjects are label-namespaced (`<label>:<element_id>`), so
557
+ several stores can share one server without query bleed.
558
+
536
559
  **Quad Model:** Elements are stored as quads where the subject is the element UUID, predicates are property names (e.g., `name`, `sysml_type`), and objects are property values. Relationships are stored as quads where the predicate is the relationship type (e.g., `parent_child`, `typed_by`). Labels provide namespace isolation for multi-tenant scenarios.
537
560
 
538
561
  ## PlantUML Visualizations
@@ -14,23 +14,19 @@ and dropped the textX parser in favor of [an ANTLR4 parser grammar](https://gith
14
14
  changed our unit library to pint.
15
15
  The project had diverged so much from sysml2py that a new name, sysmlpy, was selected.
16
16
 
17
- > **⚠️ Constraints are changing.** As of v0.55.0, `analyze()` performs
18
- > full expression validation: identifiers are **resolved against the
19
- > symbol table** (v0.54.0) and operators are **type- and
20
- > unit-checked** — `flag and n`, `"a" + 5`, and `[m] + [kg]` all raise
21
- > `OPERAND_TYPE_MISMATCH` / `UNIT_DIMENSION_MISMATCH` errors. Deterministic
22
- > literal expressions can be reduced with `const_fold()` (v0.55.0).
23
- > v0.56.0 adds two-stage SLL→LL parsing (38% faster on large models)
24
- > and graph query extensions (`all_paths`, `impact_analysis`,
25
- > `execute_cypher`, …). Track progress in
26
- > [docs/DEVELOPMENT_PLAN.md](docs/DEVELOPMENT_PLAN.md).
27
-
28
- > **Scope reminder** — a green parse result means the file **parsed
29
- > syntactically**. Expression validation (name resolution, type and
30
- > unit checks) runs only when you call `analyze(model)` explicitly.
31
- > Multiplication/division dimension *derivation* (inferring
32
- > `[N]` from `[kg] * [m/s^2]`) is not yet implemented. See
33
- > [STATUS.md §Known Issues](STATUS.md#known-issues).
17
+ **What you get**: full SysML v2 parsing (ANTLR4, 123/123 OMG XPect
18
+ conformance), round-trip `dump()`, a semantic analyzer with 31 rule
19
+ codes (name resolution, type/unit-checked expressions, OCL
20
+ well-formedness), 17 PlantUML views + Java-free boxes rendering,
21
+ state-machine simulation, Excel export, a `sysmlpy diff` semantic
22
+ model differ, and graph storage backends (memory / NetworkX / Kùzu /
23
+ Cayley).
24
+
25
+ > **Scope note** — a green parse result means the file **parsed
26
+ > syntactically**. Expression validation (name resolution, type,
27
+ > unit, and dimension checks) runs when you call `analyze(model)`.
28
+ > Expression validation also derives dimensions through `*` and `/`
29
+ > (`[N]` inferred from `[kg] * [m/s^2]`, v0.75.0).
34
30
 
35
31
  For release history, see [CHANGELOG.md](CHANGELOG.md).
36
32
 
@@ -57,6 +53,50 @@ Multiple installation methods are supported by sysmlpy, including:
57
53
  | ![PyPI logo](https://simpleicons.org/icons/pypi.svg) | PyPI | ``python -m pip install sysmlpy[cayley]`` (with Cayley graph DB) |
58
54
  | ![GitHub logo](https://simpleicons.org/icons/github.svg) | GitHub | ``python -m pip install https://github.com/mycr0ft/sysmlpy/archive/refs/heads/main.zip`` |
59
55
 
56
+ ## Command-Line Tools
57
+
58
+ sysmlpy ships a CLI (`sysmlpy`, plus `sysmlpy-lsp` for editor support).
59
+ Exit codes: `0` = success/clean, `1` = findings at/above the failure
60
+ threshold or operational error, `2` = parse/load failure — so
61
+ `analyze` and `diff` drop straight into CI pipelines.
62
+
63
+ | Command | Purpose |
64
+ |---------|---------|
65
+ | `sysmlpy parse <file>` | Parse a file and print a representation |
66
+ | `sysmlpy analyze <file...>` | Semantic analysis; CI-friendly exit codes |
67
+ | `sysmlpy diff <old> <new>` | Semantic model diff (text/markdown/json) |
68
+ | `sysmlpy view <file>` | Render a PlantUML / Markdown / HTML view |
69
+ | `sysmlpy format <file...>` | Pretty-print (canonicalize) SysML files (alias `fmt`) |
70
+ | `sysmlpy trace <file>` | Requirement traceability & verification coverage |
71
+ | `sysmlpy export <file>` | Export to the JSON interchange format |
72
+ | `sysmlpy import <file>` | Import a JSON interchange document as SysML text |
73
+ | `sysmlpy eval <file>` | Evaluate expressions, attribute values, constraints |
74
+ | `sysmlpy sim <file>` | Simulate a state machine (guards evaluated for real) |
75
+ | `sysmlpy xlsx <file>` | Export tabular views to an Excel workbook |
76
+ | `sysmlpy-lsp` | Language server (stdio) for SysML v2 editors |
77
+
78
+ Examples:
79
+
80
+ ```bash
81
+ # CI gate: fail the build when analysis finds errors (threshold via --fail-on)
82
+ sysmlpy analyze model.sysml
83
+
84
+ # What changed between two revisions?
85
+ sysmlpy diff old.sysml new.sysml --format markdown > changes.md
86
+
87
+ # Canonicalize a model in place, and render a BDD-style view
88
+ sysmlpy format model.sysml
89
+ sysmlpy view model.sysml --view sv > model.puml
90
+
91
+ # Drive a state machine interactively
92
+ sysmlpy sim traffic_light.sysml
93
+
94
+ # Excel workbook of the tabular views
95
+ sysmlpy xlsx bill_of_materials.sysml -o bom.xlsx
96
+ ```
97
+
98
+ Every subcommand accepts `--help` for its own flags.
99
+
60
100
  ## Documentation
61
101
 
62
102
  Documentation can be found [here.](https://mycr0ft.github.io/sysmlpy/)
@@ -99,36 +139,8 @@ for child in sensor:
99
139
  "camera" in sensor # → True
100
140
  ```
101
141
 
102
- It will output the following:
103
- ```
104
- part <'3.1'> Stage_1 {
105
- attribute mass= 100 [kilogram];
106
- attribute thrust= 1199.0 [newton];
107
- }
108
- ```
109
-
110
- The package is able to handle Items, Parts, and Attributes.
111
-
112
- ```python
113
- a = Part(name='camera')
114
- b = Item(name='lens')
115
- d = Attribute(name='mass')
116
- c = Part(name='sensor')
117
- c.add_child(a)
118
- c.add_child(b)
119
- a.add_child(d)
120
- print(c.dump())
121
- ```
122
-
123
- will return:
124
- ```
125
- part sensor {
126
- part camera {
127
- attribute mass;
128
- }
129
- item lens;
130
- }
131
- ```
142
+ `print(sensor.dump())` renders the SysML text shown above:
143
+ `part sensor { part camera { attribute mass= 100[kilogram]; } item lens; }`.
132
144
 
133
145
  Actions
134
146
  -------
@@ -237,10 +249,11 @@ len(model) # → number of direct children
237
249
  print(str(model))
238
250
  # → package Vehicle { ... }
239
251
 
240
- # Typed property accessors
241
- model.packages # direct Package children
242
- model.parts # direct Part children
243
- model.actions # direct Action children
252
+ # Typed property accessors (available on packages and usage elements;
253
+ # a Model root exposes .packages, package nodes expose .parts, etc.)
254
+ model.packages # direct Package children of the model root
255
+ pkg = model.find_one("Vehicle")
256
+ pkg.parts # direct Part children (definitions and usages)
244
257
  ```
245
258
 
246
259
  All search methods accept `sysml_type=` (keyword string or class) and `recursive=`:
@@ -310,9 +323,9 @@ model = loads("""
310
323
  part def Engine;
311
324
  }
312
325
  package Vehicle {
313
- import Types::*;
314
- part myCar : Engine; # resolved via import
315
- part myWheel : Wheel; # undefined!
326
+ private import Types::*;
327
+ part myCar : Engine; // resolved via import
328
+ part myWheel : Wheel; // undefined!
316
329
  }
317
330
  """)
318
331
 
@@ -366,6 +379,11 @@ The analyzer resolves three import patterns with visibility enforcement:
366
379
 
367
380
  ### OCL Well-Formedness Checks
368
381
 
382
+ The analyzer implements **31 rule codes** in total (severity-tagged
383
+ `error`/`warning`), spanning OCL well-formedness, state machines,
384
+ requirements, traceability, connectors, and unit-dimension checks —
385
+ see [STATUS.md](STATUS.md) for the complete catalogue. Highlights:
386
+
369
387
  | Code | Rule | Description |
370
388
  |------|------|-------------|
371
389
  | `DUPLICATE_NAME` | Namespace.duplicate_names | No two members may share the same name in a scope |
@@ -492,16 +510,21 @@ centrality = store.centrality()
492
510
  store.export_graphml("model.graphml")
493
511
  ```
494
512
 
495
- **Running Cayley with Docker:**
513
+ **Running Cayley with Podman or Docker:**
496
514
 
497
515
  ```bash
498
- # In-memory backend
499
- docker run -p 64210:64210 --rm cayley/cayley
516
+ # Simplest (tested): persistent BoltDB inside the container
517
+ podman run -d --name cayley -p 64210:64210 docker.io/cayleygraph/cayley
500
518
 
501
- # Persistent BoltDB backend
502
- docker run -p 64210:64210 -v /data:/data --rm cayley/cayley -db boltdb -dbpath /data/cayley.db
519
+ # Docker equivalents
520
+ docker run -p 64210:64210 --rm cayley/cayley # in-memory backend
521
+ docker run -p 64210:64210 -v /data:/data --rm cayley/cayley \
522
+ -db boltdb -dbpath /data/cayley.db # persistent
503
523
  ```
504
524
 
525
+ Stored subjects are label-namespaced (`<label>:<element_id>`), so
526
+ several stores can share one server without query bleed.
527
+
505
528
  **Quad Model:** Elements are stored as quads where the subject is the element UUID, predicates are property names (e.g., `name`, `sysml_type`), and objects are property values. Relationships are stored as quads where the predicate is the relationship type (e.g., `parent_child`, `typed_by`). Labels provide namespace isolation for multi-tenant scenarios.
506
529
 
507
530
  ## PlantUML Visualizations
@@ -6,7 +6,7 @@ build-backend = "poetry.core.masonry.api"
6
6
 
7
7
  [project]
8
8
  name = "sysmlpy"
9
- version = "0.77.0"
9
+ version = "0.78.0"
10
10
  description = ""
11
11
  authors = [{ name = "Jon R. Fox (mycr0ft)", email = "jon.fox@drfox.com" }]
12
12
  readme = "README.md"
@@ -34,7 +34,7 @@ __all__ = [
34
34
  "render_state_transition_view_svg", "boxes_view",
35
35
  ]
36
36
  __author__ = "Jon Fox"
37
- __version__ = "0.77.0"
37
+ __version__ = "0.78.0"
38
38
 
39
39
  from sysmlpy.usage import (
40
40
  Item, Attribute, Part, Port, Action, Reference, UseCase, Requirement, Interface, Message,
@@ -243,8 +243,11 @@ def load_partial(text):
243
243
  partial, errors = _parse_with_recovery(source)
244
244
  if errors:
245
245
  raise PartialParseError(errors, partial, source)
246
- from sysmlpy.formatting import classtree
247
- return classtree(partial)
246
+ # Success path returns a real Model (matching the docstring and
247
+ # load()); before v0.78.0 this returned a RootNamespace grammar
248
+ # object by mistake.
249
+ from sysmlpy.definition import Model
250
+ return Model()._load_definition(partial["ownedRelationship"])
248
251
 
249
252
 
250
253
  def load(fp) -> Model:
@@ -44,4 +44,21 @@ def reformat(model):
44
44
 
45
45
 
46
46
  def classtree(model):
47
+ """Convert a model into a dumpable RootNamespace tree.
48
+
49
+ Accepts:
50
+ - a visitor grammar dict (historical input shape, e.g. from
51
+ ``load_grammar(text)``),
52
+ - a public-API ``Model`` from ``loads(text)`` — its ``.grammar``
53
+ is already a ``RootNamespace`` and is returned directly.
54
+
55
+ ``tree.dump()`` then renders SysML text. Passing a ``Model``
56
+ used to raise ``TypeError``; the README/TUTORIAL documented the
57
+ Model form, so it is now supported (v0.78.0).
58
+ """
59
+ if isinstance(model, dict):
60
+ return RootNamespace(model)
61
+ grammar = getattr(model, "grammar", None)
62
+ if grammar is not None and grammar.__class__.__name__ == "RootNamespace":
63
+ return grammar
47
64
  return RootNamespace(model)
@@ -4472,14 +4472,17 @@ class Reference(Usage):
4472
4472
  def dump(self):
4473
4473
  name_str = getattr(self, 'name', "") or ""
4474
4474
  type_str = ""
4475
-
4476
- if self.ref_type:
4475
+
4476
+ # NOTE: `is not None`, not truthiness — elements are falsy when
4477
+ # they have no children (Searchable.__len__), so a freshly built
4478
+ # typed-by Item would evaluate False and drop the ": Type".
4479
+ if self.ref_type is not None:
4477
4480
  type_name = getattr(self.ref_type, 'name', str(self.ref_type))
4478
4481
  type_str = f" : {type_name}"
4479
-
4482
+
4480
4483
  if self.redefines:
4481
4484
  return f"ref :>> {name_str}{type_str};"
4482
-
4485
+
4483
4486
  return f"ref {name_str}{type_str};"
4484
4487
 
4485
4488
 
File without changes
File without changes
File without changes
File without changes