py-teststand 0.2.2__tar.gz → 0.3.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 (403) hide show
  1. {py_teststand-0.2.2 → py_teststand-0.3.0}/CLAUDE.md +6 -0
  2. {py_teststand-0.2.2 → py_teststand-0.3.0}/GEMINI.md +3 -0
  3. {py_teststand-0.2.2 → py_teststand-0.3.0}/PKG-INFO +4 -3
  4. {py_teststand-0.2.2 → py_teststand-0.3.0}/README.md +3 -2
  5. {py_teststand-0.2.2 → py_teststand-0.3.0}/examples/analyzer_step_name_length.py +4 -4
  6. {py_teststand-0.2.2 → py_teststand-0.3.0}/examples/execution_run_subsequence.py +4 -9
  7. {py_teststand-0.2.2 → py_teststand-0.3.0}/examples/execution_run_test_headless.py +9 -9
  8. {py_teststand-0.2.2 → py_teststand-0.3.0}/examples/launch_all_examples.py +1 -0
  9. {py_teststand-0.2.2 → py_teststand-0.3.0}/examples/property_object_serialize.py +7 -7
  10. py_teststand-0.3.0/examples/result_list_parse.py +75 -0
  11. {py_teststand-0.2.2 → py_teststand-0.3.0}/pyproject.toml +33 -5
  12. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/__init__.py +11 -1
  13. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/adapters/adapter.py +4 -10
  14. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/adapters/dotnet.py +8 -2
  15. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/adapters/labview.py +10 -0
  16. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/adapters/labview_nxg.py +11 -1
  17. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/adapters/sequence.py +5 -0
  18. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/analyzer/rule_configuration.py +6 -2
  19. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/core/com_wrapper.py +1 -0
  20. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/core/engine/engine.py +4 -2
  21. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/execution/execution.py +8 -0
  22. py_teststand-0.3.0/src/py_teststand/execution/result_list.py +218 -0
  23. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/execution/sync_manager.py +9 -9
  24. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/property/property_object.py +5 -6
  25. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/sequence/code_template.py +5 -0
  26. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/sequence/sequence_context.py +8 -0
  27. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/sequence/sequence_file.py +12 -9
  28. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/sequence/step_type.py +0 -1
  29. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/ui/events.py +9 -9
  30. {py_teststand-0.2.2 → py_teststand-0.3.0}/tests/integration/test_examples.py +20 -0
  31. py_teststand-0.3.0/tests/integration/test_result_list_live.py +76 -0
  32. py_teststand-0.3.0/tests/unit/execution/test_result_list.py +151 -0
  33. py_teststand-0.3.0/tests/unit/test_public_api.py +52 -0
  34. {py_teststand-0.2.2 → py_teststand-0.3.0}/uv.lock +137 -152
  35. {py_teststand-0.2.2 → py_teststand-0.3.0}/.gitignore +0 -0
  36. {py_teststand-0.2.2 → py_teststand-0.3.0}/.markdownlint-cli2.jsonc +0 -0
  37. {py_teststand-0.2.2 → py_teststand-0.3.0}/.python-version +0 -0
  38. {py_teststand-0.2.2 → py_teststand-0.3.0}/LICENSE +0 -0
  39. {py_teststand-0.2.2 → py_teststand-0.3.0}/examples/data_type_manage.py +0 -0
  40. {py_teststand-0.2.2 → py_teststand-0.3.0}/examples/search_directory_manage.py +0 -0
  41. {py_teststand-0.2.2 → py_teststand-0.3.0}/examples/sequence_build.py +0 -0
  42. {py_teststand-0.2.2 → py_teststand-0.3.0}/examples/station_options_update.py +0 -0
  43. {py_teststand-0.2.2 → py_teststand-0.3.0}/examples/step_insert.py +0 -0
  44. {py_teststand-0.2.2 → py_teststand-0.3.0}/examples/step_insert_from_template.py +0 -0
  45. {py_teststand-0.2.2 → py_teststand-0.3.0}/examples/ui_messages_handle.py +0 -0
  46. {py_teststand-0.2.2 → py_teststand-0.3.0}/examples/users_manage.py +0 -0
  47. {py_teststand-0.2.2 → py_teststand-0.3.0}/examples/variables_manage.py +0 -0
  48. {py_teststand-0.2.2 → py_teststand-0.3.0}/examples/workspace_create.py +0 -0
  49. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/.graphify_labels.json +0 -0
  50. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/.graphify_python +0 -0
  51. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/.graphify_root +0 -0
  52. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/.graphify_uncached.txt +0 -0
  53. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/GRAPH_REPORT.md +0 -0
  54. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/00300beaf41ddf8ca88a2133f315f9873877e388dfadf2343bc93ad9ec7189af.json +0 -0
  55. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/0041043937ad3008273915d37b7f4b2d48ca2c4612d45ae3f8cd0cb931b90f9f.json +0 -0
  56. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/021c67591ed36baaccec5597b1aaa5da45a3d107860151d0c14da8d8e82d13fe.json +0 -0
  57. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/023707fc22c5dae0fe050b058cef36e8166178bd19bf64c19d1d5769193e0b66.json +0 -0
  58. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/040ee1db9c6b7f496603e954cded103cc0a695fdff0107104d1971e6bd77fa80.json +0 -0
  59. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/05037a9ec557a4372515feea0cb82e6b8112ac7c5e298565964fbd270f96bb55.json +0 -0
  60. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/0524858e50a4d2f7d2ac92c57ca3c87df637bf4c3158c7092a413e4393c857a4.json +0 -0
  61. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/05547b7aeeb2f4a7f5f21a8e7104b9116d781c941b744c43b0ea6c82e21b5fdd.json +0 -0
  62. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/0561a3660d3619ac6a5591c0657208ef1151afc18df8f2fd6f97de8670d8eb60.json +0 -0
  63. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/057056cc111fdb36b69e58f64079572f5c47872e0727d1ad3dfc0f35e7d39a4f.json +0 -0
  64. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/057e562996ba53b27fd80676787dca1563c48de754f9cd7932562ae64c3b5489.json +0 -0
  65. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/064e97d62db5d77399540dec673d05b900a3e29224bb4e45bc3e879729f20003.json +0 -0
  66. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/06511afc1a360b72ddc9b4497a994dca686aef3b97922cc8b80443403a4ddb83.json +0 -0
  67. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/06c31bd2b14400097f1e5123a6f39525ba4c4e5e2a5e7ff4c38a43b224d20a0d.json +0 -0
  68. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/070c095dddd2f798973cbb1332d344bf81370ea5a6eda28e88b1f7a27ef6c709.json +0 -0
  69. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/09332e170176084c6344fec2f82b8e890d06f8e32680643e316246716bee53e3.json +0 -0
  70. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/094e59f0e4cdb42feca81333bf3bf014eca76ad887ef1490483f798c17d40cd5.json +0 -0
  71. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/0aec586f84490fed93173f8a2200485ceffc529450740dcf5edbe12a7d89f781.json +0 -0
  72. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/0af23434a97b56cbda3aaf2de520ee9e18a629be0ef406a90dac45260481c1bf.json +0 -0
  73. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/0bd90bc4c1dd73076d8627f6ea7be67faaf504d30221b1dce45cb1c443755fb5.json +0 -0
  74. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/0e7f3eedcff4a433a47611e1adf13860af5e6d16fbb6129fc48ddd8557aa1626.json +0 -0
  75. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/100f3021f37614916d64cfaf40b04fda8d1989d624d03d93a97ec6ca79bf17e0.json +0 -0
  76. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/1051e1923497524696fb7fa1b71ba3a9d3cf12ec8519b1e8209d9d5eac717990.json +0 -0
  77. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/1086f0d1446ee0d57fc4c325f3828ff783e328ced88aac13b45f718161499e53.json +0 -0
  78. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/10fe404eb03263a768b27a2e92b2fe20e33cda3eab265a84860286430be0a49b.json +0 -0
  79. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/13bdd9d4f7de5ab5fbb955890067eb3772a2302e014480243ae141a4eee8b4f7.json +0 -0
  80. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/167515af1cd986fa06cab9d7efa9f1feb18bc95e3c6de1dba854adafc7ae8ead.json +0 -0
  81. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/16fba3996eb41939497dbd0f426c599e4ebc1eb5a762d7e1ff143708e49e94dc.json +0 -0
  82. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/17de4e480542b25d6f2a11461ae4f41a6282c3ecbeb3619b0b42fdbb7f31939c.json +0 -0
  83. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/17fbd1888f87c0b6c099e7e88300cf58e26adda72cf2f2297fc1f0e6bd2e9257.json +0 -0
  84. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/1d601091a3312ce89ddc9523bffccf41742eb6ea1223a6b4f751c210ffce1fb4.json +0 -0
  85. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/1e4049e0856983245c1154127a97509e576a1fd14f3ea56d52f946878a535bae.json +0 -0
  86. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/1e4d42449081955231608e3fa48b5c3102243d55a80e9064b88440669ed821b2.json +0 -0
  87. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/1f727c948a41c946dd0aa376993d5620f226497d49404c03b3c175d057b4ab29.json +0 -0
  88. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/1f7c2be5abf85169f9c409d39e58419418193281eeb391dc3ec0d1f6784f40dc.json +0 -0
  89. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/1f9db61abe1368fa82aab9d8e1b27d97389172db6c78cc23abe03025876ebdd1.json +0 -0
  90. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/207fdd9cd514b05162cd7babd5d2252985853a11cdf847113056a5071e8377e3.json +0 -0
  91. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/2165f2f41684c71dbce5e6edf7262786c5aa8518828e00e2a4dce75492f53aa3.json +0 -0
  92. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/22832c79316ab6a0c79a6bca80d9635ba80df2e2079ac114c354d43aec19f95c.json +0 -0
  93. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/22e04e79d7912eb1b7e3bca68279f3fa7e2936b3d2706fcdf688fff96f7c30c8.json +0 -0
  94. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/252d1adbbb189a3636432d8de48b5ed7c8d1f185c5ea46ceb616071960b1be42.json +0 -0
  95. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/25ab62b76a5f58693d5161dabf0a58862a7d6d5e9b054cc2347ffb79d4468f65.json +0 -0
  96. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/29731b11c9bdce6c0524fbcf801177b2da8d3181efa44ab73832e8dc0ed442bd.json +0 -0
  97. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/29ae039e1d154e5d25fc8659bf1eb270830e4fec772f91f41bf1cb9744733674.json +0 -0
  98. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/2b7f894857506a93df04568d3bc252c6883ac4010ba64b49a8c13c9cd06330ca.json +0 -0
  99. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/2bbb54bb8f3b91b33e7e872ea5e2b129079a60fe8284b8dd8bf5488b2f76b55d.json +0 -0
  100. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/2d70a40698b885cb7705c0d57922dfc922ef6b90e9a4580935d170395bc51a6e.json +0 -0
  101. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/2ddf8f9e5aa81db1e984bd5812d91143f64ab806a7b5676d6e7f23d1d08f677f.json +0 -0
  102. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/318ebfed808e94269a07fb5136c60f910bf810ffa3bef5aa7c26c313519147df.json +0 -0
  103. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/3289a80010b6c0faed89308018fa31f7031f27ae0d853299443c23ba8a4d6e6b.json +0 -0
  104. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/3312f8a2eccbfd08fabdba5d2af656bfbcb95e5b7e5390abf35ad5140759a710.json +0 -0
  105. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/35d6fee40fd65a1c224aa8320fbd8ef959f6975b16cc89fc2cfbb3c1b4e95641.json +0 -0
  106. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/3654ae6c52c3267b7a62b7697d69011bd6446dd3f6da9bc5b133da4c2efe7d6b.json +0 -0
  107. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/37cb92f2f6a01d4862632405ced4934cc003818147fd14ea9a636bc7336d3af1.json +0 -0
  108. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/3a06bdbfe7f9ae5d627e941fdd9e616d0431a4f41b37c8f8d7b3f5751fcadb21.json +0 -0
  109. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/3ac8bb6902eda596ffe0f32f517fb6e567a34e52e76c4ccc682d7c7dcf65f06a.json +0 -0
  110. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/3ace387692703afd7ecab2396d8eb8b3dc6411c0931ebf68ff5370013c707fa9.json +0 -0
  111. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/3b65d0f842b856818ed2510234a106990e02450d60aed9075cc4c9f4b14101bc.json +0 -0
  112. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/3b90f45c585a53b5f55ef2c3761eef4b97fcef1eb344f9a4819c989b174b52e5.json +0 -0
  113. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/3cf920bfdd765673b964deab1cf13959604b7648091d4c58209f818cc3fede98.json +0 -0
  114. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/3d97defd459d93180b984ca62794c47f1da9a8dc105175bfc1d8948fc8dc3f29.json +0 -0
  115. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/4096008e37ad33f487fa031012fdc7f354edbb3e2c3d82eeeae616e8e1ae75fa.json +0 -0
  116. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/4278f99739c7c54475247d2cfb57eda95ad3cc39d7bbaf04729c04932d9fef12.json +0 -0
  117. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/44963597cd3ea0c48e79c9aeb4e7838f1faa5bcde319b7ff81b29aa6549d551f.json +0 -0
  118. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/455df594e48e61d53c059f4ddad24e31e427232f4fe871e8ff384227350cc9ce.json +0 -0
  119. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/49e757465d8e83eb1ea11482682a0dc9bf8dd399847c883954925749ad6470c2.json +0 -0
  120. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/4c3d7045d901449868d2003d5529dd6f41d635c9e1ef1b1b8a0bee5e15aafc70.json +0 -0
  121. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/4e9f3dd260b769260bab0fd12ca46ae6b3b17221c6968fed8b7907173b05fc2d.json +0 -0
  122. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/50c625a30e42a14c35d57d119aba7e16a17fa05fc60cb5ff961c61a77f6129d0.json +0 -0
  123. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/50d6499184d0d9889c9571e8f6b7b7def3329721be05cc10bbac13520f8eef37.json +0 -0
  124. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/519a945f4a84c930588f887f3b23f13102ea6138645d177cef5f98b7b91e6229.json +0 -0
  125. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/523e956286ac13d37bfffa655ef1e83b1ecd17889caeae0ede6e99cb03c29e83.json +0 -0
  126. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/5254fe829c1a1554024b185254ce1177eaafa64b3ea72a0732abc7a205074b23.json +0 -0
  127. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/531a38ee0ed1035f37eecda69c27f43d9a0ecd6fea2fc6127c3a3318f5f06dad.json +0 -0
  128. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/535082e7e072de1deb460d4d58ba560c76f4c0ffdba7836846c3699d4c47fc5a.json +0 -0
  129. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/55cb312149a7885f52f272daaf0060fbdbd8e26dc67e79c7b15d94a32b750749.json +0 -0
  130. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/563deb73b3327340c242a025beeca43321716dfbcea23fac9c89875d67a08f72.json +0 -0
  131. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/58191b4e65d5ba31195e59a1f244014669e52970d0bfe01bc99ab171f54e1c03.json +0 -0
  132. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/584d486255b4cee316ca9e6e3656c989d600ac403ccf01bdb3d548606678b17b.json +0 -0
  133. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/589dad68071e187dbb2fbbaa04d83c88bf219f7d428bfe1aa5a1ff7dbf023a23.json +0 -0
  134. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/5a0a54d982fe112ff92a0263994062f4bf21f02c426b6936f257e80d02efabb9.json +0 -0
  135. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/5a4e9b332727fe6e94e1548fb31f14aef41966f5ead08e7dde780b02d60148f5.json +0 -0
  136. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/5a8f8b728c901bfe909cccedbe276a221a7e0af456ebb26189774931eded5a74.json +0 -0
  137. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/5bd0ff70a33bedbee8d278646e92ab57e29a43867cd60e7fb918508833117b56.json +0 -0
  138. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/5c088e2c173f3f6dd18f3df4cd20a198a76d4d5da9db7f8b749b55ea97210f05.json +0 -0
  139. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/6095cf8a05c742b2d126bfc1cb9064a3c3cae65911146f1c4d36e2d4f86f1680.json +0 -0
  140. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/6207dfec219a33509fc91cdd0055029c6b360a28fe282bee4bf489a4d45400d3.json +0 -0
  141. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/62602a326a616b0ef6a3ee96fdf794a5815d0a69babd77a9a85e68ba6599db60.json +0 -0
  142. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/627d8be024734a3d490521cd423e9db4c50870f3ca6ac761e75f86ea55eb9491.json +0 -0
  143. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/62ace6fa362a937c7d2e645eea0192df37d1de5fc0fcc9f0a16f708b74ecd48a.json +0 -0
  144. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/6464e2cd097df4628226ba38836dd4d55ea4b97dba4dd952e1a34c84fa00e914.json +0 -0
  145. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/6469622a3449ce827fd414b465085e38a53133a20024b6c30e13c6fab1cbd06e.json +0 -0
  146. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/64990a73d75b059ef41bfa7ffe5dc818e1e197e3509f3b568e7fec254760bdad.json +0 -0
  147. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/68806e21c83d8f6bb9b7deaf161a26e2543fb6a6052839b92fd229c44de4785d.json +0 -0
  148. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/689e2aa834fc2b6c42e3a6ad0c9b2a9060d968a9a8dd8d1c47be911b5a7347c6.json +0 -0
  149. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/69e95bec750edd2374827041d52575a2c09051c1adb4b1eab17cb8dc9ed5ee9d.json +0 -0
  150. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/6a583adb3c041e3e49886b4b96a73494fdb8c677ac28463c037845ba616348a3.json +0 -0
  151. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/6b39e36d9b59b214516369764a7c635e8b6af335c69fd2ab4fbd3be0aa12f539.json +0 -0
  152. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/6bae4a41d4b3c584b87f6e963948951164f820ba2f77065856e93fa5fb77da4f.json +0 -0
  153. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/6be37bdd97101b62dc6fd786d39749426e719b5f9c0464ceb43cdfc63e56d5b0.json +0 -0
  154. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/6d775401047dd566d5fcab422fdb64798fc85eef1ccd9444c43376314a7e81ba.json +0 -0
  155. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/6e8481e9dad0e6c1793e5f6ccbbf1dfb5ba88a09fb9e326425df6bf3b5b10e33.json +0 -0
  156. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/70ac455c2976654f81e4ada2accbeb9a0ed097e513ee641a1767038b60f3d058.json +0 -0
  157. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/715a84c56ee658f84a9b5930a0d01326da31d98b891e6ba0be647527f999167c.json +0 -0
  158. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/73190900d1852a833a8e0c0cc86f2a1083d4b3ffcdd36ccf239bf3fefe2be9b9.json +0 -0
  159. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/731a07b1575dc21af660051d44974822d16d4d07e0ff8c959f3e7971c16e9a7a.json +0 -0
  160. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/73ee87e06204f3346bd71d9107d89a9171428bacf3611019cdfcfd4aef224acb.json +0 -0
  161. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/73f5451927075637af3c96c14efec5d69b6da496baee2dc759048edc9b12c232.json +0 -0
  162. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/74c85d86a6d8483900d3fa46e3dd606f54d64af4ae6e5b75421fe1c6788b3c60.json +0 -0
  163. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/77cefb8a568e79bbbf5ea2f16eca5b1dedef30fde3405aab81eec97baf84f827.json +0 -0
  164. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/782afa626a4098a473fab0fb263ca59c59db1111372aa81c48944c3b8c95f491.json +0 -0
  165. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/79ce979e77967e52a44d8579c4303ab655f65ad9bc258c3bd96c3dd7305cae06.json +0 -0
  166. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/7c6ac8a21f4385b56aeea01fee3766a0f9abbbc6f9a0590ea16325f235efcf20.json +0 -0
  167. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/7ceeb2d8df9a1700574716eeb32d72e4fd574ea02d01cb3e1e48e65df9c5003a.json +0 -0
  168. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/7d5f935bff18ec87a6c7a089cd08c4d89cc922a0e020c1fb1b57f13ed586358c.json +0 -0
  169. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/7db158ee49deabc6bb44403c7cde05504828d9e0ab9059b2630fc953bd81d93c.json +0 -0
  170. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/7dc6b1a6affc2de030eaa790e0826a3797ed82b2f5e6df1481df872f1f511e9e.json +0 -0
  171. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/7e0aa14109be2807e6cab542dd82edba518e53ede3c664eb7224a8dfe651f469.json +0 -0
  172. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/7f546efb5963586a767ed1de189fdadacbe4ae8989478a5a66e5120052df625f.json +0 -0
  173. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/7fbf42c8c7d52f048579426d9da3dd81d5828c24c2321a3795fb3b7659b92a0c.json +0 -0
  174. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/80c3a5a1b8160107475d142a6135ddaf906da9307805f2e68ba8c3af04aa9882.json +0 -0
  175. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/81a280d2907246e14a57096449e036eb0363da6f0074ecedf14879d6f09a826c.json +0 -0
  176. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/81d4d752174e5a09b2ba32a01724629f16137270b7f0f098a5e66b6a1c689d18.json +0 -0
  177. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/82cad94a35ab2d431beb0f15d5d13decd59ab65525dfc802995ddc7fbacedc21.json +0 -0
  178. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/83d57f81198fde4ad8a03bbe0f9d80058eb82724505cb31283206d38486285cc.json +0 -0
  179. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/85af66fc476055f4e450401935be1757b9d043099c0530a55edaaa9e8fc45b78.json +0 -0
  180. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/85c074209d24896e542e425b1fb9fad5d2704db1286e406b25fbe2a9e1c62ac8.json +0 -0
  181. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/86332e56e1d088488a3378a8ffb47b13abb39e8c81cdeb5f1d546a14a5d4e03f.json +0 -0
  182. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/866b406c0825b3fd70dd6c7a0c04d67018b3701b14bf2658d5f05ebbfb134bb2.json +0 -0
  183. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/869ef8c9b4cfacfe7b568dedfac756cc52c7635bd951bacceb6f68930061e798.json +0 -0
  184. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/8b4f66ce9958d1bb4077dfe1d0e4df2f7f4642a838714dbc93316dc3c8523534.json +0 -0
  185. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/8b9eaad4dfb5c0936cebcafde3c3b368c71c5c2e7f4fbc282c887051e25567e5.json +0 -0
  186. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/8e4e1c38e46c8daa3c97656d09feaa9fbb2f083b3401f9fbdf7fb53a87bb50f6.json +0 -0
  187. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/8e73cca8cf7e6238b5a9e4a46b62d2cf8968fb9e071c8ff8e21a55b1cbb1cd46.json +0 -0
  188. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/8ec0bfac79ec428f8e9bd6ef770eee33b0218601b0ada7b113da52b4a53ca6fc.json +0 -0
  189. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/8f1414450de85a7ca36b1c4508c946084f9eaa83eee74f709dd09ebb7fc9e773.json +0 -0
  190. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/92e467b0ca6f7256ca2bd57e96777a76d4cd15d574eb169a10d37c8c5737fb3d.json +0 -0
  191. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/93eb2741e82d5f2c723db19741da0ec90a516da435c2be2ce0c63fcf18a478af.json +0 -0
  192. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/95cb2ed2edc938dbc2eb71b8aeebaec57b8eaaf2229c8e7f4a1a702b36da6d36.json +0 -0
  193. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/95ede7cf79834cf530eb2332a0a7859f1f3b27cc246645cb88421aa0def23623.json +0 -0
  194. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/97aaf1b808af614b0985c5d9ea1196a794a2453b59c9bb81cac1561b29f9092f.json +0 -0
  195. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/9811147e5abebc52edff502471a40f369ee1329e9f029ef3258976404f06a8f9.json +0 -0
  196. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/98270c04210ce70f7197fd3c1df74140159aed78f3d6b0c736b9fd1de4309b68.json +0 -0
  197. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/98f967e9230b612cb641244c969d3461874f40a74d00096217c05b4ca3cc5163.json +0 -0
  198. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/9a710f33bcbf32f6281ef3199603286b84e3ead526791be3e5702cf19a10ba80.json +0 -0
  199. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/9cce4a16b043c387789e0867504b51418b27f557bf5874111ac917bde8e0b109.json +0 -0
  200. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/9cd2cffa72ed809a1541ad88bf92c541857c512b6e7fe07c5d9bb348a51c071a.json +0 -0
  201. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/9d06f4503bab33ea71454511db6e94b3a27c29ad650cc9cdbfd5b43138f476a6.json +0 -0
  202. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/9d3d1aee5a15a733c47dd04fdb5943d68a49f8ce13d67b05bc0a14497328f58d.json +0 -0
  203. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/9d440f60091a4f93dcf1d78367e2c71755a3acdfe8844a1b5f756a235b763488.json +0 -0
  204. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/9fd47dbb9db188abce18b1f3063253323bca0327c3362dbe36ee49250e348d54.json +0 -0
  205. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/9fe051f8082e371f9df5f940b8f071800623a9ad5b40755285095658d8f28b5a.json +0 -0
  206. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/a06be12e9602b3b595742d0cad924633191314032eaf6acaba75ae02c60a9811.json +0 -0
  207. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/a5369060fbe387a285b63275bb4e455f350efee2df2aa880f03b07ef8e64fe7c.json +0 -0
  208. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/a67e0d0fc7ebb86fc0e08ddc07be6131e22b253ad50fb36935e7901dec5977b7.json +0 -0
  209. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/a817b12b6f3c5a089ad11643f41230ba21f1987251b7a190b39cad4f485dabc5.json +0 -0
  210. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/a86964aa1cbd83641808a11c8ec3231008bae1345219c2a5646e36a8e06599a5.json +0 -0
  211. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/a93efc87b8b26bb8e00bc3bb298aedd3d7ac45ceb950802398d2414bbf47c0dc.json +0 -0
  212. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/aa76182d9de824910acfbbfc5ea8f46681debd787c018927147e47b85f056e8e.json +0 -0
  213. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/aad95764364270f74a9a2b521a4eede3c4e63ec332fdb251f833610f46f62f9d.json +0 -0
  214. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/ac62f874e909973d6a406359c3a3331861f7775ce15427c629754984e6c2bc59.json +0 -0
  215. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/acf05ae7385ed2c7fc6639333fe802f06a0ae3b54b7dc2704234673a41328154.json +0 -0
  216. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/ad228703c7b568b72aee72ca2c50dc043ba963295abff15d0f2eced3379378dd.json +0 -0
  217. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/ad28df2f2e8bc652a77cead6d657c2aed9fb644428bbd3e2c69d3b21790b6405.json +0 -0
  218. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/ae24c1a5d0d0a7e29eec5c4f95e19009825ded2c622d288ba63e6b25de7524b5.json +0 -0
  219. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/aed3d23a58b420ee0328b3bbab000572b8891d72ffb6232c3cf8b807241fe903.json +0 -0
  220. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/aedd4475f0cf7c73ea7553423af3f920eb19c3efa9eb2f8a611f6e898dfe2a44.json +0 -0
  221. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/aef7fe4c9cedf564455aa029d6cc89b79b56a532d04a56a8d092808c0ad4e5b1.json +0 -0
  222. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/b079373b22270ed561a40ead88df318a0b3cd52b143607c34f7340508f6e390e.json +0 -0
  223. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/b15b8672daa3f5df56cc7f97ee8294dd2d23b975dc9e34256c69726676be3daa.json +0 -0
  224. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/b4476bcd1991a5a30b1ac3f78801025d2928cd8c77db07730551b0815ce13c36.json +0 -0
  225. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/b470e846ba2a52d4e0763ff5739d1528d1b86974dd79c08358ceb33076790e76.json +0 -0
  226. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/b5a337d95da18b2c918d1be090cf235c67a7a09cd60f23033e8c570fa8dbb748.json +0 -0
  227. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/b60d2e0d59f626d9ff57d7230795b09be357a37343d0d2c0d1ca958a1857d8bd.json +0 -0
  228. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/b6420f0dfb5e0f15c42fa9170634d6c2b3d0409749b00ffd3c9364246d88d790.json +0 -0
  229. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/b647bffb0af3f94c4df75171f311ece530c6def16132a3a33f4b7deff6dd707a.json +0 -0
  230. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/b710a0414f46ecb976cc66ac059d3a74dbd64d0bf8f1116de968837e581b6422.json +0 -0
  231. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/b73436f8a0e225ea354ec4ad7993c5d5887b7227f7545e2ead47ac03ccc082cd.json +0 -0
  232. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/ba1fcae5bd482a5ee1095215721f18a5951393e75bb88a9df1b3e1922e2202ef.json +0 -0
  233. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/ba646e84c605179808ec987d421f534a1c4af669a910fdd1ac75bad73d8b587e.json +0 -0
  234. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/bafd5076a18391e489c5133abd6aa6032cec2783626bbd8a84381b7896f21c9d.json +0 -0
  235. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/bc630d1d2d79d48a0c7441c1081f97933ae9bc733733a7918a4cf498fa61b981.json +0 -0
  236. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/be18c3a11472b8d81adfe9761be1ff309c93c04be3f69d56638efb019757f8f7.json +0 -0
  237. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/be985fcfeb455e3d468126f1c7b65b4ab84b57c743118ef4ac021a88973dd155.json +0 -0
  238. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/bece45eb021b6454fcf8a9cf294536c7752f817beb12c90d65e0c21afe57a5a1.json +0 -0
  239. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/c018635d30a0f5436fc124a28ca204b8199b2dcec3335147150e0d34b9e1f82a.json +0 -0
  240. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/c3e028aefdbe3e462d7f676938ae48c428b44031e7c4ef34fb4686904e97b3c8.json +0 -0
  241. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/c7d3603bbe7edfbcfecc3a1b09bdd2307209be3fc7978fea7bfb7685c91b08d7.json +0 -0
  242. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/c9457b843ef85e899bfd9352d67f73980b1a2304cceb01e992440ffdd3d0eb5c.json +0 -0
  243. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/cb761115d0ed359fc4e55ad0c40245352cc091c68e5171ac20ef5e6d9d9832d1.json +0 -0
  244. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/cc658b209eeaf4c9249998a1534cefdf6837ce3a7de82fc62202102fe09957a2.json +0 -0
  245. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/cd2ce8667e344c6769096140ab1e4d9829ba2424eb9bdb65dee55f09469fecc8.json +0 -0
  246. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/cd8ce55adda67b165bf6272936d26dc172ba4d7a5fbfa4d5142181855c40f02d.json +0 -0
  247. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/cecb346166b599b5343dad969681c67168e5130e3a4018ee8fc903efc273fe04.json +0 -0
  248. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/ced68cd7e814d7774ffbdc161d16335221561854b99e12f107671e17337504b1.json +0 -0
  249. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/d08762a2d53ea94992d179f3affdd360ad2d58277024715af643374e65e62606.json +0 -0
  250. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/d48e2ae9efb9c635d241fe4f1d65e0ec51c9ac3740c29a0db58e3bcccc0e2466.json +0 -0
  251. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/d54b3634353a29d5fc12e6ccc72ca587a9b2676489bf893524c004d4afdefa51.json +0 -0
  252. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/d6200254d8034d573eb3b6bd33d39d7efddaa5fdf60a61453789e61853f03489.json +0 -0
  253. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/d7bd2958a25f99487597175b812cc96293a1342810f5076c4a92a1506fba2599.json +0 -0
  254. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/d8ad7e776fd4b3708759b004e7ed524ff77a988d48237e5d357dc99a9a3bb79d.json +0 -0
  255. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/d9dd2631fda1b4480019731d75b0a908a057084bc22ad2ca66a2c381b86e0a38.json +0 -0
  256. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/db25c8d58f8689825c0d89e5ebb3ca93542b2dafa228fde7285dcd9565ccb552.json +0 -0
  257. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/dd430a8b0bc073c8deb7e7be1ca766292097b47301797452810293d73d53ff70.json +0 -0
  258. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/ddaaecef88ef58b3207db5b55d5bbd8d91421cd99a49941482368f626cc28b9d.json +0 -0
  259. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/df9ffa69edbeaabf967cd706016a4c97e6f9ffc41c5e38ad327fde2d452ddd3e.json +0 -0
  260. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/e1713cdd15edde27fe7f01c40841ee3ede0d411e350e2b31b9e8b5b2f9ce6feb.json +0 -0
  261. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/e2eafeb868d33a2e19815315d4cfe04eaba57e9fa7835ec2a8f35b0ddffa3498.json +0 -0
  262. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/e5581298f1ebdbc113077df91f6215a07ddde68e9a45c01035f87d241062abd2.json +0 -0
  263. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/e5dcdfd16046923e879eb93db75c0df5067b2859f57259df63cdcce61ef2c03e.json +0 -0
  264. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/e5e9a12f89839a814832a5d5c375d4f6da3f81197790d2d52467fca122f43fd8.json +0 -0
  265. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/e8c2aff5248d3d761f3f8175e68f1ff46704c934465ccca6d284d40eeb54ae87.json +0 -0
  266. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/e992bfbfd3c2b33a9dac8499d800f5fcc3d7c33d8d84f90eb705bbd780a32b32.json +0 -0
  267. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/ea02b9cc1c110994d38e9aa28b9e4fdf49c7b0e074809f09760f068bc41dc7f8.json +0 -0
  268. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/edbe4c5e6076cc2c119ccec658be0196128b8742a9d640cb9cdf7d79aa622304.json +0 -0
  269. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/ef396e2cc36a574a59a95bf95caae976ec92698d1b43a1fdca8e7a20609d6aa3.json +0 -0
  270. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/f1607b2d6749b8e2f1b21e6985fa4da4077d01500b190e20b3d4ac89c8cd0e69.json +0 -0
  271. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/f2c65b378401d4e854bb4d18bc4396419ca74dc8c84a5a8d57f4074baeeeb63f.json +0 -0
  272. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/f5a620cd0622f180ea799f73823c099958513ca86ff822d9fc45f73b106b35c4.json +0 -0
  273. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/f649350396b8f14e079a1646de95a5e490c709748fcd989a603afad3a7044898.json +0 -0
  274. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/f68a4af4ef4d24cc0416195c9b123d0cb4f6811c08554914866d4a86835dab24.json +0 -0
  275. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/f9ee28f629cd46d9b44cdd1dfa64aadb0231af8002093266902d90e1f2f9fc88.json +0 -0
  276. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/faabe069e0568dabcc65124f0fa7d56e3ddfadf62523fc3f208ee4ad11c46f8d.json +0 -0
  277. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/fe209b7393dc29439e121809022e793527d4208c2957d479e9f0706d4ba357e0.json +0 -0
  278. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/ast/fe674973c21bca43da88fbeadc8361422a28aeb4d9eaca2db7d40f99a04d5608.json +0 -0
  279. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/cache/stat-index.json +0 -0
  280. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/graph.html +0 -0
  281. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/graph.json +0 -0
  282. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/manifest.json +0 -0
  283. {py_teststand-0.2.2 → py_teststand-0.3.0}/graphify-out/merged-graph.json +0 -0
  284. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/adapters/__init__.py +0 -0
  285. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/adapters/activex.py +0 -0
  286. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/adapters/cvi.py +0 -0
  287. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/adapters/dll.py +0 -0
  288. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/adapters/htbasic.py +0 -0
  289. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/adapters/python.py +0 -0
  290. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/analyzer/__init__.py +0 -0
  291. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/analyzer/analysis_context.py +0 -0
  292. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/analyzer/analysis_message.py +0 -0
  293. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/analyzer/analysis_utilities.py +0 -0
  294. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/analyzer/rule.py +0 -0
  295. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/analyzer/rule_setting_values.py +0 -0
  296. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/analyzer/types.py +0 -0
  297. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/core/__init__.py +0 -0
  298. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/core/engine/__init__.py +0 -0
  299. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/core/engine/enums.py +0 -0
  300. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/core/exceptions.py +0 -0
  301. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/core/external_report_viewers.py +0 -0
  302. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/core/file_information.py +0 -0
  303. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/core/images.py +0 -0
  304. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/core/search.py +0 -0
  305. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/core/utility.py +0 -0
  306. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/execution/__init__.py +0 -0
  307. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/execution/additional_results.py +0 -0
  308. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/execution/breakpoint.py +0 -0
  309. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/execution/database_options.py +0 -0
  310. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/execution/edit_args.py +0 -0
  311. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/execution/interactive_args.py +0 -0
  312. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/execution/output_record_stream.py +0 -0
  313. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/execution/report.py +0 -0
  314. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/execution/result_log.py +0 -0
  315. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/execution/thread.py +0 -0
  316. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/execution/watch_expression.py +0 -0
  317. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/ext/__init__.py +0 -0
  318. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/ext/events.py +0 -0
  319. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/ext/step_types.py +0 -0
  320. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/messaging/__init__.py +0 -0
  321. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/messaging/output_message.py +0 -0
  322. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/messaging/output_messages.py +0 -0
  323. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/messaging/ui_message.py +0 -0
  324. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/property/__init__.py +0 -0
  325. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/property/array_dimensions.py +0 -0
  326. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/property/data_type.py +0 -0
  327. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/property/property_object_file.py +0 -0
  328. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/py.typed +0 -0
  329. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/sequence/__init__.py +0 -0
  330. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/sequence/expression.py +0 -0
  331. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/sequence/location.py +0 -0
  332. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/sequence/sequence.py +0 -0
  333. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/sequence/step.py +0 -0
  334. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/sequence/step_group.py +0 -0
  335. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/sequence/type_palette.py +0 -0
  336. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/station/__init__.py +0 -0
  337. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/station/search_directories.py +0 -0
  338. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/station/station_options.py +0 -0
  339. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/ui/__init__.py +0 -0
  340. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/ui/application_manager.py +0 -0
  341. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/ui/button_ctrl.py +0 -0
  342. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/ui/checkbox_ctrl.py +0 -0
  343. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/ui/combobox_ctrl.py +0 -0
  344. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/ui/command.py +0 -0
  345. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/ui/connections.py +0 -0
  346. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/ui/entry_point.py +0 -0
  347. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/ui/execution_view_manager.py +0 -0
  348. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/ui/expression_edit_ctrl.py +0 -0
  349. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/ui/insertion_palette.py +0 -0
  350. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/ui/label_ctrl.py +0 -0
  351. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/ui/list_box_ctrl.py +0 -0
  352. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/ui/listbar_ctrl.py +0 -0
  353. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/ui/menu_item.py +0 -0
  354. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/ui/report_view_ctrl.py +0 -0
  355. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/ui/sequence_file_view_manager.py +0 -0
  356. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/ui/sequence_view_ctrl.py +0 -0
  357. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/ui/status_bar.py +0 -0
  358. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/ui/styles.py +0 -0
  359. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/ui/variables_view_ctrl.py +0 -0
  360. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/undo/__init__.py +0 -0
  361. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/undo/undo_item.py +0 -0
  362. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/undo/undo_item_creator.py +0 -0
  363. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/undo/undo_stack.py +0 -0
  364. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/users/__init__.py +0 -0
  365. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/users/user.py +0 -0
  366. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/users/users_file.py +0 -0
  367. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/workspace/__init__.py +0 -0
  368. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/workspace/workspace_file.py +0 -0
  369. {py_teststand-0.2.2 → py_teststand-0.3.0}/src/py_teststand/workspace/workspace_object.py +0 -0
  370. {py_teststand-0.2.2 → py_teststand-0.3.0}/tests/__init__.py +0 -0
  371. {py_teststand-0.2.2 → py_teststand-0.3.0}/tests/conftest.py +0 -0
  372. {py_teststand-0.2.2 → py_teststand-0.3.0}/tests/integration/_ui_message_stress.py +0 -0
  373. {py_teststand-0.2.2 → py_teststand-0.3.0}/tests/integration/test_api_compatibility.py +0 -0
  374. {py_teststand-0.2.2 → py_teststand-0.3.0}/tests/integration/test_memory_leaks.py +0 -0
  375. {py_teststand-0.2.2 → py_teststand-0.3.0}/tests/integration/test_property_object_serialize.py +0 -0
  376. {py_teststand-0.2.2 → py_teststand-0.3.0}/tests/integration/test_ui_messages.py +0 -0
  377. {py_teststand-0.2.2 → py_teststand-0.3.0}/tests/test_core.py +0 -0
  378. {py_teststand-0.2.2 → py_teststand-0.3.0}/tests/unit/__init__.py +0 -0
  379. {py_teststand-0.2.2 → py_teststand-0.3.0}/tests/unit/adapters/test_activex_adapter.py +0 -0
  380. {py_teststand-0.2.2 → py_teststand-0.3.0}/tests/unit/adapters/test_dotnet_adapter.py +0 -0
  381. {py_teststand-0.2.2 → py_teststand-0.3.0}/tests/unit/adapters/test_labview_adapter.py +0 -0
  382. {py_teststand-0.2.2 → py_teststand-0.3.0}/tests/unit/adapters/test_python_adapter.py +0 -0
  383. {py_teststand-0.2.2 → py_teststand-0.3.0}/tests/unit/analyzer/__init__.py +0 -0
  384. {py_teststand-0.2.2 → py_teststand-0.3.0}/tests/unit/analyzer/test_rule_authoring.py +0 -0
  385. {py_teststand-0.2.2 → py_teststand-0.3.0}/tests/unit/core/__init__.py +0 -0
  386. {py_teststand-0.2.2 → py_teststand-0.3.0}/tests/unit/core/test_engine.py +0 -0
  387. {py_teststand-0.2.2 → py_teststand-0.3.0}/tests/unit/core/test_enums.py +0 -0
  388. {py_teststand-0.2.2 → py_teststand-0.3.0}/tests/unit/core/test_errors.py +0 -0
  389. {py_teststand-0.2.2 → py_teststand-0.3.0}/tests/unit/core/test_expression.py +0 -0
  390. {py_teststand-0.2.2 → py_teststand-0.3.0}/tests/unit/core/test_property_object_file.py +0 -0
  391. {py_teststand-0.2.2 → py_teststand-0.3.0}/tests/unit/core/test_sequence.py +0 -0
  392. {py_teststand-0.2.2 → py_teststand-0.3.0}/tests/unit/core/test_sequence_file.py +0 -0
  393. {py_teststand-0.2.2 → py_teststand-0.3.0}/tests/unit/core/test_step.py +0 -0
  394. {py_teststand-0.2.2 → py_teststand-0.3.0}/tests/unit/execution/test_database_options.py +0 -0
  395. {py_teststand-0.2.2 → py_teststand-0.3.0}/tests/unit/execution/test_execution.py +0 -0
  396. {py_teststand-0.2.2 → py_teststand-0.3.0}/tests/unit/sequence/test_sequence.py +0 -0
  397. {py_teststand-0.2.2 → py_teststand-0.3.0}/tests/unit/sequence/test_sequence_file.py +0 -0
  398. {py_teststand-0.2.2 → py_teststand-0.3.0}/tests/unit/test_com_contract.py +0 -0
  399. {py_teststand-0.2.2 → py_teststand-0.3.0}/tests/unit/test_core_mechanics.py +0 -0
  400. {py_teststand-0.2.2 → py_teststand-0.3.0}/tests/unit/test_lifecycle.py +0 -0
  401. {py_teststand-0.2.2 → py_teststand-0.3.0}/tests/unit/ui/test_events.py +0 -0
  402. {py_teststand-0.2.2 → py_teststand-0.3.0}/tests/unit/ui/test_execution_view_manager.py +0 -0
  403. {py_teststand-0.2.2 → py_teststand-0.3.0}/tests/unit/ui/test_sequence_file_view_manager.py +0 -0
