benchlab-pytools 3.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (206) hide show
  1. benchlab_pytools-3.1.0/.flake8 +2 -0
  2. benchlab_pytools-3.1.0/.gitignore +241 -0
  3. benchlab_pytools-3.1.0/CHANGELOG.md +122 -0
  4. benchlab_pytools-3.1.0/CONTRIBUTING.md +68 -0
  5. benchlab_pytools-3.1.0/LICENSE +21 -0
  6. benchlab_pytools-3.1.0/PKG-INFO +267 -0
  7. benchlab_pytools-3.1.0/README.md +173 -0
  8. benchlab_pytools-3.1.0/benchlab/__init__.py +5 -0
  9. benchlab_pytools-3.1.0/benchlab/__main__.py +21 -0
  10. benchlab_pytools-3.1.0/benchlab/bootstrap.py +154 -0
  11. benchlab_pytools-3.1.0/benchlab/config/README.md +325 -0
  12. benchlab_pytools-3.1.0/benchlab/config/__init__.py +9 -0
  13. benchlab_pytools-3.1.0/benchlab/config/config_client.py +639 -0
  14. benchlab_pytools-3.1.0/benchlab/config/config_manager.py +494 -0
  15. benchlab_pytools-3.1.0/benchlab/config/config_tool.py +358 -0
  16. benchlab_pytools-3.1.0/benchlab/config/diff.py +163 -0
  17. benchlab_pytools-3.1.0/benchlab/config/examples/complete_config.json +56 -0
  18. benchlab_pytools-3.1.0/benchlab/config/examples/rgb_lighting.json +24 -0
  19. benchlab_pytools-3.1.0/benchlab/config/examples/simple_fan.json +32 -0
  20. benchlab_pytools-3.1.0/benchlab/config/schema.py +138 -0
  21. benchlab_pytools-3.1.0/benchlab/config/test_config_client.py +166 -0
  22. benchlab_pytools-3.1.0/benchlab/config/test_config_manager.py +116 -0
  23. benchlab_pytools-3.1.0/benchlab/config/test_diff.py +208 -0
  24. benchlab_pytools-3.1.0/benchlab/core/README.md +156 -0
  25. benchlab_pytools-3.1.0/benchlab/core/__init__.py +78 -0
  26. benchlab_pytools-3.1.0/benchlab/core/config.py +194 -0
  27. benchlab_pytools-3.1.0/benchlab/core/datasource.py +1569 -0
  28. benchlab_pytools-3.1.0/benchlab/core/datasource_manager.py +430 -0
  29. benchlab_pytools-3.1.0/benchlab/core/device_registry.py +206 -0
  30. benchlab_pytools-3.1.0/benchlab/core/discovery.py +92 -0
  31. benchlab_pytools-3.1.0/benchlab/core/infrastructure.py +307 -0
  32. benchlab_pytools-3.1.0/benchlab/core/process_manager.py +355 -0
  33. benchlab_pytools-3.1.0/benchlab/core/retry.py +85 -0
  34. benchlab_pytools-3.1.0/benchlab/core/shared_serial.py +235 -0
  35. benchlab_pytools-3.1.0/benchlab/core/statistics.py +223 -0
  36. benchlab_pytools-3.1.0/benchlab/csv_log/README.md +206 -0
  37. benchlab_pytools-3.1.0/benchlab/csv_log/__init__.py +5 -0
  38. benchlab_pytools-3.1.0/benchlab/csv_log/csv_logger_enhanced.py +414 -0
  39. benchlab_pytools-3.1.0/benchlab/csv_log/message_batcher.py +358 -0
  40. benchlab_pytools-3.1.0/benchlab/csv_log/requirements.txt +3 -0
  41. benchlab_pytools-3.1.0/benchlab/csv_log/smart_retry.py +464 -0
  42. benchlab_pytools-3.1.0/benchlab/graph/README.md +117 -0
  43. benchlab_pytools-3.1.0/benchlab/graph/__init__.py +5 -0
  44. benchlab_pytools-3.1.0/benchlab/graph/app.py +356 -0
  45. benchlab_pytools-3.1.0/benchlab/graph/requirements.txt +2 -0
  46. benchlab_pytools-3.1.0/benchlab/graph/runner.py +42 -0
  47. benchlab_pytools-3.1.0/benchlab/graph/test_graph.py +154 -0
  48. benchlab_pytools-3.1.0/benchlab/graph/ui.py +288 -0
  49. benchlab_pytools-3.1.0/benchlab/hwinfo/README.md +135 -0
  50. benchlab_pytools-3.1.0/benchlab/hwinfo/__init__.py +5 -0
  51. benchlab_pytools-3.1.0/benchlab/hwinfo/hwinfo_export.py +384 -0
  52. benchlab_pytools-3.1.0/benchlab/hwinfo/requirements.txt +1 -0
  53. benchlab_pytools-3.1.0/benchlab/hwinfo/test_hwinfo_export.py +102 -0
  54. benchlab_pytools-3.1.0/benchlab/launcher.py +387 -0
  55. benchlab_pytools-3.1.0/benchlab/link/.env.EXAMPLE +10 -0
  56. benchlab_pytools-3.1.0/benchlab/link/README.md +172 -0
  57. benchlab_pytools-3.1.0/benchlab/link/__init__.py +1 -0
  58. benchlab_pytools-3.1.0/benchlab/link/link_main.py +477 -0
  59. benchlab_pytools-3.1.0/benchlab/link/test_link_main.py +151 -0
  60. benchlab_pytools-3.1.0/benchlab/main.py +490 -0
  61. benchlab_pytools-3.1.0/benchlab/menu.py +743 -0
  62. benchlab_pytools-3.1.0/benchlab/menu_classic.py +422 -0
  63. benchlab_pytools-3.1.0/benchlab/mqtt/README.md +201 -0
  64. benchlab_pytools-3.1.0/benchlab/mqtt/__init__.py +5 -0
  65. benchlab_pytools-3.1.0/benchlab/mqtt/mqtt.config_template +2 -0
  66. benchlab_pytools-3.1.0/benchlab/mqtt/mqtt_publisher.py +569 -0
  67. benchlab_pytools-3.1.0/benchlab/mqtt/requirements.txt +3 -0
  68. benchlab_pytools-3.1.0/benchlab/mqtt/test_mqtt_publisher.py +175 -0
  69. benchlab_pytools-3.1.0/benchlab/prefs.py +67 -0
  70. benchlab_pytools-3.1.0/benchlab/requirements.txt +27 -0
  71. benchlab_pytools-3.1.0/benchlab/restapi/.env.example +17 -0
  72. benchlab_pytools-3.1.0/benchlab/restapi/__init__.py +5 -0
  73. benchlab_pytools-3.1.0/benchlab/restapi/favicon.ico +0 -0
  74. benchlab_pytools-3.1.0/benchlab/restapi/readme.md +202 -0
  75. benchlab_pytools-3.1.0/benchlab/restapi/requirements.txt +5 -0
  76. benchlab_pytools-3.1.0/benchlab/restapi/telemetry_api.py +808 -0
  77. benchlab_pytools-3.1.0/benchlab/restapi/test_server.py +209 -0
  78. benchlab_pytools-3.1.0/benchlab/sources.py +537 -0
  79. benchlab_pytools-3.1.0/benchlab/tools.py +147 -0
  80. benchlab_pytools-3.1.0/benchlab/tui/README.md +268 -0
  81. benchlab_pytools-3.1.0/benchlab/tui/__init__.py +5 -0
  82. benchlab_pytools-3.1.0/benchlab/tui/config.py +480 -0
  83. benchlab_pytools-3.1.0/benchlab/tui/requirements.txt +2 -0
  84. benchlab_pytools-3.1.0/benchlab/tui/test_tui_core.py +241 -0
  85. benchlab_pytools-3.1.0/benchlab/tui/test_tui_main.py +76 -0
  86. benchlab_pytools-3.1.0/benchlab/tui/tui_core.py +1281 -0
  87. benchlab_pytools-3.1.0/benchlab/tui/tui_main.py +432 -0
  88. benchlab_pytools-3.1.0/benchlab/vu/README.md +64 -0
  89. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/NOTICE.md +13 -0
  90. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/README.md +80 -0
  91. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/Running_from_source_on_linux.md +97 -0
  92. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/__init__.py +0 -0
  93. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/assets/vu1_hello_world.png +0 -0
  94. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/community_applications.md +13 -0
  95. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/config.yaml +9 -0
  96. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/database.py +256 -0
  97. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/dial_driver.py +534 -0
  98. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/dials/Comms_Hub_Gauge.py +78 -0
  99. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/dials/Comms_Hub_Server.py +100 -0
  100. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/dials/__init__.py +0 -0
  101. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/dials/base_logger.py +100 -0
  102. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/installer/inc/icon.ico +0 -0
  103. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/installer/install.nsi +148 -0
  104. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/make_version.py +40 -0
  105. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/pylintrc +628 -0
  106. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/requirements.txt +9 -0
  107. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/serial_driver.py +244 -0
  108. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/server.py +670 -0
  109. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/server_config.py +255 -0
  110. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/server_dial_handler.py +334 -0
  111. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/vu_notifications.py +24 -0
  112. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/android-chrome-192x192.png +0 -0
  113. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/android-chrome-512x512.png +0 -0
  114. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/apple-touch-icon.png +0 -0
  115. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/css/demo.css +291 -0
  116. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/css/demo.min.css +9 -0
  117. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/css/demo.rtl.css +276 -0
  118. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/css/demo.rtl.min.css +9 -0
  119. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/css/tabler-flags.css +1084 -0
  120. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/css/tabler-flags.min.css +9 -0
  121. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/css/tabler-flags.rtl.css +1084 -0
  122. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/css/tabler-flags.rtl.min.css +9 -0
  123. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/css/tabler-payments.css +528 -0
  124. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/css/tabler-payments.min.css +9 -0
  125. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/css/tabler-payments.rtl.css +528 -0
  126. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/css/tabler-payments.rtl.min.css +9 -0
  127. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/css/tabler-social.css +10 -0
  128. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/css/tabler-social.min.css +8 -0
  129. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/css/tabler-social.rtl.css +10 -0
  130. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/css/tabler-social.rtl.min.css +8 -0
  131. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/css/tabler-vendors.css +1504 -0
  132. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/css/tabler-vendors.min.css +9 -0
  133. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/css/tabler-vendors.rtl.css +1504 -0
  134. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/css/tabler-vendors.rtl.min.css +9 -0
  135. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/css/tabler.css +25813 -0
  136. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/css/tabler.min.css +13 -0
  137. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/css/tabler.rtl.css +25777 -0
  138. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/css/tabler.rtl.min.css +13 -0
  139. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/css/theme.min.css +261 -0
  140. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/img/header.png +0 -0
  141. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/img/logo.png +0 -0
  142. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/js/dark-theme.js +35 -0
  143. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/js/dark-theme.min.js +9 -0
  144. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/js/demo.js +132 -0
  145. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/js/demo.min.js +9 -0
  146. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/js/jquery.min.js +2 -0
  147. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/js/tabler.esm.js +7482 -0
  148. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/js/tabler.esm.min.js +15 -0
  149. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/js/tabler.js +7543 -0
  150. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/js/tabler.min.js +15 -0
  151. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/js/vu1_api.js +68 -0
  152. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/js/vu1_gui_api_key_settings.js +167 -0
  153. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/js/vu1_gui_api_keys.js +138 -0
  154. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/js/vu1_gui_dial.js +179 -0
  155. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/js/vu1_gui_home.js +60 -0
  156. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/assets/js/vu1_gui_root.js +125 -0
  157. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/favicon-16x16.png +0 -0
  158. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/favicon-32x32.png +0 -0
  159. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/favicon.ico +0 -0
  160. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/favicon.png +0 -0
  161. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/index.html +47 -0
  162. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/views/api_keys.html +151 -0
  163. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/views/dial.html +286 -0
  164. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/views/footer.html +27 -0
  165. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/views/header.html +86 -0
  166. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/views/key_settings.html +132 -0
  167. benchlab_pytools-3.1.0/benchlab/vu/VU-Server/www/views/start.html +124 -0
  168. benchlab_pytools-3.1.0/benchlab/vu/__init__.py +5 -0
  169. benchlab_pytools-3.1.0/benchlab/vu/assets/Barlow-Bold.ttf +0 -0
  170. benchlab_pytools-3.1.0/benchlab/vu/assets/bl_dial_144x200.png +0 -0
  171. benchlab_pytools-3.1.0/benchlab/vu/assets/bl_logo_144x200.png +0 -0
  172. benchlab_pytools-3.1.0/benchlab/vu/devices.py +166 -0
  173. benchlab_pytools-3.1.0/benchlab/vu/requirements.txt +24 -0
  174. benchlab_pytools-3.1.0/benchlab/vu/sensors.py +18 -0
  175. benchlab_pytools-3.1.0/benchlab/vu/test_devices.py +66 -0
  176. benchlab_pytools-3.1.0/benchlab/vu/test_vu_server_config.py +43 -0
  177. benchlab_pytools-3.1.0/benchlab/vu/test_vu_server_manager.py +212 -0
  178. benchlab_pytools-3.1.0/benchlab/vu/test_vu_tui.py +46 -0
  179. benchlab_pytools-3.1.0/benchlab/vu/vu_dial.config_template +90 -0
  180. benchlab_pytools-3.1.0/benchlab/vu/vu_logo_gen.py +97 -0
  181. benchlab_pytools-3.1.0/benchlab/vu/vu_server.config_template +5 -0
  182. benchlab_pytools-3.1.0/benchlab/vu/vu_server_config.py +40 -0
  183. benchlab_pytools-3.1.0/benchlab/vu/vu_server_manager.py +190 -0
  184. benchlab_pytools-3.1.0/benchlab/vu/vu_tui.py +912 -0
  185. benchlab_pytools-3.1.0/benchlab/vu/vu_updater.py +540 -0
  186. benchlab_pytools-3.1.0/benchlab/wigidash/README.md +182 -0
  187. benchlab_pytools-3.1.0/benchlab/wigidash/__init__.py +5 -0
  188. benchlab_pytools-3.1.0/benchlab/wigidash/assets/Inter-Bold.ttf +0 -0
  189. benchlab_pytools-3.1.0/benchlab/wigidash/assets/Inter.ttf +0 -0
  190. benchlab_pytools-3.1.0/benchlab/wigidash/assets/benchlab.png +0 -0
  191. benchlab_pytools-3.1.0/benchlab/wigidash/benchlab_fleet.py +150 -0
  192. benchlab_pytools-3.1.0/benchlab/wigidash/benchlab_graph.py +516 -0
  193. benchlab_pytools-3.1.0/benchlab/wigidash/benchlab_overview.py +426 -0
  194. benchlab_pytools-3.1.0/benchlab/wigidash/benchlab_telemetry.py +105 -0
  195. benchlab_pytools-3.1.0/benchlab/wigidash/benchlab_ui.py +190 -0
  196. benchlab_pytools-3.1.0/benchlab/wigidash/benchlab_utils.py +182 -0
  197. benchlab_pytools-3.1.0/benchlab/wigidash/requirements.txt +9 -0
  198. benchlab_pytools-3.1.0/benchlab/wigidash/test_wigidash.py +341 -0
  199. benchlab_pytools-3.1.0/benchlab/wigidash/wigidash_device.py +541 -0
  200. benchlab_pytools-3.1.0/benchlab/wigidash/wigidash_manager.py +339 -0
  201. benchlab_pytools-3.1.0/benchlab/wigidash/wigidash_session.py +349 -0
  202. benchlab_pytools-3.1.0/benchlab/wigidash/wigidash_usb.py +243 -0
  203. benchlab_pytools-3.1.0/benchlab/wigidash/wigidash_widget.py +86 -0
  204. benchlab_pytools-3.1.0/benchlab.py +44 -0
  205. benchlab_pytools-3.1.0/pyproject.toml +130 -0
  206. benchlab_pytools-3.1.0/pytest.ini +4 -0
