fractal-server 2.7.0a4__py3-none-any.whl → 2.7.0a6__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 (29) hide show
  1. fractal_server/__init__.py +1 -1
  2. fractal_server/app/routes/admin/v2/task.py +0 -5
  3. fractal_server/app/routes/api/v1/task_collection.py +2 -2
  4. fractal_server/app/routes/api/v2/__init__.py +4 -0
  5. fractal_server/app/routes/api/v2/_aux_functions.py +1 -7
  6. fractal_server/app/routes/api/v2/_aux_functions_tasks.py +72 -11
  7. fractal_server/app/routes/api/v2/task_collection.py +49 -39
  8. fractal_server/app/routes/api/v2/task_group.py +10 -6
  9. fractal_server/app/routes/api/v2/workflow.py +14 -82
  10. fractal_server/app/routes/api/v2/workflow_import.py +355 -0
  11. fractal_server/app/routes/api/v2/workflowtask.py +0 -1
  12. fractal_server/app/routes/auth/group.py +27 -0
  13. fractal_server/app/runner/v2/__init__.py +13 -7
  14. fractal_server/app/schemas/v2/__init__.py +1 -0
  15. fractal_server/app/schemas/v2/dumps.py +0 -1
  16. fractal_server/app/schemas/v2/manifest.py +13 -0
  17. fractal_server/app/schemas/v2/task.py +20 -10
  18. fractal_server/app/schemas/v2/workflowtask.py +3 -4
  19. fractal_server/data_migrations/2_7_0.py +62 -3
  20. fractal_server/tasks/utils.py +19 -5
  21. fractal_server/tasks/v1/background_operations.py +3 -3
  22. fractal_server/tasks/v1/get_collection_data.py +2 -2
  23. fractal_server/tasks/v2/background_operations.py +4 -4
  24. fractal_server/tasks/v2/endpoint_operations.py +95 -15
  25. {fractal_server-2.7.0a4.dist-info → fractal_server-2.7.0a6.dist-info}/METADATA +1 -1
  26. {fractal_server-2.7.0a4.dist-info → fractal_server-2.7.0a6.dist-info}/RECORD +29 -28
  27. {fractal_server-2.7.0a4.dist-info → fractal_server-2.7.0a6.dist-info}/LICENSE +0 -0
  28. {fractal_server-2.7.0a4.dist-info → fractal_server-2.7.0a6.dist-info}/WHEEL +0 -0
  29. {fractal_server-2.7.0a4.dist-info → fractal_server-2.7.0a6.dist-info}/entry_points.txt +0 -0
@@ -1,24 +1,68 @@
1
+ import asyncio
1
2
  import logging
2
3
  import os
4
+ import sys
3
5
  from pathlib import Path
4
6
  from typing import Any
7
+ from typing import Optional
5
8
 
9
+ from fastapi import HTTPException
6
10
  from sqlalchemy import select
7
11
  from sqlalchemy.orm import Session
8
12
 
13
+ from fractal_server.app.db import get_async_db
9
14
  from fractal_server.app.db import get_sync_db
10
15
  from fractal_server.app.models import TaskGroupV2
11
16
  from fractal_server.app.models import TaskV2
12
17
  from fractal_server.app.models import UserGroup
13
18
  from fractal_server.app.models import UserOAuth
14
19
  from fractal_server.app.models import UserSettings
20
+ from fractal_server.app.routes.api.v2._aux_functions_tasks import (
21
+ _verify_non_duplication_group_constraint,
22
+ )
23
+ from fractal_server.app.routes.api.v2._aux_functions_tasks import (
24
+ _verify_non_duplication_user_constraint,
25
+ )
15
26
  from fractal_server.app.security import FRACTAL_DEFAULT_GROUP_NAME
16
27
  from fractal_server.data_migrations.tools import _check_current_version
28
+ from fractal_server.tasks.utils import _normalize_package_name
17
29
  from fractal_server.utils import get_timestamp
18
30
 
19
31
  logger = logging.getLogger("fix_db")
20
32
 
21
33
 
34
+ async def check_non_duplication_constraints(
35
+ *,
36
+ user_id: int,
37
+ pkg_name: str,
38
+ version: Optional[str] = None,
39
+ user_group_id: Optional[int] = None,
40
+ ):
41
+ try:
42
+ async for db_async in get_async_db():
43
+ await _verify_non_duplication_user_constraint(
44
+ user_id=user_id,
45
+ pkg_name=pkg_name,
46
+ version=version,
47
+ db=db_async,
48
+ )
49
+ await _verify_non_duplication_group_constraint(
50
+ user_group_id=user_group_id,
51
+ pkg_name=pkg_name,
52
+ version=version,
53
+ db=db_async,
54
+ )
55
+ except HTTPException as e:
56
+ logger.error(
57
+ "Adding a `TaskGroupV2` with "
58
+ f"{user_id=}, {pkg_name=}, {version=} and {user_group_id=} "
59
+ "would break the non-duplication constraint."
60
+ )
61
+ logger.error(f"Original error: {str(e)}")
62
+
63
+ sys.exit("ERROR")
64
+
65
+
22
66
  def get_unique_value(list_of_objects: list[dict[str, Any]], key: str):
