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.
- {py_teststand-0.2.3 → py_teststand-0.3.0}/CLAUDE.md +6 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/GEMINI.md +3 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/PKG-INFO +4 -3
- {py_teststand-0.2.3 → py_teststand-0.3.0}/README.md +3 -2
- {py_teststand-0.2.3 → py_teststand-0.3.0}/examples/execution_run_subsequence.py +4 -9
- {py_teststand-0.2.3 → py_teststand-0.3.0}/examples/execution_run_test_headless.py +9 -9
- {py_teststand-0.2.3 → py_teststand-0.3.0}/examples/launch_all_examples.py +1 -0
- py_teststand-0.3.0/examples/result_list_parse.py +75 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/pyproject.toml +31 -9
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/__init__.py +4 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/execution/execution.py +8 -0
- py_teststand-0.3.0/src/py_teststand/execution/result_list.py +218 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/sequence/sequence_context.py +8 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/integration/test_examples.py +20 -0
- py_teststand-0.3.0/tests/integration/test_result_list_live.py +76 -0
- py_teststand-0.3.0/tests/unit/execution/test_result_list.py +151 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/uv.lock +137 -152
- {py_teststand-0.2.3 → py_teststand-0.3.0}/.gitignore +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/.markdownlint-cli2.jsonc +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/.python-version +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/LICENSE +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/examples/analyzer_step_name_length.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/examples/data_type_manage.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/examples/property_object_serialize.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/examples/search_directory_manage.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/examples/sequence_build.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/examples/station_options_update.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/examples/step_insert.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/examples/step_insert_from_template.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/examples/ui_messages_handle.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/examples/users_manage.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/examples/variables_manage.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/examples/workspace_create.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/.graphify_labels.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/.graphify_python +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/.graphify_root +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/.graphify_uncached.txt +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/GRAPH_REPORT.md +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/00300beaf41ddf8ca88a2133f315f9873877e388dfadf2343bc93ad9ec7189af.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/0041043937ad3008273915d37b7f4b2d48ca2c4612d45ae3f8cd0cb931b90f9f.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/021c67591ed36baaccec5597b1aaa5da45a3d107860151d0c14da8d8e82d13fe.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/023707fc22c5dae0fe050b058cef36e8166178bd19bf64c19d1d5769193e0b66.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/040ee1db9c6b7f496603e954cded103cc0a695fdff0107104d1971e6bd77fa80.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/05037a9ec557a4372515feea0cb82e6b8112ac7c5e298565964fbd270f96bb55.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/0524858e50a4d2f7d2ac92c57ca3c87df637bf4c3158c7092a413e4393c857a4.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/05547b7aeeb2f4a7f5f21a8e7104b9116d781c941b744c43b0ea6c82e21b5fdd.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/0561a3660d3619ac6a5591c0657208ef1151afc18df8f2fd6f97de8670d8eb60.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/057056cc111fdb36b69e58f64079572f5c47872e0727d1ad3dfc0f35e7d39a4f.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/057e562996ba53b27fd80676787dca1563c48de754f9cd7932562ae64c3b5489.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/064e97d62db5d77399540dec673d05b900a3e29224bb4e45bc3e879729f20003.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/06511afc1a360b72ddc9b4497a994dca686aef3b97922cc8b80443403a4ddb83.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/06c31bd2b14400097f1e5123a6f39525ba4c4e5e2a5e7ff4c38a43b224d20a0d.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/070c095dddd2f798973cbb1332d344bf81370ea5a6eda28e88b1f7a27ef6c709.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/09332e170176084c6344fec2f82b8e890d06f8e32680643e316246716bee53e3.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/094e59f0e4cdb42feca81333bf3bf014eca76ad887ef1490483f798c17d40cd5.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/0aec586f84490fed93173f8a2200485ceffc529450740dcf5edbe12a7d89f781.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/0af23434a97b56cbda3aaf2de520ee9e18a629be0ef406a90dac45260481c1bf.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/0bd90bc4c1dd73076d8627f6ea7be67faaf504d30221b1dce45cb1c443755fb5.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/0e7f3eedcff4a433a47611e1adf13860af5e6d16fbb6129fc48ddd8557aa1626.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/100f3021f37614916d64cfaf40b04fda8d1989d624d03d93a97ec6ca79bf17e0.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/1051e1923497524696fb7fa1b71ba3a9d3cf12ec8519b1e8209d9d5eac717990.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/1086f0d1446ee0d57fc4c325f3828ff783e328ced88aac13b45f718161499e53.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/10fe404eb03263a768b27a2e92b2fe20e33cda3eab265a84860286430be0a49b.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/13bdd9d4f7de5ab5fbb955890067eb3772a2302e014480243ae141a4eee8b4f7.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/167515af1cd986fa06cab9d7efa9f1feb18bc95e3c6de1dba854adafc7ae8ead.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/16fba3996eb41939497dbd0f426c599e4ebc1eb5a762d7e1ff143708e49e94dc.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/17de4e480542b25d6f2a11461ae4f41a6282c3ecbeb3619b0b42fdbb7f31939c.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/17fbd1888f87c0b6c099e7e88300cf58e26adda72cf2f2297fc1f0e6bd2e9257.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/1d601091a3312ce89ddc9523bffccf41742eb6ea1223a6b4f751c210ffce1fb4.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/1e4049e0856983245c1154127a97509e576a1fd14f3ea56d52f946878a535bae.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/1e4d42449081955231608e3fa48b5c3102243d55a80e9064b88440669ed821b2.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/1f727c948a41c946dd0aa376993d5620f226497d49404c03b3c175d057b4ab29.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/1f7c2be5abf85169f9c409d39e58419418193281eeb391dc3ec0d1f6784f40dc.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/1f9db61abe1368fa82aab9d8e1b27d97389172db6c78cc23abe03025876ebdd1.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/207fdd9cd514b05162cd7babd5d2252985853a11cdf847113056a5071e8377e3.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/2165f2f41684c71dbce5e6edf7262786c5aa8518828e00e2a4dce75492f53aa3.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/22832c79316ab6a0c79a6bca80d9635ba80df2e2079ac114c354d43aec19f95c.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/22e04e79d7912eb1b7e3bca68279f3fa7e2936b3d2706fcdf688fff96f7c30c8.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/252d1adbbb189a3636432d8de48b5ed7c8d1f185c5ea46ceb616071960b1be42.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/25ab62b76a5f58693d5161dabf0a58862a7d6d5e9b054cc2347ffb79d4468f65.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/29731b11c9bdce6c0524fbcf801177b2da8d3181efa44ab73832e8dc0ed442bd.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/29ae039e1d154e5d25fc8659bf1eb270830e4fec772f91f41bf1cb9744733674.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/2b7f894857506a93df04568d3bc252c6883ac4010ba64b49a8c13c9cd06330ca.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/2bbb54bb8f3b91b33e7e872ea5e2b129079a60fe8284b8dd8bf5488b2f76b55d.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/2d70a40698b885cb7705c0d57922dfc922ef6b90e9a4580935d170395bc51a6e.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/2ddf8f9e5aa81db1e984bd5812d91143f64ab806a7b5676d6e7f23d1d08f677f.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/318ebfed808e94269a07fb5136c60f910bf810ffa3bef5aa7c26c313519147df.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/3289a80010b6c0faed89308018fa31f7031f27ae0d853299443c23ba8a4d6e6b.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/3312f8a2eccbfd08fabdba5d2af656bfbcb95e5b7e5390abf35ad5140759a710.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/35d6fee40fd65a1c224aa8320fbd8ef959f6975b16cc89fc2cfbb3c1b4e95641.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/3654ae6c52c3267b7a62b7697d69011bd6446dd3f6da9bc5b133da4c2efe7d6b.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/37cb92f2f6a01d4862632405ced4934cc003818147fd14ea9a636bc7336d3af1.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/3a06bdbfe7f9ae5d627e941fdd9e616d0431a4f41b37c8f8d7b3f5751fcadb21.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/3ac8bb6902eda596ffe0f32f517fb6e567a34e52e76c4ccc682d7c7dcf65f06a.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/3ace387692703afd7ecab2396d8eb8b3dc6411c0931ebf68ff5370013c707fa9.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/3b65d0f842b856818ed2510234a106990e02450d60aed9075cc4c9f4b14101bc.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/3b90f45c585a53b5f55ef2c3761eef4b97fcef1eb344f9a4819c989b174b52e5.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/3cf920bfdd765673b964deab1cf13959604b7648091d4c58209f818cc3fede98.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/3d97defd459d93180b984ca62794c47f1da9a8dc105175bfc1d8948fc8dc3f29.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/4096008e37ad33f487fa031012fdc7f354edbb3e2c3d82eeeae616e8e1ae75fa.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/4278f99739c7c54475247d2cfb57eda95ad3cc39d7bbaf04729c04932d9fef12.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/44963597cd3ea0c48e79c9aeb4e7838f1faa5bcde319b7ff81b29aa6549d551f.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/455df594e48e61d53c059f4ddad24e31e427232f4fe871e8ff384227350cc9ce.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/49e757465d8e83eb1ea11482682a0dc9bf8dd399847c883954925749ad6470c2.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/4c3d7045d901449868d2003d5529dd6f41d635c9e1ef1b1b8a0bee5e15aafc70.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/4e9f3dd260b769260bab0fd12ca46ae6b3b17221c6968fed8b7907173b05fc2d.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/50c625a30e42a14c35d57d119aba7e16a17fa05fc60cb5ff961c61a77f6129d0.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/50d6499184d0d9889c9571e8f6b7b7def3329721be05cc10bbac13520f8eef37.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/519a945f4a84c930588f887f3b23f13102ea6138645d177cef5f98b7b91e6229.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/523e956286ac13d37bfffa655ef1e83b1ecd17889caeae0ede6e99cb03c29e83.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/5254fe829c1a1554024b185254ce1177eaafa64b3ea72a0732abc7a205074b23.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/531a38ee0ed1035f37eecda69c27f43d9a0ecd6fea2fc6127c3a3318f5f06dad.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/535082e7e072de1deb460d4d58ba560c76f4c0ffdba7836846c3699d4c47fc5a.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/55cb312149a7885f52f272daaf0060fbdbd8e26dc67e79c7b15d94a32b750749.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/563deb73b3327340c242a025beeca43321716dfbcea23fac9c89875d67a08f72.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/58191b4e65d5ba31195e59a1f244014669e52970d0bfe01bc99ab171f54e1c03.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/584d486255b4cee316ca9e6e3656c989d600ac403ccf01bdb3d548606678b17b.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/589dad68071e187dbb2fbbaa04d83c88bf219f7d428bfe1aa5a1ff7dbf023a23.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/5a0a54d982fe112ff92a0263994062f4bf21f02c426b6936f257e80d02efabb9.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/5a4e9b332727fe6e94e1548fb31f14aef41966f5ead08e7dde780b02d60148f5.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/5a8f8b728c901bfe909cccedbe276a221a7e0af456ebb26189774931eded5a74.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/5bd0ff70a33bedbee8d278646e92ab57e29a43867cd60e7fb918508833117b56.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/5c088e2c173f3f6dd18f3df4cd20a198a76d4d5da9db7f8b749b55ea97210f05.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/6095cf8a05c742b2d126bfc1cb9064a3c3cae65911146f1c4d36e2d4f86f1680.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/6207dfec219a33509fc91cdd0055029c6b360a28fe282bee4bf489a4d45400d3.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/62602a326a616b0ef6a3ee96fdf794a5815d0a69babd77a9a85e68ba6599db60.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/627d8be024734a3d490521cd423e9db4c50870f3ca6ac761e75f86ea55eb9491.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/62ace6fa362a937c7d2e645eea0192df37d1de5fc0fcc9f0a16f708b74ecd48a.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/6464e2cd097df4628226ba38836dd4d55ea4b97dba4dd952e1a34c84fa00e914.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/6469622a3449ce827fd414b465085e38a53133a20024b6c30e13c6fab1cbd06e.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/64990a73d75b059ef41bfa7ffe5dc818e1e197e3509f3b568e7fec254760bdad.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/68806e21c83d8f6bb9b7deaf161a26e2543fb6a6052839b92fd229c44de4785d.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/689e2aa834fc2b6c42e3a6ad0c9b2a9060d968a9a8dd8d1c47be911b5a7347c6.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/69e95bec750edd2374827041d52575a2c09051c1adb4b1eab17cb8dc9ed5ee9d.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/6a583adb3c041e3e49886b4b96a73494fdb8c677ac28463c037845ba616348a3.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/6b39e36d9b59b214516369764a7c635e8b6af335c69fd2ab4fbd3be0aa12f539.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/6bae4a41d4b3c584b87f6e963948951164f820ba2f77065856e93fa5fb77da4f.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/6be37bdd97101b62dc6fd786d39749426e719b5f9c0464ceb43cdfc63e56d5b0.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/6d775401047dd566d5fcab422fdb64798fc85eef1ccd9444c43376314a7e81ba.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/6e8481e9dad0e6c1793e5f6ccbbf1dfb5ba88a09fb9e326425df6bf3b5b10e33.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/70ac455c2976654f81e4ada2accbeb9a0ed097e513ee641a1767038b60f3d058.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/715a84c56ee658f84a9b5930a0d01326da31d98b891e6ba0be647527f999167c.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/73190900d1852a833a8e0c0cc86f2a1083d4b3ffcdd36ccf239bf3fefe2be9b9.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/731a07b1575dc21af660051d44974822d16d4d07e0ff8c959f3e7971c16e9a7a.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/73ee87e06204f3346bd71d9107d89a9171428bacf3611019cdfcfd4aef224acb.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/73f5451927075637af3c96c14efec5d69b6da496baee2dc759048edc9b12c232.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/74c85d86a6d8483900d3fa46e3dd606f54d64af4ae6e5b75421fe1c6788b3c60.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/77cefb8a568e79bbbf5ea2f16eca5b1dedef30fde3405aab81eec97baf84f827.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/782afa626a4098a473fab0fb263ca59c59db1111372aa81c48944c3b8c95f491.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/79ce979e77967e52a44d8579c4303ab655f65ad9bc258c3bd96c3dd7305cae06.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/7c6ac8a21f4385b56aeea01fee3766a0f9abbbc6f9a0590ea16325f235efcf20.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/7ceeb2d8df9a1700574716eeb32d72e4fd574ea02d01cb3e1e48e65df9c5003a.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/7d5f935bff18ec87a6c7a089cd08c4d89cc922a0e020c1fb1b57f13ed586358c.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/7db158ee49deabc6bb44403c7cde05504828d9e0ab9059b2630fc953bd81d93c.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/7dc6b1a6affc2de030eaa790e0826a3797ed82b2f5e6df1481df872f1f511e9e.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/7e0aa14109be2807e6cab542dd82edba518e53ede3c664eb7224a8dfe651f469.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/7f546efb5963586a767ed1de189fdadacbe4ae8989478a5a66e5120052df625f.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/7fbf42c8c7d52f048579426d9da3dd81d5828c24c2321a3795fb3b7659b92a0c.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/80c3a5a1b8160107475d142a6135ddaf906da9307805f2e68ba8c3af04aa9882.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/81a280d2907246e14a57096449e036eb0363da6f0074ecedf14879d6f09a826c.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/81d4d752174e5a09b2ba32a01724629f16137270b7f0f098a5e66b6a1c689d18.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/82cad94a35ab2d431beb0f15d5d13decd59ab65525dfc802995ddc7fbacedc21.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/83d57f81198fde4ad8a03bbe0f9d80058eb82724505cb31283206d38486285cc.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/85af66fc476055f4e450401935be1757b9d043099c0530a55edaaa9e8fc45b78.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/85c074209d24896e542e425b1fb9fad5d2704db1286e406b25fbe2a9e1c62ac8.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/86332e56e1d088488a3378a8ffb47b13abb39e8c81cdeb5f1d546a14a5d4e03f.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/866b406c0825b3fd70dd6c7a0c04d67018b3701b14bf2658d5f05ebbfb134bb2.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/869ef8c9b4cfacfe7b568dedfac756cc52c7635bd951bacceb6f68930061e798.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/8b4f66ce9958d1bb4077dfe1d0e4df2f7f4642a838714dbc93316dc3c8523534.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/8b9eaad4dfb5c0936cebcafde3c3b368c71c5c2e7f4fbc282c887051e25567e5.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/8e4e1c38e46c8daa3c97656d09feaa9fbb2f083b3401f9fbdf7fb53a87bb50f6.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/8e73cca8cf7e6238b5a9e4a46b62d2cf8968fb9e071c8ff8e21a55b1cbb1cd46.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/8ec0bfac79ec428f8e9bd6ef770eee33b0218601b0ada7b113da52b4a53ca6fc.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/8f1414450de85a7ca36b1c4508c946084f9eaa83eee74f709dd09ebb7fc9e773.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/92e467b0ca6f7256ca2bd57e96777a76d4cd15d574eb169a10d37c8c5737fb3d.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/93eb2741e82d5f2c723db19741da0ec90a516da435c2be2ce0c63fcf18a478af.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/95cb2ed2edc938dbc2eb71b8aeebaec57b8eaaf2229c8e7f4a1a702b36da6d36.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/95ede7cf79834cf530eb2332a0a7859f1f3b27cc246645cb88421aa0def23623.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/97aaf1b808af614b0985c5d9ea1196a794a2453b59c9bb81cac1561b29f9092f.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/9811147e5abebc52edff502471a40f369ee1329e9f029ef3258976404f06a8f9.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/98270c04210ce70f7197fd3c1df74140159aed78f3d6b0c736b9fd1de4309b68.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/98f967e9230b612cb641244c969d3461874f40a74d00096217c05b4ca3cc5163.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/9a710f33bcbf32f6281ef3199603286b84e3ead526791be3e5702cf19a10ba80.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/9cce4a16b043c387789e0867504b51418b27f557bf5874111ac917bde8e0b109.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/9cd2cffa72ed809a1541ad88bf92c541857c512b6e7fe07c5d9bb348a51c071a.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/9d06f4503bab33ea71454511db6e94b3a27c29ad650cc9cdbfd5b43138f476a6.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/9d3d1aee5a15a733c47dd04fdb5943d68a49f8ce13d67b05bc0a14497328f58d.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/9d440f60091a4f93dcf1d78367e2c71755a3acdfe8844a1b5f756a235b763488.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/9fd47dbb9db188abce18b1f3063253323bca0327c3362dbe36ee49250e348d54.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/9fe051f8082e371f9df5f940b8f071800623a9ad5b40755285095658d8f28b5a.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/a06be12e9602b3b595742d0cad924633191314032eaf6acaba75ae02c60a9811.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/a5369060fbe387a285b63275bb4e455f350efee2df2aa880f03b07ef8e64fe7c.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/a67e0d0fc7ebb86fc0e08ddc07be6131e22b253ad50fb36935e7901dec5977b7.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/a817b12b6f3c5a089ad11643f41230ba21f1987251b7a190b39cad4f485dabc5.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/a86964aa1cbd83641808a11c8ec3231008bae1345219c2a5646e36a8e06599a5.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/a93efc87b8b26bb8e00bc3bb298aedd3d7ac45ceb950802398d2414bbf47c0dc.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/aa76182d9de824910acfbbfc5ea8f46681debd787c018927147e47b85f056e8e.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/aad95764364270f74a9a2b521a4eede3c4e63ec332fdb251f833610f46f62f9d.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/ac62f874e909973d6a406359c3a3331861f7775ce15427c629754984e6c2bc59.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/acf05ae7385ed2c7fc6639333fe802f06a0ae3b54b7dc2704234673a41328154.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/ad228703c7b568b72aee72ca2c50dc043ba963295abff15d0f2eced3379378dd.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/ad28df2f2e8bc652a77cead6d657c2aed9fb644428bbd3e2c69d3b21790b6405.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/ae24c1a5d0d0a7e29eec5c4f95e19009825ded2c622d288ba63e6b25de7524b5.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/aed3d23a58b420ee0328b3bbab000572b8891d72ffb6232c3cf8b807241fe903.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/aedd4475f0cf7c73ea7553423af3f920eb19c3efa9eb2f8a611f6e898dfe2a44.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/aef7fe4c9cedf564455aa029d6cc89b79b56a532d04a56a8d092808c0ad4e5b1.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/b079373b22270ed561a40ead88df318a0b3cd52b143607c34f7340508f6e390e.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/b15b8672daa3f5df56cc7f97ee8294dd2d23b975dc9e34256c69726676be3daa.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/b4476bcd1991a5a30b1ac3f78801025d2928cd8c77db07730551b0815ce13c36.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/b470e846ba2a52d4e0763ff5739d1528d1b86974dd79c08358ceb33076790e76.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/b5a337d95da18b2c918d1be090cf235c67a7a09cd60f23033e8c570fa8dbb748.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/b60d2e0d59f626d9ff57d7230795b09be357a37343d0d2c0d1ca958a1857d8bd.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/b6420f0dfb5e0f15c42fa9170634d6c2b3d0409749b00ffd3c9364246d88d790.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/b647bffb0af3f94c4df75171f311ece530c6def16132a3a33f4b7deff6dd707a.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/b710a0414f46ecb976cc66ac059d3a74dbd64d0bf8f1116de968837e581b6422.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/b73436f8a0e225ea354ec4ad7993c5d5887b7227f7545e2ead47ac03ccc082cd.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/ba1fcae5bd482a5ee1095215721f18a5951393e75bb88a9df1b3e1922e2202ef.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/ba646e84c605179808ec987d421f534a1c4af669a910fdd1ac75bad73d8b587e.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/bafd5076a18391e489c5133abd6aa6032cec2783626bbd8a84381b7896f21c9d.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/bc630d1d2d79d48a0c7441c1081f97933ae9bc733733a7918a4cf498fa61b981.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/be18c3a11472b8d81adfe9761be1ff309c93c04be3f69d56638efb019757f8f7.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/be985fcfeb455e3d468126f1c7b65b4ab84b57c743118ef4ac021a88973dd155.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/bece45eb021b6454fcf8a9cf294536c7752f817beb12c90d65e0c21afe57a5a1.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/c018635d30a0f5436fc124a28ca204b8199b2dcec3335147150e0d34b9e1f82a.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/c3e028aefdbe3e462d7f676938ae48c428b44031e7c4ef34fb4686904e97b3c8.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/c7d3603bbe7edfbcfecc3a1b09bdd2307209be3fc7978fea7bfb7685c91b08d7.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/c9457b843ef85e899bfd9352d67f73980b1a2304cceb01e992440ffdd3d0eb5c.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/cb761115d0ed359fc4e55ad0c40245352cc091c68e5171ac20ef5e6d9d9832d1.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/cc658b209eeaf4c9249998a1534cefdf6837ce3a7de82fc62202102fe09957a2.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/cd2ce8667e344c6769096140ab1e4d9829ba2424eb9bdb65dee55f09469fecc8.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/cd8ce55adda67b165bf6272936d26dc172ba4d7a5fbfa4d5142181855c40f02d.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/cecb346166b599b5343dad969681c67168e5130e3a4018ee8fc903efc273fe04.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/ced68cd7e814d7774ffbdc161d16335221561854b99e12f107671e17337504b1.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/d08762a2d53ea94992d179f3affdd360ad2d58277024715af643374e65e62606.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/d48e2ae9efb9c635d241fe4f1d65e0ec51c9ac3740c29a0db58e3bcccc0e2466.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/d54b3634353a29d5fc12e6ccc72ca587a9b2676489bf893524c004d4afdefa51.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/d6200254d8034d573eb3b6bd33d39d7efddaa5fdf60a61453789e61853f03489.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/d7bd2958a25f99487597175b812cc96293a1342810f5076c4a92a1506fba2599.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/d8ad7e776fd4b3708759b004e7ed524ff77a988d48237e5d357dc99a9a3bb79d.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/d9dd2631fda1b4480019731d75b0a908a057084bc22ad2ca66a2c381b86e0a38.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/db25c8d58f8689825c0d89e5ebb3ca93542b2dafa228fde7285dcd9565ccb552.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/dd430a8b0bc073c8deb7e7be1ca766292097b47301797452810293d73d53ff70.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/ddaaecef88ef58b3207db5b55d5bbd8d91421cd99a49941482368f626cc28b9d.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/df9ffa69edbeaabf967cd706016a4c97e6f9ffc41c5e38ad327fde2d452ddd3e.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/e1713cdd15edde27fe7f01c40841ee3ede0d411e350e2b31b9e8b5b2f9ce6feb.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/e2eafeb868d33a2e19815315d4cfe04eaba57e9fa7835ec2a8f35b0ddffa3498.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/e5581298f1ebdbc113077df91f6215a07ddde68e9a45c01035f87d241062abd2.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/e5dcdfd16046923e879eb93db75c0df5067b2859f57259df63cdcce61ef2c03e.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/e5e9a12f89839a814832a5d5c375d4f6da3f81197790d2d52467fca122f43fd8.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/e8c2aff5248d3d761f3f8175e68f1ff46704c934465ccca6d284d40eeb54ae87.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/e992bfbfd3c2b33a9dac8499d800f5fcc3d7c33d8d84f90eb705bbd780a32b32.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/ea02b9cc1c110994d38e9aa28b9e4fdf49c7b0e074809f09760f068bc41dc7f8.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/edbe4c5e6076cc2c119ccec658be0196128b8742a9d640cb9cdf7d79aa622304.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/ef396e2cc36a574a59a95bf95caae976ec92698d1b43a1fdca8e7a20609d6aa3.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/f1607b2d6749b8e2f1b21e6985fa4da4077d01500b190e20b3d4ac89c8cd0e69.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/f2c65b378401d4e854bb4d18bc4396419ca74dc8c84a5a8d57f4074baeeeb63f.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/f5a620cd0622f180ea799f73823c099958513ca86ff822d9fc45f73b106b35c4.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/f649350396b8f14e079a1646de95a5e490c709748fcd989a603afad3a7044898.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/f68a4af4ef4d24cc0416195c9b123d0cb4f6811c08554914866d4a86835dab24.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/f9ee28f629cd46d9b44cdd1dfa64aadb0231af8002093266902d90e1f2f9fc88.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/faabe069e0568dabcc65124f0fa7d56e3ddfadf62523fc3f208ee4ad11c46f8d.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/fe209b7393dc29439e121809022e793527d4208c2957d479e9f0706d4ba357e0.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/ast/fe674973c21bca43da88fbeadc8361422a28aeb4d9eaca2db7d40f99a04d5608.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/cache/stat-index.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/graph.html +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/graph.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/manifest.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/graphify-out/merged-graph.json +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/adapters/__init__.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/adapters/activex.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/adapters/adapter.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/adapters/cvi.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/adapters/dll.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/adapters/dotnet.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/adapters/htbasic.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/adapters/labview.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/adapters/labview_nxg.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/adapters/python.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/adapters/sequence.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/analyzer/__init__.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/analyzer/analysis_context.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/analyzer/analysis_message.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/analyzer/analysis_utilities.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/analyzer/rule.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/analyzer/rule_configuration.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/analyzer/rule_setting_values.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/analyzer/types.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/core/__init__.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/core/com_wrapper.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/core/engine/__init__.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/core/engine/engine.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/core/engine/enums.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/core/exceptions.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/core/external_report_viewers.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/core/file_information.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/core/images.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/core/search.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/core/utility.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/execution/__init__.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/execution/additional_results.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/execution/breakpoint.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/execution/database_options.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/execution/edit_args.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/execution/interactive_args.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/execution/output_record_stream.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/execution/report.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/execution/result_log.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/execution/sync_manager.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/execution/thread.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/execution/watch_expression.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ext/__init__.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ext/events.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ext/step_types.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/messaging/__init__.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/messaging/output_message.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/messaging/output_messages.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/messaging/ui_message.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/property/__init__.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/property/array_dimensions.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/property/data_type.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/property/property_object.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/property/property_object_file.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/py.typed +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/sequence/__init__.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/sequence/code_template.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/sequence/expression.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/sequence/location.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/sequence/sequence.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/sequence/sequence_file.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/sequence/step.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/sequence/step_group.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/sequence/step_type.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/sequence/type_palette.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/station/__init__.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/station/search_directories.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/station/station_options.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/__init__.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/application_manager.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/button_ctrl.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/checkbox_ctrl.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/combobox_ctrl.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/command.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/connections.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/entry_point.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/events.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/execution_view_manager.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/expression_edit_ctrl.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/insertion_palette.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/label_ctrl.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/list_box_ctrl.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/listbar_ctrl.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/menu_item.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/report_view_ctrl.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/sequence_file_view_manager.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/sequence_view_ctrl.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/status_bar.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/styles.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/ui/variables_view_ctrl.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/undo/__init__.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/undo/undo_item.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/undo/undo_item_creator.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/undo/undo_stack.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/users/__init__.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/users/user.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/users/users_file.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/workspace/__init__.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/workspace/workspace_file.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/src/py_teststand/workspace/workspace_object.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/__init__.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/conftest.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/integration/_ui_message_stress.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/integration/test_api_compatibility.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/integration/test_memory_leaks.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/integration/test_property_object_serialize.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/integration/test_ui_messages.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/test_core.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/__init__.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/adapters/test_activex_adapter.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/adapters/test_dotnet_adapter.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/adapters/test_labview_adapter.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/adapters/test_python_adapter.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/analyzer/__init__.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/analyzer/test_rule_authoring.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/core/__init__.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/core/test_engine.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/core/test_enums.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/core/test_errors.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/core/test_expression.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/core/test_property_object_file.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/core/test_sequence.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/core/test_sequence_file.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/core/test_step.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/execution/test_database_options.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/execution/test_execution.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/sequence/test_sequence.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/sequence/test_sequence_file.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/test_com_contract.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/test_core_mechanics.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/test_lifecycle.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/test_public_api.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/ui/test_events.py +0 -0
- {py_teststand-0.2.3 → py_teststand-0.3.0}/tests/unit/ui/test_execution_view_manager.py +0 -0
- {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.
|
|
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
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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.
|
|
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 = [
|
|
72
|
-
|
|
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 = [
|
|
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():
|