@@ -0,0 +1,2 @@
1
+ [flake8]
2
+ exclude = benchlab/vu/VU-Server,__pycache__,.git,.pytest_cache
@@ -0,0 +1,241 @@
1
+ # Benchlab specific files
2
+ *.db
3
+ *.db-journal
4
+ *.config
5
+ *.pid.lock
6
+ .benchlab_prefs.json
7
+ my_config.json
8
+ /logs/
9
+ benchlab/vu/generated/
10
+ benchlab/vu/VU-Server/upload/
11
+ benchlab/link/DEV_NOTES.md
12
+ benchlab/link/link.config
13
+ benchlab/link/.env
14
+
15
+ # Byte-compiled / optimized / DLL files
16
+ __pycache__/
17
+ *.py[codz]
18
+ *$py.class
19
+
20
+ # C extensions
21
+ *.so
22
+
23
+ # Distribution / packaging
24
+ .Python
25
+ build/
26
+ develop-eggs/
27
+ dist/
28
+ downloads/
29
+ eggs/
30
+ .eggs/
31
+ lib/
32
+ lib64/
33
+ parts/
34
+ sdist/
35
+ var/
36
+ wheels/
37
+ share/python-wheels/
38
+ *.egg-info/
39
+ .installed.cfg
40
+ *.egg
41
+ MANIFEST
42
+
43
+ # PyInstaller
44
+ # Usually these files are written by a python script from a template
45
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
46
+ *.manifest
47
+ *.spec
48
+
49
+ # Installer logs
50
+ pip-log.txt
51
+ pip-delete-this-directory.txt
52
+
53
+ # Unit test / coverage reports
54
+ htmlcov/
55
+ .tox/
56
+ .nox/
57
+ .coverage
58
+ .coverage.*
59
+ .cache
60
+ nosetests.xml
61
+ coverage.xml
62
+ *.cover
63
+ *.py.cover
64
+ .hypothesis/
65
+ .pytest_cache/
66
+ cover/
67
+
68
+ # Translations
69
+ *.mo
70
+ *.pot
71
+
72
+ # Django stuff:
73
+ *.log
74
+ local_settings.py
75
+ db.sqlite3
76
+ db.sqlite3-journal
77
+
78
+ # Flask stuff:
79
+ instance/
80
+ .webassets-cache
81
+
82
+ # Scrapy stuff:
83
+ .scrapy
84
+
85
+ # Sphinx documentation
86
+ docs/_build/
87
+
88
+ # PyBuilder
89
+ .pybuilder/
90
+ target/
91
+
92
+ # Jupyter Notebook
93
+ .ipynb_checkpoints
94
+
95
+ # IPython
96
+ profile_default/
97
+ ipython_config.py
98
+
99
+ # pyenv
100
+ # For a library or package, you might want to ignore these files since the code is
101
+ # intended to run in multiple environments; otherwise, check them in:
102
+ # .python-version
103
+
104
+ # pipenv
105
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
106
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
107
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
108
+ # install all needed dependencies.
109
+ #Pipfile.lock
110
+
111
+ # UV
112
+ # Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
113
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
114
+ # commonly ignored for libraries.
115
+ #uv.lock
116
+
117
+ # poetry
118
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
119
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
120
+ # commonly ignored for libraries.
121
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
122
+ #poetry.lock
123
+ #poetry.toml
124
+
125
+ # pdm
126
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
127
+ # pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
128
+ # https://pdm-project.org/en/latest/usage/project/#working-with-version-control
129
+ #pdm.lock
130
+ #pdm.toml
131
+ .pdm-python
132
+ .pdm-build/
133
+
134
+ # pixi
135
+ # Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
136
+ #pixi.lock
137
+ # Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
138
+ # in the .venv directory. It is recommended not to include this directory in version control.
139
+ .pixi
140
+
141
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
142
+ __pypackages__/
143
+
144
+ # Celery stuff
145
+ celerybeat-schedule
146
+ celerybeat.pid
147
+
148
+ # SageMath parsed files
149
+ *.sage.py
150
+
151
+ # Environments
152
+ .env
153
+ .envrc
154
+ .venv
155
+ env/
156
+ venv/
157
+ ENV/
158
+ env.bak/
159
+ venv.bak/
160
+
161
+ # Spyder project settings
162
+ .spyderproject
163
+ .spyproject
164
+
165
+ # Rope project settings
166
+ .ropeproject
167
+
168
+ # mkdocs documentation
169
+ /site
170
+
171
+ # mypy
172
+ .mypy_cache/
173
+ .dmypy.json
174
+ dmypy.json
175
+
176
+ # Pyre type checker
177
+ .pyre/
178
+
179
+ # pytype static type analyzer
180
+ .pytype/
181
+
182
+ # Cython debug symbols
183
+ cython_debug/
184
+
185
+ # PyCharm
186
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
187
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
188
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
189
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
190
+ #.idea/
191
+
192
+ # Abstra
193
+ # Abstra is an AI-powered process automation framework.
194
+ # Ignore directories containing user credentials, local state, and settings.
195
+ # Learn more at https://abstra.io/docs
196
+ .abstra/
197
+
198
+ # Visual Studio Code
199
+ # Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
200
+ # that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
201
+ # and can be added to the global gitignore or merged into this file. However, if you prefer,
202
+ # you could uncomment the following to ignore the entire vscode folder
203
+ .vscode/
204
+
205
+ # Ruff stuff:
206
+ .ruff_cache/
207
+
208
+ # PyPI configuration file
209
+ .pypirc
210
+
211
+ # Cursor
212
+ # Cursor is an AI-powered code editor. `.cursorignore` specifies files/directories to
213
+ # exclude from AI features like autocomplete and code analysis. Recommended for sensitive data
214
+ # refer to https://docs.cursor.com/context/ignore-files
215
+ .cursorignore
216
+ .cursorindexingignore
217
+
218
+ # Marimo
219
+ marimo/_static/
220
+ marimo/_lsp/
221
+ __marimo__/
222
+
223
+ #Cline Settings
224
+ ./clinerules/
225
+ clinerules.md
226
+ benchlab/vu/generated/Ambient_Temp_31adb92f7d8c50f2ef571b0e57623d4a_logo.png
227
+ benchlab/vu/generated/HPWR1_Current_3bdca09ec192687fe4737b7eab9b5a40_logo.png
228
+ benchlab/vu/generated/Humidity_5841b6aff86e7995ed175c5d6461a5cf_logo.png
229
+ benchlab/vu/generated/SYS_Power_7932c00b5744a5d26d25928e058c8231_logo.png
230
+ benchlab/vu/VU-Server/upload/img_4A0027000650564139323920
231
+ benchlab/vu/VU-Server/upload/img_4A0038000650564139323920
232
+ benchlab/vu/VU-Server/upload/img_35002F000650564139323920
233
+ benchlab/vu/VU-Server/upload/img_890024000650564139323920
234
+ benchlab/vu/VU-Server/upload/tmp_4A0027000650564139323920
235
+ benchlab/vu/VU-Server/upload/tmp_4A0038000650564139323920
236
+ benchlab/vu/VU-Server/upload/tmp_35002F000650564139323920
237
+ benchlab/vu/VU-Server/upload/tmp_890024000650564139323920
238
+ benchlab/vu/VU-Server/upload/img_4A0027000650564139323920
239
+ benchlab/vu/VU-Server/upload/img_4A0038000650564139323920
240
+ benchlab/vu/VU-Server/upload/img_35002F000650564139323920
241
+ benchlab/vu/VU-Server/upload/img_890024000650564139323920
@@ -0,0 +1,122 @@
1
+ # Changelog
2
+
3
+ All notable changes to BENCHLAB PyTools are documented here. Format follows
4
+ [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versioning follows
5
+ [SemVer](https://semver.org/).
6
+
7
+ ## [3.1.0] - 2026-09-08
8
+
9
+ ### Added
10
+ - `service_ws` data source: consumes the BENCHLAB service `/events`
11
+ WebSocket event stream (added in the C# service's PR #76). Telemetry is
12
+ pushed at the service's own poll cadence rather than polled, and device
13
+ connect/disconnect is reflected without a manual rescan. Output is
14
+ normalized to the same shape as `service_http`. New CLI flags
15
+ `--service-ws-url` (default `ws://localhost:8585/events`) and
16
+ `--service-token`; new optional-dependency group
17
+ `benchlab-pytools[service_ws]` (`websockets`).
18
+
19
+ ## [3.0.4] - 2026-08-18
20
+
21
+ ### Fixed
22
+ - 12VHPWR tab per-pin sense lines (`HPWR{1,2}_W{1..6}`) read 0.0 over
23
+ `service_http`/`named_pipe`, even though other apps using the same
24
+ `service_http` API showed correct values. The C# service's telemetry
25
+ normalization mapped the HPWR1/HPWR2 rail summaries but never mapped
26
+ the 12 individual per-pin sense-line sensors, so their C#
27
+ `ShortName`s (`HPWR{n}_W{m}_{P,I,V}`) passed through unmapped instead
28
+ of becoming the `..._{Power,Current,Voltage}` keys the TUI reads.
29
+
30
+ ## [3.0.3] - 2026-08-18
31
+
32
+ ### Fixed
33
+ - TUI: the 12VHPWR tab's Voltage section was cut off with no way to
34
+ scroll, since `MIN_TERMINAL_ROWS` (35) was well under the ~48 rows
35
+ the stacked Power/Current/Voltage layout plus status bar actually
36
+ needs. Raised to 48.
37
+ - `mqtt`, `service_http`, and `named_pipe` data sources never surfaced
38
+ `vendor_id`/`product_id`/`firmware_version`, so the Fleet TUI's
39
+ Model column (BL1 vs BL2 detection) was always wrong for these
40
+ sources:
41
+ - `mqtt`: the publisher's retained info payload only sent
42
+ `uid`/`com_port`/`firmware`; it now also reads
43
+ `ProductId`/`VendorId`/`FwVersion` via `read_device()` and
44
+ computes `variant`.
45
+ - `named_pipe`: the C# service's camelCase `productId` is now
46
+ mapped to the PascalCase keys the TUI expects
47
+ (`vendorId`/`firmwareVersion` also mapped), with `variant`
48
+ computed — field names verified against the
49
+ `BENCHLAB.BENCHLAB_Service` source.
50
+ - `service_http`: added a device-info normalization step (the C#
51
+ HTTP API only ever sends `productId`, confirmed against source —
52
+ vendor/firmware are unavailable there and default to unknown).
53
+
54
+ ## [3.0.2] - 2026-08-18
55
+
56
+ ### Fixed
57
+ - Several f-strings had their `{...}` expression split across a line
58
+ break, which is [PEP 701](https://peps.python.org/pep-0701/) syntax
59
+ only valid on Python 3.12+. Despite `requires-python = ">=3.10"`, this
60
+ raised `SyntaxError` immediately on 3.10/3.11 (e.g. `benchlab -tui`
61
+ failing with `SyntaxError: unterminated string literal` in
62
+ `benchlab/core/datasource.py`) — invisible in CI since every workflow
63
+ pins Python 3.13. Collapsed all such f-strings back onto single lines
64
+ across 27 files.
65
+
66
+ ## [3.0.1] - 2026-08-18
67
+
68
+ ### Fixed
69
+ - PyPI install was broken: `bootstrap.py` and the core `requirements.txt`
70
+ lived at the repo root and were never included in the wheel (only
71
+ `benchlab/` is packaged), so `pip install benchlab-pytools` followed by
72
+ `benchlab ...` failed with `ModuleNotFoundError: No module named
73
+ 'bootstrap'`. Both files moved into `benchlab/`, with internal imports
74
+ updated to relative imports.
75
+ - `pywin32` was missing from `pyproject.toml`'s core dependencies, so
76
+ PyPI installs on Windows did not pull it in despite the `named_pipe`
77
+ data source depending on it. Added `pywin32>=306; platform_system ==
78
+ 'Windows'` alongside the existing `windows-curses` entry.
79
+
80
+ ## [3.0.0] - 2026-08-15
81
+
82
+ ### Added
83
+ - Packaging: `pyproject.toml` for `pip install benchlab-pytools`, with
84
+ per-tool optional extras (`[tui]`, `[graph]`, `[vu]`, `[wigidash]`,
85
+ `[mqtt]`, `[restapi]`, `[csv_log]`, `[hwinfo]`, `[all]`) and a `benchlab`
86
+ console-script entry point.
87
+ - `--version` CLI flag.
88
+ - Tag-triggered release workflow: builds and tests the package, publishes
89
+ to PyPI, and attaches a source zip + wheel to a GitHub Release.
90
+ - `benchlab/vu/VU-Server/NOTICE.md` documenting redistribution permission
91
+ for the vendored VU-Server app.
92
+ - flake8 lint CI gate (`.flake8`, `.github/workflows/lint.yml`) for pull
93
+ requests targeting `main`.
94
+
95
+ ### Changed
96
+ - Link: `CloudMQTTClient` now pins paho-mqtt's `callback_api_version`
97
+ explicitly to `VERSION2` instead of relying on the deprecated implicit
98
+ default, with `on_connect`/`on_disconnect` updated to the matching
99
+ 5-arg signature.
100
+ - Link: MQTT topic pattern now also supports a `{client_uuid}` token
101
+ alongside `{uid}` (`LINK_TOPIC_PATTERN`), so deployments needing a
102
+ `clients/{client_uuid}/devices/{uid}/...` scheme are configurable
103
+ without code changes.
104
+ - Whole codebase now passes flake8's default ruleset (2,443 findings
105
+ fixed: unused imports/variables, an undefined-name issue in
106
+ `benchlab/core/datasource.py` resolved via a `TYPE_CHECKING`-guarded
107
+ import, and formatting/line-length cleanup — no behavior changes).
108
+
109
+ ## [0.8.2] - Unreleased (pre-packaging baseline)
110
+
111
+ Snapshot of the codebase at the point packaging work began. Interactive
112
+ menu (prompt_toolkit-based), TUI, CSV logger, FastAPI server, graph, HWiNFO
113
+ export, MQTT publisher, VU dials, WigiDash, and config import/export tools,
114
+ sharing a common data-source layer (direct serial, FastAPI, MQTT, named
115
+ pipe, service HTTP, service WebSocket).
116
+
117
+ [3.1.0]: https://github.com/BenchLab-io/benchlab-pytools/compare/v3.0.4...v3.1.0
118
+ [3.0.4]: https://github.com/BenchLab-io/benchlab-pytools/compare/v3.0.3...v3.0.4
119
+ [3.0.3]: https://github.com/BenchLab-io/benchlab-pytools/compare/v3.0.2...v3.0.3
120
+ [3.0.2]: https://github.com/BenchLab-io/benchlab-pytools/compare/v3.0.1...v3.0.2
121
+ [3.0.1]: https://github.com/BenchLab-io/benchlab-pytools/compare/v3.0.0...v3.0.1
122
+ [3.0.0]: https://github.com/BenchLab-io/benchlab-pytools/compare/v0.8.2...v3.0.0
@@ -0,0 +1,68 @@
1
+ # Contributing to BENCHLAB PyTools
2
+
3
+ ## Development setup
4
+
5
+ ```bash
6
+ git clone https://github.com/BenchLab-io/benchlab-pytools.git
7
+ cd benchlab-pytools
8
+ pip install -r benchlab/requirements.txt
9
+ pip install -r benchlab/csv_log/requirements.txt
10
+ pip install -r benchlab/graph/requirements.txt
11
+ pip install -r benchlab/wigidash/requirements.txt
12
+ pip install -r benchlab/vu/requirements.txt
13
+ pip install pytest
14
+ ```
15
+
16
+ Or install everything (including test tooling) via the package extras:
17
+
18
+ ```bash
19
+ pip install -e ".[all]"
20
+ pip install pytest
21
+ ```
22
+
23
+ Requires Python 3.10+.
24
+
25
+ ## Running tests
26
+
27
+ ```bash
28
+ pytest
29
+ ```
30
+
31
+ CI (`.github/workflows/pycore-compat.yml`) runs the full suite on
32
+ Windows against both the pinned `benchlab-pycore` version and the latest
33
+ release on PyPI, to catch drift between this repo and that package's
34
+ published API early (see issue #9).
35
+
36
+ ## Adding a new tool
37
+
38
+ 1. Add an entry to `CONSUMER_TOOLS` in `benchlab/tools.py` with `name`,
39
+ `flag`, `module`, `function`, and `requirements`.
40
+ 2. Implement the tool's entry function, accepting an `args` namespace (see
41
+ `benchlab/launcher.py::_build_args_namespace`).
42
+ 3. Add a CLI flag in `benchlab/main.py::get_parser()` and dispatch it in
43
+ `launch_mode()`.
44
+ 4. Add a `requirements.txt` in the tool's directory if it needs extra
45
+ dependencies, and a matching extra in `pyproject.toml`.
46
+ 5. Write a `README.md` in the tool's directory following the style of the
47
+ existing ones.
48
+ 6. Add tests and wire them into `.github/workflows/pycore-compat.yml`.
49
+
50
+ ## Versioning and releases
51
+
52
+ The version lives in `benchlab/__init__.py::__version__` and is the single
53
+ source of truth (`pyproject.toml` reads it dynamically). To cut a release:
54
+
55
+ 1. Bump `__version__` in `benchlab/__init__.py`.
56
+ 2. Move the `[Unreleased]` section in `CHANGELOG.md` to a new version
57
+ heading with today's date.
58
+ 3. Commit, then tag: `git tag vX.Y.Z && git push origin vX.Y.Z`.
59
+ 4. The `release` workflow builds, tests, publishes to PyPI, and creates a
60
+ GitHub Release with the wheel/sdist and a source zip attached.
61
+
62
+ ## Pull requests
63
+
64
+ - Keep changes scoped to one tool/concern where possible — this repo is
65
+ organized as independent subpackages under `benchlab/` sharing a common
66
+ core.
67
+ - Include or update tests for behavior changes.
68
+ - CI must pass before merge.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 BENCHLAB.io
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.