23
67
  """
24
68
  Loop over `list_of_objects` and extract (unique) value for `key`.
@@ -29,8 +73,7 @@ def get_unique_value(list_of_objects: list[dict[str, Any]], key: str):
29
73
  unique_values.add(this_value)
30
74
  if len(unique_values) != 1:
31
75
  raise RuntimeError(
32
- f"There must be a single taskgroup `{key}`, "
33
- f"but {unique_values=}"
76
+ f"There must be a single taskgroup `{key}`, but {unique_values=}"
34
77
  )
35
78
  return unique_values.pop()
36
79
 
@@ -85,7 +128,6 @@ def get_default_user_group_id(db):
85
128
 
86
129
 
87
130
  def get_default_user_id(db):
88
-
89
131
  DEFAULT_USER_EMAIL = os.getenv("FRACTAL_V27_DEFAULT_USER_EMAIL")
90
132
  if DEFAULT_USER_EMAIL is None:
91
133
  raise ValueError(
@@ -129,6 +171,7 @@ def prepare_task_groups(
129
171
  python_version,
130
172
  name,
131
173
  ) = source_fields
174
+ pkg_name = _normalize_package_name(pkg_name)
132
175
  task_group_key = ":".join(
133
176
  [pkg_name, version, extras, python_version]
134
177
  )
@@ -235,6 +278,21 @@ def prepare_task_groups(
235
278
 
236
279
  print()
237
280
 
281
+ # Verify non-duplication constraints
282
+ asyncio.run(
283
+ check_non_duplication_constraints(
284
+ user_id=task_group_attributes["user_id"],
285
+ user_group_id=task_group_attributes["user_group_id"],
286
+ pkg_name=task_group_attributes["pkg_name"],
287
+ version=task_group_attributes["version"],
288
+ )
289
+ )
290
+ logger.warning(
291
+ "Non-duplication-constraint check is OK, "
292
+ "proceed and create TaskGroupV2."
293
+ )
294
+
295
+ # Create the TaskGroupV2 object and commit it
238
296
  task_group = TaskGroupV2(**task_group_attributes)
239
297
  db.add(task_group)
240
298
  db.commit()
@@ -262,3 +320,4 @@ def fix_db():
262
320
  )
263
321
 
264
322
  logger.warning("END of execution of fix_db function")
323
+ print()
@@ -9,9 +9,11 @@ COLLECTION_LOG_FILENAME = "collection.log"
9
9
  COLLECTION_FREEZE_FILENAME = "collection_freeze.txt"
10
10
 
11
11
 
12
- def get_absolute_venv_path(venv_path: Path) -> Path:
12
+ def get_absolute_venv_path_v1(venv_path: Path) -> Path:
13
13
  """
14
14
  If a path is not absolute, make it a relative path of FRACTAL_TASKS_DIR.
15
+
16
+ As of v2.7.0, we rename this to v1 since it is only to be used in v1.
15
17
  """
16
18
  if venv_path.is_absolute():
17
19
  package_path = venv_path
@@ -33,20 +35,32 @@ def get_freeze_path(base: Path) -> Path:
33
35
  return base / COLLECTION_FREEZE_FILENAME
34
36
 
35
37
 
36
- def get_collection_log(venv_path: Path) -> str:
37
- package_path = get_absolute_venv_path(venv_path)
38
+ def get_collection_log_v1(path: Path) -> str:
39
+ package_path = get_absolute_venv_path_v1(path)
38
40
  log_path = get_log_path(package_path)
39
41
  log = log_path.open().read()
40
42
  return log
41
43
 
42
44
 
43
- def get_collection_freeze(venv_path: Path) -> str:
44
- package_path = get_absolute_venv_path(venv_path)
45
+ def get_collection_log_v2(path: Path) -> str:
46
+ log_path = get_log_path(path)
47
+ log = log_path.open().read()
48
+ return log
49
+
50
+
51
+ def get_collection_freeze_v1(venv_path: Path) -> str:
52
+ package_path = get_absolute_venv_path_v1(venv_path)
45
53
  freeze_path = get_freeze_path(package_path)
46
54
  freeze = freeze_path.open().read()
47
55
  return freeze
48
56
 
49
57
 
58
+ def get_collection_freeze_v2(path: Path) -> str:
59
+ freeze_path = get_freeze_path(path)
60
+ freeze = freeze_path.open().read()
61
+ return freeze
62
+
63
+
50
64
  def _normalize_package_name(name: str) -> str:
51
65
  """
52
66
  Implement PyPa specifications for package-name normalization
@@ -8,7 +8,7 @@ from shutil import rmtree as shell_rmtree
8
8
 
9
9
  from ...string_tools import slugify_task_name_for_source_v1
10
10
  from ..utils import _normalize_package_name
11
- from ..utils import get_collection_log
11
+ from ..utils import get_collection_log_v1
12
12
  from ..utils import get_collection_path
13
13
  from ..utils import get_log_path
