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.
Files changed (496) hide show
  1. datalab/__init__.py +35 -2
  2. datalab/adapters_metadata/__init__.py +31 -0
  3. datalab/adapters_metadata/base_adapter.py +316 -0
  4. datalab/adapters_metadata/common.py +422 -0
  5. datalab/adapters_metadata/geometry_adapter.py +98 -0
  6. datalab/adapters_metadata/table_adapter.py +84 -0
  7. datalab/adapters_plotpy/__init__.py +54 -0
  8. datalab/adapters_plotpy/annotations.py +124 -0
  9. datalab/adapters_plotpy/base.py +110 -0
  10. datalab/adapters_plotpy/converters.py +86 -0
  11. datalab/adapters_plotpy/factories.py +80 -0
  12. datalab/adapters_plotpy/objects/__init__.py +0 -0
  13. datalab/adapters_plotpy/objects/base.py +197 -0
  14. datalab/adapters_plotpy/objects/image.py +157 -0
  15. datalab/adapters_plotpy/objects/scalar.py +565 -0
  16. datalab/adapters_plotpy/objects/signal.py +264 -0
  17. datalab/adapters_plotpy/roi/__init__.py +0 -0
  18. datalab/adapters_plotpy/roi/base.py +146 -0
  19. datalab/adapters_plotpy/roi/factory.py +93 -0
  20. datalab/adapters_plotpy/roi/image.py +207 -0
  21. datalab/adapters_plotpy/roi/signal.py +72 -0
  22. datalab/app.py +98 -0
  23. datalab/config.py +817 -0
  24. datalab/control/__init__.py +0 -0
  25. datalab/control/baseproxy.py +776 -0
  26. datalab/control/proxy.py +343 -0
  27. datalab/control/remote.py +1005 -0
  28. datalab/data/doc/DataLab_en.pdf +0 -0
  29. datalab/data/doc/DataLab_fr.pdf +0 -0
  30. datalab/data/icons/analysis/delete_results.svg +109 -0
  31. datalab/data/icons/analysis/fw1e2.svg +156 -0
  32. datalab/data/icons/analysis/fwhm.svg +156 -0
  33. datalab/data/icons/analysis/histogram.svg +49 -0
  34. datalab/data/icons/analysis/peak_detect.svg +160 -0
  35. datalab/data/icons/analysis/plot_results.svg +151 -0
  36. datalab/data/icons/analysis/show_results.svg +83 -0
  37. datalab/data/icons/analysis/stats.svg +49 -0
  38. datalab/data/icons/analysis.svg +120 -0
  39. datalab/data/icons/apply.svg +3 -0
  40. datalab/data/icons/check_all.svg +15 -0
  41. datalab/data/icons/collapse.svg +44 -0
  42. datalab/data/icons/collapse_selection.svg +63 -0
  43. datalab/data/icons/console.svg +101 -0
  44. datalab/data/icons/create/1d-normal.svg +8 -0
  45. datalab/data/icons/create/1d-poisson.svg +9 -0
  46. datalab/data/icons/create/1d-uniform.svg +8 -0
  47. datalab/data/icons/create/1d-zero.svg +57 -0
  48. datalab/data/icons/create/2d-gaussian.svg +56 -0
  49. datalab/data/icons/create/2d-normal.svg +38 -0
  50. datalab/data/icons/create/2d-poisson.svg +38 -0
  51. datalab/data/icons/create/2d-ramp.svg +90 -0
  52. datalab/data/icons/create/2d-sinc.svg +62 -0
  53. datalab/data/icons/create/2d-uniform.svg +38 -0
  54. datalab/data/icons/create/2d-zero.svg +13 -0
  55. datalab/data/icons/create/checkerboard.svg +39 -0
  56. datalab/data/icons/create/cosine.svg +12 -0
  57. datalab/data/icons/create/exponential.svg +55 -0
  58. datalab/data/icons/create/gaussian.svg +12 -0
  59. datalab/data/icons/create/grating.svg +29 -0
  60. datalab/data/icons/create/linear_chirp.svg +7 -0
  61. datalab/data/icons/create/logistic.svg +7 -0
  62. datalab/data/icons/create/lorentzian.svg +12 -0
  63. datalab/data/icons/create/planck.svg +12 -0
  64. datalab/data/icons/create/polynomial.svg +7 -0
  65. datalab/data/icons/create/pulse.svg +12 -0
  66. datalab/data/icons/create/ring.svg +18 -0
  67. datalab/data/icons/create/sawtooth.svg +7 -0
  68. datalab/data/icons/create/siemens.svg +35 -0
  69. datalab/data/icons/create/sinc.svg +12 -0
  70. datalab/data/icons/create/sine.svg +7 -0
  71. datalab/data/icons/create/square.svg +7 -0
  72. datalab/data/icons/create/square_pulse.svg +7 -0
  73. datalab/data/icons/create/step.svg +7 -0
  74. datalab/data/icons/create/step_pulse.svg +12 -0
  75. datalab/data/icons/create/triangle.svg +7 -0
  76. datalab/data/icons/create/voigt.svg +12 -0
  77. datalab/data/icons/edit/annotations.svg +72 -0
  78. datalab/data/icons/edit/annotations_copy.svg +114 -0
  79. datalab/data/icons/edit/annotations_delete.svg +83 -0
  80. datalab/data/icons/edit/annotations_edit.svg +98 -0
  81. datalab/data/icons/edit/annotations_export.svg +85 -0
  82. datalab/data/icons/edit/annotations_import.svg +85 -0
  83. datalab/data/icons/edit/annotations_paste.svg +100 -0
  84. datalab/data/icons/edit/copy_titles.svg +109 -0
  85. datalab/data/icons/edit/delete.svg +84 -0
  86. datalab/data/icons/edit/delete_all.svg +214 -0
  87. datalab/data/icons/edit/duplicate.svg +64 -0
  88. datalab/data/icons/edit/goto_source.svg +60 -0
  89. datalab/data/icons/edit/metadata.svg +60 -0
  90. datalab/data/icons/edit/metadata_add.svg +80 -0
  91. datalab/data/icons/edit/metadata_copy.svg +96 -0
  92. datalab/data/icons/edit/metadata_delete.svg +62 -0
  93. datalab/data/icons/edit/metadata_export.svg +68 -0
  94. datalab/data/icons/edit/metadata_import.svg +68 -0
  95. datalab/data/icons/edit/metadata_paste.svg +79 -0
  96. datalab/data/icons/edit/move_down.svg +55 -0
  97. datalab/data/icons/edit/move_up.svg +54 -0
  98. datalab/data/icons/edit/new_group.svg +76 -0
  99. datalab/data/icons/edit/recompute.svg +60 -0
  100. datalab/data/icons/edit/rename.svg +49 -0
  101. datalab/data/icons/edit.svg +16 -0
  102. datalab/data/icons/expand.svg +44 -0
  103. datalab/data/icons/expand_selection.svg +63 -0
  104. datalab/data/icons/fit/cdf_fit.svg +56 -0
  105. datalab/data/icons/fit/exponential_fit.svg +55 -0
  106. datalab/data/icons/fit/gaussian_fit.svg +62 -0
  107. datalab/data/icons/fit/interactive_fit.svg +101 -0
  108. datalab/data/icons/fit/linear_fit.svg +57 -0
  109. datalab/data/icons/fit/lorentzian_fit.svg +209 -0
  110. datalab/data/icons/fit/multigaussian_fit.svg +85 -0
  111. datalab/data/icons/fit/multilorentzian_fit.svg +85 -0
  112. datalab/data/icons/fit/piecewiseexponential_fit.svg +209 -0
  113. datalab/data/icons/fit/planckian_fit.svg +62 -0
  114. datalab/data/icons/fit/polynomial_fit.svg +59 -0
  115. datalab/data/icons/fit/sigmoid_fit.svg +56 -0
  116. datalab/data/icons/fit/sinusoidal_fit.svg +72 -0
  117. datalab/data/icons/fit/twohalfgaussian_fit.svg +63 -0
  118. datalab/data/icons/fit/voigt_fit.svg +57 -0
  119. datalab/data/icons/group.svg +56 -0
  120. datalab/data/icons/h5/h5array.svg +59 -0
  121. datalab/data/icons/h5/h5attrs.svg +75 -0
  122. datalab/data/icons/h5/h5browser.svg +133 -0
  123. datalab/data/icons/h5/h5file.svg +69 -0
  124. datalab/data/icons/h5/h5group.svg +49 -0
  125. datalab/data/icons/h5/h5scalar.svg +1 -0
  126. datalab/data/icons/help_pdf.svg +46 -0
  127. datalab/data/icons/history.svg +7 -0
  128. datalab/data/icons/image.svg +135 -0
  129. datalab/data/icons/io/fileopen_directory.svg +60 -0
  130. datalab/data/icons/io/fileopen_h5.svg +84 -0
  131. datalab/data/icons/io/fileopen_ima.svg +187 -0
  132. datalab/data/icons/io/fileopen_py.svg +123 -0
  133. datalab/data/icons/io/fileopen_sig.svg +138 -0
  134. datalab/data/icons/io/filesave_h5.svg +97 -0
  135. datalab/data/icons/io/filesave_ima.svg +200 -0
  136. datalab/data/icons/io/filesave_py.svg +136 -0
  137. datalab/data/icons/io/filesave_sig.svg +151 -0
  138. datalab/data/icons/io/import_text.svg +144 -0
  139. datalab/data/icons/io/save_to_directory.svg +134 -0
  140. datalab/data/icons/io.svg +84 -0
  141. datalab/data/icons/libre-camera-flash-off.svg +1 -0
  142. datalab/data/icons/libre-camera-flash-on.svg +1 -0
  143. datalab/data/icons/libre-gui-about.svg +1 -0
  144. datalab/data/icons/libre-gui-action-delete.svg +1 -0
  145. datalab/data/icons/libre-gui-add.svg +1 -0
  146. datalab/data/icons/libre-gui-arrow-down.svg +1 -0
  147. datalab/data/icons/libre-gui-arrow-left.svg +1 -0
  148. datalab/data/icons/libre-gui-arrow-right.svg +1 -0
  149. datalab/data/icons/libre-gui-arrow-up.svg +1 -0
  150. datalab/data/icons/libre-gui-close.svg +40 -0
  151. datalab/data/icons/libre-gui-cogs.svg +1 -0
  152. datalab/data/icons/libre-gui-globe.svg +1 -0
  153. datalab/data/icons/libre-gui-help.svg +1 -0
  154. datalab/data/icons/libre-gui-link.svg +1 -0
  155. datalab/data/icons/libre-gui-menu.svg +1 -0
  156. datalab/data/icons/libre-gui-pencil.svg +1 -0
  157. datalab/data/icons/libre-gui-plugin.svg +1 -0
  158. datalab/data/icons/libre-gui-questions.svg +1 -0
  159. datalab/data/icons/libre-gui-settings.svg +1 -0
  160. datalab/data/icons/libre-gui-unlink.svg +1 -0
  161. datalab/data/icons/libre-tech-ram.svg +1 -0
  162. datalab/data/icons/libre-toolbox.svg +1 -0
  163. datalab/data/icons/logs.svg +1 -0
  164. datalab/data/icons/markers.svg +74 -0
  165. datalab/data/icons/menu.svg +13 -0
  166. datalab/data/icons/new_ima.svg +148 -0
  167. datalab/data/icons/new_sig.svg +123 -0
  168. datalab/data/icons/operations/abs.svg +116 -0
  169. datalab/data/icons/operations/arithmetic.svg +123 -0
  170. datalab/data/icons/operations/average.svg +124 -0
  171. datalab/data/icons/operations/complex_from_magnitude_phase.svg +116 -0
  172. datalab/data/icons/operations/complex_from_real_imag.svg +124 -0
  173. datalab/data/icons/operations/constant.svg +116 -0
  174. datalab/data/icons/operations/constant_add.svg +109 -0
  175. datalab/data/icons/operations/constant_divide.svg +109 -0
  176. datalab/data/icons/operations/constant_multiply.svg +109 -0
  177. datalab/data/icons/operations/constant_subtract.svg +109 -0
  178. datalab/data/icons/operations/convert_dtype.svg +117 -0
  179. datalab/data/icons/operations/convolution.svg +46 -0
  180. datalab/data/icons/operations/deconvolution.svg +57 -0
  181. datalab/data/icons/operations/derivative.svg +127 -0
  182. datalab/data/icons/operations/difference.svg +52 -0
  183. datalab/data/icons/operations/division.svg +139 -0
  184. datalab/data/icons/operations/exp.svg +116 -0
  185. datalab/data/icons/operations/flip_horizontally.svg +69 -0
  186. datalab/data/icons/operations/flip_vertically.svg +74 -0
  187. datalab/data/icons/operations/im.svg +124 -0
  188. datalab/data/icons/operations/integral.svg +50 -0
  189. datalab/data/icons/operations/inverse.svg +143 -0
  190. datalab/data/icons/operations/log10.svg +109 -0
  191. datalab/data/icons/operations/phase.svg +116 -0
  192. datalab/data/icons/operations/power.svg +118 -0
  193. datalab/data/icons/operations/product.svg +124 -0
  194. datalab/data/icons/operations/profile.svg +379 -0
  195. datalab/data/icons/operations/profile_average.svg +399 -0
  196. datalab/data/icons/operations/profile_radial.svg +261 -0
  197. datalab/data/icons/operations/profile_segment.svg +262 -0
  198. datalab/data/icons/operations/quadratic_difference.svg +84 -0
  199. datalab/data/icons/operations/re.svg +124 -0
  200. datalab/data/icons/operations/rotate_left.svg +72 -0
  201. datalab/data/icons/operations/rotate_right.svg +72 -0
  202. datalab/data/icons/operations/signals_to_image.svg +314 -0
  203. datalab/data/icons/operations/sqrt.svg +110 -0
  204. datalab/data/icons/operations/std.svg +124 -0
  205. datalab/data/icons/operations/sum.svg +102 -0
  206. datalab/data/icons/play_demo.svg +9 -0
  207. datalab/data/icons/processing/axis_transform.svg +62 -0
  208. datalab/data/icons/processing/bandpass.svg +79 -0
  209. datalab/data/icons/processing/bandstop.svg +71 -0
  210. datalab/data/icons/processing/binning.svg +126 -0
  211. datalab/data/icons/processing/clip.svg +119 -0
  212. datalab/data/icons/processing/detrending.svg +173 -0
  213. datalab/data/icons/processing/distribute_on_grid.svg +769 -0
  214. datalab/data/icons/processing/edge_detection.svg +46 -0
  215. datalab/data/icons/processing/erase.svg +1 -0
  216. datalab/data/icons/processing/exposure.svg +143 -0
  217. datalab/data/icons/processing/fourier.svg +104 -0
  218. datalab/data/icons/processing/highpass.svg +59 -0
  219. datalab/data/icons/processing/interpolation.svg +71 -0
  220. datalab/data/icons/processing/level_adjustment.svg +70 -0
  221. datalab/data/icons/processing/lowpass.svg +60 -0
  222. datalab/data/icons/processing/morphology.svg +49 -0
  223. datalab/data/icons/processing/noise_addition.svg +114 -0
  224. datalab/data/icons/processing/noise_reduction.svg +38 -0
  225. datalab/data/icons/processing/normalize.svg +84 -0
  226. datalab/data/icons/processing/offset_correction.svg +131 -0
  227. datalab/data/icons/processing/resampling1d.svg +101 -0
  228. datalab/data/icons/processing/resampling2d.svg +240 -0
  229. datalab/data/icons/processing/reset_positions.svg +185 -0
  230. datalab/data/icons/processing/resize.svg +9 -0
  231. datalab/data/icons/processing/reverse_signal_x.svg +171 -0
  232. datalab/data/icons/processing/stability.svg +11 -0
  233. datalab/data/icons/processing/swap_x_y.svg +65 -0
  234. datalab/data/icons/processing/thresholding.svg +63 -0
  235. datalab/data/icons/processing/windowing.svg +45 -0
  236. datalab/data/icons/properties.svg +26 -0
  237. datalab/data/icons/reset.svg +9 -0
  238. datalab/data/icons/restore.svg +40 -0
  239. datalab/data/icons/roi/roi.svg +76 -0
  240. datalab/data/icons/roi/roi_coordinate.svg +78 -0
  241. datalab/data/icons/roi/roi_copy.svg +112 -0
  242. datalab/data/icons/roi/roi_delete.svg +81 -0
  243. datalab/data/icons/roi/roi_export.svg +87 -0
  244. datalab/data/icons/roi/roi_graphical.svg +78 -0
  245. datalab/data/icons/roi/roi_grid.svg +67 -0
  246. datalab/data/icons/roi/roi_ima.svg +188 -0
  247. datalab/data/icons/roi/roi_import.svg +87 -0
  248. datalab/data/icons/roi/roi_new.svg +81 -0
  249. datalab/data/icons/roi/roi_new_circle.svg +95 -0
  250. datalab/data/icons/roi/roi_new_polygon.svg +110 -0
  251. datalab/data/icons/roi/roi_new_rectangle.svg +70 -0
  252. datalab/data/icons/roi/roi_paste.svg +98 -0
  253. datalab/data/icons/roi/roi_sig.svg +124 -0
  254. datalab/data/icons/shapes.svg +134 -0
  255. datalab/data/icons/signal.svg +103 -0
  256. datalab/data/icons/table.svg +85 -0
  257. datalab/data/icons/table_unavailable.svg +102 -0
  258. datalab/data/icons/to_signal.svg +124 -0
  259. datalab/data/icons/tour/next.svg +44 -0
  260. datalab/data/icons/tour/previous.svg +44 -0
  261. datalab/data/icons/tour/rewind.svg +51 -0
  262. datalab/data/icons/tour/stop.svg +47 -0
  263. datalab/data/icons/tour/tour.svg +16 -0
  264. datalab/data/icons/uncheck_all.svg +78 -0
  265. datalab/data/icons/view/curve_antialiasing.svg +50 -0
  266. datalab/data/icons/view/new_window.svg +98 -0
  267. datalab/data/icons/view/refresh-auto.svg +57 -0
  268. datalab/data/icons/view/refresh-manual.svg +51 -0
  269. datalab/data/icons/view/reset_curve_styles.svg +96 -0
  270. datalab/data/icons/view/show_first.svg +55 -0
  271. datalab/data/icons/view/show_titles.svg +46 -0
  272. datalab/data/icons/visualization.svg +51 -0
  273. datalab/data/logo/DataLab-Banner-150.png +0 -0
  274. datalab/data/logo/DataLab-Banner-200.png +0 -0
  275. datalab/data/logo/DataLab-Banner2-100.png +0 -0
  276. datalab/data/logo/DataLab-Splash.png +0 -0
  277. datalab/data/logo/DataLab-watermark.png +0 -0
  278. datalab/data/logo/DataLab.svg +83 -0
  279. datalab/data/tests/reordering_test.h5 +0 -0
  280. datalab/data/tutorials/fabry_perot/fabry-perot1.jpg +0 -0
  281. datalab/data/tutorials/fabry_perot/fabry-perot2.jpg +0 -0
  282. datalab/data/tutorials/laser_beam/TEM00_z_13.jpg +0 -0
  283. datalab/data/tutorials/laser_beam/TEM00_z_18.jpg +0 -0
  284. datalab/data/tutorials/laser_beam/TEM00_z_23.jpg +0 -0
  285. datalab/data/tutorials/laser_beam/TEM00_z_30.jpg +0 -0
  286. datalab/data/tutorials/laser_beam/TEM00_z_35.jpg +0 -0
  287. datalab/data/tutorials/laser_beam/TEM00_z_40.jpg +0 -0
  288. datalab/data/tutorials/laser_beam/TEM00_z_45.jpg +0 -0
  289. datalab/data/tutorials/laser_beam/TEM00_z_50.jpg +0 -0
  290. datalab/data/tutorials/laser_beam/TEM00_z_55.jpg +0 -0
  291. datalab/data/tutorials/laser_beam/TEM00_z_60.jpg +0 -0
  292. datalab/data/tutorials/laser_beam/TEM00_z_65.jpg +0 -0
  293. datalab/data/tutorials/laser_beam/TEM00_z_70.jpg +0 -0
  294. datalab/data/tutorials/laser_beam/TEM00_z_75.jpg +0 -0
  295. datalab/data/tutorials/laser_beam/TEM00_z_80.jpg +0 -0
  296. datalab/env.py +542 -0
  297. datalab/gui/__init__.py +89 -0
  298. datalab/gui/actionhandler.py +1701 -0
  299. datalab/gui/docks.py +473 -0
  300. datalab/gui/h5io.py +150 -0
  301. datalab/gui/macroeditor.py +310 -0
  302. datalab/gui/main.py +2081 -0
  303. datalab/gui/newobject.py +217 -0
  304. datalab/gui/objectview.py +766 -0
  305. datalab/gui/panel/__init__.py +48 -0
  306. datalab/gui/panel/base.py +3254 -0
  307. datalab/gui/panel/image.py +157 -0
  308. datalab/gui/panel/macro.py +607 -0
  309. datalab/gui/panel/signal.py +164 -0
  310. datalab/gui/plothandler.py +800 -0
  311. datalab/gui/processor/__init__.py +84 -0
  312. datalab/gui/processor/base.py +2456 -0
  313. datalab/gui/processor/catcher.py +75 -0
  314. datalab/gui/processor/image.py +1214 -0
  315. datalab/gui/processor/signal.py +755 -0
  316. datalab/gui/profiledialog.py +333 -0
  317. datalab/gui/roieditor.py +633 -0
  318. datalab/gui/roigrideditor.py +208 -0
  319. datalab/gui/settings.py +612 -0
  320. datalab/gui/tour.py +908 -0
  321. datalab/h5/__init__.py +12 -0
  322. datalab/h5/common.py +314 -0
  323. datalab/h5/generic.py +580 -0
  324. datalab/h5/native.py +39 -0
  325. datalab/h5/utils.py +95 -0
  326. datalab/objectmodel.py +640 -0
  327. datalab/plugins/_readme_.txt +9 -0
  328. datalab/plugins/datalab_imageformats.py +175 -0
  329. datalab/plugins/datalab_testdata.py +190 -0
  330. datalab/plugins.py +355 -0
  331. datalab/tests/__init__.py +199 -0
  332. datalab/tests/backbone/__init__.py +1 -0
  333. datalab/tests/backbone/config_unit_test.py +170 -0
  334. datalab/tests/backbone/config_versioning_unit_test.py +34 -0
  335. datalab/tests/backbone/dictlistserial_app_test.py +38 -0
  336. datalab/tests/backbone/errorcatcher_unit_test.py +69 -0
  337. datalab/tests/backbone/errormsgbox_unit_test.py +50 -0
  338. datalab/tests/backbone/execenv_unit.py +262 -0
  339. datalab/tests/backbone/loadtest_gdi.py +147 -0
  340. datalab/tests/backbone/long_callback.py +96 -0
  341. datalab/tests/backbone/main_app_test.py +137 -0
  342. datalab/tests/backbone/memory_leak.py +43 -0
  343. datalab/tests/backbone/procisolation1_unit.py +128 -0
  344. datalab/tests/backbone/procisolation2_unit.py +171 -0
  345. datalab/tests/backbone/procisolation_unit_test.py +22 -0
  346. datalab/tests/backbone/profiling_app.py +27 -0
  347. datalab/tests/backbone/strings_unit_test.py +65 -0
  348. datalab/tests/backbone/title_formatting_unit_test.py +82 -0
  349. datalab/tests/conftest.py +131 -0
  350. datalab/tests/features/__init__.py +1 -0
  351. datalab/tests/features/applauncher/__init__.py +1 -0
  352. datalab/tests/features/applauncher/launcher1_app_test.py +28 -0
  353. datalab/tests/features/applauncher/launcher2_app_test.py +30 -0
  354. datalab/tests/features/common/__init__.py +1 -0
  355. datalab/tests/features/common/add_metadata_app_test.py +134 -0
  356. datalab/tests/features/common/add_metadata_unit_test.py +267 -0
  357. datalab/tests/features/common/annotations_management_unit_test.py +152 -0
  358. datalab/tests/features/common/auto_analysis_recompute_unit_test.py +240 -0
  359. datalab/tests/features/common/createobject_unit_test.py +50 -0
  360. datalab/tests/features/common/geometry_results_app_test.py +135 -0
  361. datalab/tests/features/common/interactive_processing_test.py +1109 -0
  362. datalab/tests/features/common/io_app_test.py +75 -0
  363. datalab/tests/features/common/large_results_app_test.py +187 -0
  364. datalab/tests/features/common/metadata_all_patterns_test.py +103 -0
  365. datalab/tests/features/common/metadata_app_test.py +139 -0
  366. datalab/tests/features/common/metadata_io_unit_test.py +60 -0
  367. datalab/tests/features/common/misc_app_test.py +236 -0
  368. datalab/tests/features/common/multiple_geometry_results_unit_test.py +122 -0
  369. datalab/tests/features/common/multiple_table_results_unit_test.py +64 -0
  370. datalab/tests/features/common/operation_modes_app_test.py +392 -0
  371. datalab/tests/features/common/plot_results_app_test.py +278 -0
  372. datalab/tests/features/common/reorder_app_test.py +75 -0
  373. datalab/tests/features/common/result_deletion_unit_test.py +96 -0
  374. datalab/tests/features/common/result_merged_label_unit_test.py +154 -0
  375. datalab/tests/features/common/result_shape_settings_unit_test.py +223 -0
  376. datalab/tests/features/common/roi_plotitem_unit_test.py +64 -0
  377. datalab/tests/features/common/roieditor_unit_test.py +102 -0
  378. datalab/tests/features/common/save_to_dir_app_test.py +163 -0
  379. datalab/tests/features/common/save_to_dir_unit_test.py +474 -0
  380. datalab/tests/features/common/stat_app_test.py +40 -0
  381. datalab/tests/features/common/stats_tools_unit_test.py +77 -0
  382. datalab/tests/features/common/table_results_app_test.py +52 -0
  383. datalab/tests/features/common/textimport_unit_test.py +131 -0
  384. datalab/tests/features/common/uuid_preservation_test.py +281 -0
  385. datalab/tests/features/common/worker_unit_test.py +402 -0
  386. datalab/tests/features/control/__init__.py +1 -0
  387. datalab/tests/features/control/connect_dialog.py +28 -0
  388. datalab/tests/features/control/embedded1_unit_test.py +304 -0
  389. datalab/tests/features/control/embedded2_unit_test.py +52 -0
  390. datalab/tests/features/control/remoteclient_app_test.py +219 -0
  391. datalab/tests/features/control/remoteclient_unit.py +75 -0
  392. datalab/tests/features/control/simpleclient_unit_test.py +321 -0
  393. datalab/tests/features/hdf5/__init__.py +1 -0
  394. datalab/tests/features/hdf5/h5browser1_unit_test.py +31 -0
  395. datalab/tests/features/hdf5/h5browser2_unit.py +55 -0
  396. datalab/tests/features/hdf5/h5browser_app_test.py +77 -0
  397. datalab/tests/features/hdf5/h5import_app_test.py +25 -0
  398. datalab/tests/features/hdf5/h5importer_app_test.py +34 -0
  399. datalab/tests/features/image/__init__.py +1 -0
  400. datalab/tests/features/image/annotations_app_test.py +28 -0
  401. datalab/tests/features/image/annotations_unit_test.py +80 -0
  402. datalab/tests/features/image/average_app_test.py +46 -0
  403. datalab/tests/features/image/background_dialog_test.py +70 -0
  404. datalab/tests/features/image/blobs_app_test.py +50 -0
  405. datalab/tests/features/image/contour_app_test.py +42 -0
  406. datalab/tests/features/image/contour_fabryperot_app_test.py +51 -0
  407. datalab/tests/features/image/denoise_app_test.py +31 -0
  408. datalab/tests/features/image/distribute_on_grid_app_test.py +95 -0
  409. datalab/tests/features/image/edges_app_test.py +31 -0
  410. datalab/tests/features/image/erase_app_test.py +21 -0
  411. datalab/tests/features/image/fft2d_app_test.py +27 -0
  412. datalab/tests/features/image/flatfield_app_test.py +40 -0
  413. datalab/tests/features/image/geometry_transform_unit_test.py +396 -0
  414. datalab/tests/features/image/imagetools_app_test.py +51 -0
  415. datalab/tests/features/image/imagetools_unit_test.py +27 -0
  416. datalab/tests/features/image/load_app_test.py +73 -0
  417. datalab/tests/features/image/morph_app_test.py +32 -0
  418. datalab/tests/features/image/offsetcorrection_app_test.py +30 -0
  419. datalab/tests/features/image/peak2d_app_test.py +53 -0
  420. datalab/tests/features/image/profile_app_test.py +73 -0
  421. datalab/tests/features/image/profile_dialog_test.py +56 -0
  422. datalab/tests/features/image/roi_app_test.py +98 -0
  423. datalab/tests/features/image/roi_circ_app_test.py +62 -0
  424. datalab/tests/features/image/roi_manipulation_app_test.py +268 -0
  425. datalab/tests/features/image/roigrid_unit_test.py +60 -0
  426. datalab/tests/features/image/side_by_side_app_test.py +52 -0
  427. datalab/tests/features/macro/__init__.py +1 -0
  428. datalab/tests/features/macro/macro_app_test.py +28 -0
  429. datalab/tests/features/macro/macroeditor_unit_test.py +102 -0
  430. datalab/tests/features/signal/__init__.py +1 -0
  431. datalab/tests/features/signal/baseline_dialog_test.py +53 -0
  432. datalab/tests/features/signal/deltax_dialog_unit_test.py +34 -0
  433. datalab/tests/features/signal/fft1d_app_test.py +26 -0
  434. datalab/tests/features/signal/filter_app_test.py +44 -0
  435. datalab/tests/features/signal/fitdialog_unit_test.py +50 -0
  436. datalab/tests/features/signal/interpolation_app_test.py +110 -0
  437. datalab/tests/features/signal/loadbigsignal_app_test.py +80 -0
  438. datalab/tests/features/signal/multiple_rois_unit_test.py +132 -0
  439. datalab/tests/features/signal/pulse_features_app_test.py +118 -0
  440. datalab/tests/features/signal/pulse_features_roi_app_test.py +55 -0
  441. datalab/tests/features/signal/roi_app_test.py +78 -0
  442. datalab/tests/features/signal/roi_manipulation_app_test.py +261 -0
  443. datalab/tests/features/signal/select_xy_cursor_unit_test.py +46 -0
  444. datalab/tests/features/signal/signalpeakdetection_dialog_test.py +33 -0
  445. datalab/tests/features/signal/signals_to_image_app_test.py +98 -0
  446. datalab/tests/features/signal/xarray_compat_app_test.py +128 -0
  447. datalab/tests/features/tour_unit_test.py +22 -0
  448. datalab/tests/features/utilities/__init__.py +1 -0
  449. datalab/tests/features/utilities/installconf_unit_test.py +21 -0
  450. datalab/tests/features/utilities/logview_app_test.py +21 -0
  451. datalab/tests/features/utilities/logview_error.py +24 -0
  452. datalab/tests/features/utilities/logview_unit_test.py +21 -0
  453. datalab/tests/features/utilities/memstatus_app_test.py +42 -0
  454. datalab/tests/features/utilities/settings_unit_test.py +88 -0
  455. datalab/tests/scenarios/__init__.py +1 -0
  456. datalab/tests/scenarios/beautiful_app.py +121 -0
  457. datalab/tests/scenarios/common.py +463 -0
  458. datalab/tests/scenarios/demo.py +212 -0
  459. datalab/tests/scenarios/example_app_test.py +47 -0
  460. datalab/tests/scenarios/scenario_h5_app_test.py +75 -0
  461. datalab/tests/scenarios/scenario_ima1_app_test.py +34 -0
  462. datalab/tests/scenarios/scenario_ima2_app_test.py +34 -0
  463. datalab/tests/scenarios/scenario_mac_app_test.py +58 -0
  464. datalab/tests/scenarios/scenario_sig1_app_test.py +36 -0
  465. datalab/tests/scenarios/scenario_sig2_app_test.py +35 -0
  466. datalab/utils/__init__.py +1 -0
  467. datalab/utils/conf.py +304 -0
  468. datalab/utils/dephash.py +105 -0
  469. datalab/utils/qthelpers.py +633 -0
  470. datalab/utils/strings.py +34 -0
  471. datalab/utils/tests.py +0 -0
  472. datalab/widgets/__init__.py +1 -0
  473. datalab/widgets/connection.py +138 -0
  474. datalab/widgets/filedialog.py +91 -0
  475. datalab/widgets/fileviewer.py +84 -0
  476. datalab/widgets/fitdialog.py +788 -0
  477. datalab/widgets/h5browser.py +1048 -0
  478. datalab/widgets/imagebackground.py +111 -0
  479. datalab/widgets/instconfviewer.py +175 -0
  480. datalab/widgets/logviewer.py +80 -0
  481. datalab/widgets/signalbaseline.py +90 -0
  482. datalab/widgets/signalcursor.py +208 -0
  483. datalab/widgets/signaldeltax.py +151 -0
  484. datalab/widgets/signalpeak.py +199 -0
  485. datalab/widgets/status.py +249 -0
  486. datalab/widgets/textimport.py +786 -0
  487. datalab/widgets/warningerror.py +223 -0
  488. datalab/widgets/wizard.py +286 -0
  489. datalab_platform-1.0.1.dist-info/METADATA +121 -0
  490. datalab_platform-1.0.1.dist-info/RECORD +494 -0
  491. datalab_platform-0.0.1.dev0.dist-info/METADATA +0 -67
  492. datalab_platform-0.0.1.dev0.dist-info/RECORD +0 -7
  493. {datalab_platform-0.0.1.dev0.dist-info → datalab_platform-1.0.1.dist-info}/WHEEL +0 -0
  494. {datalab_platform-0.0.1.dev0.dist-info → datalab_platform-1.0.1.dist-info}/entry_points.txt +0 -0
  495. {datalab_platform-0.0.1.dev0.dist-info → datalab_platform-1.0.1.dist-info}/licenses/LICENSE +0 -0
  496. {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()
@@ -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"""