datalab-platform 0.0.1.dev0__py3-none-any.whl → 1.0.1__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.
- datalab/__init__.py +35 -2
- datalab/adapters_metadata/__init__.py +31 -0
- datalab/adapters_metadata/base_adapter.py +316 -0
- datalab/adapters_metadata/common.py +422 -0
- datalab/adapters_metadata/geometry_adapter.py +98 -0
- datalab/adapters_metadata/table_adapter.py +84 -0
- datalab/adapters_plotpy/__init__.py +54 -0
- datalab/adapters_plotpy/annotations.py +124 -0
- datalab/adapters_plotpy/base.py +110 -0
- datalab/adapters_plotpy/converters.py +86 -0
- datalab/adapters_plotpy/factories.py +80 -0
- datalab/adapters_plotpy/objects/__init__.py +0 -0
- datalab/adapters_plotpy/objects/base.py +197 -0
- datalab/adapters_plotpy/objects/image.py +157 -0
- datalab/adapters_plotpy/objects/scalar.py +565 -0
- datalab/adapters_plotpy/objects/signal.py +264 -0
- datalab/adapters_plotpy/roi/__init__.py +0 -0
- datalab/adapters_plotpy/roi/base.py +146 -0
- datalab/adapters_plotpy/roi/factory.py +93 -0
- datalab/adapters_plotpy/roi/image.py +207 -0
- datalab/adapters_plotpy/roi/signal.py +72 -0
- datalab/app.py +98 -0
- datalab/config.py +817 -0
- datalab/control/__init__.py +0 -0
- datalab/control/baseproxy.py +776 -0
- datalab/control/proxy.py +343 -0
- datalab/control/remote.py +1005 -0
- datalab/data/doc/DataLab_en.pdf +0 -0
- datalab/data/doc/DataLab_fr.pdf +0 -0
- datalab/data/icons/analysis/delete_results.svg +109 -0
- datalab/data/icons/analysis/fw1e2.svg +156 -0
- datalab/data/icons/analysis/fwhm.svg +156 -0
- datalab/data/icons/analysis/histogram.svg +49 -0
- datalab/data/icons/analysis/peak_detect.svg +160 -0
- datalab/data/icons/analysis/plot_results.svg +151 -0
- datalab/data/icons/analysis/show_results.svg +83 -0
- datalab/data/icons/analysis/stats.svg +49 -0
- datalab/data/icons/analysis.svg +120 -0
- datalab/data/icons/apply.svg +3 -0
- datalab/data/icons/check_all.svg +15 -0
- datalab/data/icons/collapse.svg +44 -0
- datalab/data/icons/collapse_selection.svg +63 -0
- datalab/data/icons/console.svg +101 -0
- datalab/data/icons/create/1d-normal.svg +8 -0
- datalab/data/icons/create/1d-poisson.svg +9 -0
- datalab/data/icons/create/1d-uniform.svg +8 -0
- datalab/data/icons/create/1d-zero.svg +57 -0
- datalab/data/icons/create/2d-gaussian.svg +56 -0
- datalab/data/icons/create/2d-normal.svg +38 -0
- datalab/data/icons/create/2d-poisson.svg +38 -0
- datalab/data/icons/create/2d-ramp.svg +90 -0
- datalab/data/icons/create/2d-sinc.svg +62 -0
- datalab/data/icons/create/2d-uniform.svg +38 -0
- datalab/data/icons/create/2d-zero.svg +13 -0
- datalab/data/icons/create/checkerboard.svg +39 -0
- datalab/data/icons/create/cosine.svg +12 -0
- datalab/data/icons/create/exponential.svg +55 -0
- datalab/data/icons/create/gaussian.svg +12 -0
- datalab/data/icons/create/grating.svg +29 -0
- datalab/data/icons/create/linear_chirp.svg +7 -0
- datalab/data/icons/create/logistic.svg +7 -0
- datalab/data/icons/create/lorentzian.svg +12 -0
- datalab/data/icons/create/planck.svg +12 -0
- datalab/data/icons/create/polynomial.svg +7 -0
- datalab/data/icons/create/pulse.svg +12 -0
- datalab/data/icons/create/ring.svg +18 -0
- datalab/data/icons/create/sawtooth.svg +7 -0
- datalab/data/icons/create/siemens.svg +35 -0
- datalab/data/icons/create/sinc.svg +12 -0
- datalab/data/icons/create/sine.svg +7 -0
- datalab/data/icons/create/square.svg +7 -0
- datalab/data/icons/create/square_pulse.svg +7 -0
- datalab/data/icons/create/step.svg +7 -0
- datalab/data/icons/create/step_pulse.svg +12 -0
- datalab/data/icons/create/triangle.svg +7 -0
- datalab/data/icons/create/voigt.svg +12 -0
- datalab/data/icons/edit/annotations.svg +72 -0
- datalab/data/icons/edit/annotations_copy.svg +114 -0
- datalab/data/icons/edit/annotations_delete.svg +83 -0
- datalab/data/icons/edit/annotations_edit.svg +98 -0
- datalab/data/icons/edit/annotations_export.svg +85 -0
- datalab/data/icons/edit/annotations_import.svg +85 -0
- datalab/data/icons/edit/annotations_paste.svg +100 -0
- datalab/data/icons/edit/copy_titles.svg +109 -0
- datalab/data/icons/edit/delete.svg +84 -0
- datalab/data/icons/edit/delete_all.svg +214 -0
- datalab/data/icons/edit/duplicate.svg +64 -0
- datalab/data/icons/edit/goto_source.svg +60 -0
- datalab/data/icons/edit/metadata.svg +60 -0
- datalab/data/icons/edit/metadata_add.svg +80 -0
- datalab/data/icons/edit/metadata_copy.svg +96 -0
- datalab/data/icons/edit/metadata_delete.svg +62 -0
- datalab/data/icons/edit/metadata_export.svg +68 -0
- datalab/data/icons/edit/metadata_import.svg +68 -0
- datalab/data/icons/edit/metadata_paste.svg +79 -0
- datalab/data/icons/edit/move_down.svg +55 -0
- datalab/data/icons/edit/move_up.svg +54 -0
- datalab/data/icons/edit/new_group.svg +76 -0
- datalab/data/icons/edit/recompute.svg +60 -0
- datalab/data/icons/edit/rename.svg +49 -0
- datalab/data/icons/edit.svg +16 -0
- datalab/data/icons/expand.svg +44 -0
- datalab/data/icons/expand_selection.svg +63 -0
- datalab/data/icons/fit/cdf_fit.svg +56 -0
- datalab/data/icons/fit/exponential_fit.svg +55 -0
- datalab/data/icons/fit/gaussian_fit.svg +62 -0
- datalab/data/icons/fit/interactive_fit.svg +101 -0
- datalab/data/icons/fit/linear_fit.svg +57 -0
- datalab/data/icons/fit/lorentzian_fit.svg +209 -0
- datalab/data/icons/fit/multigaussian_fit.svg +85 -0
- datalab/data/icons/fit/multilorentzian_fit.svg +85 -0
- datalab/data/icons/fit/piecewiseexponential_fit.svg +209 -0
- datalab/data/icons/fit/planckian_fit.svg +62 -0
- datalab/data/icons/fit/polynomial_fit.svg +59 -0
- datalab/data/icons/fit/sigmoid_fit.svg +56 -0
- datalab/data/icons/fit/sinusoidal_fit.svg +72 -0
- datalab/data/icons/fit/twohalfgaussian_fit.svg +63 -0
- datalab/data/icons/fit/voigt_fit.svg +57 -0
- datalab/data/icons/group.svg +56 -0
- datalab/data/icons/h5/h5array.svg +59 -0
- datalab/data/icons/h5/h5attrs.svg +75 -0
- datalab/data/icons/h5/h5browser.svg +133 -0
- datalab/data/icons/h5/h5file.svg +69 -0
- datalab/data/icons/h5/h5group.svg +49 -0
- datalab/data/icons/h5/h5scalar.svg +1 -0
- datalab/data/icons/help_pdf.svg +46 -0
- datalab/data/icons/history.svg +7 -0
- datalab/data/icons/image.svg +135 -0
- datalab/data/icons/io/fileopen_directory.svg +60 -0
- datalab/data/icons/io/fileopen_h5.svg +84 -0
- datalab/data/icons/io/fileopen_ima.svg +187 -0
- datalab/data/icons/io/fileopen_py.svg +123 -0
- datalab/data/icons/io/fileopen_sig.svg +138 -0
- datalab/data/icons/io/filesave_h5.svg +97 -0
- datalab/data/icons/io/filesave_ima.svg +200 -0
- datalab/data/icons/io/filesave_py.svg +136 -0
- datalab/data/icons/io/filesave_sig.svg +151 -0
- datalab/data/icons/io/import_text.svg +144 -0
- datalab/data/icons/io/save_to_directory.svg +134 -0
- datalab/data/icons/io.svg +84 -0
- datalab/data/icons/libre-camera-flash-off.svg +1 -0
- datalab/data/icons/libre-camera-flash-on.svg +1 -0
- datalab/data/icons/libre-gui-about.svg +1 -0
- datalab/data/icons/libre-gui-action-delete.svg +1 -0
- datalab/data/icons/libre-gui-add.svg +1 -0
- datalab/data/icons/libre-gui-arrow-down.svg +1 -0
- datalab/data/icons/libre-gui-arrow-left.svg +1 -0
- datalab/data/icons/libre-gui-arrow-right.svg +1 -0
- datalab/data/icons/libre-gui-arrow-up.svg +1 -0
- datalab/data/icons/libre-gui-close.svg +40 -0
- datalab/data/icons/libre-gui-cogs.svg +1 -0
- datalab/data/icons/libre-gui-globe.svg +1 -0
- datalab/data/icons/libre-gui-help.svg +1 -0
- datalab/data/icons/libre-gui-link.svg +1 -0
- datalab/data/icons/libre-gui-menu.svg +1 -0
- datalab/data/icons/libre-gui-pencil.svg +1 -0
- datalab/data/icons/libre-gui-plugin.svg +1 -0
- datalab/data/icons/libre-gui-questions.svg +1 -0
- datalab/data/icons/libre-gui-settings.svg +1 -0
- datalab/data/icons/libre-gui-unlink.svg +1 -0
- datalab/data/icons/libre-tech-ram.svg +1 -0
- datalab/data/icons/libre-toolbox.svg +1 -0
- datalab/data/icons/logs.svg +1 -0
- datalab/data/icons/markers.svg +74 -0
- datalab/data/icons/menu.svg +13 -0
- datalab/data/icons/new_ima.svg +148 -0
- datalab/data/icons/new_sig.svg +123 -0
- datalab/data/icons/operations/abs.svg +116 -0
- datalab/data/icons/operations/arithmetic.svg +123 -0
- datalab/data/icons/operations/average.svg +124 -0
- datalab/data/icons/operations/complex_from_magnitude_phase.svg +116 -0
- datalab/data/icons/operations/complex_from_real_imag.svg +124 -0
- datalab/data/icons/operations/constant.svg +116 -0
- datalab/data/icons/operations/constant_add.svg +109 -0
- datalab/data/icons/operations/constant_divide.svg +109 -0
- datalab/data/icons/operations/constant_multiply.svg +109 -0
- datalab/data/icons/operations/constant_subtract.svg +109 -0
- datalab/data/icons/operations/convert_dtype.svg +117 -0
- datalab/data/icons/operations/convolution.svg +46 -0
- datalab/data/icons/operations/deconvolution.svg +57 -0
- datalab/data/icons/operations/derivative.svg +127 -0
- datalab/data/icons/operations/difference.svg +52 -0
- datalab/data/icons/operations/division.svg +139 -0
- datalab/data/icons/operations/exp.svg +116 -0
- datalab/data/icons/operations/flip_horizontally.svg +69 -0
- datalab/data/icons/operations/flip_vertically.svg +74 -0
- datalab/data/icons/operations/im.svg +124 -0
- datalab/data/icons/operations/integral.svg +50 -0
- datalab/data/icons/operations/inverse.svg +143 -0
- datalab/data/icons/operations/log10.svg +109 -0
- datalab/data/icons/operations/phase.svg +116 -0
- datalab/data/icons/operations/power.svg +118 -0
- datalab/data/icons/operations/product.svg +124 -0
- datalab/data/icons/operations/profile.svg +379 -0
- datalab/data/icons/operations/profile_average.svg +399 -0
- datalab/data/icons/operations/profile_radial.svg +261 -0
- datalab/data/icons/operations/profile_segment.svg +262 -0
- datalab/data/icons/operations/quadratic_difference.svg +84 -0
- datalab/data/icons/operations/re.svg +124 -0
- datalab/data/icons/operations/rotate_left.svg +72 -0
- datalab/data/icons/operations/rotate_right.svg +72 -0
- datalab/data/icons/operations/signals_to_image.svg +314 -0
- datalab/data/icons/operations/sqrt.svg +110 -0
- datalab/data/icons/operations/std.svg +124 -0
- datalab/data/icons/operations/sum.svg +102 -0
- datalab/data/icons/play_demo.svg +9 -0
- datalab/data/icons/processing/axis_transform.svg +62 -0
- datalab/data/icons/processing/bandpass.svg +79 -0
- datalab/data/icons/processing/bandstop.svg +71 -0
- datalab/data/icons/processing/binning.svg +126 -0
- datalab/data/icons/processing/clip.svg +119 -0
- datalab/data/icons/processing/detrending.svg +173 -0
- datalab/data/icons/processing/distribute_on_grid.svg +769 -0
- datalab/data/icons/processing/edge_detection.svg +46 -0
- datalab/data/icons/processing/erase.svg +1 -0
- datalab/data/icons/processing/exposure.svg +143 -0
- datalab/data/icons/processing/fourier.svg +104 -0
- datalab/data/icons/processing/highpass.svg +59 -0
- datalab/data/icons/processing/interpolation.svg +71 -0
- datalab/data/icons/processing/level_adjustment.svg +70 -0
- datalab/data/icons/processing/lowpass.svg +60 -0
- datalab/data/icons/processing/morphology.svg +49 -0
- datalab/data/icons/processing/noise_addition.svg +114 -0
- datalab/data/icons/processing/noise_reduction.svg +38 -0
- datalab/data/icons/processing/normalize.svg +84 -0
- datalab/data/icons/processing/offset_correction.svg +131 -0
- datalab/data/icons/processing/resampling1d.svg +101 -0
- datalab/data/icons/processing/resampling2d.svg +240 -0
- datalab/data/icons/processing/reset_positions.svg +185 -0
- datalab/data/icons/processing/resize.svg +9 -0
- datalab/data/icons/processing/reverse_signal_x.svg +171 -0
- datalab/data/icons/processing/stability.svg +11 -0
- datalab/data/icons/processing/swap_x_y.svg +65 -0
- datalab/data/icons/processing/thresholding.svg +63 -0
- datalab/data/icons/processing/windowing.svg +45 -0
- datalab/data/icons/properties.svg +26 -0
- datalab/data/icons/reset.svg +9 -0
- datalab/data/icons/restore.svg +40 -0
- datalab/data/icons/roi/roi.svg +76 -0
- datalab/data/icons/roi/roi_coordinate.svg +78 -0
- datalab/data/icons/roi/roi_copy.svg +112 -0
- datalab/data/icons/roi/roi_delete.svg +81 -0
- datalab/data/icons/roi/roi_export.svg +87 -0
- datalab/data/icons/roi/roi_graphical.svg +78 -0
- datalab/data/icons/roi/roi_grid.svg +67 -0
- datalab/data/icons/roi/roi_ima.svg +188 -0
- datalab/data/icons/roi/roi_import.svg +87 -0
- datalab/data/icons/roi/roi_new.svg +81 -0
- datalab/data/icons/roi/roi_new_circle.svg +95 -0
- datalab/data/icons/roi/roi_new_polygon.svg +110 -0
- datalab/data/icons/roi/roi_new_rectangle.svg +70 -0
- datalab/data/icons/roi/roi_paste.svg +98 -0
- datalab/data/icons/roi/roi_sig.svg +124 -0
- datalab/data/icons/shapes.svg +134 -0
- datalab/data/icons/signal.svg +103 -0
- datalab/data/icons/table.svg +85 -0
- datalab/data/icons/table_unavailable.svg +102 -0
- datalab/data/icons/to_signal.svg +124 -0
- datalab/data/icons/tour/next.svg +44 -0
- datalab/data/icons/tour/previous.svg +44 -0
- datalab/data/icons/tour/rewind.svg +51 -0
- datalab/data/icons/tour/stop.svg +47 -0
- datalab/data/icons/tour/tour.svg +16 -0
- datalab/data/icons/uncheck_all.svg +78 -0
- datalab/data/icons/view/curve_antialiasing.svg +50 -0
- datalab/data/icons/view/new_window.svg +98 -0
- datalab/data/icons/view/refresh-auto.svg +57 -0
- datalab/data/icons/view/refresh-manual.svg +51 -0
- datalab/data/icons/view/reset_curve_styles.svg +96 -0
- datalab/data/icons/view/show_first.svg +55 -0
- datalab/data/icons/view/show_titles.svg +46 -0
- datalab/data/icons/visualization.svg +51 -0
- datalab/data/logo/DataLab-Banner-150.png +0 -0
- datalab/data/logo/DataLab-Banner-200.png +0 -0
- datalab/data/logo/DataLab-Banner2-100.png +0 -0
- datalab/data/logo/DataLab-Splash.png +0 -0
- datalab/data/logo/DataLab-watermark.png +0 -0
- datalab/data/logo/DataLab.svg +83 -0
- datalab/data/tests/reordering_test.h5 +0 -0
- datalab/data/tutorials/fabry_perot/fabry-perot1.jpg +0 -0
- datalab/data/tutorials/fabry_perot/fabry-perot2.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_13.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_18.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_23.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_30.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_35.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_40.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_45.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_50.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_55.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_60.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_65.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_70.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_75.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_80.jpg +0 -0
- datalab/env.py +542 -0
- datalab/gui/__init__.py +89 -0
- datalab/gui/actionhandler.py +1701 -0
- datalab/gui/docks.py +473 -0
- datalab/gui/h5io.py +150 -0
- datalab/gui/macroeditor.py +310 -0
- datalab/gui/main.py +2081 -0
- datalab/gui/newobject.py +217 -0
- datalab/gui/objectview.py +766 -0
- datalab/gui/panel/__init__.py +48 -0
- datalab/gui/panel/base.py +3254 -0
- datalab/gui/panel/image.py +157 -0
- datalab/gui/panel/macro.py +607 -0
- datalab/gui/panel/signal.py +164 -0
- datalab/gui/plothandler.py +800 -0
- datalab/gui/processor/__init__.py +84 -0
- datalab/gui/processor/base.py +2456 -0
- datalab/gui/processor/catcher.py +75 -0
- datalab/gui/processor/image.py +1214 -0
- datalab/gui/processor/signal.py +755 -0
- datalab/gui/profiledialog.py +333 -0
- datalab/gui/roieditor.py +633 -0
- datalab/gui/roigrideditor.py +208 -0
- datalab/gui/settings.py +612 -0
- datalab/gui/tour.py +908 -0
- datalab/h5/__init__.py +12 -0
- datalab/h5/common.py +314 -0
- datalab/h5/generic.py +580 -0
- datalab/h5/native.py +39 -0
- datalab/h5/utils.py +95 -0
- datalab/objectmodel.py +640 -0
- datalab/plugins/_readme_.txt +9 -0
- datalab/plugins/datalab_imageformats.py +175 -0
- datalab/plugins/datalab_testdata.py +190 -0
- datalab/plugins.py +355 -0
- datalab/tests/__init__.py +199 -0
- datalab/tests/backbone/__init__.py +1 -0
- datalab/tests/backbone/config_unit_test.py +170 -0
- datalab/tests/backbone/config_versioning_unit_test.py +34 -0
- datalab/tests/backbone/dictlistserial_app_test.py +38 -0
- datalab/tests/backbone/errorcatcher_unit_test.py +69 -0
- datalab/tests/backbone/errormsgbox_unit_test.py +50 -0
- datalab/tests/backbone/execenv_unit.py +262 -0
- datalab/tests/backbone/loadtest_gdi.py +147 -0
- datalab/tests/backbone/long_callback.py +96 -0
- datalab/tests/backbone/main_app_test.py +137 -0
- datalab/tests/backbone/memory_leak.py +43 -0
- datalab/tests/backbone/procisolation1_unit.py +128 -0
- datalab/tests/backbone/procisolation2_unit.py +171 -0
- datalab/tests/backbone/procisolation_unit_test.py +22 -0
- datalab/tests/backbone/profiling_app.py +27 -0
- datalab/tests/backbone/strings_unit_test.py +65 -0
- datalab/tests/backbone/title_formatting_unit_test.py +82 -0
- datalab/tests/conftest.py +131 -0
- datalab/tests/features/__init__.py +1 -0
- datalab/tests/features/applauncher/__init__.py +1 -0
- datalab/tests/features/applauncher/launcher1_app_test.py +28 -0
- datalab/tests/features/applauncher/launcher2_app_test.py +30 -0
- datalab/tests/features/common/__init__.py +1 -0
- datalab/tests/features/common/add_metadata_app_test.py +134 -0
- datalab/tests/features/common/add_metadata_unit_test.py +267 -0
- datalab/tests/features/common/annotations_management_unit_test.py +152 -0
- datalab/tests/features/common/auto_analysis_recompute_unit_test.py +240 -0
- datalab/tests/features/common/createobject_unit_test.py +50 -0
- datalab/tests/features/common/geometry_results_app_test.py +135 -0
- datalab/tests/features/common/interactive_processing_test.py +1109 -0
- datalab/tests/features/common/io_app_test.py +75 -0
- datalab/tests/features/common/large_results_app_test.py +187 -0
- datalab/tests/features/common/metadata_all_patterns_test.py +103 -0
- datalab/tests/features/common/metadata_app_test.py +139 -0
- datalab/tests/features/common/metadata_io_unit_test.py +60 -0
- datalab/tests/features/common/misc_app_test.py +236 -0
- datalab/tests/features/common/multiple_geometry_results_unit_test.py +122 -0
- datalab/tests/features/common/multiple_table_results_unit_test.py +64 -0
- datalab/tests/features/common/operation_modes_app_test.py +392 -0
- datalab/tests/features/common/plot_results_app_test.py +278 -0
- datalab/tests/features/common/reorder_app_test.py +75 -0
- datalab/tests/features/common/result_deletion_unit_test.py +96 -0
- datalab/tests/features/common/result_merged_label_unit_test.py +154 -0
- datalab/tests/features/common/result_shape_settings_unit_test.py +223 -0
- datalab/tests/features/common/roi_plotitem_unit_test.py +64 -0
- datalab/tests/features/common/roieditor_unit_test.py +102 -0
- datalab/tests/features/common/save_to_dir_app_test.py +163 -0
- datalab/tests/features/common/save_to_dir_unit_test.py +474 -0
- datalab/tests/features/common/stat_app_test.py +40 -0
- datalab/tests/features/common/stats_tools_unit_test.py +77 -0
- datalab/tests/features/common/table_results_app_test.py +52 -0
- datalab/tests/features/common/textimport_unit_test.py +131 -0
- datalab/tests/features/common/uuid_preservation_test.py +281 -0
- datalab/tests/features/common/worker_unit_test.py +402 -0
- datalab/tests/features/control/__init__.py +1 -0
- datalab/tests/features/control/connect_dialog.py +28 -0
- datalab/tests/features/control/embedded1_unit_test.py +304 -0
- datalab/tests/features/control/embedded2_unit_test.py +52 -0
- datalab/tests/features/control/remoteclient_app_test.py +219 -0
- datalab/tests/features/control/remoteclient_unit.py +75 -0
- datalab/tests/features/control/simpleclient_unit_test.py +321 -0
- datalab/tests/features/hdf5/__init__.py +1 -0
- datalab/tests/features/hdf5/h5browser1_unit_test.py +31 -0
- datalab/tests/features/hdf5/h5browser2_unit.py +55 -0
- datalab/tests/features/hdf5/h5browser_app_test.py +77 -0
- datalab/tests/features/hdf5/h5import_app_test.py +25 -0
- datalab/tests/features/hdf5/h5importer_app_test.py +34 -0
- datalab/tests/features/image/__init__.py +1 -0
- datalab/tests/features/image/annotations_app_test.py +28 -0
- datalab/tests/features/image/annotations_unit_test.py +80 -0
- datalab/tests/features/image/average_app_test.py +46 -0
- datalab/tests/features/image/background_dialog_test.py +70 -0
- datalab/tests/features/image/blobs_app_test.py +50 -0
- datalab/tests/features/image/contour_app_test.py +42 -0
- datalab/tests/features/image/contour_fabryperot_app_test.py +51 -0
- datalab/tests/features/image/denoise_app_test.py +31 -0
- datalab/tests/features/image/distribute_on_grid_app_test.py +95 -0
- datalab/tests/features/image/edges_app_test.py +31 -0
- datalab/tests/features/image/erase_app_test.py +21 -0
- datalab/tests/features/image/fft2d_app_test.py +27 -0
- datalab/tests/features/image/flatfield_app_test.py +40 -0
- datalab/tests/features/image/geometry_transform_unit_test.py +396 -0
- datalab/tests/features/image/imagetools_app_test.py +51 -0
- datalab/tests/features/image/imagetools_unit_test.py +27 -0
- datalab/tests/features/image/load_app_test.py +73 -0
- datalab/tests/features/image/morph_app_test.py +32 -0
- datalab/tests/features/image/offsetcorrection_app_test.py +30 -0
- datalab/tests/features/image/peak2d_app_test.py +53 -0
- datalab/tests/features/image/profile_app_test.py +73 -0
- datalab/tests/features/image/profile_dialog_test.py +56 -0
- datalab/tests/features/image/roi_app_test.py +98 -0
- datalab/tests/features/image/roi_circ_app_test.py +62 -0
- datalab/tests/features/image/roi_manipulation_app_test.py +268 -0
- datalab/tests/features/image/roigrid_unit_test.py +60 -0
- datalab/tests/features/image/side_by_side_app_test.py +52 -0
- datalab/tests/features/macro/__init__.py +1 -0
- datalab/tests/features/macro/macro_app_test.py +28 -0
- datalab/tests/features/macro/macroeditor_unit_test.py +102 -0
- datalab/tests/features/signal/__init__.py +1 -0
- datalab/tests/features/signal/baseline_dialog_test.py +53 -0
- datalab/tests/features/signal/deltax_dialog_unit_test.py +34 -0
- datalab/tests/features/signal/fft1d_app_test.py +26 -0
- datalab/tests/features/signal/filter_app_test.py +44 -0
- datalab/tests/features/signal/fitdialog_unit_test.py +50 -0
- datalab/tests/features/signal/interpolation_app_test.py +110 -0
- datalab/tests/features/signal/loadbigsignal_app_test.py +80 -0
- datalab/tests/features/signal/multiple_rois_unit_test.py +132 -0
- datalab/tests/features/signal/pulse_features_app_test.py +118 -0
- datalab/tests/features/signal/pulse_features_roi_app_test.py +55 -0
- datalab/tests/features/signal/roi_app_test.py +78 -0
- datalab/tests/features/signal/roi_manipulation_app_test.py +261 -0
- datalab/tests/features/signal/select_xy_cursor_unit_test.py +46 -0
- datalab/tests/features/signal/signalpeakdetection_dialog_test.py +33 -0
- datalab/tests/features/signal/signals_to_image_app_test.py +98 -0
- datalab/tests/features/signal/xarray_compat_app_test.py +128 -0
- datalab/tests/features/tour_unit_test.py +22 -0
- datalab/tests/features/utilities/__init__.py +1 -0
- datalab/tests/features/utilities/installconf_unit_test.py +21 -0
- datalab/tests/features/utilities/logview_app_test.py +21 -0
- datalab/tests/features/utilities/logview_error.py +24 -0
- datalab/tests/features/utilities/logview_unit_test.py +21 -0
- datalab/tests/features/utilities/memstatus_app_test.py +42 -0
- datalab/tests/features/utilities/settings_unit_test.py +88 -0
- datalab/tests/scenarios/__init__.py +1 -0
- datalab/tests/scenarios/beautiful_app.py +121 -0
- datalab/tests/scenarios/common.py +463 -0
- datalab/tests/scenarios/demo.py +212 -0
- datalab/tests/scenarios/example_app_test.py +47 -0
- datalab/tests/scenarios/scenario_h5_app_test.py +75 -0
- datalab/tests/scenarios/scenario_ima1_app_test.py +34 -0
- datalab/tests/scenarios/scenario_ima2_app_test.py +34 -0
- datalab/tests/scenarios/scenario_mac_app_test.py +58 -0
- datalab/tests/scenarios/scenario_sig1_app_test.py +36 -0
- datalab/tests/scenarios/scenario_sig2_app_test.py +35 -0
- datalab/utils/__init__.py +1 -0
- datalab/utils/conf.py +304 -0
- datalab/utils/dephash.py +105 -0
- datalab/utils/qthelpers.py +633 -0
- datalab/utils/strings.py +34 -0
- datalab/utils/tests.py +0 -0
- datalab/widgets/__init__.py +1 -0
- datalab/widgets/connection.py +138 -0
- datalab/widgets/filedialog.py +91 -0
- datalab/widgets/fileviewer.py +84 -0
- datalab/widgets/fitdialog.py +788 -0
- datalab/widgets/h5browser.py +1048 -0
- datalab/widgets/imagebackground.py +111 -0
- datalab/widgets/instconfviewer.py +175 -0
- datalab/widgets/logviewer.py +80 -0
- datalab/widgets/signalbaseline.py +90 -0
- datalab/widgets/signalcursor.py +208 -0
- datalab/widgets/signaldeltax.py +151 -0
- datalab/widgets/signalpeak.py +199 -0
- datalab/widgets/status.py +249 -0
- datalab/widgets/textimport.py +786 -0
- datalab/widgets/warningerror.py +223 -0
- datalab/widgets/wizard.py +286 -0
- datalab_platform-1.0.1.dist-info/METADATA +121 -0
- datalab_platform-1.0.1.dist-info/RECORD +494 -0
- datalab_platform-0.0.1.dev0.dist-info/METADATA +0 -67
- datalab_platform-0.0.1.dev0.dist-info/RECORD +0 -7
- {datalab_platform-0.0.1.dev0.dist-info → datalab_platform-1.0.1.dist-info}/WHEEL +0 -0
- {datalab_platform-0.0.1.dev0.dist-info → datalab_platform-1.0.1.dist-info}/entry_points.txt +0 -0
- {datalab_platform-0.0.1.dev0.dist-info → datalab_platform-1.0.1.dist-info}/licenses/LICENSE +0 -0
- {datalab_platform-0.0.1.dev0.dist-info → datalab_platform-1.0.1.dist-info}/top_level.txt +0 -0
datalab/env.py
ADDED
|
@@ -0,0 +1,542 @@
|
|
|
1
|
+
# Copyright (c) DataLab Platform Developers, BSD 3-Clause license, see LICENSE file.
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
DataLab environmnent utilities
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import argparse
|
|
10
|
+
import enum
|
|
11
|
+
import os
|
|
12
|
+
import platform
|
|
13
|
+
import pprint
|
|
14
|
+
import sys
|
|
15
|
+
import traceback
|
|
16
|
+
from contextlib import contextmanager
|
|
17
|
+
from typing import Any, Generator
|
|
18
|
+
|
|
19
|
+
from guidata.env import ExecEnv as GuiDataExecEnv
|
|
20
|
+
|
|
21
|
+
# We could import DEBUG from datalab.config, but is it really worth it?
|
|
22
|
+
DEBUG = os.environ.get("DEBUG", "").lower() in ("1", "true")
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class VerbosityLevels(enum.Enum):
|
|
26
|
+
"""Print verbosity levels (for testing purpose)"""
|
|
27
|
+
|
|
28
|
+
QUIET = "quiet"
|
|
29
|
+
NORMAL = "normal"
|
|
30
|
+
DEBUG = "debug"
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
# TODO: [P3] Rewrite this class so that options are automatically associated with
|
|
34
|
+
# environment variables and command line arguments.
|
|
35
|
+
#
|
|
36
|
+
# Use the unit test "datalab\tests\backbone\execenv_unit.py" to check that
|
|
37
|
+
# everything still works as expected.
|
|
38
|
+
#
|
|
39
|
+
# This could be done using objects deriving from something like this (and
|
|
40
|
+
# implementing integer, boolean, string, choices):
|
|
41
|
+
#
|
|
42
|
+
# class EnvVar:
|
|
43
|
+
# """Descriptor for handling attributes
|
|
44
|
+
# associated with environment variables"""
|
|
45
|
+
#
|
|
46
|
+
# def __init__(
|
|
47
|
+
# self, name: str, default: Optional[str] = None,
|
|
48
|
+
# argname: Optional[str] = None
|
|
49
|
+
# ):
|
|
50
|
+
# """
|
|
51
|
+
# Initialize the EnvVar descriptor.
|
|
52
|
+
#
|
|
53
|
+
# Args:
|
|
54
|
+
# name: The name of the associated environment variable.
|
|
55
|
+
# default: The default value for the attribute.
|
|
56
|
+
# argname: The name of the command-line argument (optional).
|
|
57
|
+
# """
|
|
58
|
+
# self.name = name
|
|
59
|
+
# self.default = default
|
|
60
|
+
# self.argname = argname
|
|
61
|
+
#
|
|
62
|
+
# def __get__(self, instance: Optional[object],
|
|
63
|
+
# owner: type) -> Optional[str]:
|
|
64
|
+
# """
|
|
65
|
+
# Get the value of the attribute.
|
|
66
|
+
#
|
|
67
|
+
# Args:
|
|
68
|
+
# instance: The instance of the class.
|
|
69
|
+
# owner: The class that owns the attribute.
|
|
70
|
+
#
|
|
71
|
+
# Returns:
|
|
72
|
+
# The value of the attribute.
|
|
73
|
+
# """
|
|
74
|
+
# if instance is None:
|
|
75
|
+
# return self
|
|
76
|
+
# value = os.environ.get(self.name)
|
|
77
|
+
# if value is None:
|
|
78
|
+
# return self.default
|
|
79
|
+
# return self._envvar_to_value(value)
|
|
80
|
+
#
|
|
81
|
+
# def __set__(self, instance: object, value: Optional[str]) -> None:
|
|
82
|
+
# """
|
|
83
|
+
# Set the value of the attribute.
|
|
84
|
+
#
|
|
85
|
+
# Args:
|
|
86
|
+
# instance: The instance of the class.
|
|
87
|
+
# value: The value to be set.
|
|
88
|
+
# """
|
|
89
|
+
# if value is not None:
|
|
90
|
+
# os.environ[self.name] = self._value_to_envvar(value)
|
|
91
|
+
# elif self.name in os.environ:
|
|
92
|
+
# os.environ.pop(self.name)
|
|
93
|
+
#
|
|
94
|
+
# def __delete__(self, instance: object) -> None:
|
|
95
|
+
# """
|
|
96
|
+
# Delete the attribute and remove the associated environment variable.
|
|
97
|
+
#
|
|
98
|
+
# Args:
|
|
99
|
+
# instance: The instance of the class.
|
|
100
|
+
# """
|
|
101
|
+
# os.environ.pop(self.name, None)
|
|
102
|
+
#
|
|
103
|
+
# def add_argument(self, parser: argparse.ArgumentParser) -> None:
|
|
104
|
+
# """
|
|
105
|
+
# Add the command-line argument to the given ArgumentParser.
|
|
106
|
+
#
|
|
107
|
+
# Args:
|
|
108
|
+
# parser: The ArgumentParser to add the argument to.
|
|
109
|
+
# """
|
|
110
|
+
# parser.add_argument(
|
|
111
|
+
# f"--{self.argname}",
|
|
112
|
+
# default=self.default,
|
|
113
|
+
# help=f"{self.argname} (environment variable: {self.name})",
|
|
114
|
+
# )
|
|
115
|
+
#
|
|
116
|
+
# def _envvar_to_value(self, value: str) -> str:
|
|
117
|
+
# """
|
|
118
|
+
# Convert the environment variable value to the attribute value.
|
|
119
|
+
# This method must be implemented by subclasses.
|
|
120
|
+
# """
|
|
121
|
+
# return value
|
|
122
|
+
#
|
|
123
|
+
# def _value_to_envvar(self, value: str) -> str:
|
|
124
|
+
# """
|
|
125
|
+
# Convert the attribute value to the environment variable value.
|
|
126
|
+
# This method must be implemented by subclasses.
|
|
127
|
+
# """
|
|
128
|
+
# return value
|
|
129
|
+
#
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
class DLExecEnv:
|
|
133
|
+
"""Object representing DataLab test environment"""
|
|
134
|
+
|
|
135
|
+
UNATTENDED_ARG = "unattended"
|
|
136
|
+
ACCEPT_DIALOGS_ARG = "accept_dialogs"
|
|
137
|
+
VERBOSE_ARG = "verbose"
|
|
138
|
+
SCREENSHOT_ARG = "screenshot"
|
|
139
|
+
SCREENSHOT_PATH_ARG = "screenshot_path"
|
|
140
|
+
DELAY_ARG = "delay"
|
|
141
|
+
XMLRPCPORT_ARG = "xmlrpcport"
|
|
142
|
+
DO_NOT_QUIT_ENV = "DATALAB_DO_NOT_QUIT"
|
|
143
|
+
UNATTENDED_ENV = GuiDataExecEnv.UNATTENDED_ENV
|
|
144
|
+
ACCEPT_DIALOGS_ENV = GuiDataExecEnv.ACCEPT_DIALOGS_ENV
|
|
145
|
+
VERBOSE_ENV = GuiDataExecEnv.VERBOSE_ENV
|
|
146
|
+
SCREENSHOT_ENV = GuiDataExecEnv.SCREENSHOT_ENV
|
|
147
|
+
SCREENSHOT_PATH_ENV = GuiDataExecEnv.SCREENSHOT_PATH_ENV
|
|
148
|
+
DELAY_ENV = GuiDataExecEnv.DELAY_ENV
|
|
149
|
+
XMLRPCPORT_ENV = "DATALAB_XMLRPCPORT"
|
|
150
|
+
CATCHER_TEST_ENV = "DATALAB_CATCHER_TEST"
|
|
151
|
+
|
|
152
|
+
def __init__(self):
|
|
153
|
+
self.h5files = None
|
|
154
|
+
self.h5browser_file = None
|
|
155
|
+
self.demo_mode = False
|
|
156
|
+
# Check if "pytest" is in the command line arguments:
|
|
157
|
+
if "pytest" not in sys.argv[0]:
|
|
158
|
+
# Do not parse command line arguments when running tests with pytest
|
|
159
|
+
# (otherwise, pytest arguments are parsed as DataLab arguments)
|
|
160
|
+
self.parse_args()
|
|
161
|
+
if self.unattended: # Do not run this code in production
|
|
162
|
+
# Check that calling `to_dict` do not raise any exception
|
|
163
|
+
self.to_dict()
|
|
164
|
+
|
|
165
|
+
def iterate_over_attrs_envvars(self) -> Generator[tuple[str, str], None, None]:
|
|
166
|
+
"""Iterate over DataLab environment variables
|
|
167
|
+
|
|
168
|
+
Yields:
|
|
169
|
+
A tuple (attribute name, environment variable name)
|
|
170
|
+
"""
|
|
171
|
+
for name in dir(self):
|
|
172
|
+
if name.endswith("_ENV"):
|
|
173
|
+
envvar: str = getattr(self, name)
|
|
174
|
+
attrname = "_".join(name.split("_")[:-1]).lower()
|
|
175
|
+
yield attrname, envvar
|
|
176
|
+
|
|
177
|
+
def to_dict(self):
|
|
178
|
+
"""Return a dictionary representation of the object"""
|
|
179
|
+
# The list of properties match the list of environment variable attribute names,
|
|
180
|
+
# modulo the "_ENV" suffix:
|
|
181
|
+
props = [attrname for attrname, _envvar in self.iterate_over_attrs_envvars()]
|
|
182
|
+
|
|
183
|
+
# Check that all properties are defined in the class and that they are
|
|
184
|
+
# really properties:
|
|
185
|
+
for prop in props:
|
|
186
|
+
assert hasattr(self, prop), (
|
|
187
|
+
f"Property {prop} is not defined in class {self.__class__.__name__}"
|
|
188
|
+
)
|
|
189
|
+
assert isinstance(getattr(self.__class__, prop), property), (
|
|
190
|
+
f"Attribute {prop} is not a property in class {self.__class__.__name__}"
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
# Add complementary properties:
|
|
194
|
+
props += [
|
|
195
|
+
"h5files",
|
|
196
|
+
"h5browser_file",
|
|
197
|
+
"demo_mode",
|
|
198
|
+
]
|
|
199
|
+
|
|
200
|
+
# Return a dictionary with the properties as keys and their values as values:
|
|
201
|
+
return {p: getattr(self, p) for p in props}
|
|
202
|
+
|
|
203
|
+
def __str__(self):
|
|
204
|
+
"""Return a string representation of the object"""
|
|
205
|
+
return pprint.pformat(self.to_dict())
|
|
206
|
+
|
|
207
|
+
def enable_demo_mode(self, delay: int):
|
|
208
|
+
"""Enable demo mode
|
|
209
|
+
|
|
210
|
+
Args:
|
|
211
|
+
delay: Delay (ms) before quitting application in unattended mode
|
|
212
|
+
"""
|
|
213
|
+
self.demo_mode = True
|
|
214
|
+
self.unattended = True
|
|
215
|
+
self.delay = delay
|
|
216
|
+
|
|
217
|
+
def disable_demo_mode(self):
|
|
218
|
+
"""Disable demo mode"""
|
|
219
|
+
self.demo_mode = False
|
|
220
|
+
self.unattended = False
|
|
221
|
+
self.delay = 0
|
|
222
|
+
|
|
223
|
+
@staticmethod
|
|
224
|
+
def __get_mode(env):
|
|
225
|
+
"""Get mode value"""
|
|
226
|
+
env_val = os.environ.get(env)
|
|
227
|
+
if env_val is None:
|
|
228
|
+
return False
|
|
229
|
+
return env_val.lower() in ("1", "true", "yes", "on", "enable", "enabled")
|
|
230
|
+
|
|
231
|
+
@staticmethod
|
|
232
|
+
def __set_mode(env, value):
|
|
233
|
+
"""Set mode value"""
|
|
234
|
+
if env in os.environ:
|
|
235
|
+
os.environ.pop(env)
|
|
236
|
+
if value:
|
|
237
|
+
os.environ[env] = "1"
|
|
238
|
+
|
|
239
|
+
@property
|
|
240
|
+
def do_not_quit(self):
|
|
241
|
+
"""Keep QApplication running (and widgets opened) after test execution,
|
|
242
|
+
even in unattended mode (e.g. useful for testing the remote client API:
|
|
243
|
+
we need to run DataLab in unattended mode [to avoid any user interaction
|
|
244
|
+
during the test] but we also need to keep the QApplication running to
|
|
245
|
+
be able to send commands to the remote client API).
|
|
246
|
+
"""
|
|
247
|
+
return self.__get_mode(self.DO_NOT_QUIT_ENV)
|
|
248
|
+
|
|
249
|
+
@do_not_quit.setter
|
|
250
|
+
def do_not_quit(self, value):
|
|
251
|
+
"""Set do_not_quit value"""
|
|
252
|
+
self.__set_mode(self.DO_NOT_QUIT_ENV, value)
|
|
253
|
+
|
|
254
|
+
@property
|
|
255
|
+
def unattended(self):
|
|
256
|
+
"""Get unattended value"""
|
|
257
|
+
return self.__get_mode(self.UNATTENDED_ENV)
|
|
258
|
+
|
|
259
|
+
@unattended.setter
|
|
260
|
+
def unattended(self, value):
|
|
261
|
+
"""Set unattended value"""
|
|
262
|
+
self.__set_mode(self.UNATTENDED_ENV, value)
|
|
263
|
+
|
|
264
|
+
@property
|
|
265
|
+
def accept_dialogs(self):
|
|
266
|
+
"""Whether to accept dialogs in unattended mode"""
|
|
267
|
+
return self.__get_mode(self.ACCEPT_DIALOGS_ENV)
|
|
268
|
+
|
|
269
|
+
@accept_dialogs.setter
|
|
270
|
+
def accept_dialogs(self, value):
|
|
271
|
+
"""Set whether to accept dialogs in unattended mode"""
|
|
272
|
+
self.__set_mode(self.ACCEPT_DIALOGS_ENV, value)
|
|
273
|
+
|
|
274
|
+
@property
|
|
275
|
+
def catcher_test(self):
|
|
276
|
+
"""Get catcher_test value"""
|
|
277
|
+
return self.__get_mode(self.CATCHER_TEST_ENV)
|
|
278
|
+
|
|
279
|
+
@catcher_test.setter
|
|
280
|
+
def catcher_test(self, value):
|
|
281
|
+
"""Set catcher_test value"""
|
|
282
|
+
self.__set_mode(self.CATCHER_TEST_ENV, value)
|
|
283
|
+
|
|
284
|
+
@property
|
|
285
|
+
def screenshot(self):
|
|
286
|
+
"""Get screenshot value"""
|
|
287
|
+
return self.__get_mode(self.SCREENSHOT_ENV)
|
|
288
|
+
|
|
289
|
+
@screenshot.setter
|
|
290
|
+
def screenshot(self, value):
|
|
291
|
+
"""Set screenshot value"""
|
|
292
|
+
self.__set_mode(self.SCREENSHOT_ENV, value)
|
|
293
|
+
|
|
294
|
+
@property
|
|
295
|
+
def screenshot_path(self):
|
|
296
|
+
"""Get screenshot path"""
|
|
297
|
+
return os.environ.get(self.SCREENSHOT_PATH_ENV, "")
|
|
298
|
+
|
|
299
|
+
@screenshot_path.setter
|
|
300
|
+
def screenshot_path(self, value):
|
|
301
|
+
"""Set screenshot path"""
|
|
302
|
+
if value:
|
|
303
|
+
os.environ[self.SCREENSHOT_PATH_ENV] = str(value)
|
|
304
|
+
elif self.SCREENSHOT_PATH_ENV in os.environ:
|
|
305
|
+
os.environ.pop(self.SCREENSHOT_PATH_ENV)
|
|
306
|
+
|
|
307
|
+
@property
|
|
308
|
+
def verbose(self):
|
|
309
|
+
"""Get verbosity level"""
|
|
310
|
+
env_val = os.environ.get(self.VERBOSE_ENV)
|
|
311
|
+
if env_val in (None, ""):
|
|
312
|
+
return VerbosityLevels.NORMAL.value
|
|
313
|
+
return env_val.lower()
|
|
314
|
+
|
|
315
|
+
@verbose.setter
|
|
316
|
+
def verbose(self, value):
|
|
317
|
+
"""Set verbosity level"""
|
|
318
|
+
os.environ[self.VERBOSE_ENV] = value
|
|
319
|
+
|
|
320
|
+
@property
|
|
321
|
+
def delay(self):
|
|
322
|
+
"""Delay (ms) before quitting application in unattended mode"""
|
|
323
|
+
try:
|
|
324
|
+
return int(os.environ.get(self.DELAY_ENV))
|
|
325
|
+
except (TypeError, ValueError):
|
|
326
|
+
return 0
|
|
327
|
+
|
|
328
|
+
@delay.setter
|
|
329
|
+
def delay(self, value: int):
|
|
330
|
+
"""Set delay (ms) before quitting application in unattended mode"""
|
|
331
|
+
os.environ[self.DELAY_ENV] = str(value)
|
|
332
|
+
|
|
333
|
+
@property
|
|
334
|
+
def xmlrpcport(self):
|
|
335
|
+
"""XML-RPC port number"""
|
|
336
|
+
try:
|
|
337
|
+
return int(os.environ.get(self.XMLRPCPORT_ENV))
|
|
338
|
+
except (TypeError, ValueError):
|
|
339
|
+
return None
|
|
340
|
+
|
|
341
|
+
@xmlrpcport.setter
|
|
342
|
+
def xmlrpcport(self, value: int):
|
|
343
|
+
"""Set XML-RPC port number"""
|
|
344
|
+
os.environ[self.XMLRPCPORT_ENV] = str(value)
|
|
345
|
+
|
|
346
|
+
def parse_args(self):
|
|
347
|
+
"""Parse command line arguments"""
|
|
348
|
+
# <!> WARNING <!>
|
|
349
|
+
# Do not add an option '-c' to avoid any conflict with macro command
|
|
350
|
+
# execution mecanism used with DataLab standalone version (see start.pyw)
|
|
351
|
+
|
|
352
|
+
parser = argparse.ArgumentParser(description="Run DataLab")
|
|
353
|
+
parser.add_argument(
|
|
354
|
+
"h5",
|
|
355
|
+
nargs="?",
|
|
356
|
+
type=str,
|
|
357
|
+
help="HDF5 file names (separated by ';'), "
|
|
358
|
+
"optionally with dataset name (separated by ',')",
|
|
359
|
+
)
|
|
360
|
+
parser.add_argument(
|
|
361
|
+
"-b",
|
|
362
|
+
"--h5browser",
|
|
363
|
+
required=False,
|
|
364
|
+
type=str,
|
|
365
|
+
metavar="path",
|
|
366
|
+
help="path to open with HDF5 browser",
|
|
367
|
+
)
|
|
368
|
+
parser.add_argument(
|
|
369
|
+
"-v", "--version", action="store_true", help="show DataLab version"
|
|
370
|
+
)
|
|
371
|
+
parser.add_argument(
|
|
372
|
+
"--reset", action="store_true", help="reset DataLab configuration"
|
|
373
|
+
)
|
|
374
|
+
parser.add_argument(
|
|
375
|
+
"--" + self.UNATTENDED_ARG,
|
|
376
|
+
action="store_true",
|
|
377
|
+
help="non-interactive mode",
|
|
378
|
+
default=None,
|
|
379
|
+
)
|
|
380
|
+
parser.add_argument(
|
|
381
|
+
"--" + self.ACCEPT_DIALOGS_ARG,
|
|
382
|
+
action="store_true",
|
|
383
|
+
help="accept dialogs in unattended mode",
|
|
384
|
+
default=None,
|
|
385
|
+
)
|
|
386
|
+
parser.add_argument(
|
|
387
|
+
"--" + self.SCREENSHOT_ARG,
|
|
388
|
+
action="store_true",
|
|
389
|
+
help="automatic screenshots",
|
|
390
|
+
default=None,
|
|
391
|
+
)
|
|
392
|
+
parser.add_argument(
|
|
393
|
+
"--" + self.SCREENSHOT_PATH_ARG,
|
|
394
|
+
type=str,
|
|
395
|
+
help="path to save screenshots",
|
|
396
|
+
default=None,
|
|
397
|
+
)
|
|
398
|
+
parser.add_argument(
|
|
399
|
+
"--" + self.DELAY_ARG,
|
|
400
|
+
type=int,
|
|
401
|
+
default=None,
|
|
402
|
+
help="delay (ms) before quitting application in unattended mode",
|
|
403
|
+
)
|
|
404
|
+
parser.add_argument(
|
|
405
|
+
"--" + self.XMLRPCPORT_ARG,
|
|
406
|
+
type=int,
|
|
407
|
+
default=None,
|
|
408
|
+
help="XML-RPC port number",
|
|
409
|
+
)
|
|
410
|
+
parser.add_argument(
|
|
411
|
+
"--" + self.VERBOSE_ARG,
|
|
412
|
+
choices=[lvl.value for lvl in VerbosityLevels],
|
|
413
|
+
required=False,
|
|
414
|
+
default=None,
|
|
415
|
+
help="verbosity level: for debugging/testing purpose",
|
|
416
|
+
)
|
|
417
|
+
args, _unknown = parser.parse_known_args()
|
|
418
|
+
if args.h5:
|
|
419
|
+
self.h5files = args.h5.split(";")
|
|
420
|
+
if args.h5browser:
|
|
421
|
+
self.h5browser_file = args.h5browser
|
|
422
|
+
if args.version:
|
|
423
|
+
version = os.environ["DATALAB_VERSION"]
|
|
424
|
+
print(f"DataLab {version} on {platform.system()}")
|
|
425
|
+
sys.exit()
|
|
426
|
+
if args.reset: # Remove ".DataLab" configuration directory
|
|
427
|
+
# pylint: disable=import-outside-toplevel
|
|
428
|
+
from datalab.config import Conf
|
|
429
|
+
|
|
430
|
+
print("Resetting DataLab configuration...", end=" ")
|
|
431
|
+
try:
|
|
432
|
+
Conf.reset()
|
|
433
|
+
except Exception: # pylint: disable=broad-except
|
|
434
|
+
print("Failed.")
|
|
435
|
+
traceback.print_exc()
|
|
436
|
+
finally:
|
|
437
|
+
print("Done.")
|
|
438
|
+
sys.exit()
|
|
439
|
+
self.set_env_from_args(args)
|
|
440
|
+
|
|
441
|
+
def set_env_from_args(self, args):
|
|
442
|
+
"""Set appropriate environment variables"""
|
|
443
|
+
for argname in (
|
|
444
|
+
self.UNATTENDED_ARG,
|
|
445
|
+
self.ACCEPT_DIALOGS_ARG,
|
|
446
|
+
self.SCREENSHOT_ARG,
|
|
447
|
+
self.SCREENSHOT_PATH_ARG,
|
|
448
|
+
self.VERBOSE_ARG,
|
|
449
|
+
self.DELAY_ARG,
|
|
450
|
+
self.XMLRPCPORT_ARG,
|
|
451
|
+
):
|
|
452
|
+
argvalue = getattr(args, argname)
|
|
453
|
+
if argvalue is not None:
|
|
454
|
+
setattr(self, argname, argvalue)
|
|
455
|
+
|
|
456
|
+
def log(self, source: Any, *objects: Any) -> None:
|
|
457
|
+
"""Log text on screen
|
|
458
|
+
|
|
459
|
+
Args:
|
|
460
|
+
source: object from which the log is issued
|
|
461
|
+
*objects: objects to log
|
|
462
|
+
"""
|
|
463
|
+
if DEBUG or self.verbose == VerbosityLevels.DEBUG.value:
|
|
464
|
+
print(str(source) + ":", *objects)
|
|
465
|
+
# TODO: [P4] Eventually, log in a file (optionally)
|
|
466
|
+
|
|
467
|
+
def print(self, *objects, sep=" ", end="\n", file=sys.stdout, flush=False):
|
|
468
|
+
"""Print in file, depending on verbosity level"""
|
|
469
|
+
if self.verbose != VerbosityLevels.QUIET.value or DEBUG:
|
|
470
|
+
print(*objects, sep=sep, end=end, file=file, flush=flush)
|
|
471
|
+
|
|
472
|
+
def pprint(
|
|
473
|
+
self,
|
|
474
|
+
obj,
|
|
475
|
+
stream=None,
|
|
476
|
+
indent=1,
|
|
477
|
+
width=80,
|
|
478
|
+
depth=None,
|
|
479
|
+
compact=False,
|
|
480
|
+
sort_dicts=True,
|
|
481
|
+
):
|
|
482
|
+
"""Pretty-print in stream, depending on verbosity level"""
|
|
483
|
+
if self.verbose != VerbosityLevels.QUIET.value or DEBUG:
|
|
484
|
+
pprint.pprint(
|
|
485
|
+
obj,
|
|
486
|
+
stream=stream,
|
|
487
|
+
indent=indent,
|
|
488
|
+
width=width,
|
|
489
|
+
depth=depth,
|
|
490
|
+
compact=compact,
|
|
491
|
+
sort_dicts=sort_dicts,
|
|
492
|
+
)
|
|
493
|
+
|
|
494
|
+
@contextmanager
|
|
495
|
+
def context(
|
|
496
|
+
self,
|
|
497
|
+
unattended=None,
|
|
498
|
+
accept_dialogs=None,
|
|
499
|
+
screenshot=None,
|
|
500
|
+
delay=None,
|
|
501
|
+
verbose=None,
|
|
502
|
+
xmlrpcport=None,
|
|
503
|
+
catcher_test=None,
|
|
504
|
+
) -> Generator[None, None, None]:
|
|
505
|
+
"""Return a context manager that sets some execenv properties at enter,
|
|
506
|
+
and restores them at exit. This is useful to run some code in a
|
|
507
|
+
controlled environment, for example to accept dialogs in unattended
|
|
508
|
+
mode, and restore the previous value at exit.
|
|
509
|
+
|
|
510
|
+
Args:
|
|
511
|
+
unattended: whether to run in unattended mode
|
|
512
|
+
accept_dialogs: whether to accept dialogs in unattended mode
|
|
513
|
+
screenshot: whether to take screenshots
|
|
514
|
+
delay: delay (ms) before quitting application in unattended mode
|
|
515
|
+
verbose: verbosity level
|
|
516
|
+
xmlrpcport: XML-RPC port number
|
|
517
|
+
catcher_test: whether to run catcher test
|
|
518
|
+
|
|
519
|
+
.. note::
|
|
520
|
+
If a passed value is None, the corresponding property is not changed.
|
|
521
|
+
"""
|
|
522
|
+
old_values = self.to_dict()
|
|
523
|
+
new_values = {
|
|
524
|
+
"unattended": unattended,
|
|
525
|
+
"accept_dialogs": accept_dialogs,
|
|
526
|
+
"screenshot": screenshot,
|
|
527
|
+
"delay": delay,
|
|
528
|
+
"verbose": verbose,
|
|
529
|
+
"xmlrpcport": xmlrpcport,
|
|
530
|
+
"catcher_test": catcher_test,
|
|
531
|
+
}
|
|
532
|
+
for key, value in new_values.items():
|
|
533
|
+
if value is not None:
|
|
534
|
+
setattr(self, key, value)
|
|
535
|
+
try:
|
|
536
|
+
yield
|
|
537
|
+
finally:
|
|
538
|
+
for key, value in old_values.items():
|
|
539
|
+
setattr(self, key, value)
|
|
540
|
+
|
|
541
|
+
|
|
542
|
+
execenv = DLExecEnv()
|
datalab/gui/__init__.py
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Copyright (c) DataLab Platform Developers, BSD 3-Clause license, see LICENSE file.
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
GUI
|
|
5
|
+
===
|
|
6
|
+
|
|
7
|
+
The :mod:`datalab.gui` package contains functionnalities related to the graphical
|
|
8
|
+
user interface (GUI) of the DataLab project. Those features are mostly specific
|
|
9
|
+
to DataLab and are not intended to be used independently.
|
|
10
|
+
|
|
11
|
+
The purpose of this section of the documentation is to provide an overview of the
|
|
12
|
+
DataLab GUI architecture and to describe the main features of the modules contained
|
|
13
|
+
in this package. It is not intended to provide a detailed description of the GUI
|
|
14
|
+
features, but rather to provide a starting point for the reader who wants to
|
|
15
|
+
understand the DataLab internal architecture.
|
|
16
|
+
|
|
17
|
+
DataLab's main window is composed of several parts, each of them being handled by a
|
|
18
|
+
specific module of this package:
|
|
19
|
+
|
|
20
|
+
- **Signal and image panels**: those panels are used to display signals and images
|
|
21
|
+
and to provide a set of tools to manipulate them. Each data panel relies on a set
|
|
22
|
+
of modules to handle the GUI features (:mod:`datalab.gui.actionhandler` and
|
|
23
|
+
:mod:`datalab.gui.objectview`), the data model (:mod:`datalab.gui.objectmodel`),
|
|
24
|
+
the data visualization (:mod:`datalab.gui.plothandler`),
|
|
25
|
+
and the data processing (:mod:`datalab.gui.processor`).
|
|
26
|
+
|
|
27
|
+
- **Macro panel**: this panel is used to display and run macros. It relies on the
|
|
28
|
+
:mod:`datalab.gui.macroeditor` module to handle the macro edition and execution.
|
|
29
|
+
|
|
30
|
+
- **Specialized widgets**: those widgets are used to handle specific features such as
|
|
31
|
+
ROI edition (:mod:`datalab.gui.roieditor`),
|
|
32
|
+
Intensity profile edition (:mod:`datalab.gui.profiledialog`), etc.
|
|
33
|
+
|
|
34
|
+
.. list-table::
|
|
35
|
+
:header-rows: 1
|
|
36
|
+
:align: left
|
|
37
|
+
|
|
38
|
+
* - Submodule
|
|
39
|
+
- Purpose
|
|
40
|
+
|
|
41
|
+
* - :mod:`datalab.gui.main`
|
|
42
|
+
- DataLab main window and application
|
|
43
|
+
|
|
44
|
+
* - :mod:`datalab.gui.panel`
|
|
45
|
+
- Signal, image and macro panels
|
|
46
|
+
|
|
47
|
+
* - :mod:`datalab.gui.actionhandler`
|
|
48
|
+
- Application actions (menus, toolbars, context menu)
|
|
49
|
+
|
|
50
|
+
* - :mod:`datalab.gui.objectview`
|
|
51
|
+
- Widgets to display object (signal/image) trees
|
|
52
|
+
|
|
53
|
+
* - :mod:`datalab.gui.plothandler`
|
|
54
|
+
- `PlotPy` plot items for representing signals and images
|
|
55
|
+
|
|
56
|
+
* - :mod:`datalab.gui.roieditor`
|
|
57
|
+
- ROI editor
|
|
58
|
+
|
|
59
|
+
* - :mod:`datalab.gui.processor`
|
|
60
|
+
- Processor
|
|
61
|
+
|
|
62
|
+
* - :mod:`datalab.gui.docks`
|
|
63
|
+
- Dock widgets
|
|
64
|
+
|
|
65
|
+
* - :mod:`datalab.gui.h5io`
|
|
66
|
+
- HDF5 input/output
|
|
67
|
+
|
|
68
|
+
"""
|
|
69
|
+
|
|
70
|
+
import abc
|
|
71
|
+
|
|
72
|
+
from guidata.io import BaseIOHandler
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
class ObjItf(abc.ABC):
|
|
76
|
+
"""Interface for objects handled by panels"""
|
|
77
|
+
|
|
78
|
+
@property
|
|
79
|
+
@abc.abstractmethod
|
|
80
|
+
def title(self) -> str:
|
|
81
|
+
"""Object title"""
|
|
82
|
+
|
|
83
|
+
@abc.abstractmethod
|
|
84
|
+
def serialize(self, writer: BaseIOHandler):
|
|
85
|
+
"""Serialize this object"""
|
|
86
|
+
|
|
87
|
+
@abc.abstractmethod
|
|
88
|
+
def deserialize(self, reader: BaseIOHandler):
|
|
89
|
+
"""Deserialize this object"""
|