sysmlpy 0.85.0__tar.gz → 0.86.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 (160) hide show
  1. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/PKG-INFO +1 -1
  2. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/pyproject.toml +1 -1
  3. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/__init__.py +1 -1
  4. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/store.py +213 -2
  5. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/LICENSE +0 -0
  6. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/README.md +0 -0
  7. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/__main__.py +0 -0
  8. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/antlr/README.md +0 -0
  9. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/antlr/SysMLv2Lexer.interp +0 -0
  10. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/antlr/SysMLv2Lexer.py +0 -0
  11. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/antlr/SysMLv2Lexer.tokens +0 -0
  12. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/antlr/SysMLv2Parser.interp +0 -0
  13. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/antlr/SysMLv2Parser.py +0 -0
  14. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/antlr/SysMLv2Parser.tokens +0 -0
  15. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/antlr/SysMLv2ParserListener.py +0 -0
  16. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/antlr/SysMLv2ParserVisitor.py +0 -0
  17. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/antlr/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.interp +0 -0
  18. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/antlr/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.py +0 -0
  19. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/antlr/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.tokens +0 -0
  20. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/antlr_parser.py +0 -0
  21. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/antlr_visitor.py +0 -0
  22. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/boxes_view.py +0 -0
  23. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/definition.py +0 -0
  24. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/dfa_cache.py +0 -0
  25. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/diff.py +0 -0
  26. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/evaluator.py +0 -0
  27. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/examples/attribute_values.py +0 -0
  28. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/examples/part_attributes.py +0 -0
  29. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/examples/tuples_sequences.py +0 -0
  30. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/formatting.py +0 -0
  31. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/grammar/antlr4/README.md +0 -0
  32. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.g4 +0 -0
  33. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.interp +0 -0
  34. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.py +0 -0
  35. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/grammar/antlr4/SysMLv2Lexer.tokens +0 -0
  36. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.g4 +0 -0
  37. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.interp +0 -0
  38. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.py +0 -0
  39. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/grammar/antlr4/SysMLv2Parser.tokens +0 -0
  40. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/grammar/antlr4/SysMLv2ParserListener.py +0 -0
  41. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/grammar/antlr4/SysMLv2ParserVisitor.py +0 -0
  42. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/grammar/antlr4/desc.xml +0 -0
  43. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/grammar/antlr4/examples/camera.sysml +0 -0
  44. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/grammar/antlr4/examples/toaster-system.sysml +0 -0
  45. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/grammar/antlr4/examples/vehicle-model.sysml +0 -0
  46. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/grammar/antlr4/pom.xml +0 -0
  47. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/grammar/classes.py +0 -0
  48. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/interchange.py +0 -0
  49. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/LICENSE +0 -0
  50. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/README.md +0 -0
  51. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/__init__.py +0 -0
  52. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Analysis/AnalysisTooling.sysml +0 -0
  53. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Analysis/SampledFunctions.sysml +0 -0
  54. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Analysis/StateSpaceRepresentation.sysml +0 -0
  55. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Analysis/TradeStudies.sysml +0 -0
  56. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Cause and Effect/CausationConnections.sysml +0 -0
  57. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Cause and Effect/CauseAndEffect.sysml +0 -0
  58. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Geometry/ShapeItems.sysml +0 -0
  59. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Geometry/SpatialItems.sysml +0 -0
  60. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Metadata/ImageMetadata.sysml +0 -0
  61. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Metadata/ModelingMetadata.sysml +0 -0
  62. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Metadata/ParametersOfInterestMetadata.sysml +0 -0
  63. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Metadata/RiskMetadata.sysml +0 -0
  64. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/ISQ.sysml +0 -0
  65. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/ISQAcoustics.sysml +0 -0
  66. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/ISQAtomicNuclear.sysml +0 -0
  67. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/ISQBase.sysml +0 -0
  68. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/ISQCharacteristicNumbers.sysml +0 -0
  69. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/ISQChemistryMolecular.sysml +0 -0
  70. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/ISQCondensedMatter.sysml +0 -0
  71. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/ISQElectromagnetism.sysml +0 -0
  72. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/ISQInformation.sysml +0 -0
  73. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/ISQLight.sysml +0 -0
  74. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/ISQMechanics.sysml +0 -0
  75. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/ISQSpaceTime.sysml +0 -0
  76. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/ISQThermodynamics.sysml +0 -0
  77. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/MeasurementRefCalculations.sysml +0 -0
  78. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/MeasurementReferences.sysml +0 -0
  79. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/Quantities.sysml +0 -0
  80. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/QuantityCalculations.sysml +0 -0
  81. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/SI.sysml +0 -0
  82. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/SIPrefixes.sysml +0 -0
  83. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/TensorCalculations.sysml +0 -0
  84. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/Time.sysml +0 -0
  85. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/USCustomaryUnits.sysml +0 -0
  86. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Quantities and Units/VectorCalculations.sysml +0 -0
  87. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Requirement Derivation/DerivationConnections.sysml +0 -0
  88. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/domain/Requirement Derivation/RequirementDerivation.sysml +0 -0
  89. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/Base.kerml +0 -0
  90. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/BaseFunctions.kerml +0 -0
  91. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/BooleanFunctions.kerml +0 -0
  92. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/Clocks.kerml +0 -0
  93. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/CollectionFunctions.kerml +0 -0
  94. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/Collections.kerml +0 -0
  95. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/ComplexFunctions.kerml +0 -0
  96. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/ControlFunctions.kerml +0 -0
  97. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/ControlPerformances.kerml +0 -0
  98. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/DataFunctions.kerml +0 -0
  99. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/FeatureReferencingPerformances.kerml +0 -0
  100. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/IntegerFunctions.kerml +0 -0
  101. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/KerML.kerml +0 -0
  102. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/Links.kerml +0 -0
  103. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/Metaobjects.kerml +0 -0
  104. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/NaturalFunctions.kerml +0 -0
  105. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/NumericalFunctions.kerml +0 -0
  106. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/Objects.kerml +0 -0
  107. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/Observation.kerml +0 -0
  108. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/OccurrenceFunctions.kerml +0 -0
  109. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/Occurrences.kerml +0 -0
  110. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/Performances.kerml +0 -0
  111. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/RationalFunctions.kerml +0 -0
  112. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/RealFunctions.kerml +0 -0
  113. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/ScalarFunctions.kerml +0 -0
  114. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/ScalarValues.kerml +0 -0
  115. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/SequenceFunctions.kerml +0 -0
  116. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/SpatialFrames.kerml +0 -0
  117. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/StatePerformances.kerml +0 -0
  118. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/StringFunctions.kerml +0 -0
  119. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/Transfers.kerml +0 -0
  120. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/TransitionPerformances.kerml +0 -0
  121. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/TrigFunctions.kerml +0 -0
  122. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/Triggers.kerml +0 -0
  123. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/VectorFunctions.kerml +0 -0
  124. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/kernel/VectorValues.kerml +0 -0
  125. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/Actions.sysml +0 -0
  126. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/Allocations.sysml +0 -0
  127. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/AnalysisCases.sysml +0 -0
  128. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/Attributes.sysml +0 -0
  129. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/Calculations.sysml +0 -0
  130. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/Cases.sysml +0 -0
  131. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/Connections.sysml +0 -0
  132. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/Constraints.sysml +0 -0
  133. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/Flows.sysml +0 -0
  134. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/Interfaces.sysml +0 -0
  135. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/Items.sysml +0 -0
  136. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/Metadata.sysml +0 -0
  137. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/Parts.sysml +0 -0
  138. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/Ports.sysml +0 -0
  139. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/Requirements.sysml +0 -0
  140. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/StandardViewDefinitions.sysml +0 -0
  141. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/States.sysml +0 -0
  142. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/SysML.sysml +0 -0
  143. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/UseCases.sysml +0 -0
  144. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/VerificationCases.sysml +0 -0
  145. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/library/systems/Views.sysml +0 -0
  146. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/lsp/__init__.py +0 -0
  147. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/lsp/__main__.py +0 -0
  148. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/lsp/protocol.py +0 -0
  149. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/lsp/server.py +0 -0
  150. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/lsp/stdio.py +0 -0
  151. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/navigate.py +0 -0
  152. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/plantuml.py +0 -0
  153. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/project.py +0 -0
  154. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/semantic.py +0 -0
  155. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/sim.py +0 -0
  156. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/spreadsheet.py +0 -0
  157. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/traceability.py +0 -0
  158. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/us_customary_units.txt +0 -0
  159. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/usage.py +0 -0
  160. {sysmlpy-0.85.0 → sysmlpy-0.86.0}/src/sysmlpy/validator.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sysmlpy
