sysmlpy 0.64.0__tar.gz → 0.66.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 (157) hide show
  1. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/PKG-INFO +3 -1
  2. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/pyproject.toml +4 -1
  3. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/__init__.py +9 -1
  4. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/__main__.py +89 -3
  5. sysmlpy-0.66.0/src/sysmlpy/lsp/__init__.py +24 -0
  6. sysmlpy-0.66.0/src/sysmlpy/lsp/__main__.py +9 -0
  7. sysmlpy-0.66.0/src/sysmlpy/lsp/protocol.py +106 -0
  8. sysmlpy-0.66.0/src/sysmlpy/lsp/server.py +738 -0
  9. sysmlpy-0.66.0/src/sysmlpy/lsp/stdio.py +104 -0
  10. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/plantuml.py +25 -0
  11. sysmlpy-0.66.0/src/sysmlpy/spreadsheet.py +259 -0
  12. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/LICENSE +0 -0
  13. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/README.md +0 -0
  14. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/antlr/README.md +0 -0
  15. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/antlr/SysMLv2Lexer.interp +0 -0
  16. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/antlr/SysMLv2Lexer.py +0 -0
  17. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/antlr/SysMLv2Lexer.tokens +0 -0
  18. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/antlr/SysMLv2Parser.interp +0 -0
  19. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/antlr/SysMLv2Parser.py +0 -0
  20. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/antlr/SysMLv2Parser.tokens +0 -0
  21. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/antlr/SysMLv2ParserListener.py +0 -0
  22. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/antlr/SysMLv2ParserVisitor.py +0 -0
  23. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/antlr/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.interp +0 -0
  24. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/antlr/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.py +0 -0
  25. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/antlr/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.tokens +0 -0
  26. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/antlr_parser.py +0 -0
  27. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/antlr_visitor.py +0 -0
  28. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/boxes_view.py +0 -0
  29. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/definition.py +0 -0
  30. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/evaluator.py +0 -0
  31. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/examples/attribute_values.py +0 -0
  32. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/examples/part_attributes.py +0 -0
  33. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/examples/tuples_sequences.py +0 -0
  34. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/formatting.py +0 -0
  35. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/grammar/antlr4/README.md +0 -0
  36. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.g4 +0 -0
  37. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.interp +0 -0
  38. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.py +0 -0
  39. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.tokens +0 -0
  40. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.g4 +0 -0
  41. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.interp +0 -0
  42. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.py +0 -0
  43. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.tokens +0 -0
  44. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/grammar/antlr4/SysMLv2ParserListener.py +0 -0
  45. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/grammar/antlr4/SysMLv2ParserVisitor.py +0 -0
  46. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/grammar/antlr4/desc.xml +0 -0
  47. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/grammar/antlr4/examples/camera.sysml +0 -0
  48. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/grammar/antlr4/examples/toaster-system.sysml +0 -0
  49. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/grammar/antlr4/examples/vehicle-model.sysml +0 -0
  50. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/grammar/antlr4/pom.xml +0 -0
  51. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/grammar/classes.py +0 -0
  52. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/interchange.py +0 -0
  53. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/LICENSE +0 -0
  54. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/README.md +0 -0
  55. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/__init__.py +0 -0
  56. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Analysis/AnalysisTooling.sysml +0 -0
  57. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Analysis/SampledFunctions.sysml +0 -0
  58. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Analysis/StateSpaceRepresentation.sysml +0 -0
  59. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Analysis/TradeStudies.sysml +0 -0
  60. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Cause and Effect/CausationConnections.sysml +0 -0
  61. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Cause and Effect/CauseAndEffect.sysml +0 -0
  62. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Geometry/ShapeItems.sysml +0 -0
  63. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Geometry/SpatialItems.sysml +0 -0
  64. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Metadata/ImageMetadata.sysml +0 -0
  65. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Metadata/ModelingMetadata.sysml +0 -0
  66. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Metadata/ParametersOfInterestMetadata.sysml +0 -0
  67. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Metadata/RiskMetadata.sysml +0 -0
  68. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/ISQ.sysml +0 -0
  69. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/ISQAcoustics.sysml +0 -0
  70. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/ISQAtomicNuclear.sysml +0 -0
  71. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/ISQBase.sysml +0 -0
  72. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/ISQCharacteristicNumbers.sysml +0 -0
  73. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/ISQChemistryMolecular.sysml +0 -0
  74. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/ISQCondensedMatter.sysml +0 -0
  75. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/ISQElectromagnetism.sysml +0 -0
  76. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/ISQInformation.sysml +0 -0
  77. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/ISQLight.sysml +0 -0
  78. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/ISQMechanics.sysml +0 -0
  79. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/ISQSpaceTime.sysml +0 -0
  80. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/ISQThermodynamics.sysml +0 -0
  81. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/MeasurementRefCalculations.sysml +0 -0
  82. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/MeasurementReferences.sysml +0 -0
  83. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/Quantities.sysml +0 -0
  84. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/QuantityCalculations.sysml +0 -0
  85. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/SI.sysml +0 -0
  86. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/SIPrefixes.sysml +0 -0
  87. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/TensorCalculations.sysml +0 -0
  88. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/Time.sysml +0 -0
  89. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/USCustomaryUnits.sysml +0 -0
  90. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/VectorCalculations.sysml +0 -0
  91. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Requirement Derivation/DerivationConnections.sysml +0 -0
  92. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Requirement Derivation/RequirementDerivation.sysml +0 -0
  93. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/Base.kerml +0 -0
  94. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/BaseFunctions.kerml +0 -0
  95. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/BooleanFunctions.kerml +0 -0
  96. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/Clocks.kerml +0 -0
  97. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/CollectionFunctions.kerml +0 -0
  98. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/Collections.kerml +0 -0
  99. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/ComplexFunctions.kerml +0 -0
  100. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/ControlFunctions.kerml +0 -0
  101. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/ControlPerformances.kerml +0 -0
  102. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/DataFunctions.kerml +0 -0
  103. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/FeatureReferencingPerformances.kerml +0 -0
  104. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/IntegerFunctions.kerml +0 -0
  105. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/KerML.kerml +0 -0
  106. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/Links.kerml +0 -0
  107. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/Metaobjects.kerml +0 -0
  108. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/NaturalFunctions.kerml +0 -0
  109. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/NumericalFunctions.kerml +0 -0
  110. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/Objects.kerml +0 -0
  111. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/Observation.kerml +0 -0
  112. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/OccurrenceFunctions.kerml +0 -0
  113. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/Occurrences.kerml +0 -0
  114. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/Performances.kerml +0 -0
  115. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/RationalFunctions.kerml +0 -0
  116. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/RealFunctions.kerml +0 -0
  117. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/ScalarFunctions.kerml +0 -0
  118. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/ScalarValues.kerml +0 -0
  119. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/SequenceFunctions.kerml +0 -0
  120. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/SpatialFrames.kerml +0 -0
  121. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/StatePerformances.kerml +0 -0
  122. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/StringFunctions.kerml +0 -0
  123. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/Transfers.kerml +0 -0
  124. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/TransitionPerformances.kerml +0 -0
  125. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/TrigFunctions.kerml +0 -0
  126. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/Triggers.kerml +0 -0
  127. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/VectorFunctions.kerml +0 -0
  128. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/VectorValues.kerml +0 -0
  129. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/Actions.sysml +0 -0
  130. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/Allocations.sysml +0 -0
  131. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/AnalysisCases.sysml +0 -0
  132. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/Attributes.sysml +0 -0
  133. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/Calculations.sysml +0 -0
  134. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/Cases.sysml +0 -0
  135. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/Connections.sysml +0 -0
  136. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/Constraints.sysml +0 -0
  137. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/Flows.sysml +0 -0
  138. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/Interfaces.sysml +0 -0
  139. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/Items.sysml +0 -0
  140. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/Metadata.sysml +0 -0
  141. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/Parts.sysml +0 -0
  142. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/Ports.sysml +0 -0
  143. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/Requirements.sysml +0 -0
  144. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/StandardViewDefinitions.sysml +0 -0
  145. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/States.sysml +0 -0
  146. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/SysML.sysml +0 -0
  147. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/UseCases.sysml +0 -0
  148. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/VerificationCases.sysml +0 -0
  149. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/Views.sysml +0 -0
  150. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/navigate.py +0 -0
  151. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/project.py +0 -0
  152. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/semantic.py +0 -0
  153. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/store.py +0 -0
  154. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/traceability.py +0 -0
  155. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/us_customary_units.txt +0 -0
  156. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/usage.py +0 -0
  157. {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/validator.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sysmlpy
3
- Version: 0.64.0
3
+ Version: 0.66.0
4
4
  Summary:
5
5
  License-File: LICENSE
6
6
  Author: Jon R. Fox (mycr0ft)
@@ -15,10 +15,12 @@ Classifier: Programming Language :: Python :: 3.13
15
15
  Classifier: Programming Language :: Python :: 3.14
16
16
  Provides-Extra: graph
17
17
  Provides-Extra: kuzu
18
+ Provides-Extra: xlsx
18
19
  Requires-Dist: antlr4-python3-runtime (>=4.13)
19
20
  Requires-Dist: arrow (>=1.4.0,<2.0.0)
20
21
  Requires-Dist: kuzu (>=0.7,<0.12) ; extra == "kuzu"
21
22
  Requires-Dist: networkx (>=3.0) ; extra == "graph"
23
+ Requires-Dist: openpyxl (>=3.1) ; extra == "xlsx"
22
24
  Requires-Dist: pint (>=0.24)
23
25
  Requires-Dist: pyyaml (>=6.0)
24
26
  Description-Content-Type: text/markdown
@@ -6,7 +6,7 @@ build-backend = "poetry.core.masonry.api"
6
6
 
7
7
  [project]
8
8
  name = "sysmlpy"
9
- version = "0.64.0"
9
+ version = "0.66.0"
10
10
  description = ""
11
11
  authors = [{ name = "Jon R. Fox (mycr0ft)", email = "jon.fox@drfox.com" }]
12
12
  readme = "README.md"
@@ -19,14 +19,17 @@ pyyaml = ">=6.0"
19
19
  antlr4-python3-runtime = ">=4.13"
20
20
  networkx = { version = ">=3.0", optional = true }
21
21
  kuzu = { version = ">=0.7,<0.12", optional = true }
22
+ openpyxl = { version = ">=3.1", optional = true }
22
23
  arrow = "^1.4.0"
23
24
 
24
25
  [tool.poetry.extras]
25
26
  graph = ["networkx"]
26
27
  kuzu = ["kuzu"]
28
+ xlsx = ["openpyxl"]
27
29
 
28
30
  [tool.poetry.scripts]
29
31
  sysmlpy = "sysmlpy.__main__:main"
32
+ sysmlpy-lsp = "sysmlpy.lsp.stdio:main"
30
33
 
31
34
  [tool.poetry.group.dev.dependencies]
32
35
  pytest = ">=8.0,<9.0"
@@ -22,6 +22,9 @@ __all__ = [
22
22
  "to_interchange", "from_interchange", "interchange_to_json_text",
23
23
  "evaluate_expression", "evaluate_calculation", "collect_values",
24
24
  "check_constraints", "ConstraintReport", "ConstraintResult",
25
+ "tabular_view_to_csv", "data_value_tabular_to_csv",
26
+ "relationship_matrix_to_csv", "write_xlsx",
27
+ "import_values_csv", "import_values_xlsx", "parse_value_literal",
25
28
  "analyze", "AnalysisResult", "SemanticIssue", "SemanticAnalyzer",
26
29
  "SysMLSyntaxError", "PartialParseError",
27
30
  "loads_partial", "load_partial",
@@ -30,7 +33,7 @@ __all__ = [
30
33
  "render_state_transition_view_svg", "boxes_view",
31
34
  ]
32
35
  __author__ = "Jon Fox"
33
- __version__ = "0.64.0"
36
+ __version__ = "0.66.0"
34
37
 
35
38
  from sysmlpy.usage import (
36
39
  Item, Attribute, Part, Port, Action, Reference, UseCase, Requirement, Interface, Message,
@@ -57,6 +60,11 @@ from sysmlpy.evaluator import (
57
60
  evaluate_expression, evaluate_calculation, collect_values,
58
61
  check_constraints, ConstraintReport, ConstraintResult,
59
62
  )
63
+ from sysmlpy.spreadsheet import (
64
+ tabular_view_to_csv, data_value_tabular_to_csv,
65
+ relationship_matrix_to_csv, write_xlsx,
66
+ import_values_csv, import_values_xlsx, parse_value_literal,
67
+ )
60
68
 
61
69
 
62
70
  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", "eval", "format", "fmt")
34
+ SUBCOMMANDS = ("parse", "analyze", "view", "trace", "export", "import", "eval", "xlsx", "format", "fmt")
35
35
 
36
36
 
37
37
  # ---------------------------------------------------------------------------
@@ -433,6 +433,26 @@ def cmd_eval(args) -> int:
433
433
  name, _, raw = spec.partition("=")
434
434
  bindings[name.strip()] = _parse_eval_value(raw)
435
435
 
436
+ if getattr(args, "set_file", None):
437
+ from sysmlpy.spreadsheet import import_values_csv, import_values_xlsx
438
+ setfile = Path(args.set_file)
439
+ if not setfile.exists():
440
+ print(f"Error: --set-file '{setfile}' not found.", file=sys.stderr)
441
+ return 2
442
+ try:
443
+ if setfile.suffix.lower() == ".xlsx":
444
+ file_bindings = import_values_xlsx(setfile)
445
+ else:
446
+ # utf-8-sig tolerates Excel's BOM on CSV exports
447
+ file_bindings = import_values_csv(
448
+ setfile.read_text(encoding="utf-8-sig")
449
+ )
450
+ except (ValueError, ImportError, OSError) as e:
451
+ print(f"Error: --set-file: {e}", file=sys.stderr)
452
+ return 1
453
+ # --set flags win over spreadsheet values
454
+ bindings = {**file_bindings, **bindings}
455
+
436
456
  if args.expr is not None:
437
457
  try:
438
458
  value = evaluate_expression(
@@ -478,6 +498,36 @@ def _format_value(value):
478
498
  return str(value)
479
499
 
480
500
 
501
+ def cmd_xlsx(args) -> int:
502
+ """Export tabular views to an Excel workbook (v0.66.0, Goal 7)."""
503
+ from sysmlpy.spreadsheet import write_xlsx
504
+
505
+ paths = [Path(f) for f in args.files]
506
+ for p in _missing_files(paths):
507
+ print(f"Error: File '{p}' not found.", file=sys.stderr)
508
+ return 2
509
+
510
+ try:
511
+ model = sysmlpy.load_files(paths, library=args.library)
512
+ except Exception as e:
513
+ print(f"Parse error: {e}", file=sys.stderr)
514
+ return 2
515
+
516
+ include = tuple(s.strip() for s in args.sheets.split(",") if s.strip())
517
+ try:
518
+ out = write_xlsx(model, args.output, include=include,
519
+ focus=args.focus)
520
+ except ImportError as e:
521
+ print(f"Error: {e}", file=sys.stderr)
522
+ return 1
523
+ except Exception as e:
524
+ print(f"Error: xlsx export failed: {type(e).__name__}: {e}",
525
+ file=sys.stderr)
526
+ return 1
527
+ print(f"Wrote {out}")
528
+ return 0
529
+
530
+
481
531
  # ---------------------------------------------------------------------------
482
532
  # legacy flat invocation (kept for backward compatibility)
483
533
  # ---------------------------------------------------------------------------
@@ -642,8 +692,9 @@ def build_parser() -> argparse.ArgumentParser:
642
692
  help="Graph direction (graph views only)",
643
693
  )
644
694
  p_view.add_argument(
645
- "--format", choices=("plantuml", "markdown", "html"),
646
- help="Output format for tabular/datavalue/matrix views",
695
+ "--format", choices=("plantuml", "markdown", "html", "csv"),
696
+ help="Output format for tabular/datavalue/matrix views "
697
+ "(csv added in v0.66.0)",
647
698
  )
648
699
  p_view.add_argument(
649
700
  "-l", "--library",
@@ -757,6 +808,12 @@ def build_parser() -> argparse.ArgumentParser:
757
808
  help="Override a name for this evaluation (repeatable; values "
758
809
  "may be numbers, true/false, or unit strings like '80 km/h')",
759
810
  )
811
+ p_eval.add_argument(
812
+ "--set-file", metavar="FILE",
813
+ help="Load bindings from a CSV/XLSX values file "
814
+ "(v0.66.0; headers: Name,Value[,Unit] or "
815
+ "Element,Attribute,Value[,Unit])",
816
+ )
760
817
  p_eval.add_argument(
761
818
  "--element",
762
819
  help="Qualified element name whose scope to evaluate in",
@@ -775,6 +832,35 @@ def build_parser() -> argparse.ArgumentParser:
775
832
  )
776
833
  p_eval.set_defaults(func=cmd_eval)
777
834
 
835
+ # -- xlsx (v0.66.0, Goal 7) -------------------------------------------------
836
+ p_xlsx = sub.add_parser(
837
+ "xlsx",
838
+ help="Export tabular views to an Excel workbook",
839
+ description="Write the Tabular / DataValues / Matrix views into "
840
+ "an .xlsx workbook (requires the 'openpyxl' extra: "
841
+ "pip install 'sysmlpy[xlsx]'). Exit codes: 0 clean, "
842
+ "1 error, 2 parse error.",
843
+ )
844
+ p_xlsx.add_argument("files", nargs="+", help="SysML v2 file(s)")
845
+ p_xlsx.add_argument(
846
+ "-o", "--output", required=True,
847
+ help="Output .xlsx file path",
848
+ )
849
+ p_xlsx.add_argument(
850
+ "--sheets", default="tabular,data_value,matrix",
851
+ help="Comma-separated sheet selection: tabular,data_value,matrix "
852
+ "(default: all)",
853
+ )
854
+ p_xlsx.add_argument(
855
+ "--focus",
856
+ help="Focus element for the tabular views",
857
+ )
858
+ p_xlsx.add_argument(
859
+ "-l", "--library",
860
+ help="Path to SysML v2 library files to use for parsing",
861
+ )
862
+ p_xlsx.set_defaults(func=cmd_xlsx)
863
+
778
864
  return parser
779
865
 
780
866
 
@@ -0,0 +1,24 @@
1
+ # LSP package (v0.65.0 — Adoption Roadmap Goal 5)
2
+ #
3
+ # A minimal Language Server Protocol (LSP 3.17) implementation exposing
4
+ # sysmlpy's parse/analyze pipeline to editors:
5
+ #
6
+ # textDocument/didOpen|didChange|didClose → publishDiagnostics
7
+ # textDocument/hover | /documentSymbol | /definition | /completion
8
+ #
9
+ # Layout:
10
+ # protocol.py — JSON-RPC Content-Length framing + LSP constants
11
+ # server.py — transport-agnostic language server (dict in → dict out)
12
+ # stdio.py — stdio transport; ``python -m sysmlpy.lsp`` entry point
13
+ #
14
+ # See docs/LSP.md for VS Code / Neovim wiring instructions.
15
+
16
+ from sysmlpy.lsp.protocol import (
17
+ encode_message, read_message, ErrorCodes, SymbolKind,
18
+ )
19
+ from sysmlpy.lsp.server import Document, DocumentIndex, SysmlLanguageServer
20
+
21
+ __all__ = [
22
+ "encode_message", "read_message", "ErrorCodes", "SymbolKind",
23
+ "Document", "DocumentIndex", "SysmlLanguageServer",
24
+ ]
@@ -0,0 +1,9 @@
1
+ # -*- coding: utf-8 -*-
2
+ """``python -m sysmlpy.lsp`` — run the language server over stdio."""
3
+
4
+ import sys
5
+
6
+ from sysmlpy.lsp.stdio import main
7
+
8
+ if __name__ == "__main__":
9
+ sys.exit(main())
@@ -0,0 +1,106 @@
1
+ # -*- coding: utf-8 -*-
2
+ """JSON-RPC / LSP protocol helpers (v0.65.0 — Adoption Roadmap Goal 5).
3
+
4
+ Implements the ``Content-Length`` message framing used by the Language
5
+ Server Protocol over byte streams, plus the small set of LSP constants
6
+ the server needs. Deliberately dependency-free so the server core can
7
+ be tested in-process without a transport.
8
+
9
+ Message framing (both sides):
10
+
11
+ Content-Length: <bytes>\\r\\n
12
+ [Content-Type: application/vscode-jsonrpc; charset=utf-8]\\r\\n
13
+ \\r\\n
14
+ <JSON payload>
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ import json
20
+ from typing import BinaryIO, Dict, Any, Optional
21
+
22
+ HEADER_ENCODING = "ascii"
23
+ PAYLOAD_ENCODING = "utf-8"
24
+
25
+
26
+ class ErrorCodes:
27
+ """JSON-RPC / LSP error codes used by the server."""
28
+
29
+ PARSE_ERROR = -32700
30
+ INVALID_REQUEST = -32600
31
+ METHOD_NOT_FOUND = -32601
32
+ INVALID_PARAMS = -32602
33
+ INTERNAL_ERROR = -32603
34
+ SERVER_NOT_INITIALIZED = -32002
35
+
36
+
37
+ class SymbolKind:
38
+ """LSP SymbolKind values used in documentSymbol results."""
39
+
40
+ FILE = 1
41
+ MODULE = 2
42
+ NAMESPACE = 3
43
+ PACKAGE = 4
44
+ CLASS = 5
45
+ METHOD = 6
46
+ PROPERTY = 7
47
+ FIELD = 8
48
+ ENUM = 10
49
+ INTERFACE = 11
50
+ FUNCTION = 12
51
+ VARIABLE = 13
52
+ CONSTANT = 14
53
+ ENUM_MEMBER = 22
54
+ STRUCT = 23
55
+
56
+
57
+ def encode_message(payload: Dict[str, Any]) -> bytes:
58
+ """Encode a JSON-RPC message dict with LSP ``Content-Length`` framing."""
59
+ body = json.dumps(payload, ensure_ascii=False).encode(PAYLOAD_ENCODING)
60
+ header = f"Content-Length: {len(body)}\r\n\r\n".encode(HEADER_ENCODING)
61
+ return header + body
62
+
63
+
64
+ def read_message(stream: BinaryIO) -> Optional[Dict[str, Any]]:
65
+ """Read one framed JSON-RPC message from a binary stream.
66
+
67
+ Returns the decoded message dict, or ``None`` on clean EOF before any
68
+ header bytes. Raises ``ValueError`` on malformed framing.
69
+
70
+ Tolerates ``\\n``-only header terminators in addition to the spec's
71
+ ``\\r\\n`` (some clients get this wrong; being lenient costs nothing).
72
+ """
73
+ # Read header lines until the blank separator.
74
+ content_length: Optional[int] = None
75
+ saw_header_bytes = False
76
+ while True:
77
+ line = stream.readline()
78
+ if not line:
79
+ if not saw_header_bytes:
80
+ return None # clean EOF
81
+ raise ValueError("EOF while reading message header")
82
+ stripped = line.strip()
83
+ if not stripped:
84
+ if content_length is None and not saw_header_bytes:
85
+ continue # tolerate stray blank lines between messages
86
+ break # end of headers
87
+ saw_header_bytes = True
88
+ name, _, value = stripped.partition(b":")
89
+ if name.strip().lower() == b"content-length":
90
+ try:
91
+ content_length = int(value.strip())
92
+ except ValueError:
93
+ raise ValueError(
94
+ f"Malformed Content-Length header: {value!r}"
95
+ ) from None
96
+
97
+ if content_length is None:
98
+ raise ValueError("Missing Content-Length header")
99
+
100
+ body = stream.read(content_length)
101
+ if len(body) < content_length:
102
+ raise ValueError(
103
+ f"EOF while reading message body "
104
+ f"({len(body)} of {content_length} bytes)"
105
+ )
106
+ return json.loads(body.decode(PAYLOAD_ENCODING))