tomwer 1.2.9__py3-none-any.whl → 1.3.0a0__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 (253) hide show
  1. orangecontrib/tomwer/tutorials/icat_publication.ows +58 -0
  2. orangecontrib/tomwer/widgets/__init__.py +1 -0
  3. orangecontrib/tomwer/widgets/control/DataDiscoveryOW.py +2 -2
  4. orangecontrib/tomwer/widgets/control/DataListOW.py +9 -7
  5. orangecontrib/tomwer/widgets/control/DataSelectorOW.py +21 -10
  6. orangecontrib/tomwer/widgets/control/EDF2NXTomomillOW.py +11 -5
  7. orangecontrib/tomwer/widgets/control/EmailOW.py +4 -4
  8. orangecontrib/tomwer/widgets/control/NXTomomillOW.py +31 -18
  9. orangecontrib/tomwer/widgets/control/NXtomoConcatenate.py +14 -7
  10. orangecontrib/tomwer/widgets/control/NotifierOW.py +1 -0
  11. orangecontrib/tomwer/widgets/control/VolumeSelector.py +7 -4
  12. orangecontrib/tomwer/widgets/control/VolumeSymLinkOW.py +182 -182
  13. orangecontrib/tomwer/widgets/debugtools/DatasetGeneratorOW.py +4 -4
  14. orangecontrib/tomwer/widgets/edit/DarkFlatPatchOW.py +4 -4
  15. orangecontrib/tomwer/widgets/edit/ImageKeyEditorOW.py +3 -3
  16. orangecontrib/tomwer/widgets/edit/ImageKeyUpgraderOW.py +2 -0
  17. orangecontrib/tomwer/widgets/edit/NXtomoEditorOW.py +3 -3
  18. orangecontrib/tomwer/widgets/edit/test/test_nxtomo_editor.py +3 -3
  19. orangecontrib/tomwer/widgets/icat/PublishProcessedDataOW.py +115 -0
  20. orangecontrib/tomwer/widgets/icat/RawDataScreenshotCreatorOW.py +98 -0
  21. orangecontrib/tomwer/widgets/icat/SaveToGalleryAndPublishOW.py +129 -0
  22. orangecontrib/tomwer/widgets/icat/__init__.py +13 -0
  23. orangecontrib/tomwer/widgets/icat/icons/add_gallery.png +0 -0
  24. orangecontrib/tomwer/widgets/icat/icons/add_gallery.svg +82 -0
  25. orangecontrib/tomwer/widgets/icat/icons/publish_processed_data.png +0 -0
  26. orangecontrib/tomwer/widgets/icat/icons/publish_processed_data.svg +95 -0
  27. orangecontrib/tomwer/widgets/icat/icons/raw_screenshots.png +0 -0
  28. orangecontrib/tomwer/widgets/icat/icons/raw_screenshots.svg +143 -0
  29. orangecontrib/tomwer/widgets/icons/tomwer_data_portal.png +0 -0
  30. orangecontrib/tomwer/widgets/icons/tomwer_data_portal.svg +76 -0
  31. orangecontrib/tomwer/widgets/reconstruction/AxisOW.py +9 -8
  32. orangecontrib/tomwer/widgets/reconstruction/CastNabuVolumeOW.py +3 -3
  33. orangecontrib/tomwer/widgets/reconstruction/NabuHelicalPrepareWeightsDoubleOW.py +179 -169
  34. orangecontrib/tomwer/widgets/reconstruction/NabuOW.py +23 -0
  35. orangecontrib/tomwer/widgets/reconstruction/NabuVolumeOW.py +39 -5
  36. orangecontrib/tomwer/widgets/reconstruction/SAAxisOW.py +7 -13
  37. orangecontrib/tomwer/widgets/reconstruction/SADeltaBetaOW.py +7 -17
  38. orangecontrib/tomwer/widgets/reconstruction/SinoNormOW.py +3 -4
  39. orangecontrib/tomwer/widgets/visualization/LivesliceOW.py +1 -1
  40. orangecontrib/tomwer/widgets/visualization/NXtomoMetadataViewerOW.py +3 -3
  41. orangecontrib/tomwer/widgets/visualization/VolumeViewerOW.py +3 -29
  42. tomwer/__main__.py +11 -58
  43. tomwer/app/canvas.py +8 -0
  44. tomwer/app/canvas_launcher/config.py +13 -11
  45. tomwer/app/darkref.py +1 -1
  46. tomwer/app/darkrefpatch.py +1 -1
  47. tomwer/app/imagekeyeditor.py +5 -5
  48. tomwer/app/imagekeyupgrader.py +5 -5
  49. tomwer/app/intensitynormalization.py +2 -2
  50. tomwer/app/radiostack.py +2 -2
  51. tomwer/app/zstitching.py +74 -3
  52. tomwer/core/cluster/cluster.py +26 -0
  53. tomwer/core/log/logger.py +7 -5
  54. tomwer/core/process/conditions/filters.py +1 -1
  55. tomwer/core/process/control/datalistener/datalistener.py +3 -3
  56. tomwer/core/process/control/nxtomoconcatenate.py +13 -13
  57. tomwer/core/process/control/nxtomomill.py +83 -25
  58. tomwer/core/process/control/scantransfer.py +11 -10
  59. tomwer/core/process/control/scanvalidator.py +3 -2
  60. tomwer/core/process/control/test/test_concatenate_nxtomos.py +9 -9
  61. tomwer/core/process/control/test/test_email.py +4 -4
  62. tomwer/core/process/control/test/test_h52nx_process.py +59 -7
  63. tomwer/core/process/control/test/test_volume_link.py +64 -64
  64. tomwer/core/process/control/timer.py +1 -1
  65. tomwer/core/process/control/volumesymlink.py +200 -200
  66. tomwer/core/process/edit/darkflatpatch.py +6 -6
  67. tomwer/core/process/edit/imagekeyeditor.py +17 -18
  68. tomwer/core/process/icat/__init__.py +0 -0
  69. tomwer/core/process/icat/createscreenshots.py +100 -0
  70. tomwer/core/process/icat/gallery.py +377 -0
  71. tomwer/core/process/icat/icatbase.py +36 -0
  72. tomwer/core/process/icat/publish.py +228 -0
  73. tomwer/core/process/icat/screenshots.py +26 -0
  74. tomwer/core/process/output.py +52 -0
  75. tomwer/core/process/reconstruction/axis/axis.py +17 -10
  76. tomwer/core/process/reconstruction/axis/mode.py +4 -0
  77. tomwer/core/process/reconstruction/axis/params.py +9 -4
  78. tomwer/core/process/reconstruction/darkref/darkrefs.py +8 -6
  79. tomwer/core/process/reconstruction/darkref/darkrefscopy.py +1 -1
  80. tomwer/core/process/reconstruction/darkref/params.py +1 -1
  81. tomwer/core/process/reconstruction/lamino/tofu.py +4 -4
  82. tomwer/core/process/reconstruction/nabu/castvolume.py +1 -1
  83. tomwer/core/process/reconstruction/nabu/helical.py +9 -5
  84. tomwer/core/process/reconstruction/nabu/nabucommon.py +32 -62
  85. tomwer/core/process/reconstruction/nabu/nabuscores.py +387 -61
  86. tomwer/core/process/reconstruction/nabu/nabuslices.py +33 -21
  87. tomwer/core/process/reconstruction/nabu/nabuvolume.py +37 -14
  88. tomwer/core/process/reconstruction/nabu/settings.py +2 -2
  89. tomwer/core/process/reconstruction/nabu/utils.py +129 -24
  90. tomwer/core/process/reconstruction/output.py +108 -0
  91. tomwer/core/process/reconstruction/saaxis/saaxis.py +233 -263
  92. tomwer/core/process/reconstruction/sadeltabeta/sadeltabeta.py +140 -86
  93. tomwer/core/process/reconstruction/scores/params.py +4 -1
  94. tomwer/core/process/reconstruction/scores/scores.py +13 -0
  95. tomwer/core/process/reconstruction/test/test_axis_params.py +2 -2
  96. tomwer/core/process/reconstruction/test/test_darkref.py +3 -3
  97. tomwer/core/process/reconstruction/test/test_darkref_copy.py +3 -3
  98. tomwer/core/process/reconstruction/test/test_saaxis.py +3 -4
  99. tomwer/core/process/reconstruction/test/test_sadeltabeta.py +2 -2
  100. tomwer/core/process/stitching/nabustitcher.py +2 -2
  101. tomwer/core/process/test/test_axis.py +6 -6
  102. tomwer/core/process/test/test_dark_and_flat.py +10 -7
  103. tomwer/core/process/test/test_data_transfer.py +7 -6
  104. tomwer/core/process/test/test_nabu.py +4 -4
  105. tomwer/core/process/test/test_normalization.py +2 -2
  106. tomwer/core/scan/edfscan.py +4 -1
  107. tomwer/core/scan/hdf5scan.py +19 -500
  108. tomwer/core/scan/nxtomoscan.py +532 -0
  109. tomwer/core/scan/scanbase.py +42 -20
  110. tomwer/core/scan/scanfactory.py +13 -13
  111. tomwer/core/scan/test/test_future_scan.py +2 -2
  112. tomwer/core/scan/test/test_h5.py +12 -10
  113. tomwer/core/scan/test/test_process_registration.py +2 -2
  114. tomwer/core/scan/test/test_scan.py +4 -3
  115. tomwer/core/settings.py +20 -0
  116. tomwer/core/test/test_scanutils.py +8 -7
  117. tomwer/core/test/test_utils.py +33 -26
  118. tomwer/core/utils/__init__.py +0 -466
  119. tomwer/core/utils/deprecation.py +1 -1
  120. tomwer/core/utils/dictutils.py +14 -0
  121. tomwer/core/utils/lbsram.py +35 -0
  122. tomwer/core/utils/nxtomoutils.py +1 -1
  123. tomwer/core/utils/scanutils.py +6 -6
  124. tomwer/core/utils/spec.py +263 -0
  125. tomwer/core/volume/volumefactory.py +2 -2
  126. tomwer/gui/cluster/slurm.py +260 -60
  127. tomwer/gui/cluster/test/test_cluster.py +13 -0
  128. tomwer/gui/cluster/test/test_supervisor.py +2 -2
  129. tomwer/gui/configuration/__init__.py +0 -0
  130. tomwer/gui/{reconstruction/nabu → configuration}/action.py +1 -32
  131. tomwer/gui/configuration/level.py +22 -0
  132. tomwer/gui/control/actions.py +54 -0
  133. tomwer/gui/control/datalist.py +78 -16
  134. tomwer/gui/control/datalistener.py +4 -16
  135. tomwer/gui/control/{email.py → emailnotifier.py} +9 -18
  136. tomwer/gui/control/history.py +2 -2
  137. tomwer/gui/control/observations.py +2 -2
  138. tomwer/gui/control/reducedarkflatselector.py +1 -1
  139. tomwer/gui/control/selectorwidgetbase.py +36 -9
  140. tomwer/gui/control/serie/seriecreator.py +5 -22
  141. tomwer/gui/control/test/test_email.py +1 -1
  142. tomwer/gui/control/test/test_scanvalidator.py +6 -5
  143. tomwer/gui/control/test/test_single_tomo_obj.py +2 -2
  144. tomwer/gui/control/tomoobjdisplaymode.py +8 -0
  145. tomwer/gui/debugtools/datasetgenerator.py +3 -3
  146. tomwer/gui/edit/dkrfpatch.py +16 -22
  147. tomwer/gui/edit/imagekeyeditor.py +8 -11
  148. tomwer/gui/edit/nxtomoeditor.py +111 -44
  149. tomwer/gui/edit/nxtomowarmer.py +4 -4
  150. tomwer/gui/edit/test/test_dkrf_patch.py +7 -7
  151. tomwer/gui/edit/test/test_image_key_editor.py +3 -3
  152. tomwer/gui/edit/test/test_nx_editor.py +40 -16
  153. tomwer/gui/icat/__init__.py +0 -0
  154. tomwer/gui/icat/createscreenshots.py +80 -0
  155. tomwer/gui/icat/gallery.py +214 -0
  156. tomwer/gui/icat/publish.py +187 -0
  157. tomwer/gui/reconstruction/axis/axis.py +171 -57
  158. tomwer/gui/reconstruction/axis/radioaxis.py +80 -95
  159. tomwer/gui/reconstruction/darkref/darkrefcopywidget.py +3 -2
  160. tomwer/gui/reconstruction/lamino/tofu/projections.py +1 -1
  161. tomwer/gui/reconstruction/lamino/tofu/tofuoutput.py +3 -6
  162. tomwer/gui/reconstruction/nabu/castvolume.py +1 -1
  163. tomwer/gui/reconstruction/nabu/check.py +9 -9
  164. tomwer/gui/reconstruction/nabu/helical.py +29 -12
  165. tomwer/gui/reconstruction/nabu/nabuconfig/base.py +2 -4
  166. tomwer/gui/reconstruction/nabu/nabuconfig/output.py +110 -33
  167. tomwer/gui/reconstruction/nabu/nabuconfig/phase.py +9 -12
  168. tomwer/gui/reconstruction/nabu/nabuconfig/preprocessing.py +219 -29
  169. tomwer/gui/reconstruction/nabu/nabuconfig/reconstruction.py +3 -6
  170. tomwer/gui/reconstruction/nabu/nabuflow.py +12 -20
  171. tomwer/gui/reconstruction/nabu/slices.py +6 -7
  172. tomwer/gui/reconstruction/nabu/volume.py +22 -10
  173. tomwer/gui/reconstruction/normalization/intensity.py +15 -23
  174. tomwer/gui/reconstruction/saaxis/corrangeselector.py +7 -23
  175. tomwer/gui/reconstruction/saaxis/dimensionwidget.py +1 -1
  176. tomwer/gui/reconstruction/saaxis/saaxis.py +7 -9
  177. tomwer/gui/reconstruction/sadeltabeta/saadeltabeta.py +2 -1
  178. tomwer/gui/reconstruction/scores/control.py +2 -9
  179. tomwer/gui/reconstruction/scores/scoreplot.py +11 -5
  180. tomwer/gui/reconstruction/test/test_axis.py +23 -12
  181. tomwer/gui/reconstruction/test/test_lamino.py +8 -3
  182. tomwer/gui/reconstruction/test/test_nabu.py +28 -9
  183. tomwer/gui/reconstruction/test/test_saaxis.py +3 -3
  184. tomwer/gui/reconstruction/test/test_sadeltabeta.py +2 -2
  185. tomwer/gui/settings.py +5 -28
  186. tomwer/gui/stackplot.py +2 -5
  187. tomwer/gui/stitching/action.py +49 -0
  188. tomwer/gui/stitching/config/axisparams.py +7 -24
  189. tomwer/gui/stitching/config/output.py +10 -8
  190. tomwer/gui/stitching/config/positionoveraxis.py +22 -23
  191. tomwer/gui/stitching/normalization.py +117 -0
  192. tomwer/gui/stitching/stitchandbackground.py +4 -6
  193. tomwer/gui/stitching/stitching.py +265 -43
  194. tomwer/gui/stitching/stitching_preview.py +62 -5
  195. tomwer/gui/stitching/stitching_raw.py +2 -5
  196. tomwer/gui/stitching/z_stitching/fineestimation.py +0 -60
  197. tomwer/gui/utils/buttons.py +112 -29
  198. tomwer/gui/utils/inputwidget.py +33 -25
  199. tomwer/gui/utils/scandescription.py +4 -0
  200. tomwer/gui/utils/step.py +144 -0
  201. tomwer/gui/utils/unitsystem.py +2 -5
  202. tomwer/gui/utils/vignettes.py +176 -15
  203. tomwer/gui/visualization/dataviewer.py +1 -4
  204. tomwer/gui/visualization/diffviewer/diffviewer.py +7 -16
  205. tomwer/gui/visualization/diffviewer/shiftwidget.py +2 -5
  206. tomwer/gui/visualization/scanoverview.py +1 -1
  207. tomwer/gui/visualization/sinogramviewer.py +1 -10
  208. tomwer/gui/visualization/test/test_diffviewer.py +3 -3
  209. tomwer/gui/visualization/test/test_nx_tomo_metadata_viewer.py +4 -4
  210. tomwer/gui/visualization/test/test_sinogramviewer.py +2 -2
  211. tomwer/gui/visualization/test/test_stacks.py +3 -3
  212. tomwer/gui/visualization/test/test_volumeviewer.py +2 -2
  213. tomwer/io/utils/raw_and_processed_data.py +84 -0
  214. tomwer/io/utils/tomoobj.py +4 -6
  215. tomwer/resources/gui/icons/ruler.png +0 -0
  216. tomwer/resources/gui/icons/ruler.svg +273 -0
  217. tomwer/resources/gui/icons/short_description.png +0 -0
  218. tomwer/resources/gui/icons/short_description.svg +58 -0
  219. tomwer/resources/gui/icons/url.png +0 -0
  220. tomwer/resources/gui/icons/url.svg +58 -0
  221. tomwer/synctools/stacks/edit/darkflatpatch.py +2 -2
  222. tomwer/synctools/stacks/edit/imagekeyeditor.py +2 -2
  223. tomwer/synctools/stacks/reconstruction/axis.py +4 -4
  224. tomwer/synctools/stacks/reconstruction/castvolume.py +2 -2
  225. tomwer/synctools/stacks/reconstruction/dkrefcopy.py +4 -10
  226. tomwer/synctools/stacks/reconstruction/nabu.py +2 -2
  227. tomwer/synctools/stacks/reconstruction/normalization.py +2 -2
  228. tomwer/synctools/stacks/reconstruction/saaxis.py +2 -2
  229. tomwer/synctools/stacks/reconstruction/sadeltabeta.py +2 -2
  230. tomwer/synctools/test/test_darkRefs.py +7 -58
  231. tomwer/synctools/test/test_foldertransfer.py +6 -6
  232. tomwer/synctools/utils/scanstages.py +6 -6
  233. tomwer/tests/conftest.py +34 -0
  234. tomwer/tests/datasets.py +13 -0
  235. tomwer/tests/test_scripts.py +92 -39
  236. tomwer/tests/utils.py +5 -0
  237. tomwer/version.py +3 -3
  238. {tomwer-1.2.9.dist-info → tomwer-1.3.0a0.dist-info}/METADATA +39 -39
  239. {tomwer-1.2.9.dist-info → tomwer-1.3.0a0.dist-info}/RECORD +248 -209
  240. tomwer/resources/gui/icons/esrf_1.svg +0 -307
  241. tomwer/resources/gui/icons/triangle.svg +0 -80
  242. tomwer/synctools/test/test_scanstages.py +0 -162
  243. tomwer/tests/utils/__init__.py +0 -247
  244. tomwer/tests/utils/utilstest.py +0 -220
  245. /tomwer/app/{saaxis.py → multicor.py} +0 -0
  246. /tomwer/app/{sadeltabeta.py → multipag.py} +0 -0
  247. /tomwer/core/process/control/{email.py → emailnotifier.py} +0 -0
  248. /tomwer-1.2.9-py3.11-nspkg.pth → /tomwer-1.3.0a0-py3.11-nspkg.pth +0 -0
  249. {tomwer-1.2.9.dist-info → tomwer-1.3.0a0.dist-info}/LICENSE +0 -0
  250. {tomwer-1.2.9.dist-info → tomwer-1.3.0a0.dist-info}/WHEEL +0 -0
  251. {tomwer-1.2.9.dist-info → tomwer-1.3.0a0.dist-info}/entry_points.txt +0 -0
  252. {tomwer-1.2.9.dist-info → tomwer-1.3.0a0.dist-info}/namespace_packages.txt +0 -0
  253. {tomwer-1.2.9.dist-info → tomwer-1.3.0a0.dist-info}/top_level.txt +0 -0
@@ -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
File without changes
File without changes