datalab-platform 0.0.1.dev0__py3-none-any.whl → 1.0.0__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.0.dist-info/METADATA +121 -0
- datalab_platform-1.0.0.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.0.dist-info}/WHEEL +0 -0
- {datalab_platform-0.0.1.dev0.dist-info → datalab_platform-1.0.0.dist-info}/entry_points.txt +0 -0
- {datalab_platform-0.0.1.dev0.dist-info → datalab_platform-1.0.0.dist-info}/licenses/LICENSE +0 -0
- {datalab_platform-0.0.1.dev0.dist-info → datalab_platform-1.0.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
# Copyright (c) DataLab Platform Developers, BSD 3-Clause license, see LICENSE file.
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Macro editor
|
|
5
|
+
============
|
|
6
|
+
|
|
7
|
+
The :mod:`datalab.gui.macroeditor` module provides the macro editor widget for DataLab.
|
|
8
|
+
|
|
9
|
+
.. autoclass:: Macro
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import abc
|
|
15
|
+
import os
|
|
16
|
+
import os.path as osp
|
|
17
|
+
import re
|
|
18
|
+
import sys
|
|
19
|
+
import time
|
|
20
|
+
|
|
21
|
+
from guidata.io import BaseIOHandler
|
|
22
|
+
from guidata.utils.misc import to_string
|
|
23
|
+
from guidata.widgets.codeeditor import CodeEditor
|
|
24
|
+
from guidata.widgets.console.shell import PythonShellWidget
|
|
25
|
+
from qtpy import QtCore as QC
|
|
26
|
+
from qtpy import QtWidgets as QW
|
|
27
|
+
|
|
28
|
+
import datalab
|
|
29
|
+
from datalab.config import _
|
|
30
|
+
from datalab.env import execenv
|
|
31
|
+
from datalab.gui import ObjItf
|
|
32
|
+
|
|
33
|
+
UNTITLED_NB = 0
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class MacroMeta(type(QC.QObject), abc.ABCMeta):
|
|
37
|
+
"""Mixed metaclass to avoid conflicts"""
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class Macro(QC.QObject, ObjItf, metaclass=MacroMeta):
|
|
41
|
+
"""Object representing a macro: editor, path, open/save actions, etc.
|
|
42
|
+
|
|
43
|
+
Args:
|
|
44
|
+
console: Python shell widget
|
|
45
|
+
name: Macro name. Defaults to None.
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
PREFIX = "m"
|
|
49
|
+
|
|
50
|
+
STARTED = QC.Signal()
|
|
51
|
+
FINISHED = QC.Signal()
|
|
52
|
+
MODIFIED = QC.Signal()
|
|
53
|
+
FILE_HEADER = os.linesep.join(
|
|
54
|
+
[
|
|
55
|
+
"# -*- coding: utf-8 -*-",
|
|
56
|
+
"",
|
|
57
|
+
'''"""
|
|
58
|
+
DataLab Macro: "%s"
|
|
59
|
+
-------------
|
|
60
|
+
|
|
61
|
+
This file is a DataLab macro. It can be executed from DataLab's Macro Panel, or
|
|
62
|
+
from any Python environment, provided that the ``datalab`` package is installed.
|
|
63
|
+
|
|
64
|
+
Please do not modify this file header. It is used to identify the file as a
|
|
65
|
+
DataLab macro, and to store the macro's title.
|
|
66
|
+
"""''',
|
|
67
|
+
"",
|
|
68
|
+
"",
|
|
69
|
+
]
|
|
70
|
+
)
|
|
71
|
+
MACRO_TITLE = _("Macro simple example")
|
|
72
|
+
MACRO_SAMPLE = f"""# {MACRO_TITLE}
|
|
73
|
+
|
|
74
|
+
import numpy as np
|
|
75
|
+
|
|
76
|
+
from datalab.control.proxy import RemoteProxy
|
|
77
|
+
|
|
78
|
+
proxy = RemoteProxy()
|
|
79
|
+
|
|
80
|
+
z = np.random.rand(20, 20)
|
|
81
|
+
proxy.add_image("toto", z)
|
|
82
|
+
proxy.calc("fft")
|
|
83
|
+
|
|
84
|
+
print("All done!")
|
|
85
|
+
"""
|
|
86
|
+
|
|
87
|
+
def __init__(self, console: PythonShellWidget, title: str | None = None) -> None:
|
|
88
|
+
super().__init__()
|
|
89
|
+
self.console = console
|
|
90
|
+
self.title = self.get_untitled_title() if title is None else title
|
|
91
|
+
self.editor = CodeEditor(language="python")
|
|
92
|
+
self.editor.setLineWrapMode(QW.QPlainTextEdit.NoWrap)
|
|
93
|
+
self.set_code(self.MACRO_SAMPLE)
|
|
94
|
+
self.editor.modificationChanged.connect(self.modification_changed)
|
|
95
|
+
self.process = None
|
|
96
|
+
|
|
97
|
+
@property
|
|
98
|
+
def title(self) -> str:
|
|
99
|
+
"""Return object title"""
|
|
100
|
+
return self.objectName()
|
|
101
|
+
|
|
102
|
+
@title.setter
|
|
103
|
+
def title(self, title: str) -> None:
|
|
104
|
+
"""Set object title"""
|
|
105
|
+
self.setObjectName(title)
|
|
106
|
+
|
|
107
|
+
def get_code(self) -> str:
|
|
108
|
+
"""Return code to be executed"""
|
|
109
|
+
text = self.editor.toPlainText()
|
|
110
|
+
return os.linesep.join(text.splitlines(False))
|
|
111
|
+
|
|
112
|
+
def set_code(self, code: str) -> None:
|
|
113
|
+
"""Set code to be executed
|
|
114
|
+
|
|
115
|
+
Args:
|
|
116
|
+
code: Code to be executed
|
|
117
|
+
"""
|
|
118
|
+
self.editor.setPlainText(code)
|
|
119
|
+
|
|
120
|
+
def serialize(self, writer: BaseIOHandler) -> None:
|
|
121
|
+
"""Serialize this macro
|
|
122
|
+
|
|
123
|
+
Args:
|
|
124
|
+
writer: Writer
|
|
125
|
+
"""
|
|
126
|
+
with writer.group("title"):
|
|
127
|
+
writer.write(self.title)
|
|
128
|
+
with writer.group("contents"):
|
|
129
|
+
writer.write(self.get_code())
|
|
130
|
+
|
|
131
|
+
def deserialize(self, reader: BaseIOHandler) -> None:
|
|
132
|
+
"""Deserialize this macro
|
|
133
|
+
|
|
134
|
+
Args:
|
|
135
|
+
reader: Reader
|
|
136
|
+
"""
|
|
137
|
+
with reader.group("title"):
|
|
138
|
+
self.title = reader.read_any()
|
|
139
|
+
with reader.group("contents"):
|
|
140
|
+
self.set_code(reader.read_any())
|
|
141
|
+
|
|
142
|
+
def to_file(self, filename: str) -> None:
|
|
143
|
+
"""Save macro to file
|
|
144
|
+
|
|
145
|
+
Args:
|
|
146
|
+
filename: File name
|
|
147
|
+
"""
|
|
148
|
+
code = self.FILE_HEADER % self.title + self.get_code()
|
|
149
|
+
with open(filename, "wb") as fdesc:
|
|
150
|
+
fdesc.write(code.encode("utf-8"))
|
|
151
|
+
|
|
152
|
+
def from_file(self, filename: str) -> None:
|
|
153
|
+
"""Load macro from file
|
|
154
|
+
|
|
155
|
+
Args:
|
|
156
|
+
filename: File name
|
|
157
|
+
"""
|
|
158
|
+
with open(filename, "rb") as fdesc:
|
|
159
|
+
code = to_string(fdesc.read()).strip()
|
|
160
|
+
|
|
161
|
+
# Retrieve title from header:
|
|
162
|
+
lines = code.splitlines()
|
|
163
|
+
for line in lines:
|
|
164
|
+
# Match a line exactly like 'DataLab Macro: "Macro title"':
|
|
165
|
+
if re.match(r"DataLab Macro: \".*\"", line):
|
|
166
|
+
self.title = line.split('"')[1]
|
|
167
|
+
break
|
|
168
|
+
else:
|
|
169
|
+
self.title = osp.basename(filename)
|
|
170
|
+
|
|
171
|
+
# Remove header:
|
|
172
|
+
header = (self.FILE_HEADER % self.title).strip()
|
|
173
|
+
if code.startswith(header):
|
|
174
|
+
code = code[len(header) :].strip()
|
|
175
|
+
|
|
176
|
+
# Set code:
|
|
177
|
+
self.set_code(code)
|
|
178
|
+
|
|
179
|
+
@staticmethod
|
|
180
|
+
def get_untitled_title() -> str:
|
|
181
|
+
"""Increment untitled number and return untitled macro title
|
|
182
|
+
|
|
183
|
+
Returns:
|
|
184
|
+
Untitled macro title
|
|
185
|
+
"""
|
|
186
|
+
global UNTITLED_NB # pylint: disable=global-statement
|
|
187
|
+
UNTITLED_NB += 1
|
|
188
|
+
untitled = _("Untitled")
|
|
189
|
+
return f"{untitled} {UNTITLED_NB:02d}"
|
|
190
|
+
|
|
191
|
+
def modification_changed(self, state: bool) -> None:
|
|
192
|
+
"""Method called when macro's editor modification state changed
|
|
193
|
+
|
|
194
|
+
Args:
|
|
195
|
+
state: Modification state
|
|
196
|
+
"""
|
|
197
|
+
if state:
|
|
198
|
+
self.MODIFIED.emit()
|
|
199
|
+
|
|
200
|
+
@staticmethod
|
|
201
|
+
def transcode(bytearr: QC.QByteArray) -> str:
|
|
202
|
+
"""Transcode bytes to locale str
|
|
203
|
+
|
|
204
|
+
Args:
|
|
205
|
+
bytearr: Byte array
|
|
206
|
+
|
|
207
|
+
Returns:
|
|
208
|
+
Locale str
|
|
209
|
+
"""
|
|
210
|
+
locale_codec = QC.QTextCodec.codecForLocale()
|
|
211
|
+
return locale_codec.toUnicode(bytearr.data())
|
|
212
|
+
|
|
213
|
+
def get_stdout(self) -> str:
|
|
214
|
+
"""Return standard output str
|
|
215
|
+
|
|
216
|
+
Returns:
|
|
217
|
+
Standard output str
|
|
218
|
+
"""
|
|
219
|
+
self.process.setReadChannel(QC.QProcess.StandardOutput)
|
|
220
|
+
bytearr = QC.QByteArray()
|
|
221
|
+
while self.process.bytesAvailable():
|
|
222
|
+
bytearr += self.process.readAllStandardOutput()
|
|
223
|
+
return self.transcode(bytearr)
|
|
224
|
+
|
|
225
|
+
def get_stderr(self) -> str:
|
|
226
|
+
"""Return standard error str
|
|
227
|
+
|
|
228
|
+
Returns:
|
|
229
|
+
Standard error str
|
|
230
|
+
"""
|
|
231
|
+
self.process.setReadChannel(QC.QProcess.StandardError)
|
|
232
|
+
bytearr = QC.QByteArray()
|
|
233
|
+
while self.process.bytesAvailable():
|
|
234
|
+
bytearr += self.process.readAllStandardError()
|
|
235
|
+
return self.transcode(bytearr)
|
|
236
|
+
|
|
237
|
+
def write_output(self) -> None:
|
|
238
|
+
"""Write text as standard output"""
|
|
239
|
+
self.console.write(self.get_stdout())
|
|
240
|
+
|
|
241
|
+
def write_error(self) -> None:
|
|
242
|
+
"""Write text as standard error"""
|
|
243
|
+
self.console.write_error(self.get_stderr())
|
|
244
|
+
|
|
245
|
+
def print(self, text, error=False, eol_before=True) -> None:
|
|
246
|
+
"""Print text in console, with line separator
|
|
247
|
+
|
|
248
|
+
Args:
|
|
249
|
+
text: Text to be printed
|
|
250
|
+
error: Print as error. Defaults to False.
|
|
251
|
+
"""
|
|
252
|
+
msg = f"---({time.ctime()})---[{text}]{os.linesep}"
|
|
253
|
+
if eol_before:
|
|
254
|
+
msg = os.linesep + msg
|
|
255
|
+
self.console.write(msg, error=error, prompt=not error)
|
|
256
|
+
|
|
257
|
+
def run(self) -> None:
|
|
258
|
+
"""Run macro"""
|
|
259
|
+
self.process = QC.QProcess()
|
|
260
|
+
code = self.get_code().replace('"', "'")
|
|
261
|
+
datalab_path = osp.abspath(osp.join(osp.dirname(datalab.__file__), os.pardir))
|
|
262
|
+
code = f"import sys; sys.path.append(r'{datalab_path}'){os.linesep}{code}"
|
|
263
|
+
env = QC.QProcessEnvironment()
|
|
264
|
+
env.insert(execenv.XMLRPCPORT_ENV, str(execenv.xmlrpcport))
|
|
265
|
+
sysenv = env.systemEnvironment()
|
|
266
|
+
for key in sysenv.keys():
|
|
267
|
+
env.insert(key, sysenv.value(key))
|
|
268
|
+
self.process.readyReadStandardOutput.connect(self.write_output)
|
|
269
|
+
self.process.readyReadStandardError.connect(self.write_error)
|
|
270
|
+
self.process.finished.connect(self.finished)
|
|
271
|
+
self.process.setProcessEnvironment(env)
|
|
272
|
+
args = ["-c", code]
|
|
273
|
+
self.process.start(sys.executable, args)
|
|
274
|
+
running = self.process.waitForStarted(3000)
|
|
275
|
+
if not running:
|
|
276
|
+
self.print(_("# ==> Unable to run '%s' macro") % self.title, error=True)
|
|
277
|
+
QW.QMessageBox.critical(
|
|
278
|
+
self, _("Error"), _("Macro Python interpreter failed to start!")
|
|
279
|
+
)
|
|
280
|
+
else:
|
|
281
|
+
self.print(_("# ==> Running '%s' macro...") % self.title)
|
|
282
|
+
self.STARTED.emit()
|
|
283
|
+
|
|
284
|
+
def is_running(self) -> bool:
|
|
285
|
+
"""Is macro running?
|
|
286
|
+
|
|
287
|
+
Returns:
|
|
288
|
+
True if macro is running
|
|
289
|
+
"""
|
|
290
|
+
if self.process is not None:
|
|
291
|
+
return self.process.state() == QC.QProcess.Running
|
|
292
|
+
return False
|
|
293
|
+
|
|
294
|
+
def kill(self) -> None:
|
|
295
|
+
"""Kill process associated to macro"""
|
|
296
|
+
if self.process is not None:
|
|
297
|
+
self.print(_("Terminating '%s' macro") % self.title, error=True)
|
|
298
|
+
self.process.kill()
|
|
299
|
+
|
|
300
|
+
# pylint: disable=unused-argument
|
|
301
|
+
def finished(self, exit_code: int, exit_status: QC.QProcess.ExitStatus) -> None:
|
|
302
|
+
"""Process has finished
|
|
303
|
+
|
|
304
|
+
Args:
|
|
305
|
+
exit_code: Exit code
|
|
306
|
+
exit_status: Exit status
|
|
307
|
+
"""
|
|
308
|
+
self.print(_("# <== '%s' macro has finished") % self.title, eol_before=False)
|
|
309
|
+
self.FINISHED.emit()
|
|
310
|
+
self.process = None
|