@@ -56,6 +56,11 @@ understanding the runtime environment:
56
56
  callbacks, code templates, adapter support files, and the Python helper scripts
57
57
  used by the Python adapter (`Bin\ni_teststand_python_*.py`).
58
58
 
59
+ - **Sequence File Converter** — TestStand provides a command-line utility at
60
+ `C:\Program Files\National Instruments\TestStand 2026\Bin\SequenceFileConverter.exe`
61
+ to convert sequence files between binary and XML formats (e.g. using `-Format:XML` or
62
+ `-Format:Binary` options) to facilitate inspection.
63
+
59
64
  - **Station config dir** — `C:\ProgramData\National Instruments\TestStand 2026 (64-bit)\Cfg\`
60
65
  Per-station configuration: `SearchDirectories.cfg`, `Adapters.cfg`,
61
66
  `GeneralEngine.cfg`, `StationGlobals.ini`, `Users.ini`, `TypePalettes.cfg`,
@@ -217,6 +222,7 @@ Prefer extending this facade over deep imports in user-facing code and examples.
217
222
  - No cryptic abbreviations in code or tests: `property_object` not `po`,
218
223
  `sequence_file` not `sf`, `sequence` not `seq`, `engine` not `eng`,
219
224
  `execution` not `exe`, `sequence_context` not `ctx`.
225
+ - Do not use "TestStand" prefixes in documentation, docstrings, or variables (e.g., say "live engine" instead of "live TestStand Engine", "ResultList array" instead of "TestStand ResultList array"). The user already knows this library wraps TestStand. Refer to the COM objects directly by their interface names.
220
226
  - Examples in `examples/` double as documentation and as inputs for other tools,
221
227
  so they must run end to end and import only from the top-level `py_teststand`.
222
228
 
@@ -6,3 +6,6 @@ This file directs Gemini (Antigravity) and any other AI coding assistant working
6
6
  You must **always** read and strictly follow the guidelines, architectural rules, and project-specific memory stored in `CLAUDE.md`.
7
7
 
8
8
  The `CLAUDE.md` file acts as the ultimate source of truth for repository conventions, TestStand COM interactions, typing rules (`ANN401`), and testing procedures. Treat the contents of `CLAUDE.md` as if they were written directly in this file.
9
+
10
+ **DOCUMENTATION RULE:**
11
+ Do not use "TestStand" prefixes in documentation, docstrings, or variables (e.g., say "live engine" instead of "live TestStand Engine", "ResultList array" instead of "TestStand ResultList array"). The user already knows this library wraps TestStand bindings. Refer to the COM objects directly by their interface names.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: py-teststand
3
- Version: 0.2.2
3
+ Version: 0.3.0
4
4
  Summary: Community object-oriented Python 3 bindings for the National Instruments TestStand™ COM API
5
5
  Project-URL: Repository, https://github.com/TheDomcio/py-teststand
6
6
  Project-URL: Issues, https://github.com/TheDomcio/py-teststand/issues
@@ -156,6 +156,7 @@ EXAMPLES: list[tuple[str, str]] = [
156
156
  ("users_manage", "Create users and set their privileges."),
157
157
  ("execution_run_test_headless", "Run real pass/fail tests and read their numeric results."),
158
158
  ("ui_messages_handle", "Receive UI messages from a running sequence without a GUI."),
159
+ ("result_list_parse", "Parse a sequence execution's ResultList array."),
159
160
  (
160
161
  "execution_run_subsequence",
161
162
  "Run a sequence and read its results. Last; it shuts the engine down.",
@@ -206,7 +207,7 @@ pip install py-teststand
206
207
  ## 🔗 Compatibility
207
208
 
208
209
  | Component | Versions |
209
- |--------------------------------------------------------|-----------------------------------------------------------------------------------------------|
210
+ | ------------------------------------------------------ | --------------------------------------------------------------------------------------------- |
210
211
  | **[Windows](https://www.microsoft.com/en-us/windows)** | 7 to 11 |
211
212
  | **[Python](https://www.python.org/downloads/)** | 3.8 to 3.14 |
212
213
  | **[TestStand™][ni-teststand-api-reference]** | [2016 to 2026](https://www.ni.com/docs/en-US/bundle/teststand/page/year-based-and-major.html) |
@@ -271,7 +272,7 @@ long-lived COM interfaces that exist across the supported range.
271
272
  ## 🧰 Technical Stack
272
273
 
273
274
  | Tool | Purpose |
274
- |--------------------------------------------------|-------------------------------------------------------------|
275
+ | ------------------------------------------------ | ----------------------------------------------------------- |
275
276
  | **[uv](https://github.com/astral-sh/uv)** | Python package and project manager |
276
277
  | **[ty](https://github.com/astral-sh/ty)** | Static type checker for interface validation |
277
278
  | **[ruff](https://github.com/astral-sh/ruff)** | Linter and code formatter (with strict rules) |
@@ -120,6 +120,7 @@ EXAMPLES: list[tuple[str, str]] = [
120
120
  ("users_manage", "Create users and set their privileges."),
121
121
  ("execution_run_test_headless", "Run real pass/fail tests and read their numeric results."),
122
122
  ("ui_messages_handle", "Receive UI messages from a running sequence without a GUI."),
123
+ ("result_list_parse", "Parse a sequence execution's ResultList array."),
123
124
  (
124
125
  "execution_run_subsequence",
125
126
  "Run a sequence and read its results. Last; it shuts the engine down.",
@@ -170,7 +171,7 @@ pip install py-teststand
170
171
  ## 🔗 Compatibility
171
172
 
172
173
  | Component | Versions |
173
- |--------------------------------------------------------|-----------------------------------------------------------------------------------------------|
174
+ | ------------------------------------------------------ | --------------------------------------------------------------------------------------------- |
174
175
  | **[Windows](https://www.microsoft.com/en-us/windows)** | 7 to 11 |
175
176
  | **[Python](https://www.python.org/downloads/)** | 3.8 to 3.14 |
176
177
  | **[TestStand™][ni-teststand-api-reference]** | [2016 to 2026](https://www.ni.com/docs/en-US/bundle/teststand/page/year-based-and-major.html) |
@@ -235,7 +236,7 @@ long-lived COM interfaces that exist across the supported range.
235
236
  ## 🧰 Technical Stack
236
237
 
237
238
  | Tool | Purpose |
238
- |--------------------------------------------------|-------------------------------------------------------------|
239
+ | ------------------------------------------------ | ----------------------------------------------------------- |
239
240
  | **[uv](https://github.com/astral-sh/uv)** | Python package and project manager |
240
241
  | **[ty](https://github.com/astral-sh/ty)** | Static type checker for interface validation |
241
242
  | **[ruff](https://github.com/astral-sh/ruff)** | Linter and code formatter (with strict rules) |
@@ -37,7 +37,7 @@ MAXIMUM_STEP_NAME_LENGTH = 15
37
37
  transitions=(AnalysisTransition.BeforeStep,),
38
38
  severity=RuleSeverity.Warning,
39
39
  )
40
- def check_step_name_length(context: Any) -> None:
40
+ def check_step_name_length(context: Any) -> None: # noqa: ANN401
41
41
  """Report any step whose name is longer than MAXIMUM_STEP_NAME_LENGTH."""
42
42
  step: Any = context.object
43
43
  name: Any = step.name
@@ -51,7 +51,7 @@ def check_step_name_length(context: Any) -> None:
51
51
 
52
52
 
53
53
  class _Violation:
54
- def __init__(self, rule_id: str, text: str, location: Any) -> None:
54
+ def __init__(self, rule_id: str, text: str, location: Any) -> None: # noqa: ANN401
55
55
  self.rule_id: str = rule_id
56
56
  self.text: str = text
57
57
  self.location: Any = location
@@ -65,12 +65,12 @@ class _OfflineStepContext:
65
65
  py_teststand.analyzer.AnalysisContext instead, whose `object` is the step.
66
66
  """
67
67
 
68
- def __init__(self, analyzed_object: Any) -> None:
68
+ def __init__(self, analyzed_object: Any) -> None: # noqa: ANN401
69
69
  self.object: Any = analyzed_object
70
70
  self.transition = AnalysisTransition.BeforeStep
71
71
  self.findings: list[_Violation] = []
72
72
 
73
- def report(self, rule_id: str, text: str, location_object: Any = None) -> None:
73
+ def report(self, rule_id: str, text: str, location_object: Any = None) -> None: # noqa: ANN401
74
74
  self.findings.append(_Violation(rule_id, text, location_object))
75
75
 
76
76
 
@@ -12,7 +12,7 @@ engine without external dependencies.
12
12
 
13
13
  from __future__ import annotations
14
14
 
15
- from py_teststand import AdapterKeyName, Engine, StepGroup
15
+ from py_teststand import AdapterKeyName, Engine, StepGroup, ResultList
16
16
 
17
17
 
18
18
  def main() -> None:
@@ -42,14 +42,9 @@ def main() -> None:
42
42
  if result_list_obj is None:
43
43
  return
44
44
 
45
- with result_list_obj as result_list:
46
- for step_result in result_list:
47
- if step_result is None:
48
- continue
49
- with step_result as sr:
50
- name = sr.get_val_string("TS.StepName", 0)
51
- status = sr.get_val_string("Status", 0)
52
- print(f"{name}: {status}")
45
+ parsed_results = ResultList(result_list_obj._com_obj).parse()
46
+ for result in parsed_results:
47
+ print(f"{result['name']}: {result['status']}")
53
48
 
54
49
 
55
50
  if __name__ == "__main__":
@@ -21,7 +21,7 @@ records Passed or Failed, which we read from each entry in the ResultList.
21
21
 
22
22
  from __future__ import annotations
23
23
 
24
- from py_teststand import AdapterKeyName, Engine, Sequence, StepGroup
24
+ from py_teststand import AdapterKeyName, Engine, Sequence, StepGroup, ResultList
25
25
 
26
26
  # (name, measurement expression, low limit, high limit)
27
27
  TESTS: list[tuple[str, str, float, float]] = [
@@ -60,15 +60,15 @@ def main() -> None:
60
60
  print("No results recorded.")
61
61
  return
62
62
 
63
+ parsed_results = ResultList(result_list._com_obj).parse()
64
+
63
65
  all_passed = True
64
- with result_list as results:
65
- for step_result in results:
66
- with step_result as result:
67
- name = result.get_val_string("TS.StepName", 0)
68
- status = result.get_val_string("Status", 0)
69
- numeric = result.get_val_number("Numeric", 0)
70
- print(f" {name}: {status} (measured {numeric})")
71
- all_passed = all_passed and status == "Passed"
66
+ for result in parsed_results:
67
+ name = result["name"]
68
+ status = result["status"]
69
+ numeric = result["value"]
70
+ print(f" {name}: {status} (measured {numeric})")
71
+ all_passed = all_passed and status == "Passed"
72
72
 
73
73
  print(f"\nOverall: {'PASSED' if all_passed else 'FAILED'}")
74
74
 
@@ -21,6 +21,7 @@ EXAMPLES: list[tuple[str, str]] = [
21
21
  ("users_manage", "Create users and set their privileges."),
22
22
  ("execution_run_test_headless", "Run real pass/fail tests and read their numeric results."),
23
23
  ("ui_messages_handle", "Receive UI messages from a running sequence without a GUI."),
24
+ ("result_list_parse", "Parse a sequence execution's ResultList array."),
24
25
  (
25
26
  "execution_run_subsequence",
26
27
  "Run a sequence and read its results. Last; it shuts the engine down.",
@@ -26,7 +26,7 @@ INSERT_IF_MISSING = int(PropertyOption.InsertIfMissing)
26
26
  ROOT_TEMP_DIR = Path(tempfile.gettempdir()) / "py-teststand"
27
27
 
28
28
 
29
- def property_object_to_dict(container: Any) -> dict[str, Any]:
29
+ def property_object_to_dict(container: Any) -> dict[str, Any]: # noqa: ANN401
30
30
  """Walk a container PropertyObject's sub-properties into a plain dict."""
31
31
  result: dict[str, Any] = {}
32
32
  for index in range(container.get_num_sub_properties("")):
@@ -35,7 +35,7 @@ def property_object_to_dict(container: Any) -> dict[str, Any]:
35
35
  return result
36
36
 
37
37
 
38
- def _to_python(obj: Any) -> Any:
38
+ def _to_python(obj: Any) -> Any: # noqa: ANN401
39
39
  """Convert one sub-property object to a list (array), dict (container), or scalar."""
40
40
  value_type, _is_object, is_array, _type_name = obj.get_type("")
41
41
  if is_array:
@@ -52,7 +52,7 @@ def _to_python(obj: Any) -> Any:
52
52
  return obj.get_val_string("", 0)
53
53
 
54
54
 
55
- def dict_to_property_object(engine: Engine, data: dict[str, Any], container: Any = None) -> Any:
55
+ def dict_to_property_object(engine: Engine, data: dict[str, Any], container: Any = None) -> Any: # noqa: ANN401
56
56
  """Rebuild a container PropertyObject from a dict produced by the walk above."""
57
57
  if container is None:
58
58
  container = engine.new_property_object(PropValType.Container, False, "", 0)
@@ -61,7 +61,7 @@ def dict_to_property_object(engine: Engine, data: dict[str, Any], container: Any
61
61
  return container
62
62
 
63
63
 
64
- def _set_member(engine: Engine, container: Any, name: str, value: Any) -> None:
64
+ def _set_member(engine: Engine, container: Any, name: str, value: Any) -> None: # noqa: ANN401
65
65
  """Create one sub-property (container, array, or scalar) from a Python value."""
66
66
  if isinstance(value, dict):
67
67
  container.new_sub_property(name, PropValType.Container, False, "", INSERT_IF_MISSING)
@@ -101,14 +101,14 @@ def _element_type(items: list[Any]) -> PropValType:
101
101
  return PropValType.String
102
102
 
103
103
 
104
- def _child(container: Any, name: str) -> Any:
104
+ def _child(container: Any, name: str) -> Any: # noqa: ANN401
105
105
  """Fetch a sub-property object, asserting it exists (keeps type-checkers happy)."""
106
106
  obj = container.get_property_object(name, 0)
107
107
  assert obj is not None
108
108
  return obj
109
109
 
110
110
 
111
- def _build_example_container(engine: Engine) -> Any:
111
+ def _build_example_container(engine: Engine) -> Any: # noqa: ANN401
112
112
  """Scalars, a scalar array, a nested DigitalMultimeter container, and an array of them."""
113
113
  data = engine.new_property_object(PropValType.Container, False, "", 0)
114
114
  data.set_val_number("TestResult", INSERT_IF_MISSING, 0.0)
@@ -138,7 +138,7 @@ def _build_example_container(engine: Engine) -> Any:
138
138
  return data
139
139
 
140
140
 
141
- def _child_by_offset(array: Any, offset: int) -> Any:
141
+ def _child_by_offset(array: Any, offset: int) -> Any: # noqa: ANN401
142
142
  """Fetch an array element object, asserting it exists (keeps type-checkers happy)."""
143
143
  element = array.get_property_object_by_offset(offset, 0)
144
144
  assert element is not None
@@ -0,0 +1,75 @@
1
+ """Walk and parse execution results into Python dictionaries.
2
+
3
+ Builds a sequence with test steps, runs it, then shows two ways to
4
+ retrieve the parsed ResultList:
5
+
6
+ 1. Object-oriented approach via execution.result_list.
7
+ 2. Passing a raw COM/PropertyObject ResultList directly to ResultList().
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import json
13
+
14
+ from py_teststand import (
15
+ AdapterKeyName,
16
+ Engine,
17
+ ResultList,
18
+ StepGroup,
19
+ )
20
+
21
+
22
+ def main() -> None:
23
+ with Engine() as engine:
24
+ sequence_file = engine.new_sequence_file()
25
+ main_sequence = sequence_file.get_sequence_by_name("MainSequence")
26
+
27
+ # Pass/Fail Test — forces pass
28
+ step1 = engine.new_step(AdapterKeyName.NoneAdapterKeyName, "PassFailTest")
29
+ step1.name = "Verify Power Rail"
30
+ step1.record_result = True
31
+ step1.as_property_object()["DataSource"] = "True"
32
+ main_sequence.insert_step(step1, 0, StepGroup.Main)
33
+
34
+ # Numeric Limit Test - forces 1.5 against 1.0-2.0 limits
35
+ step2 = engine.new_step(AdapterKeyName.NoneAdapterKeyName, "NumericLimitTest")
36
+ step2.name = "Verify Current Draw"
37
+ step2.record_result = True
38
+ step_properties = step2.as_property_object()
39
+ step_properties["DataSource"] = "1.5"
40
+ step_properties["Limits.Low"] = 1.0
41
+ step_properties["Limits.High"] = 2.0
42
+ main_sequence.insert_step(step2, 1, StepGroup.Main)
43
+
44
+ # Execute the sequence
45
+ print("Running sequence...")
46
+ with engine.new_execution(sequence_file, "MainSequence") as execution:
47
+ execution.wait_for_end_ex(-1)
48
+
49
+ # Approach 1: Object-oriented approach (directly on Execution object)
50
+ # The execution.result_list property automatically extracts and parses
51
+ # the ResultList array internally.
52
+ parsed_results = execution.result_list.parse()
53
+
54
+ print("\nApproach 1 - execution.result_list:")
55
+ for index, result in enumerate(parsed_results):
56
+ print(
57
+ f" [{index}] {result['name']} "
58
+ f"({result['type']}) -> {result['status']}, "
59
+ f"Value: {result['value']}"
60
+ )
61
+
62
+ # Approach 2: Universal helper class
63
+ # You can also pass an Execution or SequenceContext
64
+ # directly to ResultList().
65
+ result_list = ResultList(execution).parse()
66
+
67
+ print("\nApproach 2 - ResultList(execution).parse():")
68
+ for index, result in enumerate(result_list):
69
+ print(f" [{index}] {result['name']} ({result['type']}) -> {result['status']}")
70
+ print("\nSerialized JSON Report:")
71
+ print(json.dumps(parsed_results, indent=4))
72
+
73
+
74
+ if __name__ == "__main__":
75
+ main()
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "py-teststand"
3
- version = "0.2.2"
3
+ version = "0.3.0"
4
4
  description = "Community object-oriented Python 3 bindings for the National Instruments TestStand™ COM API"
5
5
  readme = "README.md"
6
6
  # Last supported by uv 0.11.15 (3cffe97c2 2026-05-18 x86_64-pc-windows-msvc)
@@ -19,7 +19,7 @@ keywords = [
19
19
  "windows",
20
20
  "sugaring",
21
21
  "scripting",
22
- "python"
22
+ "python",
23
23
  ]
24
24
  authors = [{ name = "Dominik Rajchel" }]
25
25
  license = { text = "MIT" }
@@ -68,8 +68,27 @@ target-version = "py38"
68
68
 
69
69
  [tool.ruff.lint]
70
70
  # Added "ANN" to enforce type annotations
71
- select = ["E", "F", "I", "N", "W", "B", "C4", "UP", "ARG", "PTH", "RUF", "FA", "PGH", "FLY", "ANN"]
72
- per-file-ignores = { "tests/**" = ["N801", "ANN"] } # Ignore typing enforcements in test files
71
+ select = [
72
+ "E",
73
+ "F",
74
+ "I",
75
+ "N",
76
+ "W",
77
+ "B",
78
+ "C4",
79
+ "UP",
80
+ "ARG",
81
+ "PTH",
82
+ "RUF",
83
+ "FA",
84
+ "PGH",
85
+ "FLY",
86
+ "ANN",
87
+ ]
88
+ per-file-ignores = { "tests/**" = [
89
+ "N801",
90
+ "ANN",
91
+ ] } # Ignore typing enforcements in test files
73
92
  unfixable = []
74
93
  fixable = ["ALL"]
75
94
 
@@ -81,7 +100,13 @@ suppress-dummy-args = true
81
100
  [tool.ruff.lint.isort]
82
101
  combine-as-imports = true
83
102
  known-first-party = ["py_teststand"]
84
- section-order = ["future", "standard-library", "third-party", "first-party", "local-folder"]
103
+ section-order = [
104
+ "future",
105
+ "standard-library",
106
+ "third-party",
107
+ "first-party",
108
+ "local-folder",
109
+ ]
85
110
 
86
111
  [tool.ruff.format]
87
112
  quote-style = "double"
@@ -132,6 +157,9 @@ url = "https://test.pypi.org/simple/"
132
157
  publish-url = "https://test.pypi.org/legacy/"
133
158
  explicit = true
134
159
 
160
+ [tool.pyrefly]
161
+ project-includes = ["**/*.py*", "**/*.ipynb"]
162
+
135
163
  [[tool.uv.index]]
136
164
  name = "pypi"
137
165
  url = "https://pypi.org/simple"
@@ -55,7 +55,9 @@ from .core.com_wrapper import COMWrapper, ts_interface # noqa: F401
55
55
  from .core.engine import (
56
56
  AdapterKeyName,
57
57
  AllowAutomaticTypeConflictResolution,
58
+ ConflictHandler,
58
59
  ConflictResolution,
60
+ DefaultModelCallback,
59
61
  EditKind,
60
62
  Engine,
61
63
  FindFilePromptOption,
@@ -114,6 +116,9 @@ from .execution.edit_args import EditArgs
114
116
  from .execution.execution import Execution, ExecutionTypeMask
115
117
  from .execution.interactive_args import InteractiveArgs, InteractiveContext
116
118
  from .execution.report import Report, ReportConversion, Reports, ReportSection, ReportSections
119
+ from .execution.result_list import (
120
+ ResultList,
121
+ )
117
122
  from .execution.result_log import ResultLog, ResultLogger, ResultLogRecordType
118
123
  from .execution.sync_manager import (
119
124
  AutoReleaser,
@@ -153,7 +158,7 @@ from .property.property_object_file import (
153
158
  from .sequence.code_template import CodeTemplate, CodeTemplates
154
159
  from .sequence.expression import EvaluationType, Expression
155
160
  from .sequence.location import AutoCreateVariableLocation, Location, Locations
156
- from .sequence.sequence import Sequence
161
+ from .sequence.sequence import Sequence, SequenceFileType, SequenceType
157
162
  from .sequence.sequence_context import SequenceContext
158
163
  from .sequence.sequence_file import SequenceFile
159
164
  from .sequence.step import RunMode, Step
@@ -209,12 +214,14 @@ __all__ = [
209
214
  "CheckedState",
210
215
  "CodeTemplate",
211
216
  "CodeTemplates",
217
+ "ConflictHandler",
212
218
  "ConflictResolution",
213
219
  "DLLAdapter",
214
220
  "DLLModule",
215
221
  "DataType",
216
222
  "DatabaseLogOptions",
217
223
  "DebugOption",
224
+ "DefaultModelCallback",
218
225
  "DeploymentError",
219
226
  "DotNetAdapter",
220
227
  "DotNetModule",
@@ -282,6 +289,7 @@ __all__ = [
282
289
  "ReportSection",
283
290
  "ReportSections",
284
291
  "Reports",
292
+ "ResultList",
285
293
  "ResultLog",
286
294
  "ResultLogRecordType",
287
295
  "ResultLogger",
@@ -314,8 +322,10 @@ __all__ = [
314
322
  "SequenceContext",
315
323
  "SequenceFile",
316
324
  "SequenceFileLoadError",
325
+ "SequenceFileType",
317
326
  "SequenceFileViewManager",
318
327
  "SequenceTerminatedError",
328
+ "SequenceType",
319
329
  "SequenceValidationError",
320
330
  "SourceControlCommand",
321
331
  "SourceControlCommandOption",
@@ -97,6 +97,10 @@ class Adapter(PropertyObject):
97
97
  def name(self) -> str:
98
98
  return self.key_name
99
99
 
100
+ @name.setter
101
+ def name(self, value: str) -> None: # noqa: ARG002
102
+ raise AttributeError("name is read-only on Adapter")
103
+
100
104
  @property
101
105
  @ts_interface
102
106
  def key_name(self) -> str:
@@ -525,16 +529,6 @@ class Module(PropertyObject):
525
529
 
526
530
  return SequenceCallModule(self._com_obj, self._engine_ref)
527
531
 
528
- @property
529
- @ts_interface
530
- def comment(self) -> str:
531
- return str(self._com_obj.Comment)
532
-
533
- @property
534
- @ts_interface
535
- def name(self) -> str:
536
- return str(self._com_obj.Name)
537
-
538
532
  @property
539
533
  @ts_interface
540
534
  def description(self) -> str:
@@ -908,8 +908,9 @@ class DotNetParameter(PropertyObject):
908
908
  return DotNetParameters(self._com_obj.Elements, self._engine_ref)
909
909
 
910
910
  @ts_interface
911
- def display_create_custom_data_type_dialog(self, sequence_context: bool) -> typing.Any: # noqa: ANN401
912
- return bool(self._com_obj.DisplayCreateCustomDataTypeDialog(sequence_context._com_obj))
911
+ def display_create_custom_data_type_dialog(self, sequence_context: typing.Any) -> typing.Any: # noqa: ANN401
912
+ raw_ctx = getattr(sequence_context, "_com_obj", sequence_context)
913
+ return bool(self._com_obj.DisplayCreateCustomDataTypeDialog(raw_ctx))
913
914
 
914
915
  @property
915
916
  @ts_interface
@@ -960,6 +961,11 @@ class DotNetParameter(PropertyObject):
960
961
  def name(self) -> str:
961
962
  return str(self._com_obj.Name)
962
963
 
964
+ @name.setter
965
+ @ts_interface
966
+ def name(self, value: str) -> None: # noqa: ARG002
967
+ raise AttributeError("name is read-only on DotNetParameter")
968
+
963
969
  @property
964
970
  @ts_interface
965
971
  def parameter_name(self) -> str:
@@ -1050,6 +1050,11 @@ class LabVIEWParameter(PropertyObject):
1050
1050
  def array_element_prototype(self) -> typing.Any: # noqa: ANN401
1051
1051
  return self._com_obj.ArrayElementPrototype
1052
1052
 
1053
+ @array_element_prototype.setter
1054
+ @ts_interface
1055
+ def array_element_prototype(self, value: typing.Any) -> None: # noqa: ANN401, ARG002
1056
+ raise AttributeError("array_element_prototype is read-only")
1057
+
1053
1058
  @ts_interface
1054
1059
  def as_property_object(self) -> PropertyObject:
1055
1060
  return PropertyObject(self._com_obj.AsPropertyObject(), self._engine_ref)
@@ -1258,6 +1263,11 @@ class LabVIEWParameterElement(PropertyObject):
1258
1263
  def array_element_prototype(self) -> typing.Any: # noqa: ANN401
1259
1264
  return self._com_obj.ArrayElementPrototype
1260
1265
 
1266
+ @array_element_prototype.setter
1267
+ @ts_interface
1268
+ def array_element_prototype(self, value: typing.Any) -> None: # noqa: ANN401, ARG002
1269
+ raise AttributeError("array_element_prototype is read-only")
1270
+
1261
1271
  @ts_interface
1262
1272
  def as_property_object(self) -> PropertyObject:
1263
1273
  return PropertyObject(self._com_obj.AsPropertyObject(), self._engine_ref)
@@ -348,7 +348,7 @@ class LabVIEWNXGModule(Module):
348
348
  self._com_obj.GLLPath = str(value)
349
349
 
350
350
  @ts_interface
351
- def have_properties_changed(self, options: int = 0) -> bool:
351
+ def have_properties_changed(self, options: int = 0) -> tuple[bool, list[typing.Any]]:
352
352
  result = self._com_obj.HavePropertiesChanged(None, int(options))
353
353
  if isinstance(result, tuple) and len(result) >= 2:
354
354
  return bool(result[0]), list(result[1])
@@ -458,6 +458,11 @@ class LabVIEWNXGProject(PropertyObject):
458
458
  def name(self) -> str:
459
459
  return str(self._com_obj.Name)
460
460
 
461
+ @name.setter
462
+ @ts_interface
463
+ def name(self, value: str) -> None: # noqa: ARG002
464
+ raise AttributeError("name is read-only on LabVIEWNXGProject")
465
+
461
466
 
462
467
  class LabVIEWNXGProjectItems(PropertyObject):
463
468
  @property
@@ -640,6 +645,11 @@ class LabVIEWNXGParameter(PropertyObject):
640
645
  def array_element_prototype(self) -> LabVIEWNXGParameter:
641
646
  return LabVIEWNXGParameter(self._com_obj.ArrayElementPrototype, self._engine_ref)
642
647
 
648
+ @array_element_prototype.setter
649
+ @ts_interface
650
+ def array_element_prototype(self, value: typing.Any) -> None: # noqa: ANN401, ARG002
651
+ raise AttributeError("array_element_prototype is read-only")
652
+
643
653
  @ts_interface
644
654
  def as_property_object(self) -> PropertyObject:
645
655
  return PropertyObject(self._com_obj.AsPropertyObject(), self._engine_ref)
@@ -305,6 +305,11 @@ class SequenceCallParameter(PropertyObject):
305
305
  def name(self) -> str:
306
306
  return str(self._com_obj.Name)
307
307
 
308
+ @name.setter
309
+ @ts_interface
310
+ def name(self, value: str) -> None: # noqa: ARG002
311
+ raise AttributeError("name is read-only on SequenceCallParameter")
312
+
308
313
  @property
309
314
  @ts_interface
310
315
  def type(self) -> int:
@@ -1,5 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import typing
4
+
3
5
  from py_teststand.analyzer.rule import RuleSeverity
4
6
  from py_teststand.analyzer.rule_setting_values import RuleSettingValues
5
7
  from py_teststand.core.com_wrapper import ts_interface
@@ -56,8 +58,10 @@ class RuleConfiguration(PropertyObject):
56
58
  class RuleConfigurationContext(PropertyObject):
57
59
  @property
58
60
  @ts_interface
59
- def engine(self) -> PropertyObject:
60
- return PropertyObject(self._com_obj.Engine, self._engine_ref)
61
+ def engine(self) -> typing.Any: # noqa: ANN401
62
+ from py_teststand.core.engine.engine import Engine
63
+
64
+ return Engine(self._com_obj.Engine)
61
65
 
62
66
  @property
63
67
  @ts_interface
@@ -122,6 +122,7 @@ def ts_interface(func: T) -> T:
122
122
 
123
123
  class COMWrapper:
124
124
  _com_obj: COM
125
+ _engine_ref: typing.Callable[[], Engine | typing.Any | None]
125
126
 
126
127
  def __init__(self, com_obj: COM, engine: Engine | typing.Any | None = None) -> None: # noqa: ANN401
127
128
 
@@ -789,6 +789,8 @@ class Engine(COMWrapper):
789
789
  int(dlg_options),
790
790
  selected_item_com,
791
791
  )
792
+ from py_teststand.execution.breakpoint import SelectedBreakpointItem
793
+
792
794
  item = SelectedBreakpointItem(selected_item_com, self) if selected_item_com else None
793
795
  return bool(result), item
794
796
 
@@ -1700,7 +1702,7 @@ class Engine(COMWrapper):
1700
1702
  return OutputMessages(self._engine.GetOutputMessages(), self)
1701
1703
 
1702
1704
  @ts_interface
1703
- def get_product_registration_info(self) -> bool:
1705
+ def get_product_registration_info(self) -> tuple[bool, str, str, str]:
1704
1706
  user_out = ""
1705
1707
  company_out = ""
1706
1708
  serial_out = ""
@@ -1845,7 +1847,7 @@ class Engine(COMWrapper):
1845
1847
  )
1846
1848
 
1847
1849
  @ts_interface
1848
- def get_tool_menu_item_info_with_id(self, unique_item_id: int) -> str:
1850
+ def get_tool_menu_item_info_with_id(self, unique_item_id: int) -> tuple[str, int, bool]:
1849
1851
  item_text_out = ""
1850
1852
  sub_menu_index_out = 0
1851
1853
  enabled_out = False