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.
- {cgse-2025.0.4 → cgse-2025.0.5}/NOTES.md +0 -23
- {cgse-2025.0.4 → cgse-2025.0.5}/PKG-INFO +1 -1
- cgse-2025.0.5/conftest.py +30 -0
- cgse-2025.0.5/docs/dev_guide/index.md +6 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/docs/dev_guide/uv.md +30 -9
- cgse-2025.0.5/docs/libs/cgse-common/index.md +18 -0
- cgse-2025.0.5/docs/libs/cgse-coordinates/index.md +2 -0
- cgse-2025.0.5/docs/libs/cgse-core/index.md +1 -0
- cgse-2025.0.5/docs/libs/cgse-gui/index.md +1 -0
- cgse-2025.0.5/docs/libs/index.md +11 -0
- cgse-2025.0.5/docs/projects/cgse-tools.md +2 -0
- cgse-2025.0.5/docs/projects/index.md +16 -0
- cgse-2025.0.5/docs/projects/symetrie-hexapod.md +2 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/pyproject.toml +2 -1
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/control.py +0 -1
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/env.py +204 -30
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/protocol.py +1 -1
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/response.py +2 -1
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/services.py +4 -1
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/settings.py +182 -129
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/setup.py +37 -22
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/system.py +23 -17
- cgse-2025.0.5/libs/cgse-common/tests/conftest.py +4 -0
- cgse-2025.0.5/libs/cgse-common/tests/data/data/command.yaml +5 -0
- cgse-2025.0.5/libs/cgse-common/tests/fixtures/default_env.py +38 -0
- cgse-2025.0.5/libs/cgse-common/tests/fixtures/helpers.py +237 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/test_env.py +53 -34
- cgse-2025.0.5/libs/cgse-common/tests/test_fixtures.py +12 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/test_hk.py +32 -12
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/test_resource.py +2 -2
- cgse-2025.0.5/libs/cgse-common/tests/test_settings.py +14 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/test_setup.py +279 -77
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/test_system.py +2 -2
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-coordinates/pyproject.toml +1 -1
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/pyproject.toml +17 -4
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/src/egse/confman/__init__.py +47 -26
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/src/egse/confman/confman_cs.py +7 -10
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/src/egse/logger/log_cs.py +2 -2
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/src/egse/procman/__init__.py +7 -2
- cgse-2025.0.5/libs/cgse-core/src/egse/settings.yaml +32 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/src/egse/storage/__init__.py +12 -11
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/src/egse/storage/storage_cs.py +4 -4
- cgse-2025.0.5/libs/cgse-core/tests/conftest.py +5 -0
- cgse-2025.0.5/libs/cgse-core/tests/data/local_settings.yaml +8 -0
- cgse-2025.0.5/libs/cgse-core/tests/fixtures/default_env.py +38 -0
- cgse-2025.0.5/libs/cgse-core/tests/fixtures/helpers.py +237 -0
- cgse-2025.0.4/libs/cgse-core/tests/conftest.py → cgse-2025.0.5/libs/cgse-core/tests/fixtures/services.py +3 -6
- cgse-2025.0.5/libs/cgse-core/tests/test_confman_setups.py +35 -0
- cgse-2025.0.5/libs/cgse-core/tests/test_settings_core.py +122 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/pyproject.toml +1 -1
- {cgse-2025.0.4 → cgse-2025.0.5}/mkdocs.yml +38 -9
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/cgse-tools/pyproject.toml +1 -1
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/pyproject.toml +1 -1
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/plato/plato-fits/pyproject.toml +1 -1
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/plato/plato-hdf5/pyproject.toml +1 -1
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/plato/plato-spw/pyproject.toml +1 -1
- {cgse-2025.0.4 → cgse-2025.0.5}/pyproject.toml +18 -1
- cgse-2025.0.4/docs/dev_guide/index.md +0 -3
- cgse-2025.0.4/docs.zip +0 -0
- cgse-2025.0.4/libs/cgse-common/tests/conftest.py +0 -19
- cgse-2025.0.4/libs/cgse-common/tests/helpers.py +0 -108
- cgse-2025.0.4/libs/cgse-core/tests/test_confman_setups.py +0 -25
- {cgse-2025.0.4 → cgse-2025.0.5}/.gitignore +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/README.md +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/TODO.md +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/bump.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/docs/custom_theme/main.html +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/docs/dev_guide/coding_style.md +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/docs/dev_guide/docs.md +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/docs/dev_guide/installation.md +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/docs/getting_started.md +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/docs/help.md +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/docs/images/icons/cgse-logo-blue.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/docs/images/icons/cgse-logo.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/docs/index.md +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/docs/stylesheets/custom.css +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/docs/tutorial.md +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/docs/user_guide/index.md +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/README.md +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/bits.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/calibration.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/command.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/config.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/decorators.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/device.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/exceptions.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/hk.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/metrics.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/mixin.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/monitoring.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/observer.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/obsid.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/persistence.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/plugin.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/process.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/proxy.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/reload.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/resource.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/services.yaml +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/settings.yaml +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/state.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/version.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/src/egse/zmq_ser.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00028_201028_155259.yaml +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00029_201028_155331.yaml +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00030_210311_134043.yaml +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00080_210917_105245.yaml +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00081_210922_142259.yaml +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00082_210923_094458.yaml +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/CSL1/README.md +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/CSL2/README.md +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/IAS/README.md +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/INTA/README.md +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/LAB23/README.md +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00027_211119_140441.yaml +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00028_211119_160406.yaml +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00029_211119_172918.yaml +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00030_211122_103604.yaml +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00031_211123_124900.yaml +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/common/telemetry/tm-dictionary-default.csv +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/conf/SETUP_20250114_1519.yaml +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/conf/config-file.toml +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/data/cal_coeff_1234.csv +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/data/calibration.csv +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/data/calibration.yaml +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/data/corrupt.yaml +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/data/data-file.txt +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/data/empty_data_file.txt +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/data/test_setup.yaml +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/icons/keyboard.png +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/lib/dev1/shared-lib.so +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/data/lib/dev2/shared-lib.so +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/dummy.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/test_bits.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/test_command.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/test_config.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/test_control.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/test_decorators.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/test_device.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-common/tests/test_response.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-coordinates/README.md +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-coordinates/src/egse/coordinates/__init__.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-coordinates/src/egse/coordinates/avoidance.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-coordinates/src/egse/coordinates/cslmodel.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-coordinates/src/egse/coordinates/laser_tracker_to_dict.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-coordinates/src/egse/coordinates/point.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-coordinates/src/egse/coordinates/pyplot.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-coordinates/src/egse/coordinates/referenceFrame.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-coordinates/src/egse/coordinates/refmodel.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-coordinates/src/egse/coordinates/rotationMatrix.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-coordinates/src/egse/coordinates/transform3d_addon.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/.envrc.disabled +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/README.md +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/src/egse/confman/__main__.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/src/egse/confman/confman.yaml +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/src/egse/logger/__init__.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/src/egse/logger/__main__.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/src/egse/procman/procman.yaml +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/src/egse/procman/procman_cs.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/src/egse/storage/__main__.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/src/egse/storage/persistence.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/src/egse/storage/storage.yaml +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/src/scripts/cgse.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-core/tests/test_logger.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/README.md +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/__init__.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/buttons.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/aeu-cs-start.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/aeu-cs-stop.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/aeu-cs.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/aeu_cs-started.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/aeu_cs-stopped.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/aeu_cs.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/alert.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/arrow-double-left.png +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/arrow-double-right.png +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/arrow-up.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/backward.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/busy.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/cleaning.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/color-scheme.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/cs-connected-alert.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/cs-connected-disabled.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/cs-connected.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/cs-not-connected.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/double-left-arrow.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/double-right-arrow.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/erase-disabled.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/erase.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/fitsgen-start.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/fitsgen-stop.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/fitsgen.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/forward.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/fov-hk-start.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/fov-hk-stop.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/fov-hk.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/front-desk.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/home-actioned.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/home-disabled.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/home.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/info.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/invalid.png +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/led-green.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/led-grey.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/led-orange.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/led-red.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/led-square-green.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/led-square-grey.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/led-square-orange.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/led-square-red.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/limit-switch-all-green.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/limit-switch-all-red.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/limit-switch-el+.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/limit-switch-el-.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/location-marker.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/logo-dpu.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/logo-gimbal.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/logo-huber.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/logo-ogse.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/logo-puna.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/logo-tcs.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/logo-zonda.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/maximize.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/meter.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/more.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk-start.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk-stop.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/observing-off.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/observing-on.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/open-document-hdf5.png +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/open-document-hdf5.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/ops-mode.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/play-green.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/plugged-disabled.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/plugged.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/pm_ui.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/power-button-green.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/power-button-red.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/power-button.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/radar.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/radioactive.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/reload.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/remote-control-off.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/remote-control-on.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/repeat-blue.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/repeat.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/settings.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/shrink.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/shutter.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/sign-off.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/sign-on.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/sim-mode.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/small-buttons-go.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/small-buttons-minus.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/small-buttons-plus.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/sponge.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/start-button-disabled.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/start-button.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/stop-button-disabled.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/stop-button.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/stop-red.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/stop.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/switch-disabled-square.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/switch-disabled.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/switch-off-square.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/switch-off.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/switch-on-square.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/switch-on.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/temperature-control.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/th_ui_logo.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/unplugged.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/unvalid.png +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/user-interface.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/vacuum.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/valid.png +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/zoom-to-pixel-dark.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/icons/zoom-to-pixel-white.svg +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/led.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/limitswitch.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/states.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/styles/dark.qss +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/styles/default.qss +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/styles.qss +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/libs/cgse-gui/src/egse/gui/switch.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/cgse-tools/README.md +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/cgse-tools/src/egse/tools/status.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/cgse-tools/src/scripts/cgse_plugins.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/cgse-tools/src/scripts/cgse_service_plugins.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/README.md +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/__init__.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/__init__.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/alpha.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/dynalpha.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/hexapod_ui.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran.yaml +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_cs.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_protocol.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_ui.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/pmac.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/pmac_regex.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna.yaml +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_cs.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_protocol.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_ui.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/punaplus.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda.yaml +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_cs.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_devif.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_protocol.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_ui.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/generic/symetrie-hexapod/src/scripts/cgse_service_plugins.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/plato/plato-fits/README.md +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/plato/plato-fits/src/egse/plugins/storage/fits.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/plato/plato-hdf5/README.md +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/plato/plato-hdf5/src/egse/plugins/storage/hdf5.py +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/plato/plato-spw/README.md +0 -0
- {cgse-2025.0.4 → cgse-2025.0.5}/projects/plato/plato-spw/src/egse/spw.py +0 -0
- {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
|
|
|
@@ -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
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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 @@
|
|
|
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,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`
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "cgse-common"
|
|
3
|
-
version = "2025.0.
|
|
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]
|
|
@@ -40,32 +40,38 @@ WARNING:
|
|
|
40
40
|
from __future__ import annotations
|
|
41
41
|
|
|
42
42
|
__all__ = [
|
|
43
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
"""
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
|
@@ -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
|
-
|
|
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):
|