14
14
  from ._TaskCollectPip import _TaskCollectPip
@@ -321,7 +321,7 @@ async def background_collect_pip(
321
321
 
322
322
  # Update DB
323
323
  data.status = "OK"
324
- data.log = get_collection_log(venv_path)
324
+ data.log = get_collection_log_v1(venv_path)
325
325
  state.data = data.sanitised_dict()
326
326
  db.add(state)
327
327
  db.merge(state)
@@ -342,7 +342,7 @@ async def background_collect_pip(
342
342
  # Update db
343
343
  data.status = "fail"
344
344
  data.info = f"Original error: {e}"
345
- data.log = get_collection_log(venv_path)
345
+ data.log = get_collection_log_v1(venv_path)
346
346
  state.data = data.sanitised_dict()
347
347
  db.merge(state)
348
348
  db.commit()
@@ -2,12 +2,12 @@ import json
2
2
  from pathlib import Path
3
3
 
4
4
  from fractal_server.app.schemas.v1 import TaskCollectStatusV1
5
- from fractal_server.tasks.utils import get_absolute_venv_path
5
+ from fractal_server.tasks.utils import get_absolute_venv_path_v1
6
6
  from fractal_server.tasks.utils import get_collection_path
7
7
 
8
8
 
9
9
  def get_collection_data(venv_path: Path) -> TaskCollectStatusV1:
10
- package_path = get_absolute_venv_path(venv_path)
10
+ package_path = get_absolute_venv_path_v1(venv_path)
11
11
  collection_path = get_collection_path(package_path)
12
12
  with collection_path.open() as f:
13
13
  data = json.load(f)
@@ -14,8 +14,8 @@ from sqlalchemy.orm import Session as DBSyncSession
14
14
  from sqlalchemy.orm.attributes import flag_modified
15
15
  from sqlmodel import select
16
16
 
17
- from ..utils import get_collection_freeze
18
- from ..utils import get_collection_log
17
+ from ..utils import get_collection_freeze_v2
18
+ from ..utils import get_collection_log_v2
19
19
  from ..utils import get_collection_path
20
20
  from ..utils import get_log_path
21
21
  from .database_operations import create_db_tasks_and_update_task_group
@@ -419,10 +419,10 @@ async def background_collect_pip(
419
419
  for task in task_group.task_list
420
420
  ]
421
421
  collection_state.data["task_list"] = task_read_list
422
- collection_state.data["log"] = get_collection_log(
422
+ collection_state.data["log"] = get_collection_log_v2(
423
423
  Path(task_group.path)
424
424
  )
425
- collection_state.data["freeze"] = get_collection_freeze(
425
+ collection_state.data["freeze"] = get_collection_freeze_v2(
426
426
  Path(task_group.path)
427
427
  )
428
428
  with collection_path.open("w") as f:
@@ -1,3 +1,5 @@
1
+ from typing import Optional
2
+
1
3
  from fastapi import HTTPException
2
4
  from fastapi import status
3
5
  from httpx import AsyncClient
@@ -9,36 +11,114 @@ from fractal_server.logger import set_logger
9
11
  logger = set_logger(__name__)
10
12
 
11
13
 
12
- async def get_package_version_from_pypi(name: str) -> str:
14
+ async def get_package_version_from_pypi(
15
+ name: str,
16
+ version: Optional[str] = None,
17
+ ) -> str:
13
18
  """
14
- Make a GET call to PyPI JSON API and get latest package version.
19
+ Make a GET call to PyPI JSON API and get latest *compatible* version.
20
+
21
+ There are three cases:
22
+
23
+ 1. `version` is set and it is found on PyPI as-is.
24
+ 2. `version` is set but it is not found on PyPI as-is.
25
+ 3. `version` is unset, and we query `PyPI` for latest.
15
26
 
16
27
  Ref https://warehouse.pypa.io/api-reference/json.html.
17
28
 
18
29
  Arguments:
19
30
  name: Package name.
31
+ version:
32
+ Could be a correct version (`1.3.0`), an incomplete one
33
+ (`1.3`) or `None`.
20
34
  """
21
35
 
22
36
  url = f"https://pypi.org/pypi/{name}/json"
23
37
  hint = f"Hint: specify the required version for '{name}'."
38
+
39
+ # Make request to PyPI
24
40
  try:
25
41
  async with AsyncClient(timeout=5.0) as client:
26
42
  res = await client.get(url)
27
- if res.status_code != 200:
43
+ except TimeoutException as e:
44
+ error_msg = (
45
+ f"A TimeoutException occurred while getting {url}.\n"
46
+ f"Original error: {str(e)}."
47
+ )
48
+ logger.error(error_msg)
49
+ raise HTTPException(
50
+ status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
51
+ detail=error_msg,
52
+ )
53
+ except BaseException as e:
54
+ error_msg = (
55
+ f"An unknown error occurred while getting {url}. "
56
+ f"Original error: {str(e)}."
57
+ )
58
+ logger.error(error_msg)
59
+ raise HTTPException(
60
+ status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
61
+ detail=error_msg,
62
+ )
63
+
64
+ # Parse response
65
+ if res.status_code != 200:
66
+ raise HTTPException(
67
+ status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
68
+ detail=(
69
+ f"Could not get {url} (status_code {res.status_code})."
70
+ f"\n{hint}"
71
+ ),
72
+ )
73
+ try:
74
+ response_data = res.json()
75
+ latest_version = response_data["info"]["version"]
76
+ available_releases = response_data["releases"].keys()
77
+ except KeyError as e:
78
+ logger.error(
79
+ f"A KeyError occurred while getting {url}. "
80
+ f"Original error: {str(e)}."
81
+ )
82
+ raise HTTPException(
83
+ status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
84
+ detail=f"A KeyError error occurred while getting {url}.\n{hint}",
85
+ )
86
+
87
+ logger.info(
88
+ f"Obtained data from {url}: "
89
+ f"{len(available_releases)} releases, "
90
+ f"latest={latest_version}."
91
+ )
92
+
93
+ if version is not None:
94
+ if version in available_releases:
95
+ logger.info(f"Requested {version=} available on PyPI.")
96
+ # Case 1: `version` is set and it is found on PyPI as-is
97
+ return version
98
+ else:
99
+ # Case 2: `version` is set but it is not found on PyPI as-is
100
+ # Filter using `version` as prefix, and sort
101
+ matching_versions = [
102
+ v for v in available_releases if v.startswith(version)
103
+ ]
104
+ logger.info(
105
+ f"Requested {version=} not available on PyPI, "
106
+ f"found {len(matching_versions)} versions matching "
107
+ f"`{version}*`."
108
+ )
109
+ if len(matching_versions) == 0:
110
+ logger.info(f"No version starting with {version} found.")
28
111
  raise HTTPException(
29
112
  status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
30
113
  detail=(
31
- f"Could not get {url} (status_code {res.status_code})."
32
- f"\n{hint}"
114
+ f"No version starting with {version} found.\n"
115
+ f"{hint}"
33
116
  ),
34
117
  )
35
- version = res.json()["info"]["version"]
36
- return version
37
- except (KeyError, TimeoutException) as e:
38
- logger.warning(
39
- f"An error occurred while getting {url}. Original error: {str(e)}."
40
- )
41
- raise HTTPException(
42
- status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
43
- detail=(f"An error occurred while getting {url}.\n{hint}"),
44
- )
118
+ else:
119
+ latest_matching_version = sorted(matching_versions)[-1]
120
+ return latest_matching_version
121
+ else:
122
+ # Case 3: `version` is unset and we use latest
123
+ logger.info(f"No version requested, returning {latest_version=}.")
124
+ return latest_version
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fractal-server
3
- Version: 2.7.0a4
3
+ Version: 2.7.0a6
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
@@ -1,4 +1,4 @@
1
- fractal_server/__init__.py,sha256=9_YO3JbGhl33GlqFo7oPg2NBzR2h2okm4r0G4hr4TvI,24
1
+ fractal_server/__init__.py,sha256=wo5njXZ8nQYxNzQXX7h4A4LZLPdev2ZguHqnLTKX48Q,24
2
2
  fractal_server/__main__.py,sha256=dEkCfzLLQrIlxsGC-HBfoR-RBMWnJDgNrxYTyzmE9c0,6146
3
3
  fractal_server/alembic.ini,sha256=MWwi7GzjzawI9cCAK1LW7NxIBQDUqD12-ptJoq5JpP0,3153
4
4
  fractal_server/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -29,7 +29,7 @@ fractal_server/app/routes/admin/v1.py,sha256=GIpZlwAwwwLGDWkBqywhtmp9TGsKLhGmZAd
29
29
  fractal_server/app/routes/admin/v2/__init__.py,sha256=zkdrk3mSQWfgTJugS8Sc_Q_xCAwfmHUfdRe0DTaYT80,521
30
30
  fractal_server/app/routes/admin/v2/job.py,sha256=JmNmF5MeHtcDQzGadCJWwFNDQvB5G8SwVABaL11S1Vc,8268
31
31
  fractal_server/app/routes/admin/v2/project.py,sha256=luy-yiGX1JYTdPm1hpIdDUUqPm8xHuipLy9k2X6zu74,1223
32
- fractal_server/app/routes/admin/v2/task.py,sha256=5gUz3NSedFZN1d5pGhGQAuXxyHEaRlymqqXNKbuWX3c,4096
32
+ fractal_server/app/routes/admin/v2/task.py,sha256=Y0eujBgGhVapNXfW9azDxw4EBzLmEmCdh70y1RNQcb0,3895
33
33
  fractal_server/app/routes/admin/v2/task_group.py,sha256=loxjJe9C2BBsG8gWkhHgrn6ReeE4mnipQ21PMP3MrKI,5398
34
34
  fractal_server/app/routes/api/__init__.py,sha256=2IDheFi0OFdsUg7nbUiyahqybvpgXqeHUXIL2QtWrQQ,641
35
35
  fractal_server/app/routes/api/v1/__init__.py,sha256=Y2HQdG197J0a7DyQEE2jn53IfxD0EHGhzK1I2JZuEck,958
@@ -38,12 +38,12 @@ fractal_server/app/routes/api/v1/dataset.py,sha256=KVfKdp-bT8eB14kCjTSmpji4a2IPI
38
38
  fractal_server/app/routes/api/v1/job.py,sha256=0jGxvu0xNQnWuov2qnoo9yE7Oat37XbcVn4Ute-UsiE,5370
39
39
  fractal_server/app/routes/api/v1/project.py,sha256=V-oeLiLs3vhD6STKiI2_mOyeB7FDUAcEXevHZbCWQ10,15956
40
40
  fractal_server/app/routes/api/v1/task.py,sha256=eW89nMCjpD4G6tHXDo2qGBKqWaPirjH6M3hpdJQhfa0,6528
41
- fractal_server/app/routes/api/v1/task_collection.py,sha256=EPkuqnPtUpjpW6uQ1T9zAmtDhyNzhnyx0oJpr7mxYQ8,9066
41
+ fractal_server/app/routes/api/v1/task_collection.py,sha256=5EMh3yhS1Z4x25kp5Iaxalrf7RgJh-XD1nBjrFvgwsg,9072
42
42
  fractal_server/app/routes/api/v1/workflow.py,sha256=2T93DuEnSshaDCue-JPmjuvGCtbk6lt9pFMuPt783t8,11217
43
43
  fractal_server/app/routes/api/v1/workflowtask.py,sha256=OYYConwJbmNULDw5I3T-UbSJKrbbBiAHbbBeVcpoFKQ,5785
44
- fractal_server/app/routes/api/v2/__init__.py,sha256=_2Yce3aFT-t2FF_Yk_KbNgmG4FJKXlY3QTqib64yhIs,1807
45
- fractal_server/app/routes/api/v2/_aux_functions.py,sha256=ayRA66dnsaVGGhCsFJ4sbaseQSXo5bGbnwjOs4oCdKI,11893
46
- fractal_server/app/routes/api/v2/_aux_functions_tasks.py,sha256=rgBi9KrbewTVwsd2aUAFZ4VZpAZml2q6-ekmIkK_vY0,7969
44
+ fractal_server/app/routes/api/v2/__init__.py,sha256=jybEV-vrknPoQvbgKJl0QQvHDPHOJXbDUG5vatHeis4,1963
45
+ fractal_server/app/routes/api/v2/_aux_functions.py,sha256=mb4R_qqFxeW0LAis2QJIIfVx8Sydv1jTYaRIMsMxnIk,11720
46
+ fractal_server/app/routes/api/v2/_aux_functions_tasks.py,sha256=8CTlmPvCGpdsDAEFFCCj50vbkrqTlNrpr5O0G-FJR0A,10559
47
47
  fractal_server/app/routes/api/v2/dataset.py,sha256=Eilf_BAGjicIhqUiVwI86jlW45ineA5sVzxXW4b2GoQ,8329
48
48
  fractal_server/app/routes/api/v2/images.py,sha256=JR1rR6qEs81nacjriOXAOBQjAbCXF4Ew7M7mkWdxBU0,7920
49
49
  fractal_server/app/routes/api/v2/job.py,sha256=Bga2Kz1OjvDIdxZObWaaXVhNIhC_5JKhKRjEH2_ayEE,5157
@@ -51,15 +51,16 @@ fractal_server/app/routes/api/v2/project.py,sha256=eWYFJ7F2ZYQcpi-_n-rhPF-Q4gJhz
51
51
  fractal_server/app/routes/api/v2/status.py,sha256=6N9DSZ4iFqbZImorWfEAPoyoFUgEruo4Hweqo0x0xXU,6435
52
52
  fractal_server/app/routes/api/v2/submit.py,sha256=h7mjmea_VNCriGiA4HRuyxLHlvd9aGfTAFXK3bSsvzc,9422
53
53
  fractal_server/app/routes/api/v2/task.py,sha256=R_1bCinQvNrkEh6uAguNNfimduz1uJzgN_iTDwjnVF4,7209
54
- fractal_server/app/routes/api/v2/task_collection.py,sha256=ncFSYv9VtBrWR8lEW6ZxpDUmk6h0NLuGxJFKlhjhXHM,11456
54
+ fractal_server/app/routes/api/v2/task_collection.py,sha256=gCxOwigT_tfs8lCDNoE7nxl9-9iuRp1gW__3YXqsioc,11478
55
55
  fractal_server/app/routes/api/v2/task_collection_custom.py,sha256=9T0U_4gqrQbJCy6uFDCMSZ-b1sfNIzyz_qm4P41W2Gs,6133
56
- fractal_server/app/routes/api/v2/task_group.py,sha256=1uvhO7-Zgr6so5Ovn2PDiFKbqvbeGv6RrguZym8yZr0,5131
57
- fractal_server/app/routes/api/v2/workflow.py,sha256=jxBgxjKjrtO8T9Y-IOZb1az9NeuhUY4Ma5wd-1uvvoE,10575
58
- fractal_server/app/routes/api/v2/workflowtask.py,sha256=TIOePM13uK3GKVhtGK2wBB341ZFheBYQKTfXuPfdymE,6999
56
+ fractal_server/app/routes/api/v2/task_group.py,sha256=wOLoqBnoeOIefRN5juhrjm2luGK6E_sF79umKirwWu8,5313
57
+ fractal_server/app/routes/api/v2/workflow.py,sha256=PyvkrUHHzFGUGZE5X0VW5u3DPQA7wtXXNcEpG7-N66I,8687
58
+ fractal_server/app/routes/api/v2/workflow_import.py,sha256=l39EKsyNwkkLaj-LNUh2GEG_6GtTq-8xyPbPmXwEYBM,10807
59
+ fractal_server/app/routes/api/v2/workflowtask.py,sha256=ciHTwXXFiFnMF7ZpJ3Xs0q6YfuZrFvIjqndlzAEdZpo,6969
59
60
  fractal_server/app/routes/auth/__init__.py,sha256=fao6CS0WiAjHDTvBzgBVV_bSXFpEAeDBF6Z6q7rRkPc,1658
60
61
  fractal_server/app/routes/auth/_aux_auth.py,sha256=ifkNocTYatBSMYGwiR14qohmvR9SfMldceiEj6uJBrU,4783
61
62
  fractal_server/app/routes/auth/current_user.py,sha256=v767HGi8k076ZHoErlU4Vv0_c8HQqYmi8ncjzZZDaDE,4455
62
- fractal_server/app/routes/auth/group.py,sha256=riav97YGJHqAwcbjbZcSYPfx8kEnyUnYe37155dMAmU,6548
63
+ fractal_server/app/routes/auth/group.py,sha256=dSS7r8J2cejZ6sKnOWAPSDKynxD9VyBNtqDbFpySzIU,7489
63
64
  fractal_server/app/routes/auth/login.py,sha256=tSu6OBLOieoBtMZB4JkBAdEgH2Y8KqPGSbwy7NIypIo,566
64
65
  fractal_server/app/routes/auth/oauth.py,sha256=AnFHbjqL2AgBX3eksI931xD6RTtmbciHBEuGf9YJLjU,1895
65
66
  fractal_server/app/routes/auth/register.py,sha256=DlHq79iOvGd_gt2v9uwtsqIKeO6i_GKaW59VIkllPqY,587
@@ -106,7 +107,7 @@ fractal_server/app/runner/v1/_slurm/_submit_setup.py,sha256=KO9c694d318adoPQh9UG
106
107
  fractal_server/app/runner/v1/_slurm/get_slurm_config.py,sha256=6pQNNx997bLIfLp0guF09t_O0ZYRXnbEGLktSAcKnic,5999
107
108
  fractal_server/app/runner/v1/common.py,sha256=_L-vjLnWato80VdlB_BFN4G8P4jSM07u-5cnl1T3S34,3294
108
109
  fractal_server/app/runner/v1/handle_failed_job.py,sha256=bHzScC_aIlU3q-bQxGW6rfWV4xbZ2tho_sktjsAs1no,4684
109
- fractal_server/app/runner/v2/__init__.py,sha256=BkmaVbhh6XMK_Y2Suzz3bXm3Ff2l0JKbHqs8zp0hi8A,16965
110
+ fractal_server/app/runner/v2/__init__.py,sha256=4RTlY34bOqgmzqVHXER0-lpnKaG15boMgDyf1L40JWg,17362
110
111
  fractal_server/app/runner/v2/_local/__init__.py,sha256=KTj14K6jH8fXGUi5P7u5_RqEE1zF4aXtgPxCKzw46iw,5971
111
112
  fractal_server/app/runner/v2/_local/_local_config.py,sha256=9oi209Dlp35ANfxb_DISqmMKKc6DPaMsmYVWbZLseME,3630
112
113
  fractal_server/app/runner/v2/_local/_submit_setup.py,sha256=MucNOo8Er0F5ZIwH7CnTeXgnFMc6d3pKPkv563QNVi0,1630
@@ -144,22 +145,22 @@ fractal_server/app/schemas/v1/state.py,sha256=GYeOE_1PtDOgu5W4t_3gw3DBHXH2aCGzIN
144
145
  fractal_server/app/schemas/v1/task.py,sha256=7BxOZ_qoRQ8n3YbQpDvB7VMcxB5fSYQmR5RLIWhuJ5U,3704
145
146
  fractal_server/app/schemas/v1/task_collection.py,sha256=uvq9bcMaGD_qHsh7YtcpoSAkVAbw12eY4DocIO3MKOg,3057
146
147
  fractal_server/app/schemas/v1/workflow.py,sha256=tuOs5E5Q_ozA8if7YPZ07cQjzqB_QMkBS4u92qo4Ro0,4618
147
- fractal_server/app/schemas/v2/__init__.py,sha256=BHbRPSBLjGaCpmjd8OJSycKhBLfZY5b1lj0z9sLR17o,2273
148
+ fractal_server/app/schemas/v2/__init__.py,sha256=G44JgD_i_zCpV7yjXcoS5ygOS3IfsIWoktLVZao6TaE,2323
148
149
  fractal_server/app/schemas/v2/dataset.py,sha256=865ia13E9mWu1DaYyppKW2csNYglaInrScrprdVYX7A,2552
149
- fractal_server/app/schemas/v2/dumps.py,sha256=xh5P_tJEhJ2VfGsMbBNOwosDT7Ee8lnxPSTAlF1ZR98,1737
150
+ fractal_server/app/schemas/v2/dumps.py,sha256=s6dg-pHZFui6t2Ktm0SMxjKDN-v-ZqBHz9iTsBQF3eU,1712
150
151
  fractal_server/app/schemas/v2/job.py,sha256=oYSLYkQ0HL83QyjEGIaggtZ117FndzFlONMKWd9sTXM,3270
151
- fractal_server/app/schemas/v2/manifest.py,sha256=eHfDjth8cSDiuYeDMfBOte8sMHOI74DC0VlhebhUXvY,6545
152
+ fractal_server/app/schemas/v2/manifest.py,sha256=Uqtd7DbyOkf9bxBOKkU7Sv7nToBIFGUcfjY7rd5iO7c,6981
152
153
  fractal_server/app/schemas/v2/project.py,sha256=UXEA0UUUe0bFFOVLLmVtvDFLBO5vmD1JVI7EeTIcwDo,756
153
154
  fractal_server/app/schemas/v2/status.py,sha256=SQaUpQkjFq5c5k5J4rOjNhuQaDOEg8lksPhkKmPU5VU,332
154
- fractal_server/app/schemas/v2/task.py,sha256=bm0qG_Zt6ClJHh6uSSb-vWxiKmh0x1gAQgMmtQayCk8,6648
155
+ fractal_server/app/schemas/v2/task.py,sha256=FFAbYwDlqowB8gVMdjFVPVHvAM0T89PYLixUth49xfQ,6870
155
156
  fractal_server/app/schemas/v2/task_collection.py,sha256=Ddw_7QaQ93kdEIwWQvzLQDu03gho_OHdhah3n0ioK3M,6296
156
157
  fractal_server/app/schemas/v2/task_group.py,sha256=F40u64z-wXHNPFjx9RHozzl_SySTHfKFc-sBFyn_e0I,2352
157
158
  fractal_server/app/schemas/v2/workflow.py,sha256=HSNQSrBRdoBzh8Igr76FUWCAWvVzykrqmUv1vGv-8og,2026
158
- fractal_server/app/schemas/v2/workflowtask.py,sha256=2T5LcourImZwlZa3PNsF_JM-I0fEAzWMhx1Y8KY0Ak8,5798
159
+ fractal_server/app/schemas/v2/workflowtask.py,sha256=vDdMktYbHeYBgB5OuWSv6wRPRXWqvetkeqQ7IC5YtfA,5751
159
160
  fractal_server/app/security/__init__.py,sha256=V1NOWlmaFZHMR6SrkMl62jyAuqYONyo8lyGvR6UZesM,12312
160
161
  fractal_server/app/user_settings.py,sha256=aZgQ3i0JkHfgwLGW1ee6Gzr1ae3IioFfJKKSsSS8Svk,1312
161
162
  fractal_server/config.py,sha256=gX0aYwDwbC5y7JNorifON84YMveubb7XTb4sH14N3KM,23667
162
- fractal_server/data_migrations/2_7_0.py,sha256=HWReCLmfz_abEzKEAbDflNjH5kQEgTpzjiKCWexNaTk,9133
163
+ fractal_server/data_migrations/2_7_0.py,sha256=DQQJ_tLYFteH3Jw246ovIh3Dac_9SaAefoy7FLw5Cso,11145
163
164
  fractal_server/data_migrations/README.md,sha256=_3AEFvDg9YkybDqCLlFPdDmGJvr6Tw7HRI14aZ3LOIw,398
164
165
  fractal_server/data_migrations/tools.py,sha256=LeMeASwYGtEqd-3wOLle6WARdTGAimoyMmRbbJl-hAM,572
165
166
  fractal_server/gunicorn_fractal.py,sha256=u6U01TLGlXgq1v8QmEpLih3QnsInZD7CqphgJ_GrGzc,1230
@@ -200,19 +201,19 @@ fractal_server/ssh/_fabric.py,sha256=Fw6NZl8YnlShYTL-jmuPpbJ_Kn2pDRAIRY3bbDcnMA8
200
201
  fractal_server/string_tools.py,sha256=Z4qcleqXSG6RCG4hqS1emm0U-Bvv0sgTm_T87ZdYn7M,2395
201
202
  fractal_server/syringe.py,sha256=3qSMW3YaMKKnLdgnooAINOPxnCOxP7y2jeAQYB21Gdo,2786
202
203
  fractal_server/tasks/__init__.py,sha256=kadmVUoIghl8s190_Tt-8f-WBqMi8u8oU4Pvw39NHE8,23
203
- fractal_server/tasks/utils.py,sha256=wucz57I7G0Vd8hvtmvonlryACx9zIVlqfxG5I87MJ80,1820
204
+ fractal_server/tasks/utils.py,sha256=8sbVCxvgfuzGxEhSfnLWRv36Rx4ZUwR7IAPP1TXfJFM,2178
204
205
  fractal_server/tasks/v1/_TaskCollectPip.py,sha256=ARq5AoHYXH0hziEsb-nFAqbsLA-VIddXOdXL38O6_zA,3746
205
206
  fractal_server/tasks/v1/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
206
- fractal_server/tasks/v1/background_operations.py,sha256=OlRMFY4i6J5EQ_ofDUjAPYDhTDF3QHT7hqXRc06EBio,11772
207
+ fractal_server/tasks/v1/background_operations.py,sha256=zYhqAP3-hedHxF9AMHFf8Y1znoFvC7Lq1qhqJPNROfk,11781
207
208
  fractal_server/tasks/v1/endpoint_operations.py,sha256=YyMU1Y3Xt7D9WOKqaMLuwEoIaAqQP2Klz3I-ypAgOLI,5077
208
- fractal_server/tasks/v1/get_collection_data.py,sha256=bi9tuApLgoKZNMIG1kR4GoKI9S6Y040gFfNQapw4ikM,502
209
+ fractal_server/tasks/v1/get_collection_data.py,sha256=5C22jp356rCH5IIC0J57wOu-DCC_kp3B6p68JooN7IM,508
209
210
  fractal_server/tasks/v1/utils.py,sha256=J9oKys-82OehBxOon5wWl3CxjVBgYWeVEEyWGVFnreI,1759
210
211
  fractal_server/tasks/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
211
212
  fractal_server/tasks/v2/_venv_pip.py,sha256=FOD20yKfTsW7sim3h7CsB6pgp85JBhELyYvbkpaiDKA,6390
212
- fractal_server/tasks/v2/background_operations.py,sha256=B_Djcd0LKQuYk_6bgg4keEXkCH5kEwMlpHap9tk5QzY,15399
213
+ fractal_server/tasks/v2/background_operations.py,sha256=jWmg_XkBmcXQfPKJu_eu0wtDL4sMp1QP2bIZ9QtMj_Y,15411
213
214
  fractal_server/tasks/v2/background_operations_ssh.py,sha256=RcMshcrj04r70hnyCB9aANk-8x8gr55AeP3v0gS7-Ts,13410
214
215
  fractal_server/tasks/v2/database_operations.py,sha256=6r56yyFPnEBrXl6ncmO6D76znzISQCFZqCYcD-Ummd4,1213
215
- fractal_server/tasks/v2/endpoint_operations.py,sha256=3bMLnwncAbOb_l9jW_94oNpmU7AMJDXM36bpQNk-tzU,1413
216
+ fractal_server/tasks/v2/endpoint_operations.py,sha256=MtUoI0XWHuPSousDeH2IC2WU--AUKQVup6Q6AbHiNUA,4102
216
217
  fractal_server/tasks/v2/templates/_1_create_venv.sh,sha256=7tt-B6n8KRN-pannZ0enE6XSxyq-hKRYRGY63CvtINI,1151
217
218
  fractal_server/tasks/v2/templates/_2_upgrade_pip.sh,sha256=ca5Yng6JgJYu-a4QrsIsatwUmrLdRWBKw7_VJrY7WLY,555
218
219
  fractal_server/tasks/v2/templates/_3_pip_install.sh,sha256=T9sabeB9iQzVZpLfuLkKGz9EpfHkUrJHKWO4HNij6yM,595
@@ -222,8 +223,8 @@ fractal_server/tasks/v2/utils.py,sha256=MnY6MhcxDRo4rPuXo2tQ252eWEPZF3OlCGe-p5Mr
222
223
  fractal_server/urls.py,sha256=5o_qq7PzKKbwq12NHSQZDmDitn5RAOeQ4xufu-2v9Zk,448
223
224
  fractal_server/utils.py,sha256=jrlCBPmC7F0ptBVcDac-EbZNsdYTLbHfX9oxkXthS5Q,2193
224
225
  fractal_server/zip_tools.py,sha256=xYpzBshysD2nmxkD5WLYqMzPYUcCRM3kYy-7n9bJL-U,4426
225
- fractal_server-2.7.0a4.dist-info/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
226
- fractal_server-2.7.0a4.dist-info/METADATA,sha256=Qr2jnRh7ETsVojqsgBF9_O3PKPdyABXi0KMstyhSTr8,4630
227
- fractal_server-2.7.0a4.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
228
- fractal_server-2.7.0a4.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
229
- fractal_server-2.7.0a4.dist-info/RECORD,,
226
+ fractal_server-2.7.0a6.dist-info/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
227
+ fractal_server-2.7.0a6.dist-info/METADATA,sha256=j1bQm_XclfJGp-wlzf0GSGrt5Klr2Ok37WusYcv4DQw,4630
228
+ fractal_server-2.7.0a6.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
229
+ fractal_server-2.7.0a6.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
230
+ fractal_server-2.7.0a6.dist-info/RECORD,,