cgse 2024.7.0__py3-none-any.whl → 2025.0.2__py3-none-any.whl
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.
- README.md +27 -0
- bump.py +85 -0
- cgse-2025.0.2.dist-info/METADATA +38 -0
- cgse-2025.0.2.dist-info/RECORD +5 -0
- {cgse-2024.7.0.dist-info → cgse-2025.0.2.dist-info}/WHEEL +1 -2
- cgse-2024.7.0.dist-info/COPYING +0 -674
- cgse-2024.7.0.dist-info/COPYING.LESSER +0 -165
- cgse-2024.7.0.dist-info/METADATA +0 -144
- cgse-2024.7.0.dist-info/RECORD +0 -660
- cgse-2024.7.0.dist-info/entry_points.txt +0 -75
- cgse-2024.7.0.dist-info/top_level.txt +0 -2
- egse/__init__.py +0 -12
- egse/__main__.py +0 -32
- egse/aeu/aeu.py +0 -5238
- egse/aeu/aeu_awg.yaml +0 -265
- egse/aeu/aeu_crio.yaml +0 -273
- egse/aeu/aeu_cs.py +0 -627
- egse/aeu/aeu_devif.py +0 -321
- egse/aeu/aeu_main_ui.py +0 -903
- egse/aeu/aeu_metrics.py +0 -131
- egse/aeu/aeu_protocol.py +0 -463
- egse/aeu/aeu_psu.yaml +0 -204
- egse/aeu/aeu_ui.py +0 -873
- egse/aeu/arbdata/FccdRead.arb +0 -2
- egse/aeu/arbdata/FccdRead_min_points.arb +0 -2
- egse/aeu/arbdata/HeaterSync_FccdRead.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead25.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead31_25.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead37_50.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead43_75.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead50.arb +0 -2
- egse/aeu/arbdata/Heater_FccdRead_min_points.arb +0 -2
- egse/aeu/arbdata/ccdRead25.arb +0 -2
- egse/aeu/arbdata/ccdRead25_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead31_25.arb +0 -2
- egse/aeu/arbdata/ccdRead31_25_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead37_50.arb +0 -2
- egse/aeu/arbdata/ccdRead37_50_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead43_75.arb +0 -2
- egse/aeu/arbdata/ccdRead43_75_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead50.arb +0 -2
- egse/aeu/arbdata/ccdRead50_150ms.arb +0 -2
- egse/alert/__init__.py +0 -1049
- egse/alert/alertman.yaml +0 -37
- egse/alert/alertman_cs.py +0 -233
- egse/alert/alertman_ui.py +0 -600
- egse/alert/gsm/beaglebone.py +0 -138
- egse/alert/gsm/beaglebone.yaml +0 -51
- egse/alert/gsm/beaglebone_cs.py +0 -108
- egse/alert/gsm/beaglebone_devif.py +0 -122
- egse/alert/gsm/beaglebone_protocol.py +0 -46
- egse/bits.py +0 -318
- egse/camera.py +0 -44
- egse/collimator/__init__.py +0 -0
- egse/collimator/fcul/__init__.py +0 -0
- egse/collimator/fcul/ogse.py +0 -1077
- egse/collimator/fcul/ogse.yaml +0 -14
- egse/collimator/fcul/ogse_cs.py +0 -154
- egse/collimator/fcul/ogse_devif.py +0 -358
- egse/collimator/fcul/ogse_protocol.py +0 -132
- egse/collimator/fcul/ogse_sim.py +0 -431
- egse/collimator/fcul/ogse_ui.py +0 -1108
- egse/command.py +0 -699
- egse/config.py +0 -410
- egse/confman/__init__.py +0 -1058
- egse/confman/confman.yaml +0 -70
- egse/confman/confman_cs.py +0 -240
- egse/confman/confman_ui.py +0 -381
- egse/confman/setup_ui.py +0 -565
- egse/control.py +0 -632
- egse/coordinates/__init__.py +0 -534
- egse/coordinates/avoidance.py +0 -100
- egse/coordinates/cslmodel.py +0 -127
- egse/coordinates/laser_tracker_to_dict.py +0 -122
- egse/coordinates/point.py +0 -707
- egse/coordinates/pyplot.py +0 -194
- egse/coordinates/referenceFrame.py +0 -1279
- egse/coordinates/refmodel.py +0 -737
- egse/coordinates/rotationMatrix.py +0 -85
- egse/coordinates/transform3d_addon.py +0 -419
- egse/csl/__init__.py +0 -50
- egse/csl/commanding.py +0 -78
- egse/csl/icons/hexapod-connected-selected.svg +0 -30
- egse/csl/icons/hexapod-connected.svg +0 -30
- egse/csl/icons/hexapod-homing-selected.svg +0 -68
- egse/csl/icons/hexapod-homing.svg +0 -68
- egse/csl/icons/hexapod-retract-selected.svg +0 -56
- egse/csl/icons/hexapod-retract.svg +0 -51
- egse/csl/icons/hexapod-zero-selected.svg +0 -56
- egse/csl/icons/hexapod-zero.svg +0 -56
- egse/csl/icons/logo-puna.svg +0 -92
- egse/csl/icons/stop.svg +0 -1
- egse/csl/initialisation.py +0 -102
- egse/csl/mech_pos_settings.yaml +0 -18
- egse/das.py +0 -1240
- egse/das.yaml +0 -7
- egse/data/conf/SETUP_CSL_00000_170620_150000.yaml +0 -5
- egse/data/conf/SETUP_CSL_00001_170620_151010.yaml +0 -69
- egse/data/conf/SETUP_CSL_00002_170620_151020.yaml +0 -69
- egse/data/conf/SETUP_CSL_00003_170620_151030.yaml +0 -69
- egse/data/conf/SETUP_CSL_00004_170620_151040.yaml +0 -69
- egse/data/conf/SETUP_CSL_00005_170620_151050.yaml +0 -69
- egse/data/conf/SETUP_CSL_00006_170620_151060.yaml +0 -69
- egse/data/conf/SETUP_CSL_00007_170620_151070.yaml +0 -69
- egse/data/conf/SETUP_CSL_00008_170620_151080.yaml +0 -75
- egse/data/conf/SETUP_CSL_00010_210308_083016.yaml +0 -138
- egse/data/conf/SETUP_INTA_00000_170620_150000.yaml +0 -4
- egse/data/conf/SETUP_SRON_00000_170620_150000.yaml +0 -4
- egse/decorators.py +0 -514
- egse/device.py +0 -269
- egse/dpu/__init__.py +0 -2698
- egse/dpu/ccd_ui.py +0 -514
- egse/dpu/dpu.py +0 -783
- egse/dpu/dpu.yaml +0 -153
- egse/dpu/dpu_cs.py +0 -272
- egse/dpu/dpu_ui.py +0 -671
- egse/dpu/fitsgen.py +0 -2096
- egse/dpu/fitsgen_ui.py +0 -399
- egse/dpu/hdf5_model.py +0 -332
- egse/dpu/hdf5_ui.py +0 -277
- egse/dpu/hdf5_viewer.py +0 -506
- egse/dpu/hk_ui.py +0 -468
- egse/dpu_commands.py +0 -81
- egse/dsi/__init__.py +0 -33
- egse/dsi/_libesl.py +0 -232
- egse/dsi/constants.py +0 -296
- egse/dsi/esl.py +0 -630
- egse/dsi/rmap.py +0 -444
- egse/dsi/rmapci.py +0 -39
- egse/dsi/spw.py +0 -335
- egse/dsi/spw_state.py +0 -29
- egse/dummy.py +0 -318
- egse/dyndummy.py +0 -179
- egse/env.py +0 -278
- egse/exceptions.py +0 -88
- egse/fdir/__init__.py +0 -26
- egse/fdir/fdir_manager.py +0 -85
- egse/fdir/fdir_manager.yaml +0 -37
- egse/fdir/fdir_manager_controller.py +0 -136
- egse/fdir/fdir_manager_cs.py +0 -164
- egse/fdir/fdir_manager_interface.py +0 -15
- egse/fdir/fdir_remote.py +0 -73
- egse/fdir/fdir_remote.yaml +0 -30
- egse/fdir/fdir_remote_controller.py +0 -30
- egse/fdir/fdir_remote_cs.py +0 -94
- egse/fdir/fdir_remote_interface.py +0 -9
- egse/fdir/fdir_remote_popup.py +0 -26
- egse/fee/__init__.py +0 -106
- egse/fee/f_fee_register.yaml +0 -43
- egse/fee/feesim.py +0 -914
- egse/fee/n_fee_hk.py +0 -768
- egse/fee/nfee.py +0 -188
- egse/filterwheel/__init__.py +0 -4
- egse/filterwheel/eksma/__init__.py +0 -49
- egse/filterwheel/eksma/fw8smc4.py +0 -657
- egse/filterwheel/eksma/fw8smc4.yaml +0 -121
- egse/filterwheel/eksma/fw8smc4_cs.py +0 -144
- egse/filterwheel/eksma/fw8smc4_devif.py +0 -473
- egse/filterwheel/eksma/fw8smc4_protocol.py +0 -82
- egse/filterwheel/eksma/fw8smc4_ui.py +0 -940
- egse/filterwheel/eksma/fw8smc5.py +0 -115
- egse/filterwheel/eksma/fw8smc5.yaml +0 -105
- egse/filterwheel/eksma/fw8smc5_controller.py +0 -307
- egse/filterwheel/eksma/fw8smc5_cs.py +0 -141
- egse/filterwheel/eksma/fw8smc5_interface.py +0 -65
- egse/filterwheel/eksma/fw8smc5_simulator.py +0 -29
- egse/filterwheel/eksma/fw8smc5_ui.py +0 -1065
- egse/filterwheel/eksma/testpythonfw.py +0 -215
- egse/fov/__init__.py +0 -65
- egse/fov/fov_hk.py +0 -710
- egse/fov/fov_ui.py +0 -859
- egse/fov/fov_ui_controller.py +0 -140
- egse/fov/fov_ui_model.py +0 -200
- egse/fov/fov_ui_view.py +0 -345
- egse/gimbal/__init__.py +0 -32
- egse/gimbal/symetrie/__init__.py +0 -26
- egse/gimbal/symetrie/alpha.py +0 -586
- egse/gimbal/symetrie/generic_gimbal_ui.py +0 -1521
- egse/gimbal/symetrie/gimbal.py +0 -877
- egse/gimbal/symetrie/gimbal.yaml +0 -168
- egse/gimbal/symetrie/gimbal_cs.py +0 -183
- egse/gimbal/symetrie/gimbal_protocol.py +0 -138
- egse/gimbal/symetrie/gimbal_ui.py +0 -361
- egse/gimbal/symetrie/pmac.py +0 -1006
- egse/gimbal/symetrie/pmac_regex.py +0 -83
- egse/graph.py +0 -132
- egse/gui/__init__.py +0 -47
- egse/gui/buttons.py +0 -378
- egse/gui/focalplane.py +0 -1285
- egse/gui/formatter.py +0 -10
- egse/gui/led.py +0 -162
- egse/gui/limitswitch.py +0 -143
- egse/gui/mechanisms.py +0 -587
- egse/gui/states.py +0 -148
- egse/gui/stripchart.py +0 -729
- egse/gui/styles.qss +0 -48
- egse/gui/switch.py +0 -112
- egse/h5.py +0 -274
- egse/help/__init__.py +0 -0
- egse/help/help_ui.py +0 -126
- egse/hexapod/__init__.py +0 -32
- egse/hexapod/symetrie/__init__.py +0 -137
- egse/hexapod/symetrie/alpha.py +0 -874
- egse/hexapod/symetrie/dynalpha.py +0 -1387
- egse/hexapod/symetrie/hexapod_ui.py +0 -1516
- egse/hexapod/symetrie/pmac.py +0 -1010
- egse/hexapod/symetrie/pmac_regex.py +0 -83
- egse/hexapod/symetrie/puna.py +0 -1167
- egse/hexapod/symetrie/puna.yaml +0 -193
- egse/hexapod/symetrie/puna_cs.py +0 -195
- egse/hexapod/symetrie/puna_protocol.py +0 -134
- egse/hexapod/symetrie/puna_ui.py +0 -433
- egse/hexapod/symetrie/punaplus.py +0 -107
- egse/hexapod/symetrie/zonda.py +0 -872
- egse/hexapod/symetrie/zonda.yaml +0 -337
- egse/hexapod/symetrie/zonda_cs.py +0 -172
- egse/hexapod/symetrie/zonda_devif.py +0 -414
- egse/hexapod/symetrie/zonda_protocol.py +0 -123
- egse/hexapod/symetrie/zonda_ui.py +0 -449
- egse/hk.py +0 -791
- egse/icons/aeu-cs-start.svg +0 -117
- egse/icons/aeu-cs-stop.svg +0 -118
- egse/icons/aeu-cs.svg +0 -107
- egse/icons/aeu_cs-started.svg +0 -112
- egse/icons/aeu_cs-stopped.svg +0 -112
- egse/icons/aeu_cs.svg +0 -55
- egse/icons/alert.svg +0 -1
- egse/icons/arrow-double-left.png +0 -0
- egse/icons/arrow-double-right.png +0 -0
- egse/icons/arrow-up.svg +0 -11
- egse/icons/backward.svg +0 -1
- egse/icons/busy.svg +0 -1
- egse/icons/cleaning.svg +0 -115
- egse/icons/color-scheme.svg +0 -1
- egse/icons/cs-connected-alert.svg +0 -91
- egse/icons/cs-connected-disabled.svg +0 -43
- egse/icons/cs-connected.svg +0 -89
- egse/icons/cs-not-connected.svg +0 -44
- egse/icons/double-left-arrow.svg +0 -1
- egse/icons/double-right-arrow.svg +0 -1
- egse/icons/erase-disabled.svg +0 -19
- egse/icons/erase.svg +0 -59
- egse/icons/fitsgen-start.svg +0 -47
- egse/icons/fitsgen-stop.svg +0 -48
- egse/icons/fitsgen.svg +0 -1
- egse/icons/forward.svg +0 -1
- egse/icons/fov-hk-start.svg +0 -33
- egse/icons/fov-hk-stop.svg +0 -37
- egse/icons/fov-hk.svg +0 -1
- egse/icons/front-desk.svg +0 -1
- egse/icons/home-actioned.svg +0 -15
- egse/icons/home-disabled.svg +0 -15
- egse/icons/home.svg +0 -13
- egse/icons/info.svg +0 -1
- egse/icons/invalid.png +0 -0
- egse/icons/led-green.svg +0 -20
- egse/icons/led-grey.svg +0 -20
- egse/icons/led-orange.svg +0 -20
- egse/icons/led-red.svg +0 -20
- egse/icons/led-square-green.svg +0 -134
- egse/icons/led-square-grey.svg +0 -134
- egse/icons/led-square-orange.svg +0 -134
- egse/icons/led-square-red.svg +0 -134
- egse/icons/limit-switch-all-green.svg +0 -115
- egse/icons/limit-switch-all-red.svg +0 -117
- egse/icons/limit-switch-el+.svg +0 -116
- egse/icons/limit-switch-el-.svg +0 -117
- egse/icons/location-marker.svg +0 -1
- egse/icons/logo-dpu.svg +0 -48
- egse/icons/logo-gimbal.svg +0 -112
- egse/icons/logo-huber.svg +0 -23
- egse/icons/logo-ogse.svg +0 -31
- egse/icons/logo-puna.svg +0 -92
- egse/icons/logo-tcs.svg +0 -29
- egse/icons/logo-zonda.svg +0 -66
- egse/icons/maximize.svg +0 -1
- egse/icons/meter.svg +0 -1
- egse/icons/more.svg +0 -45
- egse/icons/n-fee-hk-start.svg +0 -24
- egse/icons/n-fee-hk-stop.svg +0 -25
- egse/icons/n-fee-hk.svg +0 -83
- egse/icons/observing-off.svg +0 -46
- egse/icons/observing-on.svg +0 -46
- egse/icons/open-document-hdf5.png +0 -0
- egse/icons/open-document-hdf5.svg +0 -21
- egse/icons/ops-mode.svg +0 -1
- egse/icons/play-green.svg +0 -17
- egse/icons/plugged-disabled.svg +0 -27
- egse/icons/plugged.svg +0 -21
- egse/icons/pm_ui.svg +0 -1
- egse/icons/power-button-green.svg +0 -27
- egse/icons/power-button-red.svg +0 -27
- egse/icons/power-button.svg +0 -27
- egse/icons/radar.svg +0 -1
- egse/icons/radioactive.svg +0 -2
- egse/icons/reload.svg +0 -1
- egse/icons/remote-control-off.svg +0 -28
- egse/icons/remote-control-on.svg +0 -28
- egse/icons/repeat-blue.svg +0 -15
- egse/icons/repeat.svg +0 -1
- egse/icons/settings.svg +0 -1
- egse/icons/shrink.svg +0 -1
- egse/icons/shutter.svg +0 -1
- egse/icons/sign-off.svg +0 -1
- egse/icons/sign-on.svg +0 -1
- egse/icons/sim-mode.svg +0 -1
- egse/icons/small-buttons-go.svg +0 -20
- egse/icons/small-buttons-minus.svg +0 -51
- egse/icons/small-buttons-plus.svg +0 -51
- egse/icons/sponge.svg +0 -220
- egse/icons/start-button-disabled.svg +0 -84
- egse/icons/start-button.svg +0 -50
- egse/icons/stop-button-disabled.svg +0 -84
- egse/icons/stop-button.svg +0 -50
- egse/icons/stop-red.svg +0 -17
- egse/icons/stop.svg +0 -1
- egse/icons/switch-disabled-square.svg +0 -87
- egse/icons/switch-disabled.svg +0 -15
- egse/icons/switch-off-square.svg +0 -87
- egse/icons/switch-off.svg +0 -72
- egse/icons/switch-on-square.svg +0 -87
- egse/icons/switch-on.svg +0 -61
- egse/icons/temperature-control.svg +0 -44
- egse/icons/th_ui_logo.svg +0 -1
- egse/icons/unplugged.svg +0 -23
- egse/icons/unvalid.png +0 -0
- egse/icons/user-interface.svg +0 -1
- egse/icons/vacuum.svg +0 -1
- egse/icons/valid.png +0 -0
- egse/icons/zoom-to-pixel-dark.svg +0 -64
- egse/icons/zoom-to-pixel-white.svg +0 -36
- egse/images/big-rotation-stage.png +0 -0
- egse/images/connected-100.png +0 -0
- egse/images/cross.svg +0 -6
- egse/images/disconnected-100.png +0 -0
- egse/images/gui-icon.png +0 -0
- egse/images/home.svg +0 -6
- egse/images/info-icon.png +0 -0
- egse/images/led-black.svg +0 -89
- egse/images/led-green.svg +0 -85
- egse/images/led-orange.svg +0 -85
- egse/images/led-red.svg +0 -85
- egse/images/load-icon.png +0 -0
- egse/images/load-setup.png +0 -0
- egse/images/load.png +0 -0
- egse/images/pause.png +0 -0
- egse/images/play-button.svg +0 -8
- egse/images/play.png +0 -0
- egse/images/process-status.png +0 -0
- egse/images/restart.png +0 -0
- egse/images/search.png +0 -0
- egse/images/sma.png +0 -0
- egse/images/start.png +0 -0
- egse/images/stop-button.svg +0 -8
- egse/images/stop.png +0 -0
- egse/images/switch-off.svg +0 -48
- egse/images/switch-on.svg +0 -48
- egse/images/undo.png +0 -0
- egse/images/update-button.svg +0 -11
- egse/imageviewer/exposureselection.py +0 -475
- egse/imageviewer/imageviewer.py +0 -198
- egse/imageviewer/matchfocalplane.py +0 -179
- egse/imageviewer/subfieldposition.py +0 -133
- egse/lampcontrol/__init__.py +0 -4
- egse/lampcontrol/beaglebone/beaglebone.py +0 -178
- egse/lampcontrol/beaglebone/beaglebone.yaml +0 -62
- egse/lampcontrol/beaglebone/beaglebone_cs.py +0 -106
- egse/lampcontrol/beaglebone/beaglebone_devif.py +0 -150
- egse/lampcontrol/beaglebone/beaglebone_protocol.py +0 -73
- egse/lampcontrol/energetiq/__init__.py +0 -22
- egse/lampcontrol/energetiq/eq99.yaml +0 -98
- egse/lampcontrol/energetiq/lampEQ99.py +0 -283
- egse/lampcontrol/energetiq/lampEQ99_cs.py +0 -128
- egse/lampcontrol/energetiq/lampEQ99_devif.py +0 -158
- egse/lampcontrol/energetiq/lampEQ99_encode_decode_errors.py +0 -73
- egse/lampcontrol/energetiq/lampEQ99_protocol.py +0 -71
- egse/lampcontrol/energetiq/lampEQ99_ui.py +0 -465
- egse/lib/CentOS-7/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/CentOS-8/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/CentOS-8/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/Debian/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/Debian/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/Debian/libetherspacelink_v35_21.dylib +0 -0
- egse/lib/Linux/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/Linux/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/Ubuntu-20/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/Ubuntu-20/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/gssw/python3-gssw_2.2.3+31f63c9f-1_all.deb +0 -0
- egse/lib/ximc/__pycache__/pyximc.cpython-38 2.pyc +0 -0
- egse/lib/ximc/__pycache__/pyximc.cpython-38.pyc +0 -0
- egse/lib/ximc/libximc.framework/Frameworks/libbindy.dylib +0 -0
- egse/lib/ximc/libximc.framework/Frameworks/libxiwrapper.dylib +0 -0
- egse/lib/ximc/libximc.framework/Headers/ximc.h +0 -5510
- egse/lib/ximc/libximc.framework/Resources/Info.plist +0 -42
- egse/lib/ximc/libximc.framework/Resources/keyfile.sqlite +0 -0
- egse/lib/ximc/libximc.framework/libbindy.so +0 -0
- egse/lib/ximc/libximc.framework/libximc +0 -0
- egse/lib/ximc/libximc.framework/libximc.so +0 -0
- egse/lib/ximc/libximc.framework/libximc.so.7.0.0 +0 -0
- egse/lib/ximc/libximc.framework/libxiwrapper.so +0 -0
- egse/lib/ximc/pyximc.py +0 -922
- egse/listener.py +0 -179
- egse/logger/__init__.py +0 -243
- egse/logger/log_cs.py +0 -321
- egse/metrics.py +0 -102
- egse/mixin.py +0 -464
- egse/monitoring.py +0 -95
- egse/ni/alarms/__init__.py +0 -26
- egse/ni/alarms/cdaq9375.py +0 -300
- egse/ni/alarms/cdaq9375.yaml +0 -89
- egse/ni/alarms/cdaq9375_cs.py +0 -130
- egse/ni/alarms/cdaq9375_devif.py +0 -183
- egse/ni/alarms/cdaq9375_protocol.py +0 -48
- egse/obs_inspection.py +0 -165
- egse/observer.py +0 -41
- egse/obsid.py +0 -163
- egse/powermeter/__init__.py +0 -0
- egse/powermeter/ni/__init__.py +0 -38
- egse/powermeter/ni/cdaq9184.py +0 -224
- egse/powermeter/ni/cdaq9184.yaml +0 -73
- egse/powermeter/ni/cdaq9184_cs.py +0 -130
- egse/powermeter/ni/cdaq9184_devif.py +0 -201
- egse/powermeter/ni/cdaq9184_protocol.py +0 -48
- egse/powermeter/ni/cdaq9184_ui.py +0 -544
- egse/powermeter/thorlabs/__init__.py +0 -25
- egse/powermeter/thorlabs/pm100a.py +0 -380
- egse/powermeter/thorlabs/pm100a.yaml +0 -132
- egse/powermeter/thorlabs/pm100a_cs.py +0 -136
- egse/powermeter/thorlabs/pm100a_devif.py +0 -127
- egse/powermeter/thorlabs/pm100a_protocol.py +0 -80
- egse/powermeter/thorlabs/pm100a_ui.py +0 -725
- egse/process.py +0 -451
- egse/procman/__init__.py +0 -834
- egse/procman/cannot_start_process_popup.py +0 -43
- egse/procman/procman.yaml +0 -49
- egse/procman/procman_cs.py +0 -201
- egse/procman/procman_ui.py +0 -2081
- egse/protocol.py +0 -605
- egse/proxy.py +0 -531
- egse/randomwalk.py +0 -140
- egse/reg.py +0 -585
- egse/reload.py +0 -122
- egse/reprocess.py +0 -693
- egse/resource.py +0 -333
- egse/rmap.py +0 -406
- egse/rst.py +0 -135
- egse/search.py +0 -182
- egse/serialdevice.py +0 -190
- egse/services.py +0 -247
- egse/services.yaml +0 -68
- egse/settings.py +0 -379
- egse/settings.yaml +0 -980
- egse/setup.py +0 -1181
- egse/shutter/__init__.py +0 -0
- egse/shutter/thorlabs/__init__.py +0 -19
- egse/shutter/thorlabs/ksc101.py +0 -205
- egse/shutter/thorlabs/ksc101.yaml +0 -105
- egse/shutter/thorlabs/ksc101_cs.py +0 -136
- egse/shutter/thorlabs/ksc101_devif.py +0 -201
- egse/shutter/thorlabs/ksc101_protocol.py +0 -71
- egse/shutter/thorlabs/ksc101_ui.py +0 -548
- egse/shutter/thorlabs/sc10.py +0 -82
- egse/shutter/thorlabs/sc10.yaml +0 -52
- egse/shutter/thorlabs/sc10_controller.py +0 -81
- egse/shutter/thorlabs/sc10_cs.py +0 -108
- egse/shutter/thorlabs/sc10_interface.py +0 -25
- egse/shutter/thorlabs/sc10_simulator.py +0 -30
- egse/simulator.py +0 -41
- egse/slack.py +0 -61
- egse/socketdevice.py +0 -218
- egse/sockets.py +0 -218
- egse/spw.py +0 -1401
- egse/stages/__init__.py +0 -12
- egse/stages/aerotech/ensemble.py +0 -245
- egse/stages/aerotech/ensemble.yaml +0 -205
- egse/stages/aerotech/ensemble_controller.py +0 -275
- egse/stages/aerotech/ensemble_cs.py +0 -110
- egse/stages/aerotech/ensemble_interface.py +0 -132
- egse/stages/aerotech/ensemble_parameters.py +0 -433
- egse/stages/aerotech/ensemble_simulator.py +0 -27
- egse/stages/aerotech/mgse_sim.py +0 -188
- egse/stages/arun/smd3.py +0 -110
- egse/stages/arun/smd3.yaml +0 -68
- egse/stages/arun/smd3_controller.py +0 -470
- egse/stages/arun/smd3_cs.py +0 -112
- egse/stages/arun/smd3_interface.py +0 -53
- egse/stages/arun/smd3_simulator.py +0 -27
- egse/stages/arun/smd3_stop.py +0 -16
- egse/stages/huber/__init__.py +0 -49
- egse/stages/huber/smc9300.py +0 -920
- egse/stages/huber/smc9300.yaml +0 -63
- egse/stages/huber/smc9300_cs.py +0 -178
- egse/stages/huber/smc9300_devif.py +0 -345
- egse/stages/huber/smc9300_protocol.py +0 -113
- egse/stages/huber/smc9300_sim.py +0 -547
- egse/stages/huber/smc9300_ui.py +0 -973
- egse/state.py +0 -173
- egse/statemachine.py +0 -274
- egse/storage/__init__.py +0 -1067
- egse/storage/persistence.py +0 -2295
- egse/storage/storage.yaml +0 -79
- egse/storage/storage_cs.py +0 -231
- egse/styles/dark.qss +0 -343
- egse/styles/default.qss +0 -48
- egse/synoptics/__init__.py +0 -417
- egse/synoptics/syn.yaml +0 -9
- egse/synoptics/syn_cs.py +0 -195
- egse/system.py +0 -1611
- egse/tcs/__init__.py +0 -14
- egse/tcs/tcs.py +0 -879
- egse/tcs/tcs.yaml +0 -14
- egse/tcs/tcs_cs.py +0 -202
- egse/tcs/tcs_devif.py +0 -292
- egse/tcs/tcs_protocol.py +0 -180
- egse/tcs/tcs_sim.py +0 -177
- egse/tcs/tcs_ui.py +0 -543
- egse/tdms.py +0 -171
- egse/tempcontrol/__init__.py +0 -23
- egse/tempcontrol/agilent/agilent34970.py +0 -109
- egse/tempcontrol/agilent/agilent34970.yaml +0 -44
- egse/tempcontrol/agilent/agilent34970_cs.py +0 -114
- egse/tempcontrol/agilent/agilent34970_devif.py +0 -182
- egse/tempcontrol/agilent/agilent34970_protocol.py +0 -96
- egse/tempcontrol/agilent/agilent34972.py +0 -111
- egse/tempcontrol/agilent/agilent34972.yaml +0 -44
- egse/tempcontrol/agilent/agilent34972_cs.py +0 -115
- egse/tempcontrol/agilent/agilent34972_devif.py +0 -189
- egse/tempcontrol/agilent/agilent34972_protocol.py +0 -98
- egse/tempcontrol/beaglebone/beaglebone.py +0 -341
- egse/tempcontrol/beaglebone/beaglebone.yaml +0 -110
- egse/tempcontrol/beaglebone/beaglebone_cs.py +0 -117
- egse/tempcontrol/beaglebone/beaglebone_protocol.py +0 -134
- egse/tempcontrol/beaglebone/beaglebone_ui.py +0 -674
- egse/tempcontrol/digalox/digalox.py +0 -115
- egse/tempcontrol/digalox/digalox.yaml +0 -36
- egse/tempcontrol/digalox/digalox_cs.py +0 -108
- egse/tempcontrol/digalox/digalox_protocol.py +0 -56
- egse/tempcontrol/keithley/__init__.py +0 -33
- egse/tempcontrol/keithley/daq6510.py +0 -662
- egse/tempcontrol/keithley/daq6510.yaml +0 -105
- egse/tempcontrol/keithley/daq6510_cs.py +0 -163
- egse/tempcontrol/keithley/daq6510_devif.py +0 -343
- egse/tempcontrol/keithley/daq6510_protocol.py +0 -79
- egse/tempcontrol/keithley/daq6510_sim.py +0 -186
- egse/tempcontrol/lakeshore/__init__.py +0 -33
- egse/tempcontrol/lakeshore/lsci.py +0 -361
- egse/tempcontrol/lakeshore/lsci.yaml +0 -162
- egse/tempcontrol/lakeshore/lsci_cs.py +0 -174
- egse/tempcontrol/lakeshore/lsci_devif.py +0 -292
- egse/tempcontrol/lakeshore/lsci_protocol.py +0 -76
- egse/tempcontrol/lakeshore/lsci_ui.py +0 -387
- egse/tempcontrol/ni/__init__.py +0 -0
- egse/tempcontrol/spid/spid.py +0 -109
- egse/tempcontrol/spid/spid.yaml +0 -81
- egse/tempcontrol/spid/spid_controller.py +0 -279
- egse/tempcontrol/spid/spid_cs.py +0 -136
- egse/tempcontrol/spid/spid_protocol.py +0 -107
- egse/tempcontrol/spid/spid_ui.py +0 -723
- egse/tempcontrol/srs/__init__.py +0 -22
- egse/tempcontrol/srs/ptc10.py +0 -867
- egse/tempcontrol/srs/ptc10.yaml +0 -227
- egse/tempcontrol/srs/ptc10_cs.py +0 -128
- egse/tempcontrol/srs/ptc10_devif.py +0 -116
- egse/tempcontrol/srs/ptc10_protocol.py +0 -39
- egse/tempcontrol/srs/ptc10_ui.py +0 -906
- egse/ups/apc/apc.py +0 -236
- egse/ups/apc/apc.yaml +0 -45
- egse/ups/apc/apc_cs.py +0 -101
- egse/ups/apc/apc_protocol.py +0 -125
- egse/user.yaml +0 -7
- egse/vacuum/beaglebone/beaglebone.py +0 -149
- egse/vacuum/beaglebone/beaglebone.yaml +0 -44
- egse/vacuum/beaglebone/beaglebone_cs.py +0 -108
- egse/vacuum/beaglebone/beaglebone_devif.py +0 -159
- egse/vacuum/beaglebone/beaglebone_protocol.py +0 -192
- egse/vacuum/beaglebone/beaglebone_ui.py +0 -638
- egse/vacuum/instrutech/igm402.py +0 -91
- egse/vacuum/instrutech/igm402.yaml +0 -90
- egse/vacuum/instrutech/igm402_controller.py +0 -124
- egse/vacuum/instrutech/igm402_cs.py +0 -108
- egse/vacuum/instrutech/igm402_interface.py +0 -49
- egse/vacuum/instrutech/igm402_simulator.py +0 -36
- egse/vacuum/keller/kellerBus.py +0 -256
- egse/vacuum/keller/leo3.py +0 -100
- egse/vacuum/keller/leo3.yaml +0 -38
- egse/vacuum/keller/leo3_controller.py +0 -81
- egse/vacuum/keller/leo3_cs.py +0 -101
- egse/vacuum/keller/leo3_interface.py +0 -33
- egse/vacuum/mks/evision.py +0 -86
- egse/vacuum/mks/evision.yaml +0 -75
- egse/vacuum/mks/evision_cs.py +0 -101
- egse/vacuum/mks/evision_devif.py +0 -313
- egse/vacuum/mks/evision_interface.py +0 -60
- egse/vacuum/mks/evision_simulator.py +0 -24
- egse/vacuum/mks/evision_ui.py +0 -701
- egse/vacuum/pfeiffer/acp40.py +0 -87
- egse/vacuum/pfeiffer/acp40.yaml +0 -60
- egse/vacuum/pfeiffer/acp40_controller.py +0 -117
- egse/vacuum/pfeiffer/acp40_cs.py +0 -109
- egse/vacuum/pfeiffer/acp40_interface.py +0 -40
- egse/vacuum/pfeiffer/acp40_simulator.py +0 -37
- egse/vacuum/pfeiffer/tc400.py +0 -87
- egse/vacuum/pfeiffer/tc400.yaml +0 -83
- egse/vacuum/pfeiffer/tc400_controller.py +0 -136
- egse/vacuum/pfeiffer/tc400_cs.py +0 -109
- egse/vacuum/pfeiffer/tc400_interface.py +0 -70
- egse/vacuum/pfeiffer/tc400_simulator.py +0 -35
- egse/vacuum/pfeiffer/tpg261.py +0 -80
- egse/vacuum/pfeiffer/tpg261.yaml +0 -66
- egse/vacuum/pfeiffer/tpg261_controller.py +0 -150
- egse/vacuum/pfeiffer/tpg261_cs.py +0 -109
- egse/vacuum/pfeiffer/tpg261_interface.py +0 -59
- egse/vacuum/pfeiffer/tpg261_simulator.py +0 -23
- egse/version.py +0 -174
- egse/visitedpositions.py +0 -398
- egse/windowing.py +0 -213
- egse/zmq/__init__.py +0 -28
- egse/zmq/spw.py +0 -160
- egse/zmq_ser.py +0 -41
- scripts/alerts/cold.yaml +0 -278
- scripts/alerts/example_alerts.yaml +0 -54
- scripts/alerts/transition.yaml +0 -14
- scripts/alerts/warm.yaml +0 -49
- scripts/analyse_n_fee_hk_data.py +0 -52
- scripts/check_hdf5_files.py +0 -192
- scripts/check_register_sync.py +0 -47
- scripts/check_tcs_calib_coef.py +0 -90
- scripts/correct_ccd_cold_temperature_cal.py +0 -157
- scripts/create_hdf5_report.py +0 -293
- scripts/csl_model.py +0 -420
- scripts/csl_restore_setup.py +0 -229
- scripts/export-grafana-dashboards.py +0 -49
- scripts/fdir/cs_recovery/fdir_cs_recovery.py +0 -54
- scripts/fdir/fdir_table.yaml +0 -70
- scripts/fdir/fdir_test_recovery.py +0 -10
- scripts/fdir/hw_recovery/fdir_agilent_hw_recovery.py +0 -73
- scripts/fdir/limit_recovery/fdir_agilent_limit.py +0 -61
- scripts/fdir/limit_recovery/fdir_bb_heater_limit.py +0 -59
- scripts/fdir/limit_recovery/fdir_ensemble_limit.py +0 -33
- scripts/fdir/limit_recovery/fdir_pressure_limit_recovery.py +0 -71
- scripts/fix_csv.py +0 -80
- scripts/ias/correct_ccd_temp_cal_elfique.py +0 -43
- scripts/ias/correct_ccd_temp_cal_floreffe.py +0 -43
- scripts/ias/correct_trp_swap_achel.py +0 -199
- scripts/inta/correct_ccd_temp_cal_duvel.py +0 -43
- scripts/inta/correct_ccd_temp_cal_gueuze.py +0 -43
- scripts/n_fee_supply_voltage_calculation.py +0 -92
- scripts/playground.py +0 -30
- scripts/print_hdf5_hk_data.py +0 -68
- scripts/print_register_map.py +0 -43
- scripts/remove_lines_between_matches.py +0 -188
- scripts/sron/commanding/control_heaters.py +0 -44
- scripts/sron/commanding/pumpdown.py +0 -46
- scripts/sron/commanding/set_pid_setpoint.py +0 -19
- scripts/sron/commanding/shutdown_bbb_heaters.py +0 -10
- scripts/sron/commanding/shutdown_pumps.py +0 -33
- scripts/sron/correct_mgse_coordinates_brigand_chimay.py +0 -272
- scripts/sron/correct_trp_swap_brigand.py +0 -204
- scripts/sron/gimbal_conversions.py +0 -75
- scripts/sron/tm_gen/tm_gen_agilent.py +0 -37
- scripts/sron/tm_gen/tm_gen_heaters.py +0 -4
- scripts/sron/tm_gen/tm_gen_spid.py +0 -13
- scripts/update_operational_cgse.py +0 -268
- scripts/update_operational_cgse_old.py +0 -273
egse/config.py
DELETED
|
@@ -1,410 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
This module provides convenience functions to properly configure the Common-EGSE
|
|
3
|
-
and to find paths and resources.
|
|
4
|
-
"""
|
|
5
|
-
from __future__ import annotations
|
|
6
|
-
|
|
7
|
-
import errno
|
|
8
|
-
import fnmatch
|
|
9
|
-
import logging
|
|
10
|
-
import os
|
|
11
|
-
from functools import lru_cache
|
|
12
|
-
from os.path import exists
|
|
13
|
-
from os.path import join
|
|
14
|
-
from pathlib import Path
|
|
15
|
-
from pathlib import PurePath
|
|
16
|
-
from typing import List
|
|
17
|
-
from typing import Optional
|
|
18
|
-
from typing import Tuple
|
|
19
|
-
from typing import Union
|
|
20
|
-
|
|
21
|
-
import git
|
|
22
|
-
|
|
23
|
-
HERE = Path(__file__).parent.resolve()
|
|
24
|
-
MODULE_LOGGER = logging.getLogger(__name__)
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
def find_first_occurrence_of_dir(pattern: str, root: Path | str = None) -> Optional[Path]:
|
|
28
|
-
"""
|
|
29
|
-
Returns the full path of the directory that first matches the pattern. The directory hierarchy is
|
|
30
|
-
traversed in alphabetical order. The pattern is matched first against all directories in the root
|
|
31
|
-
folder, if there is no match, the first folder in root is traversed until a match is found. If no
|
|
32
|
-
match is found, the second folder in root is traversed.
|
|
33
|
-
|
|
34
|
-
Note that the pattern may contain parent directories, like `/egse/data/icons` or `egse/*/icons`,
|
|
35
|
-
in which case the full pattern is matched.
|
|
36
|
-
|
|
37
|
-
Args:
|
|
38
|
-
pattern: a filename pattern
|
|
39
|
-
root: the root folder to start the hierarchical search
|
|
40
|
-
|
|
41
|
-
Returns:
|
|
42
|
-
The full path of the matched pattern or None if no match could be found.
|
|
43
|
-
"""
|
|
44
|
-
import fnmatch
|
|
45
|
-
|
|
46
|
-
root = Path(root).resolve() if root else HERE
|
|
47
|
-
if not root.is_dir():
|
|
48
|
-
root = root.parent
|
|
49
|
-
|
|
50
|
-
parts = pattern.rsplit("/", maxsplit=1)
|
|
51
|
-
if len(parts) == 2:
|
|
52
|
-
first_part = parts[0]
|
|
53
|
-
last_part = parts[1]
|
|
54
|
-
else:
|
|
55
|
-
first_part = ""
|
|
56
|
-
last_part = parts[0]
|
|
57
|
-
|
|
58
|
-
dirs = sorted([entry.name for entry in root.iterdir() if entry.is_dir()])
|
|
59
|
-
|
|
60
|
-
if root.match(f"*{first_part}") and (matches := fnmatch.filter(dirs, last_part)):
|
|
61
|
-
return root / matches[0]
|
|
62
|
-
|
|
63
|
-
for d in dirs:
|
|
64
|
-
if match := find_first_occurrence_of_dir(pattern, root / d):
|
|
65
|
-
return match
|
|
66
|
-
|
|
67
|
-
return None
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
def find_dir(pattern: str, root: str = None) -> Optional[Path]:
|
|
71
|
-
"""
|
|
72
|
-
Find the first folder that matches the given pattern.
|
|
73
|
-
|
|
74
|
-
Note that if there are more folders that match the pattern in the distribution,
|
|
75
|
-
this function only returns the first occurrence that is found, which might
|
|
76
|
-
not be what you want. To be sure only one folder is returned, use the
|
|
77
|
-
`find_dirs()` function and check if there is just one item returned in the list.
|
|
78
|
-
|
|
79
|
-
Args:
|
|
80
|
-
pattern (str): pattern to match (use * for wildcard)
|
|
81
|
-
root (str): the top level folder to search [default=common-egse-root]
|
|
82
|
-
|
|
83
|
-
Returns:
|
|
84
|
-
the first occurrence of the directory pattern or None when not found.
|
|
85
|
-
"""
|
|
86
|
-
for folder in find_dirs(pattern, root):
|
|
87
|
-
return folder
|
|
88
|
-
|
|
89
|
-
return None
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
def find_dirs(pattern: str, root: str = None):
|
|
93
|
-
"""
|
|
94
|
-
Generator for returning directory paths from a walk started at `root` and matching pattern.
|
|
95
|
-
|
|
96
|
-
The pattern can contain the asterisk '*' as a wildcard.
|
|
97
|
-
|
|
98
|
-
The pattern can contain a directory separator '/' which means
|
|
99
|
-
the last part of the path needs to match these folders.
|
|
100
|
-
|
|
101
|
-
Examples:
|
|
102
|
-
>>> for folder in find_dirs("/egse/images"):
|
|
103
|
-
... assert folder.match('*/egse/images')
|
|
104
|
-
|
|
105
|
-
>>> folders = list(find_dirs("/egse/images"))
|
|
106
|
-
>>> assert len(folders)
|
|
107
|
-
|
|
108
|
-
Args:
|
|
109
|
-
pattern (str): pattern to match (use * for wildcard)
|
|
110
|
-
root (str): the top level folder to search [default=common-egse-root]
|
|
111
|
-
|
|
112
|
-
Returns:
|
|
113
|
-
Paths of folders matching pattern, from root.
|
|
114
|
-
"""
|
|
115
|
-
root = Path(root).resolve() if root else get_common_egse_root()
|
|
116
|
-
if not root.is_dir():
|
|
117
|
-
root = root.parent
|
|
118
|
-
|
|
119
|
-
parts = pattern.rsplit("/", maxsplit=1)
|
|
120
|
-
if len(parts) == 2:
|
|
121
|
-
first_part = parts[0]
|
|
122
|
-
last_part = parts[1]
|
|
123
|
-
else:
|
|
124
|
-
first_part = ""
|
|
125
|
-
last_part = parts[0]
|
|
126
|
-
|
|
127
|
-
for path, folders, files in os.walk(root):
|
|
128
|
-
for name in fnmatch.filter(folders, last_part):
|
|
129
|
-
if path.endswith(first_part):
|
|
130
|
-
yield Path(path) / name
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
def find_files(pattern: str, root: str | Path = None, in_dir: str = None):
|
|
134
|
-
"""
|
|
135
|
-
Generator for returning file paths from a top folder, matching the pattern.
|
|
136
|
-
|
|
137
|
-
The top folder can be specified as e.g. `__file__` in which case the parent of that file
|
|
138
|
-
will be used as the top root folder. Note that when you specify '.' as the root argument
|
|
139
|
-
the current working directory will be taken as the root folder, which is probably not what
|
|
140
|
-
you intended.
|
|
141
|
-
|
|
142
|
-
When the file shall be in a specific directory, use the `in_dir` keyword. This requires
|
|
143
|
-
that the path ends with the given string in `in_dir`.
|
|
144
|
-
|
|
145
|
-
>>> file_pattern = 'EtherSpaceLink*.dylib'
|
|
146
|
-
>>> in_dir = 'lib/CentOS-7'
|
|
147
|
-
>>> for file in find_files(file_pattern, in_dir=in_dir):
|
|
148
|
-
... assert file.match("*lib/CentOS-7/EtherSpaceLink*")
|
|
149
|
-
|
|
150
|
-
Args:
|
|
151
|
-
pattern (str) : sorting pattern (use * for wildcard)
|
|
152
|
-
root (str): the top level folder to search [default=common-egse-root]
|
|
153
|
-
in_dir (str): the 'leaf' directory in which the file shall be
|
|
154
|
-
|
|
155
|
-
Returns:
|
|
156
|
-
Paths of files matching pattern, from root.
|
|
157
|
-
"""
|
|
158
|
-
root = Path(root).resolve() if root else get_common_egse_root()
|
|
159
|
-
if not root.is_dir():
|
|
160
|
-
root = root.parent
|
|
161
|
-
|
|
162
|
-
exclude_dirs = ("venv", "venv38", ".git", ".idea", ".DS_Store")
|
|
163
|
-
|
|
164
|
-
for path, folders, files in os.walk(root):
|
|
165
|
-
folders[:] = list(filter(lambda x: x not in exclude_dirs, folders))
|
|
166
|
-
if in_dir and not path.endswith(in_dir):
|
|
167
|
-
continue
|
|
168
|
-
for name in fnmatch.filter(files, pattern):
|
|
169
|
-
yield Path(path) / name
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
def find_file(name: str, root: str | Path = None, in_dir: str = None) -> Optional[Path]:
|
|
173
|
-
"""
|
|
174
|
-
Find the path to the given file starting from the root directory of the Common-EGSE
|
|
175
|
-
distribution.
|
|
176
|
-
|
|
177
|
-
Note that if there are more files with the given name found in the distribution,
|
|
178
|
-
this function only returns the first file that is found, which might not be
|
|
179
|
-
what you want. To be sure only one file is returned, use the `find_files()`
|
|
180
|
-
function and check if there is just one file returned in the list.
|
|
181
|
-
|
|
182
|
-
When the file shall be in a specific directory, use the `in_dir` keyword.
|
|
183
|
-
This requires that the path ends with the given string in `in_dir`.
|
|
184
|
-
|
|
185
|
-
>>> file_pattern = 'EtherSpaceLink*.dylib'
|
|
186
|
-
>>> in_dir = 'lib/CentOS-7'
|
|
187
|
-
>>> file = find_file(file_pattern, in_dir=in_dir)
|
|
188
|
-
>>> assert file.match("*/lib/CentOS-7/EtherSpace*")
|
|
189
|
-
|
|
190
|
-
Args:
|
|
191
|
-
name (str): the name of the file (can contain wildcards)
|
|
192
|
-
root (str): the top level folder to search [default=common-egse-root]
|
|
193
|
-
in_dir (str): the 'leaf' directory in which the file shall be
|
|
194
|
-
|
|
195
|
-
Returns:
|
|
196
|
-
the first occurrence of the file or None when not found.
|
|
197
|
-
"""
|
|
198
|
-
for file_ in find_files(name, root, in_dir):
|
|
199
|
-
return file_
|
|
200
|
-
|
|
201
|
-
return None
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
def find_root(
|
|
205
|
-
path: Union[str, PurePath], tests: Tuple[str, ...] = (), default: str = None
|
|
206
|
-
) -> Union[PurePath, None]:
|
|
207
|
-
"""
|
|
208
|
-
Find the root folder based on the files in ``tests``.
|
|
209
|
-
|
|
210
|
-
The algorithm crawls backward over the directory structure until one of the
|
|
211
|
-
items in ``tests`` is matched. and it will return that directory as a ``Path``.
|
|
212
|
-
|
|
213
|
-
When no root folder can be determined, the ``default``
|
|
214
|
-
parameter is returned as a Path (or None).
|
|
215
|
-
|
|
216
|
-
When nothing is provided in ``tests``, all matches will
|
|
217
|
-
fail and the ``default`` parameter will be returned.
|
|
218
|
-
|
|
219
|
-
Args:
|
|
220
|
-
path: folder from which the search is started
|
|
221
|
-
tests: names (files or dirs) to test for existence
|
|
222
|
-
default: returned when no root is found
|
|
223
|
-
|
|
224
|
-
Returns:
|
|
225
|
-
a Path which is the root folder.
|
|
226
|
-
"""
|
|
227
|
-
|
|
228
|
-
if path is None:
|
|
229
|
-
return None
|
|
230
|
-
if not Path(path).exists():
|
|
231
|
-
return None
|
|
232
|
-
|
|
233
|
-
prev, test = None, Path(path)
|
|
234
|
-
while prev != test:
|
|
235
|
-
if any(test.joinpath(file_).exists() for file_ in tests):
|
|
236
|
-
return test.resolve()
|
|
237
|
-
prev, test = test, test.parent
|
|
238
|
-
|
|
239
|
-
return Path(default) if default is not None else None
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
@lru_cache(maxsize=16)
|
|
243
|
-
def get_common_egse_root(path: Union[str, PurePath] = None) -> Optional[PurePath]:
|
|
244
|
-
"""
|
|
245
|
-
Returns the absolute path to the installation directory for the Common-EGSE.
|
|
246
|
-
|
|
247
|
-
The algorithm first tries to determine the path from the environment variable
|
|
248
|
-
``PLATO_COMMON_EGSE_PATH``. If this environment variable doesn't exist, the algorithm
|
|
249
|
-
tries to determine the path automatically from (1) the git root if it is a git repository,
|
|
250
|
-
or (2) from the location of this module assuming the installation is done from the
|
|
251
|
-
GitHub distribution.
|
|
252
|
-
|
|
253
|
-
When the optional argument ``path`` is given, that directory will be used to start the
|
|
254
|
-
search for the root folder.
|
|
255
|
-
|
|
256
|
-
At this moment the algorithm does not cache the ``egse_path`` in order to speed up
|
|
257
|
-
the successive calls to this function.
|
|
258
|
-
|
|
259
|
-
Args:
|
|
260
|
-
path (str or Path): a directory as a Path or str [optional]
|
|
261
|
-
|
|
262
|
-
Returns:
|
|
263
|
-
Path: the absolute path to the Common-EGSE installation directory or None
|
|
264
|
-
"""
|
|
265
|
-
_TEST_NAMES = ("pyproject.toml", "setup.py")
|
|
266
|
-
if path is not None:
|
|
267
|
-
return find_root(path, tests=_TEST_NAMES)
|
|
268
|
-
|
|
269
|
-
egse_path: Union[str, PurePath, None] = os.getenv("PLATO_COMMON_EGSE_PATH")
|
|
270
|
-
|
|
271
|
-
if egse_path is None:
|
|
272
|
-
|
|
273
|
-
# The root of the plato-common-egse installation shall be determined from the location
|
|
274
|
-
# of this config module using git commands to find the git root folder.
|
|
275
|
-
# This assumes the user has installed from git/GitHub (which is not always true)!
|
|
276
|
-
#
|
|
277
|
-
# Alternatively, the root directory can be determined from the location of this module
|
|
278
|
-
# by going back in the directory structure until the ``setup.py`` module is found.
|
|
279
|
-
|
|
280
|
-
_THIS_FILE_PATH = Path(__file__).resolve()
|
|
281
|
-
_THIS_FILE_LOCATION = _THIS_FILE_PATH.parent
|
|
282
|
-
|
|
283
|
-
try:
|
|
284
|
-
git_repo = git.Repo(_THIS_FILE_PATH, search_parent_directories=True)
|
|
285
|
-
git_root = git_repo.git.rev_parse("--show-toplevel")
|
|
286
|
-
egse_path = git_root
|
|
287
|
-
except (git.exc.InvalidGitRepositoryError, git.exc.NoSuchPathError):
|
|
288
|
-
MODULE_LOGGER.info("no git repository found, assuming installation from distribution.")
|
|
289
|
-
egse_path = find_root(_THIS_FILE_LOCATION, tests=_TEST_NAMES)
|
|
290
|
-
|
|
291
|
-
MODULE_LOGGER.debug(f"Common-EGSE location is automatically determined: {egse_path}.")
|
|
292
|
-
|
|
293
|
-
else:
|
|
294
|
-
MODULE_LOGGER.debug(
|
|
295
|
-
f"Common-EGSE location determined from environment variable "
|
|
296
|
-
f"PLATO_COMMON_EGSE_PATH: {egse_path}"
|
|
297
|
-
)
|
|
298
|
-
|
|
299
|
-
return Path(egse_path)
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
def get_resource_dirs(root_dir: Union[str, PurePath] = None) -> List[Path]:
|
|
303
|
-
"""
|
|
304
|
-
Define directories that contain resources like images, icons, and data files.
|
|
305
|
-
|
|
306
|
-
Resource directories can have the following names: `resources`, `data`, `icons`, or `images`.
|
|
307
|
-
This function checks if any of the resource directories exist in the project root directory,
|
|
308
|
-
in the `root_dir` that is given as an argument or in the `src/egse` sub-folder.
|
|
309
|
-
|
|
310
|
-
So, the directories that are searched for the resource folders are:
|
|
311
|
-
|
|
312
|
-
* `root_dir` or the project's root directory
|
|
313
|
-
* the `src/egse` sub-folder of one of the above
|
|
314
|
-
|
|
315
|
-
For all existing directories the function returns the absolute path.
|
|
316
|
-
|
|
317
|
-
Args:
|
|
318
|
-
root_dir (str): the directory to search for resource folders
|
|
319
|
-
|
|
320
|
-
Returns:
|
|
321
|
-
a list of absolute Paths.
|
|
322
|
-
"""
|
|
323
|
-
project_dir = Path(root_dir).resolve() if root_dir else get_common_egse_root()
|
|
324
|
-
result = []
|
|
325
|
-
for dir_ in ["resources", "data", "icons", "images"]:
|
|
326
|
-
if (project_dir / dir_).is_dir():
|
|
327
|
-
result.append(Path(project_dir, dir_).resolve())
|
|
328
|
-
if (project_dir / "src" / "egse" / dir_).is_dir():
|
|
329
|
-
result.append(Path(project_dir, "src", "egse", dir_).resolve())
|
|
330
|
-
return result
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
def get_resource_path(name: str, resource_root_dir: Union[str, PurePath] = None) -> PurePath:
|
|
334
|
-
"""
|
|
335
|
-
Searches for a data file (resource) with the given name.
|
|
336
|
-
|
|
337
|
-
When `resource_root_dir` is not given, the search for resources will start at the root
|
|
338
|
-
folder of the project (using the function `get_common_egse_root()`). Any other root
|
|
339
|
-
directory can be given, e.g. if you want to start the search from the location of your
|
|
340
|
-
source code file, use `Path(__file__).parent` as the `resource_root_dir` argument.
|
|
341
|
-
|
|
342
|
-
Args:
|
|
343
|
-
name (str): the name of the resource that is requested
|
|
344
|
-
resource_root_dir (str): the root directory where the search for resources should be started
|
|
345
|
-
|
|
346
|
-
Returns:
|
|
347
|
-
the absolute path of the data file with the given name. The first name that matches
|
|
348
|
-
is returned. If no file with the given name or path exists, a FileNotFoundError is raised.
|
|
349
|
-
|
|
350
|
-
"""
|
|
351
|
-
for resource_dir in get_resource_dirs(resource_root_dir):
|
|
352
|
-
resource_path = join(resource_dir, name)
|
|
353
|
-
if exists(resource_path):
|
|
354
|
-
return Path(resource_path).absolute()
|
|
355
|
-
raise FileNotFoundError(errno.ENOENT, f"Could not locate resource '{name}'")
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
def set_logger_levels(logger_levels: List[Tuple] = None):
|
|
359
|
-
"""
|
|
360
|
-
Set the logging level for the given loggers.
|
|
361
|
-
|
|
362
|
-
"""
|
|
363
|
-
logger_levels = logger_levels or []
|
|
364
|
-
|
|
365
|
-
for name, level in logger_levels:
|
|
366
|
-
a_logger = logging.getLogger(name)
|
|
367
|
-
a_logger.setLevel(level)
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
class WorkingDirectory:
|
|
371
|
-
"""WorkingDirectory is a context manager to temporarily change the working directory while
|
|
372
|
-
executing some code.
|
|
373
|
-
|
|
374
|
-
This context manager has a property `path` which returns the absolute path of the
|
|
375
|
-
current directory.
|
|
376
|
-
|
|
377
|
-
Examples:
|
|
378
|
-
>>> with WorkingDirectory(find_dir("/egse/images")) as wdir:
|
|
379
|
-
... for file in wdir.path.glob('*'):
|
|
380
|
-
... assert file.exists() # do something with the image files
|
|
381
|
-
|
|
382
|
-
"""
|
|
383
|
-
|
|
384
|
-
def __init__(self, path):
|
|
385
|
-
"""
|
|
386
|
-
Args:
|
|
387
|
-
path (str, Path): the folder to change to within this context
|
|
388
|
-
Raises:
|
|
389
|
-
ValueError when the given path doesn't exist.
|
|
390
|
-
"""
|
|
391
|
-
self._temporary_path = Path(path)
|
|
392
|
-
if not self._temporary_path.exists():
|
|
393
|
-
raise ValueError(f"The given path ({path}) doesn't exist.")
|
|
394
|
-
self._current_dir = None
|
|
395
|
-
|
|
396
|
-
def __enter__(self):
|
|
397
|
-
self._current_dir = os.getcwd()
|
|
398
|
-
os.chdir(self._temporary_path)
|
|
399
|
-
return self
|
|
400
|
-
|
|
401
|
-
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
402
|
-
try:
|
|
403
|
-
os.chdir(self._current_dir)
|
|
404
|
-
except OSError as exc:
|
|
405
|
-
MODULE_LOGGER.warning(f"Change back to previous directory failed: {exc}")
|
|
406
|
-
|
|
407
|
-
@property
|
|
408
|
-
def path(self):
|
|
409
|
-
"""Resolve and return the current Path of the context."""
|
|
410
|
-
return self._temporary_path.resolve()
|