sysmlpy 0.63.0__tar.gz → 0.65.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 (156) hide show
  1. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/PKG-INFO +1 -1
  2. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/pyproject.toml +2 -1
  3. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/__init__.py +7 -1
  4. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/__main__.py +133 -1
  5. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/antlr_visitor.py +11 -0
  6. sysmlpy-0.65.0/src/sysmlpy/evaluator.py +1156 -0
  7. sysmlpy-0.65.0/src/sysmlpy/lsp/__init__.py +24 -0
  8. sysmlpy-0.65.0/src/sysmlpy/lsp/__main__.py +9 -0
  9. sysmlpy-0.65.0/src/sysmlpy/lsp/protocol.py +106 -0
  10. sysmlpy-0.65.0/src/sysmlpy/lsp/server.py +738 -0
  11. sysmlpy-0.65.0/src/sysmlpy/lsp/stdio.py +104 -0
  12. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/usage.py +15 -0
  13. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/LICENSE +0 -0
  14. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/README.md +0 -0
  15. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/antlr/README.md +0 -0
  16. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/antlr/SysMLv2Lexer.interp +0 -0
  17. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/antlr/SysMLv2Lexer.py +0 -0
  18. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/antlr/SysMLv2Lexer.tokens +0 -0
  19. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/antlr/SysMLv2Parser.interp +0 -0
  20. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/antlr/SysMLv2Parser.py +0 -0
  21. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/antlr/SysMLv2Parser.tokens +0 -0
  22. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/antlr/SysMLv2ParserListener.py +0 -0
  23. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/antlr/SysMLv2ParserVisitor.py +0 -0
  24. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/antlr/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.interp +0 -0
  25. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/antlr/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.py +0 -0
  26. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/antlr/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.tokens +0 -0
  27. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/antlr_parser.py +0 -0
  28. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/boxes_view.py +0 -0
  29. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/definition.py +0 -0
  30. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/examples/attribute_values.py +0 -0
  31. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/examples/part_attributes.py +0 -0
  32. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/examples/tuples_sequences.py +0 -0
  33. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/formatting.py +0 -0
  34. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/grammar/antlr4/README.md +0 -0
  35. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.g4 +0 -0
  36. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.interp +0 -0
  37. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.py +0 -0
  38. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.tokens +0 -0
  39. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.g4 +0 -0
  40. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.interp +0 -0
  41. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.py +0 -0
  42. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.tokens +0 -0
  43. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/grammar/antlr4/SysMLv2ParserListener.py +0 -0
  44. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/grammar/antlr4/SysMLv2ParserVisitor.py +0 -0
  45. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/grammar/antlr4/desc.xml +0 -0
  46. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/grammar/antlr4/examples/camera.sysml +0 -0
  47. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/grammar/antlr4/examples/toaster-system.sysml +0 -0
  48. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/grammar/antlr4/examples/vehicle-model.sysml +0 -0
  49. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/grammar/antlr4/pom.xml +0 -0
  50. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/grammar/classes.py +0 -0
  51. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/interchange.py +0 -0
  52. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/LICENSE +0 -0
  53. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/README.md +0 -0
  54. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/__init__.py +0 -0
  55. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Analysis/AnalysisTooling.sysml +0 -0
  56. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Analysis/SampledFunctions.sysml +0 -0
  57. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Analysis/StateSpaceRepresentation.sysml +0 -0
  58. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Analysis/TradeStudies.sysml +0 -0
  59. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Cause and Effect/CausationConnections.sysml +0 -0
  60. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Cause and Effect/CauseAndEffect.sysml +0 -0
  61. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Geometry/ShapeItems.sysml +0 -0
  62. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Geometry/SpatialItems.sysml +0 -0
  63. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Metadata/ImageMetadata.sysml +0 -0
  64. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Metadata/ModelingMetadata.sysml +0 -0
  65. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Metadata/ParametersOfInterestMetadata.sysml +0 -0
  66. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Metadata/RiskMetadata.sysml +0 -0
  67. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/ISQ.sysml +0 -0
  68. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/ISQAcoustics.sysml +0 -0
  69. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/ISQAtomicNuclear.sysml +0 -0
  70. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/ISQBase.sysml +0 -0
  71. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/ISQCharacteristicNumbers.sysml +0 -0
  72. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/ISQChemistryMolecular.sysml +0 -0
  73. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/ISQCondensedMatter.sysml +0 -0
  74. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/ISQElectromagnetism.sysml +0 -0
  75. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/ISQInformation.sysml +0 -0
  76. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/ISQLight.sysml +0 -0
  77. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/ISQMechanics.sysml +0 -0
  78. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/ISQSpaceTime.sysml +0 -0
  79. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/ISQThermodynamics.sysml +0 -0
  80. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/MeasurementRefCalculations.sysml +0 -0
  81. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/MeasurementReferences.sysml +0 -0
  82. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/Quantities.sysml +0 -0
  83. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/QuantityCalculations.sysml +0 -0
  84. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/SI.sysml +0 -0
  85. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/SIPrefixes.sysml +0 -0
  86. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/TensorCalculations.sysml +0 -0
  87. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/Time.sysml +0 -0
  88. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/USCustomaryUnits.sysml +0 -0
  89. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Quantities and Units/VectorCalculations.sysml +0 -0
  90. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Requirement Derivation/DerivationConnections.sysml +0 -0
  91. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/domain/Requirement Derivation/RequirementDerivation.sysml +0 -0
  92. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/Base.kerml +0 -0
  93. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/BaseFunctions.kerml +0 -0
  94. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/BooleanFunctions.kerml +0 -0
  95. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/Clocks.kerml +0 -0
  96. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/CollectionFunctions.kerml +0 -0
  97. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/Collections.kerml +0 -0
  98. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/ComplexFunctions.kerml +0 -0
  99. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/ControlFunctions.kerml +0 -0
  100. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/ControlPerformances.kerml +0 -0
  101. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/DataFunctions.kerml +0 -0
  102. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/FeatureReferencingPerformances.kerml +0 -0
  103. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/IntegerFunctions.kerml +0 -0
  104. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/KerML.kerml +0 -0
  105. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/Links.kerml +0 -0
  106. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/Metaobjects.kerml +0 -0
  107. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/NaturalFunctions.kerml +0 -0
  108. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/NumericalFunctions.kerml +0 -0
  109. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/Objects.kerml +0 -0
  110. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/Observation.kerml +0 -0
  111. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/OccurrenceFunctions.kerml +0 -0
  112. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/Occurrences.kerml +0 -0
  113. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/Performances.kerml +0 -0
  114. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/RationalFunctions.kerml +0 -0
  115. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/RealFunctions.kerml +0 -0
  116. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/ScalarFunctions.kerml +0 -0
  117. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/ScalarValues.kerml +0 -0
  118. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/SequenceFunctions.kerml +0 -0
  119. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/SpatialFrames.kerml +0 -0
  120. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/StatePerformances.kerml +0 -0
  121. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/StringFunctions.kerml +0 -0
  122. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/Transfers.kerml +0 -0
  123. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/TransitionPerformances.kerml +0 -0
  124. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/TrigFunctions.kerml +0 -0
  125. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/Triggers.kerml +0 -0
  126. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/VectorFunctions.kerml +0 -0
  127. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/kernel/VectorValues.kerml +0 -0
  128. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/Actions.sysml +0 -0
  129. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/Allocations.sysml +0 -0
  130. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/AnalysisCases.sysml +0 -0
  131. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/Attributes.sysml +0 -0
  132. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/Calculations.sysml +0 -0
  133. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/Cases.sysml +0 -0
  134. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/Connections.sysml +0 -0
  135. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/Constraints.sysml +0 -0
  136. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/Flows.sysml +0 -0
  137. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/Interfaces.sysml +0 -0
  138. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/Items.sysml +0 -0
  139. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/Metadata.sysml +0 -0
  140. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/Parts.sysml +0 -0
  141. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/Ports.sysml +0 -0
  142. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/Requirements.sysml +0 -0
  143. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/StandardViewDefinitions.sysml +0 -0
  144. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/States.sysml +0 -0
  145. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/SysML.sysml +0 -0
  146. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/UseCases.sysml +0 -0
  147. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/VerificationCases.sysml +0 -0
  148. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/library/systems/Views.sysml +0 -0
  149. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/navigate.py +0 -0
  150. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/plantuml.py +0 -0
  151. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/project.py +0 -0
  152. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/semantic.py +0 -0
  153. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/store.py +0 -0
  154. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/traceability.py +0 -0
  155. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/us_customary_units.txt +0 -0
  156. {sysmlpy-0.63.0 → sysmlpy-0.65.0}/src/sysmlpy/validator.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sysmlpy
