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