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.
- fractal_server/__init__.py +1 -1
- fractal_server/app/routes/admin/v2/task.py +0 -5
- fractal_server/app/routes/api/v1/task_collection.py +2 -2
- fractal_server/app/routes/api/v2/__init__.py +4 -0
- fractal_server/app/routes/api/v2/_aux_functions.py +1 -7
- fractal_server/app/routes/api/v2/_aux_functions_tasks.py +72 -11
- fractal_server/app/routes/api/v2/task_collection.py +49 -39
- fractal_server/app/routes/api/v2/task_group.py +10 -6
- fractal_server/app/routes/api/v2/workflow.py +14 -82
- fractal_server/app/routes/api/v2/workflow_import.py +355 -0
- fractal_server/app/routes/api/v2/workflowtask.py +0 -1
- fractal_server/app/routes/auth/group.py +27 -0
- fractal_server/app/runner/v2/__init__.py +13 -7
- fractal_server/app/schemas/v2/__init__.py +1 -0
- fractal_server/app/schemas/v2/dumps.py +0 -1
- fractal_server/app/schemas/v2/manifest.py +13 -0
- fractal_server/app/schemas/v2/task.py +20 -10
- fractal_server/app/schemas/v2/workflowtask.py +3 -4
- fractal_server/data_migrations/2_7_0.py +62 -3
- fractal_server/tasks/utils.py +19 -5
- fractal_server/tasks/v1/background_operations.py +3 -3
- fractal_server/tasks/v1/get_collection_data.py +2 -2
- fractal_server/tasks/v2/background_operations.py +4 -4
- fractal_server/tasks/v2/endpoint_operations.py +95 -15
- {fractal_server-2.7.0a4.dist-info → fractal_server-2.7.0a6.dist-info}/METADATA +1 -1
- {fractal_server-2.7.0a4.dist-info → fractal_server-2.7.0a6.dist-info}/RECORD +29 -28
- {fractal_server-2.7.0a4.dist-info → fractal_server-2.7.0a6.dist-info}/LICENSE +0 -0
- {fractal_server-2.7.0a4.dist-info → fractal_server-2.7.0a6.dist-info}/WHEEL +0 -0
- {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()
|
fractal_server/tasks/utils.py
CHANGED
@@ -9,9 +9,11 @@ COLLECTION_LOG_FILENAME = "collection.log"
|
|
9
9
|
COLLECTION_FREEZE_FILENAME = "collection_freeze.txt"
|
10
10
|
|
11
11
|
|
12
|
-
def
|
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
|
37
|
-
package_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
|
44
|
-
|
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
|
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 =
|
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 =
|
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
|
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 =
|
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
|
18
|
-
from ..utils import
|
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"] =
|
422
|
+
collection_state.data["log"] = get_collection_log_v2(
|
423
423
|
Path(task_group.path)
|
424
424
|
)
|
425
|
-
collection_state.data["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(
|
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
|
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
|
-
|
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"
|
32
|
-
f"
|
114
|
+
f"No version starting with {version} found.\n"
|
115
|
+
f"{hint}"
|
33
116
|
),
|
34
117
|
)
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
)
|
41
|
-
|
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,4 +1,4 @@
|
|
1
|
-
fractal_server/__init__.py,sha256=
|
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=
|
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=
|
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=
|
45
|
-
fractal_server/app/routes/api/v2/_aux_functions.py,sha256=
|
46
|
-
fractal_server/app/routes/api/v2/_aux_functions_tasks.py,sha256=
|
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=
|
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=
|
57
|
-
fractal_server/app/routes/api/v2/workflow.py,sha256=
|
58
|
-
fractal_server/app/routes/api/v2/
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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.
|
226
|
-
fractal_server-2.7.
|
227
|
-
fractal_server-2.7.
|
228
|
-
fractal_server-2.7.
|
229
|
-
fractal_server-2.7.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|