cgse 2025.0.1__tar.gz → 2025.0.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {cgse-2025.0.1 → cgse-2025.0.3}/.gitignore +4 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/PKG-INFO +1 -1
- cgse-2025.0.3/docs/custom_theme/main.html +54 -0
- cgse-2025.0.3/docs/dev_guide/coding_style.md +95 -0
- cgse-2025.0.3/docs/dev_guide/docs.md +53 -0
- cgse-2025.0.3/docs/dev_guide/index.md +3 -0
- cgse-2025.0.3/docs/dev_guide/installation.md +2 -0
- cgse-2025.0.3/docs/dev_guide/uv.md +131 -0
- cgse-2025.0.3/docs/getting_started.md +6 -0
- cgse-2025.0.3/docs/help.md +9 -0
- cgse-2025.0.3/docs/images/icons/cgse-logo-blue.svg +180 -0
- cgse-2025.0.3/docs/images/icons/cgse-logo.svg +365 -0
- cgse-2025.0.3/docs/index.md +30 -0
- cgse-2025.0.3/docs/stylesheets/custom.css +121 -0
- cgse-2025.0.3/docs/tutorial.md +10 -0
- cgse-2025.0.3/docs/user_guide/index.md +3 -0
- cgse-2025.0.3/docs.zip +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/pyproject.toml +1 -1
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/src/egse/version.py +4 -2
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-coordinates/pyproject.toml +1 -1
- cgse-2025.0.3/libs/cgse-core/.envrc.disabled +9 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-core/pyproject.toml +1 -1
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/pyproject.toml +1 -1
- cgse-2025.0.3/mkdocs.yml +81 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/generic/cgse-tools/pyproject.toml +1 -1
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/generic/symetrie-hexapod/pyproject.toml +1 -1
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/plato/plato-fits/pyproject.toml +1 -1
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/plato/plato-hdf5/pyproject.toml +1 -1
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/plato/plato-spw/pyproject.toml +1 -1
- {cgse-2025.0.1 → cgse-2025.0.3}/pyproject.toml +1 -1
- {cgse-2025.0.1 → cgse-2025.0.3}/NOTES.md +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/README.md +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/TODO.md +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/bump.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/README.md +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/src/egse/bits.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/src/egse/calibration.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/src/egse/command.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/src/egse/config.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/src/egse/control.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/src/egse/decorators.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/src/egse/device.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/src/egse/env.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/src/egse/exceptions.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/src/egse/hk.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/src/egse/metrics.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/src/egse/mixin.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/src/egse/monitoring.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/src/egse/observer.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/src/egse/obsid.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/src/egse/persistence.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/src/egse/plugin.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/src/egse/process.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/src/egse/protocol.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/src/egse/proxy.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/src/egse/reload.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/src/egse/resource.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/src/egse/response.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/src/egse/services.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/src/egse/services.yaml +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/src/egse/settings.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/src/egse/settings.yaml +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/src/egse/setup.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/src/egse/state.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/src/egse/system.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/src/egse/zmq_ser.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00028_201028_155259.yaml +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00029_201028_155331.yaml +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00030_210311_134043.yaml +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00080_210917_105245.yaml +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00081_210922_142259.yaml +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00082_210923_094458.yaml +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/data/CSL1/README.md +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/data/CSL2/README.md +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/data/IAS/README.md +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/data/INTA/README.md +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00027_211119_140441.yaml +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00028_211119_160406.yaml +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00029_211119_172918.yaml +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00030_211122_103604.yaml +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00031_211123_124900.yaml +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/data/conf/SETUP_20250114_1519.yaml +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/data/conf/config-file.toml +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/data/data/cal_coeff_1234.csv +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/data/data/calibration.csv +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/data/data/calibration.yaml +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/data/data/corrupt.yaml +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/data/data/data-file.txt +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/data/data/empty_data_file.txt +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/data/data/test_setup.yaml +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/data/icons/keyboard.png +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/data/lib/dev1/shared-lib.so +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/data/lib/dev2/shared-lib.so +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/dummy.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/helpers.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/test_bits.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/test_command.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/test_config.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/test_control.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/test_decorators.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/test_device.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/test_env.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/test_hk.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/test_resource.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/test_response.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/test_setup.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-common/tests/test_system.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-coordinates/README.md +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-coordinates/src/egse/coordinates/__init__.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-coordinates/src/egse/coordinates/avoidance.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-coordinates/src/egse/coordinates/cslmodel.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-coordinates/src/egse/coordinates/laser_tracker_to_dict.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-coordinates/src/egse/coordinates/point.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-coordinates/src/egse/coordinates/pyplot.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-coordinates/src/egse/coordinates/referenceFrame.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-coordinates/src/egse/coordinates/refmodel.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-coordinates/src/egse/coordinates/rotationMatrix.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-coordinates/src/egse/coordinates/transform3d_addon.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-core/README.md +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-core/src/egse/confman/__init__.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-core/src/egse/confman/__main__.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-core/src/egse/confman/confman.yaml +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-core/src/egse/confman/confman_cs.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-core/src/egse/logger/__init__.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-core/src/egse/logger/__main__.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-core/src/egse/logger/log_cs.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-core/src/egse/procman/__init__.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-core/src/egse/procman/procman.yaml +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-core/src/egse/procman/procman_cs.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-core/src/egse/storage/__init__.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-core/src/egse/storage/__main__.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-core/src/egse/storage/persistence.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-core/src/egse/storage/storage.yaml +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-core/src/egse/storage/storage_cs.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-core/src/scripts/cgse.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-core/tests/conftest.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-core/tests/test_confman_setups.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-core/tests/test_logger.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/README.md +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/__init__.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/buttons.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/aeu-cs-start.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/aeu-cs-stop.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/aeu-cs.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/aeu_cs-started.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/aeu_cs-stopped.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/aeu_cs.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/alert.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/arrow-double-left.png +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/arrow-double-right.png +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/arrow-up.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/backward.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/busy.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/cleaning.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/color-scheme.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/cs-connected-alert.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/cs-connected-disabled.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/cs-connected.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/cs-not-connected.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/double-left-arrow.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/double-right-arrow.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/erase-disabled.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/erase.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/fitsgen-start.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/fitsgen-stop.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/fitsgen.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/forward.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/fov-hk-start.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/fov-hk-stop.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/fov-hk.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/front-desk.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/home-actioned.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/home-disabled.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/home.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/info.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/invalid.png +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/led-green.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/led-grey.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/led-orange.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/led-red.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/led-square-green.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/led-square-grey.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/led-square-orange.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/led-square-red.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/limit-switch-all-green.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/limit-switch-all-red.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/limit-switch-el+.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/limit-switch-el-.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/location-marker.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/logo-dpu.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/logo-gimbal.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/logo-huber.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/logo-ogse.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/logo-puna.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/logo-tcs.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/logo-zonda.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/maximize.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/meter.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/more.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk-start.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk-stop.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/observing-off.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/observing-on.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/open-document-hdf5.png +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/open-document-hdf5.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/ops-mode.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/play-green.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/plugged-disabled.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/plugged.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/pm_ui.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/power-button-green.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/power-button-red.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/power-button.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/radar.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/radioactive.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/reload.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/remote-control-off.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/remote-control-on.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/repeat-blue.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/repeat.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/settings.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/shrink.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/shutter.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/sign-off.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/sign-on.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/sim-mode.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/small-buttons-go.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/small-buttons-minus.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/small-buttons-plus.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/sponge.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/start-button-disabled.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/start-button.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/stop-button-disabled.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/stop-button.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/stop-red.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/stop.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/switch-disabled-square.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/switch-disabled.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/switch-off-square.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/switch-off.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/switch-on-square.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/switch-on.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/temperature-control.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/th_ui_logo.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/unplugged.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/unvalid.png +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/user-interface.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/vacuum.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/valid.png +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/zoom-to-pixel-dark.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/icons/zoom-to-pixel-white.svg +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/led.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/limitswitch.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/states.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/styles/dark.qss +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/styles/default.qss +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/styles.qss +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/libs/cgse-gui/src/egse/gui/switch.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/generic/cgse-tools/README.md +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/generic/cgse-tools/src/egse/tools/status.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/generic/cgse-tools/src/scripts/cgse_plugins.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/generic/cgse-tools/src/scripts/cgse_service_plugins.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/generic/symetrie-hexapod/README.md +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/generic/symetrie-hexapod/src/egse/hexapod/__init__.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/__init__.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/alpha.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/dynalpha.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/hexapod_ui.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran.yaml +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_cs.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_protocol.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_ui.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/pmac.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/pmac_regex.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna.yaml +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_cs.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_protocol.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_ui.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/punaplus.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda.yaml +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_cs.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_devif.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_protocol.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_ui.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/generic/symetrie-hexapod/src/scripts/cgse_service_plugins.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/plato/plato-fits/README.md +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/plato/plato-fits/src/egse/plugins/storage/fits.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/plato/plato-hdf5/README.md +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/plato/plato-hdf5/src/egse/plugins/storage/hdf5.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/plato/plato-spw/README.md +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/projects/plato/plato-spw/src/egse/spw.py +0 -0
- {cgse-2025.0.1 → cgse-2025.0.3}/ruff.toml +0 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{% extends "base.html" %}
|
|
2
|
+
|
|
3
|
+
{% block extrahead %}
|
|
4
|
+
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/fira_code.min.css" integrity="sha512-MbysAYimH1hH2xYzkkMHB6MqxBqfP0megxsCLknbYqHVwXTCg9IqHbk+ZP/vnhO8UEW6PaXAkKe2vQ+SWACxxA==" crossorigin="anonymous" referrerpolicy="no-referrer" />
|
|
5
|
+
<!-- Fathom - beautiful, simple website analytics -->
|
|
6
|
+
<script src="https://cdn.usefathom.com/script.js" data-site="TAUKXRLQ" defer></script>
|
|
7
|
+
<!-- / Fathom -->
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
<meta name="twitter:card" content="summary">
|
|
11
|
+
<meta name="twitter:site" content="@textualizeio">
|
|
12
|
+
<meta name="twitter:creator" content="@willmcgugan">
|
|
13
|
+
<meta property="og:title" content="Textual - {{ page.title }}">
|
|
14
|
+
<meta property="og:type" content="article">
|
|
15
|
+
<meta property="og:url" content="{{ page.canonical_url | url }}">
|
|
16
|
+
<meta property="og:site_name" content="Textual Documentation">
|
|
17
|
+
<meta property="og:description" content="Textual is a TUI framework for Python, inspired by modern web development.">
|
|
18
|
+
<meta property="og:image" content="https://raw.githubusercontent.com/Textualize/textual/main/imgs/textual.png">
|
|
19
|
+
|
|
20
|
+
<style>
|
|
21
|
+
|
|
22
|
+
@font-face {
|
|
23
|
+
font-family: "Virgil";
|
|
24
|
+
src: url("https://unpkg.com/@excalidraw/excalidraw@0.12.0/dist/excalidraw-assets/Virgil.woff2");
|
|
25
|
+
}
|
|
26
|
+
@font-face {
|
|
27
|
+
font-family: "Cascadia";
|
|
28
|
+
src: url("https://unpkg.com/@excalidraw/excalidraw@0.12.0/dist/excalidraw-assets/Cascadia.woff2");
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
</style>
|
|
34
|
+
|
|
35
|
+
<script lang="js">
|
|
36
|
+
window.onload = async (event) => {
|
|
37
|
+
const demos = document.querySelectorAll(".textual-web-demo");
|
|
38
|
+
|
|
39
|
+
if (demos.length){
|
|
40
|
+
await fetch("https://textual-web-demos.fly.dev/health-check/", {
|
|
41
|
+
method: 'GET',
|
|
42
|
+
mode: 'no-cors'
|
|
43
|
+
});
|
|
44
|
+
demos.forEach((element)=>{
|
|
45
|
+
const app = element.dataset.app;
|
|
46
|
+
const iframe_html = `<div class="textual-web-demo"><iframe width="100%" onload="this.parentElement.classList.add('-loaded');" src="https://textual-web.io/textualize/${app}?delay=y&fontsize=12&ping=https://textual-web-demos.fly.dev/health-check/"></iframe></div>`;
|
|
47
|
+
element.outerHTML = iframe_html;
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
</script>
|
|
53
|
+
|
|
54
|
+
{% endblock %}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# Style Guide
|
|
2
|
+
|
|
3
|
+
This part of the developer guide contains instructions for coding styles that are adopted for this project.
|
|
4
|
+
|
|
5
|
+
The style guide that we use for this project is [PEP8](https://www.python.org/dev/peps/pep-0008/). This is the standard for Python code and all IDEs, parsers and code formatters understand and work with this standard. PEP8 leaves room for project specific styles. A good style guide that we can follow is the [Google Style Guide](https://google.github.io/styleguide/pyguide.html).
|
|
6
|
+
|
|
7
|
+
The following sections will give the most used conventions with a few examples of good and bad.
|
|
8
|
+
|
|
9
|
+
## TL;DR
|
|
10
|
+
|
|
11
|
+
| Type | Style | Example |
|
|
12
|
+
|------|-------|---------|
|
|
13
|
+
| Classes | CapWords | ProcessManager, ImageViewer, CommandList, Observation, MetaData |
|
|
14
|
+
| Methods & Functions | lowercase with underscores | get_value, set_mask, create_image |
|
|
15
|
+
| Variables | lowercase with underscores | key, last_value, model, index, user_info |
|
|
16
|
+
| Constants | UPPERCASE with underscores | MAX_LINES, BLACK, COMMANDING_PORT |
|
|
17
|
+
| Modules & packages | lowercase **no** underscores | dataset, commanding, multiprocessing |
|
|
18
|
+
|
|
19
|
+
## General
|
|
20
|
+
|
|
21
|
+
* Name the class or variable or function with what it is, what it does or what it contains. A variable named `user_list` might look good at first, but what if at some point you want to change the list to a set so it can not contain duplicates. Are you going to rename everything into `user_set` or would `user_info` be a better name?
|
|
22
|
+
* Never use dashes in any name, they will raise a `SyntaxError: invalid syntax`.
|
|
23
|
+
* We introduce a number of relaxations to not break backward compatibility for the sake of a naming convention. As described in [A Foolish Consistency is the Hobgoblin of Little Minds](https://legacy.python.org/dev/peps/pep-0008/#a-foolish-consistency-is-the-hobgoblin-of-little-minds): _Consistency with this style guide is important. Consistency within a project is more important. Consistency within one module or function is the most important. [...] do not break backwards compatibility just to comply with this PEP!_
|
|
24
|
+
|
|
25
|
+
## Classes
|
|
26
|
+
|
|
27
|
+
Always use CamelCase (Python uses CapWords) for class names. When using acronyms, keep them all UPPER case.
|
|
28
|
+
|
|
29
|
+
* Class names should be nouns, like Observation
|
|
30
|
+
* Make sure to name classes distinctively
|
|
31
|
+
* Stick to one word for a concept when naming classes, i.e. words like `Manager` or `Controller` or `Organizer` all mean similar things. Choose one word for the concept and stick to it.
|
|
32
|
+
* If a word is already part of a package or module, don't use the same word in the class name again.
|
|
33
|
+
|
|
34
|
+
Good names are: `Observation`, `CalibrationFile`, `MetaData`, `Message`, `ReferenceFrame`, `URLParser`.
|
|
35
|
+
|
|
36
|
+
## Methods and Functions
|
|
37
|
+
|
|
38
|
+
A function or a method does something (and should only do one thing, SRP=Single Responsibility Principle), it is an action, so the name should reflect that action.
|
|
39
|
+
|
|
40
|
+
Always use lowercase words separated with underscores.
|
|
41
|
+
|
|
42
|
+
Good names are: `get_time_in_ms()`, `get_commanding_port()`, `is_connected()`, `parse_time()`, `setup_mask()`.
|
|
43
|
+
|
|
44
|
+
When working with legacy code or code from another project, names may be in camelCase (with the first letter a lower case letter). So we can in this case use also `getCommandPort()` or `isConnected()` as method and function names.
|
|
45
|
+
|
|
46
|
+
## Variables
|
|
47
|
+
|
|
48
|
+
Use the same naming convention as functions and methods, i.e. lowercase with underscores.
|
|
49
|
+
|
|
50
|
+
Good names are: `key`, `value`, `user_info`, `model`, `last_value`
|
|
51
|
+
|
|
52
|
+
Bad names: `NSegments`, `outNoise`
|
|
53
|
+
|
|
54
|
+
Take care not to use builtins: `list`, `type`, `filter`, `lambda`, `map`, `dict`, ...
|
|
55
|
+
|
|
56
|
+
Private variables (for classes) start with an underscore: `_name` or `_total_n_args`.
|
|
57
|
+
|
|
58
|
+
In the same spirit as method and function names, the variables can also be in camelCase for specific cases.
|
|
59
|
+
|
|
60
|
+
## CONSTANTS
|
|
61
|
+
|
|
62
|
+
Use ALL_UPPER_CASE with underscores for constants. Use constants always within a name space, not globally.
|
|
63
|
+
|
|
64
|
+
Good names: `MAX_LINES`, `BLACK`, `YELLOW`, `ESL_LINK_MODE_DISABLED`
|
|
65
|
+
|
|
66
|
+
## Modules and Packages
|
|
67
|
+
|
|
68
|
+
Use simple words for modules, preferably just one word like `datasets` or `commanding` or `storage` or `extensions`. If two words are unavoidable, just concatenate them, like `multiprocessing` or `sampledata` or `testdata`. If needed for readability, use an underscore to separate the words, e.g. `image_analysis`.
|
|
69
|
+
|
|
70
|
+
## Import Statements
|
|
71
|
+
|
|
72
|
+
* Group and sort import statements
|
|
73
|
+
* Never use the form `from <module> import *`
|
|
74
|
+
* Always use absolute imports in scripts
|
|
75
|
+
|
|
76
|
+
Be careful that you do not name any modules the same as a module in the Python standard library. This can result in strange effects and may result in an `AttributeError`. Suppose you have named a module `math` in the `egse` directory and it is imported and used further in the code as follows:
|
|
77
|
+
|
|
78
|
+
```python
|
|
79
|
+
from egse import math
|
|
80
|
+
|
|
81
|
+
# in some expression further down the code you might use
|
|
82
|
+
|
|
83
|
+
math.exp(a)
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
This will result in the following runtime error:
|
|
87
|
+
|
|
88
|
+
```text
|
|
89
|
+
File "some_module.py", line 8, in <module>
|
|
90
|
+
print(math.exp(a))
|
|
91
|
+
AttributeError: module 'egse.math' has no attribute 'exp'
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Of course this is an obvious example, but it might be more obscure like e.g. in this [GitHub issue](https://github.com/ParmEd/ParmEd/issues/148): 'module'
|
|
95
|
+
object has no attribute 'Cmd'.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
|
|
2
|
+
# Building the documentation
|
|
3
|
+
|
|
4
|
+
- Make sure you are in a virtual environment with Python 3.10+
|
|
5
|
+
- Run the `mkdocs serve` from the project root older
|
|
6
|
+
- Create new pages by adding folder and Markdown files inside `docs/*`
|
|
7
|
+
|
|
8
|
+
## Set up your environment
|
|
9
|
+
|
|
10
|
+
I created a virtual environment using `pyenv` and when I'm working on the documentation, I start up a shell with
|
|
11
|
+
this environment. Currently, only `mkdocs` and `mkdocs-material` are needed. Of course, you need to install these
|
|
12
|
+
only once.
|
|
13
|
+
|
|
14
|
+
```shell
|
|
15
|
+
$ pyenv virtualenv 3.10 cgse-doc-3.10
|
|
16
|
+
$ pyenv shell cgse-doc-3.10
|
|
17
|
+
$ pip install --upgrade pip setuptools wheel
|
|
18
|
+
$ pip install mkdocs
|
|
19
|
+
$ pip install mkdocs-material
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
From this shell, navigate to the project root folder and start the _live-reload_ server of `mkdocs`.
|
|
23
|
+
|
|
24
|
+
```shell
|
|
25
|
+
$ cd ~/github/cgse
|
|
26
|
+
$ mkdocs serve
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Now you can update files, create new folders in `docs/*`, create new Markdown files and all changes will be reloaded
|
|
30
|
+
live in the browser.
|
|
31
|
+
|
|
32
|
+
When you are ready with updating, you will need to build the site and publish it on GitHub pages:
|
|
33
|
+
|
|
34
|
+
```shell
|
|
35
|
+
$ mkdocs build
|
|
36
|
+
$ mkdocs gh-deploy -r upstream -m "documentation update on .."
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Commands
|
|
40
|
+
|
|
41
|
+
- `mkdocs serve` — start the live-reloading docs server
|
|
42
|
+
- `mkdocs build` — build the documentation site
|
|
43
|
+
- `mkdocs deploy` — publish your documentation on GitHub pages
|
|
44
|
+
- `mkdocs -h` — print a help message for more options
|
|
45
|
+
|
|
46
|
+
## Project layout
|
|
47
|
+
|
|
48
|
+
```text
|
|
49
|
+
mkdocs.yml # the mkdocs configuration file
|
|
50
|
+
docs/
|
|
51
|
+
index.md # the documentation homepage
|
|
52
|
+
... # other markdown pages, image, folders, ...
|
|
53
|
+
```
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
|
|
2
|
+
# Working with `uv`
|
|
3
|
+
|
|
4
|
+
`uv` is an extremely fast Python package and project manager, written in Rust. We will use `uv` as the single tool that replaces `pip`, `virtualenv`, `pyenv`, and more. The main tasks for which we will use `uv` are:
|
|
5
|
+
|
|
6
|
+
- run and install Python versions
|
|
7
|
+
- installing and managing a virtual environment
|
|
8
|
+
- build all the packages in the workspace or monorepo
|
|
9
|
+
- publish all the packages to PyPI
|
|
10
|
+
- run scripts and apps
|
|
11
|
+
|
|
12
|
+
## Installing `uv`
|
|
13
|
+
|
|
14
|
+
On macOS and Linux you can install `uv` using `curl`:
|
|
15
|
+
|
|
16
|
+
```shell
|
|
17
|
+
$ curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
If you need more specific information on installing and upgrading `uv`, please refer to the [official documentation](https://docs.astral.sh/uv/getting-started/installation/).
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
## Installing a Python version
|
|
24
|
+
|
|
25
|
+
The CGSE is guaranteed to work with Python 3.9.x. We will gradually include higher versions of Python, but currently
|
|
26
|
+
these have not been tested. So, we will for the moment stick with Python 3.9.20. Install this version as follows:
|
|
27
|
+
|
|
28
|
+
```shell
|
|
29
|
+
$ uv python install 3.9.20
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
!!! note "`pyenv`"
|
|
33
|
+
|
|
34
|
+
When using `pyenv` to manage your Python versions, make sure you also have the same Python version installed
|
|
35
|
+
with `pyenv` and `uv`. Otherwise you will run into the following error. This is a known issue with `uv`.
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
pyenv: version `3.9.20' is not installed (set by /Users/rik/github/cgse/libs/cgse-common/.python-version)
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
You can check which Python versions are installed already on your system:
|
|
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
|
+
```
|
|
52
|
+
|
|
53
|
+
## Create a virtual environment
|
|
54
|
+
|
|
55
|
+
!!! info inline end "Pin a Python version"
|
|
56
|
+
|
|
57
|
+
You can pin a python version with the command:
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
$ uv python pin 3.9.20
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
`uv` will search for a pinned version in the parent folders up to the root folder or your home directory.
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
You can create a virtual environment with `uv` for the specific Python version as follows. The '`--python`' is optional
|
|
67
|
+
and `uv` will use the default (pinned) Python version when creating a `venv` without this option. When creating a
|
|
68
|
+
virtual environment make sure you are in the package root, e.g. `~/github/cgse/libs/cgse-common`.
|
|
69
|
+
|
|
70
|
+
```shell
|
|
71
|
+
$ cd ~/github/cgse/libs/cgse-common
|
|
72
|
+
$ uv venv --python 3.9.20
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Assuming you are in the package root where you created the virtual environment, you can now install its dependencies
|
|
76
|
+
with `pip install` as follows:
|
|
77
|
+
|
|
78
|
+
```shell
|
|
79
|
+
$ uv pip install -r pyproject.toml
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
To install the current project as an editable package:
|
|
83
|
+
|
|
84
|
+
```shell
|
|
85
|
+
$ uv pip install -e .
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
!!! note
|
|
89
|
+
|
|
90
|
+
If you don't want to use the `uv` commands, you can activate the virtual environment and use the original `pip`
|
|
91
|
+
and `python` commands as you are used to.
|
|
92
|
+
|
|
93
|
+
```
|
|
94
|
+
$ source .venv/bin/activate
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## Building and publishing all packages
|
|
98
|
+
|
|
99
|
+
We have chosen for one and the same version number for all packages in the `cgse` monorepo. That means that whenever
|
|
100
|
+
we make a change to one of the packages and want to release that change, all packages shall be rebuild and published.
|
|
101
|
+
|
|
102
|
+
!!! inline end warning
|
|
103
|
+
|
|
104
|
+
When working in a workspace, keep in mind that the commands `uv run` and `uv sync` by default work on the
|
|
105
|
+
workspace root. That means that when you run the `uv run pip install <package>` command, the `.venv` at the
|
|
106
|
+
workspace root will be updated or created if it didn't exist. Similar for the `uv sync` command, there is only
|
|
107
|
+
one `uv.lock` file at the root of the workspace.
|
|
108
|
+
|
|
109
|
+
Fortunately, with `uv`, that is done in a few commands.
|
|
110
|
+
|
|
111
|
+
When you are in the monorepo root folder, you can build all packages at once. They will be placed in the `dist` folder
|
|
112
|
+
of the root package. Before building, make sure you update the version in the `pyproject.toml` of the root package
|
|
113
|
+
and then bump the versions. Before building, clean up the `dist` folder, then you can do a default `uv publish` afterwards.
|
|
114
|
+
|
|
115
|
+
```shell
|
|
116
|
+
$ cd <monorepo root>
|
|
117
|
+
$ uv run bump.py
|
|
118
|
+
$ rm -r dist
|
|
119
|
+
$ uv build --all-packages
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Publish all packages in the root dist folder to PyPI. The UV_PUBLISH_TOKEN can be defined in a (read protected) ~/.
|
|
123
|
+
setenv.bash file:
|
|
124
|
+
|
|
125
|
+
```shell
|
|
126
|
+
$ uv publish --token $UV_PUBLISH_TOKEN
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
The above command will publish all package to PyPI. If you don't want the token to be in a shell variable, you can
|
|
130
|
+
omit the `--token` in the command above. You will then be asked for a username, use `__token__` as the username and
|
|
131
|
+
then provide the token as a password.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
|
|
2
|
+
# Help
|
|
3
|
+
|
|
4
|
+
The best way to get help for something that you couldn't find in the documentation on this site, is to contact one of
|
|
5
|
+
the authors.
|
|
6
|
+
|
|
7
|
+
## Bugs and Feature requests
|
|
8
|
+
|
|
9
|
+
Report any bugs or issues through GitHub on the [CGSE issues](https://github.com/IvS-KULeuven/cgse/issues) page.
|