3
- Version: 0.85.0
3
+ Version: 0.86.0
4
4
  Summary:
5
5
  License-File: LICENSE
6
6
  Author: Jon R. Fox (mycr0ft)
@@ -6,7 +6,7 @@ build-backend = "poetry.core.masonry.api"
6
6
 
7
7
  [project]
8
8
  name = "sysmlpy"
9
- version = "0.85.0"
9
+ version = "0.86.0"
10
10
  description = ""
11
11
  authors = [{ name = "Jon R. Fox (mycr0ft)", email = "jon.fox@drfox.com" }]
12
12
  readme = "README.md"
@@ -34,7 +34,7 @@ __all__ = [
34
34
  "render_state_transition_view_svg", "boxes_view",
35
35
  ]
36
36
  __author__ = "Jon Fox"
37
- __version__ = "0.85.0"
37
+ __version__ = "0.86.0"
38
38
 
39
39
  from sysmlpy.usage import (
40
40
  Item, Attribute, Part, Port, Action, Reference, UseCase, Requirement, Interface, Message,
@@ -980,6 +980,74 @@ class NetworkXStore(Store):
980
980
  seen.discard(element_id)
981
981
  return seen
982
982
 
983
+ def siblings(self, element_id: str) -> list[str]:
984
+ """Elements sharing a structural parent with *element_id*.
985
+
986
+ Mirrors :meth:`KuzuStore.siblings` / :meth:`CayleyStore.siblings`
987
+ (parent-child edges only); deterministic parent-then-child
988
+ order, self excluded.
989
+ """
990
+ result: list[str] = []
991
+ for parent in self.parents(element_id):
992
+ for sib in self.children(parent):
993
+ if sib != element_id and sib not in result:
994
+ result.append(sib)
995
+ return result
996
+
997
+ def hub_elements(self, min_degree: int = 3,
998
+ direction: str = "outgoing") -> list[tuple[str, int]]:
999
+ """Elements with high relationship degree.
1000
+
1001
+ Mirrors :meth:`KuzuStore.hub_elements` — *(element_id, degree)*
1002
+ pairs with degree ≥ *min_degree*, sorted by degree descending
1003
+ (id ascending on ties). *direction* selects which edge
1004
+ direction to count.
1005
+ """
1006
+ dirn = {"outgoing": "out", "incoming": "in", "both": "both"}.get(direction)
1007
+ if dirn is None:
1008
+ raise ValueError(
1009
+ f"direction must be 'outgoing', 'incoming' or 'both', "
1010
+ f"got {direction!r}")
1011
+ counts: list[tuple[str, int]] = []
1012
+ for eid in self.ids():
1013
+ degree = len(self.relationships(eid, direction=dirn))
1014
+ if degree >= min_degree:
1015
+ counts.append((eid, degree))
1016
+ counts.sort(key=lambda kv: (-kv[1], kv[0]))
1017
+ return counts
1018
+
1019
+ def shortest_path_between_named(self, source_name: str, target_name: str,
1020
+ max_hops: int = 10) -> Optional[list[str]]:
1021
+ """Shortest structural path between two *named* elements.
1022
+
1023
+ Mirrors :meth:`CayleyStore.shortest_path_between_named` —
1024
+ multi-source BFS over all relationship types, one hop-level at
1025
+ a time up to *max_hops*; returns the ID path or ``None`` when
1026
+ disconnected. When several elements share a name, the first
1027
+ path reaching any target wins.
1028
+ """
1029
+ sources = self.query(name=source_name)
1030
+ targets = set(self.query(name=target_name))
1031
+ if not sources or not targets:
1032
+ return None
1033
+ frontier = {sid: [sid] for sid in sources}
1034
+ visited = set(sources)
1035
+ for _ in range(max_hops):
1036
+ nxt_frontier = {}
1037
+ for node, path in frontier.items():
1038
+ for other, _rt, _d in self.relationships(node, direction="out"):
1039
+ if other in visited:
1040
+ continue
1041
+ new_path = path + [other]
1042
+ if other in targets:
1043
+ return new_path
1044
+ visited.add(other)
1045
+ nxt_frontier[other] = new_path
1046
+ if not nxt_frontier:
1047
+ break
1048
+ frontier = nxt_frontier
1049
+ return None
1050
+
983
1051
 
984
1052
  # ── Kuzu Store ──────────────────────────────────────────────────────────────
985
1053
 
@@ -1658,15 +1726,158 @@ class KuzuStore(Store):
1658
1726
  pattern = "MATCH (hub:Element)-[r:Relationship]->() WITH hub, count(r) AS deg"
1659
1727
  elif direction == "incoming":
1660
1728
  pattern = "MATCH ()-[r:Relationship]->(hub:Element) WITH hub, count(r) AS deg"
1661
- else:
1729
+ elif direction == "both":
1662
1730
  pattern = (
1663
1731
  "MATCH (hub:Element)-[r:Relationship]-() WITH hub, count(r) AS deg"
1664
1732
  )
1733
+ else:
1734
+ raise ValueError(
1735
+ f"direction must be 'outgoing', 'incoming' or 'both', "
1736
+ f"got {direction!r}")
1665
1737
  rows = self.execute_cypher(
1666
1738
  f'{pattern} WHERE deg >= {min_degree} '
1667
1739
  f'RETURN hub.id AS element_id, deg ORDER BY deg DESC'
1668
1740
  )
1669
- return [(r["element_id"], r["deg"]) for r in rows]
1741
+ # deterministic tie-break (degree desc, then id asc) so all
1742
+ # three backends agree when degrees are equal
1743
+ out = [(r["element_id"], r["deg"]) for r in rows]
1744
+ out.sort(key=lambda kv: (-kv[1], kv[0]))
1745
+ return out
1746
+
1747
+ # -- graph analytics (client-side; NetworkX/Cayley parity) ----------
1748
+
1749
+ def all_paths(self, source_id: str, target_id: str,
1750
+ rel_type: Optional[str] = None,
1751
+ max_paths: int = 20) -> list[list[str]]:
1752
+ """Find up to *max_paths* simple paths between two elements.
1753
+
1754
+ Mirrors :meth:`NetworkXStore.all_paths` /
1755
+ :meth:`CayleyStore.all_paths`. Depth-first enumeration over the
1756
+ relationship edge list (any type when *rel_type* is None);
1757
+ client-side because Kùzu has no simple-path enumeration.
1758
+ """
1759
+ if not self.has(source_id) or not self.has(target_id):
1760
+ return []
1761
+ results: list[list[str]] = []
1762
+
1763
+ def _dfs(node: str, path: list[str]) -> None:
1764
+ if len(results) >= max_paths:
1765
+ return
1766
+ if node == target_id:
1767
+ results.append(list(path))
1768
+ return
1769
+ for nxt, _rt, _d in self.relationships(
1770
+ node, rel_type=rel_type, direction="out"):
1771
+ if nxt in path: # simple paths only
1772
+ continue
1773
+ path.append(nxt)
1774
+ _dfs(nxt, path)
1775
+ path.pop()
1776
+
1777
+ _dfs(source_id, [source_id])
1778
+ return results
1779
+
1780
+ def in_degree_centrality(self, rel_type: Optional[str] = None) -> dict[str, float]:
1781
+ """In-degree fraction per element (how many elements reference *me*).
1782
+
1783
+ Mirrors :meth:`NetworkXStore.in_degree_centrality` (degree
1784
+ divided by ``n - 1``).
1785
+ """
1786
+ n = len(self)
1787
+ if n <= 1:
1788
+ return {eid: 0.0 for eid in self.ids()}
1789
+ denom = n - 1
1790
+ return {
1791
+ eid: len(self.relationships(eid, rel_type=rel_type,
1792
+ direction="in")) / denom
1793
+ for eid in self.ids()
1794
+ }
1795
+
1796
+ def out_degree_centrality(self, rel_type: Optional[str] = None) -> dict[str, float]:
1797
+ """Out-degree fraction per element (how many elements *I* reference)."""
1798
+ n = len(self)
1799
+ if n <= 1:
1800
+ return {eid: 0.0 for eid in self.ids()}
1801
+ denom = n - 1
1802
+ return {
1803
+ eid: len(self.relationships(eid, rel_type=rel_type,
1804
+ direction="out")) / denom
1805
+ for eid in self.ids()
1806
+ }
1807
+
1808
+ def descendants_depth_limited(self, root_id: str, max_depth: int = 3,
1809
+ rel_type: str = REL_PARENT_CHILD) -> list[str]:
1810
+ """Descendants within *max_depth* levels of *root_id*.
1811
+
1812
+ Mirrors :meth:`NetworkXStore.descendants_depth_limited` —
1813
+ breadth-first, each level sorted for deterministic output.
1814
+ """
1815
+ if not self.has(root_id):
1816
+ return []
1817
+ result: list[str] = []
1818
+ frontier = {root_id}
1819
+ visited = {root_id}
1820
+ for _ in range(max_depth):
1821
+ nxt: set[str] = set()
1822
+ for node in frontier:
1823
+ for child in self.children(node, rel_type):
1824
+ if child not in visited:
1825
+ nxt.add(child)
1826
+ visited |= nxt
1827
+ result.extend(sorted(nxt))
1828
+ frontier = nxt
1829
+ if not frontier:
1830
+ break
1831
+ return result
1832
+
1833
+ def neighborhood(self, element_id: str, radius: int = 2,
1834
+ rel_type: Optional[str] = None) -> set[str]:
1835
+ """Ego-neighborhood of *element_id* within *radius* hops.
1836
+
1837
+ Follows edges in both directions (like NetworkX's undirected
1838
+ ego graph); includes the element itself.
1839
+ """
1840
+ if not self.has(element_id):
1841
+ return set()
1842
+ seen = {element_id}
1843
+ frontier = {element_id}
1844
+ for _ in range(radius):
1845
+ nxt: set[str] = set()
1846
+ for node in frontier:
1847
+ for other, _rt, _d in self.relationships(
1848
+ node, rel_type=rel_type, direction="both"):
1849
+ if other not in seen:
1850
+ nxt.add(other)
1851
+ seen |= nxt
1852
+ frontier = nxt
1853
+ if not frontier:
1854
+ break
1855
+ return seen
1856
+
1857
+ def impact_analysis(self, element_id: str,
1858
+ rel_types: Optional[list[str]] = None,
1859
+ direction: str = "downstream") -> set[str]:
1860
+ """Elements transitively affected by changes to *element_id*.
1861
+
1862
+ Mirrors :meth:`NetworkXStore.impact_analysis` — *downstream*
1863
+ follows outgoing edges (what I affect), *upstream* follows
1864
+ incoming edges (what affects me).
1865
+ """
1866
+ if not self.has(element_id):
1867
+ return set()
1868
+ dirn = "out" if direction == "downstream" else "in"
1869
+ seen = {element_id}
1870
+ frontier = [element_id]
1871
+ while frontier:
1872
+ current = frontier.pop()
1873
+ for other, rt, _d in self.relationships(current, direction=dirn):
1874
+ if rel_types and rt not in rel_types:
1875
+ continue
1876
+ if other not in seen:
1877
+ seen.add(other)
1878
+ frontier.append(other)
1879
+ seen.discard(element_id)
1880
+ return seen
1670
1881
 
1671
1882
 
1672
1883
  # ── Cayley Store ──────────────────────────────────────────────────────────────
File without changes
File without changes
File without changes
File without changes
File without changes