py-teststand 0.2.1__tar.gz → 0.2.3__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 (405) hide show
  1. {py_teststand-0.2.1 → py_teststand-0.2.3}/CLAUDE.md +6 -0
  2. py_teststand-0.2.3/GEMINI.md +8 -0
  3. py_teststand-0.2.3/PKG-INFO +310 -0
  4. py_teststand-0.2.3/README.md +274 -0
  5. {py_teststand-0.2.1 → py_teststand-0.2.3}/examples/analyzer_step_name_length.py +108 -102
  6. {py_teststand-0.2.1 → py_teststand-0.2.3}/examples/data_type_manage.py +8 -2
  7. {py_teststand-0.2.1 → py_teststand-0.2.3}/examples/execution_run_test_headless.py +77 -78
  8. {py_teststand-0.2.1 → py_teststand-0.2.3}/examples/launch_all_examples.py +41 -40
  9. {py_teststand-0.2.1 → py_teststand-0.2.3}/examples/property_object_serialize.py +171 -171
  10. py_teststand-0.2.3/examples/search_directory_manage.py +105 -0
  11. {py_teststand-0.2.1 → py_teststand-0.2.3}/examples/sequence_build.py +86 -90
  12. {py_teststand-0.2.1 → py_teststand-0.2.3}/examples/step_insert.py +120 -120
  13. {py_teststand-0.2.1 → py_teststand-0.2.3}/examples/step_insert_from_template.py +106 -106
  14. {py_teststand-0.2.1 → py_teststand-0.2.3}/examples/ui_messages_handle.py +1 -2
  15. {py_teststand-0.2.1 → py_teststand-0.2.3}/examples/variables_manage.py +1 -3
  16. {py_teststand-0.2.1 → py_teststand-0.2.3}/examples/workspace_create.py +105 -101
  17. py_teststand-0.2.3/graphify-out/.graphify_labels.json +1 -0
  18. py_teststand-0.2.3/graphify-out/.graphify_python +1 -0
  19. py_teststand-0.2.3/graphify-out/.graphify_root +1 -0
  20. py_teststand-0.2.3/graphify-out/.graphify_uncached.txt +153 -0
  21. py_teststand-0.2.3/graphify-out/GRAPH_REPORT.md +727 -0
  22. py_teststand-0.2.3/graphify-out/cache/ast/00300beaf41ddf8ca88a2133f315f9873877e388dfadf2343bc93ad9ec7189af.json +1 -0
  23. py_teststand-0.2.3/graphify-out/cache/ast/05547b7aeeb2f4a7f5f21a8e7104b9116d781c941b744c43b0ea6c82e21b5fdd.json +1 -0
  24. py_teststand-0.2.3/graphify-out/cache/ast/06511afc1a360b72ddc9b4497a994dca686aef3b97922cc8b80443403a4ddb83.json +1 -0
  25. py_teststand-0.2.3/graphify-out/cache/ast/09332e170176084c6344fec2f82b8e890d06f8e32680643e316246716bee53e3.json +1 -0
  26. py_teststand-0.2.3/graphify-out/cache/ast/0e7f3eedcff4a433a47611e1adf13860af5e6d16fbb6129fc48ddd8557aa1626.json +1 -0
  27. py_teststand-0.2.3/graphify-out/cache/ast/100f3021f37614916d64cfaf40b04fda8d1989d624d03d93a97ec6ca79bf17e0.json +1 -0
  28. py_teststand-0.2.3/graphify-out/cache/ast/167515af1cd986fa06cab9d7efa9f1feb18bc95e3c6de1dba854adafc7ae8ead.json +1 -0
  29. py_teststand-0.2.3/graphify-out/cache/ast/16fba3996eb41939497dbd0f426c599e4ebc1eb5a762d7e1ff143708e49e94dc.json +1 -0
  30. py_teststand-0.2.3/graphify-out/cache/ast/17fbd1888f87c0b6c099e7e88300cf58e26adda72cf2f2297fc1f0e6bd2e9257.json +1 -0
  31. py_teststand-0.2.3/graphify-out/cache/ast/1e4049e0856983245c1154127a97509e576a1fd14f3ea56d52f946878a535bae.json +1 -0
  32. py_teststand-0.2.3/graphify-out/cache/ast/1f9db61abe1368fa82aab9d8e1b27d97389172db6c78cc23abe03025876ebdd1.json +1 -0
  33. py_teststand-0.2.3/graphify-out/cache/ast/207fdd9cd514b05162cd7babd5d2252985853a11cdf847113056a5071e8377e3.json +1 -0
  34. py_teststand-0.2.3/graphify-out/cache/ast/22832c79316ab6a0c79a6bca80d9635ba80df2e2079ac114c354d43aec19f95c.json +1 -0
  35. py_teststand-0.2.3/graphify-out/cache/ast/29731b11c9bdce6c0524fbcf801177b2da8d3181efa44ab73832e8dc0ed442bd.json +1 -0
  36. py_teststand-0.2.3/graphify-out/cache/ast/29ae039e1d154e5d25fc8659bf1eb270830e4fec772f91f41bf1cb9744733674.json +1 -0
  37. py_teststand-0.2.3/graphify-out/cache/ast/318ebfed808e94269a07fb5136c60f910bf810ffa3bef5aa7c26c313519147df.json +1 -0
  38. py_teststand-0.2.3/graphify-out/cache/ast/3654ae6c52c3267b7a62b7697d69011bd6446dd3f6da9bc5b133da4c2efe7d6b.json +1 -0
  39. py_teststand-0.2.3/graphify-out/cache/ast/3a06bdbfe7f9ae5d627e941fdd9e616d0431a4f41b37c8f8d7b3f5751fcadb21.json +1 -0
  40. py_teststand-0.2.3/graphify-out/cache/ast/3ac8bb6902eda596ffe0f32f517fb6e567a34e52e76c4ccc682d7c7dcf65f06a.json +1 -0
  41. py_teststand-0.2.3/graphify-out/cache/ast/455df594e48e61d53c059f4ddad24e31e427232f4fe871e8ff384227350cc9ce.json +1 -0
  42. py_teststand-0.2.3/graphify-out/cache/ast/4c3d7045d901449868d2003d5529dd6f41d635c9e1ef1b1b8a0bee5e15aafc70.json +1 -0
  43. py_teststand-0.2.3/graphify-out/cache/ast/50c625a30e42a14c35d57d119aba7e16a17fa05fc60cb5ff961c61a77f6129d0.json +1 -0
  44. py_teststand-0.2.3/graphify-out/cache/ast/50d6499184d0d9889c9571e8f6b7b7def3329721be05cc10bbac13520f8eef37.json +1 -0
  45. py_teststand-0.2.3/graphify-out/cache/ast/523e956286ac13d37bfffa655ef1e83b1ecd17889caeae0ede6e99cb03c29e83.json +1 -0
  46. py_teststand-0.2.3/graphify-out/cache/ast/5254fe829c1a1554024b185254ce1177eaafa64b3ea72a0732abc7a205074b23.json +1 -0
  47. py_teststand-0.2.3/graphify-out/cache/ast/55cb312149a7885f52f272daaf0060fbdbd8e26dc67e79c7b15d94a32b750749.json +1 -0
  48. py_teststand-0.2.3/graphify-out/cache/ast/58191b4e65d5ba31195e59a1f244014669e52970d0bfe01bc99ab171f54e1c03.json +1 -0
  49. py_teststand-0.2.3/graphify-out/cache/ast/5a0a54d982fe112ff92a0263994062f4bf21f02c426b6936f257e80d02efabb9.json +1 -0
  50. py_teststand-0.2.3/graphify-out/cache/ast/5a8f8b728c901bfe909cccedbe276a221a7e0af456ebb26189774931eded5a74.json +1 -0
  51. py_teststand-0.2.3/graphify-out/cache/ast/6095cf8a05c742b2d126bfc1cb9064a3c3cae65911146f1c4d36e2d4f86f1680.json +1 -0
  52. py_teststand-0.2.3/graphify-out/cache/ast/6207dfec219a33509fc91cdd0055029c6b360a28fe282bee4bf489a4d45400d3.json +1 -0
  53. py_teststand-0.2.3/graphify-out/cache/ast/62602a326a616b0ef6a3ee96fdf794a5815d0a69babd77a9a85e68ba6599db60.json +1 -0
  54. py_teststand-0.2.3/graphify-out/cache/ast/64990a73d75b059ef41bfa7ffe5dc818e1e197e3509f3b568e7fec254760bdad.json +1 -0
  55. py_teststand-0.2.3/graphify-out/cache/ast/69e95bec750edd2374827041d52575a2c09051c1adb4b1eab17cb8dc9ed5ee9d.json +1 -0
  56. py_teststand-0.2.3/graphify-out/cache/ast/6be37bdd97101b62dc6fd786d39749426e719b5f9c0464ceb43cdfc63e56d5b0.json +1 -0
  57. py_teststand-0.2.3/graphify-out/cache/ast/715a84c56ee658f84a9b5930a0d01326da31d98b891e6ba0be647527f999167c.json +1 -0
  58. py_teststand-0.2.3/graphify-out/cache/ast/782afa626a4098a473fab0fb263ca59c59db1111372aa81c48944c3b8c95f491.json +1 -0
  59. py_teststand-0.2.3/graphify-out/cache/ast/7c6ac8a21f4385b56aeea01fee3766a0f9abbbc6f9a0590ea16325f235efcf20.json +1 -0
  60. py_teststand-0.2.3/graphify-out/cache/ast/7ceeb2d8df9a1700574716eeb32d72e4fd574ea02d01cb3e1e48e65df9c5003a.json +1 -0
  61. py_teststand-0.2.3/graphify-out/cache/ast/7db158ee49deabc6bb44403c7cde05504828d9e0ab9059b2630fc953bd81d93c.json +1 -0
  62. py_teststand-0.2.3/graphify-out/cache/ast/7e0aa14109be2807e6cab542dd82edba518e53ede3c664eb7224a8dfe651f469.json +1 -0
  63. py_teststand-0.2.3/graphify-out/cache/ast/7f546efb5963586a767ed1de189fdadacbe4ae8989478a5a66e5120052df625f.json +1 -0
  64. py_teststand-0.2.3/graphify-out/cache/ast/7fbf42c8c7d52f048579426d9da3dd81d5828c24c2321a3795fb3b7659b92a0c.json +1 -0
  65. py_teststand-0.2.3/graphify-out/cache/ast/80c3a5a1b8160107475d142a6135ddaf906da9307805f2e68ba8c3af04aa9882.json +1 -0
  66. py_teststand-0.2.3/graphify-out/cache/ast/81d4d752174e5a09b2ba32a01724629f16137270b7f0f098a5e66b6a1c689d18.json +1 -0
  67. py_teststand-0.2.3/graphify-out/cache/ast/85af66fc476055f4e450401935be1757b9d043099c0530a55edaaa9e8fc45b78.json +1 -0
  68. py_teststand-0.2.3/graphify-out/cache/ast/866b406c0825b3fd70dd6c7a0c04d67018b3701b14bf2658d5f05ebbfb134bb2.json +1 -0
  69. py_teststand-0.2.3/graphify-out/cache/ast/869ef8c9b4cfacfe7b568dedfac756cc52c7635bd951bacceb6f68930061e798.json +1 -0
  70. py_teststand-0.2.3/graphify-out/cache/ast/8e4e1c38e46c8daa3c97656d09feaa9fbb2f083b3401f9fbdf7fb53a87bb50f6.json +1 -0
  71. py_teststand-0.2.3/graphify-out/cache/ast/8ec0bfac79ec428f8e9bd6ef770eee33b0218601b0ada7b113da52b4a53ca6fc.json +1 -0
  72. py_teststand-0.2.3/graphify-out/cache/ast/92e467b0ca6f7256ca2bd57e96777a76d4cd15d574eb169a10d37c8c5737fb3d.json +1 -0
  73. py_teststand-0.2.3/graphify-out/cache/ast/93eb2741e82d5f2c723db19741da0ec90a516da435c2be2ce0c63fcf18a478af.json +1 -0
  74. py_teststand-0.2.3/graphify-out/cache/ast/95cb2ed2edc938dbc2eb71b8aeebaec57b8eaaf2229c8e7f4a1a702b36da6d36.json +1 -0
  75. py_teststand-0.2.3/graphify-out/cache/ast/95ede7cf79834cf530eb2332a0a7859f1f3b27cc246645cb88421aa0def23623.json +1 -0
  76. py_teststand-0.2.3/graphify-out/cache/ast/97aaf1b808af614b0985c5d9ea1196a794a2453b59c9bb81cac1561b29f9092f.json +1 -0
  77. py_teststand-0.2.3/graphify-out/cache/ast/9a710f33bcbf32f6281ef3199603286b84e3ead526791be3e5702cf19a10ba80.json +1 -0
  78. py_teststand-0.2.3/graphify-out/cache/ast/9cd2cffa72ed809a1541ad88bf92c541857c512b6e7fe07c5d9bb348a51c071a.json +1 -0
  79. py_teststand-0.2.3/graphify-out/cache/ast/9d06f4503bab33ea71454511db6e94b3a27c29ad650cc9cdbfd5b43138f476a6.json +1 -0
  80. py_teststand-0.2.3/graphify-out/cache/ast/a5369060fbe387a285b63275bb4e455f350efee2df2aa880f03b07ef8e64fe7c.json +1 -0
  81. py_teststand-0.2.3/graphify-out/cache/ast/a817b12b6f3c5a089ad11643f41230ba21f1987251b7a190b39cad4f485dabc5.json +1 -0
  82. py_teststand-0.2.3/graphify-out/cache/ast/aad95764364270f74a9a2b521a4eede3c4e63ec332fdb251f833610f46f62f9d.json +1 -0
  83. py_teststand-0.2.3/graphify-out/cache/ast/ad28df2f2e8bc652a77cead6d657c2aed9fb644428bbd3e2c69d3b21790b6405.json +1 -0
  84. py_teststand-0.2.3/graphify-out/cache/ast/aed3d23a58b420ee0328b3bbab000572b8891d72ffb6232c3cf8b807241fe903.json +1 -0
  85. py_teststand-0.2.3/graphify-out/cache/ast/aef7fe4c9cedf564455aa029d6cc89b79b56a532d04a56a8d092808c0ad4e5b1.json +1 -0
  86. py_teststand-0.2.3/graphify-out/cache/ast/b4476bcd1991a5a30b1ac3f78801025d2928cd8c77db07730551b0815ce13c36.json +1 -0
  87. py_teststand-0.2.3/graphify-out/cache/ast/b470e846ba2a52d4e0763ff5739d1528d1b86974dd79c08358ceb33076790e76.json +1 -0
  88. py_teststand-0.2.3/graphify-out/cache/ast/b6420f0dfb5e0f15c42fa9170634d6c2b3d0409749b00ffd3c9364246d88d790.json +1 -0
  89. py_teststand-0.2.3/graphify-out/cache/ast/b647bffb0af3f94c4df75171f311ece530c6def16132a3a33f4b7deff6dd707a.json +1 -0
  90. py_teststand-0.2.3/graphify-out/cache/ast/bafd5076a18391e489c5133abd6aa6032cec2783626bbd8a84381b7896f21c9d.json +1 -0
  91. py_teststand-0.2.3/graphify-out/cache/ast/bc630d1d2d79d48a0c7441c1081f97933ae9bc733733a7918a4cf498fa61b981.json +1 -0
  92. py_teststand-0.2.3/graphify-out/cache/ast/be985fcfeb455e3d468126f1c7b65b4ab84b57c743118ef4ac021a88973dd155.json +1 -0
  93. py_teststand-0.2.3/graphify-out/cache/ast/bece45eb021b6454fcf8a9cf294536c7752f817beb12c90d65e0c21afe57a5a1.json +1 -0
  94. py_teststand-0.2.3/graphify-out/cache/ast/c3e028aefdbe3e462d7f676938ae48c428b44031e7c4ef34fb4686904e97b3c8.json +1 -0
  95. py_teststand-0.2.3/graphify-out/cache/ast/c7d3603bbe7edfbcfecc3a1b09bdd2307209be3fc7978fea7bfb7685c91b08d7.json +1 -0
  96. py_teststand-0.2.3/graphify-out/cache/ast/c9457b843ef85e899bfd9352d67f73980b1a2304cceb01e992440ffdd3d0eb5c.json +1 -0
  97. py_teststand-0.2.3/graphify-out/cache/ast/d6200254d8034d573eb3b6bd33d39d7efddaa5fdf60a61453789e61853f03489.json +1 -0
  98. py_teststand-0.2.3/graphify-out/cache/ast/d7bd2958a25f99487597175b812cc96293a1342810f5076c4a92a1506fba2599.json +1 -0
  99. py_teststand-0.2.3/graphify-out/cache/ast/db25c8d58f8689825c0d89e5ebb3ca93542b2dafa228fde7285dcd9565ccb552.json +1 -0
  100. py_teststand-0.2.3/graphify-out/cache/ast/ddaaecef88ef58b3207db5b55d5bbd8d91421cd99a49941482368f626cc28b9d.json +1 -0
  101. py_teststand-0.2.3/graphify-out/cache/ast/df9ffa69edbeaabf967cd706016a4c97e6f9ffc41c5e38ad327fde2d452ddd3e.json +1 -0
  102. py_teststand-0.2.3/graphify-out/cache/ast/e2eafeb868d33a2e19815315d4cfe04eaba57e9fa7835ec2a8f35b0ddffa3498.json +1 -0
  103. py_teststand-0.2.3/graphify-out/cache/ast/e8c2aff5248d3d761f3f8175e68f1ff46704c934465ccca6d284d40eeb54ae87.json +1 -0
  104. py_teststand-0.2.3/graphify-out/cache/ast/e992bfbfd3c2b33a9dac8499d800f5fcc3d7c33d8d84f90eb705bbd780a32b32.json +1 -0
  105. py_teststand-0.2.3/graphify-out/cache/ast/ea02b9cc1c110994d38e9aa28b9e4fdf49c7b0e074809f09760f068bc41dc7f8.json +1 -0
  106. py_teststand-0.2.3/graphify-out/cache/ast/edbe4c5e6076cc2c119ccec658be0196128b8742a9d640cb9cdf7d79aa622304.json +1 -0
  107. py_teststand-0.2.3/graphify-out/cache/ast/f2c65b378401d4e854bb4d18bc4396419ca74dc8c84a5a8d57f4074baeeeb63f.json +1 -0
  108. py_teststand-0.2.3/graphify-out/cache/ast/f5a620cd0622f180ea799f73823c099958513ca86ff822d9fc45f73b106b35c4.json +1 -0
  109. py_teststand-0.2.3/graphify-out/cache/ast/f649350396b8f14e079a1646de95a5e490c709748fcd989a603afad3a7044898.json +1 -0
  110. py_teststand-0.2.3/graphify-out/cache/ast/fe209b7393dc29439e121809022e793527d4208c2957d479e9f0706d4ba357e0.json +1 -0
  111. py_teststand-0.2.3/graphify-out/cache/ast/fe674973c21bca43da88fbeadc8361422a28aeb4d9eaca2db7d40f99a04d5608.json +1 -0
  112. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/stat-index.json +1 -1
  113. py_teststand-0.2.3/graphify-out/graph.html +305 -0
  114. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/graph.json +56389 -136232
  115. {py_teststand-0.2.1 → py_teststand-0.2.3}/pyproject.toml +8 -5
  116. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/__init__.py +366 -320
  117. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/adapters/activex.py +657 -657
  118. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/adapters/adapter.py +18 -24
  119. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/adapters/cvi.py +14 -14
  120. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/adapters/dll.py +19 -19
  121. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/adapters/dotnet.py +44 -38
  122. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/adapters/htbasic.py +2 -2
  123. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/adapters/labview.py +1592 -1582
  124. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/adapters/labview_nxg.py +67 -57
  125. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/adapters/python.py +2 -2
  126. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/adapters/sequence.py +372 -367
  127. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/analyzer/analysis_utilities.py +1 -1
  128. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/analyzer/rule.py +1 -1
  129. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/analyzer/rule_configuration.py +6 -2
  130. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/core/com_wrapper.py +235 -234
  131. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/core/engine/__init__.py +189 -189
  132. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/core/engine/engine.py +3275 -3273
  133. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/core/engine/enums.py +833 -833
  134. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/core/exceptions.py +292 -292
  135. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/core/external_report_viewers.py +1 -1
  136. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/core/file_information.py +2 -2
  137. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/core/images.py +4 -4
  138. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/execution/execution.py +940 -940
  139. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/execution/output_record_stream.py +5 -5
  140. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/execution/sync_manager.py +61 -61
  141. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/execution/thread.py +5 -5
  142. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/execution/watch_expression.py +187 -187
  143. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/ext/events.py +4 -4
  144. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/ext/step_types.py +3 -3
  145. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/messaging/output_message.py +2 -2
  146. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/messaging/output_messages.py +63 -63
  147. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/messaging/ui_message.py +1 -1
  148. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/property/property_object.py +1327 -1328
  149. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/property/property_object_file.py +1 -1
  150. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/sequence/code_template.py +68 -63
  151. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/sequence/expression.py +10 -10
  152. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/sequence/location.py +24 -24
  153. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/sequence/sequence.py +553 -553
  154. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/sequence/sequence_context.py +11 -11
  155. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/sequence/sequence_file.py +464 -461
  156. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/sequence/step.py +1243 -1243
  157. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/sequence/step_type.py +23 -24
  158. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/station/search_directories.py +127 -127
  159. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/station/station_options.py +17 -17
  160. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/ui/application_manager.py +13 -13
  161. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/ui/button_ctrl.py +8 -8
  162. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/ui/checkbox_ctrl.py +4 -4
  163. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/ui/combobox_ctrl.py +158 -158
  164. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/ui/command.py +256 -256
  165. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/ui/connections.py +2423 -2423
  166. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/ui/entry_point.py +81 -81
  167. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/ui/events.py +548 -534
  168. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/ui/execution_view_manager.py +12 -12
  169. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/ui/expression_edit_ctrl.py +477 -477
  170. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/ui/label_ctrl.py +4 -4
  171. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/ui/list_box_ctrl.py +261 -261
  172. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/ui/listbar_ctrl.py +4 -4
  173. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/ui/menu_item.py +4 -4
  174. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/ui/report_view_ctrl.py +2 -2
  175. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/ui/sequence_file_view_manager.py +12 -12
  176. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/ui/sequence_view_ctrl.py +8 -8
  177. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/ui/status_bar.py +240 -240
  178. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/undo/undo_item_creator.py +3 -3
  179. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/undo/undo_stack.py +6 -6
  180. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/workspace/workspace_file.py +2 -2
  181. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/workspace/workspace_object.py +4 -4
  182. {py_teststand-0.2.1 → py_teststand-0.2.3}/tests/integration/test_examples.py +156 -156
  183. {py_teststand-0.2.1 → py_teststand-0.2.3}/tests/integration/test_property_object_serialize.py +117 -117
  184. {py_teststand-0.2.1 → py_teststand-0.2.3}/tests/test_core.py +118 -118
  185. {py_teststand-0.2.1 → py_teststand-0.2.3}/tests/unit/core/test_errors.py +75 -75
  186. {py_teststand-0.2.1 → py_teststand-0.2.3}/tests/unit/test_core_mechanics.py +90 -90
  187. {py_teststand-0.2.1 → py_teststand-0.2.3}/tests/unit/test_lifecycle.py +148 -148
  188. py_teststand-0.2.3/tests/unit/test_public_api.py +52 -0
  189. {py_teststand-0.2.1 → py_teststand-0.2.3}/uv.lock +10 -28
  190. py_teststand-0.2.1/PKG-INFO +0 -160
  191. py_teststand-0.2.1/README.md +0 -124
  192. py_teststand-0.2.1/graphify-out/.graphify_labels.json +0 -169
  193. py_teststand-0.2.1/graphify-out/.graphify_root +0 -1
  194. py_teststand-0.2.1/graphify-out/GRAPH_REPORT.md +0 -657
  195. py_teststand-0.2.1/graphify-out/graph.html +0 -305
  196. {py_teststand-0.2.1 → py_teststand-0.2.3}/.gitignore +0 -0
  197. {py_teststand-0.2.1 → py_teststand-0.2.3}/.markdownlint-cli2.jsonc +0 -0
  198. {py_teststand-0.2.1 → py_teststand-0.2.3}/.python-version +0 -0
  199. {py_teststand-0.2.1 → py_teststand-0.2.3}/LICENSE +0 -0
  200. {py_teststand-0.2.1 → py_teststand-0.2.3}/examples/execution_run_subsequence.py +0 -0
  201. {py_teststand-0.2.1 → py_teststand-0.2.3}/examples/station_options_update.py +0 -0
  202. {py_teststand-0.2.1 → py_teststand-0.2.3}/examples/users_manage.py +0 -0
  203. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/0041043937ad3008273915d37b7f4b2d48ca2c4612d45ae3f8cd0cb931b90f9f.json +0 -0
  204. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/021c67591ed36baaccec5597b1aaa5da45a3d107860151d0c14da8d8e82d13fe.json +0 -0
  205. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/023707fc22c5dae0fe050b058cef36e8166178bd19bf64c19d1d5769193e0b66.json +0 -0
  206. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/040ee1db9c6b7f496603e954cded103cc0a695fdff0107104d1971e6bd77fa80.json +0 -0
  207. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/05037a9ec557a4372515feea0cb82e6b8112ac7c5e298565964fbd270f96bb55.json +0 -0
  208. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/0524858e50a4d2f7d2ac92c57ca3c87df637bf4c3158c7092a413e4393c857a4.json +0 -0
  209. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/0561a3660d3619ac6a5591c0657208ef1151afc18df8f2fd6f97de8670d8eb60.json +0 -0
  210. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/057056cc111fdb36b69e58f64079572f5c47872e0727d1ad3dfc0f35e7d39a4f.json +0 -0
  211. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/057e562996ba53b27fd80676787dca1563c48de754f9cd7932562ae64c3b5489.json +0 -0
  212. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/064e97d62db5d77399540dec673d05b900a3e29224bb4e45bc3e879729f20003.json +0 -0
  213. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/06c31bd2b14400097f1e5123a6f39525ba4c4e5e2a5e7ff4c38a43b224d20a0d.json +0 -0
  214. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/070c095dddd2f798973cbb1332d344bf81370ea5a6eda28e88b1f7a27ef6c709.json +0 -0
  215. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/094e59f0e4cdb42feca81333bf3bf014eca76ad887ef1490483f798c17d40cd5.json +0 -0
  216. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/0aec586f84490fed93173f8a2200485ceffc529450740dcf5edbe12a7d89f781.json +0 -0
  217. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/0af23434a97b56cbda3aaf2de520ee9e18a629be0ef406a90dac45260481c1bf.json +0 -0
  218. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/0bd90bc4c1dd73076d8627f6ea7be67faaf504d30221b1dce45cb1c443755fb5.json +0 -0
  219. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/1051e1923497524696fb7fa1b71ba3a9d3cf12ec8519b1e8209d9d5eac717990.json +0 -0
  220. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/1086f0d1446ee0d57fc4c325f3828ff783e328ced88aac13b45f718161499e53.json +0 -0
  221. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/10fe404eb03263a768b27a2e92b2fe20e33cda3eab265a84860286430be0a49b.json +0 -0
  222. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/13bdd9d4f7de5ab5fbb955890067eb3772a2302e014480243ae141a4eee8b4f7.json +0 -0
  223. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/17de4e480542b25d6f2a11461ae4f41a6282c3ecbeb3619b0b42fdbb7f31939c.json +0 -0
  224. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/1d601091a3312ce89ddc9523bffccf41742eb6ea1223a6b4f751c210ffce1fb4.json +0 -0
  225. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/1e4d42449081955231608e3fa48b5c3102243d55a80e9064b88440669ed821b2.json +0 -0
  226. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/1f727c948a41c946dd0aa376993d5620f226497d49404c03b3c175d057b4ab29.json +0 -0
  227. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/1f7c2be5abf85169f9c409d39e58419418193281eeb391dc3ec0d1f6784f40dc.json +0 -0
  228. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/2165f2f41684c71dbce5e6edf7262786c5aa8518828e00e2a4dce75492f53aa3.json +0 -0
  229. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/22e04e79d7912eb1b7e3bca68279f3fa7e2936b3d2706fcdf688fff96f7c30c8.json +0 -0
  230. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/252d1adbbb189a3636432d8de48b5ed7c8d1f185c5ea46ceb616071960b1be42.json +0 -0
  231. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/25ab62b76a5f58693d5161dabf0a58862a7d6d5e9b054cc2347ffb79d4468f65.json +0 -0
  232. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/2b7f894857506a93df04568d3bc252c6883ac4010ba64b49a8c13c9cd06330ca.json +0 -0
  233. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/2bbb54bb8f3b91b33e7e872ea5e2b129079a60fe8284b8dd8bf5488b2f76b55d.json +0 -0
  234. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/2d70a40698b885cb7705c0d57922dfc922ef6b90e9a4580935d170395bc51a6e.json +0 -0
  235. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/2ddf8f9e5aa81db1e984bd5812d91143f64ab806a7b5676d6e7f23d1d08f677f.json +0 -0
  236. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/3289a80010b6c0faed89308018fa31f7031f27ae0d853299443c23ba8a4d6e6b.json +0 -0
  237. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/3312f8a2eccbfd08fabdba5d2af656bfbcb95e5b7e5390abf35ad5140759a710.json +0 -0
  238. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/35d6fee40fd65a1c224aa8320fbd8ef959f6975b16cc89fc2cfbb3c1b4e95641.json +0 -0
  239. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/37cb92f2f6a01d4862632405ced4934cc003818147fd14ea9a636bc7336d3af1.json +0 -0
  240. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/3ace387692703afd7ecab2396d8eb8b3dc6411c0931ebf68ff5370013c707fa9.json +0 -0
  241. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/3b65d0f842b856818ed2510234a106990e02450d60aed9075cc4c9f4b14101bc.json +0 -0
  242. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/3b90f45c585a53b5f55ef2c3761eef4b97fcef1eb344f9a4819c989b174b52e5.json +0 -0
  243. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/3cf920bfdd765673b964deab1cf13959604b7648091d4c58209f818cc3fede98.json +0 -0
  244. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/3d97defd459d93180b984ca62794c47f1da9a8dc105175bfc1d8948fc8dc3f29.json +0 -0
  245. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/4096008e37ad33f487fa031012fdc7f354edbb3e2c3d82eeeae616e8e1ae75fa.json +0 -0
  246. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/4278f99739c7c54475247d2cfb57eda95ad3cc39d7bbaf04729c04932d9fef12.json +0 -0
  247. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/44963597cd3ea0c48e79c9aeb4e7838f1faa5bcde319b7ff81b29aa6549d551f.json +0 -0
  248. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/49e757465d8e83eb1ea11482682a0dc9bf8dd399847c883954925749ad6470c2.json +0 -0
  249. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/4e9f3dd260b769260bab0fd12ca46ae6b3b17221c6968fed8b7907173b05fc2d.json +0 -0
  250. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/519a945f4a84c930588f887f3b23f13102ea6138645d177cef5f98b7b91e6229.json +0 -0
  251. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/531a38ee0ed1035f37eecda69c27f43d9a0ecd6fea2fc6127c3a3318f5f06dad.json +0 -0
  252. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/535082e7e072de1deb460d4d58ba560c76f4c0ffdba7836846c3699d4c47fc5a.json +0 -0
  253. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/563deb73b3327340c242a025beeca43321716dfbcea23fac9c89875d67a08f72.json +0 -0
  254. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/584d486255b4cee316ca9e6e3656c989d600ac403ccf01bdb3d548606678b17b.json +0 -0
  255. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/589dad68071e187dbb2fbbaa04d83c88bf219f7d428bfe1aa5a1ff7dbf023a23.json +0 -0
  256. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/5a4e9b332727fe6e94e1548fb31f14aef41966f5ead08e7dde780b02d60148f5.json +0 -0
  257. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/5bd0ff70a33bedbee8d278646e92ab57e29a43867cd60e7fb918508833117b56.json +0 -0
  258. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/5c088e2c173f3f6dd18f3df4cd20a198a76d4d5da9db7f8b749b55ea97210f05.json +0 -0
  259. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/627d8be024734a3d490521cd423e9db4c50870f3ca6ac761e75f86ea55eb9491.json +0 -0
  260. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/62ace6fa362a937c7d2e645eea0192df37d1de5fc0fcc9f0a16f708b74ecd48a.json +0 -0
  261. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/6464e2cd097df4628226ba38836dd4d55ea4b97dba4dd952e1a34c84fa00e914.json +0 -0
  262. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/6469622a3449ce827fd414b465085e38a53133a20024b6c30e13c6fab1cbd06e.json +0 -0
  263. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/68806e21c83d8f6bb9b7deaf161a26e2543fb6a6052839b92fd229c44de4785d.json +0 -0
  264. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/689e2aa834fc2b6c42e3a6ad0c9b2a9060d968a9a8dd8d1c47be911b5a7347c6.json +0 -0
  265. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/6a583adb3c041e3e49886b4b96a73494fdb8c677ac28463c037845ba616348a3.json +0 -0
  266. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/6b39e36d9b59b214516369764a7c635e8b6af335c69fd2ab4fbd3be0aa12f539.json +0 -0
  267. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/6bae4a41d4b3c584b87f6e963948951164f820ba2f77065856e93fa5fb77da4f.json +0 -0
  268. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/6d775401047dd566d5fcab422fdb64798fc85eef1ccd9444c43376314a7e81ba.json +0 -0
  269. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/6e8481e9dad0e6c1793e5f6ccbbf1dfb5ba88a09fb9e326425df6bf3b5b10e33.json +0 -0
  270. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/70ac455c2976654f81e4ada2accbeb9a0ed097e513ee641a1767038b60f3d058.json +0 -0
  271. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/73190900d1852a833a8e0c0cc86f2a1083d4b3ffcdd36ccf239bf3fefe2be9b9.json +0 -0
  272. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/731a07b1575dc21af660051d44974822d16d4d07e0ff8c959f3e7971c16e9a7a.json +0 -0
  273. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/73ee87e06204f3346bd71d9107d89a9171428bacf3611019cdfcfd4aef224acb.json +0 -0
  274. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/73f5451927075637af3c96c14efec5d69b6da496baee2dc759048edc9b12c232.json +0 -0
  275. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/74c85d86a6d8483900d3fa46e3dd606f54d64af4ae6e5b75421fe1c6788b3c60.json +0 -0
  276. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/77cefb8a568e79bbbf5ea2f16eca5b1dedef30fde3405aab81eec97baf84f827.json +0 -0
  277. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/79ce979e77967e52a44d8579c4303ab655f65ad9bc258c3bd96c3dd7305cae06.json +0 -0
  278. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/7d5f935bff18ec87a6c7a089cd08c4d89cc922a0e020c1fb1b57f13ed586358c.json +0 -0
  279. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/7dc6b1a6affc2de030eaa790e0826a3797ed82b2f5e6df1481df872f1f511e9e.json +0 -0
  280. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/81a280d2907246e14a57096449e036eb0363da6f0074ecedf14879d6f09a826c.json +0 -0
  281. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/82cad94a35ab2d431beb0f15d5d13decd59ab65525dfc802995ddc7fbacedc21.json +0 -0
  282. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/83d57f81198fde4ad8a03bbe0f9d80058eb82724505cb31283206d38486285cc.json +0 -0
  283. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/85c074209d24896e542e425b1fb9fad5d2704db1286e406b25fbe2a9e1c62ac8.json +0 -0
  284. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/86332e56e1d088488a3378a8ffb47b13abb39e8c81cdeb5f1d546a14a5d4e03f.json +0 -0
  285. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/8b4f66ce9958d1bb4077dfe1d0e4df2f7f4642a838714dbc93316dc3c8523534.json +0 -0
  286. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/8b9eaad4dfb5c0936cebcafde3c3b368c71c5c2e7f4fbc282c887051e25567e5.json +0 -0
  287. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/8e73cca8cf7e6238b5a9e4a46b62d2cf8968fb9e071c8ff8e21a55b1cbb1cd46.json +0 -0
  288. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/8f1414450de85a7ca36b1c4508c946084f9eaa83eee74f709dd09ebb7fc9e773.json +0 -0
  289. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/9811147e5abebc52edff502471a40f369ee1329e9f029ef3258976404f06a8f9.json +0 -0
  290. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/98270c04210ce70f7197fd3c1df74140159aed78f3d6b0c736b9fd1de4309b68.json +0 -0
  291. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/98f967e9230b612cb641244c969d3461874f40a74d00096217c05b4ca3cc5163.json +0 -0
  292. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/9cce4a16b043c387789e0867504b51418b27f557bf5874111ac917bde8e0b109.json +0 -0
  293. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/9d3d1aee5a15a733c47dd04fdb5943d68a49f8ce13d67b05bc0a14497328f58d.json +0 -0
  294. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/9d440f60091a4f93dcf1d78367e2c71755a3acdfe8844a1b5f756a235b763488.json +0 -0
  295. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/9fd47dbb9db188abce18b1f3063253323bca0327c3362dbe36ee49250e348d54.json +0 -0
  296. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/9fe051f8082e371f9df5f940b8f071800623a9ad5b40755285095658d8f28b5a.json +0 -0
  297. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/a06be12e9602b3b595742d0cad924633191314032eaf6acaba75ae02c60a9811.json +0 -0
  298. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/a67e0d0fc7ebb86fc0e08ddc07be6131e22b253ad50fb36935e7901dec5977b7.json +0 -0
  299. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/a86964aa1cbd83641808a11c8ec3231008bae1345219c2a5646e36a8e06599a5.json +0 -0
  300. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/a93efc87b8b26bb8e00bc3bb298aedd3d7ac45ceb950802398d2414bbf47c0dc.json +0 -0
  301. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/aa76182d9de824910acfbbfc5ea8f46681debd787c018927147e47b85f056e8e.json +0 -0
  302. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/ac62f874e909973d6a406359c3a3331861f7775ce15427c629754984e6c2bc59.json +0 -0
  303. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/acf05ae7385ed2c7fc6639333fe802f06a0ae3b54b7dc2704234673a41328154.json +0 -0
  304. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/ad228703c7b568b72aee72ca2c50dc043ba963295abff15d0f2eced3379378dd.json +0 -0
  305. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/ae24c1a5d0d0a7e29eec5c4f95e19009825ded2c622d288ba63e6b25de7524b5.json +0 -0
  306. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/aedd4475f0cf7c73ea7553423af3f920eb19c3efa9eb2f8a611f6e898dfe2a44.json +0 -0
  307. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/b079373b22270ed561a40ead88df318a0b3cd52b143607c34f7340508f6e390e.json +0 -0
  308. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/b15b8672daa3f5df56cc7f97ee8294dd2d23b975dc9e34256c69726676be3daa.json +0 -0
  309. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/b5a337d95da18b2c918d1be090cf235c67a7a09cd60f23033e8c570fa8dbb748.json +0 -0
  310. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/b60d2e0d59f626d9ff57d7230795b09be357a37343d0d2c0d1ca958a1857d8bd.json +0 -0
  311. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/b710a0414f46ecb976cc66ac059d3a74dbd64d0bf8f1116de968837e581b6422.json +0 -0
  312. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/b73436f8a0e225ea354ec4ad7993c5d5887b7227f7545e2ead47ac03ccc082cd.json +0 -0
  313. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/ba1fcae5bd482a5ee1095215721f18a5951393e75bb88a9df1b3e1922e2202ef.json +0 -0
  314. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/ba646e84c605179808ec987d421f534a1c4af669a910fdd1ac75bad73d8b587e.json +0 -0
  315. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/be18c3a11472b8d81adfe9761be1ff309c93c04be3f69d56638efb019757f8f7.json +0 -0
  316. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/c018635d30a0f5436fc124a28ca204b8199b2dcec3335147150e0d34b9e1f82a.json +0 -0
  317. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/cb761115d0ed359fc4e55ad0c40245352cc091c68e5171ac20ef5e6d9d9832d1.json +0 -0
  318. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/cc658b209eeaf4c9249998a1534cefdf6837ce3a7de82fc62202102fe09957a2.json +0 -0
  319. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/cd2ce8667e344c6769096140ab1e4d9829ba2424eb9bdb65dee55f09469fecc8.json +0 -0
  320. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/cd8ce55adda67b165bf6272936d26dc172ba4d7a5fbfa4d5142181855c40f02d.json +0 -0
  321. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/cecb346166b599b5343dad969681c67168e5130e3a4018ee8fc903efc273fe04.json +0 -0
  322. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/ced68cd7e814d7774ffbdc161d16335221561854b99e12f107671e17337504b1.json +0 -0
  323. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/d08762a2d53ea94992d179f3affdd360ad2d58277024715af643374e65e62606.json +0 -0
  324. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/d48e2ae9efb9c635d241fe4f1d65e0ec51c9ac3740c29a0db58e3bcccc0e2466.json +0 -0
  325. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/d54b3634353a29d5fc12e6ccc72ca587a9b2676489bf893524c004d4afdefa51.json +0 -0
  326. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/d8ad7e776fd4b3708759b004e7ed524ff77a988d48237e5d357dc99a9a3bb79d.json +0 -0
  327. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/d9dd2631fda1b4480019731d75b0a908a057084bc22ad2ca66a2c381b86e0a38.json +0 -0
  328. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/dd430a8b0bc073c8deb7e7be1ca766292097b47301797452810293d73d53ff70.json +0 -0
  329. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/e1713cdd15edde27fe7f01c40841ee3ede0d411e350e2b31b9e8b5b2f9ce6feb.json +0 -0
  330. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/e5581298f1ebdbc113077df91f6215a07ddde68e9a45c01035f87d241062abd2.json +0 -0
  331. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/e5dcdfd16046923e879eb93db75c0df5067b2859f57259df63cdcce61ef2c03e.json +0 -0
  332. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/e5e9a12f89839a814832a5d5c375d4f6da3f81197790d2d52467fca122f43fd8.json +0 -0
  333. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/ef396e2cc36a574a59a95bf95caae976ec92698d1b43a1fdca8e7a20609d6aa3.json +0 -0
  334. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/f1607b2d6749b8e2f1b21e6985fa4da4077d01500b190e20b3d4ac89c8cd0e69.json +0 -0
  335. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/f68a4af4ef4d24cc0416195c9b123d0cb4f6811c08554914866d4a86835dab24.json +0 -0
  336. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/f9ee28f629cd46d9b44cdd1dfa64aadb0231af8002093266902d90e1f2f9fc88.json +0 -0
  337. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/cache/ast/faabe069e0568dabcc65124f0fa7d56e3ddfadf62523fc3f208ee4ad11c46f8d.json +0 -0
  338. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/manifest.json +0 -0
  339. {py_teststand-0.2.1 → py_teststand-0.2.3}/graphify-out/merged-graph.json +0 -0
  340. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/adapters/__init__.py +0 -0
  341. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/analyzer/__init__.py +0 -0
  342. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/analyzer/analysis_context.py +0 -0
  343. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/analyzer/analysis_message.py +0 -0
  344. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/analyzer/rule_setting_values.py +0 -0
  345. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/analyzer/types.py +0 -0
  346. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/core/__init__.py +0 -0
  347. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/core/search.py +0 -0
  348. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/core/utility.py +0 -0
  349. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/execution/__init__.py +0 -0
  350. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/execution/additional_results.py +0 -0
  351. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/execution/breakpoint.py +0 -0
  352. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/execution/database_options.py +0 -0
  353. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/execution/edit_args.py +0 -0
  354. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/execution/interactive_args.py +0 -0
  355. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/execution/report.py +0 -0
  356. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/execution/result_log.py +0 -0
  357. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/ext/__init__.py +0 -0
  358. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/messaging/__init__.py +0 -0
  359. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/property/__init__.py +0 -0
  360. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/property/array_dimensions.py +0 -0
  361. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/property/data_type.py +0 -0
  362. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/py.typed +0 -0
  363. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/sequence/__init__.py +0 -0
  364. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/sequence/step_group.py +0 -0
  365. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/sequence/type_palette.py +0 -0
  366. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/station/__init__.py +0 -0
  367. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/ui/__init__.py +0 -0
  368. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/ui/insertion_palette.py +0 -0
  369. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/ui/styles.py +0 -0
  370. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/ui/variables_view_ctrl.py +0 -0
  371. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/undo/__init__.py +0 -0
  372. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/undo/undo_item.py +0 -0
  373. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/users/__init__.py +0 -0
  374. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/users/user.py +0 -0
  375. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/users/users_file.py +0 -0
  376. {py_teststand-0.2.1 → py_teststand-0.2.3}/src/py_teststand/workspace/__init__.py +0 -0
  377. {py_teststand-0.2.1 → py_teststand-0.2.3}/tests/__init__.py +0 -0
  378. {py_teststand-0.2.1 → py_teststand-0.2.3}/tests/conftest.py +0 -0
  379. {py_teststand-0.2.1 → py_teststand-0.2.3}/tests/integration/_ui_message_stress.py +0 -0
  380. {py_teststand-0.2.1 → py_teststand-0.2.3}/tests/integration/test_api_compatibility.py +0 -0
  381. {py_teststand-0.2.1 → py_teststand-0.2.3}/tests/integration/test_memory_leaks.py +0 -0
  382. {py_teststand-0.2.1 → py_teststand-0.2.3}/tests/integration/test_ui_messages.py +0 -0
  383. {py_teststand-0.2.1 → py_teststand-0.2.3}/tests/unit/__init__.py +0 -0
  384. {py_teststand-0.2.1 → py_teststand-0.2.3}/tests/unit/adapters/test_activex_adapter.py +0 -0
  385. {py_teststand-0.2.1 → py_teststand-0.2.3}/tests/unit/adapters/test_dotnet_adapter.py +0 -0
  386. {py_teststand-0.2.1 → py_teststand-0.2.3}/tests/unit/adapters/test_labview_adapter.py +0 -0
  387. {py_teststand-0.2.1 → py_teststand-0.2.3}/tests/unit/adapters/test_python_adapter.py +0 -0
  388. {py_teststand-0.2.1 → py_teststand-0.2.3}/tests/unit/analyzer/__init__.py +0 -0
  389. {py_teststand-0.2.1 → py_teststand-0.2.3}/tests/unit/analyzer/test_rule_authoring.py +0 -0
  390. {py_teststand-0.2.1 → py_teststand-0.2.3}/tests/unit/core/__init__.py +0 -0
  391. {py_teststand-0.2.1 → py_teststand-0.2.3}/tests/unit/core/test_engine.py +0 -0
  392. {py_teststand-0.2.1 → py_teststand-0.2.3}/tests/unit/core/test_enums.py +0 -0
  393. {py_teststand-0.2.1 → py_teststand-0.2.3}/tests/unit/core/test_expression.py +0 -0
  394. {py_teststand-0.2.1 → py_teststand-0.2.3}/tests/unit/core/test_property_object_file.py +0 -0
  395. {py_teststand-0.2.1 → py_teststand-0.2.3}/tests/unit/core/test_sequence.py +0 -0
  396. {py_teststand-0.2.1 → py_teststand-0.2.3}/tests/unit/core/test_sequence_file.py +0 -0
  397. {py_teststand-0.2.1 → py_teststand-0.2.3}/tests/unit/core/test_step.py +0 -0
  398. {py_teststand-0.2.1 → py_teststand-0.2.3}/tests/unit/execution/test_database_options.py +0 -0
  399. {py_teststand-0.2.1 → py_teststand-0.2.3}/tests/unit/execution/test_execution.py +0 -0
  400. {py_teststand-0.2.1 → py_teststand-0.2.3}/tests/unit/sequence/test_sequence.py +0 -0
  401. {py_teststand-0.2.1 → py_teststand-0.2.3}/tests/unit/sequence/test_sequence_file.py +0 -0
  402. {py_teststand-0.2.1 → py_teststand-0.2.3}/tests/unit/test_com_contract.py +0 -0
  403. {py_teststand-0.2.1 → py_teststand-0.2.3}/tests/unit/ui/test_events.py +0 -0
  404. {py_teststand-0.2.1 → py_teststand-0.2.3}/tests/unit/ui/test_execution_view_manager.py +0 -0
  405. {py_teststand-0.2.1 → py_teststand-0.2.3}/tests/unit/ui/test_sequence_file_view_manager.py +0 -0
