fractal-server 1.4.10__py3-none-any.whl → 2.0.0a1__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 (126) hide show
  1. fractal_server/__init__.py +1 -1
  2. fractal_server/app/models/__init__.py +3 -7
  3. fractal_server/app/models/linkuserproject.py +9 -0
  4. fractal_server/app/models/security.py +6 -0
  5. fractal_server/app/models/state.py +1 -1
  6. fractal_server/app/models/v1/__init__.py +11 -0
  7. fractal_server/app/models/{dataset.py → v1/dataset.py} +5 -5
  8. fractal_server/app/models/{job.py → v1/job.py} +5 -5
  9. fractal_server/app/models/{project.py → v1/project.py} +5 -5
  10. fractal_server/app/models/{task.py → v1/task.py} +7 -2
  11. fractal_server/app/models/{workflow.py → v1/workflow.py} +5 -5
  12. fractal_server/app/models/v2/__init__.py +20 -0
  13. fractal_server/app/models/v2/dataset.py +55 -0
  14. fractal_server/app/models/v2/job.py +51 -0
  15. fractal_server/app/models/v2/project.py +31 -0
  16. fractal_server/app/models/v2/task.py +93 -0
  17. fractal_server/app/models/v2/workflow.py +43 -0
  18. fractal_server/app/models/v2/workflowtask.py +90 -0
  19. fractal_server/app/routes/{admin.py → admin/v1.py} +42 -42
  20. fractal_server/app/routes/admin/v2.py +274 -0
  21. fractal_server/app/routes/api/v1/__init__.py +7 -7
  22. fractal_server/app/routes/api/v1/_aux_functions.py +2 -2
  23. fractal_server/app/routes/api/v1/dataset.py +37 -37
  24. fractal_server/app/routes/api/v1/job.py +14 -14
  25. fractal_server/app/routes/api/v1/project.py +23 -21
  26. fractal_server/app/routes/api/v1/task.py +24 -14
  27. fractal_server/app/routes/api/v1/task_collection.py +16 -14
  28. fractal_server/app/routes/api/v1/workflow.py +24 -24
  29. fractal_server/app/routes/api/v1/workflowtask.py +10 -10
  30. fractal_server/app/routes/api/v2/__init__.py +28 -0
  31. fractal_server/app/routes/api/v2/_aux_functions.py +497 -0
  32. fractal_server/app/routes/api/v2/dataset.py +309 -0
  33. fractal_server/app/routes/api/v2/images.py +207 -0
  34. fractal_server/app/routes/api/v2/job.py +200 -0
  35. fractal_server/app/routes/api/v2/project.py +202 -0
  36. fractal_server/app/routes/api/v2/submit.py +220 -0
  37. fractal_server/app/routes/api/v2/task.py +222 -0
  38. fractal_server/app/routes/api/v2/task_collection.py +229 -0
  39. fractal_server/app/routes/api/v2/workflow.py +397 -0
  40. fractal_server/app/routes/api/v2/workflowtask.py +269 -0
  41. fractal_server/app/routes/aux/_job.py +1 -1
  42. fractal_server/app/runner/async_wrap.py +27 -0
  43. fractal_server/app/runner/components.py +5 -0
  44. fractal_server/app/runner/exceptions.py +129 -0
  45. fractal_server/app/runner/executors/slurm/__init__.py +3 -0
  46. fractal_server/app/runner/{_slurm → executors/slurm}/_batching.py +1 -1
  47. fractal_server/app/runner/{_slurm → executors/slurm}/_check_jobs_status.py +1 -1
  48. fractal_server/app/runner/{_slurm → executors/slurm}/_executor_wait_thread.py +1 -1
  49. fractal_server/app/runner/{_slurm → executors/slurm}/_slurm_config.py +3 -152
  50. fractal_server/app/runner/{_slurm → executors/slurm}/_subprocess_run_as_user.py +1 -1
  51. fractal_server/app/runner/{_slurm → executors/slurm}/executor.py +32 -19
  52. fractal_server/app/runner/filenames.py +6 -0
  53. fractal_server/app/runner/set_start_and_last_task_index.py +39 -0
  54. fractal_server/app/runner/task_files.py +103 -0
  55. fractal_server/app/runner/{__init__.py → v1/__init__.py} +22 -20
  56. fractal_server/app/runner/{_common.py → v1/_common.py} +13 -120
  57. fractal_server/app/runner/{_local → v1/_local}/__init__.py +5 -5
  58. fractal_server/app/runner/{_local → v1/_local}/_local_config.py +6 -7
  59. fractal_server/app/runner/{_local → v1/_local}/_submit_setup.py +1 -5
  60. fractal_server/app/runner/v1/_slurm/__init__.py +310 -0
  61. fractal_server/app/runner/{_slurm → v1/_slurm}/_submit_setup.py +3 -9
  62. fractal_server/app/runner/v1/_slurm/get_slurm_config.py +163 -0
  63. fractal_server/app/runner/v1/common.py +117 -0
  64. fractal_server/app/runner/{handle_failed_job.py → v1/handle_failed_job.py} +8 -8
  65. fractal_server/app/runner/v2/__init__.py +336 -0
  66. fractal_server/app/runner/v2/_local/__init__.py +167 -0
  67. fractal_server/app/runner/v2/_local/_local_config.py +118 -0
  68. fractal_server/app/runner/v2/_local/_submit_setup.py +52 -0
  69. fractal_server/app/runner/v2/_local/executor.py +100 -0
  70. fractal_server/app/runner/{_slurm → v2/_slurm}/__init__.py +34 -45
  71. fractal_server/app/runner/v2/_slurm/_submit_setup.py +83 -0
  72. fractal_server/app/runner/v2/_slurm/get_slurm_config.py +179 -0
  73. fractal_server/app/runner/v2/deduplicate_list.py +22 -0
  74. fractal_server/app/runner/v2/handle_failed_job.py +156 -0
  75. fractal_server/app/runner/v2/merge_outputs.py +38 -0
  76. fractal_server/app/runner/v2/runner.py +267 -0
  77. fractal_server/app/runner/v2/runner_functions.py +341 -0
  78. fractal_server/app/runner/v2/runner_functions_low_level.py +134 -0
  79. fractal_server/app/runner/v2/task_interface.py +43 -0
  80. fractal_server/app/runner/v2/v1_compat.py +21 -0
  81. fractal_server/app/schemas/__init__.py +4 -42
  82. fractal_server/app/schemas/v1/__init__.py +42 -0
  83. fractal_server/app/schemas/{applyworkflow.py → v1/applyworkflow.py} +18 -18
  84. fractal_server/app/schemas/{dataset.py → v1/dataset.py} +30 -30
  85. fractal_server/app/schemas/{dumps.py → v1/dumps.py} +8 -8
  86. fractal_server/app/schemas/{manifest.py → v1/manifest.py} +5 -5
  87. fractal_server/app/schemas/{project.py → v1/project.py} +9 -9
  88. fractal_server/app/schemas/{task.py → v1/task.py} +12 -12
  89. fractal_server/app/schemas/{task_collection.py → v1/task_collection.py} +7 -7
  90. fractal_server/app/schemas/{workflow.py → v1/workflow.py} +38 -38
  91. fractal_server/app/schemas/v2/__init__.py +34 -0
  92. fractal_server/app/schemas/v2/dataset.py +89 -0
  93. fractal_server/app/schemas/v2/dumps.py +87 -0
  94. fractal_server/app/schemas/v2/job.py +114 -0
  95. fractal_server/app/schemas/v2/manifest.py +159 -0
  96. fractal_server/app/schemas/v2/project.py +37 -0
  97. fractal_server/app/schemas/v2/task.py +120 -0
  98. fractal_server/app/schemas/v2/task_collection.py +105 -0
  99. fractal_server/app/schemas/v2/workflow.py +79 -0
  100. fractal_server/app/schemas/v2/workflowtask.py +119 -0
  101. fractal_server/config.py +5 -4
  102. fractal_server/images/__init__.py +2 -0
  103. fractal_server/images/models.py +50 -0
  104. fractal_server/images/tools.py +85 -0
  105. fractal_server/main.py +11 -3
  106. fractal_server/migrations/env.py +0 -2
  107. fractal_server/migrations/versions/d71e732236cd_v2.py +239 -0
  108. fractal_server/tasks/__init__.py +0 -5
  109. fractal_server/tasks/endpoint_operations.py +13 -19
  110. fractal_server/tasks/utils.py +35 -0
  111. fractal_server/tasks/{_TaskCollectPip.py → v1/_TaskCollectPip.py} +3 -3
  112. fractal_server/tasks/{background_operations.py → v1/background_operations.py} +18 -50
  113. fractal_server/tasks/v1/get_collection_data.py +14 -0
  114. fractal_server/tasks/v2/_TaskCollectPip.py +103 -0
  115. fractal_server/tasks/v2/background_operations.py +381 -0
  116. fractal_server/tasks/v2/get_collection_data.py +14 -0
  117. {fractal_server-1.4.10.dist-info → fractal_server-2.0.0a1.dist-info}/METADATA +1 -1
  118. fractal_server-2.0.0a1.dist-info/RECORD +160 -0
  119. fractal_server/app/runner/_slurm/.gitignore +0 -2
  120. fractal_server/app/runner/common.py +0 -311
  121. fractal_server-1.4.10.dist-info/RECORD +0 -98
  122. /fractal_server/app/runner/{_slurm → executors/slurm}/remote.py +0 -0
  123. /fractal_server/app/runner/{_local → v1/_local}/executor.py +0 -0
  124. {fractal_server-1.4.10.dist-info → fractal_server-2.0.0a1.dist-info}/LICENSE +0 -0
  125. {fractal_server-1.4.10.dist-info → fractal_server-2.0.0a1.dist-info}/WHEEL +0 -0
  126. {fractal_server-1.4.10.dist-info → fractal_server-2.0.0a1.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,103 @@
1
+ from pathlib import Path
2
+ from typing import Optional
3
+
4
+ from pydantic import root_validator
5
+
6
+ from fractal_server.app.schemas.v2 import ManifestV2
7
+ from fractal_server.app.schemas.v2 import TaskCollectPipV2
8
+
9
+
10
+ class _TaskCollectPip(TaskCollectPipV2):
11
+ """
12
+ Internal TaskCollectPip schema
13
+
14
+ Differences with its parent class (`TaskCollectPip`):
15
+
16
+ 1. We check if the package corresponds to a path in the filesystem, and
17
+ whether it exists (via new validator `check_local_package`, new
18
+ method `is_local_package` and new attribute `package_path`).
19
+ 2. We include an additional `package_manifest` attribute.
20
+ 3. We expose an additional attribute `package_name`, which is filled
21
+ during task collection.
22
+ """
23
+
24
+ package_name: Optional[str] = None
25
+ package_path: Optional[Path] = None
26
+ package_manifest: Optional[ManifestV2] = None
27
+
28
+ @property
29
+ def is_local_package(self) -> bool:
30
+ return bool(self.package_path)
31
+
32
+ @root_validator(pre=True)
33
+ def check_local_package(cls, values):
34
+ """
35
+ Checks if package corresponds to an existing path on the filesystem
36
+
37
+ In this case, the user is providing directly a package file, rather
38
+ than a remote one from PyPI. We set the `package_path` attribute and
39
+ get the actual package name and version from the package file name.
40
+ """
41
+ if "/" in values["package"]:
42
+ package_path = Path(values["package"])
43
+ if not package_path.is_absolute():
44
+ raise ValueError("Package path must be absolute")
45
+ if package_path.exists():
46
+ values["package_path"] = package_path
47
+ (
48
+ values["package"],
49
+ values["version"],
50
+ *_,
51
+ ) = package_path.name.split("-")
52
+ else:
53
+ raise ValueError(f"Package {package_path} does not exist.")
54
+ return values
55
+
56
+ @property
57
+ def package_source(self) -> str:
58
+ """
59
+ NOTE: As of PR #1188 in `fractal-server`, the attribute
60
+ `self.package_name` is normalized; this means e.g. that `_` is
61
+ replaced by `-`. To guarantee backwards compatibility with
62
+ `Task.source` attributes created before this change, we still replace
63
+ `-` with `_` upon generation of the `source` attribute, in this
64
+ method.
65
+ """
66
+ if not self.package_name or not self.package_version:
67
+ raise ValueError(
68
+ "Cannot construct `package_source` property with "
69
+ f"{self.package_name=} and {self.package_version=}."
70
+ )
71
+ if self.is_local_package:
72
+ collection_type = "pip_local"
73
+ else:
74
+ collection_type = "pip_remote"
75
+
76
+ package_extras = self.package_extras or ""
77
+ if self.python_version:
78
+ python_version = f"py{self.python_version}"
79
+ else:
80
+ python_version = "" # FIXME: can we allow this?
81
+
82
+ source = ":".join(
83
+ (
84
+ collection_type,
85
+ self.package_name.replace("-", "_"), # see method docstring
86
+ self.package_version,
87
+ package_extras,
88
+ python_version,
89
+ )
90
+ )
91
+ return source
92
+
93
+ def check(self):
94
+ """
95
+ Verify that the package has all attributes that are needed to continue
96
+ with task collection
97
+ """
98
+ if not self.package_name:
99
+ raise ValueError("`package_name` attribute is not set")
100
+ if not self.package_version:
101
+ raise ValueError("`package_version` attribute is not set")
102
+ if not self.package_manifest:
103
+ raise ValueError("`package_manifest` attribute is not set")
@@ -0,0 +1,381 @@
1
+ """
2
+ The main function exported from this module is `background_collect_pip`, which
3
+ is used as a background task for the task-collection endpoint.
4
+ """
5
+ import json
6
+ from pathlib import Path
7
+ from shutil import rmtree as shell_rmtree
8
+
9
+ from ..utils import _init_venv
10
+ from ..utils import _normalize_package_name
11
+ from ..utils import get_collection_log
12
+ from ..utils import get_collection_path
13
+ from ..utils import get_log_path
14
+ from ..utils import slugify_task_name
15
+ from ._TaskCollectPip import _TaskCollectPip
16
+ from fractal_server.app.db import DBSyncSession
17
+ from fractal_server.app.db import get_sync_db
18
+ from fractal_server.app.models import State
19
+ from fractal_server.app.models.v2 import TaskV2
20
+ from fractal_server.app.schemas.v2 import TaskCollectStatusV2
21
+ from fractal_server.app.schemas.v2 import TaskCreateV2
22
+ from fractal_server.app.schemas.v2 import TaskReadV2
23
+ from fractal_server.logger import close_logger
24
+ from fractal_server.logger import get_logger
25
+ from fractal_server.logger import set_logger
26
+ from fractal_server.utils import execute_command
27
+
28
+
29
+ async def _pip_install(
30
+ venv_path: Path,
31
+ task_pkg: _TaskCollectPip,
32
+ logger_name: str,
33
+ ) -> Path:
34
+ """
35
+ Install package in venv
36
+
37
+ Args:
38
+ venv_path:
39
+ task_pkg:
40
+ logger_name:
41
+
42
+ Returns:
43
+ The location of the package.
44
+ """
45
+
46
+ logger = get_logger(logger_name)
47
+
48
+ pip = venv_path / "venv/bin/pip"
49
+
50
+ extras = f"[{task_pkg.package_extras}]" if task_pkg.package_extras else ""
51
+
52
+ if task_pkg.is_local_package:
53
+ pip_install_str = f"{task_pkg.package_path.as_posix()}{extras}"
54
+ else:
55
+ version_string = (
56
+ f"=={task_pkg.package_version}" if task_pkg.package_version else ""
57
+ )
58
+ pip_install_str = f"{task_pkg.package}{extras}{version_string}"
59
+
60
+ cmd_install = f"{pip} install {pip_install_str}"
61
+ cmd_inspect = f"{pip} show {task_pkg.package}"
62
+
63
+ await execute_command(
64
+ cwd=venv_path,
65
+ command=f"{pip} install --upgrade pip",
66
+ logger_name=logger_name,
67
+ )
68
+ await execute_command(
69
+ cwd=venv_path, command=cmd_install, logger_name=logger_name
70
+ )
71
+ if task_pkg.pinned_package_versions:
72
+ for (
73
+ pinned_pkg_name,
74
+ pinned_pkg_version,
75
+ ) in task_pkg.pinned_package_versions.items():
76
+
77
+ logger.debug(
78
+ "Specific version required: "
79
+ f"{pinned_pkg_name}=={pinned_pkg_version}"
80
+ )
81
+ logger.debug(
82
+ "Preliminary check: verify that "
83
+ f"{pinned_pkg_version} is already installed"
84
+ )
85
+ stdout_inspect = await execute_command(
86
+ cwd=venv_path,
87
+ command=f"{pip} show {pinned_pkg_name}",
88
+ logger_name=logger_name,
89
+ )
90
+ current_version = next(
91
+ line.split()[-1]
92
+ for line in stdout_inspect.split("\n")
93
+ if line.startswith("Version:")
94
+ )
95
+ if current_version != pinned_pkg_version:
96
+ logger.debug(
97
+ f"Currently installed version of {pinned_pkg_name} "
98
+ f"({current_version}) differs from pinned version "
99
+ f"({pinned_pkg_version}); "
100
+ f"install version {pinned_pkg_version}."
101
+ )
102
+ await execute_command(
103
+ cwd=venv_path,
104
+ command=(
105
+ f"{pip} install "
106
+ f"{pinned_pkg_name}=={pinned_pkg_version}"
107
+ ),
108
+ logger_name=logger_name,
109
+ )
110
+ else:
111
+ logger.debug(
112
+ f"Currently installed version of {pinned_pkg_name} "
113
+ f"({current_version}) already matches the pinned version."
114
+ )
115
+
116
+ # Extract package installation path from `pip show`
117
+ stdout_inspect = await execute_command(
118
+ cwd=venv_path, command=cmd_inspect, logger_name=logger_name
119
+ )
120
+
121
+ location = Path(
122
+ next(
123
+ line.split()[-1]
124
+ for line in stdout_inspect.split("\n")
125
+ if line.startswith("Location:")
126
+ )
127
+ )
128
+
129
+ # NOTE
130
+ # https://packaging.python.org/en/latest/specifications/recording-installed-packages/
131
+ # This directory is named as {name}-{version}.dist-info, with name and
132
+ # version fields corresponding to Core metadata specifications. Both
133
+ # fields must be normalized (see the name normalization specification and
134
+ # the version normalization specification), and replace dash (-)
135
+ # characters with underscore (_) characters, so the .dist-info directory
136
+ # always has exactly one dash (-) character in its stem, separating the
137
+ # name and version fields.
138
+ package_root = location / (task_pkg.package.replace("-", "_"))
139
+ logger.debug(f"[_pip install] {location=}")
140
+ logger.debug(f"[_pip install] {task_pkg.package=}")
141
+ logger.debug(f"[_pip install] {package_root=}")
142
+ if not package_root.exists():
143
+ raise RuntimeError(
144
+ "Could not determine package installation location."
145
+ )
146
+ return package_root
147
+
148
+
149
+ async def _create_venv_install_package(
150
+ *,
151
+ task_pkg: _TaskCollectPip,
152
+ path: Path,
153
+ logger_name: str,
154
+ ) -> tuple[Path, Path]:
155
+ """Create venv and install package
156
+
157
+ Args:
158
+ path: the directory in which to create the environment
159
+ task_pkg: object containing the different metadata required to install
160
+ the package
161
+
162
+ Returns:
163
+ python_bin: path to venv's python interpreter
164
+ package_root: the location of the package manifest
165
+ """
166
+
167
+ # Normalize package name
168
+ task_pkg.package_name = _normalize_package_name(task_pkg.package_name)
169
+ task_pkg.package = _normalize_package_name(task_pkg.package)
170
+
171
+ python_bin = await _init_venv(
172
+ path=path,
173
+ python_version=task_pkg.python_version,
174
+ logger_name=logger_name,
175
+ )
176
+ package_root = await _pip_install(
177
+ venv_path=path, task_pkg=task_pkg, logger_name=logger_name
178
+ )
179
+ return python_bin, package_root
180
+
181
+
182
+ async def create_package_environment_pip(
183
+ *,
184
+ task_pkg: _TaskCollectPip,
185
+ venv_path: Path,
186
+ logger_name: str,
187
+ ) -> list[TaskCreateV2]:
188
+ """
189
+ Create environment, install package, and prepare task list
190
+ """
191
+
192
+ logger = get_logger(logger_name)
193
+
194
+ # Normalize package name
195
+ task_pkg.package_name = _normalize_package_name(task_pkg.package_name)
196
+ task_pkg.package = _normalize_package_name(task_pkg.package)
197
+
198
+ # Only proceed if package, version and manifest attributes are set
199
+ task_pkg.check()
200
+
201
+ try:
202
+
203
+ logger.debug("Creating venv and installing package")
204
+ python_bin, package_root = await _create_venv_install_package(
205
+ path=venv_path,
206
+ task_pkg=task_pkg,
207
+ logger_name=logger_name,
208
+ )
209
+ logger.debug("Venv creation and package installation ended correctly.")
210
+
211
+ # Prepare task_list with appropriate metadata
212
+ logger.debug("Creating task list from manifest")
213
+ task_list = []
214
+ for t in task_pkg.package_manifest.task_list:
215
+ # Fill in attributes for TaskCreate
216
+ task_attributes = {}
217
+ task_attributes["version"] = task_pkg.package_version
218
+ task_name_slug = slugify_task_name(t.name)
219
+ task_attributes[
220
+ "source"
221
+ ] = f"{task_pkg.package_source}:{task_name_slug}"
222
+ # Executables
223
+ if t.executable_non_parallel is not None:
224
+ non_parallel_path = package_root / t.executable_non_parallel
225
+ if not non_parallel_path.exists():
226
+ raise FileNotFoundError(
227
+ f"Cannot find executable `{non_parallel_path}` "
228
+ f"for task `{t.name}`"
229
+ )
230
+ task_attributes[
231
+ "command_non_parallel"
232
+ ] = f"{python_bin.as_posix()} {non_parallel_path.as_posix()}"
233
+ if t.executable_parallel is not None:
234
+ parallel_path = package_root / t.executable_parallel
235
+ if not parallel_path.exists():
236
+ raise FileNotFoundError(
237
+ f"Cannot find executable `{parallel_path}` "
238
+ f"for task `{t.name}`"
239
+ )
240
+ task_attributes[
241
+ "command_parallel"
242
+ ] = f"{python_bin.as_posix()} {parallel_path.as_posix()}"
243
+
244
+ manifest = task_pkg.package_manifest
245
+ if manifest.has_args_schemas:
246
+ task_attributes[
247
+ "args_schema_version"
248
+ ] = manifest.args_schema_version
249
+
250
+ this_task = TaskCreateV2(
251
+ **t.dict(
252
+ exclude={"executable_non_parallel", "executable_parallel"}
253
+ ),
254
+ **task_attributes,
255
+ )
256
+ task_list.append(this_task)
257
+ logger.debug("Task list created correctly")
258
+ except Exception as e:
259
+ logger.error("Task manifest loading failed")
260
+ raise e
261
+ return task_list
262
+
263
+
264
+ def _get_task_type(task: TaskCreateV2) -> str:
265
+ if task.command_non_parallel is None:
266
+ return "parallel"
267
+ elif task.command_parallel is None:
268
+ return "non_parallel"
269
+ else:
270
+ return "compound"
271
+
272
+
273
+ async def _insert_tasks(
274
+ task_list: list[TaskCreateV2],
275
+ db: DBSyncSession,
276
+ ) -> list[TaskV2]:
277
+ """
278
+ Insert tasks into database
279
+ """
280
+
281
+ task_db_list = [
282
+ TaskV2(**t.dict(), type=_get_task_type(t)) for t in task_list
283
+ ]
284
+ db.add_all(task_db_list)
285
+ db.commit()
286
+ for t in task_db_list:
287
+ db.refresh(t)
288
+ db.close()
289
+ return task_db_list
290
+
291
+
292
+ async def background_collect_pip(
293
+ state_id: int,
294
+ venv_path: Path,
295
+ task_pkg: _TaskCollectPip,
296
+ ) -> None:
297
+ """
298
+ Install package and collect tasks
299
+
300
+ Install a python package and collect the tasks it provides according to
301
+ the manifest.
302
+
303
+ In case of error, copy the log into the state and delete the package
304
+ directory.
305
+ """
306
+ logger_name = task_pkg.package.replace("/", "_")
307
+ logger = set_logger(
308
+ logger_name=logger_name,
309
+ log_file_path=get_log_path(venv_path),
310
+ )
311
+ logger.debug("Start background task collection")
312
+ for key, value in task_pkg.dict(exclude={"package_manifest"}).items():
313
+ logger.debug(f"{key}: {value}")
314
+
315
+ with next(get_sync_db()) as db:
316
+ state: State = db.get(State, state_id)
317
+ data = TaskCollectStatusV2(**state.data)
318
+ data.info = None
319
+
320
+ try:
321
+ # install
322
+ logger.debug("Task-collection status: installing")
323
+ data.status = "installing"
324
+
325
+ state.data = data.sanitised_dict()
326
+ db.merge(state)
327
+ db.commit()
328
+ task_list = await create_package_environment_pip(
329
+ venv_path=venv_path,
330
+ task_pkg=task_pkg,
331
+ logger_name=logger_name,
332
+ )
333
+
334
+ # collect
335
+ logger.debug("Task-collection status: collecting")
336
+ data.status = "collecting"
337
+ state.data = data.sanitised_dict()
338
+ db.merge(state)
339
+ db.commit()
340
+ tasks = await _insert_tasks(task_list=task_list, db=db)
341
+
342
+ # finalise
343
+ logger.debug("Task-collection status: finalising")
344
+ collection_path = get_collection_path(venv_path)
345
+ data.task_list = [
346
+ TaskReadV2(**task.model_dump()) for task in tasks
347
+ ]
348
+ with collection_path.open("w") as f:
349
+ json.dump(data.sanitised_dict(), f, indent=2)
350
+
351
+ # Update DB
352
+ data.status = "OK"
353
+ data.log = get_collection_log(venv_path)
354
+ state.data = data.sanitised_dict()
355
+ db.merge(state)
356
+ db.commit()
357
+
358
+ # Write last logs to file
359
+ logger.debug("Task-collection status: OK")
360
+ logger.info("Background task collection completed successfully")
361
+ close_logger(logger)
362
+ db.close()
363
+
364
+ except Exception as e:
365
+ # Write last logs to file
366
+ logger.debug("Task-collection status: fail")
367
+ logger.info(f"Background collection failed. Original error: {e}")
368
+ close_logger(logger)
369
+
370
+ # Update db
371
+ data.status = "fail"
372
+ data.info = f"Original error: {e}"
373
+ data.log = get_collection_log(venv_path)
374
+ state.data = data.sanitised_dict()
375
+ db.merge(state)
376
+ db.commit()
377
+ db.close()
378
+
379
+ # Delete corrupted package dir
380
+ logger.info(f"Now deleting temporary folder {venv_path}")
381
+ shell_rmtree(venv_path)
@@ -0,0 +1,14 @@
1
+ import json
2
+ from pathlib import Path
3
+
4
+ from fractal_server.app.schemas.v2 import TaskCollectStatusV2
5
+ from fractal_server.tasks.utils import get_absolute_venv_path
6
+ from fractal_server.tasks.utils import get_collection_path
7
+
8
+
9
+ def get_collection_data(venv_path: Path) -> TaskCollectStatusV2:
10
+ package_path = get_absolute_venv_path(venv_path)
11
+ collection_path = get_collection_path(package_path)
12
+ with collection_path.open() as f:
13
+ data = json.load(f)
14
+ return TaskCollectStatusV2(**data)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fractal-server
3
- Version: 1.4.10
3
+ Version: 2.0.0a1
4
4
  Summary: Server component of the Fractal analytics platform
5
5
  Home-page: https://github.com/fractal-analytics-platform/fractal-server
6
6
  License: BSD-3-Clause
@@ -0,0 +1,160 @@
1
+ fractal_server/__init__.py,sha256=nTWdIbpub_qGvHveAOSoZcQPCAXn60jq4tWgPbd3jQk,24
2
+ fractal_server/__main__.py,sha256=CocbzZooX1UtGqPi55GcHGNxnrJXFg5tUU5b3wyFCyo,4958
3
+ fractal_server/alembic.ini,sha256=MWwi7GzjzawI9cCAK1LW7NxIBQDUqD12-ptJoq5JpP0,3153
4
+ fractal_server/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
+ fractal_server/app/db/__init__.py,sha256=WZEVfdJAX7ZyBM1ngfEGeqWWcjK_NygtCbawpmbwGpU,4042
6
+ fractal_server/app/models/__init__.py,sha256=VP6cx5xYP6p1r6CubqCoyQaUyCYY7duTRwCCIEyndbw,183
7
+ fractal_server/app/models/linkuserproject.py,sha256=eQaourbGRshvlMVlKzLYJKHEjfsW1CbWws9yW4eHXhA,567
8
+ fractal_server/app/models/security.py,sha256=UG9wCVA5GRSyHrYEFhH8lIF1hXykxsr9LSi8_dFToMY,3378
9
+ fractal_server/app/models/state.py,sha256=GUxmaDI542JI_eu5zIB91YBOt8dwkcSd4Om5yxHHy6Y,1090
10
+ fractal_server/app/models/v1/__init__.py,sha256=MyQa9Xi-O8tvZ1OHEo275uIuRit-CYZ5Yqh98vk4CUM,413
11
+ fractal_server/app/models/v1/dataset.py,sha256=99GDgt7njx8yYQApkImqp_7bHA5HH3ElvbR6Oyj9kVI,2017
12
+ fractal_server/app/models/v1/job.py,sha256=QLGXcWdVRHaUHQNDapYYlLpEfw4K7QyD8TmcwhrWw2o,3304
13
+ fractal_server/app/models/v1/project.py,sha256=sDmAFLOBK5o4dLrwsIN681JcT5J1rzoUNTV9QVqwnA8,859
14
+ fractal_server/app/models/v1/task.py,sha256=3xZqNeFYUqslh8ddMSXF2nO4nIiOD8T5Ij37wY20kss,2782
15
+ fractal_server/app/models/v1/workflow.py,sha256=dnY5eMaOe3oZv8arn00RNX9qVkBtTLG-vYdWXcQuyo4,3950
16
+ fractal_server/app/models/v2/__init__.py,sha256=2T_ZXpP9n5IktoX3bkQUKUKzGAN5tJiR1LKWOtOCclM,400
17
+ fractal_server/app/models/v2/dataset.py,sha256=3G0PO9tY3FTOlEj4we06V3QbWGfvggXpq00xQKNp8EA,1475
18
+ fractal_server/app/models/v2/job.py,sha256=PCJf0_NYIc5boXL6e6P72BvYJGydCZOGKnW2DT4Sw9g,1535
19
+ fractal_server/app/models/v2/project.py,sha256=VJvkQexFSS150KxDQxOWBAZYDlV3Ve4l3h2oabzE-tM,845
20
+ fractal_server/app/models/v2/task.py,sha256=9ZPhug3VWyeqgT8wQ9_8ZXQ2crSiiicRipxrxTslOso,3257
21
+ fractal_server/app/models/v2/workflow.py,sha256=4pSTeZC78OQbgHHC5S0ge6pK1AP6ak7Qew_0ZNM9xuw,1256
22
+ fractal_server/app/models/v2/workflowtask.py,sha256=f2a85MSAyBAdC7oG6SR8mViMNqlomQWaIB08n3ZhT-0,2727
23
+ fractal_server/app/routes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
+ fractal_server/app/routes/admin/v1.py,sha256=uY6H1znlAlrM9e1MG2EThTqwciCl87Twew34JM5W6IU,13981
25
+ fractal_server/app/routes/admin/v2.py,sha256=TFG6oshQXY5QlW_SIxVlQw5rSJm0tqDEnijmHE2ea-4,8891
26
+ fractal_server/app/routes/api/__init__.py,sha256=EVyZrEq3I_1643QGTPCC5lgCp4xH_auYbrFfogTm4pc,315
27
+ fractal_server/app/routes/api/v1/__init__.py,sha256=Y2HQdG197J0a7DyQEE2jn53IfxD0EHGhzK1I2JZuEck,958
28
+ fractal_server/app/routes/api/v1/_aux_functions.py,sha256=eC5exnGj9jnJqx0ccecoNaipxDeK2ZsR1ev0syH5x-Y,11955
29
+ fractal_server/app/routes/api/v1/dataset.py,sha256=7z57FGBTCyz_G6Ivr1PeGIXGyd15fs4iLD2aJUxnslA,16911
30
+ fractal_server/app/routes/api/v1/job.py,sha256=NwXyhvvzdPDor0ts8Im__9-I0P1H943s4NXIRgaz7PM,5436
31
+ fractal_server/app/routes/api/v1/project.py,sha256=keqA0gYM48lyFP8zJgZ6cv34V6Js8DD-gbzE316H46k,15765
32
+ fractal_server/app/routes/api/v1/task.py,sha256=4zUXMtq5M95XjaZs1t9oibYHiDIwxpM-3sTAxN95aRk,6123
33
+ fractal_server/app/routes/api/v1/task_collection.py,sha256=LtOakYF30XiKo4ei7i09WSZ7u4D9pPJhhQBxHaSLr9M,8457
34
+ fractal_server/app/routes/api/v1/workflow.py,sha256=ZObifWTPi100oRQ1wEER8Sgsr3Neo8QVdCCFQnWMNZ0,10930
35
+ fractal_server/app/routes/api/v1/workflowtask.py,sha256=ox-DIIqYV4K35hCu86eGa2SHnR5IQml-I00UHEwnmHQ,5579
36
+ fractal_server/app/routes/api/v2/__init__.py,sha256=wCd4eBUnZlP43uoFDKtrFMZBwDQz6pX8owGs3pdtixk,1217
37
+ fractal_server/app/routes/api/v2/_aux_functions.py,sha256=AA_DHK5OfLs9AEm_uWlf3O6zV0_A4j23dp1PDBbxsyc,14142
38
+ fractal_server/app/routes/api/v2/dataset.py,sha256=Djq-4IwAKehgBRvSCtQba4ctgKu5P113HyL7Nat7JHM,9702
39
+ fractal_server/app/routes/api/v2/images.py,sha256=5voGxRbx5qTnrRbnku-Q6neE1KcW8unOaaLuOFNFGyA,5765
40
+ fractal_server/app/routes/api/v2/job.py,sha256=9mXaKCX_N3FXM0GIxdE49nWl_hJZ8CBLBIaMMhaCKOM,5334
41
+ fractal_server/app/routes/api/v2/project.py,sha256=YYche5eKdQu-Wnd2ob_zwxz-cVz3x3-zC-pFS0GWD6M,6091
42
+ fractal_server/app/routes/api/v2/submit.py,sha256=I8asPxY3KUogLbeDi0uPNbVLQBunOwMHCp1fbTYmdyg,7219
43
+ fractal_server/app/routes/api/v2/task.py,sha256=gJ0LruSk-Q1iMw8ZOX8C0wrZ4S4DGlQTr_5SdJJud0Q,7130
44
+ fractal_server/app/routes/api/v2/task_collection.py,sha256=kxSOOSsTFq2w1SeDwMeX6mSDPYbH5Uds18xpdLU5kTo,8466
45
+ fractal_server/app/routes/api/v2/workflow.py,sha256=MPfwyrksZ4tA5eh1ZULoKT7L2P8w_M-rgmcyaUNvQTE,12580
46
+ fractal_server/app/routes/api/v2/workflowtask.py,sha256=8Ibu71nSJg-v5d5hJVOz9YRGomj7dVOaiIhQK50_O6s,8895
47
+ fractal_server/app/routes/auth.py,sha256=Xv80iqdyfY3lyicYs2Y8B6zEDEnyUu_H6_6psYtv3R4,4885
48
+ fractal_server/app/routes/aux/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
49
+ fractal_server/app/routes/aux/_job.py,sha256=5gKgvArAruSkMQuPN34Vvzi89WJbwWPsx0oDAa_iXu4,1248
50
+ fractal_server/app/routes/aux/_runner.py,sha256=psW6fsoo_VrAHrD5UQPbqFYikCp0m16VRymC-U1yUTk,675
51
+ fractal_server/app/runner/.gitignore,sha256=ytzN_oyHWXrGU7iFAtoHSTUbM6Rn6kG0Zkddg0xZk6s,16
52
+ fractal_server/app/runner/async_wrap.py,sha256=_O6f8jftKYXG_DozkmlrDBhoiK9QhE9MablOyECq2_M,829
53
+ fractal_server/app/runner/components.py,sha256=ZF8ct_Ky5k8IAcrmpYOZ-bc6OBgdELEighYVqFDEbZg,119
54
+ fractal_server/app/runner/exceptions.py,sha256=_qZ_t8O4umAdJ1ikockiF5rDJuxnEskrGrLjZcnQl7A,4159
55
+ fractal_server/app/runner/executors/slurm/__init__.py,sha256=Cjn1rYvljddi96tAwS-qqGkNfOcfPzjChdaEZEObCcM,65
56
+ fractal_server/app/runner/executors/slurm/_batching.py,sha256=1P6CgrAOCK9u_EvNFTumcQ-PcZMpocCaSAyNr0YB1js,8841
57
+ fractal_server/app/runner/executors/slurm/_check_jobs_status.py,sha256=8d29a7DQ2xoWxoFQCnFfTpHER-qBX8mEatl4Dw5HU_o,1908
58
+ fractal_server/app/runner/executors/slurm/_executor_wait_thread.py,sha256=J3tjAx33nBgW4eHAXDte7hDs7Oe9FLEZaElEt8inrbg,4421
59
+ fractal_server/app/runner/executors/slurm/_slurm_config.py,sha256=rF37XDImX1QoWx37MC5hSM9AuY_KfHU5gaWwN4vl4Zk,15552
60
+ fractal_server/app/runner/executors/slurm/_subprocess_run_as_user.py,sha256=8CCtxWCuB5UDst3C_WJxBU77xwPrpDyq7iMCZMnodXU,5123
61
+ fractal_server/app/runner/executors/slurm/executor.py,sha256=iqp73KdTPCnVtMA-FeEGXxtnYuzz-UB_7UnhNYWqIaU,44504
62
+ fractal_server/app/runner/executors/slurm/remote.py,sha256=wLziIsGdSMiO-jIXM8x77JRK82g_2hx0iBKTiMghuIo,5852
63
+ fractal_server/app/runner/filenames.py,sha256=9lwu3yB4C67yiijYw8XIKaLFn3mJUt6_TCyVFM_aZUQ,206
64
+ fractal_server/app/runner/set_start_and_last_task_index.py,sha256=-q4zVybAj8ek2XlbENKlfOAJ39hT_zoJoZkqzDqiAMY,1254
65
+ fractal_server/app/runner/task_files.py,sha256=c5mggMy7BIK_yBUvbimFgvKFZPKKDu6RRfWepwinBVk,3219
66
+ fractal_server/app/runner/v1/__init__.py,sha256=meqMG2UejFa_1hm5xlsmkDxsM7Y_hqftsexuteQXOrE,13608
67
+ fractal_server/app/runner/v1/_common.py,sha256=hlSh-lUWbDCWP2k4isswoU9hh7huoT2Zy7cEwjXwnzk,21238
68
+ fractal_server/app/runner/v1/_local/__init__.py,sha256=CMKYo01skbGKCc2UHp7HDe4-uu7EKS50a6tSllwCxNk,6919
69
+ fractal_server/app/runner/v1/_local/_local_config.py,sha256=hM7SPxR07luXPcXdrWXRpEB2uOyjSSRUdqW3QBKJn9c,3147
70
+ fractal_server/app/runner/v1/_local/_submit_setup.py,sha256=kvNPT7ey2mEamORzPMMVThbFHtzZcSr-0A9tYw9uVDA,1493
71
+ fractal_server/app/runner/v1/_local/executor.py,sha256=QrJlD77G6q4WohoJQO7XXbvi2RlCUsNvMnPDEZIoAqA,3620
72
+ fractal_server/app/runner/v1/_slurm/__init__.py,sha256=ohvDMhzOOzk1Qe1W3wY1MGxCQGRKmCleQV45EO1rVZc,10839
73
+ fractal_server/app/runner/v1/_slurm/_submit_setup.py,sha256=UoPzhxN86FeIRXJlWouulBKoguNFaOv2j_s3-9MwXCs,2732
74
+ fractal_server/app/runner/v1/_slurm/get_slurm_config.py,sha256=6TLWQon8hSicsD7c3yXK4P9xeId0s_H3HOOeMUVGVss,5977
75
+ fractal_server/app/runner/v1/common.py,sha256=_L-vjLnWato80VdlB_BFN4G8P4jSM07u-5cnl1T3S34,3294
76
+ fractal_server/app/runner/v1/handle_failed_job.py,sha256=bHzScC_aIlU3q-bQxGW6rfWV4xbZ2tho_sktjsAs1no,4684
77
+ fractal_server/app/runner/v2/__init__.py,sha256=xHSI2eoalyEtjDcFIFJdYMZywOM0b9Tj-lkL40H77u0,12431
78
+ fractal_server/app/runner/v2/_local/__init__.py,sha256=wTXCiNRG6WkWPw79tvguOCOVvMcXt5vnVwUCrPspVss,6163
79
+ fractal_server/app/runner/v2/_local/_local_config.py,sha256=lR0Js-l63mQUzN9hK0HkfdLsrTf-W6GHvPvbPC64amY,3630
80
+ fractal_server/app/runner/v2/_local/_submit_setup.py,sha256=deagsLSy6A3ZHKaSDcQqrdvbQVM3i4kgyTcbVc0tC5U,1614
81
+ fractal_server/app/runner/v2/_local/executor.py,sha256=QrJlD77G6q4WohoJQO7XXbvi2RlCUsNvMnPDEZIoAqA,3620
82
+ fractal_server/app/runner/v2/_slurm/__init__.py,sha256=CJgbawVty4gvBitIjcl2JgfE4FCnDHWCJJfNF4YjH8s,4395
83
+ fractal_server/app/runner/v2/_slurm/_submit_setup.py,sha256=3zK_GYN5ou_HFLP9N2--Nf-XUULqSWMRk1MIr2tL9-A,2847
84
+ fractal_server/app/runner/v2/_slurm/get_slurm_config.py,sha256=sqP-hs58TPt849rx10VRFKWX_DgLDPQcKZJcE0zKBXs,6621
85
+ fractal_server/app/runner/v2/deduplicate_list.py,sha256=UShgbFy8d8elUE5sa1_jLDqQWip4Bi21VDhcFFM0fpU,571
86
+ fractal_server/app/runner/v2/handle_failed_job.py,sha256=t4MjRH_7OhDMqZHP5UeZJ9_RlIJVj-F5VYtl34JBXO8,5149
87
+ fractal_server/app/runner/v2/merge_outputs.py,sha256=IHuHqbKmk97K35BFvTrKVBs60z3e_--OzXTnsvmA02c,1281
88
+ fractal_server/app/runner/v2/runner.py,sha256=wvfaaVnqzap0AJwihBFntLBEprh1gV88l3wQVSAPPo8,11027
89
+ fractal_server/app/runner/v2/runner_functions.py,sha256=pHGBbah0UlmN7fukmorU-AZq4WW8Aj8oSWxJwr8Woh4,10047
90
+ fractal_server/app/runner/v2/runner_functions_low_level.py,sha256=Pp3hsj1i1t4ExDMcUBkQ27yEi7kjlvymY6q6eDiC8DM,3845
91
+ fractal_server/app/runner/v2/task_interface.py,sha256=QwoTQnsBzzPzfsK6LIy-FfKRU_vItlrlJG0ViYN3D64,1243
92
+ fractal_server/app/runner/v2/v1_compat.py,sha256=dR_ukOppfc1XmInvOyKiVLdh15OSEK7ZX1l_DxYI8Sg,495
93
+ fractal_server/app/schemas/__init__.py,sha256=VL55f3CTFngXHYkOsFaLBEEkEEewEWI5ODlcGTI7cqA,157
94
+ fractal_server/app/schemas/_validators.py,sha256=s9a6AX4-3Vfoy1Y_HMQA3lXm4FLdmnODYUD4lfsJr6w,2549
95
+ fractal_server/app/schemas/json_schemas/manifest.json,sha256=yXYKHbYXPYSkSXMTLfTpfCUGBtmQuPTk1xuSXscdba4,1787
96
+ fractal_server/app/schemas/state.py,sha256=t4XM04aqxeluh8MfvD7LfEc-8-dOmUVluZHhLsfxxkc,692
97
+ fractal_server/app/schemas/user.py,sha256=rE8WgBz-ceVUs0Sz2ZwcjUrSTZTnS0ys5SBtD2XD9r8,3113
98
+ fractal_server/app/schemas/v1/__init__.py,sha256=gZLfkANl4YtZ7aV3PFoUj5w0m1-riQv9iRomJhZRLZo,2078
99
+ fractal_server/app/schemas/v1/applyworkflow.py,sha256=uuIh7fHlHEL4yLqL-dePI6-nfCsqgBYATmht7w_KITw,4302
100
+ fractal_server/app/schemas/v1/dataset.py,sha256=n71lNUO3JLy2K3IM9BZM2Fk1EnKQOTU7pm2s2rJ1FGY,3444
101
+ fractal_server/app/schemas/v1/dumps.py,sha256=67VXnyLh_0Ufo7rPM2jZ9P9rk0CnYcVAkilx_cLX6sg,1274
102
+ fractal_server/app/schemas/v1/manifest.py,sha256=Yht7guhs0Pcl2U0RMOCbI_UHBZ9YO_YU0H8hxACx3TY,3829
103
+ fractal_server/app/schemas/v1/project.py,sha256=TO2TjI4m9FO-A9IB9lUCld7E4Ld0k4MacLcyA9j6Qi4,1218
104
+ fractal_server/app/schemas/v1/task.py,sha256=7BxOZ_qoRQ8n3YbQpDvB7VMcxB5fSYQmR5RLIWhuJ5U,3704
105
+ fractal_server/app/schemas/v1/task_collection.py,sha256=uvq9bcMaGD_qHsh7YtcpoSAkVAbw12eY4DocIO3MKOg,3057
106
+ fractal_server/app/schemas/v1/workflow.py,sha256=tuOs5E5Q_ozA8if7YPZ07cQjzqB_QMkBS4u92qo4Ro0,4618
107
+ fractal_server/app/schemas/v2/__init__.py,sha256=U3WXzQ1o26dSq3jR8n0rA-Zsq6uIpoN3oCKPOABytvA,1704
108
+ fractal_server/app/schemas/v2/dataset.py,sha256=ThUwme1uVhamZhlvlN0873bTDTbhTaoFanQBlgp0F5k,1839
109
+ fractal_server/app/schemas/v2/dumps.py,sha256=bEhfJrxBon1NzqS3bha16pj-59qPY_VWk_vOjsXsvAo,2047
110
+ fractal_server/app/schemas/v2/job.py,sha256=zfF9K3v4jWUJ7M482ta2CkqUJ4tVT4XfVt60p9IRhP0,3250
111
+ fractal_server/app/schemas/v2/manifest.py,sha256=N37IWohcfO3_y2l8rVM0h_1nZq7m4Izxk9iL1vtwBJw,6243
112
+ fractal_server/app/schemas/v2/project.py,sha256=Okm9n4KqUUs8oxFo6yIV3Y_4mJznLeKCI2ccjY0X8Vo,814
113
+ fractal_server/app/schemas/v2/task.py,sha256=vZPIsqBVM9RJDkk81EvJQQhQa-LNSh5YGdP-KM9AKgs,3607
114
+ fractal_server/app/schemas/v2/task_collection.py,sha256=Jk-r3f2RIHRAXbej9xnz_WsPrIrod1P_FIWK1iEVkes,2993
115
+ fractal_server/app/schemas/v2/workflow.py,sha256=KnzsuTQZ8S1wwoRDY3poWTnO3GbogFTLqCoBJNYzIFU,1831
116
+ fractal_server/app/schemas/v2/workflowtask.py,sha256=ZGtsQyefk5Z52vWrTudF0OAJ2_LTbmfY7dE1nO2v0EU,3424
117
+ fractal_server/app/security/__init__.py,sha256=wxosoHc3mJYPCdPMyWnRD8w_2OgnKYp2aDkdmwrZh5k,11203
118
+ fractal_server/config.py,sha256=CA8ASObADaME5chDiBXawAJZ3MvjTRpCKP0jvdYtSh8,15080
119
+ fractal_server/data_migrations/README.md,sha256=_3AEFvDg9YkybDqCLlFPdDmGJvr6Tw7HRI14aZ3LOIw,398
120
+ fractal_server/images/__init__.py,sha256=JnTf7TflCdTbhcMHi12s3CJhEtuAXNulwauUU1wDpp0,88
121
+ fractal_server/images/models.py,sha256=FId-e_lQNqp6rMoj2C4yO-fF0mCpjl5n-NJwum5TWns,1536
122
+ fractal_server/images/tools.py,sha256=e4sajbw9OF1JSje_UiTX6xOe-Cnx8tkQxLLcl0x3Rts,2204
123
+ fractal_server/logger.py,sha256=95duXY8eSxf1HWg0CVn8SUGNzgJw9ZR0FlapDDF6WAY,3924
124
+ fractal_server/main.py,sha256=7CpwPfCsHxBAo5fWuXPCsYOFCpbBI0F7Z0jsgCQdou8,3001
125
+ fractal_server/migrations/README,sha256=4rQvyDfqodGhpJw74VYijRmgFP49ji5chyEemWGHsuw,59
126
+ fractal_server/migrations/env.py,sha256=bsl0HGZpjhommztgcs7wQ94sJzI1Orgnij97K8P_uyo,2630
127
+ fractal_server/migrations/script.py.mako,sha256=oMXw9LC3zRbinWWPPDgeZ4z9FJrV2zhRWiYdS5YgNbI,526
128
+ fractal_server/migrations/versions/4c308bcaea2b_add_task_args_schema_and_task_args_.py,sha256=-wHe-fOffmYeAm0JXVl_lxZ7hhDkaEVqxgxpHkb_uL8,954
129
+ fractal_server/migrations/versions/4cedeb448a53_workflowtask_foreign_keys_not_nullables.py,sha256=Mob8McGYAcmgvrseyyYOa54E6Gsgr-4SiGdC-r9O4_A,1157
130
+ fractal_server/migrations/versions/50a13d6138fd_initial_schema.py,sha256=zwXegXs9J40eyCWi3w0c_iIBVJjXNn4VdVnQaT3KxDg,8770
131
+ fractal_server/migrations/versions/70e77f1c38b0_add_applyworkflow_first_task_index_and_.py,sha256=Q-DsMzG3IcUV2Ol1dhJWosDvKERamBE6QvA2zzS5zpQ,1632
132
+ fractal_server/migrations/versions/71eefd1dd202_add_slurm_accounts.py,sha256=mbWuCkTpRAdGbRhW7lhXs_e5S6O37UAcCN6JfoY5H8A,1353
133
+ fractal_server/migrations/versions/84bf0fffde30_add_dumps_to_applyworkflow.py,sha256=NSCuhANChsg76vBkShBl-9tQ4VEHubOjtAv1etHhlvY,2684
134
+ fractal_server/migrations/versions/8f79bd162e35_add_docs_info_and_docs_link_to_task_.py,sha256=6pgODDtyAxevZvAJBj9IJ41inhV1RpwbpZr_qfPPu1A,1115
135
+ fractal_server/migrations/versions/97f444d47249_add_applyworkflow_project_dump.py,sha256=eKTZm3EgUgapXBxO0RuHkEfTKic-TZG3ADaMpGLuc0k,1057
136
+ fractal_server/migrations/versions/99ea79d9e5d2_add_dataset_history.py,sha256=0im6TxDr53sKKcjiPgeH4ftVRGnRXZSh2lPbRQ1Ir9w,883
137
+ fractal_server/migrations/versions/9fd26a2b0de4_add_workflow_timestamp_created.py,sha256=4l1AHGUsa0ONoJVZlr3fTXw_xbbQ8O7wlD92Az2aRfM,1849
138
+ fractal_server/migrations/versions/a7f4d6137b53_add_workflow_dump_to_applyworkflow.py,sha256=ekDUML7ILpmdoqEclKbEUdyLi4uw9HSG_sTjG2hp_JE,867
139
+ fractal_server/migrations/versions/d4fe3708d309_make_applyworkflow_workflow_dump_non_.py,sha256=6cHEZFuTXiQg9yu32Y3RH1XAl71av141WQ6UMbiITIg,949
140
+ fractal_server/migrations/versions/d71e732236cd_v2.py,sha256=ayEPVYvQwq7fZF9I_8oik8Hp-6Ay_0lFRk1xCoyS6-8,8240
141
+ fractal_server/migrations/versions/e75cac726012_make_applyworkflow_start_timestamp_not_.py,sha256=lOggSvzGWqQvnxxFuSM6W50Ui49R918A-uBuiZJ0pNM,963
142
+ fractal_server/migrations/versions/efa89c30e0a4_add_project_timestamp_created.py,sha256=jilQW3QIqYQ4Q6hCnUiG7UtNMpA41ujqrB3tPFiPM1Q,1221
143
+ fractal_server/migrations/versions/f384e1c0cf5d_drop_task_default_args_columns.py,sha256=9BwqUS9Gf7UW_KjrzHbtViC880qhD452KAytkHWWZyk,746
144
+ fractal_server/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
145
+ fractal_server/syringe.py,sha256=3qSMW3YaMKKnLdgnooAINOPxnCOxP7y2jeAQYB21Gdo,2786
146
+ fractal_server/tasks/__init__.py,sha256=kadmVUoIghl8s190_Tt-8f-WBqMi8u8oU4Pvw39NHE8,23
147
+ fractal_server/tasks/endpoint_operations.py,sha256=D1WSJd8dIfIumKezon1NYX5a0QNPqqlbj9uRq-ur9CQ,5379
148
+ fractal_server/tasks/utils.py,sha256=R1_SKfXTwveT7CJJOrvkwi0vNpr9MBIiNh7qv8EK3Wc,3278
149
+ fractal_server/tasks/v1/_TaskCollectPip.py,sha256=16Gn8lVYHBuwNLBHdcdx0X8s9QXXsbfPwSzcCcM6fRg,3775
150
+ fractal_server/tasks/v1/background_operations.py,sha256=T5L-ghgGEJIGcGoZB_r0cjH96UkEfAPkhr2ciTSaQlQ,11725
151
+ fractal_server/tasks/v1/get_collection_data.py,sha256=bi9tuApLgoKZNMIG1kR4GoKI9S6Y040gFfNQapw4ikM,502
152
+ fractal_server/tasks/v2/_TaskCollectPip.py,sha256=QeCqXDgOnMjk3diVlC5bgGEywyQjYFm5637Rke49vJY,3775
153
+ fractal_server/tasks/v2/background_operations.py,sha256=zr6j3uoWmCeW2EA9auxWNZ0sG3SHgSxUVTC1OpQXE3Y,12803
154
+ fractal_server/tasks/v2/get_collection_data.py,sha256=Qhf2T_aaqAfqu9_KpUSlXsS7EJoZQbEPEreHHa2jco8,502
155
+ fractal_server/utils.py,sha256=b7WwFdcFZ8unyT65mloFToYuEDXpQoHRcmRNqrhd_dQ,2115
156
+ fractal_server-2.0.0a1.dist-info/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
157
+ fractal_server-2.0.0a1.dist-info/METADATA,sha256=BQTLOQphWBZRtiU6OQSrVF3esVMqyLQkkju3mDMM19U,4205
158
+ fractal_server-2.0.0a1.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
159
+ fractal_server-2.0.0a1.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
160
+ fractal_server-2.0.0a1.dist-info/RECORD,,