opensysml 0.10.2.dev20261022__tar.gz → 0.10.2.dev20261023__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 (125) hide show
  1. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/PKG-INFO +1 -1
  2. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/_version.py +1 -1
  3. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/release-digests.json +6 -6
  4. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/symbol.py +8 -1
  5. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml.egg-info/PKG-INFO +1 -1
  6. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml.egg-info/SOURCES.txt +1 -0
  7. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_conversion.py +8 -3
  8. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_edit.py +20 -5
  9. opensysml-0.10.2.dev20261023/tests/test_variation_metadata.py +78 -0
  10. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/README.md +0 -0
  11. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/__init__.py +0 -0
  12. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/_dist.py +0 -0
  13. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/action_run.py +0 -0
  14. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/binary.py +0 -0
  15. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/capabilities.py +0 -0
  16. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/check.py +0 -0
  17. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/connection.py +0 -0
  18. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/conversion.py +0 -0
  19. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/diagnostic.py +0 -0
  20. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/document.py +0 -0
  21. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/edit.py +0 -0
  22. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/engines.py +0 -0
  23. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/enumeration.py +0 -0
  24. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/errors.py +0 -0
  25. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/exploration.py +0 -0
  26. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/fmi_runner.py +0 -0
  27. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/generate.py +0 -0
  28. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/importcompare.py +0 -0
  29. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/instance.py +0 -0
  30. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/metamodel/__init__.py +0 -0
  31. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/metamodel/_generated.py +0 -0
  32. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/metamodel/_reader.py +0 -0
  33. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/metamodel/_runtime.py +0 -0
  34. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/model.py +0 -0
  35. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/proto/__init__.py +0 -0
  36. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/proto/sysml_pb2.py +0 -0
  37. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/proto/sysml_pb2.pyi +0 -0
  38. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/proto/sysml_pb2_grpc.py +0 -0
  39. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/py.typed +0 -0
  40. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/query.py +0 -0
  41. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/runs.py +0 -0
  42. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/signing.py +0 -0
  43. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/sources.py +0 -0
  44. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/typed.py +0 -0
  45. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/typefacts.py +0 -0
  46. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/values.py +0 -0
  47. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml/verdict.py +0 -0
  48. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml.egg-info/dependency_links.txt +0 -0
  49. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml.egg-info/entry_points.txt +0 -0
  50. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml.egg-info/requires.txt +0 -0
  51. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/opensysml.egg-info/top_level.txt +0 -0
  52. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/pyproject.toml +0 -0
  53. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/setup.cfg +0 -0
  54. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_analysis_integration.py +0 -0
  55. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_api.py +0 -0
  56. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_api_reference.py +0 -0
  57. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_big_integer.py +0 -0
  58. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_binary.py +0 -0
  59. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_capabilities.py +0 -0
  60. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_check.py +0 -0
  61. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_check_version.py +0 -0
  62. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_complex.py +0 -0
  63. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_connection.py +0 -0
  64. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_diagnostic.py +0 -0
  65. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_document.py +0 -0
  66. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_engines.py +0 -0
  67. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_enumeration.py +0 -0
  68. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_errors.py +0 -0
  69. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_evaluate_subject.py +0 -0
  70. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_explore.py +0 -0
  71. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_feature_values.py +0 -0
  72. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_feature_values_capability.py +0 -0
  73. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_fmi_runner.py +0 -0
  74. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_function.py +0 -0
  75. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_generate.py +0 -0
  76. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_generate_golden.py +0 -0
  77. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_import_compare.py +0 -0
  78. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_infinity.py +0 -0
  79. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_instance.py +0 -0
  80. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_integration.py +0 -0
  81. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_legacy_pysysml_placeholder.py +0 -0
  82. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_lifecycle.py +0 -0
  83. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_measurement_ref.py +0 -0
  84. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_metamodel.py +0 -0
  85. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_metamodel_reader.py +0 -0
  86. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_metamodel_toolkit.py +0 -0
  87. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_metamodel_typing.py +0 -0
  88. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_metaobject.py +0 -0
  89. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_migration.py +0 -0
  90. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_model.py +0 -0
  91. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_model_surface_integration.py +0 -0
  92. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_parse_sources.py +0 -0
  93. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_parser_warnings.py +0 -0
  94. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_performed_action_pin_shape.py +0 -0
  95. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_performed_action_unbound_input.py +0 -0
  96. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_performer.py +0 -0
  97. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_pin_release_checksums.py +0 -0
  98. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_quantity.py +0 -0
  99. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_query.py +0 -0
  100. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_rational.py +0 -0
  101. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_refresh_diagnostics.py +0 -0
  102. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_response_compression.py +0 -0
  103. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_runs.py +0 -0
  104. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_runtime.py +0 -0
  105. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_runtime_integration.py +0 -0
  106. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_schedule.py +0 -0
  107. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_set_tensor.py +0 -0
  108. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_signing.py +0 -0
  109. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_snapshot_version.py +0 -0
  110. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_stale_service.py +0 -0
  111. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_strict_and_lookup.py +0 -0
  112. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_strict_conformance.py +0 -0
  113. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_structured.py +0 -0
  114. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_sweep_integration.py +0 -0
  115. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_symbol.py +0 -0
  116. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_target.py +0 -0
  117. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_tool_dry_run.py +0 -0
  118. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_typed.py +0 -0
  119. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_undetermined.py +0 -0
  120. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_unset.py +0 -0
  121. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_verification.py +0 -0
  122. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_verification_arguments.py +0 -0
  123. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_verification_questions.py +0 -0
  124. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_version.py +0 -0
  125. {opensysml-0.10.2.dev20261022 → opensysml-0.10.2.dev20261023}/tests/test_wire_compat.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: opensysml
