py-teststand 0.2.3__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.3 → py_teststand-0.3.0}/CLAUDE.md +6 -0
  2. {py_teststand-0.2.3 → py_teststand-0.3.0}/GEMINI.md +3 -0
  3. {py_teststand-0.2.3 → py_teststand-0.3.0}/PKG-INFO +4 -3
  4. {py_teststand-0.2.3 → py_teststand-0.3.0}/README.md +3 -2
  5. {py_teststand-0.2.3 → py_teststand-0.3.0}/examples/execution_run_subsequence.py +4 -9
  6. {py_teststand-0.2.3 → py_teststand-0.3.0}/examples/execution_run_test_headless.py +9 -9
  7. {py_teststand-0.2.3 → py_teststand-0.3.0}/examples/launch_all_examples.py +1 -0
  8. py_teststand-0.3.0/examples/result_list_parse.py +75 -0
  9. {py_teststand-0.2.3 → py_teststand-0.3.0}/pyproject.toml +31 -9
  10. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/__init__.py +4 -0
  11. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/execution/execution.py +8 -0
  12. py_teststand-0.3.0/src/py_teststand/execution/result_list.py +218 -0
  13. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/sequence/sequence_context.py +8 -0
  14. {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/integration/test_examples.py +20 -0
  15. py_teststand-0.3.0/tests/integration/test_result_list_live.py +76 -0
  16. py_teststand-0.3.0/tests/unit/execution/test_result_list.py +151 -0
  17. {py_teststand-0.2.3 → py_teststand-0.3.0}/uv.lock +137 -152
  18. {py_teststand-0.2.3 → py_teststand-0.3.0}/.gitignore +0 -0
  19. {py_teststand-0.2.3 → py_teststand-0.3.0}/.markdownlint-cli2.jsonc +0 -0
  20. {py_teststand-0.2.3 → py_teststand-0.3.0}/.python-version +0 -0
  21. {py_teststand-0.2.3 → py_teststand-0.3.0}/LICENSE +0 -0
  22. {py_teststand-0.2.3 → py_teststand-0.3.0}/examples/analyzer_step_name_length.py +0 -0
  23. {py_teststand-0.2.3 → py_teststand-0.3.0}/examples/data_type_manage.py +0 -0
  24. {py_teststand-0.2.3 → py_teststand-0.3.0}/examples/property_object_serialize.py +0 -0
  25. {py_teststand-0.2.3 → py_teststand-0.3.0}/examples/search_directory_manage.py +0 -0
  26. {py_teststand-0.2.3 → py_teststand-0.3.0}/examples/sequence_build.py +0 -0
  27. {py_teststand-0.2.3 → py_teststand-0.3.0}/examples/station_options_update.py +0 -0
  28. {py_teststand-0.2.3 → py_teststand-0.3.0}/examples/step_insert.py +0 -0
  29. {py_teststand-0.2.3 → py_teststand-0.3.0}/examples/step_insert_from_template.py +0 -0
  30. {py_teststand-0.2.3 → py_teststand-0.3.0}/examples/ui_messages_handle.py +0 -0
  31. {py_teststand-0.2.3 → py_teststand-0.3.0}/examples/users_manage.py +0 -0
  32. {py_teststand-0.2.3 → py_teststand-0.3.0}/examples/variables_manage.py +0 -0
  33. {py_teststand-0.2.3 → py_teststand-0.3.0}/examples/workspace_create.py +0 -0
  34. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/.graphify_labels.json +0 -0
  35. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/.graphify_python +0 -0
  36. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/.graphify_root +0 -0
  37. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/.graphify_uncached.txt +0 -0
  38. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/GRAPH_REPORT.md +0 -0
  39. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/00300beaf41ddf8ca88a2133f315f9873877e388dfadf2343bc93ad9ec7189af.json +0 -0
  40. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/0041043937ad3008273915d37b7f4b2d48ca2c4612d45ae3f8cd0cb931b90f9f.json +0 -0
  41. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/021c67591ed36baaccec5597b1aaa5da45a3d107860151d0c14da8d8e82d13fe.json +0 -0
  42. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/023707fc22c5dae0fe050b058cef36e8166178bd19bf64c19d1d5769193e0b66.json +0 -0
  43. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/040ee1db9c6b7f496603e954cded103cc0a695fdff0107104d1971e6bd77fa80.json +0 -0
  44. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/05037a9ec557a4372515feea0cb82e6b8112ac7c5e298565964fbd270f96bb55.json +0 -0
  45. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/0524858e50a4d2f7d2ac92c57ca3c87df637bf4c3158c7092a413e4393c857a4.json +0 -0
  46. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/05547b7aeeb2f4a7f5f21a8e7104b9116d781c941b744c43b0ea6c82e21b5fdd.json +0 -0
  47. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/0561a3660d3619ac6a5591c0657208ef1151afc18df8f2fd6f97de8670d8eb60.json +0 -0
  48. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/057056cc111fdb36b69e58f64079572f5c47872e0727d1ad3dfc0f35e7d39a4f.json +0 -0
  49. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/057e562996ba53b27fd80676787dca1563c48de754f9cd7932562ae64c3b5489.json +0 -0
  50. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/064e97d62db5d77399540dec673d05b900a3e29224bb4e45bc3e879729f20003.json +0 -0
  51. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/06511afc1a360b72ddc9b4497a994dca686aef3b97922cc8b80443403a4ddb83.json +0 -0
  52. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/06c31bd2b14400097f1e5123a6f39525ba4c4e5e2a5e7ff4c38a43b224d20a0d.json +0 -0
  53. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/070c095dddd2f798973cbb1332d344bf81370ea5a6eda28e88b1f7a27ef6c709.json +0 -0
  54. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/09332e170176084c6344fec2f82b8e890d06f8e32680643e316246716bee53e3.json +0 -0
  55. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/094e59f0e4cdb42feca81333bf3bf014eca76ad887ef1490483f798c17d40cd5.json +0 -0
  56. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/0aec586f84490fed93173f8a2200485ceffc529450740dcf5edbe12a7d89f781.json +0 -0
  57. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/0af23434a97b56cbda3aaf2de520ee9e18a629be0ef406a90dac45260481c1bf.json +0 -0
  58. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/0bd90bc4c1dd73076d8627f6ea7be67faaf504d30221b1dce45cb1c443755fb5.json +0 -0
  59. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/0e7f3eedcff4a433a47611e1adf13860af5e6d16fbb6129fc48ddd8557aa1626.json +0 -0
  60. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/100f3021f37614916d64cfaf40b04fda8d1989d624d03d93a97ec6ca79bf17e0.json +0 -0
  61. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/1051e1923497524696fb7fa1b71ba3a9d3cf12ec8519b1e8209d9d5eac717990.json +0 -0
  62. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/1086f0d1446ee0d57fc4c325f3828ff783e328ced88aac13b45f718161499e53.json +0 -0
  63. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/10fe404eb03263a768b27a2e92b2fe20e33cda3eab265a84860286430be0a49b.json +0 -0
  64. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/13bdd9d4f7de5ab5fbb955890067eb3772a2302e014480243ae141a4eee8b4f7.json +0 -0
  65. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/167515af1cd986fa06cab9d7efa9f1feb18bc95e3c6de1dba854adafc7ae8ead.json +0 -0
  66. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/16fba3996eb41939497dbd0f426c599e4ebc1eb5a762d7e1ff143708e49e94dc.json +0 -0
  67. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/17de4e480542b25d6f2a11461ae4f41a6282c3ecbeb3619b0b42fdbb7f31939c.json +0 -0
  68. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/17fbd1888f87c0b6c099e7e88300cf58e26adda72cf2f2297fc1f0e6bd2e9257.json +0 -0
  69. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/1d601091a3312ce89ddc9523bffccf41742eb6ea1223a6b4f751c210ffce1fb4.json +0 -0
  70. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/1e4049e0856983245c1154127a97509e576a1fd14f3ea56d52f946878a535bae.json +0 -0
  71. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/1e4d42449081955231608e3fa48b5c3102243d55a80e9064b88440669ed821b2.json +0 -0
  72. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/1f727c948a41c946dd0aa376993d5620f226497d49404c03b3c175d057b4ab29.json +0 -0
  73. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/1f7c2be5abf85169f9c409d39e58419418193281eeb391dc3ec0d1f6784f40dc.json +0 -0
  74. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/1f9db61abe1368fa82aab9d8e1b27d97389172db6c78cc23abe03025876ebdd1.json +0 -0
  75. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/207fdd9cd514b05162cd7babd5d2252985853a11cdf847113056a5071e8377e3.json +0 -0
  76. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/2165f2f41684c71dbce5e6edf7262786c5aa8518828e00e2a4dce75492f53aa3.json +0 -0
  77. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/22832c79316ab6a0c79a6bca80d9635ba80df2e2079ac114c354d43aec19f95c.json +0 -0
  78. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/22e04e79d7912eb1b7e3bca68279f3fa7e2936b3d2706fcdf688fff96f7c30c8.json +0 -0
  79. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/252d1adbbb189a3636432d8de48b5ed7c8d1f185c5ea46ceb616071960b1be42.json +0 -0
  80. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/25ab62b76a5f58693d5161dabf0a58862a7d6d5e9b054cc2347ffb79d4468f65.json +0 -0
  81. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/29731b11c9bdce6c0524fbcf801177b2da8d3181efa44ab73832e8dc0ed442bd.json +0 -0
  82. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/29ae039e1d154e5d25fc8659bf1eb270830e4fec772f91f41bf1cb9744733674.json +0 -0
  83. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/2b7f894857506a93df04568d3bc252c6883ac4010ba64b49a8c13c9cd06330ca.json +0 -0
  84. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/2bbb54bb8f3b91b33e7e872ea5e2b129079a60fe8284b8dd8bf5488b2f76b55d.json +0 -0
  85. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/2d70a40698b885cb7705c0d57922dfc922ef6b90e9a4580935d170395bc51a6e.json +0 -0
  86. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/2ddf8f9e5aa81db1e984bd5812d91143f64ab806a7b5676d6e7f23d1d08f677f.json +0 -0
  87. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/318ebfed808e94269a07fb5136c60f910bf810ffa3bef5aa7c26c313519147df.json +0 -0
  88. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/3289a80010b6c0faed89308018fa31f7031f27ae0d853299443c23ba8a4d6e6b.json +0 -0
  89. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/3312f8a2eccbfd08fabdba5d2af656bfbcb95e5b7e5390abf35ad5140759a710.json +0 -0
  90. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/35d6fee40fd65a1c224aa8320fbd8ef959f6975b16cc89fc2cfbb3c1b4e95641.json +0 -0
  91. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/3654ae6c52c3267b7a62b7697d69011bd6446dd3f6da9bc5b133da4c2efe7d6b.json +0 -0
  92. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/37cb92f2f6a01d4862632405ced4934cc003818147fd14ea9a636bc7336d3af1.json +0 -0
  93. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/3a06bdbfe7f9ae5d627e941fdd9e616d0431a4f41b37c8f8d7b3f5751fcadb21.json +0 -0
  94. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/3ac8bb6902eda596ffe0f32f517fb6e567a34e52e76c4ccc682d7c7dcf65f06a.json +0 -0
  95. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/3ace387692703afd7ecab2396d8eb8b3dc6411c0931ebf68ff5370013c707fa9.json +0 -0
  96. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/3b65d0f842b856818ed2510234a106990e02450d60aed9075cc4c9f4b14101bc.json +0 -0
  97. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/3b90f45c585a53b5f55ef2c3761eef4b97fcef1eb344f9a4819c989b174b52e5.json +0 -0
  98. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/3cf920bfdd765673b964deab1cf13959604b7648091d4c58209f818cc3fede98.json +0 -0
  99. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/3d97defd459d93180b984ca62794c47f1da9a8dc105175bfc1d8948fc8dc3f29.json +0 -0
  100. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/4096008e37ad33f487fa031012fdc7f354edbb3e2c3d82eeeae616e8e1ae75fa.json +0 -0
  101. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/4278f99739c7c54475247d2cfb57eda95ad3cc39d7bbaf04729c04932d9fef12.json +0 -0
  102. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/44963597cd3ea0c48e79c9aeb4e7838f1faa5bcde319b7ff81b29aa6549d551f.json +0 -0
  103. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/455df594e48e61d53c059f4ddad24e31e427232f4fe871e8ff384227350cc9ce.json +0 -0
  104. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/49e757465d8e83eb1ea11482682a0dc9bf8dd399847c883954925749ad6470c2.json +0 -0
  105. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/4c3d7045d901449868d2003d5529dd6f41d635c9e1ef1b1b8a0bee5e15aafc70.json +0 -0
  106. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/4e9f3dd260b769260bab0fd12ca46ae6b3b17221c6968fed8b7907173b05fc2d.json +0 -0
  107. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/50c625a30e42a14c35d57d119aba7e16a17fa05fc60cb5ff961c61a77f6129d0.json +0 -0
  108. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/50d6499184d0d9889c9571e8f6b7b7def3329721be05cc10bbac13520f8eef37.json +0 -0
  109. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/519a945f4a84c930588f887f3b23f13102ea6138645d177cef5f98b7b91e6229.json +0 -0
  110. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/523e956286ac13d37bfffa655ef1e83b1ecd17889caeae0ede6e99cb03c29e83.json +0 -0
  111. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/5254fe829c1a1554024b185254ce1177eaafa64b3ea72a0732abc7a205074b23.json +0 -0
  112. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/531a38ee0ed1035f37eecda69c27f43d9a0ecd6fea2fc6127c3a3318f5f06dad.json +0 -0
  113. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/535082e7e072de1deb460d4d58ba560c76f4c0ffdba7836846c3699d4c47fc5a.json +0 -0
  114. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/55cb312149a7885f52f272daaf0060fbdbd8e26dc67e79c7b15d94a32b750749.json +0 -0
  115. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/563deb73b3327340c242a025beeca43321716dfbcea23fac9c89875d67a08f72.json +0 -0
  116. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/58191b4e65d5ba31195e59a1f244014669e52970d0bfe01bc99ab171f54e1c03.json +0 -0
  117. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/584d486255b4cee316ca9e6e3656c989d600ac403ccf01bdb3d548606678b17b.json +0 -0
  118. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/589dad68071e187dbb2fbbaa04d83c88bf219f7d428bfe1aa5a1ff7dbf023a23.json +0 -0
  119. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/5a0a54d982fe112ff92a0263994062f4bf21f02c426b6936f257e80d02efabb9.json +0 -0
  120. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/5a4e9b332727fe6e94e1548fb31f14aef41966f5ead08e7dde780b02d60148f5.json +0 -0
  121. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/5a8f8b728c901bfe909cccedbe276a221a7e0af456ebb26189774931eded5a74.json +0 -0
  122. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/5bd0ff70a33bedbee8d278646e92ab57e29a43867cd60e7fb918508833117b56.json +0 -0
  123. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/5c088e2c173f3f6dd18f3df4cd20a198a76d4d5da9db7f8b749b55ea97210f05.json +0 -0
  124. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/6095cf8a05c742b2d126bfc1cb9064a3c3cae65911146f1c4d36e2d4f86f1680.json +0 -0
  125. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/6207dfec219a33509fc91cdd0055029c6b360a28fe282bee4bf489a4d45400d3.json +0 -0
  126. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/62602a326a616b0ef6a3ee96fdf794a5815d0a69babd77a9a85e68ba6599db60.json +0 -0
  127. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/627d8be024734a3d490521cd423e9db4c50870f3ca6ac761e75f86ea55eb9491.json +0 -0
  128. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/62ace6fa362a937c7d2e645eea0192df37d1de5fc0fcc9f0a16f708b74ecd48a.json +0 -0
  129. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/6464e2cd097df4628226ba38836dd4d55ea4b97dba4dd952e1a34c84fa00e914.json +0 -0
  130. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/6469622a3449ce827fd414b465085e38a53133a20024b6c30e13c6fab1cbd06e.json +0 -0
  131. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/64990a73d75b059ef41bfa7ffe5dc818e1e197e3509f3b568e7fec254760bdad.json +0 -0
  132. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/68806e21c83d8f6bb9b7deaf161a26e2543fb6a6052839b92fd229c44de4785d.json +0 -0
  133. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/689e2aa834fc2b6c42e3a6ad0c9b2a9060d968a9a8dd8d1c47be911b5a7347c6.json +0 -0
  134. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/69e95bec750edd2374827041d52575a2c09051c1adb4b1eab17cb8dc9ed5ee9d.json +0 -0
  135. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/6a583adb3c041e3e49886b4b96a73494fdb8c677ac28463c037845ba616348a3.json +0 -0
  136. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/6b39e36d9b59b214516369764a7c635e8b6af335c69fd2ab4fbd3be0aa12f539.json +0 -0
  137. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/6bae4a41d4b3c584b87f6e963948951164f820ba2f77065856e93fa5fb77da4f.json +0 -0
  138. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/6be37bdd97101b62dc6fd786d39749426e719b5f9c0464ceb43cdfc63e56d5b0.json +0 -0
  139. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/6d775401047dd566d5fcab422fdb64798fc85eef1ccd9444c43376314a7e81ba.json +0 -0
  140. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/6e8481e9dad0e6c1793e5f6ccbbf1dfb5ba88a09fb9e326425df6bf3b5b10e33.json +0 -0
  141. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/70ac455c2976654f81e4ada2accbeb9a0ed097e513ee641a1767038b60f3d058.json +0 -0
  142. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/715a84c56ee658f84a9b5930a0d01326da31d98b891e6ba0be647527f999167c.json +0 -0
  143. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/73190900d1852a833a8e0c0cc86f2a1083d4b3ffcdd36ccf239bf3fefe2be9b9.json +0 -0
  144. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/731a07b1575dc21af660051d44974822d16d4d07e0ff8c959f3e7971c16e9a7a.json +0 -0
  145. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/73ee87e06204f3346bd71d9107d89a9171428bacf3611019cdfcfd4aef224acb.json +0 -0
  146. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/73f5451927075637af3c96c14efec5d69b6da496baee2dc759048edc9b12c232.json +0 -0
  147. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/74c85d86a6d8483900d3fa46e3dd606f54d64af4ae6e5b75421fe1c6788b3c60.json +0 -0
  148. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/77cefb8a568e79bbbf5ea2f16eca5b1dedef30fde3405aab81eec97baf84f827.json +0 -0
  149. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/782afa626a4098a473fab0fb263ca59c59db1111372aa81c48944c3b8c95f491.json +0 -0
  150. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/79ce979e77967e52a44d8579c4303ab655f65ad9bc258c3bd96c3dd7305cae06.json +0 -0
  151. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/7c6ac8a21f4385b56aeea01fee3766a0f9abbbc6f9a0590ea16325f235efcf20.json +0 -0
  152. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/7ceeb2d8df9a1700574716eeb32d72e4fd574ea02d01cb3e1e48e65df9c5003a.json +0 -0
  153. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/7d5f935bff18ec87a6c7a089cd08c4d89cc922a0e020c1fb1b57f13ed586358c.json +0 -0
  154. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/7db158ee49deabc6bb44403c7cde05504828d9e0ab9059b2630fc953bd81d93c.json +0 -0
  155. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/7dc6b1a6affc2de030eaa790e0826a3797ed82b2f5e6df1481df872f1f511e9e.json +0 -0
  156. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/7e0aa14109be2807e6cab542dd82edba518e53ede3c664eb7224a8dfe651f469.json +0 -0
  157. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/7f546efb5963586a767ed1de189fdadacbe4ae8989478a5a66e5120052df625f.json +0 -0
  158. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/7fbf42c8c7d52f048579426d9da3dd81d5828c24c2321a3795fb3b7659b92a0c.json +0 -0
  159. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/80c3a5a1b8160107475d142a6135ddaf906da9307805f2e68ba8c3af04aa9882.json +0 -0
  160. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/81a280d2907246e14a57096449e036eb0363da6f0074ecedf14879d6f09a826c.json +0 -0
  161. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/81d4d752174e5a09b2ba32a01724629f16137270b7f0f098a5e66b6a1c689d18.json +0 -0
  162. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/82cad94a35ab2d431beb0f15d5d13decd59ab65525dfc802995ddc7fbacedc21.json +0 -0
  163. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/83d57f81198fde4ad8a03bbe0f9d80058eb82724505cb31283206d38486285cc.json +0 -0
  164. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/85af66fc476055f4e450401935be1757b9d043099c0530a55edaaa9e8fc45b78.json +0 -0
  165. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/85c074209d24896e542e425b1fb9fad5d2704db1286e406b25fbe2a9e1c62ac8.json +0 -0
  166. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/86332e56e1d088488a3378a8ffb47b13abb39e8c81cdeb5f1d546a14a5d4e03f.json +0 -0
  167. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/866b406c0825b3fd70dd6c7a0c04d67018b3701b14bf2658d5f05ebbfb134bb2.json +0 -0
  168. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/869ef8c9b4cfacfe7b568dedfac756cc52c7635bd951bacceb6f68930061e798.json +0 -0
  169. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/8b4f66ce9958d1bb4077dfe1d0e4df2f7f4642a838714dbc93316dc3c8523534.json +0 -0
  170. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/8b9eaad4dfb5c0936cebcafde3c3b368c71c5c2e7f4fbc282c887051e25567e5.json +0 -0
  171. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/8e4e1c38e46c8daa3c97656d09feaa9fbb2f083b3401f9fbdf7fb53a87bb50f6.json +0 -0
  172. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/8e73cca8cf7e6238b5a9e4a46b62d2cf8968fb9e071c8ff8e21a55b1cbb1cd46.json +0 -0
  173. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/8ec0bfac79ec428f8e9bd6ef770eee33b0218601b0ada7b113da52b4a53ca6fc.json +0 -0
  174. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/8f1414450de85a7ca36b1c4508c946084f9eaa83eee74f709dd09ebb7fc9e773.json +0 -0
  175. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/92e467b0ca6f7256ca2bd57e96777a76d4cd15d574eb169a10d37c8c5737fb3d.json +0 -0
  176. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/93eb2741e82d5f2c723db19741da0ec90a516da435c2be2ce0c63fcf18a478af.json +0 -0
  177. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/95cb2ed2edc938dbc2eb71b8aeebaec57b8eaaf2229c8e7f4a1a702b36da6d36.json +0 -0
  178. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/95ede7cf79834cf530eb2332a0a7859f1f3b27cc246645cb88421aa0def23623.json +0 -0
  179. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/97aaf1b808af614b0985c5d9ea1196a794a2453b59c9bb81cac1561b29f9092f.json +0 -0
  180. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/9811147e5abebc52edff502471a40f369ee1329e9f029ef3258976404f06a8f9.json +0 -0
  181. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/98270c04210ce70f7197fd3c1df74140159aed78f3d6b0c736b9fd1de4309b68.json +0 -0
  182. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/98f967e9230b612cb641244c969d3461874f40a74d00096217c05b4ca3cc5163.json +0 -0
  183. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/9a710f33bcbf32f6281ef3199603286b84e3ead526791be3e5702cf19a10ba80.json +0 -0
  184. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/9cce4a16b043c387789e0867504b51418b27f557bf5874111ac917bde8e0b109.json +0 -0
  185. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/9cd2cffa72ed809a1541ad88bf92c541857c512b6e7fe07c5d9bb348a51c071a.json +0 -0
  186. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/9d06f4503bab33ea71454511db6e94b3a27c29ad650cc9cdbfd5b43138f476a6.json +0 -0
  187. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/9d3d1aee5a15a733c47dd04fdb5943d68a49f8ce13d67b05bc0a14497328f58d.json +0 -0
  188. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/9d440f60091a4f93dcf1d78367e2c71755a3acdfe8844a1b5f756a235b763488.json +0 -0
  189. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/9fd47dbb9db188abce18b1f3063253323bca0327c3362dbe36ee49250e348d54.json +0 -0
  190. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/9fe051f8082e371f9df5f940b8f071800623a9ad5b40755285095658d8f28b5a.json +0 -0
  191. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/a06be12e9602b3b595742d0cad924633191314032eaf6acaba75ae02c60a9811.json +0 -0
  192. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/a5369060fbe387a285b63275bb4e455f350efee2df2aa880f03b07ef8e64fe7c.json +0 -0
  193. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/a67e0d0fc7ebb86fc0e08ddc07be6131e22b253ad50fb36935e7901dec5977b7.json +0 -0
  194. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/a817b12b6f3c5a089ad11643f41230ba21f1987251b7a190b39cad4f485dabc5.json +0 -0
  195. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/a86964aa1cbd83641808a11c8ec3231008bae1345219c2a5646e36a8e06599a5.json +0 -0
  196. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/a93efc87b8b26bb8e00bc3bb298aedd3d7ac45ceb950802398d2414bbf47c0dc.json +0 -0
  197. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/aa76182d9de824910acfbbfc5ea8f46681debd787c018927147e47b85f056e8e.json +0 -0
  198. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/aad95764364270f74a9a2b521a4eede3c4e63ec332fdb251f833610f46f62f9d.json +0 -0
  199. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/ac62f874e909973d6a406359c3a3331861f7775ce15427c629754984e6c2bc59.json +0 -0
  200. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/acf05ae7385ed2c7fc6639333fe802f06a0ae3b54b7dc2704234673a41328154.json +0 -0
  201. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/ad228703c7b568b72aee72ca2c50dc043ba963295abff15d0f2eced3379378dd.json +0 -0
  202. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/ad28df2f2e8bc652a77cead6d657c2aed9fb644428bbd3e2c69d3b21790b6405.json +0 -0
  203. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/ae24c1a5d0d0a7e29eec5c4f95e19009825ded2c622d288ba63e6b25de7524b5.json +0 -0
  204. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/aed3d23a58b420ee0328b3bbab000572b8891d72ffb6232c3cf8b807241fe903.json +0 -0
  205. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/aedd4475f0cf7c73ea7553423af3f920eb19c3efa9eb2f8a611f6e898dfe2a44.json +0 -0
  206. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/aef7fe4c9cedf564455aa029d6cc89b79b56a532d04a56a8d092808c0ad4e5b1.json +0 -0
  207. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/b079373b22270ed561a40ead88df318a0b3cd52b143607c34f7340508f6e390e.json +0 -0
  208. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/b15b8672daa3f5df56cc7f97ee8294dd2d23b975dc9e34256c69726676be3daa.json +0 -0
  209. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/b4476bcd1991a5a30b1ac3f78801025d2928cd8c77db07730551b0815ce13c36.json +0 -0
  210. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/b470e846ba2a52d4e0763ff5739d1528d1b86974dd79c08358ceb33076790e76.json +0 -0
  211. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/b5a337d95da18b2c918d1be090cf235c67a7a09cd60f23033e8c570fa8dbb748.json +0 -0
  212. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/b60d2e0d59f626d9ff57d7230795b09be357a37343d0d2c0d1ca958a1857d8bd.json +0 -0
  213. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/b6420f0dfb5e0f15c42fa9170634d6c2b3d0409749b00ffd3c9364246d88d790.json +0 -0
  214. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/b647bffb0af3f94c4df75171f311ece530c6def16132a3a33f4b7deff6dd707a.json +0 -0
  215. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/b710a0414f46ecb976cc66ac059d3a74dbd64d0bf8f1116de968837e581b6422.json +0 -0
  216. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/b73436f8a0e225ea354ec4ad7993c5d5887b7227f7545e2ead47ac03ccc082cd.json +0 -0
  217. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/ba1fcae5bd482a5ee1095215721f18a5951393e75bb88a9df1b3e1922e2202ef.json +0 -0
  218. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/ba646e84c605179808ec987d421f534a1c4af669a910fdd1ac75bad73d8b587e.json +0 -0
  219. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/bafd5076a18391e489c5133abd6aa6032cec2783626bbd8a84381b7896f21c9d.json +0 -0
  220. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/bc630d1d2d79d48a0c7441c1081f97933ae9bc733733a7918a4cf498fa61b981.json +0 -0
  221. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/be18c3a11472b8d81adfe9761be1ff309c93c04be3f69d56638efb019757f8f7.json +0 -0
  222. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/be985fcfeb455e3d468126f1c7b65b4ab84b57c743118ef4ac021a88973dd155.json +0 -0
  223. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/bece45eb021b6454fcf8a9cf294536c7752f817beb12c90d65e0c21afe57a5a1.json +0 -0
  224. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/c018635d30a0f5436fc124a28ca204b8199b2dcec3335147150e0d34b9e1f82a.json +0 -0
  225. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/c3e028aefdbe3e462d7f676938ae48c428b44031e7c4ef34fb4686904e97b3c8.json +0 -0
  226. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/c7d3603bbe7edfbcfecc3a1b09bdd2307209be3fc7978fea7bfb7685c91b08d7.json +0 -0
  227. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/c9457b843ef85e899bfd9352d67f73980b1a2304cceb01e992440ffdd3d0eb5c.json +0 -0
  228. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/cb761115d0ed359fc4e55ad0c40245352cc091c68e5171ac20ef5e6d9d9832d1.json +0 -0
  229. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/cc658b209eeaf4c9249998a1534cefdf6837ce3a7de82fc62202102fe09957a2.json +0 -0
  230. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/cd2ce8667e344c6769096140ab1e4d9829ba2424eb9bdb65dee55f09469fecc8.json +0 -0
  231. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/cd8ce55adda67b165bf6272936d26dc172ba4d7a5fbfa4d5142181855c40f02d.json +0 -0
  232. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/cecb346166b599b5343dad969681c67168e5130e3a4018ee8fc903efc273fe04.json +0 -0
  233. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/ced68cd7e814d7774ffbdc161d16335221561854b99e12f107671e17337504b1.json +0 -0
  234. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/d08762a2d53ea94992d179f3affdd360ad2d58277024715af643374e65e62606.json +0 -0
  235. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/d48e2ae9efb9c635d241fe4f1d65e0ec51c9ac3740c29a0db58e3bcccc0e2466.json +0 -0
  236. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/d54b3634353a29d5fc12e6ccc72ca587a9b2676489bf893524c004d4afdefa51.json +0 -0
  237. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/d6200254d8034d573eb3b6bd33d39d7efddaa5fdf60a61453789e61853f03489.json +0 -0
  238. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/d7bd2958a25f99487597175b812cc96293a1342810f5076c4a92a1506fba2599.json +0 -0
  239. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/d8ad7e776fd4b3708759b004e7ed524ff77a988d48237e5d357dc99a9a3bb79d.json +0 -0
  240. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/d9dd2631fda1b4480019731d75b0a908a057084bc22ad2ca66a2c381b86e0a38.json +0 -0
  241. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/db25c8d58f8689825c0d89e5ebb3ca93542b2dafa228fde7285dcd9565ccb552.json +0 -0
  242. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/dd430a8b0bc073c8deb7e7be1ca766292097b47301797452810293d73d53ff70.json +0 -0
  243. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/ddaaecef88ef58b3207db5b55d5bbd8d91421cd99a49941482368f626cc28b9d.json +0 -0
  244. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/df9ffa69edbeaabf967cd706016a4c97e6f9ffc41c5e38ad327fde2d452ddd3e.json +0 -0
  245. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/e1713cdd15edde27fe7f01c40841ee3ede0d411e350e2b31b9e8b5b2f9ce6feb.json +0 -0
  246. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/e2eafeb868d33a2e19815315d4cfe04eaba57e9fa7835ec2a8f35b0ddffa3498.json +0 -0
  247. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/e5581298f1ebdbc113077df91f6215a07ddde68e9a45c01035f87d241062abd2.json +0 -0
  248. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/e5dcdfd16046923e879eb93db75c0df5067b2859f57259df63cdcce61ef2c03e.json +0 -0
  249. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/e5e9a12f89839a814832a5d5c375d4f6da3f81197790d2d52467fca122f43fd8.json +0 -0
  250. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/e8c2aff5248d3d761f3f8175e68f1ff46704c934465ccca6d284d40eeb54ae87.json +0 -0
  251. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/e992bfbfd3c2b33a9dac8499d800f5fcc3d7c33d8d84f90eb705bbd780a32b32.json +0 -0
  252. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/ea02b9cc1c110994d38e9aa28b9e4fdf49c7b0e074809f09760f068bc41dc7f8.json +0 -0
  253. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/edbe4c5e6076cc2c119ccec658be0196128b8742a9d640cb9cdf7d79aa622304.json +0 -0
  254. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/ef396e2cc36a574a59a95bf95caae976ec92698d1b43a1fdca8e7a20609d6aa3.json +0 -0
  255. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/f1607b2d6749b8e2f1b21e6985fa4da4077d01500b190e20b3d4ac89c8cd0e69.json +0 -0
  256. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/f2c65b378401d4e854bb4d18bc4396419ca74dc8c84a5a8d57f4074baeeeb63f.json +0 -0
  257. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/f5a620cd0622f180ea799f73823c099958513ca86ff822d9fc45f73b106b35c4.json +0 -0
  258. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/f649350396b8f14e079a1646de95a5e490c709748fcd989a603afad3a7044898.json +0 -0
  259. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/f68a4af4ef4d24cc0416195c9b123d0cb4f6811c08554914866d4a86835dab24.json +0 -0
  260. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/f9ee28f629cd46d9b44cdd1dfa64aadb0231af8002093266902d90e1f2f9fc88.json +0 -0
  261. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/faabe069e0568dabcc65124f0fa7d56e3ddfadf62523fc3f208ee4ad11c46f8d.json +0 -0
  262. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/fe209b7393dc29439e121809022e793527d4208c2957d479e9f0706d4ba357e0.json +0 -0
  263. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/fe674973c21bca43da88fbeadc8361422a28aeb4d9eaca2db7d40f99a04d5608.json +0 -0
  264. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/stat-index.json +0 -0
  265. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/graph.html +0 -0
  266. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/graph.json +0 -0
  267. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/manifest.json +0 -0
  268. {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/merged-graph.json +0 -0
  269. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/adapters/__init__.py +0 -0
  270. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/adapters/activex.py +0 -0
  271. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/adapters/adapter.py +0 -0
  272. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/adapters/cvi.py +0 -0
  273. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/adapters/dll.py +0 -0
  274. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/adapters/dotnet.py +0 -0
  275. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/adapters/htbasic.py +0 -0
  276. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/adapters/labview.py +0 -0
  277. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/adapters/labview_nxg.py +0 -0
  278. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/adapters/python.py +0 -0
  279. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/adapters/sequence.py +0 -0
  280. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/analyzer/__init__.py +0 -0
  281. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/analyzer/analysis_context.py +0 -0
  282. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/analyzer/analysis_message.py +0 -0
  283. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/analyzer/analysis_utilities.py +0 -0
  284. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/analyzer/rule.py +0 -0
  285. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/analyzer/rule_configuration.py +0 -0
  286. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/analyzer/rule_setting_values.py +0 -0
  287. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/analyzer/types.py +0 -0
  288. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/core/__init__.py +0 -0
  289. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/core/com_wrapper.py +0 -0
  290. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/core/engine/__init__.py +0 -0
  291. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/core/engine/engine.py +0 -0
  292. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/core/engine/enums.py +0 -0
  293. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/core/exceptions.py +0 -0
  294. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/core/external_report_viewers.py +0 -0
  295. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/core/file_information.py +0 -0
  296. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/core/images.py +0 -0
  297. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/core/search.py +0 -0
  298. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/core/utility.py +0 -0
  299. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/execution/__init__.py +0 -0
  300. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/execution/additional_results.py +0 -0
  301. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/execution/breakpoint.py +0 -0
  302. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/execution/database_options.py +0 -0
  303. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/execution/edit_args.py +0 -0
  304. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/execution/interactive_args.py +0 -0
  305. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/execution/output_record_stream.py +0 -0
  306. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/execution/report.py +0 -0
  307. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/execution/result_log.py +0 -0
  308. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/execution/sync_manager.py +0 -0
  309. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/execution/thread.py +0 -0
  310. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/execution/watch_expression.py +0 -0
  311. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ext/__init__.py +0 -0
  312. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ext/events.py +0 -0
  313. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ext/step_types.py +0 -0
  314. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/messaging/__init__.py +0 -0
  315. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/messaging/output_message.py +0 -0
  316. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/messaging/output_messages.py +0 -0
  317. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/messaging/ui_message.py +0 -0
  318. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/property/__init__.py +0 -0
  319. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/property/array_dimensions.py +0 -0
  320. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/property/data_type.py +0 -0
  321. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/property/property_object.py +0 -0
  322. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/property/property_object_file.py +0 -0
  323. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/py.typed +0 -0
  324. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/sequence/__init__.py +0 -0
  325. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/sequence/code_template.py +0 -0
  326. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/sequence/expression.py +0 -0
  327. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/sequence/location.py +0 -0
  328. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/sequence/sequence.py +0 -0
  329. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/sequence/sequence_file.py +0 -0
  330. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/sequence/step.py +0 -0
  331. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/sequence/step_group.py +0 -0
  332. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/sequence/step_type.py +0 -0
  333. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/sequence/type_palette.py +0 -0
  334. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/station/__init__.py +0 -0
  335. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/station/search_directories.py +0 -0
  336. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/station/station_options.py +0 -0
  337. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/__init__.py +0 -0
  338. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/application_manager.py +0 -0
  339. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/button_ctrl.py +0 -0
  340. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/checkbox_ctrl.py +0 -0
  341. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/combobox_ctrl.py +0 -0
  342. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/command.py +0 -0
  343. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/connections.py +0 -0
  344. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/entry_point.py +0 -0
  345. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/events.py +0 -0
  346. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/execution_view_manager.py +0 -0
  347. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/expression_edit_ctrl.py +0 -0
  348. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/insertion_palette.py +0 -0
  349. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/label_ctrl.py +0 -0
  350. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/list_box_ctrl.py +0 -0
  351. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/listbar_ctrl.py +0 -0
  352. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/menu_item.py +0 -0
  353. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/report_view_ctrl.py +0 -0
  354. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/sequence_file_view_manager.py +0 -0
  355. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/sequence_view_ctrl.py +0 -0
  356. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/status_bar.py +0 -0
  357. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/styles.py +0 -0
  358. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/variables_view_ctrl.py +0 -0
  359. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/undo/__init__.py +0 -0
  360. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/undo/undo_item.py +0 -0
  361. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/undo/undo_item_creator.py +0 -0
  362. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/undo/undo_stack.py +0 -0
  363. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/users/__init__.py +0 -0
  364. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/users/user.py +0 -0
  365. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/users/users_file.py +0 -0
  366. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/workspace/__init__.py +0 -0
  367. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/workspace/workspace_file.py +0 -0
  368. {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/workspace/workspace_object.py +0 -0
  369. {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/__init__.py +0 -0
  370. {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/conftest.py +0 -0
  371. {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/integration/_ui_message_stress.py +0 -0
  372. {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/integration/test_api_compatibility.py +0 -0
  373. {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/integration/test_memory_leaks.py +0 -0
  374. {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/integration/test_property_object_serialize.py +0 -0
  375. {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/integration/test_ui_messages.py +0 -0
  376. {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/test_core.py +0 -0
  377. {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/__init__.py +0 -0
  378. {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/adapters/test_activex_adapter.py +0 -0
  379. {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/adapters/test_dotnet_adapter.py +0 -0
  380. {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/adapters/test_labview_adapter.py +0 -0
  381. {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/adapters/test_python_adapter.py +0 -0
  382. {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/analyzer/__init__.py +0 -0
  383. {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/analyzer/test_rule_authoring.py +0 -0
  384. {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/core/__init__.py +0 -0
  385. {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/core/test_engine.py +0 -0
  386. {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/core/test_enums.py +0 -0
  387. {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/core/test_errors.py +0 -0
  388. {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/core/test_expression.py +0 -0
  389. {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/core/test_property_object_file.py +0 -0
  390. {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/core/test_sequence.py +0 -0
  391. {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/core/test_sequence_file.py +0 -0
  392. {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/core/test_step.py +0 -0
  393. {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/execution/test_database_options.py +0 -0
  394. {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/execution/test_execution.py +0 -0
  395. {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/sequence/test_sequence.py +0 -0
  396. {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/sequence/test_sequence_file.py +0 -0
  397. {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/test_com_contract.py +0 -0
  398. {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/test_core_mechanics.py +0 -0
  399. {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/test_lifecycle.py +0 -0
  400. {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/test_public_api.py +0 -0
  401. {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/ui/test_events.py +0 -0
  402. {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/ui/test_execution_view_manager.py +0 -0
  403. {py_teststand-0.2.3 → 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.3
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) |
@@ -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.",
@@ -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.3"
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"
@@ -133,10 +158,7 @@ publish-url = "https://test.pypi.org/legacy/"
133
158
  explicit = true
134
159
 
135
160
  [tool.pyrefly]
136
- project-includes = [
137
- "**/*.py*",
138
- "**/*.ipynb",
139
- ]
161
+ project-includes = ["**/*.py*", "**/*.ipynb"]
140
162
 
141
163
  [[tool.uv.index]]
142
164
  name = "pypi"
@@ -116,6 +116,9 @@ from .execution.edit_args import EditArgs
116
116
  from .execution.execution import Execution, ExecutionTypeMask
117
117
  from .execution.interactive_args import InteractiveArgs, InteractiveContext
118
118
  from .execution.report import Report, ReportConversion, Reports, ReportSection, ReportSections
119
+ from .execution.result_list import (
120
+ ResultList,
121
+ )
119
122
  from .execution.result_log import ResultLog, ResultLogger, ResultLogRecordType
120
123
  from .execution.sync_manager import (
121
124
  AutoReleaser,
@@ -286,6 +289,7 @@ __all__ = [
286
289
  "ReportSection",
287
290
  "ReportSections",
288
291
  "Reports",
292
+ "ResultList",
289
293
  "ResultLog",
290
294
  "ResultLogRecordType",
291
295
  "ResultLogger",
@@ -12,6 +12,7 @@ if TYPE_CHECKING:
12
12
  from py_teststand.adapters.sequence import NewThreadOption
13
13
  from py_teststand.core.engine import RTEOption
14
14
  from py_teststand.execution.output_record_stream import ExecutionOutputRecordStreams
15
+ from py_teststand.execution.result_list import ResultList
15
16
  from py_teststand.execution.thread import Thread
16
17
  from py_teststand.sequence.sequence import Sequence
17
18
  from py_teststand.sequence.sequence_file import SequenceFile
@@ -362,6 +363,13 @@ class Execution(COMWrapper):
362
363
  def result_object(self) -> PropertyObject:
363
364
  return PropertyObject(self._com_obj.ResultObject, self._engine_ref)
364
365
 
366
+ @property
367
+ @ts_interface
368
+ def result_list(self) -> ResultList:
369
+ from py_teststand.execution.result_list import ResultList
370
+
371
+ return ResultList(self)
372
+
365
373
  @property
366
374
  @ts_interface
367
375
  def result_status(self) -> str:
@@ -0,0 +1,218 @@
1
+ from __future__ import annotations
2
+
3
+ import typing
4
+
5
+ from py_teststand.property.property_object import PropertyObject
6
+ from py_teststand.sequence.sequence_context import SequenceContext
7
+
8
+ if typing.TYPE_CHECKING:
9
+ pass
10
+
11
+
12
+ class ResultList:
13
+ """Wrapper class for ResultList property, handling type casting automatically."""
14
+
15
+ def __init__(self, obj: typing.Any) -> None: # noqa: ANN401
16
+ """Initialize with an Execution, SequenceContext, PropertyObject, or raw COM object."""
17
+ self._target = obj
18
+
19
+ def _walk(
20
+ self, result_list: PropertyObject, parent_sequence: str = ""
21
+ ) -> typing.Iterator[dict[str, typing.Any]]:
22
+ """Walks a ResultList array and yields each step result as a dict.
23
+
24
+ Args:
25
+ result_list: A PropertyObject wrapping the ResultList array.
26
+ parent_sequence: Name of the parent sequence for context.
27
+
28
+ Yields:
29
+ One dict per step result with name, type, status, value, limits, etc.
30
+ """
31
+ if not result_list.is_array:
32
+ return
33
+
34
+ num_elements = result_list.get_num_elements()
35
+ for i in range(num_elements):
36
+ step_result_object = result_list.get_property_object_by_offset(i, 0)
37
+ if step_result_object is None:
38
+ continue
39
+
40
+ with step_result_object as result:
41
+ try:
42
+ # TS.* standard result properties
43
+ name = (
44
+ result.get_val_string("TS.StepName")
45
+ if result.exists("TS.StepName")
46
+ else "Unknown"
47
+ )
48
+ step_type = (
49
+ result.get_val_string("TS.StepType") if result.exists("TS.StepType") else ""
50
+ )
51
+ status = result.get_val_string("Status") if result.exists("Status") else ""
52
+
53
+ # Error subproperty
54
+ error_msg = ""
55
+ error_code = 0
56
+ if result.exists("Error.Msg"):
57
+ error_msg = result.get_val_string("Error.Msg")
58
+ if result.exists("Error.Code"):
59
+ error_code = int(result.get_val_number("Error.Code"))
60
+
61
+ # Step-type-specific value (Numeric, String, or PassFail)
62
+ value: typing.Any = None
63
+ if result.exists("Numeric"):
64
+ value = result.get_val_number("Numeric")
65
+ elif result.exists("String"):
66
+ value = result.get_val_string("String")
67
+ elif result.exists("PassFail"):
68
+ value = result.get_val_boolean("PassFail")
69
+
70
+ # Limits subproperty
71
+ limits: dict[str, typing.Any] = {}
72
+ limits_path = ""
73
+ if result.exists("Limits"):
74
+ limits_path = "Limits"
75
+ elif result.exists("RawLimits"):
76
+ limits_path = "RawLimits"
77
+
78
+ if limits_path:
79
+ limits_object = result.get_property_object(limits_path)
80
+ if limits_object is not None:
81
+ with limits_object as limits_properties:
82
+ if limits_properties.exists("Low"):
83
+ limits["low"] = limits_properties.get_val_number("Low")
84
+ if limits_properties.exists("High"):
85
+ limits["high"] = limits_properties.get_val_number("High")
86
+ if limits_properties.exists("String"):
87
+ limits["string"] = limits_properties.get_val_string("String")
88
+
89
+ # Measurement array (MultipleNumericLimitTest)
90
+ measurements: list[dict[str, typing.Any]] = []
91
+ if result.exists("Measurement"):
92
+ measurement_array = result.get_property_object("Measurement")
93
+ if measurement_array is not None and measurement_array.is_array:
94
+ for j in range(measurement_array.get_num_elements()):
95
+ measurement_item = measurement_array.get_property_object_by_offset(
96
+ j
97
+ )
98
+ if measurement_item is not None:
99
+ with measurement_item as measurement_properties:
100
+ has_val = measurement_properties.exists("Measurement")
101
+ measurement_value = (
102
+ measurement_properties.get_val_number("Measurement")
103
+ if has_val
104
+ else None
105
+ )
106
+ has_status = measurement_properties.exists("Status")
107
+ measurement_status = (
108
+ measurement_properties.get_val_string("Status")
109
+ if has_status
110
+ else ""
111
+ )
112
+ measurements.append(
113
+ {
114
+ "value": measurement_value,
115
+ "status": measurement_status,
116
+ }
117
+ )
118
+
119
+ # Nested subsequence ResultList
120
+ has_nested = False
121
+ nested_list = None
122
+ nested_sequence_name = name
123
+
124
+ if result.exists("TS.SequenceCall.ResultList"):
125
+ has_nested = True
126
+ nested_list = result.get_property_object("TS.SequenceCall.ResultList")
127
+ if result.exists("TS.SequenceCall.Sequence"):
128
+ nested_sequence_name = result.get_val_string("TS.SequenceCall.Sequence")
129
+ elif result.exists("ResultList"):
130
+ has_nested = True
131
+ nested_list = result.get_property_object("ResultList")
132
+
133
+ except Exception as e:
134
+ # Catch COM errors so a single bad element doesn't kill the loop
135
+ name = "Unknown (Parser Error)"
136
+ step_type = "Error"
137
+ status = "Error"
138
+ value = None
139
+ limits = {}
140
+ measurements = []
141
+ has_nested = False
142
+ nested_list = None
143
+ nested_sequence_name = ""
144
+ error_msg = f"Failed to parse result properties: {e}"
145
+ error_code = -1
146
+
147
+ yield {
148
+ "name": name,
149
+ "type": step_type,
150
+ "status": status,
151
+ "value": value,
152
+ "limits": limits if limits else None,
153
+ "measurements": measurements if measurements else None,
154
+ "error_msg": error_msg,
155
+ "error_code": error_code,
156
+ "parent_sequence": parent_sequence,
157
+ "is_sequence_call": has_nested,
158
+ }
159
+
160
+ if has_nested and nested_list is not None:
161
+ with nested_list as nested_results:
162
+ yield from self._walk(nested_results, parent_sequence=nested_sequence_name)
163
+
164
+ def parse(self) -> list[dict[str, typing.Any]]:
165
+ """Parses a ResultList from the wrapped object.
166
+
167
+ Returns:
168
+ A list of dictionaries representing the parsed step results.
169
+ """
170
+ from py_teststand.execution.execution import Execution
171
+ from py_teststand.property.property_object import PropertyObject
172
+
173
+ obj = self._target
174
+
175
+ if isinstance(obj, Execution):
176
+ result_object = obj.result_object
177
+ if result_object is None or not result_object.exists("ResultList"):
178
+ return []
179
+ result_list = result_object.get_property_object("ResultList")
180
+ if result_list is None:
181
+ return []
182
+ with result_list as rl:
183
+ return list(self._walk(rl))
184
+
185
+ if isinstance(obj, SequenceContext):
186
+ result_list = None
187
+ if obj.locals.exists("ResultList"):
188
+ result_list = obj.locals.get_property_object("ResultList")
189
+ elif obj.parameters.exists("ResultList"):
190
+ result_list = obj.parameters.get_property_object("ResultList")
191
+
192
+ if result_list is None:
193
+ return []
194
+
195
+ sequence_name = ""
196
+ try:
197
+ if obj.sequence:
198
+ sequence_name = obj.sequence.name
199
+ except Exception:
200
+ pass
201
+
202
+ with result_list as rl:
203
+ return list(self._walk(rl, parent_sequence=sequence_name))
204
+
205
+ if isinstance(obj, PropertyObject):
206
+ return list(self._walk(obj))
207
+
208
+ # Raw COM objects / Mocks
209
+ com_obj = obj
210
+ is_mock = "mock" in type(com_obj).__name__.lower() or hasattr(com_obj, "_mock_self")
211
+ if not is_mock:
212
+ if hasattr(com_obj, "ResultObject"):
213
+ return ResultList(Execution(com_obj)).parse()
214
+ if hasattr(com_obj, "Locals") and hasattr(com_obj, "Parameters"):
215
+ return ResultList(SequenceContext(com_obj)).parse()
216
+
217
+ with PropertyObject(com_obj) as po:
218
+ return list(self._walk(po))
@@ -13,6 +13,7 @@ if TYPE_CHECKING:
13
13
  from py_teststand.core.engine import Engine
14
14
  from py_teststand.execution.execution import Execution
15
15
  from py_teststand.execution.report import Report
16
+ from py_teststand.execution.result_list import ResultList
16
17
  from py_teststand.execution.thread import Thread
17
18
  from py_teststand.sequence.step import Step
18
19
 
@@ -44,6 +45,13 @@ class SequenceContext(PropertyObject):
44
45
 
45
46
  return Execution(self._com_obj.Execution, self._engine_ref)
46
47
 
48
+ @property
49
+ @ts_interface
50
+ def result_list(self) -> ResultList:
51
+ from py_teststand.execution.result_list import ResultList
52
+
53
+ return ResultList(self)
54
+
47
55
  @property
48
56
  @ts_interface
49
57
  def call_stack_name(self) -> str:
@@ -126,6 +126,26 @@ def test_execution_run_test_headless_example_runs_on_live_engine():
126
126
  assert "Overall: FAILED" in completed.stdout, output
127
127
 
128
128
 
129
+ @pytest.mark.teststand_engine
130
+ @pytest.mark.integration
131
+ def test_result_list_parse_example_runs_on_live_engine():
132
+ # Walks the ResultList and parses step result values.
133
+ # Subprocess-isolated for the same teardown reason as above.
134
+ import subprocess
135
+ import sys
136
+
137
+ completed = subprocess.run(
138
+ [sys.executable, str(EXAMPLES_DIR / "result_list_parse.py")],
139
+ capture_output=True,
140
+ text=True,
141
+ timeout=180,
142
+ )
143
+ output = completed.stdout + completed.stderr
144
+ assert "Verify Power Rail" in completed.stdout, output
145
+ assert "Verify Current Draw" in completed.stdout, output
146
+ assert "Serialized JSON Report:" in completed.stdout, output
147
+
148
+
129
149
  @pytest.mark.teststand_engine
130
150
  @pytest.mark.integration
131
151
  def test_ui_messages_handle_example_runs_on_live_engine():