3
- Version: 0.63.0
3
+ Version: 0.65.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.63.0"
9
+ version = "0.65.0"
10
10
  description = ""
11
11
  authors = [{ name = "Jon R. Fox (mycr0ft)", email = "jon.fox@drfox.com" }]
12
12
  readme = "README.md"
@@ -27,6 +27,7 @@ kuzu = ["kuzu"]
27
27
 
28
28
  [tool.poetry.scripts]
29
29
  sysmlpy = "sysmlpy.__main__:main"
30
+ sysmlpy-lsp = "sysmlpy.lsp.stdio:main"
30
31
 
31
32
  [tool.poetry.group.dev.dependencies]
32
33
  pytest = ">=8.0,<9.0"
@@ -20,6 +20,8 @@ __all__ = [
20
20
  "as_sequence_view", "as_case_view", "as_browser_view",
21
21
  "extract_traceability", "TraceabilityReport", "RequirementTrace",
22
22
  "to_interchange", "from_interchange", "interchange_to_json_text",
23
+ "evaluate_expression", "evaluate_calculation", "collect_values",
24
+ "check_constraints", "ConstraintReport", "ConstraintResult",
23
25
  "analyze", "AnalysisResult", "SemanticIssue", "SemanticAnalyzer",
24
26
  "SysMLSyntaxError", "PartialParseError",
25
27
  "loads_partial", "load_partial",
@@ -28,7 +30,7 @@ __all__ = [
28
30
  "render_state_transition_view_svg", "boxes_view",
29
31
  ]
30
32
  __author__ = "Jon Fox"
31
- __version__ = "0.63.0"
33
+ __version__ = "0.65.0"
32
34
 
33
35
  from sysmlpy.usage import (
34
36
  Item, Attribute, Part, Port, Action, Reference, UseCase, Requirement, Interface, Message,
@@ -51,6 +53,10 @@ from sysmlpy.traceability import (
51
53
  from sysmlpy.interchange import (
52
54
  to_interchange, from_interchange, interchange_to_json_text,
53
55
  )
56
+ from sysmlpy.evaluator import (
57
+ evaluate_expression, evaluate_calculation, collect_values,
58
+ check_constraints, ConstraintReport, ConstraintResult,
59
+ )
54
60
 
55
61
 
56
62
  class PartialParseError(Exception):
@@ -31,7 +31,7 @@ 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", "format", "fmt")
34
+ SUBCOMMANDS = ("parse", "analyze", "view", "trace", "export", "import", "eval", "format", "fmt")
35
35
 
36
36
 
37
37
  # ---------------------------------------------------------------------------
@@ -382,6 +382,102 @@ def cmd_import(args) -> int:
382
382
  return 0
383
383
 
384
384
 
385
+ def _parse_eval_value(text):
386
+ """Parse a --set NAME=VALUE literal (number / bool / string / unit)."""
387
+ from sysmlpy.usage import ureg
388
+ raw = text
389
+ low = raw.strip().lower()
390
+ if low == "true":
391
+ return True
392
+ if low == "false":
393
+ return False
394
+ try:
395
+ return int(raw)
396
+ except ValueError:
397
+ pass
398
+ try:
399
+ return float(raw)
400
+ except ValueError:
401
+ pass
402
+ try:
403
+ return ureg(raw)
404
+ except Exception:
405
+ pass
406
+ return raw
407
+
408
+
409
+ def cmd_eval(args) -> int:
410
+ """Expression evaluation / constraint checking (v0.64.0, Goal 4)."""
411
+ from sysmlpy.evaluator import (
412
+ evaluate_expression, collect_values, check_constraints,
413
+ EvaluationError,
414
+ )
415
+
416
+ paths = [Path(f) for f in args.files]
417
+ for p in _missing_files(paths):
418
+ print(f"Error: File '{p}' not found.", file=sys.stderr)
419
+ return 2
420
+
421
+ try:
422
+ model = sysmlpy.load_files(paths, library=args.library)
423
+ except Exception as e:
424
+ print(f"Parse error: {e}", file=sys.stderr)
425
+ return 2
426
+
427
+ bindings = {}
428
+ for spec in args.set or []:
429
+ if "=" not in spec:
430
+ print(f"Error: --set expects NAME=VALUE, got {spec!r}",
431
+ file=sys.stderr)
432
+ return 2
433
+ name, _, raw = spec.partition("=")
434
+ bindings[name.strip()] = _parse_eval_value(raw)
435
+
436
+ if args.expr is not None:
437
+ try:
438
+ value = evaluate_expression(
439
+ args.expr, model=model, element=args.element,
440
+ bindings=bindings,
441
+ )
442
+ except EvaluationError as e:
443
+ print(f"Error: {e}", file=sys.stderr)
444
+ return 1
445
+ print(_format_value(value))
446
+ return 0
447
+
448
+ if args.constraints:
449
+ report = check_constraints(model, bindings=bindings)
450
+ output = report.to_text()
451
+ if args.output:
452
+ Path(args.output).write_text(output + "\n", encoding="utf-8")
453
+ print(f"Wrote {args.output}")
454
+ else:
455
+ print(output)
456
+ if report.failed or report.errored:
457
+ return 1
458
+ return 0
459
+
460
+ # default: dump all attribute values
461
+ values = collect_values(model, bindings=bindings)
462
+ lines = [f"{name} = {_format_value(value)}"
463
+ for name, value in sorted(values.items())]
464
+ output = "\n".join(lines) if lines else "(no attribute values)"
465
+ if args.output:
466
+ Path(args.output).write_text(output + "\n", encoding="utf-8")
467
+ print(f"Wrote {args.output}")
468
+ else:
469
+ print(output)
470
+ return 0
471
+
472
+
473
+ def _format_value(value):
474
+ if isinstance(value, bool):
475
+ return str(value)
476
+ if value is None:
477
+ return "null"
478
+ return str(value)
479
+
480
+
385
481
  # ---------------------------------------------------------------------------
386
482
  # legacy flat invocation (kept for backward compatibility)
387
483
  # ---------------------------------------------------------------------------
@@ -643,6 +739,42 @@ def build_parser() -> argparse.ArgumentParser:
643
739
  )
644
740
  p_import.set_defaults(func=cmd_import)
645
741
 
742
+ p_eval = sub.add_parser(
743
+ "eval",
744
+ help="Evaluate expressions, attribute values and constraints",
745
+ description="Bind pint attribute values and evaluate SysML "
746
+ "expressions, calc results, or constraint bodies. "
747
+ "Exit codes: 0 clean, 1 constraint failed / "
748
+ "evaluation error, 2 parse error.",
749
+ )
750
+ p_eval.add_argument("files", nargs="+", help="SysML v2 file(s)")
751
+ p_eval.add_argument(
752
+ "--expr",
753
+ help="Evaluate this expression against the model scope",
754
+ )
755
+ p_eval.add_argument(
756
+ "--set", action="append", metavar="NAME=VALUE",
757
+ help="Override a name for this evaluation (repeatable; values "
758
+ "may be numbers, true/false, or unit strings like '80 km/h')",
759
+ )
760
+ p_eval.add_argument(
761
+ "--element",
762
+ help="Qualified element name whose scope to evaluate in",
763
+ )
764
+ p_eval.add_argument(
765
+ "--constraints", action="store_true",
766
+ help="Evaluate all constraint bodies; exit 1 on any failure",
767
+ )
768
+ p_eval.add_argument(
769
+ "-o", "--output",
770
+ help="Write the report/value to a file instead of stdout",
771
+ )
772
+ p_eval.add_argument(
773
+ "-l", "--library",
774
+ help="Path to SysML v2 library files to use for parsing",
775
+ )
776
+ p_eval.set_defaults(func=cmd_eval)
777
+
646
778
  return parser
647
779
 
648
780
 
@@ -12732,6 +12732,17 @@ def _visit_nested_definition_element(def_elem):
12732
12732
  return _make_port_definition_dict(def_elem.portDefinition(), None)
12733
12733
  elif hasattr(def_elem, 'interfaceDefinition') and def_elem.interfaceDefinition():
12734
12734
  return _make_interface_definition_dict(def_elem.interfaceDefinition(), None)
12735
+ elif hasattr(def_elem, 'calculationDefinition') and def_elem.calculationDefinition():
12736
+ # v0.64.0 (Goal 4): calc defs inside part/item/etc. bodies were
12737
+ # silently dropped (returned None), losing the result expression
12738
+ # the evaluator needs.
12739
+ return _make_calculation_definition_dict(
12740
+ def_elem.calculationDefinition(), None
12741
+ )
12742
+ elif hasattr(def_elem, 'constraintDefinition') and def_elem.constraintDefinition():
12743
+ return _make_constraint_definition_dict(
12744
+ def_elem.constraintDefinition(), None
12745
+ )
12735
12746
  elif hasattr(def_elem, 'annotatingElement') and def_elem.annotatingElement():
12736
12747
  ann_ctx = def_elem.annotatingElement()
12737
12748
  ann_dict = _visit_annotating_element_dict(ann_ctx)