tomwer 1.2.1__py3-none-any.whl → 1.3.12__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 (334) hide show
  1. orangecontrib/tomwer/tutorials/icat_publication.ows +58 -0
  2. orangecontrib/tomwer/widgets/__init__.py +11 -11
  3. orangecontrib/tomwer/widgets/control/DataDiscoveryOW.py +2 -2
  4. orangecontrib/tomwer/widgets/control/DataListOW.py +9 -7
  5. orangecontrib/tomwer/widgets/control/DataListenerOW.py +6 -6
  6. orangecontrib/tomwer/widgets/control/DataSelectorOW.py +21 -10
  7. orangecontrib/tomwer/widgets/control/DataValidatorOW.py +6 -6
  8. orangecontrib/tomwer/widgets/control/EDF2NXTomomillOW.py +24 -7
  9. orangecontrib/tomwer/widgets/control/EmailOW.py +4 -4
  10. orangecontrib/tomwer/widgets/control/NXTomomillMixIn.py +3 -3
  11. orangecontrib/tomwer/widgets/control/NXTomomillOW.py +64 -23
  12. orangecontrib/tomwer/widgets/control/NXtomoConcatenate.py +20 -8
  13. orangecontrib/tomwer/widgets/control/NotifierOW.py +1 -0
  14. orangecontrib/tomwer/widgets/control/SingleTomoObjOW.py +6 -6
  15. orangecontrib/tomwer/widgets/control/VolumeSelector.py +7 -4
  16. orangecontrib/tomwer/widgets/control/VolumeSymLinkOW.py +182 -182
  17. orangecontrib/tomwer/widgets/debugtools/DatasetGeneratorOW.py +5 -5
  18. orangecontrib/tomwer/widgets/edit/DarkFlatPatchOW.py +4 -4
  19. orangecontrib/tomwer/widgets/edit/ImageKeyEditorOW.py +3 -3
  20. orangecontrib/tomwer/widgets/edit/ImageKeyUpgraderOW.py +8 -1
  21. orangecontrib/tomwer/widgets/edit/NXtomoEditorOW.py +3 -3
  22. orangecontrib/tomwer/widgets/edit/test/test_nxtomo_editor.py +3 -3
  23. orangecontrib/tomwer/widgets/icat/PublishProcessedDataOW.py +115 -0
  24. orangecontrib/tomwer/widgets/icat/RawDataScreenshotCreatorOW.py +98 -0
  25. orangecontrib/tomwer/widgets/icat/SaveToGalleryAndPublishOW.py +129 -0
  26. orangecontrib/tomwer/widgets/icat/__init__.py +13 -0
  27. orangecontrib/tomwer/widgets/icat/icons/add_gallery.png +0 -0
  28. orangecontrib/tomwer/widgets/icat/icons/add_gallery.svg +82 -0
  29. orangecontrib/tomwer/widgets/icat/icons/publish_processed_data.png +0 -0
  30. orangecontrib/tomwer/widgets/icat/icons/publish_processed_data.svg +95 -0
  31. orangecontrib/tomwer/widgets/icat/icons/raw_screenshots.png +0 -0
  32. orangecontrib/tomwer/widgets/icat/icons/raw_screenshots.svg +143 -0
  33. orangecontrib/tomwer/widgets/icons/tomwer_data_portal.png +0 -0
  34. orangecontrib/tomwer/widgets/icons/tomwer_data_portal.svg +76 -0
  35. orangecontrib/tomwer/widgets/reconstruction/AxisOW.py +22 -20
  36. orangecontrib/tomwer/widgets/reconstruction/CastNabuVolumeOW.py +19 -3
  37. orangecontrib/tomwer/widgets/reconstruction/NabuHelicalPrepareWeightsDoubleOW.py +184 -169
  38. orangecontrib/tomwer/widgets/reconstruction/NabuOW.py +23 -0
  39. orangecontrib/tomwer/widgets/reconstruction/NabuVolumeOW.py +39 -5
  40. orangecontrib/tomwer/widgets/reconstruction/SAAxisOW.py +18 -22
  41. orangecontrib/tomwer/widgets/reconstruction/SADeltaBetaOW.py +18 -26
  42. orangecontrib/tomwer/widgets/reconstruction/SinoNormOW.py +15 -19
  43. orangecontrib/tomwer/widgets/visualization/DataViewerOW.py +9 -9
  44. orangecontrib/tomwer/widgets/visualization/DiffViewerOW.py +1 -1
  45. orangecontrib/tomwer/widgets/visualization/LivesliceOW.py +1 -1
  46. orangecontrib/tomwer/widgets/visualization/NXtomoMetadataViewerOW.py +3 -3
  47. orangecontrib/tomwer/widgets/visualization/SinogramViewerOW.py +0 -1
  48. orangecontrib/tomwer/widgets/visualization/VolumeViewerOW.py +3 -29
  49. tomwer/__main__.py +7 -64
  50. tomwer/app/axis.py +3 -3
  51. tomwer/app/canvas.py +8 -0
  52. tomwer/app/canvas_launcher/config.py +16 -14
  53. tomwer/app/canvas_launcher/environ.py +1 -0
  54. tomwer/app/canvas_launcher/mainwindow.py +4 -1
  55. tomwer/app/darkref.py +1 -1
  56. tomwer/app/darkrefpatch.py +1 -1
  57. tomwer/app/diffframe.py +3 -3
  58. tomwer/app/imagekeyeditor.py +5 -5
  59. tomwer/app/imagekeyupgrader.py +5 -5
  60. tomwer/app/intensitynormalization.py +14 -13
  61. tomwer/app/{saaxis.py → multicor.py} +3 -3
  62. tomwer/app/{sadeltabeta.py → multipag.py} +3 -3
  63. tomwer/app/nabuapp.py +0 -11
  64. tomwer/app/radiostack.py +6 -4
  65. tomwer/app/samplemoved.py +3 -2
  66. tomwer/app/scanviewer.py +4 -2
  67. tomwer/app/sinogramviewer.py +3 -2
  68. tomwer/app/slicestack.py +3 -2
  69. tomwer/app/zstitching.py +88 -6
  70. tomwer/core/cluster/cluster.py +26 -0
  71. tomwer/core/log/logger.py +7 -5
  72. tomwer/core/process/conditions/filters.py +1 -1
  73. tomwer/core/process/control/datalistener/datalistener.py +19 -14
  74. tomwer/core/process/control/datawatcher/edfdwprocess.py +0 -9
  75. tomwer/core/process/control/nxtomoconcatenate.py +13 -13
  76. tomwer/core/process/control/nxtomomill.py +92 -34
  77. tomwer/core/process/control/scantransfer.py +20 -43
  78. tomwer/core/process/control/scanvalidator.py +3 -2
  79. tomwer/core/process/control/test/test_concatenate_nxtomos.py +9 -9
  80. tomwer/core/process/control/test/test_email.py +4 -4
  81. tomwer/core/process/control/test/test_h52nx_process.py +59 -7
  82. tomwer/core/process/control/test/test_volume_link.py +64 -64
  83. tomwer/core/process/control/timer.py +1 -1
  84. tomwer/core/process/control/volumesymlink.py +200 -200
  85. tomwer/core/process/edit/darkflatpatch.py +14 -15
  86. tomwer/core/process/edit/imagekeyeditor.py +41 -39
  87. tomwer/core/process/icat/__init__.py +0 -0
  88. tomwer/core/process/icat/createscreenshots.py +100 -0
  89. tomwer/core/process/icat/gallery.py +377 -0
  90. tomwer/core/process/icat/icatbase.py +36 -0
  91. tomwer/core/process/icat/publish.py +228 -0
  92. tomwer/core/process/icat/screenshots.py +27 -0
  93. tomwer/core/process/output.py +52 -0
  94. tomwer/core/process/reconstruction/axis/axis.py +280 -69
  95. tomwer/core/process/reconstruction/axis/mode.py +163 -48
  96. tomwer/core/process/reconstruction/axis/params.py +29 -21
  97. tomwer/core/process/reconstruction/darkref/darkrefs.py +41 -127
  98. tomwer/core/process/reconstruction/darkref/darkrefscopy.py +4 -3
  99. tomwer/core/process/reconstruction/darkref/params.py +1 -1
  100. tomwer/core/process/reconstruction/nabu/castvolume.py +4 -4
  101. tomwer/core/process/reconstruction/nabu/helical.py +9 -5
  102. tomwer/core/process/reconstruction/nabu/nabucommon.py +71 -78
  103. tomwer/core/process/reconstruction/nabu/nabuscores.py +425 -53
  104. tomwer/core/process/reconstruction/nabu/nabuslices.py +114 -93
  105. tomwer/core/process/reconstruction/nabu/nabuvolume.py +54 -27
  106. tomwer/core/process/reconstruction/nabu/plane.py +9 -0
  107. tomwer/core/process/reconstruction/nabu/settings.py +2 -2
  108. tomwer/core/process/reconstruction/nabu/utils.py +164 -26
  109. tomwer/core/process/reconstruction/output.py +108 -0
  110. tomwer/core/process/reconstruction/saaxis/saaxis.py +238 -264
  111. tomwer/core/process/reconstruction/sadeltabeta/sadeltabeta.py +151 -87
  112. tomwer/core/process/reconstruction/scores/params.py +7 -4
  113. tomwer/core/process/reconstruction/scores/scores.py +13 -0
  114. tomwer/core/process/reconstruction/test/test_axis_params.py +2 -2
  115. tomwer/core/process/reconstruction/test/test_darkref.py +3 -3
  116. tomwer/core/process/reconstruction/test/test_darkref_copy.py +7 -7
  117. tomwer/core/process/reconstruction/test/test_saaxis.py +3 -4
  118. tomwer/core/process/reconstruction/test/test_sadeltabeta.py +2 -2
  119. tomwer/core/process/stitching/nabustitcher.py +13 -12
  120. tomwer/core/process/task.py +34 -26
  121. tomwer/core/process/test/test_axis.py +13 -12
  122. tomwer/core/process/test/test_dark_and_flat.py +10 -7
  123. tomwer/core/process/test/test_data_transfer.py +10 -8
  124. tomwer/core/process/test/test_nabu.py +14 -6
  125. tomwer/core/process/test/test_normalization.py +4 -4
  126. tomwer/core/scan/blissscan.py +3 -3
  127. tomwer/core/scan/edfscan.py +13 -10
  128. tomwer/core/scan/hdf5scan.py +19 -530
  129. tomwer/core/scan/nxtomoscan.py +534 -0
  130. tomwer/core/scan/scanbase.py +72 -44
  131. tomwer/core/scan/scanfactory.py +13 -13
  132. tomwer/core/scan/test/test_edf.py +2 -2
  133. tomwer/core/scan/test/test_future_scan.py +3 -3
  134. tomwer/core/scan/test/test_h5.py +18 -16
  135. tomwer/core/scan/test/test_process_registration.py +4 -40
  136. tomwer/core/scan/test/test_scan.py +5 -78
  137. tomwer/core/settings.py +22 -2
  138. tomwer/core/test/test_scanutils.py +8 -7
  139. tomwer/core/test/test_utils.py +35 -28
  140. tomwer/core/tomwer_object.py +1 -1
  141. tomwer/core/utils/__init__.py +0 -466
  142. tomwer/core/utils/deprecation.py +1 -1
  143. tomwer/core/utils/dictutils.py +14 -0
  144. tomwer/core/utils/lbsram.py +35 -0
  145. tomwer/core/utils/nxtomoutils.py +1 -1
  146. tomwer/core/utils/scanutils.py +6 -6
  147. tomwer/core/utils/spec.py +263 -0
  148. tomwer/core/volume/edfvolume.py +6 -6
  149. tomwer/core/volume/hdf5volume.py +6 -6
  150. tomwer/core/volume/jp2kvolume.py +6 -6
  151. tomwer/core/volume/rawvolume.py +6 -6
  152. tomwer/core/volume/tiffvolume.py +12 -12
  153. tomwer/core/volume/volumefactory.py +2 -2
  154. tomwer/gui/cluster/slurm.py +274 -65
  155. tomwer/gui/cluster/supervisor.py +12 -0
  156. tomwer/gui/cluster/test/test_cluster.py +14 -2
  157. tomwer/gui/cluster/test/test_supervisor.py +3 -3
  158. tomwer/gui/configuration/__init__.py +0 -0
  159. tomwer/gui/{reconstruction/nabu → configuration}/action.py +1 -32
  160. tomwer/gui/configuration/level.py +22 -0
  161. tomwer/gui/control/actions.py +54 -0
  162. tomwer/gui/control/datalist.py +83 -16
  163. tomwer/gui/control/datalistener.py +4 -16
  164. tomwer/gui/control/datawatcher/controlwidget.py +2 -4
  165. tomwer/gui/control/datawatcher/datawatcher.py +1 -24
  166. tomwer/gui/control/{email.py → emailnotifier.py} +9 -18
  167. tomwer/gui/control/history.py +2 -2
  168. tomwer/gui/control/observations.py +2 -2
  169. tomwer/gui/control/reducedarkflatselector.py +9 -9
  170. tomwer/gui/control/selectorwidgetbase.py +36 -9
  171. tomwer/gui/control/serie/seriecreator.py +5 -22
  172. tomwer/gui/control/test/test_email.py +1 -1
  173. tomwer/gui/control/test/test_scanvalidator.py +6 -5
  174. tomwer/gui/control/test/test_single_tomo_obj.py +3 -3
  175. tomwer/gui/control/tomoobjdisplaymode.py +8 -0
  176. tomwer/gui/debugtools/datasetgenerator.py +3 -3
  177. tomwer/gui/edit/dkrfpatch.py +20 -26
  178. tomwer/gui/edit/imagekeyeditor.py +11 -12
  179. tomwer/gui/edit/nxtomoeditor.py +111 -44
  180. tomwer/gui/edit/nxtomowarmer.py +7 -6
  181. tomwer/gui/edit/test/test_dkrf_patch.py +13 -13
  182. tomwer/gui/edit/test/test_image_key_editor.py +3 -3
  183. tomwer/gui/edit/test/test_nx_editor.py +40 -16
  184. tomwer/gui/icat/__init__.py +0 -0
  185. tomwer/gui/icat/createscreenshots.py +80 -0
  186. tomwer/gui/icat/gallery.py +214 -0
  187. tomwer/gui/icat/publish.py +187 -0
  188. tomwer/gui/imagefromfile.py +2 -2
  189. tomwer/gui/qfolderdialog.py +24 -1
  190. tomwer/gui/reconstruction/axis/CompareImages.py +88 -168
  191. tomwer/gui/reconstruction/axis/axis.py +171 -57
  192. tomwer/gui/reconstruction/axis/radioaxis.py +122 -257
  193. tomwer/gui/reconstruction/darkref/darkrefcopywidget.py +3 -2
  194. tomwer/gui/reconstruction/darkref/darkrefwidget.py +2 -1
  195. tomwer/gui/reconstruction/nabu/castvolume.py +14 -3
  196. tomwer/gui/reconstruction/nabu/check.py +9 -9
  197. tomwer/gui/reconstruction/nabu/helical.py +29 -12
  198. tomwer/gui/reconstruction/nabu/nabuconfig/base.py +2 -4
  199. tomwer/gui/reconstruction/nabu/nabuconfig/nabuconfig.py +2 -1
  200. tomwer/gui/reconstruction/nabu/nabuconfig/output.py +126 -35
  201. tomwer/gui/reconstruction/nabu/nabuconfig/phase.py +39 -32
  202. tomwer/gui/reconstruction/nabu/nabuconfig/preprocessing.py +222 -31
  203. tomwer/gui/reconstruction/nabu/nabuconfig/reconstruction.py +57 -27
  204. tomwer/gui/reconstruction/nabu/nabuflow.py +12 -20
  205. tomwer/gui/reconstruction/nabu/slices.py +10 -11
  206. tomwer/gui/reconstruction/nabu/volume.py +22 -10
  207. tomwer/gui/reconstruction/normalization/intensity.py +18 -48
  208. tomwer/gui/reconstruction/saaxis/corrangeselector.py +8 -24
  209. tomwer/gui/reconstruction/saaxis/dimensionwidget.py +1 -1
  210. tomwer/gui/reconstruction/saaxis/saaxis.py +9 -21
  211. tomwer/gui/reconstruction/sadeltabeta/saadeltabeta.py +45 -12
  212. tomwer/gui/reconstruction/scores/control.py +2 -9
  213. tomwer/gui/reconstruction/scores/scoreplot.py +13 -11
  214. tomwer/gui/reconstruction/test/test_axis.py +41 -16
  215. tomwer/gui/reconstruction/test/test_nabu.py +31 -9
  216. tomwer/gui/reconstruction/test/test_saaxis.py +3 -3
  217. tomwer/gui/reconstruction/test/test_sadeltabeta.py +12 -2
  218. tomwer/gui/settings.py +5 -28
  219. tomwer/gui/stackplot.py +2 -5
  220. tomwer/gui/stitching/action.py +49 -0
  221. tomwer/gui/stitching/config/axisparams.py +7 -24
  222. tomwer/gui/stitching/config/output.py +10 -8
  223. tomwer/gui/stitching/config/positionoveraxis.py +22 -23
  224. tomwer/gui/stitching/normalization.py +117 -0
  225. tomwer/gui/stitching/stitchandbackground.py +4 -6
  226. tomwer/gui/stitching/stitching.py +267 -45
  227. tomwer/gui/stitching/stitching_preview.py +62 -55
  228. tomwer/gui/stitching/stitching_raw.py +13 -12
  229. tomwer/gui/stitching/z_stitching/fineestimation.py +0 -60
  230. tomwer/gui/utils/buttons.py +112 -29
  231. tomwer/gui/utils/inputwidget.py +43 -25
  232. tomwer/gui/utils/lineselector/lineselector.py +1 -1
  233. tomwer/gui/utils/scandescription.py +4 -0
  234. tomwer/gui/utils/step.py +144 -0
  235. tomwer/gui/utils/unitsystem.py +2 -5
  236. tomwer/gui/utils/vignettes.py +176 -15
  237. tomwer/gui/visualization/dataviewer.py +48 -35
  238. tomwer/gui/visualization/diffviewer/diffviewer.py +7 -16
  239. tomwer/gui/visualization/diffviewer/shiftwidget.py +2 -5
  240. tomwer/gui/visualization/scanoverview.py +1 -1
  241. tomwer/gui/visualization/sinogramviewer.py +20 -36
  242. tomwer/gui/visualization/test/test_diffviewer.py +3 -3
  243. tomwer/gui/visualization/test/test_nx_tomo_metadata_viewer.py +4 -4
  244. tomwer/gui/visualization/test/test_sinogramviewer.py +2 -2
  245. tomwer/gui/visualization/test/test_stacks.py +3 -3
  246. tomwer/gui/visualization/test/test_volumeviewer.py +65 -67
  247. tomwer/gui/visualization/volumeviewer.py +114 -113
  248. tomwer/io/utils/h5pyutils.py +3 -3
  249. tomwer/io/utils/raw_and_processed_data.py +84 -0
  250. tomwer/io/utils/tomoobj.py +4 -6
  251. tomwer/io/utils/utils.py +7 -7
  252. tomwer/resources/gui/icons/parameters.svg +1 -1
  253. tomwer/resources/gui/icons/ruler.png +0 -0
  254. tomwer/resources/gui/icons/ruler.svg +273 -0
  255. tomwer/resources/gui/icons/short_description.png +0 -0
  256. tomwer/resources/gui/icons/short_description.svg +58 -0
  257. tomwer/resources/gui/icons/url.png +0 -0
  258. tomwer/resources/gui/icons/url.svg +58 -0
  259. tomwer/resources/gui/illustrations/no_rot.svg +1 -1
  260. tomwer/synctools/stacks/edit/darkflatpatch.py +19 -14
  261. tomwer/synctools/stacks/edit/imagekeyeditor.py +2 -2
  262. tomwer/synctools/stacks/reconstruction/axis.py +4 -4
  263. tomwer/synctools/stacks/reconstruction/castvolume.py +22 -7
  264. tomwer/synctools/stacks/reconstruction/dkrefcopy.py +25 -20
  265. tomwer/synctools/stacks/reconstruction/nabu.py +2 -2
  266. tomwer/synctools/stacks/reconstruction/normalization.py +2 -2
  267. tomwer/synctools/stacks/reconstruction/saaxis.py +2 -2
  268. tomwer/synctools/stacks/reconstruction/sadeltabeta.py +2 -2
  269. tomwer/synctools/test/test_darkRefs.py +7 -58
  270. tomwer/synctools/test/test_foldertransfer.py +6 -6
  271. tomwer/synctools/utils/scanstages.py +6 -6
  272. tomwer/tests/conftest.py +34 -0
  273. tomwer/tests/datasets.py +13 -0
  274. tomwer/tests/test_scripts.py +91 -41
  275. tomwer/tests/utils.py +5 -0
  276. tomwer/third_part/WaitingOverlay.py +110 -0
  277. tomwer/third_part/__init__.py +0 -0
  278. tomwer/version.py +2 -2
  279. tomwer-1.3.12-py3.11-nspkg.pth +1 -0
  280. {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/METADATA +73 -58
  281. {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/RECORD +287 -286
  282. {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/WHEEL +1 -1
  283. orangecontrib/tomwer/widgets/reconstruction/TofuOW.py +0 -197
  284. orangecontrib/tomwer/widgets/reconstruction/icons/XY_lamino.svg +0 -168
  285. orangecontrib/tomwer/widgets/reconstruction/icons/XZ_lamino.svg +0 -275
  286. orangecontrib/tomwer/widgets/reconstruction/icons/YZ_lamino.svg +0 -182
  287. tomwer/app/lamino.py +0 -143
  288. tomwer/core/process/reconstruction/lamino/__init__.py +0 -1
  289. tomwer/core/process/reconstruction/lamino/tofu.py +0 -1000
  290. tomwer/core/process/test/test_lamino.py +0 -76
  291. tomwer/core/test/test_lamino.py +0 -92
  292. tomwer/gui/reconstruction/lamino/__init__.py +0 -31
  293. tomwer/gui/reconstruction/lamino/tofu/TofuOptionLoader.py +0 -107
  294. tomwer/gui/reconstruction/lamino/tofu/__init__.py +0 -1
  295. tomwer/gui/reconstruction/lamino/tofu/misc.py +0 -148
  296. tomwer/gui/reconstruction/lamino/tofu/projections.py +0 -896
  297. tomwer/gui/reconstruction/lamino/tofu/settings.py +0 -75
  298. tomwer/gui/reconstruction/lamino/tofu/tofu.py +0 -432
  299. tomwer/gui/reconstruction/lamino/tofu/tofuexpert.py +0 -567
  300. tomwer/gui/reconstruction/lamino/tofu/tofuoutput.py +0 -760
  301. tomwer/gui/reconstruction/test/test_lamino.py +0 -189
  302. tomwer/resources/gui/icons/esrf_1.svg +0 -307
  303. tomwer/resources/gui/icons/lamino_parameters.svg +0 -70
  304. tomwer/resources/gui/icons/triangle.svg +0 -80
  305. tomwer/resources/gui/illustrations/lamino_angle.png +0 -0
  306. tomwer/resources/gui/illustrations/lamino_angle.svg +0 -509
  307. tomwer/resources/gui/illustrations/lamino_beta_angle.png +0 -0
  308. tomwer/resources/gui/illustrations/lamino_beta_angle.svg +0 -97
  309. tomwer/resources/gui/illustrations/lamino_theta_angle.png +0 -0
  310. tomwer/resources/gui/illustrations/lamino_theta_angle.svg +0 -368
  311. tomwer/resources/gui/illustrations/manual_slice.png +0 -0
  312. tomwer/resources/gui/illustrations/manual_slice.svg +0 -221
  313. tomwer/resources/gui/illustrations/psi_angle.png +0 -0
  314. tomwer/resources/gui/illustrations/psi_angle.svg +0 -479
  315. tomwer/resources/gui/illustrations/rotation_center.png +0 -0
  316. tomwer/resources/gui/illustrations/rotation_center.svg +0 -276
  317. tomwer/resources/gui/illustrations/slice_stack.png +0 -0
  318. tomwer/resources/gui/illustrations/slice_stack.svg +0 -266
  319. tomwer/resources/gui/illustrations/xy_slice.png +0 -0
  320. tomwer/resources/gui/illustrations/xy_slice.svg +0 -269
  321. tomwer/resources/gui/illustrations/xz_slice.png +0 -0
  322. tomwer/resources/gui/illustrations/xz_slice.svg +0 -270
  323. tomwer/resources/gui/illustrations/yz_slice.png +0 -0
  324. tomwer/resources/gui/illustrations/yz_slice.svg +0 -270
  325. tomwer/synctools/stacks/reconstruction/lamino.py +0 -233
  326. tomwer/synctools/test/test_scanstages.py +0 -162
  327. tomwer/tests/utils/__init__.py +0 -247
  328. tomwer/tests/utils/utilstest.py +0 -220
  329. tomwer-1.2.1-py3.11-nspkg.pth +0 -1
  330. /tomwer/core/process/control/{email.py → emailnotifier.py} +0 -0
  331. {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/LICENSE +0 -0
  332. {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/entry_points.txt +0 -0
  333. {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/namespace_packages.txt +0 -0
  334. {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/top_level.txt +0 -0
@@ -1,162 +0,0 @@
1
- # coding: utf-8
2
- # /*##########################################################################
3
- #
4
- # Copyright (c) 2017 European Synchrotron Radiation Facility
5
- #
6
- # Permission is hereby granted, free of charge, to any person obtaining a copy
7
- # of this software and associated documentation files (the "Software"), to deal
8
- # in the Software without restriction, including without limitation the rights
9
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
- # copies of the Software, and to permit persons to whom the Software is
11
- # furnished to do so, subject to the following conditions:
12
- #
13
- # The above copyright notice and this permission notice shall be included in
14
- # all copies or substantial portions of the Software.
15
- #
16
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
- # THE SOFTWARE.
23
- #
24
- # ###########################################################################*/
25
-
26
- __authors__ = ["H. Payno"]
27
- __license__ = "MIT"
28
- __date__ = "30/09/2019"
29
-
30
-
31
- import glob
32
- import os
33
- import shutil
34
- import tempfile
35
- import unittest
36
- from collections import namedtuple
37
-
38
- import pytest
39
-
40
- from tomwer.core.scan.scanfactory import ScanFactory
41
- from tomwer.synctools.utils.scanstages import ScanStages
42
- from tomwer.tests.utils import UtilsTest, skip_gui_test
43
-
44
- if skip_gui_test() is False:
45
- from tomwer.synctools.rsyncmanager import RSyncManager
46
-
47
-
48
- _stage_desc = namedtuple(
49
- "_stage_desc",
50
- [
51
- "n_par_file",
52
- "n_edf_file",
53
- "n_info_file",
54
- "n_xml_file",
55
- "n_vol",
56
- "folder_should_exists",
57
- ],
58
- ) # noqa
59
-
60
-
61
- @pytest.mark.skipif(RSyncManager().has_rsync() is False, reason="Rsync is missing")
62
- @pytest.mark.skipif(skip_gui_test(), reason="skip gui test")
63
- class TestScanStagesEDF(unittest.TestCase):
64
- """
65
- test the ScanStages class for edf scans
66
- """
67
-
68
- def setUp(self) -> None:
69
- self.output_dir = tempfile.mkdtemp()
70
- dataset = "D2_H2_T2_h_"
71
- self.data_test_dir = UtilsTest.getEDFDataset(dataset)
72
- self.target_dir = os.path.join(self.output_dir, dataset)
73
- self.scan_stages = ScanStages(
74
- scan=ScanFactory.create_scan_object(self.data_test_dir)
75
- )
76
-
77
- def tearDown(self) -> None:
78
- shutil.rmtree(self.output_dir)
79
-
80
- def testRSyncUntil(self):
81
- """test the rsync_until function"""
82
- ACQUI_NOT_STARTED = ScanStages.AcquisitionStage.ACQUI_NOT_STARTED
83
- # ACQUI_STARTED = ScanStages.AcquisitionStage.ACQUI_STARTED
84
- # ACQUI_ON_GOING = ScanStages.AcquisitionStage.ACQUI_ON_GOING
85
- # ACQUI_ENDED = ScanStages.AcquisitionStage.ACQUI_ENDED
86
- # RECONSTRUCTION_ADDED = ScanStages.AcquisitionStage.RECONSTRUCTION_ADDED
87
- # COMPLETE = ScanStages.AcquisitionStage.COMPLETE
88
-
89
- # tomo_n = 3605
90
- stage_res = {
91
- ACQUI_NOT_STARTED: _stage_desc(
92
- n_par_file=0,
93
- n_edf_file=0,
94
- n_info_file=0,
95
- n_xml_file=0,
96
- n_vol=0,
97
- folder_should_exists=False,
98
- ),
99
- # comment most of the test because take too long
100
- # ACQUI_STARTED: _stage_desc(
101
- # n_par_file=0,
102
- # n_edf_file=0,
103
- # n_info_file=1,
104
- # n_xml_file=0,
105
- # n_vol=0,
106
- # folder_should_exists=True,
107
- # ),
108
- # ACQUI_ON_GOING: _stage_desc(
109
- # n_par_file=0,
110
- # n_edf_file=tomo_n // 2,
111
- # n_info_file=1,
112
- # n_xml_file=0,
113
- # n_vol=0,
114
- # folder_should_exists=True,
115
- # ),
116
- # ACQUI_ENDED: _stage_desc(
117
- # n_par_file=0,
118
- # n_edf_file=tomo_n,
119
- # n_info_file=1,
120
- # n_xml_file=1,
121
- # n_vol=0,
122
- # folder_should_exists=True,
123
- # ),
124
- # RECONSTRUCTION_ADDED: _stage_desc(
125
- # n_par_file=6,
126
- # n_edf_file=tomo_n,
127
- # n_info_file=2,
128
- # n_xml_file=2,
129
- # n_vol=1,
130
- # folder_should_exists=True,
131
- # ),
132
- # COMPLETE: _stage_desc(
133
- # n_par_file=6,
134
- # n_edf_file=3719, # there is several ref, darks...
135
- # n_info_file=2,
136
- # n_xml_file=2,
137
- # n_vol=1,
138
- # folder_should_exists=True,
139
- # ),
140
- }
141
- for stage, th_results in stage_res.items():
142
- with self.subTest(stage=stage):
143
- self.scan_stages.rsync_until(stage=stage, dest_dir=self.output_dir)
144
- self.assertEqual(
145
- os.path.exists(self.target_dir), th_results.folder_should_exists
146
- )
147
- self.assertEqual(
148
- len(glob.glob(os.path.join(self.target_dir, "*.par"))),
149
- th_results.n_par_file,
150
- )
151
- self.assertEqual(
152
- len(glob.glob(os.path.join(self.target_dir, "*.edf"))),
153
- th_results.n_edf_file,
154
- )
155
- self.assertEqual(
156
- len(glob.glob(os.path.join(self.target_dir, "*.xml"))),
157
- th_results.n_xml_file,
158
- )
159
- self.assertEqual(
160
- len(glob.glob(os.path.join(self.target_dir, "*.vol"))),
161
- th_results.n_vol,
162
- )
@@ -1,247 +0,0 @@
1
- #!/usr/bin/python
2
- # coding: utf-8
3
- #
4
- # Project: Azimuthal integration
5
- # https://github.com/pyFAI/pyFAI
6
- #
7
- # Copyright (C) 2015 European Synchrotron Radiation Facility, Grenoble, France
8
- #
9
- # Principal author: Jérôme Kieffer (Jerome.Kieffer@ESRF.eu)
10
- #
11
- # Permission is hereby granted, free of charge, to any person obtaining a copy
12
- # of this software and associated documentation files (the "Software"), to deal
13
- # in the Software without restriction, including without limitation the rights
14
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15
- # copies of the Software, and to permit persons to whom the Software is
16
- # furnished to do so, subject to the following conditions:
17
- #
18
- # The above copyright notice and this permission notice shall be included in
19
- # all copies or substantial portions of the Software.
20
- #
21
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27
- # THE SOFTWARE.
28
-
29
-
30
- __doc__ = """test module for pyFAI."""
31
- __authors__ = ["Jérôme Kieffer", "Valentin Valls", "Henri Payno"]
32
- __license__ = "MIT"
33
- __copyright__ = "European Synchrotron Radiation Facility, Grenoble, France"
34
- __date__ = "07/02/2017"
35
-
36
- import fileinput
37
- import logging
38
- import os
39
- import shutil
40
-
41
- from tomwer.core.utils import DownloadDataset, url_base
42
-
43
- logger = logging.getLogger(__name__)
44
- logger.setLevel(logging.DEBUG)
45
-
46
-
47
- class UtilsTest(object):
48
- """
49
- Static class providing useful stuff for preparing tests.
50
- """
51
-
52
- timeout = 100 # timeout in seconds for downloading datasets.tar.bz2
53
-
54
- def __init__(self):
55
- self.installed = False
56
-
57
- @classmethod
58
- def dataDownloaded(cls, archive_folder, archive_file):
59
- return cls.dataIsHere(archive_folder=archive_folder) or cls.dataIsDownloaded(
60
- archive_file=archive_file
61
- )
62
-
63
- @classmethod
64
- def dataIsHere(cls, archive_folder):
65
- return os.path.isdir(archive_folder)
66
-
67
- @classmethod
68
- def dataIsDownloaded(cls, archive_file):
69
- return os.path.isfile(archive_file)
70
-
71
- @classmethod
72
- def getEDFDataset(cls, folderID):
73
- path = os.path.abspath(
74
- os.path.join(cls.getDatasets(name="edf_datasets"), folderID)
75
- )
76
- if os.path.isdir(path):
77
- return path
78
- else:
79
- raise RuntimeError("Coul'd find folder containing scan %s" % folderID)
80
-
81
- @classmethod
82
- def getH5Dataset(cls, folderID):
83
- path = os.path.abspath(
84
- os.path.join(cls.getDatasets(name="h5_datasets"), folderID)
85
- )
86
- if os.path.exists(path):
87
- return path
88
- else:
89
- raise RuntimeError("Coul'd find folder containing scan %s" % folderID)
90
-
91
- @classmethod
92
- def getBlissDataset(cls, folderID):
93
- path = os.path.abspath(
94
- os.path.join(cls.getDatasets(name="bliss_acq"), folderID)
95
- )
96
- if os.path.exists(path):
97
- return path
98
- else:
99
- raise RuntimeError("Coul'd find folder containing scan %s" % folderID)
100
-
101
- @classmethod
102
- def getRecDatasets(cls):
103
- path = os.path.abspath(
104
- cls.getDatasets(
105
- name="rec_HA-700_45.4_136keV_BM5_burrow_GSA-1-44_021_avg-2_"
106
- )
107
- )
108
- if os.path.exists(path):
109
- return path
110
- else:
111
- raise RuntimeError("Coul'd find folder containing rec")
112
-
113
- @classmethod
114
- def getOrangeTestFile(cls, folderID):
115
- path = os.path.abspath(os.path.join(cls.getOrangeTestFiles(), folderID))
116
- if os.path.isfile(path):
117
- return path
118
- else:
119
- raise RuntimeError("Coul'd find folder containing scan %s" % folderID)
120
-
121
- @classmethod
122
- def getOrangeTestFiles(cls):
123
- return cls.getDatasets(name="orangetestfiles")
124
-
125
- @classmethod
126
- def getOrangeExecTestFile(cls, folderID):
127
- path = os.path.abspath(os.path.join(cls.getOrangeExecTestFiles(), folderID))
128
- if os.path.isfile(path):
129
- return path
130
- else:
131
- raise RuntimeError("Coul'd find folder containing scan %s" % folderID)
132
-
133
- @classmethod
134
- def getOrangeExecTestFiles(cls):
135
- return cls.getDatasets(name="ows_test_exec")
136
-
137
- @classmethod
138
- def getDatasets(cls, name="datasets"):
139
- """
140
- Downloads the requested image from Forge.EPN-campus.eu
141
-
142
- @param: name of the image.
143
- For the RedMine forge, the filename contains a directory name that is removed
144
- @return: full path of the locally saved file
145
- """
146
- archive_file = name + ".tar.bz2"
147
- archive_folder = "".join((os.path.dirname(__file__), "/" + name + "/"))
148
- archive_file = os.path.join(archive_folder, archive_file)
149
-
150
- # download if needed
151
- if not cls.dataDownloaded(
152
- archive_folder=archive_folder, archive_file=archive_file
153
- ):
154
- DownloadDataset(
155
- dataset=os.path.basename(archive_file),
156
- output_folder=archive_folder,
157
- timeout=cls.timeout,
158
- )
159
-
160
- if not os.path.isfile(archive_file):
161
- raise RuntimeError(
162
- "Could not automatically download test images %s!\n"
163
- "If you are behind a firewall, please set both environment "
164
- "variable http_proxy and https_proxy. "
165
- "This even works under windows ! \n Otherwise please try "
166
- "to download the images manually from \n%s/%s"
167
- % (archive_file, url_base, archive_file)
168
- )
169
-
170
- # decompress if needed
171
- if os.path.isfile(archive_file):
172
- logger.info("decompressing %s." % archive_file)
173
- outdir = "".join((os.path.dirname(__file__)))
174
- shutil.unpack_archive(archive_file, extract_dir=outdir, format="bztar")
175
- os.remove(archive_file)
176
- else:
177
- logger.info("not trying to decompress it")
178
- return archive_folder
179
-
180
- @classmethod
181
- def hasInternalTest(cls, dataset):
182
- """
183
- The id of the internal test is to have some large scan accessible
184
- which are stored locally. This should be used only for unit test that
185
- can be skipped
186
- """
187
- if "TOMWER_ADDITIONAL_TESTS_DIR" not in os.environ:
188
- return False
189
- else:
190
- dir_ = os.path.join(os.environ["TOMWER_ADDITIONAL_TESTS_DIR"], dataset)
191
- return os.path.isdir(dir_)
192
-
193
- @classmethod
194
- def getInternalTestDir(cls, dataset):
195
- if cls.hasInternalTest(dataset) is False:
196
- return None
197
- else:
198
- return os.path.join(os.environ["TOMWER_ADDITIONAL_TESTS_DIR"], dataset)
199
-
200
-
201
- def rebaseParFile(filePath, scanOldPath, scanNewPath):
202
- """
203
- Change some variables on the oar file to rebase it like if it was acquire
204
- in scanNewPath and allow pyhst reconstruction.
205
- """
206
- assert os.path.isfile(filePath)
207
-
208
- with fileinput.FileInput(filePath, inplace=True, backup=".bak") as file:
209
- for line in file:
210
- print(line.replace(scanOldPath, scanNewPath))
211
-
212
-
213
- def rebaseAcquisition(src, dst):
214
- """Copy the acquisition from src to dst by changing the ID of the acquisition
215
- on all files and sub-folders"""
216
-
217
- def copyDir(_dirSrc, _dirDst, srcID, dstID):
218
- assert os.path.exists(_dirDst) is False
219
- os.makedirs(_dirDst)
220
- for _file in os.listdir(_dirSrc):
221
- _filePath = os.path.join(_dirSrc, _file)
222
- if os.path.isdir(_filePath):
223
- copyDir(
224
- _dirSrc=_filePath,
225
- _dirDst=os.path.join(_dirDst, _file.replace(srcID, dstID, 1)),
226
- srcID=srcID,
227
- dstID=dstID,
228
- )
229
- else:
230
- shutil.copyfile(
231
- src=_filePath,
232
- dst=os.path.join(_dirDst, _file.replace(srcID, dstID, 1)),
233
- )
234
-
235
- # cp folder then copy files
236
- assert os.path.isdir(src)
237
- srcID = os.path.basename(src)
238
- dstID = os.path.basename(dst)
239
- copyDir(_dirSrc=src, _dirDst=dst, srcID=srcID, dstID=dstID)
240
-
241
-
242
- def skip_gui_test():
243
- return os.environ.get("_TOMWER_NO_GUI_UNIT_TESTS", "False") == "True"
244
-
245
-
246
- def skip_orange_workflows_test():
247
- return os.environ.get("_TOMWER_NO_ORANGE_WORKFLOWS_UNIT_TESTS", "False") == "True"
@@ -1,220 +0,0 @@
1
- # coding: utf-8
2
- #
3
- # Copyright (C) 2012-2016 European Synchrotron Radiation Facility, Grenoble, France
4
- #
5
- # Principal author: Jérôme Kieffer (Jerome.Kieffer@ESRF.eu)
6
- #
7
- # Permission is hereby granted, free of charge, to any person obtaining a copy
8
- # of this software and associated documentation files (the "Software"), to deal
9
- # in the Software without restriction, including without limitation the rights
10
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
- # copies of the Software, and to permit persons to whom the Software is
12
- # furnished to do so, subject to the following conditions:
13
- #
14
- # The above copyright notice and this permission notice shall be included in
15
- # all copies or substantial portions of the Software.
16
- #
17
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
- # THE SOFTWARE.
24
- #
25
- "bunch of utility function/static classes to handle testing environment"
26
-
27
- __author__ = "Jérôme Kieffer"
28
- __contact__ = "jerome.kieffer@esrf.eu"
29
- __license__ = "MIT"
30
- __copyright__ = "European Synchrotron Radiation Facility, Grenoble, France"
31
- __date__ = "24/01/2018"
32
-
33
- import getpass
34
- import logging
35
- import os
36
- import shutil
37
- import sys
38
- import tempfile
39
- import threading
40
- import unittest
41
- from argparse import ArgumentParser
42
-
43
- from silx.resources import ExternalResources
44
-
45
- PACKAGE = "pyFAI"
46
- DATA_KEY = "PYFAI_DATA"
47
-
48
- logger = logging.getLogger(__name__)
49
-
50
- TEST_HOME = os.path.dirname(os.path.abspath(__file__))
51
-
52
-
53
- def copy(infile, outfile):
54
- "link or copy file according to the OS"
55
- if "link" in dir(os):
56
- os.link(infile, outfile)
57
- else:
58
- shutil.copy(infile, outfile)
59
-
60
-
61
- class TestContext(object):
62
- """
63
- Class providing useful stuff for preparing tests.
64
- """
65
-
66
- def __init__(self):
67
- self.options = None
68
- self.timeout = 60 # timeout in seconds for downloading images
69
- self.url_base = "http://ftp.edna-site.org/pyFAI/testimages"
70
- self.resources = ExternalResources(
71
- PACKAGE, timeout=self.timeout, env_key=DATA_KEY, url_base=self.url_base
72
- )
73
- self.sem = threading.Semaphore()
74
- self.recompiled = False
75
- self.reloaded = False
76
- self.name = PACKAGE
77
- self.script_dir = None
78
- self.installed = False
79
-
80
- self.download_images = self.resources.download_all
81
- self.getimage = self.resources.getfile
82
- self.low_mem = bool(os.environ.get("PYFAI_LOW_MEM"))
83
- self.opencl = bool(os.environ.get("PYFAI_OPENCL", True))
84
-
85
- self._tempdir = None
86
-
87
- def forceBuild(self, remove_first=True):
88
- """
89
- Force the recompilation of pyFAI
90
-
91
- Nonesense, kept for legacy reasons
92
- """
93
- return
94
-
95
- def get_options(self):
96
- """
97
- Parse the command line to analyse options ... returns options
98
- """
99
- if self.options is None:
100
- parser = ArgumentParser(usage="Tests for %s" % self.name)
101
- parser.add_argument(
102
- "-d",
103
- "--debug",
104
- dest="debug",
105
- help="run in debugging mode",
106
- default=False,
107
- action="store_true",
108
- )
109
- parser.add_argument(
110
- "-i",
111
- "--info",
112
- dest="info",
113
- help="run in more verbose mode ",
114
- default=False,
115
- action="store_true",
116
- )
117
- parser.add_argument(
118
- "-f",
119
- "--force",
120
- dest="force",
121
- help="force the build of the library",
122
- default=False,
123
- action="store_true",
124
- )
125
- parser.add_argument(
126
- "-r",
127
- "--really-force",
128
- dest="remove",
129
- help="remove existing build and force the build of the library",
130
- default=False,
131
- action="store_true",
132
- )
133
- parser.add_argument(dest="args", type=str, nargs="*")
134
- self.options = parser.parse_args([])
135
- return self.options
136
-
137
- def get_test_env(self):
138
- """
139
- Returns an associated environment with a working project.
140
- """
141
- env = dict((str(k), str(v)) for k, v in os.environ.items())
142
- env["PYTHONPATH"] = os.pathsep.join(sys.path)
143
- return env
144
-
145
- def script_path(self, script_name, module_name):
146
- """Returns the script path according to it's location"""
147
- if self.installed:
148
- script = self.get_installed_script_path(script_name)
149
- else:
150
- import importlib
151
-
152
- module = importlib.import_module(module_name)
153
- script = module.__file__
154
- return script
155
-
156
- def get_installed_script_path(self, script):
157
- """
158
- Returns the path of the executable and the associated environment
159
-
160
- In Windows, it checks availability of script using .py .bat, and .exe
161
- file extensions.
162
- """
163
- if sys.platform == "win32":
164
- available_extensions = [".py", ".bat", ".exe"]
165
- else:
166
- available_extensions = [""]
167
-
168
- paths = os.environ.get("PATH", "").split(os.pathsep)
169
- for base in paths:
170
- # clean up extra quotes from paths
171
- if base.startswith('"') and base.endswith('"'):
172
- base = base[1:-1]
173
- for file_extension in available_extensions:
174
- script_path = os.path.join(base, script + file_extension)
175
- print(script_path)
176
- if os.path.exists(script_path):
177
- # script found
178
- return script_path
179
- # script not found
180
- logger.warning("Script '%s' not found in paths: %s", script, ":".join(paths))
181
- script_path = script
182
- return script_path
183
-
184
- def _initialize_tmpdir(self):
185
- """Initialize the temporary directory"""
186
- if not self._tempdir:
187
- with self.sem:
188
- if not self._tempdir:
189
- self._tempdir = tempfile.mkdtemp(
190
- "_" + getpass.getuser(), self.name + "_"
191
- )
192
-
193
- @property
194
- def tempdir(self):
195
- if not self._tempdir:
196
- self._initialize_tmpdir()
197
- return self._tempdir
198
-
199
- def clean_up(self):
200
- """Removes the temporary directory (and all its content !)"""
201
- with self.sem:
202
- if not self._tempdir:
203
- return
204
- if not os.path.isdir(self._tempdir):
205
- return
206
- for root, dirs, files in os.walk(self._tempdir, topdown=False):
207
- for name in files:
208
- os.remove(os.path.join(root, name))
209
- for name in dirs:
210
- os.rmdir(os.path.join(root, name))
211
- os.rmdir(self._tempdir)
212
- self._tempdir = None
213
-
214
-
215
- UtilsTest = TestContext()
216
- """Singleton containing util context of whole the tests"""
217
-
218
-
219
- class ParametricTestCase(unittest.TestCase):
220
- pass
@@ -1 +0,0 @@
1
- import sys, types, os;has_mfs = sys.version_info > (3, 5);p = os.path.join(sys._getframe(1).f_locals['sitedir'], *('orangecontrib',));importlib = has_mfs and __import__('importlib.util');has_mfs and __import__('importlib.machinery');m = has_mfs and sys.modules.setdefault('orangecontrib', importlib.util.module_from_spec(importlib.machinery.PathFinder.find_spec('orangecontrib', [os.path.dirname(p)])));m = m or sys.modules.setdefault('orangecontrib', types.ModuleType('orangecontrib'));mp = (m or []) and m.__dict__.setdefault('__path__',[]);(p not in mp) and mp.append(p)