sysmlpy 0.67.0__tar.gz → 0.69.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.67.0/README.md → sysmlpy-0.69.0/PKG-INFO +55 -1
- sysmlpy-0.67.0/PKG-INFO → sysmlpy-0.69.0/README.md +25 -29
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/pyproject.toml +3 -1
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/__init__.py +19 -6
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/__main__.py +80 -1
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/antlr_visitor.py +119 -20
- sysmlpy-0.69.0/src/sysmlpy/boxes_view.py +1689 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/grammar/classes.py +8 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/plantuml.py +776 -96
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/semantic.py +97 -0
- sysmlpy-0.69.0/src/sysmlpy/sim.py +781 -0
- sysmlpy-0.67.0/src/sysmlpy/boxes_view.py +0 -841
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/LICENSE +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/antlr/README.md +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/antlr/SysMLv2Lexer.interp +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/antlr/SysMLv2Lexer.py +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/antlr/SysMLv2Lexer.tokens +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/antlr/SysMLv2Parser.interp +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/antlr/SysMLv2Parser.py +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/antlr/SysMLv2Parser.tokens +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/antlr/SysMLv2ParserListener.py +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/antlr/SysMLv2ParserVisitor.py +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/antlr/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.interp +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/antlr/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.py +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/antlr/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.tokens +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/antlr_parser.py +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/definition.py +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/evaluator.py +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/examples/attribute_values.py +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/examples/part_attributes.py +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/examples/tuples_sequences.py +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/formatting.py +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/grammar/antlr4/README.md +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.g4 +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.interp +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.py +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.tokens +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.g4 +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.interp +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.py +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.tokens +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/grammar/antlr4/SysMLv2ParserListener.py +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/grammar/antlr4/SysMLv2ParserVisitor.py +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/grammar/antlr4/desc.xml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/grammar/antlr4/examples/camera.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/grammar/antlr4/examples/toaster-system.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/grammar/antlr4/examples/vehicle-model.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/grammar/antlr4/pom.xml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/interchange.py +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/LICENSE +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/README.md +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/__init__.py +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Analysis/AnalysisTooling.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Analysis/SampledFunctions.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Analysis/StateSpaceRepresentation.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Analysis/TradeStudies.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Cause and Effect/CausationConnections.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Cause and Effect/CauseAndEffect.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Geometry/ShapeItems.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Geometry/SpatialItems.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Metadata/ImageMetadata.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Metadata/ModelingMetadata.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Metadata/ParametersOfInterestMetadata.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Metadata/RiskMetadata.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/ISQ.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/ISQAcoustics.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/ISQAtomicNuclear.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/ISQBase.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/ISQCharacteristicNumbers.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/ISQChemistryMolecular.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/ISQCondensedMatter.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/ISQElectromagnetism.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/ISQInformation.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/ISQLight.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/ISQMechanics.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/ISQSpaceTime.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/ISQThermodynamics.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/MeasurementRefCalculations.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/MeasurementReferences.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/Quantities.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/QuantityCalculations.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/SI.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/SIPrefixes.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/TensorCalculations.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/Time.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/USCustomaryUnits.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Quantities and Units/VectorCalculations.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Requirement Derivation/DerivationConnections.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/domain/Requirement Derivation/RequirementDerivation.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/Base.kerml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/BaseFunctions.kerml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/BooleanFunctions.kerml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/Clocks.kerml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/CollectionFunctions.kerml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/Collections.kerml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/ComplexFunctions.kerml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/ControlFunctions.kerml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/ControlPerformances.kerml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/DataFunctions.kerml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/FeatureReferencingPerformances.kerml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/IntegerFunctions.kerml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/KerML.kerml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/Links.kerml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/Metaobjects.kerml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/NaturalFunctions.kerml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/NumericalFunctions.kerml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/Objects.kerml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/Observation.kerml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/OccurrenceFunctions.kerml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/Occurrences.kerml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/Performances.kerml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/RationalFunctions.kerml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/RealFunctions.kerml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/ScalarFunctions.kerml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/ScalarValues.kerml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/SequenceFunctions.kerml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/SpatialFrames.kerml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/StatePerformances.kerml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/StringFunctions.kerml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/Transfers.kerml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/TransitionPerformances.kerml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/TrigFunctions.kerml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/Triggers.kerml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/VectorFunctions.kerml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/kernel/VectorValues.kerml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/Actions.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/Allocations.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/AnalysisCases.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/Attributes.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/Calculations.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/Cases.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/Connections.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/Constraints.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/Flows.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/Interfaces.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/Items.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/Metadata.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/Parts.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/Ports.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/Requirements.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/StandardViewDefinitions.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/States.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/SysML.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/UseCases.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/VerificationCases.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/library/systems/Views.sysml +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/lsp/__init__.py +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/lsp/__main__.py +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/lsp/protocol.py +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/lsp/server.py +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/lsp/stdio.py +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/navigate.py +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/project.py +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/spreadsheet.py +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/store.py +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/traceability.py +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/us_customary_units.txt +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/usage.py +0 -0
- {sysmlpy-0.67.0 → sysmlpy-0.69.0}/src/sysmlpy/validator.py +0 -0
|
@@ -1,3 +1,32 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: sysmlpy
|
|
3
|
+
Version: 0.69.0
|
|
4
|
+
Summary:
|
|
5
|
+
License-File: LICENSE
|
|
6
|
+
Author: Jon R. Fox (mycr0ft)
|
|
7
|
+
Author-email: jon.fox@drfox.com
|
|
8
|
+
Requires-Python: >=3.9,<4.0
|
|
9
|
+
Classifier: Programming Language :: Python :: 3
|
|
10
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
11
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
16
|
+
Provides-Extra: graph
|
|
17
|
+
Provides-Extra: kuzu
|
|
18
|
+
Provides-Extra: sim
|
|
19
|
+
Provides-Extra: xlsx
|
|
20
|
+
Requires-Dist: antlr4-python3-runtime (>=4.13)
|
|
21
|
+
Requires-Dist: arrow (>=1.4.0,<2.0.0)
|
|
22
|
+
Requires-Dist: kuzu (>=0.7,<0.12) ; extra == "kuzu"
|
|
23
|
+
Requires-Dist: networkx (>=3.0) ; extra == "graph"
|
|
24
|
+
Requires-Dist: openpyxl (>=3.1) ; extra == "xlsx"
|
|
25
|
+
Requires-Dist: pint (>=0.24)
|
|
26
|
+
Requires-Dist: pyyaml (>=6.0)
|
|
27
|
+
Requires-Dist: transitions (>=0.9,<0.10) ; extra == "sim"
|
|
28
|
+
Description-Content-Type: text/markdown
|
|
29
|
+
|
|
1
30
|
# sysmlpy
|
|
2
31
|
[](https://badge.fury.io/py/sysmlpy)[](https://pypi.python.org/pypi/sysmlpy/)[](https://lbesson.mit-license.org/)
|
|
3
32
|
|
|
@@ -577,7 +606,7 @@ print(as_package_view(model, style="bw"))
|
|
|
577
606
|
```
|
|
578
607
|
|
|
579
608
|
#### Action Flow View (AFV) — `as_action_flow_view()`
|
|
580
|
-
Corresponds to SysML v2 ``ActionFlowView`` (short name ``afv``). Shows actions with their control and object flows. Auto-includes connected flow elements.
|
|
609
|
+
Corresponds to SysML v2 ``ActionFlowView`` (short name ``afv``). Shows actions with their control and object flows. Auto-includes connected flow elements. Control nodes render too: `first start` → solid initial dot, `decide`/`merge`/`fork`/`join` → hexagon nodes, `done`/`terminate` targets → final circle, with dotted succession edges (`..>`) and guard conditions as labels.
|
|
581
610
|
|
|
582
611
|

|
|
583
612
|
|
|
@@ -586,6 +615,30 @@ from sysmlpy.plantuml import as_action_flow_view
|
|
|
586
615
|
print(as_action_flow_view(model, style="bw"))
|
|
587
616
|
```
|
|
588
617
|
|
|
618
|
+
#### Boxes Views — Java-free braille + SVG (v0.68.0)
|
|
619
|
+
Native text/graphics rendering through the sibling `diagramboxes`
|
|
620
|
+
package — no PlantUML/Java required. Interconnection, action flow and
|
|
621
|
+
state transition views render to Unicode-braille text (terminal) or
|
|
622
|
+
SVG. Monochrome by design (color-vision friendly).
|
|
623
|
+
|
|
624
|
+

|
|
625
|
+
|
|
626
|
+
```python
|
|
627
|
+
from sysmlpy.boxes_view import (
|
|
628
|
+
render_interconnection_view_boxes, # iv: parts + ports + connection edges
|
|
629
|
+
render_action_flow_view_boxes, # afv: actions + in/out ports + flows
|
|
630
|
+
render_state_transition_view, # stv: nested composite state boxes
|
|
631
|
+
)
|
|
632
|
+
print(render_interconnection_view_boxes(model))
|
|
633
|
+
```
|
|
634
|
+
|
|
635
|
+
```
|
|
636
|
+
⡰⠊⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠲⡀ ⡰⠊⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠲⡀
|
|
637
|
+
⡇ «part» ⡇ ⡇ «part» ⡇
|
|
638
|
+
⡇ engine ⡇ ⡇ pump ⡇
|
|
639
|
+
⡇ ⡇ ⡇ ⡇
|
|
640
|
+
```
|
|
641
|
+
|
|
589
642
|
#### Interconnection View (IV) — `as_interconnection_view()` / `as_interconnection_diagram()`
|
|
590
643
|
Corresponds to SysML v2 ``InterconnectionView`` (short name ``iv``). Focuses on connectors, bindings, and flow paths between ports and parts.
|
|
591
644
|
|
|
@@ -750,3 +803,4 @@ Two companion tools for the SysML v2 community, created by the same author:
|
|
|
750
803
|
|
|
751
804
|
## License
|
|
752
805
|
sysmlpy is released under the MIT license, hence allowing commercial use of the library.
|
|
806
|
+
|
|
@@ -1,30 +1,3 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: sysmlpy
|
|
3
|
-
Version: 0.67.0
|
|
4
|
-
Summary:
|
|
5
|
-
License-File: LICENSE
|
|
6
|
-
Author: Jon R. Fox (mycr0ft)
|
|
7
|
-
Author-email: jon.fox@drfox.com
|
|
8
|
-
Requires-Python: >=3.9,<4.0
|
|
9
|
-
Classifier: Programming Language :: Python :: 3
|
|
10
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
11
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
12
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
13
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
14
|
-
Classifier: Programming Language :: Python :: 3.13
|
|
15
|
-
Classifier: Programming Language :: Python :: 3.14
|
|
16
|
-
Provides-Extra: graph
|
|
17
|
-
Provides-Extra: kuzu
|
|
18
|
-
Provides-Extra: xlsx
|
|
19
|
-
Requires-Dist: antlr4-python3-runtime (>=4.13)
|
|
20
|
-
Requires-Dist: arrow (>=1.4.0,<2.0.0)
|
|
21
|
-
Requires-Dist: kuzu (>=0.7,<0.12) ; extra == "kuzu"
|
|
22
|
-
Requires-Dist: networkx (>=3.0) ; extra == "graph"
|
|
23
|
-
Requires-Dist: openpyxl (>=3.1) ; extra == "xlsx"
|
|
24
|
-
Requires-Dist: pint (>=0.24)
|
|
25
|
-
Requires-Dist: pyyaml (>=6.0)
|
|
26
|
-
Description-Content-Type: text/markdown
|
|
27
|
-
|
|
28
1
|
# sysmlpy
|
|
29
2
|
[](https://badge.fury.io/py/sysmlpy)[](https://pypi.python.org/pypi/sysmlpy/)[](https://lbesson.mit-license.org/)
|
|
30
3
|
|
|
@@ -604,7 +577,7 @@ print(as_package_view(model, style="bw"))
|
|
|
604
577
|
```
|
|
605
578
|
|
|
606
579
|
#### Action Flow View (AFV) — `as_action_flow_view()`
|
|
607
|
-
Corresponds to SysML v2 ``ActionFlowView`` (short name ``afv``). Shows actions with their control and object flows. Auto-includes connected flow elements.
|
|
580
|
+
Corresponds to SysML v2 ``ActionFlowView`` (short name ``afv``). Shows actions with their control and object flows. Auto-includes connected flow elements. Control nodes render too: `first start` → solid initial dot, `decide`/`merge`/`fork`/`join` → hexagon nodes, `done`/`terminate` targets → final circle, with dotted succession edges (`..>`) and guard conditions as labels.
|
|
608
581
|
|
|
609
582
|

|
|
610
583
|
|
|
@@ -613,6 +586,30 @@ from sysmlpy.plantuml import as_action_flow_view
|
|
|
613
586
|
print(as_action_flow_view(model, style="bw"))
|
|
614
587
|
```
|
|
615
588
|
|
|
589
|
+
#### Boxes Views — Java-free braille + SVG (v0.68.0)
|
|
590
|
+
Native text/graphics rendering through the sibling `diagramboxes`
|
|
591
|
+
package — no PlantUML/Java required. Interconnection, action flow and
|
|
592
|
+
state transition views render to Unicode-braille text (terminal) or
|
|
593
|
+
SVG. Monochrome by design (color-vision friendly).
|
|
594
|
+
|
|
595
|
+

|
|
596
|
+
|
|
597
|
+
```python
|
|
598
|
+
from sysmlpy.boxes_view import (
|
|
599
|
+
render_interconnection_view_boxes, # iv: parts + ports + connection edges
|
|
600
|
+
render_action_flow_view_boxes, # afv: actions + in/out ports + flows
|
|
601
|
+
render_state_transition_view, # stv: nested composite state boxes
|
|
602
|
+
)
|
|
603
|
+
print(render_interconnection_view_boxes(model))
|
|
604
|
+
```
|
|
605
|
+
|
|
606
|
+
```
|
|
607
|
+
⡰⠊⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠲⡀ ⡰⠊⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠲⡀
|
|
608
|
+
⡇ «part» ⡇ ⡇ «part» ⡇
|
|
609
|
+
⡇ engine ⡇ ⡇ pump ⡇
|
|
610
|
+
⡇ ⡇ ⡇ ⡇
|
|
611
|
+
```
|
|
612
|
+
|
|
616
613
|
#### Interconnection View (IV) — `as_interconnection_view()` / `as_interconnection_diagram()`
|
|
617
614
|
Corresponds to SysML v2 ``InterconnectionView`` (short name ``iv``). Focuses on connectors, bindings, and flow paths between ports and parts.
|
|
618
615
|
|
|
@@ -777,4 +774,3 @@ Two companion tools for the SysML v2 community, created by the same author:
|
|
|
777
774
|
|
|
778
775
|
## License
|
|
779
776
|
sysmlpy is released under the MIT license, hence allowing commercial use of the library.
|
|
780
|
-
|
|
@@ -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.69.0"
|
|
10
10
|
description = ""
|
|
11
11
|
authors = [{ name = "Jon R. Fox (mycr0ft)", email = "jon.fox@drfox.com" }]
|
|
12
12
|
readme = "README.md"
|
|
@@ -21,11 +21,13 @@ networkx = { version = ">=3.0", optional = true }
|
|
|
21
21
|
kuzu = { version = ">=0.7,<0.12", optional = true }
|
|
22
22
|
openpyxl = { version = ">=3.1", optional = true }
|
|
23
23
|
arrow = "^1.4.0"
|
|
24
|
+
transitions = {version = "^0.9", optional = true}
|
|
24
25
|
|
|
25
26
|
[tool.poetry.extras]
|
|
26
27
|
graph = ["networkx"]
|
|
27
28
|
kuzu = ["kuzu"]
|
|
28
29
|
xlsx = ["openpyxl"]
|
|
30
|
+
sim = ["transitions"]
|
|
29
31
|
|
|
30
32
|
[tool.poetry.scripts]
|
|
31
33
|
sysmlpy = "sysmlpy.__main__:main"
|
|
@@ -28,12 +28,13 @@ __all__ = [
|
|
|
28
28
|
"analyze", "AnalysisResult", "SemanticIssue", "SemanticAnalyzer",
|
|
29
29
|
"SysMLSyntaxError", "PartialParseError",
|
|
30
30
|
"loads_partial", "load_partial",
|
|
31
|
-
#
|
|
31
|
+
# diagramboxes-backed optional renderers (the sibling package formerly
|
|
32
|
+
# named `boxes` — renamed in its v0.3.0; install with pip install -e ../boxes)
|
|
32
33
|
"as_state_transition_view_boxes", "render_state_transition_view",
|
|
33
34
|
"render_state_transition_view_svg", "boxes_view",
|
|
34
35
|
]
|
|
35
36
|
__author__ = "Jon Fox"
|
|
36
|
-
__version__ = "0.
|
|
37
|
+
__version__ = "0.69.0"
|
|
37
38
|
|
|
38
39
|
from sysmlpy.usage import (
|
|
39
40
|
Item, Attribute, Part, Port, Action, Reference, UseCase, Requirement, Interface, Message,
|
|
@@ -413,10 +414,11 @@ from sysmlpy.semantic import analyze, AnalysisResult, SemanticIssue, SemanticAna
|
|
|
413
414
|
|
|
414
415
|
from sysmlpy.project import load_files, load_project, load_with_dependencies
|
|
415
416
|
|
|
416
|
-
# Optional
|
|
417
|
-
# `import sysmlpy` works without `
|
|
418
|
-
# the functions below triggers `import sysmlpy.boxes_view`,
|
|
419
|
-
# raises ImportError with installation instructions if
|
|
417
|
+
# Optional diagramboxes-backed state-machine renderer (lazy import on first
|
|
418
|
+
# use so `import sysmlpy` works without `diagramboxes` installed). The first
|
|
419
|
+
# call to any of the functions below triggers `import sysmlpy.boxes_view`,
|
|
420
|
+
# which itself raises ImportError with installation instructions if the
|
|
421
|
+
# `diagramboxes` package is missing.
|
|
420
422
|
def __getattr__(name):
|
|
421
423
|
if name == "boxes_view":
|
|
422
424
|
import sysmlpy.boxes_view as bv
|
|
@@ -429,5 +431,16 @@ def __getattr__(name):
|
|
|
429
431
|
fn = getattr(bv, name)
|
|
430
432
|
globals()[name] = fn
|
|
431
433
|
return fn
|
|
434
|
+
if name in ("StateSimulator", "SimulationError",
|
|
435
|
+
"build_state_machine", "run_tui"):
|
|
436
|
+
from sysmlpy import sim as _sim
|
|
437
|
+
fn = getattr(sim, name)
|
|
438
|
+
globals()[name] = fn
|
|
439
|
+
return fn
|
|
440
|
+
if name == "set_stereotype_palette":
|
|
441
|
+
from sysmlpy import plantuml as _pu
|
|
442
|
+
fn = _pu.set_stereotype_palette
|
|
443
|
+
globals()[name] = fn
|
|
444
|
+
return fn
|
|
432
445
|
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|
|
433
446
|
|
|
@@ -31,7 +31,8 @@ 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",
|
|
34
|
+
SUBCOMMANDS = ("parse", "analyze", "view", "trace", "export", "import",
|
|
35
|
+
"eval", "xlsx", "sim", "format", "fmt")
|
|
35
36
|
|
|
36
37
|
|
|
37
38
|
# ---------------------------------------------------------------------------
|
|
@@ -498,6 +499,52 @@ def _format_value(value):
|
|
|
498
499
|
return str(value)
|
|
499
500
|
|
|
500
501
|
|
|
502
|
+
def cmd_sim(args) -> int:
|
|
503
|
+
"""Simulate the state machine of a model (interactive TUI)."""
|
|
504
|
+
try:
|
|
505
|
+
from sysmlpy.sim import run_tui
|
|
506
|
+
except ImportError as e:
|
|
507
|
+
print(f"Error: {e}", file=sys.stderr)
|
|
508
|
+
return 2
|
|
509
|
+
|
|
510
|
+
paths = [Path(args.file)]
|
|
511
|
+
for p_ in _missing_files(paths):
|
|
512
|
+
print(f"Error: File '{p_}' not found.", file=sys.stderr)
|
|
513
|
+
return 2
|
|
514
|
+
try:
|
|
515
|
+
model = sysmlpy.load_files(paths, library=args.library)
|
|
516
|
+
except Exception as e:
|
|
517
|
+
print(f"Parse error: {e}", file=sys.stderr)
|
|
518
|
+
return 2
|
|
519
|
+
|
|
520
|
+
values = {}
|
|
521
|
+
for spec in args.set or []:
|
|
522
|
+
if "=" not in spec:
|
|
523
|
+
print(f"Error: --set expects NAME=VALUE, got {spec!r}",
|
|
524
|
+
file=sys.stderr)
|
|
525
|
+
return 2
|
|
526
|
+
name, _, raw = spec.partition("=")
|
|
527
|
+
values[name.strip()] = _parse_eval_value(raw)
|
|
528
|
+
|
|
529
|
+
script = [t.strip() for t in (args.run or "").split(";") if t.strip()]
|
|
530
|
+
try:
|
|
531
|
+
from sysmlpy.sim import StateSimulator, SimulationError
|
|
532
|
+
sim = StateSimulator(model, focus=args.focus, values=values)
|
|
533
|
+
except (ImportError, SimulationError) as e:
|
|
534
|
+
print(f"Simulation error: {e}", file=sys.stderr)
|
|
535
|
+
return 2
|
|
536
|
+
for note in sim.notes:
|
|
537
|
+
print(f"note: {note}")
|
|
538
|
+
if script:
|
|
539
|
+
for trigger in script:
|
|
540
|
+
fired = sim.send(trigger)
|
|
541
|
+
print(f"{trigger}: {'fired' if fired else 'blocked'} "
|
|
542
|
+
f"-> {sim.state!r}")
|
|
543
|
+
return 0
|
|
544
|
+
run_tui(model, focus=args.focus, values=values)
|
|
545
|
+
return 0
|
|
546
|
+
|
|
547
|
+
|
|
501
548
|
def cmd_xlsx(args) -> int:
|
|
502
549
|
"""Export tabular views to an Excel workbook (v0.66.0, Goal 7)."""
|
|
503
550
|
from sysmlpy.spreadsheet import write_xlsx
|
|
@@ -832,6 +879,38 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
832
879
|
)
|
|
833
880
|
p_eval.set_defaults(func=cmd_eval)
|
|
834
881
|
|
|
882
|
+
# -- sim (state-machine simulation, optional 'transitions' extra) -----
|
|
883
|
+
p_sim = sub.add_parser(
|
|
884
|
+
"sim",
|
|
885
|
+
help="Simulate a state machine (guards evaluated for real)",
|
|
886
|
+
description="Cameo-style state-machine simulation: fires "
|
|
887
|
+
"transitions on triggers, evaluates guards against "
|
|
888
|
+
"the model's attribute values (plus --set "
|
|
889
|
+
"overrides), and logs effects. Interactive TUI "
|
|
890
|
+
"(or a scripted run with --run). Requires the "
|
|
891
|
+
"'sim' extra: pip install 'sysmlpy[sim]'.",
|
|
892
|
+
)
|
|
893
|
+
p_sim.add_argument("file", help="SysML v2 file with a state machine")
|
|
894
|
+
p_sim.add_argument(
|
|
895
|
+
"--focus",
|
|
896
|
+
help="Name of the state def/state machine to simulate "
|
|
897
|
+
"(default: the first one found)",
|
|
898
|
+
)
|
|
899
|
+
p_sim.add_argument(
|
|
900
|
+
"--set", action="append", metavar="NAME=VALUE",
|
|
901
|
+
help="Starting value for guards (repeatable)",
|
|
902
|
+
)
|
|
903
|
+
p_sim.add_argument(
|
|
904
|
+
"--run", metavar="TRIG1;TRIG2",
|
|
905
|
+
help="Fire this ';'-separated trigger sequence instead of "
|
|
906
|
+
"entering the interactive loop",
|
|
907
|
+
)
|
|
908
|
+
p_sim.add_argument(
|
|
909
|
+
"-l", "--library",
|
|
910
|
+
help="Path to SysML v2 library files to use for parsing",
|
|
911
|
+
)
|
|
912
|
+
p_sim.set_defaults(func=cmd_sim)
|
|
913
|
+
|
|
835
914
|
# -- xlsx (v0.66.0, Goal 7) -------------------------------------------------
|
|
836
915
|
p_xlsx = sub.add_parser(
|
|
837
916
|
"xlsx",
|
|
@@ -5739,37 +5739,136 @@ def _visit_guard_expression_member(ctx):
|
|
|
5739
5739
|
}
|
|
5740
5740
|
|
|
5741
5741
|
|
|
5742
|
+
def _ctx_spaced_text(ctx):
|
|
5743
|
+
"""Source text of an ANTLR context with single spaces between
|
|
5744
|
+
tokens (``getText()`` glues terminals: ``send Alert to logger``
|
|
5745
|
+
would come out ``sendAlerttologger``)."""
|
|
5746
|
+
if ctx is None:
|
|
5747
|
+
return None
|
|
5748
|
+
|
|
5749
|
+
parts = []
|
|
5750
|
+
|
|
5751
|
+
def _collect(node):
|
|
5752
|
+
n = node.getChildCount() if hasattr(node, "getChildCount") else 0
|
|
5753
|
+
if n == 0:
|
|
5754
|
+
text = node.getText()
|
|
5755
|
+
if text:
|
|
5756
|
+
parts.append(text)
|
|
5757
|
+
return
|
|
5758
|
+
for i in range(n):
|
|
5759
|
+
_collect(node.getChild(i))
|
|
5760
|
+
|
|
5761
|
+
_collect(ctx)
|
|
5762
|
+
return " ".join(parts).strip() or None
|
|
5763
|
+
|
|
5764
|
+
|
|
5742
5765
|
def _visit_effect_behavior_member(ctx):
|
|
5743
|
-
"""Visit an effectBehaviorMember context.
|
|
5766
|
+
"""Visit an effectBehaviorMember context.
|
|
5767
|
+
|
|
5768
|
+
effectBehaviorMember : DO effectBehaviorUsage ;
|
|
5769
|
+
effectBehaviorUsage : emptyActionUsage_ | transitionPerformActionUsage
|
|
5770
|
+
| transitionAcceptActionUsage | transitionSendActionUsage
|
|
5771
|
+
| transitionAssignmentActionUsage ;
|
|
5772
|
+
|
|
5773
|
+
``do <behavior-reference>`` (by far the common transition effect)
|
|
5774
|
+
rides through transitionPerformActionUsage ->
|
|
5775
|
+
performActionUsageDeclaration -> ownedReferenceSubsetting, whose
|
|
5776
|
+
qualifiedName is the referenced behavior's name. We emit the shape
|
|
5777
|
+
the grammar classes expect (EffectBehaviorUsage / PerformedActionUsage
|
|
5778
|
+
/ PerformActionUsageDeclaration) so ``EffectBehaviorMember.dump()``
|
|
5779
|
+
round-trips the effect. The send/accept/assignment alternatives are
|
|
5780
|
+
emitted as ``text`` fallbacks (readable, not class-constructed).
|
|
5781
|
+
"""
|
|
5744
5782
|
if ctx is None:
|
|
5745
5783
|
return None
|
|
5746
|
-
|
|
5747
|
-
behavior = None
|
|
5748
|
-
if hasattr(ctx, '
|
|
5749
|
-
|
|
5750
|
-
|
|
5751
|
-
|
|
5752
|
-
|
|
5753
|
-
behavior = _visit_transition_effect(te)
|
|
5754
|
-
|
|
5755
|
-
return {
|
|
5784
|
+
|
|
5785
|
+
behavior, fallback_text = None, None
|
|
5786
|
+
if hasattr(ctx, 'effectBehaviorUsage') and ctx.effectBehaviorUsage():
|
|
5787
|
+
behavior, fallback_text = _visit_effect_behavior_usage(
|
|
5788
|
+
ctx.effectBehaviorUsage())
|
|
5789
|
+
|
|
5790
|
+
member = {
|
|
5756
5791
|
"name": "EffectBehaviorMember",
|
|
5757
5792
|
"ownedRelatedElement": behavior
|
|
5758
5793
|
}
|
|
5794
|
+
if fallback_text:
|
|
5795
|
+
# Sibling key: read by the view extractors, ignored (and so
|
|
5796
|
+
# safely dropped) by the grammar classes.
|
|
5797
|
+
member["text"] = fallback_text
|
|
5798
|
+
return member
|
|
5759
5799
|
|
|
5760
5800
|
|
|
5761
|
-
def
|
|
5762
|
-
"""Visit
|
|
5801
|
+
def _visit_effect_behavior_usage(ctx):
|
|
5802
|
+
"""Visit an effectBehaviorUsage context (one of five alternatives)."""
|
|
5763
5803
|
if ctx is None:
|
|
5764
5804
|
return None
|
|
5765
|
-
|
|
5766
|
-
|
|
5767
|
-
|
|
5768
|
-
|
|
5769
|
-
|
|
5805
|
+
|
|
5806
|
+
if hasattr(ctx, 'transitionPerformActionUsage') and \
|
|
5807
|
+
ctx.transitionPerformActionUsage():
|
|
5808
|
+
pu = ctx.transitionPerformActionUsage()
|
|
5809
|
+
if isinstance(pu, list):
|
|
5810
|
+
pu = pu[0]
|
|
5811
|
+
return _visit_transition_perform_action_usage(pu), None
|
|
5812
|
+
|
|
5813
|
+
# send / accept / assignment: no class-constructable shape yet —
|
|
5814
|
+
# the caller surfaces the declaration via a sibling ``text`` on the
|
|
5815
|
+
# EffectBehaviorMember dict (see _visit_effect_behavior_member).
|
|
5816
|
+
for alt_name, kind in (
|
|
5817
|
+
('transitionSendActionUsage', 'send'),
|
|
5818
|
+
('transitionAcceptActionUsage', 'accept'),
|
|
5819
|
+
('transitionAssignmentActionUsage', 'assign'),
|
|
5820
|
+
):
|
|
5821
|
+
if hasattr(ctx, alt_name):
|
|
5822
|
+
sub = getattr(ctx, alt_name)()
|
|
5823
|
+
if sub:
|
|
5824
|
+
if isinstance(sub, list):
|
|
5825
|
+
sub = sub[0]
|
|
5826
|
+
node = None
|
|
5827
|
+
for decl_name in ('sendNodeDeclaration',
|
|
5828
|
+
'acceptNodeDeclaration',
|
|
5829
|
+
'assignmentNodeDeclaration'):
|
|
5830
|
+
if hasattr(sub, decl_name):
|
|
5831
|
+
node = getattr(sub, decl_name)()
|
|
5832
|
+
if node:
|
|
5833
|
+
break
|
|
5834
|
+
# Spaced text; the ``send``/``accept`` keyword already
|
|
5835
|
+
# sits in the declaration, no kind prefix needed.
|
|
5836
|
+
text = _ctx_spaced_text(
|
|
5837
|
+
node if node is not None else sub)
|
|
5838
|
+
return None, text
|
|
5839
|
+
# emptyActionUsage_
|
|
5840
|
+
return None, None
|
|
5841
|
+
|
|
5842
|
+
|
|
5843
|
+
def _visit_transition_perform_action_usage(ctx):
|
|
5844
|
+
"""transitionPerformActionUsage : performActionUsageDeclaration
|
|
5845
|
+
( LBRACE actionBodyItem* RBRACE )? ;"""
|
|
5846
|
+
if ctx is None:
|
|
5847
|
+
return None
|
|
5848
|
+
|
|
5849
|
+
declaration = None
|
|
5850
|
+
if hasattr(ctx, 'performActionUsageDeclaration') and \
|
|
5851
|
+
ctx.performActionUsageDeclaration():
|
|
5852
|
+
declaration = _visit_perform_action_usage_declaration(
|
|
5853
|
+
ctx.performActionUsageDeclaration())
|
|
5854
|
+
|
|
5855
|
+
items = []
|
|
5856
|
+
if hasattr(ctx, 'actionBodyItem') and ctx.actionBodyItem():
|
|
5857
|
+
body_items = ctx.actionBodyItem()
|
|
5858
|
+
if not isinstance(body_items, list):
|
|
5859
|
+
body_items = [body_items]
|
|
5860
|
+
for item_ctx in body_items:
|
|
5861
|
+
item_dict = _visit_action_body_item(item_ctx)
|
|
5862
|
+
if item_dict:
|
|
5863
|
+
items.append(item_dict)
|
|
5864
|
+
|
|
5770
5865
|
return {
|
|
5771
|
-
"name": "
|
|
5772
|
-
"
|
|
5866
|
+
"name": "EffectBehaviorUsage",
|
|
5867
|
+
"usage": {
|
|
5868
|
+
"name": "PerformedActionUsage",
|
|
5869
|
+
"declaration": declaration,
|
|
5870
|
+
},
|
|
5871
|
+
"item": items,
|
|
5773
5872
|
}
|
|
5774
5873
|
|
|
5775
5874
|
|