cgse 2025.0.4__tar.gz → 2025.0.5__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 (322) hide show
  1. {cgse-2025.0.4 → cgse-2025.0.5}/NOTES.md +0 -23
  2. {cgse-2025.0.4 → cgse-2025.0.5}/PKG-INFO +1 -1
  3. cgse-2025.0.5/conftest.py +30 -0
  4. cgse-2025.0.5/docs/dev_guide/index.md +6 -0
  5. {cgse-2025.0.4 → cgse-2025.0.5}/docs/dev_guide/uv.md +30 -9
  6. cgse-2025.0.5/docs/libs/cgse-common/index.md +18 -0
  7. cgse-2025.0.5/docs/libs/cgse-coordinates/index.md +2 -0
  8. cgse-2025.0.5/docs/libs/cgse-core/index.md +1 -0
  9. cgse-2025.0.5/docs/libs/cgse-gui/index.md +1 -0
  10. cgse-2025.0.5/docs/libs/index.md +11 -0
  11. cgse-2025.0.5/docs/projects/cgse-tools.md +2 -0
  12. cgse-2025.0.5/docs/projects/index.md +16 -0
  13. cgse-2025.0.5/docs/projects/symetrie-hexapod.md +2 -0
  14. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/pyproject.toml +2 -1
  15. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/control.py +0 -1
  16. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/env.py +204 -30
  17. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/protocol.py +1 -1
  18. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/response.py +2 -1
  19. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/services.py +4 -1
  20. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/settings.py +182 -129
  21. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/setup.py +37 -22
  22. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/system.py +23 -17
  23. cgse-2025.0.5/libs/cgse-common/tests/conftest.py +4 -0
  24. cgse-2025.0.5/libs/cgse-common/tests/data/data/command.yaml +5 -0
  25. cgse-2025.0.5/libs/cgse-common/tests/fixtures/default_env.py +38 -0
  26. cgse-2025.0.5/libs/cgse-common/tests/fixtures/helpers.py +237 -0
  27. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/test_env.py +53 -34
  28. cgse-2025.0.5/libs/cgse-common/tests/test_fixtures.py +12 -0
  29. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/test_hk.py +32 -12
  30. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/test_resource.py +2 -2
  31. cgse-2025.0.5/libs/cgse-common/tests/test_settings.py +14 -0
  32. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/test_setup.py +279 -77
  33. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/test_system.py +2 -2
  34. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-coordinates/pyproject.toml +1 -1
  35. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/pyproject.toml +17 -4
  36. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/src/egse/confman/__init__.py +47 -26
  37. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/src/egse/confman/confman_cs.py +7 -10
  38. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/src/egse/logger/log_cs.py +2 -2
  39. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/src/egse/procman/__init__.py +7 -2
  40. cgse-2025.0.5/libs/cgse-core/src/egse/settings.yaml +32 -0
  41. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/src/egse/storage/__init__.py +12 -11
  42. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/src/egse/storage/storage_cs.py +4 -4
  43. cgse-2025.0.5/libs/cgse-core/tests/conftest.py +5 -0
  44. cgse-2025.0.5/libs/cgse-core/tests/data/local_settings.yaml +8 -0
  45. cgse-2025.0.5/libs/cgse-core/tests/fixtures/default_env.py +38 -0
  46. cgse-2025.0.5/libs/cgse-core/tests/fixtures/helpers.py +237 -0
  47. cgse-2025.0.4/libs/cgse-core/tests/conftest.py → cgse-2025.0.5/libs/cgse-core/tests/fixtures/services.py +3 -6
  48. cgse-2025.0.5/libs/cgse-core/tests/test_confman_setups.py +35 -0
  49. cgse-2025.0.5/libs/cgse-core/tests/test_settings_core.py +122 -0
  50. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/pyproject.toml +1 -1
  51. {cgse-2025.0.4 → cgse-2025.0.5}/mkdocs.yml +38 -9
  52. {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/cgse-tools/pyproject.toml +1 -1
  53. {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/pyproject.toml +1 -1
  54. {cgse-2025.0.4 → cgse-2025.0.5}/projects/plato/plato-fits/pyproject.toml +1 -1
  55. {cgse-2025.0.4 → cgse-2025.0.5}/projects/plato/plato-hdf5/pyproject.toml +1 -1
  56. {cgse-2025.0.4 → cgse-2025.0.5}/projects/plato/plato-spw/pyproject.toml +1 -1
  57. {cgse-2025.0.4 → cgse-2025.0.5}/pyproject.toml +18 -1
  58. cgse-2025.0.4/docs/dev_guide/index.md +0 -3
  59. cgse-2025.0.4/docs.zip +0 -0
  60. cgse-2025.0.4/libs/cgse-common/tests/conftest.py +0 -19
  61. cgse-2025.0.4/libs/cgse-common/tests/helpers.py +0 -108
  62. cgse-2025.0.4/libs/cgse-core/tests/test_confman_setups.py +0 -25
  63. {cgse-2025.0.4 → cgse-2025.0.5}/.gitignore +0 -0
  64. {cgse-2025.0.4 → cgse-2025.0.5}/README.md +0 -0
  65. {cgse-2025.0.4 → cgse-2025.0.5}/TODO.md +0 -0
  66. {cgse-2025.0.4 → cgse-2025.0.5}/bump.py +0 -0
  67. {cgse-2025.0.4 → cgse-2025.0.5}/docs/custom_theme/main.html +0 -0
  68. {cgse-2025.0.4 → cgse-2025.0.5}/docs/dev_guide/coding_style.md +0 -0
  69. {cgse-2025.0.4 → cgse-2025.0.5}/docs/dev_guide/docs.md +0 -0
  70. {cgse-2025.0.4 → cgse-2025.0.5}/docs/dev_guide/installation.md +0 -0
  71. {cgse-2025.0.4 → cgse-2025.0.5}/docs/getting_started.md +0 -0
  72. {cgse-2025.0.4 → cgse-2025.0.5}/docs/help.md +0 -0
  73. {cgse-2025.0.4 → cgse-2025.0.5}/docs/images/icons/cgse-logo-blue.svg +0 -0
  74. {cgse-2025.0.4 → cgse-2025.0.5}/docs/images/icons/cgse-logo.svg +0 -0
  75. {cgse-2025.0.4 → cgse-2025.0.5}/docs/index.md +0 -0
  76. {cgse-2025.0.4 → cgse-2025.0.5}/docs/stylesheets/custom.css +0 -0
  77. {cgse-2025.0.4 → cgse-2025.0.5}/docs/tutorial.md +0 -0
  78. {cgse-2025.0.4 → cgse-2025.0.5}/docs/user_guide/index.md +0 -0
  79. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/README.md +0 -0
  80. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/bits.py +0 -0
  81. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/calibration.py +0 -0
  82. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/command.py +0 -0
  83. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/config.py +0 -0
  84. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/decorators.py +0 -0
  85. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/device.py +0 -0
  86. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/exceptions.py +0 -0
  87. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/hk.py +0 -0
  88. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/metrics.py +0 -0
  89. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/mixin.py +0 -0
  90. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/monitoring.py +0 -0
  91. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/observer.py +0 -0
  92. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/obsid.py +0 -0
  93. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/persistence.py +0 -0
  94. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/plugin.py +0 -0
  95. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/process.py +0 -0
  96. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/proxy.py +0 -0
  97. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/reload.py +0 -0
  98. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/resource.py +0 -0
  99. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/services.yaml +0 -0
  100. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/settings.yaml +0 -0
  101. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/state.py +0 -0
  102. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/version.py +0 -0
  103. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/zmq_ser.py +0 -0
  104. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00028_201028_155259.yaml +0 -0
  105. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00029_201028_155331.yaml +0 -0
  106. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00030_210311_134043.yaml +0 -0
  107. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00080_210917_105245.yaml +0 -0
  108. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00081_210922_142259.yaml +0 -0
  109. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00082_210923_094458.yaml +0 -0
  110. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/CSL1/README.md +0 -0
  111. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/CSL2/README.md +0 -0
  112. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/IAS/README.md +0 -0
  113. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/INTA/README.md +0 -0
  114. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/LAB23/README.md +0 -0
  115. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00027_211119_140441.yaml +0 -0
  116. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00028_211119_160406.yaml +0 -0
  117. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00029_211119_172918.yaml +0 -0
  118. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00030_211122_103604.yaml +0 -0
  119. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00031_211123_124900.yaml +0 -0
  120. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/common/telemetry/tm-dictionary-default.csv +0 -0
  121. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/conf/SETUP_20250114_1519.yaml +0 -0
  122. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/conf/config-file.toml +0 -0
  123. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/data/cal_coeff_1234.csv +0 -0
  124. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/data/calibration.csv +0 -0
  125. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/data/calibration.yaml +0 -0
  126. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/data/corrupt.yaml +0 -0
  127. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/data/data-file.txt +0 -0
  128. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/data/empty_data_file.txt +0 -0
  129. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/data/test_setup.yaml +0 -0
  130. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/icons/keyboard.png +0 -0
  131. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/lib/dev1/shared-lib.so +0 -0
  132. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/lib/dev2/shared-lib.so +0 -0
  133. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/dummy.py +0 -0
  134. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/test_bits.py +0 -0
  135. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/test_command.py +0 -0
  136. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/test_config.py +0 -0
  137. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/test_control.py +0 -0
  138. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/test_decorators.py +0 -0
  139. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/test_device.py +0 -0
  140. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/test_response.py +0 -0
  141. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-coordinates/README.md +0 -0
  142. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-coordinates/src/egse/coordinates/__init__.py +0 -0
  143. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-coordinates/src/egse/coordinates/avoidance.py +0 -0
  144. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-coordinates/src/egse/coordinates/cslmodel.py +0 -0
  145. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-coordinates/src/egse/coordinates/laser_tracker_to_dict.py +0 -0
  146. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-coordinates/src/egse/coordinates/point.py +0 -0
  147. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-coordinates/src/egse/coordinates/pyplot.py +0 -0
  148. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-coordinates/src/egse/coordinates/referenceFrame.py +0 -0
  149. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-coordinates/src/egse/coordinates/refmodel.py +0 -0
  150. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-coordinates/src/egse/coordinates/rotationMatrix.py +0 -0
  151. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-coordinates/src/egse/coordinates/transform3d_addon.py +0 -0
  152. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/.envrc.disabled +0 -0
  153. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/README.md +0 -0
  154. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/src/egse/confman/__main__.py +0 -0
  155. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/src/egse/confman/confman.yaml +0 -0
  156. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/src/egse/logger/__init__.py +0 -0
  157. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/src/egse/logger/__main__.py +0 -0
  158. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/src/egse/procman/procman.yaml +0 -0
  159. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/src/egse/procman/procman_cs.py +0 -0
  160. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/src/egse/storage/__main__.py +0 -0
  161. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/src/egse/storage/persistence.py +0 -0
  162. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/src/egse/storage/storage.yaml +0 -0
  163. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/src/scripts/cgse.py +0 -0
  164. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/tests/test_logger.py +0 -0
  165. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/README.md +0 -0
  166. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/__init__.py +0 -0
  167. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/buttons.py +0 -0
  168. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/aeu-cs-start.svg +0 -0
  169. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/aeu-cs-stop.svg +0 -0
  170. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/aeu-cs.svg +0 -0
  171. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/aeu_cs-started.svg +0 -0
  172. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/aeu_cs-stopped.svg +0 -0
  173. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/aeu_cs.svg +0 -0
  174. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/alert.svg +0 -0
  175. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/arrow-double-left.png +0 -0
  176. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/arrow-double-right.png +0 -0
  177. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/arrow-up.svg +0 -0
  178. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/backward.svg +0 -0
  179. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/busy.svg +0 -0
  180. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/cleaning.svg +0 -0
  181. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/color-scheme.svg +0 -0
  182. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/cs-connected-alert.svg +0 -0
  183. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/cs-connected-disabled.svg +0 -0
  184. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/cs-connected.svg +0 -0
  185. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/cs-not-connected.svg +0 -0
  186. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/double-left-arrow.svg +0 -0
  187. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/double-right-arrow.svg +0 -0
  188. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/erase-disabled.svg +0 -0
  189. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/erase.svg +0 -0
  190. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/fitsgen-start.svg +0 -0
  191. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/fitsgen-stop.svg +0 -0
  192. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/fitsgen.svg +0 -0
  193. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/forward.svg +0 -0
  194. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/fov-hk-start.svg +0 -0
  195. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/fov-hk-stop.svg +0 -0
  196. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/fov-hk.svg +0 -0
  197. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/front-desk.svg +0 -0
  198. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/home-actioned.svg +0 -0
  199. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/home-disabled.svg +0 -0
  200. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/home.svg +0 -0
  201. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/info.svg +0 -0
  202. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/invalid.png +0 -0
  203. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/led-green.svg +0 -0
  204. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/led-grey.svg +0 -0
  205. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/led-orange.svg +0 -0
  206. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/led-red.svg +0 -0
  207. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/led-square-green.svg +0 -0
  208. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/led-square-grey.svg +0 -0
  209. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/led-square-orange.svg +0 -0
  210. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/led-square-red.svg +0 -0
  211. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/limit-switch-all-green.svg +0 -0
  212. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/limit-switch-all-red.svg +0 -0
  213. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/limit-switch-el+.svg +0 -0
  214. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/limit-switch-el-.svg +0 -0
  215. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/location-marker.svg +0 -0
  216. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/logo-dpu.svg +0 -0
  217. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/logo-gimbal.svg +0 -0
  218. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/logo-huber.svg +0 -0
  219. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/logo-ogse.svg +0 -0
  220. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/logo-puna.svg +0 -0
  221. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/logo-tcs.svg +0 -0
  222. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/logo-zonda.svg +0 -0
  223. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/maximize.svg +0 -0
  224. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/meter.svg +0 -0
  225. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/more.svg +0 -0
  226. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk-start.svg +0 -0
  227. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk-stop.svg +0 -0
  228. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk.svg +0 -0
  229. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/observing-off.svg +0 -0
  230. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/observing-on.svg +0 -0
  231. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/open-document-hdf5.png +0 -0
  232. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/open-document-hdf5.svg +0 -0
  233. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/ops-mode.svg +0 -0
  234. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/play-green.svg +0 -0
  235. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/plugged-disabled.svg +0 -0
  236. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/plugged.svg +0 -0
  237. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/pm_ui.svg +0 -0
  238. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/power-button-green.svg +0 -0
  239. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/power-button-red.svg +0 -0
  240. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/power-button.svg +0 -0
  241. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/radar.svg +0 -0
  242. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/radioactive.svg +0 -0
  243. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/reload.svg +0 -0
  244. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/remote-control-off.svg +0 -0
  245. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/remote-control-on.svg +0 -0
  246. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/repeat-blue.svg +0 -0
  247. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/repeat.svg +0 -0
  248. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/settings.svg +0 -0
  249. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/shrink.svg +0 -0
  250. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/shutter.svg +0 -0
  251. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/sign-off.svg +0 -0
  252. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/sign-on.svg +0 -0
  253. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/sim-mode.svg +0 -0
  254. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/small-buttons-go.svg +0 -0
  255. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/small-buttons-minus.svg +0 -0
  256. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/small-buttons-plus.svg +0 -0
  257. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/sponge.svg +0 -0
  258. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/start-button-disabled.svg +0 -0
  259. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/start-button.svg +0 -0
  260. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/stop-button-disabled.svg +0 -0
  261. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/stop-button.svg +0 -0
  262. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/stop-red.svg +0 -0
  263. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/stop.svg +0 -0
  264. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/switch-disabled-square.svg +0 -0
  265. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/switch-disabled.svg +0 -0
  266. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/switch-off-square.svg +0 -0
  267. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/switch-off.svg +0 -0
  268. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/switch-on-square.svg +0 -0
  269. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/switch-on.svg +0 -0
  270. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/temperature-control.svg +0 -0
  271. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/th_ui_logo.svg +0 -0
  272. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/unplugged.svg +0 -0
  273. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/unvalid.png +0 -0
  274. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/user-interface.svg +0 -0
  275. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/vacuum.svg +0 -0
  276. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/valid.png +0 -0
  277. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/zoom-to-pixel-dark.svg +0 -0
  278. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/zoom-to-pixel-white.svg +0 -0
  279. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/led.py +0 -0
  280. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/limitswitch.py +0 -0
  281. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/states.py +0 -0
  282. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/styles/dark.qss +0 -0
  283. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/styles/default.qss +0 -0
  284. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/styles.qss +0 -0
  285. {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/switch.py +0 -0
  286. {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/cgse-tools/README.md +0 -0
  287. {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/cgse-tools/src/egse/tools/status.py +0 -0
  288. {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/cgse-tools/src/scripts/cgse_plugins.py +0 -0
  289. {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/cgse-tools/src/scripts/cgse_service_plugins.py +0 -0
  290. {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/README.md +0 -0
  291. {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/__init__.py +0 -0
  292. {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/__init__.py +0 -0
  293. {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/alpha.py +0 -0
  294. {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/dynalpha.py +0 -0
  295. {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/hexapod_ui.py +0 -0
  296. {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran.py +0 -0
  297. {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran.yaml +0 -0
  298. {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_cs.py +0 -0
  299. {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_protocol.py +0 -0
  300. {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_ui.py +0 -0
  301. {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/pmac.py +0 -0
  302. {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/pmac_regex.py +0 -0
  303. {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna.py +0 -0
  304. {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna.yaml +0 -0
  305. {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_cs.py +0 -0
  306. {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_protocol.py +0 -0
  307. {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_ui.py +0 -0
  308. {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/punaplus.py +0 -0
  309. {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda.py +0 -0
  310. {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda.yaml +0 -0
  311. {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_cs.py +0 -0
  312. {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_devif.py +0 -0
  313. {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_protocol.py +0 -0
  314. {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_ui.py +0 -0
  315. {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/scripts/cgse_service_plugins.py +0 -0
  316. {cgse-2025.0.4 → cgse-2025.0.5}/projects/plato/plato-fits/README.md +0 -0
  317. {cgse-2025.0.4 → cgse-2025.0.5}/projects/plato/plato-fits/src/egse/plugins/storage/fits.py +0 -0
  318. {cgse-2025.0.4 → cgse-2025.0.5}/projects/plato/plato-hdf5/README.md +0 -0
  319. {cgse-2025.0.4 → cgse-2025.0.5}/projects/plato/plato-hdf5/src/egse/plugins/storage/hdf5.py +0 -0
  320. {cgse-2025.0.4 → cgse-2025.0.5}/projects/plato/plato-spw/README.md +0 -0
  321. {cgse-2025.0.4 → cgse-2025.0.5}/projects/plato/plato-spw/src/egse/spw.py +0 -0
  322. {cgse-2025.0.4 → cgse-2025.0.5}/ruff.toml +0 -0
@@ -55,29 +55,6 @@ Note that each library or project is a standalone Poetry package with its own `p
55
55
 
56
56
  All packages in the monorepo will have the same version. This can be maintained with the `bump.py` script. This script will read the version from the `pyproject.toml` file at the root of the monorepo and propagate the version to all libs and projects in the monorepo. Note that you –for now– will have to update the version number in the `pyproject.toml` file located at the monorepo root folder manually.
57
57
 
58
- # Use of Poetry (DEPRECATED: see below)
59
-
60
- I have now Poetry configurations for all `libs` in this monorepo. So, how do we use Poetry in this project?
61
-
62
- First thing to understand, Poetry is a development and dependency management tool. So, if you are installing the different packages in this repo from PyPI there is no need to use Poetry. The package will be installed in your current virtual environment.
63
-
64
- You can choose how you want to manage your virtual environments for each of the packages in the monorepo. I personally use `pyenv` to manage my virtual environments and I disable the virtual environment that would normally be used by Poetry.
65
-
66
- > Explain how to use `pyenv` for your virtual environments
67
-
68
- The following command starts a new sub-shell and activates the virtual environment:
69
- ```
70
- $ poetry shell
71
- ```
72
-
73
- If you do not want to start a new shell, but just want to execute a command in the virtual environment, use the `poetry run` command, e.g.
74
- ```
75
- $ poetry run pytest tests/test_bits.py
76
- ```
77
- Or
78
- ```
79
- $ poetry run python -m egse.monitoring localhost 6001
80
- ```
81
58
 
82
59
  # Build and Publish
83
60
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cgse
3
- Version: 2025.0.4
3
+ Version: 2025.0.5
4
4
  Summary: Generic Common-EGSE: Commanding and monitoring lab equipment
5
5
  Author-email: Rik Huygen <rik.huygen@kuleuven.be>, Sara Regibo <sara.regibo@kuleuven.be>
6
6
  License: MIT
@@ -0,0 +1,30 @@
1
+ from glob import glob
2
+
3
+ import rich
4
+
5
+ # Quick hack to load plugins from different places.
6
+ # This doesn't work, I get an import error.
7
+
8
+ # def refactor(string: str) -> str:
9
+ # entry = string.replace("/", ".").replace("\\", ".").replace(".py", "")
10
+ # rich.print(f"[green]{entry = }[/]")
11
+ # return entry
12
+ #
13
+ # pytest_plugins = [
14
+ # refactor(conftest)
15
+ # for conftest in glob("**/tests/fixtures/*.py", recursive=True)
16
+ # if "__" not in conftest
17
+ # ]
18
+
19
+ # Doesn't work, with the following error:
20
+ #
21
+ # File "/Users/rik/github/cgse/libs/cgse-common/tests/fixtures/default_env.py", line 7, in <module>
22
+ # from fixtures.helpers import setup_data_storage_layout, teardown_data_storage_layout
23
+ # ImportError: Error importing plugin "libs.cgse-common.tests.fixtures.default_env": No module named 'fixtures'
24
+ #
25
+
26
+ # pytest_plugins = [
27
+ # "libs.cgse-common.tests.fixtures.helpers",
28
+ # "libs.cgse-common.tests.fixtures.default_env",
29
+ # "libs.cgse-core.tests.fixtures.services",
30
+ # ]
@@ -0,0 +1,6 @@
1
+ # Developer Guide
2
+
3
+ Welcome to the CGSE developer guide! An in-depth reference on how to contribute to the CGSE.
4
+
5
+ First thing to know is that this repository is actually a monorepo, meaning it contains a bunch of related but
6
+ self-standing packages with a minimum of interdependencies. These packages are
@@ -40,15 +40,23 @@ $ uv python install 3.9.20
40
40
 
41
41
  You can check which Python versions are installed already on your system:
42
42
 
43
- ```shell
44
- $ uv python list --only-installed
45
- cpython-3.12.8-macos-aarch64-none /Users/rik/Library/Application Support/uv/python/cpython-3.12.8-macos-aarch64-none/bin/python3.12
46
- cpython-3.10.16-macos-aarch64-none /Users/rik/Library/Application Support/uv/python/cpython-3.10.16-macos-aarch64-none/bin/python3.10
47
- cpython-3.9.21-macos-aarch64-none /Users/rik/Library/Application Support/uv/python/cpython-3.9.21-macos-aarch64-none/bin/python3.9
48
- cpython-3.9.20-macos-aarch64-none /Users/rik/Library/Application Support/uv/python/cpython-3.9.20-macos-aarch64-none/bin/python3.9
49
- cpython-3.9.6-macos-aarch64-none /Library/Developer/CommandLineTools/usr/bin/python3 -> ../../Library/Frameworks/Python3.framework/Versions/3.9/bin/python3
50
- cpython-3.8.17-macos-aarch64-none /Users/rik/Library/Application Support/uv/python/cpython-3.8.17-macos-aarch64-none/bin/python3.8
51
- ```
43
+ === "Command"
44
+
45
+ ```bash
46
+ $ uv python list --only-installed
47
+ ```
48
+
49
+ === "Output"
50
+
51
+ ```
52
+ cpython-3.12.8-macos-aarch64-none /Users/rik/Library/Application Support/uv/python/cpython-3.12.8-macos-aarch64-none/bin/python3.12
53
+ cpython-3.10.16-macos-aarch64-none /Users/rik/Library/Application Support/uv/python/cpython-3.10.16-macos-aarch64-none/bin/python3.10
54
+ cpython-3.9.21-macos-aarch64-none /Users/rik/Library/Application Support/uv/python/cpython-3.9.21-macos-aarch64-none/bin/python3.9
55
+ cpython-3.9.20-macos-aarch64-none /Users/rik/Library/Application Support/uv/python/cpython-3.9.20-macos-aarch64-none/bin/python3.9
56
+ cpython-3.9.6-macos-aarch64-none /Library/Developer/CommandLineTools/usr/bin/python3 -> ../../Library/Frameworks/Python3.framework/Versions/3.9/bin/python3
57
+ cpython-3.8.17-macos-aarch64-none /Users/rik/Library/Application Support/uv/python/cpython-3.8.17-macos-aarch64-none/bin/python3.8
58
+ ```
59
+
52
60
 
53
61
  ## Create a virtual environment
54
62
 
@@ -94,6 +102,19 @@ $ uv pip install -e .
94
102
  $ source .venv/bin/activate
95
103
  ```
96
104
 
105
+ !!! info
106
+
107
+ In a workspace, maintaining a virtual environment per package might be a hassle and most of the time that is not
108
+ needed. A good approach is to always use the virtual environment at the workspace root. This `venv` which will be
109
+ automatically created if you run a command or if you use `uv sync` in the package folder. With `uv sync` you can
110
+ make sure the virtual environment is up-to-date and contains only those dependencies that are required for the
111
+ package you are in. So, each time you switch to another package and want to run a comand or a test for that
112
+ package, use
113
+
114
+ ```
115
+ $ uv sync
116
+ ```
117
+
97
118
  ## Building and publishing all packages
98
119
 
99
120
  We have chosen for one and the same version number for all packages in the `cgse` monorepo. That means that whenever
@@ -0,0 +1,18 @@
1
+ # Common Code
2
+
3
+
4
+ This package `cgse-common` contain modules that are used by all other packages.
5
+
6
+ ## Binary: `egse.bits`
7
+
8
+ TBW
9
+
10
+ ## Environment: `egse.env`
11
+
12
+ TBW
13
+
14
+ ## System: `egse.system`
15
+
16
+ TBW
17
+
18
+ ##
@@ -0,0 +1,2 @@
1
+
2
+ # Reference Coordinates
@@ -0,0 +1 @@
1
+ # Core Services
@@ -0,0 +1 @@
1
+ # GUI Components
@@ -0,0 +1,11 @@
1
+
2
+ # Libraries
3
+
4
+ The libraries are those packages that make up the CGSE framework.
5
+
6
+ The libraries are located under the `libs` folder, and we currently find the following packages there:
7
+
8
+ - `cgse-common`
9
+ - `cgse-core`
10
+ - `cgse-coordinates`
11
+ - `cgse-gui`
@@ -0,0 +1,2 @@
1
+
2
+ # Tools for the CGSE framework
@@ -0,0 +1,16 @@
1
+ # Projects
2
+
3
+ The projects are those packages that add functionality to the CGSE framework.
4
+
5
+ The projects live under the folder `projects`, and they are organised in _generic_ and _specific_ projects. Generic
6
+ projects do not have an implementation that is specific for one particular project, while, obviously, specific
7
+ projects have. We currently have the following generic packages:
8
+
9
+ - `cgse-tools`
10
+ - `symetrie-hexapod`
11
+
12
+ and then there are the project specific packages:
13
+
14
+ - `plato-fits`
15
+ - `plato-hdf5`
16
+ - `plato-spw`
@@ -0,0 +1,2 @@
1
+
2
+ # The Symétrie Hexapods
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "cgse-common"
3
- version = "2025.0.4"
3
+ version = "2025.0.5"
4
4
  description = "Software framework to support hardware testing"
5
5
  authors = [
6
6
  {name = "IVS KU Leuven"}
@@ -47,6 +47,7 @@ filterwarnings = [
47
47
  [tool.coverage.run]
48
48
  omit = [
49
49
  "tests/*",
50
+ "conftest.py",
50
51
  ]
51
52
 
52
53
  [tool.hatch.build.targets.sdist]
@@ -5,7 +5,6 @@ import abc
5
5
  import logging
6
6
  import pickle
7
7
  import threading
8
- from typing import Any
9
8
 
10
9
  import zmq
11
10
 
@@ -40,32 +40,38 @@ WARNING:
40
40
  from __future__ import annotations
41
41
 
42
42
  __all__ = [
43
- "get_project_name",
44
- "get_site_id",
45
- "get_data_storage_location",
46
- "set_data_storage_location",
47
- "get_data_storage_location_env_name",
43
+ "env_var",
48
44
  "get_conf_data_location",
49
- "set_conf_data_location",
50
45
  "get_conf_data_location_env_name",
51
46
  "get_conf_repo_location",
52
- "set_conf_repo_location",
53
47
  "get_conf_repo_location_env_name",
48
+ "get_data_storage_location",
49
+ "get_data_storage_location_env_name",
50
+ "get_local_settings",
51
+ "get_local_settings_env_name",
54
52
  "get_log_file_location",
55
- "set_log_file_location",
56
53
  "get_log_file_location_env_name",
57
- "get_local_settings",
54
+ "get_project_name",
55
+ "get_site_id",
56
+ "set_conf_data_location",
57
+ "set_conf_repo_location",
58
+ "set_data_storage_location",
58
59
  "set_local_settings",
59
- "get_local_settings_env_name",
60
+ "set_log_file_location",
60
61
  ]
61
62
 
63
+ import contextlib
62
64
  import os
63
65
  import warnings
64
66
  from pathlib import Path
65
67
 
66
68
  from egse.system import all_logging_disabled
69
+ from egse.system import get_caller_info
67
70
  from egse.system import ignore_m_warning
68
71
 
72
+ from rich.console import Console
73
+ console = Console(width=100)
74
+
69
75
  # Every project shall have a PROJECT and a SITE_ID environment variable set. This variable will be used to
70
76
  # create the other environment variables that are specific to the project.
71
77
 
@@ -123,11 +129,18 @@ class _Env:
123
129
  self._env = {}
124
130
 
125
131
  def set(self, key, value):
126
- self._env[key] = value
132
+ if value is None:
133
+ if key in self._env:
134
+ del self._env[key]
135
+ else:
136
+ self._env[key] = value
127
137
 
128
138
  def get(self, key) -> str:
129
139
  return self._env.get(key, NoValue())
130
140
 
141
+ def __rich__(self):
142
+ return self._env
143
+
131
144
 
132
145
  _env = _Env()
133
146
 
@@ -159,28 +172,60 @@ def _check_no_value(var_name, value):
159
172
  """Raise a ValueError when the value for the variable is NoValue."""
160
173
  if value == NoValue():
161
174
  project = _env.get("PROJECT")
162
- env_name = var_name if var_name == "SITE_ID" else f"{project}_{var_name}"
175
+ env_name = var_name if var_name in ("PROJECT", "SITE_ID") else f"{project}_{var_name}"
163
176
  raise ValueError(
164
177
  f"The environment variable {env_name} is not set. "
165
178
  f"Please set the environment variable before proceeding."
166
179
  )
167
180
 
168
181
 
182
+ def set_default_environment(
183
+ project: str,
184
+ site_id: str,
185
+ data_storage_location: str | Path,
186
+ conf_data_location: str | Path | None = None,
187
+ conf_repo_location: str | Path | None = None,
188
+ log_file_location: str | Path | None = None,
189
+ local_settings: str | Path | None = None,
190
+ ):
191
+ set_project_name(project)
192
+ set_site_id(site_id)
193
+ set_data_storage_location(data_storage_location)
194
+ set_conf_data_location(conf_data_location)
195
+ set_conf_repo_location(conf_repo_location)
196
+ set_log_file_location(log_file_location)
197
+ set_local_settings(local_settings)
198
+
199
+
169
200
  def get_project_name():
201
+ """Get the PROJECT name. Return None when the PROJECT is not set."""
170
202
  return _env.get("PROJECT") or None
171
203
 
172
204
 
205
+ def set_project_name(name: str):
206
+ """Set the environment variable PROJECT and its internal representation."""
207
+ os.environ["PROJECT"] = name
208
+ _env.set("PROJECT", name)
209
+
210
+
173
211
  def get_site_id():
212
+ """Get the SITE_ID. Return None if the SITE_ID is not set."""
174
213
  return _env.get("SITE_ID") or None
175
214
 
176
215
 
216
+ def set_site_id(name: str):
217
+ """Set the environment variable SITE_ID and its internal representation."""
218
+ os.environ["SITE_ID"] = name
219
+ _env.set("SITE_ID", name)
220
+
221
+
177
222
  def get_data_storage_location_env_name() -> str:
178
223
  """Returns the name of the environment variable for the project."""
179
224
  project = _env.get("PROJECT")
180
225
  return f"{project}_DATA_STORAGE_LOCATION"
181
226
 
182
227
 
183
- def set_data_storage_location(location: str | Path):
228
+ def set_data_storage_location(location: str | Path | None):
184
229
  """
185
230
  Sets the environment variable and the internal representation to the given value.
186
231
 
@@ -189,14 +234,19 @@ def set_data_storage_location(location: str | Path):
189
234
  """
190
235
  env_name = get_data_storage_location_env_name()
191
236
 
192
- # Check if location exists and is readable
237
+ if location is None:
238
+ if env_name in os.environ:
239
+ del os.environ[env_name]
240
+ _env.set("DATA_STORAGE_LOCATION", None)
241
+ return
242
+
193
243
  if not Path(location).exists():
194
244
  warnings.warn(
195
245
  f"The location you provided for the environment variable {env_name} doesn't exist: {location}."
196
246
  )
197
247
 
198
- os.environ[env_name] = location
199
- _env.set('DATA_STORAGE_LOCATION', location)
248
+ os.environ[env_name] = str(location)
249
+ _env.set('DATA_STORAGE_LOCATION', str(location))
200
250
 
201
251
 
202
252
  def get_data_storage_location(site_id: str = None) -> str:
@@ -223,6 +273,9 @@ def get_data_storage_location(site_id: str = None) -> str:
223
273
  """
224
274
  global _env
225
275
 
276
+ project = _env.get("PROJECT")
277
+ _check_no_value("PROJECT", project)
278
+
226
279
  site_id = site_id or _env.get("SITE_ID")
227
280
  _check_no_value("SITE_ID", site_id)
228
281
 
@@ -240,7 +293,7 @@ def get_conf_data_location_env_name() -> str:
240
293
  return f"{project}_CONF_DATA_LOCATION"
241
294
 
242
295
 
243
- def set_conf_data_location(location: str | Path):
296
+ def set_conf_data_location(location: str | Path | None):
244
297
  """
245
298
  Sets the environment variable and the internal representation to the given value.
246
299
 
@@ -250,7 +303,12 @@ def set_conf_data_location(location: str | Path):
250
303
 
251
304
  env_name = get_conf_data_location_env_name()
252
305
 
253
- # Check if location exists and is readable
306
+ if location is None:
307
+ if env_name in os.environ:
308
+ del os.environ[env_name]
309
+ _env.set("CONF_DATA_LOCATION", None)
310
+ return
311
+
254
312
  if not Path(location).exists():
255
313
  warnings.warn(
256
314
  f"The location you provided for the environment variable {env_name} doesn't exist: {location}."
@@ -303,7 +361,7 @@ def get_log_file_location_env_name():
303
361
  return f"{project}_LOG_FILE_LOCATION"
304
362
 
305
363
 
306
- def set_log_file_location(location: str | Path):
364
+ def set_log_file_location(location: str | Path | None):
307
365
  """
308
366
  Sets the environment variable and the internal representation to the given value.
309
367
 
@@ -313,7 +371,12 @@ def set_log_file_location(location: str | Path):
313
371
 
314
372
  env_name = get_log_file_location_env_name()
315
373
 
316
- # Check if location exists and is readable
374
+ if location is None:
375
+ if env_name in os.environ:
376
+ del os.environ[env_name]
377
+ _env.set("LOG_FILE_LOCATION", None)
378
+ return
379
+
317
380
  if not Path(location).exists():
318
381
  warnings.warn(
319
382
  f"The location you provided for the environment variable {env_name} doesn't exist: {location}."
@@ -365,17 +428,24 @@ def get_local_settings_env_name() -> str:
365
428
  return f"{project}_LOCAL_SETTINGS"
366
429
 
367
430
 
368
- def set_local_settings(path: str | Path):
431
+ def set_local_settings(path: str | Path | None):
369
432
  """
370
433
  Sets the environment variable and the internal representation to the given value.
371
434
 
435
+ When the path is set to None, the environment variable will be unset.
436
+
372
437
  Warnings:
373
438
  Issues a warning when the given path doesn't exist.
374
439
  """
375
440
 
376
441
  env_name = get_local_settings_env_name()
377
442
 
378
- # Check if location exists and is readable
443
+ if path is None:
444
+ if env_name in os.environ:
445
+ del os.environ[env_name]
446
+ _env.set('LOCAL_SETTINGS', None)
447
+ return
448
+
379
449
  if not Path(path).exists():
380
450
  warnings.warn(
381
451
  f"The location you provided for the environment variable {env_name} doesn't exist: {path}."
@@ -399,34 +469,61 @@ def get_local_settings() -> str:
399
469
  return local_settings or None
400
470
 
401
471
 
472
+ def has_conf_repo_location() -> bool:
473
+ location = _env.get("CONF_REPO_LOCATION")
474
+ return True if location else False
475
+
476
+
402
477
  def get_conf_repo_location_env_name() -> str:
403
478
  """Returns the name of the environment variable for the project."""
404
479
  project = _env.get("PROJECT")
405
480
  return f"{project}_CONF_REPO_LOCATION"
406
481
 
407
482
 
408
- def get_conf_repo_location() -> str:
409
- """Returns the fully qualified name of the location of the repository with configuration and calibration data."""
483
+ def get_conf_repo_location() -> str | None:
484
+ """
485
+ Returns the fully qualified name of the location of the repository with
486
+ configuration and calibration data.
487
+
488
+ Returns None if no environment variable was defined or if the location doesn't exist.
489
+ In both cases a Warning is issued.
490
+ """
410
491
 
411
492
  location = _env.get("CONF_REPO_LOCATION")
412
493
 
413
- if location and not Path(location).exists():
494
+ if location in (None, NoValue()):
495
+ warnings.warn(
496
+ f"The environment variable for the configuration data repository is "
497
+ f"not defined ({get_conf_repo_location_env_name()})."
498
+ )
499
+ return None
500
+
501
+ if not Path(location).exists():
414
502
  warnings.warn(f"The location of the configuration data repository doesn't exist: {location}.")
503
+ return None
415
504
 
416
- return location or None
505
+ return location
417
506
 
418
507
 
419
- def set_conf_repo_location(location: str):
508
+ def set_conf_repo_location(location: str | Path | None):
420
509
  """
421
510
  Sets the environment variable and the internal representation to the given value.
422
511
 
512
+ When the location is None, the environment variable will be unset and its internal
513
+ representation will be NoValue().
514
+
423
515
  Warnings:
424
516
  Issues a warning when the given location doesn't exist.
425
517
  """
426
518
 
427
519
  env_name = get_conf_repo_location_env_name()
428
520
 
429
- # Check if location exists and is readable
521
+ if location is None:
522
+ if env_name in os.environ:
523
+ del os.environ[env_name]
524
+ _env.set("CONF_REPO_LOCATION", None)
525
+ return
526
+
430
527
  if not Path(location).exists():
431
528
  warnings.warn(
432
529
  f"The location you provided for the environment variable {env_name} doesn't exist: {location}."
@@ -436,7 +533,69 @@ def set_conf_repo_location(location: str):
436
533
  _env.set('CONF_REPO_LOCATION', location)
437
534
 
438
535
 
439
- ignore_m_warning('egse.env')
536
+ def print_env():
537
+ """
538
+ Prints out the mandatory and known environment variables at the time of the
539
+ function call. The function and lineno is also printed for information.
540
+ """
541
+ col_width = 30
542
+
543
+ console = Console(width=200)
544
+
545
+ with warnings.catch_warnings():
546
+ warnings.simplefilter("ignore")
547
+ caller_info = get_caller_info(level=2)
548
+ console.print(f"[b]Environment as in {caller_info.filename}:{caller_info.lineno}[/]")
549
+ console.print(f" {'PROJECT':{col_width}s}: {get_project_name()}")
550
+ console.print(f" {'SITE_ID':{col_width}s}: {get_site_id()}")
551
+ console.print(f" {get_data_storage_location_env_name():{col_width}s}: {get_data_storage_location()}")
552
+ console.print(f" {get_log_file_location_env_name():{col_width}s}: {get_log_file_location()}")
553
+ console.print(f" {get_conf_data_location_env_name():{col_width}s}: {get_conf_data_location()}")
554
+ console.print(f" {get_conf_repo_location_env_name():{col_width}s}: {get_conf_repo_location()}")
555
+ console.print(f" {get_local_settings_env_name():{col_width}s}: {get_local_settings()}")
556
+
557
+
558
+ @contextlib.contextmanager
559
+ def env_var(**kwargs):
560
+ """
561
+ Context manager to run some code that need alternate settings for environment variables.
562
+ This will automatically initialize the CGSE environment upon entry and re-initialize upon exit.
563
+
564
+ NOTE: This context manager is different from the one from `egse.system` because of the CGSE environment changes.
565
+
566
+ Args:
567
+ **kwargs: dictionary with environment variables that are needed
568
+
569
+ Examples:
570
+
571
+ >>> from egse.env import env_var
572
+ >>> with env_var(PLATO_DATA_STORAGE_LOCATION="/Users/rik/data"):
573
+ ... # do stuff that needs these alternate setting
574
+ ... pass
575
+
576
+ """
577
+ saved_env = {}
578
+
579
+ for k, v in kwargs.items():
580
+ saved_env[k] = os.environ.get(k)
581
+ if v is None:
582
+ if k in os.environ:
583
+ del os.environ[k]
584
+ else:
585
+ os.environ[k] = v
586
+
587
+ initialize()
588
+
589
+ yield
590
+
591
+ for k, v in saved_env.items():
592
+ if v is None:
593
+ if k in os.environ:
594
+ del os.environ[k]
595
+ else:
596
+ os.environ[k] = v
597
+
598
+ initialize()
440
599
 
441
600
 
442
601
  def main(args: list | None = None): # pragma: no cover
@@ -517,8 +676,10 @@ def main(args: list | None = None): # pragma: no cover
517
676
  location = get_data_storage_location()
518
677
  if not Path(location).exists():
519
678
  if args.mkdir:
520
- rich.print(f" [green]⟶ Creating data storage location: {location}[/]")
679
+ rich.print(f" [green]⟶ Creating data storage location: {location} (+ daily + obs)[/]")
521
680
  Path(location).mkdir(parents=True)
681
+ (Path(location) / "daily").mkdir()
682
+ (Path(location) / "obs").mkdir()
522
683
  else:
523
684
  rich.print(" [red]⟶ ERROR: The data storage location doesn't exist![/]")
524
685
  else:
@@ -540,6 +701,16 @@ def main(args: list | None = None): # pragma: no cover
540
701
  except ValueError as exc:
541
702
  rich.print(f" get_conf_data_location() = [red]{exc}[/]")
542
703
 
704
+ try:
705
+ rich.print(f" {get_conf_repo_location() = }", flush=True, end="")
706
+ location = get_conf_repo_location()
707
+ if location is None or not Path(location).exists():
708
+ rich.print(" [red]⟶ ERROR: The configuration repository location doesn't exist![/]")
709
+ else:
710
+ rich.print()
711
+ except ValueError as exc:
712
+ rich.print(f" get_conf_repo_location() = [red]{exc}[/]")
713
+
543
714
  try:
544
715
  rich.print(f" {get_log_file_location() = }", flush=True, end="")
545
716
  location = get_log_file_location()
@@ -623,6 +794,9 @@ def main(args: list | None = None): # pragma: no cover
623
794
  # PLATO_COMMON_EGSE_PATH - YES
624
795
 
625
796
 
797
+ ignore_m_warning('egse.env')
798
+
799
+
626
800
  if __name__ == "__main__":
627
801
  import sys
628
802
  main(sys.argv[1:])
@@ -20,7 +20,7 @@ from prometheus_client import Summary
20
20
  from egse.command import Command
21
21
  from egse.command import CommandExecution
22
22
  from egse.control import ControlServer
23
- from egse.control import Failure
23
+ from egse.response import Failure
24
24
  from egse.device import DeviceConnectionObserver
25
25
  from egse.system import format_datetime
26
26
  from egse.zmq_ser import bind_address
@@ -2,9 +2,10 @@
2
2
  This module provides functionality to handle responses from the control servers.
3
3
  """
4
4
  __all__ = [
5
- "Success",
6
5
  "Failure",
7
6
  "Message",
7
+ "Response",
8
+ "Success",
8
9
  ]
9
10
 
10
11
  from typing import Any
@@ -10,6 +10,7 @@ logging levels, or to quit the control server in a controlled way.
10
10
 
11
11
  import inspect
12
12
  import logging
13
+ from pathlib import Path
13
14
 
14
15
  from egse.command import ClientServerCommand
15
16
  from egse.control import ControlServer
@@ -22,7 +23,9 @@ from egse.zmq_ser import connect_address
22
23
 
23
24
  LOGGER = logging.getLogger(__name__)
24
25
 
25
- SERVICE_SETTINGS = Settings.load(filename="services.yaml")
26
+ HERE = Path(__file__).parent
27
+
28
+ SERVICE_SETTINGS = Settings.load(filename=str(HERE / "services.yaml"))
26
29
 
27
30
 
28
31
  class ServiceCommand(ClientServerCommand):