3
- Version: 0.10.2.dev20261022
3
+ Version: 0.10.2.dev20261023
4
4
  Summary: Python client library for OpenSysML, a SysML v2 parser and execution runtime
5
5
  Author: Open-MBEE
6
6
  License-Expression: Apache-2.0
@@ -6,4 +6,4 @@ neither is a second copy that can drift. `scripts/check_version.py` compares
6
6
  this value with the release tag before anything is uploaded.
7
7
  """
8
8
 
9
- VERSION = "0.10.2.dev20261022"
9
+ VERSION = "0.10.2.dev20261023"
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "Open-MBEE/OpenSysML": {
3
- "nightly-20261022-0a5fa2d94": {
4
- "sysml-grpc-darwin-amd64": "ce2f2879146ab9f8db0e47ef442d37f6764cd520c1cc898c595e74e56154fda1",
5
- "sysml-grpc-darwin-arm64": "ca37c054216a9030143a472aafebcc7aa7cac39c480d5745a59ad484863a55d5",
6
- "sysml-grpc-linux-amd64": "098daf2919add07105d68dda3727cc6a4e46c0f38f5612bc79751f66eec9ab4d",
7
- "sysml-grpc-linux-arm64": "032d1a8b0b7b523d3d6308c836e99a57cee08536f7958d755886daf2e7a46121",
8
- "sysml-grpc-windows-amd64.exe": "542c50ac47fca26f603ea98d4f85911866ee2030f63cb824246173498497f8f1"
3
+ "nightly-20261023-47a8251a8": {
4
+ "sysml-grpc-darwin-amd64": "ebb09c4f7010008fc60a363bd239be6cf6757ac53a93c8d011627710d7baf64c",
5
+ "sysml-grpc-darwin-arm64": "b8a905863e3bbe568a22275479a19d096cafa6c2753741206241872ffeb00bcf",
6
+ "sysml-grpc-linux-amd64": "e4b57b960b41b494e4913a03f113b906b04b9aa1806e49c325a72a16badd5521",
7
+ "sysml-grpc-linux-arm64": "b46f4074f8c7b051edf86dca1a235a6cb647ea8b99296e8a244aa63847bf6a17",
8
+ "sysml-grpc-windows-amd64.exe": "ed83e50d23eccaa985317736863bb0f49870d405289b5ef5d764fd75da8ed1bb"
9
9
  },
10
10
  "v0.0.5": {
11
11
  "sysml-grpc-darwin-amd64": "ab2933f168341bed3157bac0026d2c5a51bdb1c4629618178123f7ca8e071e72",
@@ -99,7 +99,14 @@ class Symbol:
99
99
 
100
100
  @property
101
101
  def metadata(self) -> dict:
102
- """Return copy of symbol metadata dictionary."""
102
+ """Return copy of symbol metadata dictionary.
103
+
104
+ Keys present only when they hold: ``visibility``, ``type``,
105
+ ``multiplicity``, ``direction``, ``specializes``, ``abstract``,
106
+ ``variation`` (a variation definition or usage, or an enumeration
107
+ definition; always ``abstract`` too) and ``variant`` (a variant usage
108
+ or an enumerated value), each flag ``"true"``.
109
+ """
103
110
  return dict(self._pb.metadata)
104
111
 
105
112
  @property
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: opensysml
3
- Version: 0.10.2.dev20261022
3
+ Version: 0.10.2.dev20261023
4
4
  Summary: Python client library for OpenSysML, a SysML v2 parser and execution runtime
5
5
  Author: Open-MBEE
6
6
  License-Expression: Apache-2.0
@@ -115,6 +115,7 @@ tests/test_tool_dry_run.py
115
115
  tests/test_typed.py
116
116
  tests/test_undetermined.py
117
117
  tests/test_unset.py
118
+ tests/test_variation_metadata.py
118
119
  tests/test_verification.py
119
120
  tests/test_verification_arguments.py
120
121
  tests/test_verification_questions.py
@@ -416,7 +416,8 @@ class TestRoundTripAgainstRealService:
416
416
  ]
417
417
  assert len(defs) == 2
418
418
  assert defs[0]["@id"] != defs[1]["@id"]
419
- assert {defs[0]["qualifiedName"], defs[1]["qualifiedName"]} == {"P::A", "P::@2"}
419
+ assert defs[0]["qualifiedName"] == "P::A"
420
+ assert "qualifiedName" not in defs[1]
420
421
 
421
422
  def test_positional_looking_name_and_position_export_separately(self, real_service):
422
423
  """A name spelling a position does not share its element identity."""
@@ -436,12 +437,16 @@ class TestRoundTripAgainstRealService:
436
437
  defs = [
437
438
  el for el in elements
438
439
  if el.get("@type") == "PartDefinition"
439
- and el.get("qualifiedName") in {"P::A", "P::'@2'", "P::@2"}
440
+ and el.get("declaredName") in {"A", "@2"}
440
441
  ]
441
442
 
442
443
  assert len(defs) == 3
443
444
  assert len({el["@id"] for el in defs}) == 3
444
- assert {el["qualifiedName"] for el in defs} == {"P::A", "P::'@2'", "P::@2"}
445
+ duplicates = [el for el in defs if el["declaredName"] == "A"]
446
+ positional_name = next(el for el in defs if el["declaredName"] == "@2")
447
+ assert duplicates[0]["qualifiedName"] == "P::A"
448
+ assert "qualifiedName" not in duplicates[1]
449
+ assert positional_name["qualifiedName"] == "P::'@2'"
445
450
 
446
451
  def test_unreadable_notation_fails_with_spans(self, real_service):
447
452
  with Connection(port=real_service, auto_start=False) as conn:
@@ -2781,11 +2781,26 @@ class TestEditRoundTripAgainstRealService:
2781
2781
  )
2782
2782
  )
2783
2783
 
2784
- documentation = [e for e in construct(built) if e[0] == "Documentation"]
2785
- assert [qn for _, qn, _ in documentation] == [
2786
- "ToasterDemo::ApplyHeat::duration::@0",
2787
- "ToasterDemo::Bread::@0",
2788
- "ToasterDemo::ToastBread::@0",
2784
+ elements = json.loads(str(built.to_api_json()))
2785
+ by_id = {element["@id"]: element for element in elements}
2786
+
2787
+ def resolve(reference):
2788
+ reference_id = reference.get("@id") if isinstance(reference, dict) else reference
2789
+ return by_id.get(reference_id)
2790
+
2791
+ documentation_owners = []
2792
+ for element in elements:
2793
+ if element.get("@type") != "Documentation":
2794
+ continue
2795
+ relationship = resolve(element.get("owningRelationship"))
2796
+ owner = resolve(
2797
+ relationship.get("owningRelatedElement") or relationship.get("owner")
2798
+ )
2799
+ documentation_owners.append(owner["qualifiedName"])
2800
+ assert sorted(documentation_owners) == [
2801
+ "ToasterDemo::ApplyHeat::duration",
2802
+ "ToasterDemo::Bread",
2803
+ "ToasterDemo::ToastBread",
2789
2804
  ]
2790
2805
  assert construct(built) == construct(expected)
2791
2806
 
@@ -0,0 +1,78 @@
1
+ """A variation point and its variants are told apart through symbol metadata.
2
+
3
+ The service reports ``variation`` (and ``abstract``, since a variation is
4
+ always abstract) on a variation definition or usage, ``variant`` on a variant,
5
+ and an enumeration definition and its values likewise; an ordinary part carries
6
+ none of the three. The keys travel the metadata map unchanged.
7
+ """
8
+
9
+ import pytest
10
+
11
+ from opensysml import Connection
12
+
13
+ MODEL_SOURCE = """
14
+ package PLE {
15
+ part def Engine;
16
+ part def Transmission;
17
+ part fourCyl : Engine;
18
+ part manual : Transmission;
19
+
20
+ variation part def EngineChoices :> Engine {
21
+ variant fourCyl;
22
+ }
23
+
24
+ part family {
25
+ part engine : EngineChoices;
26
+ variation part transmission : Transmission {
27
+ variant manual;
28
+ }
29
+ }
30
+
31
+ enum def Color { red; blue; }
32
+ }
33
+ """
34
+
35
+
36
+ @pytest.mark.integration
37
+ class TestVariationMetadata:
38
+ def setup_method(self):
39
+ self.conn = Connection()
40
+ self.model = self.conn.load_from_content(MODEL_SOURCE)
41
+
42
+ def teardown_method(self):
43
+ self.conn.close()
44
+
45
+ def metadata(self, name):
46
+ symbol = self.model.find(name)
47
+ assert symbol is not None, name
48
+ return symbol.metadata
49
+
50
+ def test_a_variation_definition_is_a_variation_and_abstract(self):
51
+ meta = self.metadata("PLE::EngineChoices")
52
+ assert meta["variation"] == "true"
53
+ assert meta["abstract"] == "true"
54
+ assert "variant" not in meta
55
+
56
+ def test_a_variation_usage_is_a_variation_and_abstract(self):
57
+ meta = self.metadata("PLE::family::transmission")
58
+ assert meta["variation"] == "true"
59
+ assert meta["abstract"] == "true"
60
+ assert "variant" not in meta
61
+
62
+ def test_a_variant_is_a_variant(self):
63
+ for name in ("PLE::EngineChoices::fourCyl", "PLE::family::transmission::manual"):
64
+ meta = self.metadata(name)
65
+ assert meta["variant"] == "true", name
66
+ assert "variation" not in meta, name
67
+ assert "abstract" not in meta, name
68
+
69
+ def test_an_enumeration_is_a_variation_of_its_values(self):
70
+ assert self.metadata("PLE::Color")["variation"] == "true"
71
+ assert self.metadata("PLE::Color")["abstract"] == "true"
72
+ assert self.metadata("PLE::Color::red")["variant"] == "true"
73
+
74
+ def test_an_ordinary_part_is_neither(self):
75
+ meta = self.metadata("PLE::fourCyl")
76
+ assert "variation" not in meta
77
+ assert "variant" not in meta
78
+ assert "abstract" not in meta