@@ -225,3 +225,9 @@ Prefer extending this facade over deep imports in user-facing code and examples.
225
225
  Use a local, gitignored scratch area for discovery scripts and throwaway state;
226
226
  keep the repository root clean. Never hardcode a scratch path into shipped library
227
227
  code or reference it in docstrings.
228
+
229
+ ## Testing Guidelines
230
+
231
+ **Always run live tests after making changes.** To ensure that modifications to the codebase (especially those interacting with COM wrappers and memory management) do not introduce regressions or memory leaks on the live engine, always run the full test suite including live engine tests:
232
+ `uv run pytest --run-teststand-engine`
233
+
@@ -0,0 +1,8 @@
1
+ # GEMINI.md
2
+
3
+ This file directs Gemini (Antigravity) and any other AI coding assistant working in this repository.
4
+
5
+ **CRITICAL INSTRUCTION:**
6
+ You must **always** read and strictly follow the guidelines, architectural rules, and project-specific memory stored in `CLAUDE.md`.
7
+
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.
@@ -0,0 +1,310 @@
1
+ Metadata-Version: 2.4
2
+ Name: py-teststand
3
+ Version: 0.2.3
4
+ Summary: Community object-oriented Python 3 bindings for the National Instruments TestStand™ COM API
5
+ Project-URL: Repository, https://github.com/TheDomcio/py-teststand
6
+ Project-URL: Issues, https://github.com/TheDomcio/py-teststand/issues
7
+ Project-URL: TestStand™ API Reference, https://www.ni.com/docs/en-US/bundle/teststand-api-reference/page/tshelp/teststand-api-reference.html
8
+ Author: Dominik Rajchel
9
+ License: MIT
10
+ License-File: LICENSE
11
+ Keywords: automation,com,manufacturing,national-instruments,ni,python,pywin32,scripting,station-provisioning,sugaring,test-automation,teststand,windows
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: Intended Audience :: Manufacturing
15
+ Classifier: License :: OSI Approved :: MIT License
16
+ Classifier: Operating System :: Microsoft :: Windows
17
+ Classifier: Operating System :: Microsoft :: Windows :: Windows 7
18
+ Classifier: Operating System :: Microsoft :: Windows :: Windows 10
19
+ Classifier: Operating System :: Microsoft :: Windows :: Windows 11
20
+ Classifier: Programming Language :: Python :: 3
21
+ Classifier: Programming Language :: Python :: 3 :: Only
22
+ Classifier: Programming Language :: Python :: 3.8
23
+ Classifier: Programming Language :: Python :: 3.9
24
+ Classifier: Programming Language :: Python :: 3.10
25
+ Classifier: Programming Language :: Python :: 3.11
26
+ Classifier: Programming Language :: Python :: 3.12
27
+ Classifier: Programming Language :: Python :: 3.13
28
+ Classifier: Programming Language :: Python :: 3.14
29
+ Classifier: Topic :: Software Development :: Testing
30
+ Classifier: Topic :: System :: Hardware :: Hardware Drivers
31
+ Classifier: Typing :: Typed
32
+ Requires-Python: >=3.8.20
33
+ Requires-Dist: pywin32>=305; sys_platform == 'win32'
34
+ Requires-Dist: typing-extensions>=4.0.0
35
+ Description-Content-Type: text/markdown
36
+
37
+ # py-teststand
38
+
39
+ [![PyPI version](https://img.shields.io/pypi/v/py-teststand.svg)](https://pypi.org/project/py-teststand/)
40
+ [![Python versions](https://img.shields.io/pypi/pyversions/py-teststand.svg)](https://pypi.org/project/py-teststand/)
41
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
42
+ [![OS](https://img.shields.io/badge/OS-Windows-0078D4.svg?logo=windows)](https://www.microsoft.com/windows)
43
+ [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
44
+ [![uv](https://img.shields.io/badge/uv-managed-black?logo=uv)](https://github.com/astral-sh/uv)
45
+ [![ty](https://img.shields.io/badge/ty-checked-blue?logo=python)](https://github.com/astral-sh/ty)
46
+ [![TestStand 2016-2026](https://img.shields.io/badge/TestStand-2016--2026-orange.svg)](https://www.ni.com/docs/en-US/bundle/teststand-api-reference/page/tshelp/teststand-api-reference.html)
47
+ [![Downloads](https://static.pepy.tech/badge/py-teststand)](https://pepy.tech/projects/py-teststand)
48
+
49
+ [ni-teststand-api-reference]: https://www.ni.com/docs/en-US/bundle/teststand-api-reference/page/tshelp/teststand-api-reference.html
50
+
51
+ Community object-oriented Python 3 bindings (twin API) for the [National Instruments TestStand™ COM API][ni-teststand-api-reference].
52
+
53
+ ## Table of Contents
54
+
55
+ - [py-teststand](#py-teststand)
56
+ - [Table of Contents](#table-of-contents)
57
+ - [📖 Overview](#-overview)
58
+ - [📛 Name](#-name)
59
+ - [⚠️Transparency](#️transparency)
60
+ - [🚧 Project Status](#-project-status)
61
+ - [🤖 AI-Assisted Development](#-ai-assisted-development)
62
+ - [⚡ Quick Start](#-quick-start)
63
+ - [✨ Features](#-features)
64
+ - [🚀 Installation](#-installation)
65
+ - [⚡ uv](#-uv)
66
+ - [📦 pip](#-pip)
67
+ - [🔗 Compatibility](#-compatibility)
68
+ - [🎯 Design Goals](#-design-goals)
69
+ - [🛠️ Implementation Notes](#️-implementation-notes)
70
+ - [⚙️ Type Library Generation](#️-type-library-generation)
71
+ - [🧰 Technical Stack](#-technical-stack)
72
+ - [🤝 Contributing](#-contributing)
73
+ - [📈 Popularity Over Time](#-popularity-over-time)
74
+ - [⚖️ Legal](#️-legal)
75
+
76
+ ---
77
+
78
+ ## 📖 Overview
79
+
80
+ `py-teststand` exposes the [TestStand™ COM API][ni-teststand-api-reference]
81
+ as an object-oriented Python interface via [pywin32](https://pypi.org/project/pywin32/).
82
+
83
+ ### 📛 Name
84
+
85
+ The package is named `py-teststand` (with a dash) to avoid naming collision with the
86
+ [pytest testing framework](https://pytest.org/) and for easier relation to the
87
+ TestStand™ test executive. The import name uses an underscore: `py_teststand`.
88
+
89
+ ---
90
+
91
+ ## ⚠️Transparency
92
+
93
+ ## 🚧 Project Status
94
+
95
+ This is a hobby project, maintained on a best-effort basis and **not** yet
96
+ under active full-time development ahead of the first release. There is no fixed release
97
+ schedule or formal support, but feel free to get in touch.
98
+
99
+ Treat it as experimental: wrapper behaviour may change between releases without notice
100
+ (like error catching or high level imports).
101
+
102
+ If you hit a missing TestStand™ binding, a wrong type annotation, or unexpected
103
+ TestStand™ COM dispatch behavior, open an issue with a reproducible case. That is the
104
+ best way to get it fixed.
105
+
106
+ For now i prefer lightweight tags based releases (i protected them in repository settings)
107
+ instead of fully described ones until reach 1.0.0 release.
108
+
109
+ ### 🤖 AI-Assisted Development
110
+
111
+ This project leverages Large Language Models (LLMs) to assist with:
112
+
113
+ - **Codebase audits** and refactoring.
114
+ - **Test coverage analysis** and generation.
115
+ - **Documentation drafting**.
116
+
117
+ This is an independent community project. These AI tools are used to optimize
118
+ productivity and are **not** an official component of the project, nor do they integrate
119
+ with or replace the official
120
+ [NIGEL™ AI Advisor](https://www.ni.com/en/support/software-support/nigel-ai.html)
121
+ provided by National Instruments. All generated code is manually reviewed by the
122
+ maintainer to ensure it meets the project's quality standards.
123
+
124
+ ---
125
+
126
+ ## ⚡ Quick Start
127
+
128
+ ```python
129
+ from py_teststand import Engine
130
+
131
+ with Engine() as engine:
132
+ with engine.get_sequence_file("my_test.seq") as sequence_file:
133
+ with engine.new_execution(sequence_file, "MainSequence") as execution:
134
+ execution.wait_for_end_ex(-1)
135
+ print(f"Result: {execution.result_status}")
136
+ ```
137
+
138
+ To see the full capabilities, run the examples suite:
139
+
140
+ ```powershell
141
+ uv run .\examples\launch_all_examples.py
142
+ ```
143
+
144
+ ```python
145
+ EXAMPLES: list[tuple[str, str]] = [
146
+ ("station_options_update", "Set station and debug options. Start here."),
147
+ ("search_directory_manage", "Manage TestStand search directories."),
148
+ ("variables_manage", "Create variables across scopes, then retype and remove one."),
149
+ ("data_type_manage", "Create and evolve custom data types (container + strict enum)."),
150
+ ("property_object_serialize", "Dump variables and typedefs to JSON and back."),
151
+ ("sequence_build", "Build a sequence file with steps and save it."),
152
+ ("step_insert", "Insert a step into the sequence sequence_build made."),
153
+ ("step_insert_from_template", "Add a step from a step-type template."),
154
+ ("analyzer_step_name_length", "Walk a sequence and report on its step names."),
155
+ ("workspace_create", "Create a workspace and project file."),
156
+ ("users_manage", "Create users and set their privileges."),
157
+ ("execution_run_test_headless", "Run real pass/fail tests and read their numeric results."),
158
+ ("ui_messages_handle", "Receive UI messages from a running sequence without a GUI."),
159
+ (
160
+ "execution_run_subsequence",
161
+ "Run a sequence and read its results. Last; it shuts the engine down.",
162
+ ),
163
+ ]
164
+ ```
165
+
166
+ > ℹ️ A live TestStand™ installation is only required at runtime when COM objects are
167
+ > actually instantiated — not at import time.
168
+
169
+ ---
170
+
171
+ ## ✨ Features
172
+
173
+ - 🐍 **Pythonic attribute access**: TestStand™ COM properties are accessible via
174
+ standard Python attribute notation instead of raw `Dispatch` calls.
175
+ - 🏷️ **Type annotations**: All public members carry type hints compatible with
176
+ [ty](https://github.com/astral-sh/ty).
177
+ - ⚙️ **TestStand™ station options provisioning**: Read and write TestStand™
178
+ station-level configuration suitable for use in automated deployment pipelines
179
+ (like test-station install scripts).
180
+ - 🪶 **Minimal binding surface**: No behavior is added beyond what the TestStand™ COM
181
+ layer provides. Error conditions follow the [TestStand™ COM API contract][ni-teststand-api-reference].
182
+ - 🗂️ **Domain-grouped modules**: Classes are organized by TestStand™ domain area for
183
+ easier navigation without adding abstraction or reinterpreting behavior.
184
+ - ⚡ **No live TestStand™ installation required at import time**: The committed pywin32
185
+ dispatch cache allows the library to be imported and partially used (type checking,
186
+ configuration building) without a TestStand™ installation present.
187
+
188
+ ---
189
+
190
+ ## 🚀 Installation
191
+
192
+ ### ⚡ uv
193
+
194
+ ```powershell
195
+ uv add py-teststand
196
+ ```
197
+
198
+ ### 📦 pip
199
+
200
+ ```powershell
201
+ pip install py-teststand
202
+ ```
203
+
204
+ ---
205
+
206
+ ## 🔗 Compatibility
207
+
208
+ | Component | Versions |
209
+ |--------------------------------------------------------|-----------------------------------------------------------------------------------------------|
210
+ | **[Windows](https://www.microsoft.com/en-us/windows)** | 7 to 11 |
211
+ | **[Python](https://www.python.org/downloads/)** | 3.8 to 3.14 |
212
+ | **[TestStand™][ni-teststand-api-reference]** | [2016 to 2026](https://www.ni.com/docs/en-US/bundle/teststand/page/year-based-and-major.html) |
213
+
214
+ > ℹ️ Older TestStand™ engine versions may also work if the underlying COM interfaces
215
+ > have not changed, but they were not explicitly tested.
216
+
217
+ ---
218
+
219
+ ## 🎯 Design Goals
220
+
221
+ - 🐍 **Python 3.8 minimum**: Python 3.8 is the last CPython release with official
222
+ Windows 7 support, making it suitable for long-lifecycle, air-gapped manufacturing
223
+ environments where OS upgrades are not feasible. This lets you adopt Python-based
224
+ automation incrementally on existing TestStand™ station hardware.
225
+ - ⚙️ **TestStand™ station options as code**: The [TestStand™ Station Options][ni-teststand-api-reference]
226
+ object model is fully exposed, so search directories, model paths, station globals,
227
+ and result processing configuration can be read and written programmatically. This
228
+ makes station configuration reproducible and suitable for provisioners such as:
229
+ - [Terraform](https://developer.hashicorp.com/terraform) - via custom provider / local module (like wrapped PowerShell ones).
230
+ - [Ansible](https://www.ansible.com/)
231
+ - Custom deployment scripts.
232
+ - 📄 **No TestStand™ documentation mirroring**: The library does **not** duplicate or
233
+ paraphrase the [official TestStand™ API reference][ni-teststand-api-reference] in its docstrings.
234
+ Reproducing NI's documentation risks creating a secondary source that drifts from the
235
+ official spec over time. For authoritative descriptions of COM objects, properties,
236
+ and method semantics, refer directly to the [TestStand™ API Reference][ni-teststand-api-reference].
237
+
238
+ ---
239
+
240
+ ## 🛠️ Implementation Notes
241
+
242
+ ### ⚙️ Type Library Generation
243
+
244
+ Python class stubs and interface definitions are generated from the TestStand™
245
+ [COM Type Library](https://learn.microsoft.com/en-us/windows/win32/com/type-libraries-and-the-component-object-model)
246
+ (`.tlb`) using [pywin32's](https://pypi.org/project/pywin32/)
247
+ [`makepy`](https://github.com/mhammond/pywin32/blob/main/com/win32com/client/makepy.py)
248
+ utility. The generated output is cached as a
249
+ [pywin32 dispatch cache](https://mhammond.github.io/pywin32/) module and checked into
250
+ the repository, meaning a live TestStand™ installation is not required at import time —
251
+ only at runtime when TestStand™ COM objects are actually instantiated.
252
+
253
+ The generation process follows this pipeline:
254
+
255
+ 1. 🔍 **TLB introspection**: `makepy` reads the registered TestStand™ COM type library
256
+ via the Windows registry and reflects all exposed interfaces, `CoClass` definitions,
257
+ enumerations, and dispatch IDs.
258
+ 2. 💾 **Cache dump**: The reflected metadata is serialized into a Python module stored
259
+ under `win32com/gen_py/`, keyed by the TestStand™ type library GUID and version.
260
+ This cache is committed to the repository so users do not need to run `makepy`
261
+ themselves.
262
+ 3. 🧩 **Wrapper generation**: `py-teststand` classes are authored on top of the cached
263
+ dispatch definitions, adding Python type annotations and translating raw COM
264
+ `VARIANT` and `IDispatch` returns into typed Python objects where applicable.
265
+
266
+ The bindings stay compatible across TestStand™ engine versions by tracking the stable,
267
+ long-lived COM interfaces that exist across the supported range.
268
+
269
+ ---
270
+
271
+ ## 🧰 Technical Stack
272
+
273
+ | Tool | Purpose |
274
+ |--------------------------------------------------|-------------------------------------------------------------|
275
+ | **[uv](https://github.com/astral-sh/uv)** | Python package and project manager |
276
+ | **[ty](https://github.com/astral-sh/ty)** | Static type checker for interface validation |
277
+ | **[ruff](https://github.com/astral-sh/ruff)** | Linter and code formatter (with strict rules) |
278
+ | **[pytest](https://pytest.org/)** | Unit and integration test runner |
279
+ | **[pywin32](https://pypi.org/project/pywin32/)** | Windows COM dispatch layer and TestStand™ TLB introspection |
280
+
281
+ ---
282
+
283
+ ## 🤝 Contributing
284
+
285
+ Bug reports, feature requests, and pull requests are welcome via
286
+ [GitHub Issues](https://github.com/TheDomcio/py-teststand/issues).
287
+
288
+ If you are working with the TestStand™ COM API and have improvements, fixes, or
289
+ additional bindings, contributions are encouraged and will be reviewed. See
290
+ [CONTRIBUTING.md](CONTRIBUTING.md) for development setup and guidelines.
291
+
292
+ ---
293
+
294
+ ## 📈 Popularity Over Time
295
+
296
+ [![Star History Chart](https://api.star-history.com/svg?repos=TheDomcio/py-teststand&type=Date)](https://star-history.com/#TheDomcio/py-teststand&Date)
297
+
298
+ ---
299
+
300
+ ## ⚖️ Legal
301
+
302
+ TestStand™ is a registered trademark of
303
+ [National Instruments Corporation](https://www.ni.com). Refer to
304
+ [NI's TestStand™ licensing options](https://www.ni.com/en/shop/teststand.html) for
305
+ information on required licenses to operate the TestStand™ engine.
306
+
307
+ `py-teststand` is an independent community project and is not affiliated with, endorsed
308
+ by, or maintained by National Instruments or its parent company
309
+ [Emerson](https://www.emerson.com). References to the [TestStand™ API][ni-teststand-api-reference] are made
310
+ solely for interoperability purposes.
@@ -0,0 +1,274 @@
1
+ # py-teststand
2
+
3
+ [![PyPI version](https://img.shields.io/pypi/v/py-teststand.svg)](https://pypi.org/project/py-teststand/)
4
+ [![Python versions](https://img.shields.io/pypi/pyversions/py-teststand.svg)](https://pypi.org/project/py-teststand/)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
+ [![OS](https://img.shields.io/badge/OS-Windows-0078D4.svg?logo=windows)](https://www.microsoft.com/windows)
7
+ [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
8
+ [![uv](https://img.shields.io/badge/uv-managed-black?logo=uv)](https://github.com/astral-sh/uv)
9
+ [![ty](https://img.shields.io/badge/ty-checked-blue?logo=python)](https://github.com/astral-sh/ty)
10
+ [![TestStand 2016-2026](https://img.shields.io/badge/TestStand-2016--2026-orange.svg)](https://www.ni.com/docs/en-US/bundle/teststand-api-reference/page/tshelp/teststand-api-reference.html)
11
+ [![Downloads](https://static.pepy.tech/badge/py-teststand)](https://pepy.tech/projects/py-teststand)
12
+
13
+ [ni-teststand-api-reference]: https://www.ni.com/docs/en-US/bundle/teststand-api-reference/page/tshelp/teststand-api-reference.html
14
+
15
+ Community object-oriented Python 3 bindings (twin API) for the [National Instruments TestStand™ COM API][ni-teststand-api-reference].
16
+
17
+ ## Table of Contents
18
+
19
+ - [py-teststand](#py-teststand)
20
+ - [Table of Contents](#table-of-contents)
21
+ - [📖 Overview](#-overview)
22
+ - [📛 Name](#-name)
23
+ - [⚠️Transparency](#️transparency)
24
+ - [🚧 Project Status](#-project-status)
25
+ - [🤖 AI-Assisted Development](#-ai-assisted-development)
26
+ - [⚡ Quick Start](#-quick-start)
27
+ - [✨ Features](#-features)
28
+ - [🚀 Installation](#-installation)
29
+ - [⚡ uv](#-uv)
30
+ - [📦 pip](#-pip)
31
+ - [🔗 Compatibility](#-compatibility)
32
+ - [🎯 Design Goals](#-design-goals)
33
+ - [🛠️ Implementation Notes](#️-implementation-notes)
34
+ - [⚙️ Type Library Generation](#️-type-library-generation)
35
+ - [🧰 Technical Stack](#-technical-stack)
36
+ - [🤝 Contributing](#-contributing)
37
+ - [📈 Popularity Over Time](#-popularity-over-time)
38
+ - [⚖️ Legal](#️-legal)
39
+
40
+ ---
41
+
42
+ ## 📖 Overview
43
+
44
+ `py-teststand` exposes the [TestStand™ COM API][ni-teststand-api-reference]
45
+ as an object-oriented Python interface via [pywin32](https://pypi.org/project/pywin32/).
46
+
47
+ ### 📛 Name
48
+
49
+ The package is named `py-teststand` (with a dash) to avoid naming collision with the
50
+ [pytest testing framework](https://pytest.org/) and for easier relation to the
51
+ TestStand™ test executive. The import name uses an underscore: `py_teststand`.
52
+
53
+ ---
54
+
55
+ ## ⚠️Transparency
56
+
57
+ ## 🚧 Project Status
58
+
59
+ This is a hobby project, maintained on a best-effort basis and **not** yet
60
+ under active full-time development ahead of the first release. There is no fixed release
61
+ schedule or formal support, but feel free to get in touch.
62
+
63
+ Treat it as experimental: wrapper behaviour may change between releases without notice
64
+ (like error catching or high level imports).
65
+
66
+ If you hit a missing TestStand™ binding, a wrong type annotation, or unexpected
67
+ TestStand™ COM dispatch behavior, open an issue with a reproducible case. That is the
68
+ best way to get it fixed.
69
+
70
+ For now i prefer lightweight tags based releases (i protected them in repository settings)
71
+ instead of fully described ones until reach 1.0.0 release.
72
+
73
+ ### 🤖 AI-Assisted Development
74
+
75
+ This project leverages Large Language Models (LLMs) to assist with:
76
+
77
+ - **Codebase audits** and refactoring.
78
+ - **Test coverage analysis** and generation.
79
+ - **Documentation drafting**.
80
+
81
+ This is an independent community project. These AI tools are used to optimize
82
+ productivity and are **not** an official component of the project, nor do they integrate
83
+ with or replace the official
84
+ [NIGEL™ AI Advisor](https://www.ni.com/en/support/software-support/nigel-ai.html)
85
+ provided by National Instruments. All generated code is manually reviewed by the
86
+ maintainer to ensure it meets the project's quality standards.
87
+
88
+ ---
89
+
90
+ ## ⚡ Quick Start
91
+
92
+ ```python
93
+ from py_teststand import Engine
94
+
95
+ with Engine() as engine:
96
+ with engine.get_sequence_file("my_test.seq") as sequence_file:
97
+ with engine.new_execution(sequence_file, "MainSequence") as execution:
98
+ execution.wait_for_end_ex(-1)
99
+ print(f"Result: {execution.result_status}")
100
+ ```
101
+
102
+ To see the full capabilities, run the examples suite:
103
+
104
+ ```powershell
105
+ uv run .\examples\launch_all_examples.py
106
+ ```
107
+
108
+ ```python
109
+ EXAMPLES: list[tuple[str, str]] = [
110
+ ("station_options_update", "Set station and debug options. Start here."),
111
+ ("search_directory_manage", "Manage TestStand search directories."),
112
+ ("variables_manage", "Create variables across scopes, then retype and remove one."),
113
+ ("data_type_manage", "Create and evolve custom data types (container + strict enum)."),
114
+ ("property_object_serialize", "Dump variables and typedefs to JSON and back."),
115
+ ("sequence_build", "Build a sequence file with steps and save it."),
116
+ ("step_insert", "Insert a step into the sequence sequence_build made."),
117
+ ("step_insert_from_template", "Add a step from a step-type template."),
118
+ ("analyzer_step_name_length", "Walk a sequence and report on its step names."),
119
+ ("workspace_create", "Create a workspace and project file."),
120
+ ("users_manage", "Create users and set their privileges."),
121
+ ("execution_run_test_headless", "Run real pass/fail tests and read their numeric results."),
122
+ ("ui_messages_handle", "Receive UI messages from a running sequence without a GUI."),
123
+ (
124
+ "execution_run_subsequence",
125
+ "Run a sequence and read its results. Last; it shuts the engine down.",
126
+ ),
127
+ ]
128
+ ```
129
+
130
+ > ℹ️ A live TestStand™ installation is only required at runtime when COM objects are
131
+ > actually instantiated — not at import time.
132
+
133
+ ---
134
+
135
+ ## ✨ Features
136
+
137
+ - 🐍 **Pythonic attribute access**: TestStand™ COM properties are accessible via
138
+ standard Python attribute notation instead of raw `Dispatch` calls.
139
+ - 🏷️ **Type annotations**: All public members carry type hints compatible with
140
+ [ty](https://github.com/astral-sh/ty).
141
+ - ⚙️ **TestStand™ station options provisioning**: Read and write TestStand™
142
+ station-level configuration suitable for use in automated deployment pipelines
143
+ (like test-station install scripts).
144
+ - 🪶 **Minimal binding surface**: No behavior is added beyond what the TestStand™ COM
145
+ layer provides. Error conditions follow the [TestStand™ COM API contract][ni-teststand-api-reference].
146
+ - 🗂️ **Domain-grouped modules**: Classes are organized by TestStand™ domain area for
147
+ easier navigation without adding abstraction or reinterpreting behavior.
148
+ - ⚡ **No live TestStand™ installation required at import time**: The committed pywin32
149
+ dispatch cache allows the library to be imported and partially used (type checking,
150
+ configuration building) without a TestStand™ installation present.
151
+
152
+ ---
153
+
154
+ ## 🚀 Installation
155
+
156
+ ### ⚡ uv
157
+
158
+ ```powershell
159
+ uv add py-teststand
160
+ ```
161
+
162
+ ### 📦 pip
163
+
164
+ ```powershell
165
+ pip install py-teststand
166
+ ```
167
+
168
+ ---
169
+
170
+ ## 🔗 Compatibility
171
+
172
+ | Component | Versions |
173
+ |--------------------------------------------------------|-----------------------------------------------------------------------------------------------|
174
+ | **[Windows](https://www.microsoft.com/en-us/windows)** | 7 to 11 |
175
+ | **[Python](https://www.python.org/downloads/)** | 3.8 to 3.14 |
176
+ | **[TestStand™][ni-teststand-api-reference]** | [2016 to 2026](https://www.ni.com/docs/en-US/bundle/teststand/page/year-based-and-major.html) |
177
+
178
+ > ℹ️ Older TestStand™ engine versions may also work if the underlying COM interfaces
179
+ > have not changed, but they were not explicitly tested.
180
+
181
+ ---
182
+
183
+ ## 🎯 Design Goals
184
+
185
+ - 🐍 **Python 3.8 minimum**: Python 3.8 is the last CPython release with official
186
+ Windows 7 support, making it suitable for long-lifecycle, air-gapped manufacturing
187
+ environments where OS upgrades are not feasible. This lets you adopt Python-based
188
+ automation incrementally on existing TestStand™ station hardware.
189
+ - ⚙️ **TestStand™ station options as code**: The [TestStand™ Station Options][ni-teststand-api-reference]
190
+ object model is fully exposed, so search directories, model paths, station globals,
191
+ and result processing configuration can be read and written programmatically. This
192
+ makes station configuration reproducible and suitable for provisioners such as:
193
+ - [Terraform](https://developer.hashicorp.com/terraform) - via custom provider / local module (like wrapped PowerShell ones).
194
+ - [Ansible](https://www.ansible.com/)
195
+ - Custom deployment scripts.
196
+ - 📄 **No TestStand™ documentation mirroring**: The library does **not** duplicate or
197
+ paraphrase the [official TestStand™ API reference][ni-teststand-api-reference] in its docstrings.
198
+ Reproducing NI's documentation risks creating a secondary source that drifts from the
199
+ official spec over time. For authoritative descriptions of COM objects, properties,
200
+ and method semantics, refer directly to the [TestStand™ API Reference][ni-teststand-api-reference].
201
+
202
+ ---
203
+
204
+ ## 🛠️ Implementation Notes
205
+
206
+ ### ⚙️ Type Library Generation
207
+
208
+ Python class stubs and interface definitions are generated from the TestStand™
209
+ [COM Type Library](https://learn.microsoft.com/en-us/windows/win32/com/type-libraries-and-the-component-object-model)
210
+ (`.tlb`) using [pywin32's](https://pypi.org/project/pywin32/)
211
+ [`makepy`](https://github.com/mhammond/pywin32/blob/main/com/win32com/client/makepy.py)
212
+ utility. The generated output is cached as a
213
+ [pywin32 dispatch cache](https://mhammond.github.io/pywin32/) module and checked into
214
+ the repository, meaning a live TestStand™ installation is not required at import time —
215
+ only at runtime when TestStand™ COM objects are actually instantiated.
216
+
217
+ The generation process follows this pipeline:
218
+
219
+ 1. 🔍 **TLB introspection**: `makepy` reads the registered TestStand™ COM type library
220
+ via the Windows registry and reflects all exposed interfaces, `CoClass` definitions,
221
+ enumerations, and dispatch IDs.
222
+ 2. 💾 **Cache dump**: The reflected metadata is serialized into a Python module stored
223
+ under `win32com/gen_py/`, keyed by the TestStand™ type library GUID and version.
224
+ This cache is committed to the repository so users do not need to run `makepy`
225
+ themselves.
226
+ 3. 🧩 **Wrapper generation**: `py-teststand` classes are authored on top of the cached
227
+ dispatch definitions, adding Python type annotations and translating raw COM
228
+ `VARIANT` and `IDispatch` returns into typed Python objects where applicable.
229
+
230
+ The bindings stay compatible across TestStand™ engine versions by tracking the stable,
231
+ long-lived COM interfaces that exist across the supported range.
232
+
233
+ ---
234
+
235
+ ## 🧰 Technical Stack
236
+
237
+ | Tool | Purpose |
238
+ |--------------------------------------------------|-------------------------------------------------------------|
239
+ | **[uv](https://github.com/astral-sh/uv)** | Python package and project manager |
240
+ | **[ty](https://github.com/astral-sh/ty)** | Static type checker for interface validation |
241
+ | **[ruff](https://github.com/astral-sh/ruff)** | Linter and code formatter (with strict rules) |
242
+ | **[pytest](https://pytest.org/)** | Unit and integration test runner |
243
+ | **[pywin32](https://pypi.org/project/pywin32/)** | Windows COM dispatch layer and TestStand™ TLB introspection |
244
+
245
+ ---
246
+
247
+ ## 🤝 Contributing
248
+
249
+ Bug reports, feature requests, and pull requests are welcome via
250
+ [GitHub Issues](https://github.com/TheDomcio/py-teststand/issues).
251
+
252
+ If you are working with the TestStand™ COM API and have improvements, fixes, or
253
+ additional bindings, contributions are encouraged and will be reviewed. See
254
+ [CONTRIBUTING.md](CONTRIBUTING.md) for development setup and guidelines.
255
+
256
+ ---
257
+
258
+ ## 📈 Popularity Over Time
259
+
260
+ [![Star History Chart](https://api.star-history.com/svg?repos=TheDomcio/py-teststand&type=Date)](https://star-history.com/#TheDomcio/py-teststand&Date)
261
+
262
+ ---
263
+
264
+ ## ⚖️ Legal
265
+
266
+ TestStand™ is a registered trademark of
267
+ [National Instruments Corporation](https://www.ni.com). Refer to
268
+ [NI's TestStand™ licensing options](https://www.ni.com/en/shop/teststand.html) for
269
+ information on required licenses to operate the TestStand™ engine.
270
+
271
+ `py-teststand` is an independent community project and is not affiliated with, endorsed
272
+ by, or maintained by National Instruments or its parent company
273
+ [Emerson](https://www.emerson.com). References to the [TestStand™ API][ni-teststand-api-reference] are made
274
+ solely for interoperability purposes.