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.
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/PKG-INFO +3 -1
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/pyproject.toml +4 -1
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/__init__.py +9 -1
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/__main__.py +89 -3
- sysmlpy-0.66.0/src/sysmlpy/lsp/__init__.py +24 -0
- sysmlpy-0.66.0/src/sysmlpy/lsp/__main__.py +9 -0
- sysmlpy-0.66.0/src/sysmlpy/lsp/protocol.py +106 -0
- sysmlpy-0.66.0/src/sysmlpy/lsp/server.py +738 -0
- sysmlpy-0.66.0/src/sysmlpy/lsp/stdio.py +104 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/plantuml.py +25 -0
- sysmlpy-0.66.0/src/sysmlpy/spreadsheet.py +259 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/LICENSE +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/README.md +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/antlr/README.md +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/antlr/SysMLv2Lexer.interp +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/antlr/SysMLv2Lexer.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/antlr/SysMLv2Lexer.tokens +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/antlr/SysMLv2Parser.interp +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/antlr/SysMLv2Parser.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/antlr/SysMLv2Parser.tokens +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/antlr/SysMLv2ParserListener.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/antlr/SysMLv2ParserVisitor.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/antlr/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.interp +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/antlr/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/antlr/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.tokens +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/antlr_parser.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/antlr_visitor.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/boxes_view.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/definition.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/evaluator.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/examples/attribute_values.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/examples/part_attributes.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/examples/tuples_sequences.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/formatting.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/grammar/antlr4/README.md +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.g4 +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.interp +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.tokens +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.g4 +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.interp +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.tokens +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/grammar/antlr4/SysMLv2ParserListener.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/grammar/antlr4/SysMLv2ParserVisitor.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/grammar/antlr4/desc.xml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/grammar/antlr4/examples/camera.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/grammar/antlr4/examples/toaster-system.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/grammar/antlr4/examples/vehicle-model.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/grammar/antlr4/pom.xml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/grammar/classes.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/interchange.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/LICENSE +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/README.md +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/__init__.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Analysis/AnalysisTooling.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Analysis/SampledFunctions.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Analysis/StateSpaceRepresentation.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Analysis/TradeStudies.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Cause and Effect/CausationConnections.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Cause and Effect/CauseAndEffect.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Geometry/ShapeItems.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Geometry/SpatialItems.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Metadata/ImageMetadata.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Metadata/ModelingMetadata.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Metadata/ParametersOfInterestMetadata.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Metadata/RiskMetadata.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/ISQ.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/ISQAcoustics.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/ISQAtomicNuclear.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/ISQBase.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/ISQCharacteristicNumbers.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/ISQChemistryMolecular.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/ISQCondensedMatter.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/ISQElectromagnetism.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/ISQInformation.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/ISQLight.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/ISQMechanics.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/ISQSpaceTime.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/ISQThermodynamics.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/MeasurementRefCalculations.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/MeasurementReferences.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/Quantities.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/QuantityCalculations.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/SI.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/SIPrefixes.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/TensorCalculations.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/Time.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/USCustomaryUnits.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Quantities and Units/VectorCalculations.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Requirement Derivation/DerivationConnections.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/domain/Requirement Derivation/RequirementDerivation.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/Base.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/BaseFunctions.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/BooleanFunctions.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/Clocks.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/CollectionFunctions.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/Collections.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/ComplexFunctions.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/ControlFunctions.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/ControlPerformances.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/DataFunctions.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/FeatureReferencingPerformances.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/IntegerFunctions.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/KerML.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/Links.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/Metaobjects.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/NaturalFunctions.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/NumericalFunctions.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/Objects.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/Observation.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/OccurrenceFunctions.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/Occurrences.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/Performances.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/RationalFunctions.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/RealFunctions.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/ScalarFunctions.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/ScalarValues.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/SequenceFunctions.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/SpatialFrames.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/StatePerformances.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/StringFunctions.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/Transfers.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/TransitionPerformances.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/TrigFunctions.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/Triggers.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/VectorFunctions.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/kernel/VectorValues.kerml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/Actions.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/Allocations.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/AnalysisCases.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/Attributes.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/Calculations.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/Cases.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/Connections.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/Constraints.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/Flows.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/Interfaces.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/Items.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/Metadata.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/Parts.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/Ports.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/Requirements.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/StandardViewDefinitions.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/States.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/SysML.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/UseCases.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/VerificationCases.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/library/systems/Views.sysml +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/navigate.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/project.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/semantic.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/store.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/traceability.py +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/us_customary_units.txt +0 -0
- {sysmlpy-0.64.0 → sysmlpy-0.66.0}/src/sysmlpy/usage.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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,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))
|