scipion-pyworkflow 3.11.0__py3-none-any.whl → 3.11.2__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 (104) hide show
  1. pyworkflow/apps/__init__.py +29 -0
  2. pyworkflow/apps/pw_manager.py +37 -0
  3. pyworkflow/apps/pw_plot.py +51 -0
  4. pyworkflow/apps/pw_project.py +130 -0
  5. pyworkflow/apps/pw_protocol_list.py +143 -0
  6. pyworkflow/apps/pw_protocol_run.py +51 -0
  7. pyworkflow/apps/pw_run_tests.py +268 -0
  8. pyworkflow/apps/pw_schedule_run.py +322 -0
  9. pyworkflow/apps/pw_sleep.py +37 -0
  10. pyworkflow/apps/pw_sync_data.py +440 -0
  11. pyworkflow/apps/pw_viewer.py +78 -0
  12. pyworkflow/constants.py +1 -1
  13. pyworkflow/gui/__init__.py +36 -0
  14. pyworkflow/gui/browser.py +768 -0
  15. pyworkflow/gui/canvas.py +1190 -0
  16. pyworkflow/gui/dialog.py +981 -0
  17. pyworkflow/gui/form.py +2727 -0
  18. pyworkflow/gui/graph.py +247 -0
  19. pyworkflow/gui/graph_layout.py +271 -0
  20. pyworkflow/gui/gui.py +571 -0
  21. pyworkflow/gui/matplotlib_image.py +233 -0
  22. pyworkflow/gui/plotter.py +247 -0
  23. pyworkflow/gui/project/__init__.py +25 -0
  24. pyworkflow/gui/project/base.py +193 -0
  25. pyworkflow/gui/project/constants.py +139 -0
  26. pyworkflow/gui/project/labels.py +205 -0
  27. pyworkflow/gui/project/project.py +491 -0
  28. pyworkflow/gui/project/searchprotocol.py +240 -0
  29. pyworkflow/gui/project/searchrun.py +181 -0
  30. pyworkflow/gui/project/steps.py +171 -0
  31. pyworkflow/gui/project/utils.py +332 -0
  32. pyworkflow/gui/project/variables.py +179 -0
  33. pyworkflow/gui/project/viewdata.py +472 -0
  34. pyworkflow/gui/project/viewprojects.py +519 -0
  35. pyworkflow/gui/project/viewprotocols.py +2141 -0
  36. pyworkflow/gui/project/viewprotocols_extra.py +562 -0
  37. pyworkflow/gui/text.py +774 -0
  38. pyworkflow/gui/tooltip.py +185 -0
  39. pyworkflow/gui/tree.py +684 -0
  40. pyworkflow/gui/widgets.py +307 -0
  41. pyworkflow/mapper/__init__.py +26 -0
  42. pyworkflow/mapper/mapper.py +226 -0
  43. pyworkflow/mapper/sqlite.py +1583 -0
  44. pyworkflow/mapper/sqlite_db.py +145 -0
  45. pyworkflow/object.py +1 -0
  46. pyworkflow/plugin.py +4 -4
  47. pyworkflow/project/__init__.py +31 -0
  48. pyworkflow/project/config.py +454 -0
  49. pyworkflow/project/manager.py +180 -0
  50. pyworkflow/project/project.py +2095 -0
  51. pyworkflow/project/usage.py +165 -0
  52. pyworkflow/protocol/__init__.py +38 -0
  53. pyworkflow/protocol/bibtex.py +48 -0
  54. pyworkflow/protocol/constants.py +87 -0
  55. pyworkflow/protocol/executor.py +515 -0
  56. pyworkflow/protocol/hosts.py +318 -0
  57. pyworkflow/protocol/launch.py +277 -0
  58. pyworkflow/protocol/package.py +42 -0
  59. pyworkflow/protocol/params.py +781 -0
  60. pyworkflow/protocol/protocol.py +2712 -0
  61. pyworkflow/resources/protlabels.xcf +0 -0
  62. pyworkflow/resources/sprites.png +0 -0
  63. pyworkflow/resources/sprites.xcf +0 -0
  64. pyworkflow/template.py +1 -1
  65. pyworkflow/tests/__init__.py +29 -0
  66. pyworkflow/tests/test_utils.py +25 -0
  67. pyworkflow/tests/tests.py +342 -0
  68. pyworkflow/utils/__init__.py +38 -0
  69. pyworkflow/utils/dataset.py +414 -0
  70. pyworkflow/utils/echo.py +104 -0
  71. pyworkflow/utils/graph.py +169 -0
  72. pyworkflow/utils/log.py +293 -0
  73. pyworkflow/utils/path.py +528 -0
  74. pyworkflow/utils/process.py +154 -0
  75. pyworkflow/utils/profiler.py +92 -0
  76. pyworkflow/utils/progressbar.py +154 -0
  77. pyworkflow/utils/properties.py +618 -0
  78. pyworkflow/utils/reflection.py +129 -0
  79. pyworkflow/utils/utils.py +880 -0
  80. pyworkflow/utils/which.py +229 -0
  81. pyworkflow/webservices/__init__.py +8 -0
  82. pyworkflow/webservices/config.py +8 -0
  83. pyworkflow/webservices/notifier.py +152 -0
  84. pyworkflow/webservices/repository.py +59 -0
  85. pyworkflow/webservices/workflowhub.py +86 -0
  86. pyworkflowtests/tests/__init__.py +0 -0
  87. pyworkflowtests/tests/test_canvas.py +72 -0
  88. pyworkflowtests/tests/test_domain.py +45 -0
  89. pyworkflowtests/tests/test_logs.py +74 -0
  90. pyworkflowtests/tests/test_mappers.py +392 -0
  91. pyworkflowtests/tests/test_object.py +507 -0
  92. pyworkflowtests/tests/test_project.py +42 -0
  93. pyworkflowtests/tests/test_protocol_execution.py +146 -0
  94. pyworkflowtests/tests/test_protocol_export.py +78 -0
  95. pyworkflowtests/tests/test_protocol_output.py +158 -0
  96. pyworkflowtests/tests/test_streaming.py +47 -0
  97. pyworkflowtests/tests/test_utils.py +210 -0
  98. {scipion_pyworkflow-3.11.0.dist-info → scipion_pyworkflow-3.11.2.dist-info}/METADATA +2 -2
  99. scipion_pyworkflow-3.11.2.dist-info/RECORD +162 -0
  100. scipion_pyworkflow-3.11.0.dist-info/RECORD +0 -71
  101. {scipion_pyworkflow-3.11.0.dist-info → scipion_pyworkflow-3.11.2.dist-info}/WHEEL +0 -0
  102. {scipion_pyworkflow-3.11.0.dist-info → scipion_pyworkflow-3.11.2.dist-info}/entry_points.txt +0 -0
  103. {scipion_pyworkflow-3.11.0.dist-info → scipion_pyworkflow-3.11.2.dist-info}/licenses/LICENSE.txt +0 -0
  104. {scipion_pyworkflow-3.11.0.dist-info → scipion_pyworkflow-3.11.2.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,78 @@
1
+ # **************************************************************************
2
+ # *
3
+ # * Authors: Pablo Conesa (pconesa@cnb.csic.es)
4
+ # *
5
+ # * Unidad de Bioinformatica of Centro Nacional de Biotecnologia , CSIC
6
+ # *
7
+ # * This program is free software; you can redistribute it and/or modify
8
+ # * it under the terms of the GNU General Public License as published by
9
+ # * the Free Software Foundation; either version 3 of the License, or
10
+ # * (at your option) any later version.
11
+ # *
12
+ # * This program is distributed in the hope that it will be useful,
13
+ # * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # * GNU General Public License for more details.
16
+ # *
17
+ # * You should have received a copy of the GNU General Public License
18
+ # * along with this program; if not, write to the Free Software
19
+ # * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
20
+ # * 02111-1307 USA
21
+ # *
22
+ # * All comments concerning this program package may be sent to the
23
+ # * e-mail address 'scipion@cnb.csic.es'
24
+ # *
25
+ # **************************************************************************
26
+ """ Module to test json exporting options"""
27
+ # from pyworkflow.em import Pointer, ProtMultiPointerTest
28
+ # from pyworkflow.object import PointerList, String
29
+ # from tests import *
30
+ #
31
+ # MY_OUTPUT = "myOutput"
32
+
33
+ # TODO: Check if some tests from pwem/protocol/protocol_tests can be moved here
34
+ # class TestProtocolExport(BaseTest):
35
+ #
36
+ # @classmethod
37
+ # def setUpClass(cls):
38
+ # setupTestProject(cls)
39
+ #
40
+ # def test_exportMultiPointerToSets(self):
41
+ # """Test how multipointers to are exported and imported"""
42
+ #
43
+ # protMpOutput = self.newProtocol(ProtMultiPointerTest,
44
+ # objLabel='multipointer for output')
45
+ #
46
+ # protMpOutput._defineOutputs(**{MY_OUTPUT: String("hola!")})
47
+ # self.saveProtocol(protMpOutput)
48
+ #
49
+ # # Add multiPointers with extended
50
+ # plWithExtended = PointerList()
51
+ # plWithExtended.append(Pointer(protMpOutput, extended=MY_OUTPUT))
52
+ #
53
+ # protMp = self.newProtocol(ProtMultiPointerTest,
54
+ # objLabel='multipointer with extended export to json',
55
+ # mpToAttr=plWithExtended)
56
+ #
57
+ # self.saveProtocol(protMp)
58
+ # # Trigger the refresh of the runsGraph!!
59
+ # self.proj._runsGraph = None
60
+ #
61
+ # protDict = self.proj.getProtocolsDict()
62
+ #
63
+ # # Get the multipointer params items for the second prot
64
+ # # Get the second prot
65
+ # # This has the shape of : (33, OrderedDict([('object.className', 'ProtMultiPointerTest'), ...) ])
66
+ # ndProtAttrs = protDict[protMp.getObjId()]
67
+ #
68
+ # # Look for the mpToAttr
69
+ # for key, value in ndProtAttrs.items():
70
+ #
71
+ # if key == "mpToAttr":
72
+ # self.assertEqual(1, len(value),
73
+ # "multipointer param items exceeds the "
74
+ # "expected number of items")
75
+ # self.assertEqual("%s.%s" % (protMpOutput.getObjId(), MY_OUTPUT),
76
+ # value[0],
77
+ # "Multipointer item value %s seems to be wrong."
78
+ # % value[0])
@@ -0,0 +1,158 @@
1
+ # **************************************************************************
2
+ # *
3
+ # * Authors: Pablo Conesa (pconesa@cnb.csic.es) [1]
4
+ # * J.M. De la Rosa Trevin (delarosatrevin@scilifelab.se) [2]
5
+ # *
6
+ # * [1] Unidad de Bioinformatica of Centro Nacional de Biotecnologia , CSIC
7
+ # * [2] SciLifeLab, Stockholm University
8
+ # *
9
+ # * This program is free software; you can redistribute it and/or modify
10
+ # * it under the terms of the GNU General Public License as published by
11
+ # * the Free Software Foundation; either version 3 of the License, or
12
+ # * (at your option) any later version.
13
+ # *
14
+ # * This program is distributed in the hope that it will be useful,
15
+ # * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ # * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
+ # * GNU General Public License for more details.
18
+ # *
19
+ # * You should have received a copy of the GNU General Public License
20
+ # * along with this program; if not, write to the Free Software
21
+ # * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
22
+ # * 02111-1307 USA
23
+ # *
24
+ # * All comments concerning this program package may be sent to the
25
+ # * e-mail address 'scipion@cnb.csic.es'
26
+ # *
27
+ # **************************************************************************
28
+ import os
29
+
30
+ import pyworkflow as pw
31
+ import pyworkflow.object as pwobj
32
+ import pyworkflow.tests as pwtests
33
+ import pyworkflow.mapper as pwmapper
34
+ import pyworkflow.protocol as pwprot
35
+ from pyworkflow.project import Project
36
+ from pyworkflowtests.protocols import ProtOutputTest
37
+ from pyworkflowtests import Domain, MockObject
38
+
39
+
40
+ # Protocol to output of basic scipion objects
41
+ class TestProtocolOutputs(pwtests.BaseTest):
42
+ @classmethod
43
+ def setUpClass(cls):
44
+ pwtests.setupTestProject(cls, writeLocalConfig=True)
45
+ pwtests.setupTestOutput(cls)
46
+
47
+ # Set the application domain
48
+ pw.Config.setDomain("pyworkflowtests")
49
+
50
+ def test_basicObjectOutput(self):
51
+ """Test the list with several Complex"""
52
+ fn = self.getOutputPath("protocol.sqlite")
53
+
54
+ # Discover objects and protocols
55
+ mapperDict = Domain.getMapperDict()
56
+
57
+ mapper = pwmapper.SqliteMapper(fn, mapperDict)
58
+ # Associate the project
59
+ proj = Project(Domain, path=self.getOutputPath(''))
60
+
61
+ prot = ProtOutputTest(mapper=mapper, n=2, project=proj,
62
+ workingDir=self.getOutputPath(''))
63
+
64
+ # Add and old style o, not in the outputs dictionary
65
+ prot.output1 = MockObject()
66
+
67
+ self.assertFalse(prot._useOutputList.get(),
68
+ "useOutputList wrongly initialized")
69
+
70
+ outputs = [o for o in prot.iterOutputAttributes()]
71
+ self.assertTrue(1, len(outputs))
72
+
73
+ prot._stepsExecutor = pwprot.StepExecutor(hostConfig=None)
74
+
75
+ #Create the logs folder
76
+ prot.makeWorkingDir()
77
+
78
+ prot.run()
79
+
80
+ self.assertEqual(prot._steps[0].getStatus(),
81
+ pwprot.STATUS_FINISHED)
82
+
83
+ # Check there is an output
84
+ self.assertOutput(prot)
85
+
86
+ outputs = [o for o in prot.iterOutputAttributes()]
87
+
88
+ # We are intentionally ignoring a protocol with o (EMObject)
89
+ # That has been continued, We do not find a real case now.
90
+ self.assertEqual(1, len(outputs),
91
+ msg="Integer o not registered properly.")
92
+
93
+ outputs = [o for o in prot.iterOutputAttributes(pwobj.Integer)]
94
+
95
+ # Test passing a filter
96
+ self.assertEqual(1, len(outputs),
97
+ msg="Integer not matched when filtering outputs.")
98
+
99
+ # Test with non existing class
100
+ class NotRealClass:
101
+ pass
102
+
103
+ outputs = [o for o in prot.iterOutputAttributes(NotRealClass)]
104
+
105
+ # Test passing a class
106
+ self.assertEqual(0, len(outputs),
107
+ msg="Filter by class in iterOutputAttributes does "
108
+ "not work.")
109
+
110
+ self.assertTrue(prot._useOutputList.get(),
111
+ "useOutputList not activated")
112
+
113
+ def test_basicObjectInProject(self):
114
+ prot = self.newProtocol(ProtOutputTest,
115
+ objLabel='to generate basic input')
116
+ print("working dir: %s" % prot.getWorkingDir())
117
+ # Define a negative output for later tests
118
+ prot._defineOutputs(negative=pwobj.Integer(-20))
119
+ self.launchProtocol(prot)
120
+
121
+ # Default value is 10 so output is 20
122
+ self.assertOutput(prot)
123
+
124
+ # Second protocol to test linking
125
+ prot2 = self.newProtocol(ProtOutputTest,
126
+ objLabel='to read basic input')
127
+
128
+ # Set the pointer for the integer
129
+ prot2.iBoxSize.setPointer(pwobj.Pointer(prot, extended="oBoxSize"))
130
+ self.launchProtocol(prot2)
131
+ self.assertOutput(prot2, value=40)
132
+
133
+ # Test validation: only positive numbers are allowed
134
+ prot3 = self.newProtocol(ProtOutputTest,
135
+ objLabel='invalid input',
136
+ iBoxSize=-10)
137
+ # We expect this to fail
138
+ with self.assertRaises(Exception):
139
+ self.launchProtocol(prot3)
140
+ # Test validation: pointer value is validated
141
+ prot4 = self.newProtocol(ProtOutputTest,
142
+ objLabel='invalid pointer input')
143
+ # Now use negative pointer output
144
+ prot4.iBoxSize.setPointer(pwobj.Pointer(prot, extended="negative"))
145
+
146
+ # We expect this to fail
147
+ with self.assertRaises(Exception):
148
+ self.launchProtocol(prot4)
149
+
150
+ def assertOutput(self, prot, value=20):
151
+ # Check there is an output
152
+ self.assertTrue(hasattr(prot, 'oBoxSize'),
153
+ msg="Protocol output boxSize (OInteger) not registered"
154
+ " as attribute.")
155
+
156
+ self.assertEqual(value, prot.oBoxSize.get(),
157
+ "oBoxSize value is wrong: %s , expected %s" %
158
+ (prot.oBoxSize, value))
@@ -0,0 +1,47 @@
1
+ # -*- coding: utf-8 -*-
2
+ # **************************************************************************
3
+ # *
4
+ # * Authors: J.M. De la Rosa Trevin (delarosatrevin@scilifelab.se) [1]
5
+ # *
6
+ # * [1] SciLifeLab, Stockholm University
7
+ # *
8
+ # * This program is free software: you can redistribute it and/or modify
9
+ # * it under the terms of the GNU General Public License as published by
10
+ # * the Free Software Foundation, either version 3 of the License, or
11
+ # * (at your option) any later version.
12
+ # *
13
+ # * This program is distributed in the hope that it will be useful,
14
+ # * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ # * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ # * GNU General Public License for more details.
17
+ # *
18
+ # * You should have received a copy of the GNU General Public License
19
+ # * along with this program. If not, see <https://www.gnu.org/licenses/>.
20
+ # *
21
+ # * All comments concerning this program package may be sent to the
22
+ # * e-mail address 'scipion@cnb.csic.es'
23
+ # *
24
+ # **************************************************************************
25
+
26
+ import pyworkflow.tests as pwtests
27
+
28
+ from pyworkflow import Config
29
+ from pyworkflowtests.protocols import ConcurrencyProtocol
30
+
31
+
32
+ class TestConcurrency(pwtests.BaseTest):
33
+
34
+ @classmethod
35
+ def setUpClass(cls):
36
+ pwtests.setupTestOutput(cls)
37
+
38
+
39
+ # Set the application domain
40
+ Config.setDomain("pyworkflowtests")
41
+ pwtests.setupTestProject(cls)
42
+
43
+
44
+ def test_simple_steps_concurrency(self):
45
+ prot = self.newProtocol(ConcurrencyProtocol, numberOfThreads=3)
46
+
47
+ self.launchProtocol(prot)
@@ -0,0 +1,210 @@
1
+ #!/usr/bin/env python
2
+ # coding: latin-1
3
+ """
4
+ Created on Mar 25, 2014
5
+
6
+ @author: airen
7
+ @author: roberto.marabini
8
+ """
9
+ import datetime
10
+ import os
11
+ from subprocess import Popen
12
+ from io import StringIO
13
+
14
+ from pyworkflow import APPS, Variable
15
+ from pyworkflow.utils.process import killWithChilds
16
+ from pyworkflow.tests import *
17
+ from pyworkflow.utils import utils, prettyDict, getListFromValues, strToDuration
18
+ from pyworkflow.utils import ProgressBar
19
+
20
+
21
+ class TestBibtex(BaseTest):
22
+ """ Some minor tests to the bibtexparser library. """
23
+
24
+ @classmethod
25
+ def setUpClass(cls):
26
+ setupTestOutput(cls)
27
+
28
+ def test_Parsing(self):
29
+ bibtex = """
30
+
31
+ @article{delaRosaTrevin2013,
32
+ title = "Xmipp 3.0: An improved software suite for image processing in electron microscopy ",
33
+ journal = "Journal of Structural Biology ",
34
+ volume = "184",
35
+ number = "2",
36
+ pages = "321 - 328",
37
+ year = "2013",
38
+ issn = "1047-8477",
39
+ doi = "http://dx.doi.org/10.1016/j.jsb.2013.09.015",
40
+ url = "http://www.sciencedirect.com/science/article/pii/S1047847713002566",
41
+ author = "J.M. de la Rosa-Trevín and J. Otón and R. Marabini and A. Zaldívar and J. Vargas and J.M. Carazo and C.O.S. Sorzano",
42
+ keywords = "Electron microscopy, Single particles analysis, Image processing, Software package "
43
+ }
44
+
45
+ @incollection{Sorzano2013,
46
+ title = "Semiautomatic, High-Throughput, High-Resolution Protocol for Three-Dimensional Reconstruction of Single Particles in Electron Microscopy",
47
+ booktitle = "Nanoimaging",
48
+ year = "2013",
49
+ isbn = "978-1-62703-136-3",
50
+ volume = "950",
51
+ series = "Methods in Molecular Biology",
52
+ editor = "Sousa, Alioscka A. and Kruhlak, Michael J.",
53
+ doi = "10.1007/978-1-62703-137-0_11",
54
+ url = "http://dx.doi.org/10.1007/978-1-62703-137-0_11",
55
+ publisher = "Humana Press",
56
+ keywords = "Single particle analysis; Electron microscopy; Image processing; 3D reconstruction; Workflows",
57
+ author = "Sorzano, CarlosOscar and Rosa Trevín, J.M. and Otón, J. and Vega, J.J. and Cuenca, J. and Zaldívar-Peraza, A. and Gómez-Blanco, J. and Vargas, J. and Quintana, A. and Marabini, Roberto and Carazo, JoséMaría",
58
+ pages = "171-193",
59
+ }
60
+ """
61
+
62
+ prettyDict(utils.parseBibTex(bibtex))
63
+
64
+
65
+ class TestProccess(BaseTest):
66
+ """ Some tests for utils.process module. """
67
+
68
+ @classmethod
69
+ def setUpClass(cls):
70
+ setupTestOutput(cls)
71
+
72
+ def test_Process(self):
73
+ prog = pw.join(APPS, 'pw_sleep.py')
74
+ p = Popen('python %s 500' % prog, shell=True)
75
+ print("pid: %s" % p.pid)
76
+ time.sleep(5)
77
+ killWithChilds(p.pid)
78
+
79
+
80
+ class TestGetListFromRangeString(BaseTest):
81
+
82
+ def test_getListFromRangeString(self):
83
+ inputStrings = ["1,5-8,10" , "2,6,9-11" , "2 5, 6-8" , "1-4 8"]
84
+ outputLists = [[1, 5, 6, 7, 8, 10], [2, 6, 9, 10, 11], [2, 5, 6, 7, 8], [1,2,3,4, 8]]
85
+
86
+ for s, o in zip(inputStrings, outputLists):
87
+ self.assertEqual(o, pwutils.getListFromRangeString(s))
88
+ # Check that also works properly with spaces as delimiters
89
+ s2 = s.replace(',', ' ')
90
+ self.assertEqual(o, pwutils.getListFromRangeString(s2))
91
+
92
+
93
+ class TestListFromValues(unittest.TestCase):
94
+ """ Tests list created from str"""
95
+
96
+ def _callAndAssert(self, strValue, expected, length=None, caster=str):
97
+
98
+ result = getListFromValues( strValue, length, caster)
99
+
100
+ self.assertEqual(result, expected, "List from string does not work for %s" % strValue)
101
+
102
+ def test_getListFromValues(self):
103
+ """ Test numeric list definitions like:
104
+ '1 1 2x2 4 4' -> ['1', '1', '2', '2', '4', '4']
105
+ '2x3, 3x4, 1' -> ['3', '3', '4', '4', '4', '1']"
106
+ """
107
+
108
+ self._callAndAssert('1 1 2x2 4 4', ['1', '1', '2x2', '4', '4'])
109
+ self._callAndAssert('1 1 2x2 4 4', [1, 1, 2, 2, 4, 4], caster=int)
110
+ self._callAndAssert('2,3,4,1', [2, 3, 4, 1], caster=int)
111
+ self._callAndAssert('2 , 3 , 4 , 1', [2, 3, 4, 1], caster=int)
112
+ self._callAndAssert('2,3.3,4', [2.0, 3.3, 4.0], caster=float)
113
+
114
+
115
+
116
+ class TestProgressBar(unittest.TestCase):
117
+
118
+ def caller(self, total, step, fmt, resultGold):
119
+ ti = time.time()
120
+ result = StringIO()
121
+ pb = ProgressBar(total=total, fmt=fmt, output=result,
122
+ extraArgs={'objectId': 33})
123
+
124
+ pb.start()
125
+ for i in range(total):
126
+ if i % step == 0:
127
+ pb.update(i+1)
128
+ pb.finish()
129
+ self.assertEqual(resultGold.strip(), result.getvalue().strip())
130
+ result.close()
131
+ tf = time.time()
132
+ print("%d iterations in %f sec" % (total, tf - ti))
133
+
134
+ def test_dot(self):
135
+ total = 1000000
136
+ step = 10000
137
+ ratio = int(total/step)
138
+ resultGold = '.' * (ratio+1)
139
+ self.caller(total=total, step=step,
140
+ fmt=ProgressBar.DOT, resultGold=resultGold)
141
+
142
+ def test_default(self):
143
+ total = 3
144
+ step = 1
145
+ resultGold = ('\rProgress: [ ] '
146
+ ' 0%\rProgress: [============= '
147
+ ' ] 33%\rProgress: [========================== '
148
+ ' ] 66%\rProgress: [=============================='
149
+ '==========] 100%')
150
+ self.caller(total=total, step=step,
151
+ fmt=ProgressBar.DEFAULT, resultGold=resultGold)
152
+
153
+ def test_full(self):
154
+ total = 3
155
+ step = 1
156
+ resultGold = ('\r[ ] 0/3 ( 0%)'
157
+ ' 3 to go\r[============= ] '
158
+ '1/3 ( 33%) 2 to go\r[========================== '
159
+ ' ] 2/3 ( 66%) 1 to go\r[======================'
160
+ '==================] 3/3 (100%) 0 to go')
161
+ self.caller(total=total, step=step,
162
+ fmt=ProgressBar.FULL, resultGold=resultGold)
163
+
164
+ def test_objectid(self):
165
+ total = 3
166
+ step = 1
167
+ ratio = int(total/step)
168
+ resultGold = ('\r[ ] 0/3 ( 0%)'
169
+ ' (objectId=33)\r[============= '
170
+ ' ] 1/3 ( 33%) (objectId=33)\r[========================'
171
+ '== ] 2/3 ( 66%) (objectId=33)\r[=========='
172
+ '==============================] 3/3 (100%) '
173
+ '(objectId=33)')
174
+ self.caller(total=total, step=step,
175
+ fmt=ProgressBar.OBJID, resultGold=resultGold)
176
+
177
+
178
+
179
+ class TestPathTools(unittest.TestCase):
180
+
181
+ def test_filemodificationtime(self):
182
+
183
+ # Test is file closed
184
+
185
+ import tempfile
186
+ import time
187
+
188
+ since = datetime.datetime.now()
189
+ time.sleep(1)
190
+
191
+ tmpFile = tempfile.NamedTemporaryFile()
192
+ self.assertFalse(pwutils.isFileFinished(tmpFile.name), "File is NOT finished")
193
+ time.sleep(1)
194
+
195
+ self.assertTrue(pwutils.isFileFinished(tmpFile.name, duration=0.5), "File is finished after 2 seconds")
196
+
197
+
198
+ self.assertTrue(pwutils.hasChangedSince(tmpFile.name, since ), "hasChanged should have returned true. False negative.")
199
+ since = datetime.datetime.now()
200
+ self.assertFalse(pwutils.hasChangedSince(tmpFile.name, since ), "hasChanged should have returned false. False positive.")
201
+
202
+
203
+
204
+ def test_durationstrings(self):
205
+
206
+ self.assertEqual(70, strToDuration("1m 10s"), "String duration wrongly converted")
207
+
208
+
209
+
210
+
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: scipion-pyworkflow
3
- Version: 3.11.0
4
- Summary: Workflow platform used in scientific applications, initially developed
3
+ Version: 3.11.2
4
+ Summary: Workflow platform used in scientific applications, initially developed within the Scipion framework for image processing in Electron Microscopy but generic by design to be applied to any domain.
5
5
  Author-email: Pablo Conesa <pconesa@cnb.csic.es>, Yunior Fonseca <cfonseca@cnb.csic.es>, "J.M. De la Rosa Trevin" <josemiguel.delarosatrevin@stjude.org>, Roberto Marabini <roberto@cnb.csic.es>, Grigory Sharov <sharov.grigory@gmail.com>, Josue Gomez Blanco <josue.gomez-blanco@mcgill.ca>
6
6
  License: GNU General Public License v3 (GPLv3)
7
7
  Project-URL: Homepage, https://scipion.i2pc.es
@@ -0,0 +1,162 @@
1
+ pyworkflow/__init__.py,sha256=Wr-MVKMQJy_Cy-rpPPB0-pyv8-8tx7GPPaLSNBrV1AI,1246
2
+ pyworkflow/config.py,sha256=tvGMn6OlOrIUzZKCQwWFOA2oBSn85FTgPwNzA86oFn0,26291
3
+ pyworkflow/constants.py,sha256=CAAE2iM024hLj2jTKfItkX1galaOrognBEp2gQil6_U,7800
4
+ pyworkflow/exceptions.py,sha256=3VFxuNJHcIWxRnLPR0vYg0RFAQMmxPBJZLZSi87VI8E,507
5
+ pyworkflow/object.py,sha256=bMb6vohVw7O12xDXJOtjXhLqVVZviO8q_i83EYMCAt4,55217
6
+ pyworkflow/plugin.py,sha256=guiGN2K38cMzRmhdaNcU4YNoY9MC89ywzlz4jnCFs7w,30592
7
+ pyworkflow/template.py,sha256=KaF8VJjHHSHTiY5gmdbfMVoLlf_sav9SX3bf-khPRRk,10482
8
+ pyworkflow/viewer.py,sha256=YCRoZaF0NYoBnSGhgBLQjCXuGKNWbKP6N1GWuALU_cQ,12053
9
+ pyworkflow/wizard.py,sha256=nXuk_qMUVlQNa6nB6GCt0CoFQ_P2dnJbGWdwtpDG2tQ,2633
10
+ pyworkflow/apps/__init__.py,sha256=doupoWHiPmpEwa7o7ro7suxYYjj7h-912kc-fxwnhfE,1187
11
+ pyworkflow/apps/pw_manager.py,sha256=LqvNLqREsMN-O4QlxHr5mvG7XlKSYVvzgV1pGICV9rU,1356
12
+ pyworkflow/apps/pw_plot.py,sha256=69L9_qbdaYuC8QbvE9MNOu4P2MYIna0II29PBu0HQdg,1829
13
+ pyworkflow/apps/pw_project.py,sha256=L7nfLC9Z1slA63f7Y-2XuOj9YPR68gzHenp6oSmJEvA,4415
14
+ pyworkflow/apps/pw_protocol_list.py,sha256=bRC0W_M5Yx0KQ651S4HxB4AOqE4_P8hacc8qrS_3vPo,5193
15
+ pyworkflow/apps/pw_protocol_run.py,sha256=Uboywq_pwIBAqa_YIsHtBg5iO9b134HEVwrhwkLMoNY,1916
16
+ pyworkflow/apps/pw_run_tests.py,sha256=0BNl_hmEJ5q-lqG3hDshwzYaBQjADLfaIZ_zrHqlD6E,10621
17
+ pyworkflow/apps/pw_schedule_run.py,sha256=N3os7_wA-QIGnQGmnVoRWmM385idB0cH-h_sCxVy_14,12471
18
+ pyworkflow/apps/pw_sleep.py,sha256=KhXjsmm04K_JMM13CMDI25sYEay7C2aJ_mTQlBH9n-I,1443
19
+ pyworkflow/apps/pw_sync_data.py,sha256=rNoS_GnamoPI1jljvRI3E8qJ7FZCvuw2wmCauMaT24w,17460
20
+ pyworkflow/apps/pw_viewer.py,sha256=dlvIPzBa_citucezBd0Cl0uCND4eXWYgXF-lZpXWzBc,2595
21
+ pyworkflow/gui/__init__.py,sha256=D7PVYky81yTcqvkGEtw1CIxRkICpsn4TO5z5lJg84yM,1373
22
+ pyworkflow/gui/browser.py,sha256=Nq6itmAnVCbKXA-6WYpj36Py9ggRlhUTbZi4S9jhLCc,26969
23
+ pyworkflow/gui/canvas.py,sha256=M_pD7QbqnYq9MY145WN6BYzeIAo0cIkbxLrZKNE80yg,42106
24
+ pyworkflow/gui/dialog.py,sha256=ZX0k_y-bhUUo84YLwbP1ab6qwkSaNMRbDbjVAqOc3to,35473
25
+ pyworkflow/gui/form.py,sha256=g701xBE6wfpBevlZ9lppFkcCYZTlYRtVp3h7JxamO6M,107486
26
+ pyworkflow/gui/graph.py,sha256=HSZ5PfFKkhv3tzl0o9UtSU_FfDevKR2M3L9HgU9_Gkc,8747
27
+ pyworkflow/gui/graph_layout.py,sha256=R9uTc_Ei4oWAeCkZ3d78JjC1QKV7HPJaDLyhvSfK7NE,9520
28
+ pyworkflow/gui/gui.py,sha256=b29zlbl74cu4Rg6elBZO6alZg37v7i4oyuv9Sq4YNKI,20741
29
+ pyworkflow/gui/matplotlib_image.py,sha256=vGD5LKp-AZvu_kXa7Mf_jtOQfZ-QcRUoTMnicNrMqUk,7821
30
+ pyworkflow/gui/plotter.py,sha256=E9ld43B-AzYhV1PIEPBy2TQWyzoia4y5lD5rqJOQlZY,8464
31
+ pyworkflow/gui/text.py,sha256=xQp-sZbqmWh1uK4uVS-Wk3FSWxJ9_awFpfHWsqCaCuo,28722
32
+ pyworkflow/gui/tooltip.py,sha256=OceYHesQQ7vSH7FRJmbvDBXjVG1IKkX1A8vocb64ljE,8531
33
+ pyworkflow/gui/tree.py,sha256=TglyZ-snZHp6hTIRRp4o5Fvzf8Z7hogpFaZ4DVgMGvo,23084
34
+ pyworkflow/gui/widgets.py,sha256=mIG1AAFvfT_py_yjjgoYeikgIRz-IbD3VOfKAcknqY0,11115
35
+ pyworkflow/gui/project/__init__.py,sha256=rZmTvqocYhsD2PH1owu7Dkgs7dMrGx7VbKOCpaqvLzM,1118
36
+ pyworkflow/gui/project/base.py,sha256=Sfc6lT-kgOj2GQXYNg4SDVJaulxQB8Wro5PL8Y4BT4A,7912
37
+ pyworkflow/gui/project/constants.py,sha256=rORDaNCdAFRFcBmjRt2PJ1cXpSmYgDLfbvrbqZh1Bb0,4943
38
+ pyworkflow/gui/project/labels.py,sha256=7m4heNcN3zXe0BHuFJyQrPD5hC8LiHnlu1sizRc8l_Y,7680
39
+ pyworkflow/gui/project/project.py,sha256=2LdwlbPrCejKr_cdFALm_1kOx-Agk9KKIIS4mHOpTrk,18801
40
+ pyworkflow/gui/project/searchprotocol.py,sha256=Mkam8PwHOeJMjILBugwAaj_jNp-uDQ_mikN6OMrhFLg,9453
41
+ pyworkflow/gui/project/searchrun.py,sha256=xCGxs7L9PMk48ei9Gi3HI2PAOYEM-zXR5vRfAQRLHKI,7269
42
+ pyworkflow/gui/project/steps.py,sha256=fq0WhPBoByFs8Lr-qmGZ-aFC4lx3XCF2zM2DOBd_KAc,6053
43
+ pyworkflow/gui/project/utils.py,sha256=H9oFPzz9lAjAI4PRYSYyYniTBn98Y6YSs0bE0qXpMEM,11923
44
+ pyworkflow/gui/project/variables.py,sha256=UczW6yQqzssj3eETEKaae5GSpsWr04ItPrr5o2WBnu4,7496
45
+ pyworkflow/gui/project/viewdata.py,sha256=DUpoF6HURNZagdOtI9M8QNMYcqSFRtXGFA5Ftmrw2P8,18172
46
+ pyworkflow/gui/project/viewprojects.py,sha256=zLVSaoGerElTab3wT70VmhQKI8lAI42Egh46xEVSmXA,22868
47
+ pyworkflow/gui/project/viewprotocols.py,sha256=UkDRh_sXYTe8X0-8MaqWYlHEcxjgaHl1aqC2SaqLsXs,86201
48
+ pyworkflow/gui/project/viewprotocols_extra.py,sha256=_wHn4fa1Qy9zDhyHYJoluIEZtS6SxvF0s9fFmVA1mgc,21262
49
+ pyworkflow/mapper/__init__.py,sha256=HM7tMMd1r2BZ8hbPGryUQ80E4evY46zIVjiZ3edg_Mg,1186
50
+ pyworkflow/mapper/mapper.py,sha256=tUP5L-B5m33bBjhp34fWgaIGSnuVSEjpYa8hf1tBLjQ,7829
51
+ pyworkflow/mapper/sqlite.py,sha256=3DaJbZ6RJNkajVs3tfshM1SiBi4DITzyK7d3Oh7A_m0,65543
52
+ pyworkflow/mapper/sqlite_db.py,sha256=HYSXe_fRX1NBKDs6l2zefdO4PMEajnoDMXPjmoFs8Kc,5602
53
+ pyworkflow/project/__init__.py,sha256=05l9tvr3FfBNL3XNZSbFCs6yO-1HbFlmFu204w7yyKk,1369
54
+ pyworkflow/project/config.py,sha256=F9H1vLJJ9vPyT6zeSqHX69o-wbaN8hWueOuDn53evjc,13692
55
+ pyworkflow/project/manager.py,sha256=bk5hFDuIJqEgELU0plFG-RycGhhFfcJxmPp_qhFj1mE,6758
56
+ pyworkflow/project/project.py,sha256=0a2B1KdiZcofViymJw7xsvMOCTRwTdHPzR4JXgB2JEw,87976
57
+ pyworkflow/project/usage.py,sha256=UyyqOyVNqbiFBhhemn3qr5Mzlx2-kV7ZNNPGXqJ4PsM,5309
58
+ pyworkflow/project/scripts/clean_projects.py,sha256=5qsLHIyJk7sZJUrfSp8sbMRYTkbZ2purtc-5JJb8awM,2600
59
+ pyworkflow/project/scripts/config.py,sha256=VF4NMsykWzQjCQHRwnfFwxFq2PSk57Ni3TpgTh3nF3w,2933
60
+ pyworkflow/project/scripts/create.py,sha256=cmyYJoKP4J9goPRRtQRM9jrsfp-DARHS0XeKJ0ObSCE,2781
61
+ pyworkflow/project/scripts/edit_workflow.py,sha256=AhwwEFjEgTRR8LUZ4tBSoY2jprDgUmmgFR3FcIU5uno,2940
62
+ pyworkflow/project/scripts/fix_links.py,sha256=u6UXXqIIh-Rq8FYPmmtvcrgPdszPt93LnkVv0xowAEY,1049
63
+ pyworkflow/project/scripts/load.py,sha256=oA_xZjO94N-hZohLZQXBKEdmE7BZuWxH7x9gPx9lMj8,2696
64
+ pyworkflow/project/scripts/refresh.py,sha256=-uw41ouFgEzIF4iBXFRzAI79Lna7fqMmEKhRciSUpTA,2603
65
+ pyworkflow/project/scripts/schedule.py,sha256=mUUlaUSiMvA_skES6WOL0Mg-j7-S9Cx6dN-6wx5ZM6Y,3989
66
+ pyworkflow/project/scripts/stack2volume.py,sha256=ZV8qtPj4qWg2LJSXHBnx-S8L8pyGGQiWuRcWu3OP8qI,940
67
+ pyworkflow/project/scripts/stop.py,sha256=vCeCxkwPCoUkLbna5HCxKWJ1hrsI4U19Sg9JD4ksXj8,2427
68
+ pyworkflow/protocol/__init__.py,sha256=bAdIpvUW4GAYdIuv92DZ44-OEkZ7lTtnp1S9T5cwtVs,1413
69
+ pyworkflow/protocol/bibtex.py,sha256=mCUk1Hp5Vp_i2lozDM1BQNOw10e_RSu86oXvrR63sOA,2122
70
+ pyworkflow/protocol/constants.py,sha256=gyYtGFjfZbyAi2nDK6YpIRq6baZIJc_EdPD3oP2VdNM,3391
71
+ pyworkflow/protocol/executor.py,sha256=_UCV9nxez7QVDMJUx-CiO-UpVENSAmsdATALIz1CrU8,20189
72
+ pyworkflow/protocol/hosts.py,sha256=j6vC1ALRVwo8bSxLM9cFfnfWW5qGrzgrrAFJobvVnX0,10729
73
+ pyworkflow/protocol/launch.py,sha256=Gls0WlLAkLtOxj4IWyKrDbmqaXXHsGd8oqBAcT61zEI,11731
74
+ pyworkflow/protocol/package.py,sha256=L6x3HHKtbrhDQRJHD07SG3DQKNMGaRQ0ROoLEY3SuRQ,1444
75
+ pyworkflow/protocol/params.py,sha256=kPXMPtPJrsSMJQQKIHIInPhity__lWYIVc1m3PXIywE,27947
76
+ pyworkflow/protocol/protocol.py,sha256=tJodpBU0PxKBOltQgVYyjzN00VqTuAsfr107Efry8BY,103318
77
+ pyworkflow/resources/Imagej.png,sha256=nU2nWI1wxZB_xlOKsZzdUjj-qiCTjO6GwEKYgZ5Risg,14480
78
+ pyworkflow/resources/chimera.png,sha256=AKCuwMqmZo0Cg2sddMUjBWUhmAq-nPsAVCBpVrYNeiQ,815
79
+ pyworkflow/resources/fa-exclamation-triangle_alert.png,sha256=31_XvRu0CkJ2dvHSpcBAR43378lIJTWwiag_A7SuUQc,585
80
+ pyworkflow/resources/fa-info-circle_alert.png,sha256=KUk6dTqgBa38K9gRKeDGUZfsSGjWftgCRd5WH2rGCcw,596
81
+ pyworkflow/resources/fa-search.png,sha256=7qC-76_K7dQuvKipYZofYu4bONRDZBJUAeuP934JatA,319
82
+ pyworkflow/resources/fa-times-circle_alert.png,sha256=pgTdYSR5s5tIt6i9ut2YTTMf0uoUew8Z13J2rPWPpUU,672
83
+ pyworkflow/resources/file_vol.png,sha256=b_M_W5iXEnG5jEcGvlFAyOm8Nn_ngZcrJnDBq9_361g,961
84
+ pyworkflow/resources/loading.gif,sha256=6Jktjiva7Z5W6tqxiQZJZI9zahpwmme_D5G-K9EwI1o,16824
85
+ pyworkflow/resources/no-image128.png,sha256=AnPz8ehji-QTJiSSv0kwYh1QR1TMTLGEKRZg-dz0UKA,13217
86
+ pyworkflow/resources/protlabels.xcf,sha256=djXjiVydmUoxtdrLxkgasycQtlBVY4Kp--kfYA8Wwlk,32512
87
+ pyworkflow/resources/scipion_bn.png,sha256=0yVccw1PlBJaoJpIEsChGZH2dXEgphaqHnquaP2i-1c,113916
88
+ pyworkflow/resources/scipion_icon.png,sha256=moMOOoaLmcWdPdOn_PUBoAQv79WlfxsKwx8nPmrLbzU,2674
89
+ pyworkflow/resources/scipion_icon.svg,sha256=6CGXzBW6tlbwY0tywHcWxsKeEAhynKmzhvYxnIxN9qQ,126140
90
+ pyworkflow/resources/scipion_icon_proj.png,sha256=8zyHxxyXo3de7o9dS4vJxrAWnNMDCDhMOJ12zu3iTtI,5147
91
+ pyworkflow/resources/scipion_icon_projs.png,sha256=OKdsDjMyVFSa-GsRUxDCuhX7RSL5JFBaihC_Uq8ACpU,13273
92
+ pyworkflow/resources/scipion_icon_prot.png,sha256=WOp8WTw54JPwlhXUzFDP75T1nEbIQy90wIauITHvHck,6554
93
+ pyworkflow/resources/scipion_logo.png,sha256=NYxY7AxZmp7kb1So2uCDpkzoYRxKl-Fb-zmf59nBkBc,1999
94
+ pyworkflow/resources/scipion_logo_normal.png,sha256=nrsdm4tI9r1WThlY7KoNtVRl48fZd8oSaGOSvMJdoKk,35151
95
+ pyworkflow/resources/scipion_logo_small.png,sha256=lUUaMbJmCCewirp4SPc4LJrenMGSxz4243yuDYUaP2Q,7811
96
+ pyworkflow/resources/sprites.png,sha256=NG6lQivvgHAMvpEzX3NU3NOwgE8XPvDer8pW4JRwXSE,48542
97
+ pyworkflow/resources/sprites.xcf,sha256=9Y4P7d7C-tJuAmTYazIVwqtiMXrWClUFvtL4ecqT_OE,97411
98
+ pyworkflow/resources/wait.gif,sha256=H9UcWI4UbL9cpxrX_gZAtkmLhXHDAHFYirTRtZrn4q0,4035
99
+ pyworkflow/resources/showj/arrowDown.png,sha256=qpePLXb2UKAWBL7EaHZChEpAFNwFm1mBiEfckNUwpus,268
100
+ pyworkflow/resources/showj/arrowUp.png,sha256=1-rxZDyFUHVZ1SIO9at1_OhkvLnaJDlMx90r137RjGI,276
101
+ pyworkflow/resources/showj/background_section.png,sha256=udYJgAswKF1t4uEECXdstBGHvCFjw5h-XnRoVKIaq70,284666
102
+ pyworkflow/resources/showj/colRowModeOff.png,sha256=2qPk4pclbMcOkyjhBYRH7KBAal8WQxhiaUAw9WQ1CCY,208
103
+ pyworkflow/resources/showj/colRowModeOn.png,sha256=hMStGaI89qWEFy_jxYevJLVhE9uL5N8S1hB-Zu24syg,180
104
+ pyworkflow/resources/showj/delete.png,sha256=VhKYxRezKSgWp76eYDupFeRVUT0YiB3fLkRNFWWmbwg,624
105
+ pyworkflow/resources/showj/doc_icon.png,sha256=kfpwilQYdF3sm_-Z4qrDCjnyI6i6MMQ0CschqsiPib4,1015
106
+ pyworkflow/resources/showj/download_icon.png,sha256=Ga8fUNb1TwlL6vIai-_Ms7JgTEC5qMF_UcQngscyq9o,792
107
+ pyworkflow/resources/showj/enabled_gallery.png,sha256=-HEJRzvm7iTMEVZXOWfmSmq4t4ZO-QU3vzyWvA7FOlU,493
108
+ pyworkflow/resources/showj/galleryViewOff.png,sha256=f83t_r87f0UG9pYFYGnA2BKFCBCbIYhf0gqlSYJjjZQ,173
109
+ pyworkflow/resources/showj/galleryViewOn.png,sha256=w9mTGWvcBlGE-BD3T1EyxDgtNcl5yYzGdvfaRwOGGhw,159
110
+ pyworkflow/resources/showj/goto.png,sha256=P1RKOGjuB89LrVIxjwtH8D83UztbwRXhehBWezqSlg4,451
111
+ pyworkflow/resources/showj/menu.png,sha256=nXHsckD78XteuxKut_qOWhajQN1uR7fuMiMLiDCggdI,2736
112
+ pyworkflow/resources/showj/separator.png,sha256=g_I8lFdg_yFo8oe-Jv702QNXKn_DND4s8_IqgERao7o,288
113
+ pyworkflow/resources/showj/tableViewOff.png,sha256=mvMeM57miMAw8zXnVtncp5gYkIay09_glfoWAHXzG1c,200
114
+ pyworkflow/resources/showj/tableViewOn.png,sha256=oQj0mE5nelIuIGgM1X6kxDL_v9PKZi4a3N4v4OwF9lI,172
115
+ pyworkflow/resources/showj/ui-bg_glass_75_e6e6e6_1x400.png,sha256=HHsEJqgqzvoZSG8cM9_V9uHNdz6DVd0L64-x9W_oT_Q,262
116
+ pyworkflow/resources/showj/ui-bg_glass_95_fef1ec_1x400.png,sha256=r72mOckMSAlhch0OBmIXbvYQK7nUIR8qJz3SFvmI4eQ,332
117
+ pyworkflow/resources/showj/ui-bg_highlight-soft_75_cccccc_1x100.png,sha256=C4w_HyBOAH7vPIsQaCTTChcjCGhEE9f223kTugmkCDY,280
118
+ pyworkflow/resources/showj/volumeOff.png,sha256=LKMWEt8_xwA4tDBruP30Y22QqNebHtH31wxZktfwaIU,751
119
+ pyworkflow/resources/showj/volumeOn.png,sha256=SsZsmeTdIa0pfMcm0Kq8KzsTDG6A3nhi7jdWWk_7Qfk,614
120
+ pyworkflow/tests/__init__.py,sha256=tCnNEVIyRLERuNkAd3stcKo23TxHUILonZM9UFEbUD0,1259
121
+ pyworkflow/tests/test_utils.py,sha256=HmPVZ6UPu89u-x_aQmF5yyA4RwK55x4bhEhvWeNy1lY,493
122
+ pyworkflow/tests/tests.py,sha256=mnuaWUBCKWcau0j2YhxRqYnxYgY8aw81xxti8BqbUfQ,11791
123
+ pyworkflow/utils/__init__.py,sha256=UEd4SxmVd9zv0JElz1J0Sva7klJw3HEKSzwf5a0c-Xc,1429
124
+ pyworkflow/utils/dataset.py,sha256=141u2xb-FTe8nF6OVJBJtTNHWz7eDWd24veBWX7eoTI,14943
125
+ pyworkflow/utils/echo.py,sha256=ZXJRrmxUaTT4Xxf7_pQwg7Th341iFafTs66VEKNOZmE,3442
126
+ pyworkflow/utils/graph.py,sha256=z3Hcj0I38du97DQEqNT5gk--SCDTRPlKotaCszoZfX8,4981
127
+ pyworkflow/utils/log.py,sha256=y7qLB1NKeHF43QhyWZq-32_5DtSJYR1uzrWjRxoSvWk,11096
128
+ pyworkflow/utils/path.py,sha256=hDisc13HhfB6CxpBcI1JBd5er_S6yVTKw1MFSw1AR3U,16803
129
+ pyworkflow/utils/process.py,sha256=a2yixJxEQeZXI9dg2TKrfgaVmcDQocTQ2GUZ9d4rfQU,5816
130
+ pyworkflow/utils/profiler.py,sha256=BC0KkAgfYqf-CV40zLcRxo5Td79f5jw1gzvaDH8iqt8,2218
131
+ pyworkflow/utils/progressbar.py,sha256=VntEF_FTdQHjMKawfR1R4IoNgYNTEMmnLUIDvUXurxk,5903
132
+ pyworkflow/utils/properties.py,sha256=3hpTFoWEmH6bwSYIuwBFgbFY-OlATO8q19KBV0fjoiA,23157
133
+ pyworkflow/utils/reflection.py,sha256=48cvIDO73JinBsFn3XMiVR56AcivfdJoiMXGM7ZwUDY,4429
134
+ pyworkflow/utils/utils.py,sha256=6h1PthMyGc804PBqbNnVqzzr8upkJMZtaLKalIAELNc,26330
135
+ pyworkflow/utils/which.py,sha256=KuyKYE4GnkwMpBJoKgOMnx-hNZjHf6OTyqxEsdHIftI,8627
136
+ pyworkflow/webservices/__init__.py,sha256=CfkvvoFQp2t2Tt5p7uOF_tpkZVWPHOl9TLlAtBlKPJ8,294
137
+ pyworkflow/webservices/config.py,sha256=7XSkwUiVT71UuARNBQUcePARz8UevwlmxEdoKa_ZVlg,399
138
+ pyworkflow/webservices/notifier.py,sha256=ntjmIxi2rO0Oc7RE6meuJZ6y5HG4NcrShRqfSUxM8eA,5601
139
+ pyworkflow/webservices/repository.py,sha256=Hw2ZhvuJzKbN5ivTuN2gTNeJT49Q3-PuM9BdwayTYfU,2365
140
+ pyworkflow/webservices/workflowhub.py,sha256=HBk0aEKklakhg-CPx9GkvexVs2LMnf82IwP--Xh_xCA,2768
141
+ pyworkflowtests/__init__.py,sha256=RoXNgyShL7moVEXaimTDdfY1fU26dgGKtdjO4JfBQOk,1686
142
+ pyworkflowtests/bibtex.py,sha256=1f9PjkRO937PB2b-ax-eKLwjU4YY11M5px3dk3xWQzw,2102
143
+ pyworkflowtests/objects.py,sha256=uaD9THeybiCkUDbb_cpqEwqCpVG3RLyMsIjOKOX7oNQ,26688
144
+ pyworkflowtests/protocols.py,sha256=c9dpwMZW5EEZHp4DELH4WSciCigyUAUGaNem6ZO_D6k,5451
145
+ pyworkflowtests/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
146
+ pyworkflowtests/tests/test_canvas.py,sha256=_d3Xccp7BuwdbkNC5cTTNVXH425V4k1hKYuhUsn4JtU,2685
147
+ pyworkflowtests/tests/test_domain.py,sha256=8IvVTZllgtqNT66rYLlaHKka9zt-0_tuNQ_69pZDFeE,1624
148
+ pyworkflowtests/tests/test_logs.py,sha256=lNHPtvPIWk_nRy3L3B2GriroMwgNmTZ_-RHRw00tcSM,2752
149
+ pyworkflowtests/tests/test_mappers.py,sha256=2DBzZaM8rIKQTSU9xWAsNGwZkpUPB1FBwgwMmNNbVkg,15423
150
+ pyworkflowtests/tests/test_object.py,sha256=WVWP11oXNeOTUDJ5BLFR32MmQi6C5Y6KjfVRBf9fu3w,18577
151
+ pyworkflowtests/tests/test_project.py,sha256=RBrhpIs45dWLrciHqzpj4ORyLZCNvjm8fytIolOZ9Ko,1685
152
+ pyworkflowtests/tests/test_protocol_execution.py,sha256=o1mpO1P_3_Pi80Slv-mma5U6Is11nqbDBTCzIH-7kRk,5649
153
+ pyworkflowtests/tests/test_protocol_export.py,sha256=z18nKPkOnrYLMU8KqcnVsF6-ylQ8d9mw-qFJWRn4Qdw,3291
154
+ pyworkflowtests/tests/test_protocol_output.py,sha256=8gnIFMRNmwPnIBRCG29WHJB6mqK4FLGn1jiXHtTD6pY,5980
155
+ pyworkflowtests/tests/test_streaming.py,sha256=vOH-bKCM-fVUSsejqNnCX5TPXhdUayk9ZtJHsNVcfCY,1615
156
+ pyworkflowtests/tests/test_utils.py,sha256=_pTYGCuXC7YNMdCBzUYNfSBCR3etrHsxHfIhsQi4VPc,7465
157
+ scipion_pyworkflow-3.11.2.dist-info/licenses/LICENSE.txt,sha256=ixuiBLtpoK3iv89l7ylKkg9rs2GzF9ukPH7ynZYzK5s,35148
158
+ scipion_pyworkflow-3.11.2.dist-info/METADATA,sha256=ySnL_EiwGsdzu6T-r66WwCR1wntg80_xpvFeqchrrhA,4440
159
+ scipion_pyworkflow-3.11.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
160
+ scipion_pyworkflow-3.11.2.dist-info/entry_points.txt,sha256=-P6GVocWl_NS8wS7lB-bTKf-tKANbw4n7DlXXh_VrWk,54
161
+ scipion_pyworkflow-3.11.2.dist-info/top_level.txt,sha256=PzyJteyenJwLjAeSFP7oYrTN_U71GABQwET8oLZkh9k,27
162
+ scipion_pyworkflow-3.11.2.dist-info/RECORD,,