fractal-server 2.7.0a11__py3-none-any.whl → 2.8.0__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 (41) hide show
  1. fractal_server/__init__.py +1 -1
  2. fractal_server/app/models/user_settings.py +1 -0
  3. fractal_server/app/models/v2/task.py +16 -2
  4. fractal_server/app/routes/admin/v2/task_group.py +7 -0
  5. fractal_server/app/routes/api/v2/dataset.py +39 -6
  6. fractal_server/app/routes/api/v2/task.py +4 -6
  7. fractal_server/app/routes/api/v2/task_collection.py +17 -44
  8. fractal_server/app/routes/api/v2/task_collection_custom.py +5 -4
  9. fractal_server/app/schemas/user_settings.py +18 -0
  10. fractal_server/app/schemas/v2/__init__.py +1 -0
  11. fractal_server/app/schemas/v2/dataset.py +5 -3
  12. fractal_server/app/schemas/v2/task_collection.py +20 -4
  13. fractal_server/app/schemas/v2/task_group.py +8 -1
  14. fractal_server/app/security/__init__.py +8 -1
  15. fractal_server/config.py +8 -28
  16. fractal_server/migrations/versions/19eca0dd47a9_user_settings_project_dir.py +39 -0
  17. fractal_server/migrations/versions/8e8f227a3e36_update_taskv2_post_2_7_0.py +42 -0
  18. fractal_server/tasks/utils.py +0 -31
  19. fractal_server/tasks/v1/background_operations.py +11 -11
  20. fractal_server/tasks/v1/endpoint_operations.py +5 -5
  21. fractal_server/tasks/v1/utils.py +2 -2
  22. fractal_server/tasks/v2/collection_local.py +357 -0
  23. fractal_server/tasks/v2/{background_operations_ssh.py → collection_ssh.py} +108 -102
  24. fractal_server/tasks/v2/templates/_1_create_venv.sh +0 -8
  25. fractal_server/tasks/v2/templates/{_2_upgrade_pip.sh → _2_preliminary_pip_operations.sh} +2 -1
  26. fractal_server/tasks/v2/templates/_3_pip_install.sh +22 -1
  27. fractal_server/tasks/v2/templates/_5_pip_show.sh +5 -5
  28. fractal_server/tasks/v2/utils_background.py +209 -0
  29. fractal_server/tasks/v2/utils_package_names.py +77 -0
  30. fractal_server/tasks/v2/{utils.py → utils_python_interpreter.py} +0 -26
  31. fractal_server/tasks/v2/utils_templates.py +59 -0
  32. fractal_server/utils.py +48 -3
  33. {fractal_server-2.7.0a11.dist-info → fractal_server-2.8.0.dist-info}/METADATA +14 -17
  34. {fractal_server-2.7.0a11.dist-info → fractal_server-2.8.0.dist-info}/RECORD +38 -35
  35. fractal_server/data_migrations/2_7_0.py +0 -323
  36. fractal_server/tasks/v2/_venv_pip.py +0 -193
  37. fractal_server/tasks/v2/background_operations.py +0 -456
  38. /fractal_server/{tasks/v2/endpoint_operations.py → app/routes/api/v2/_aux_functions_task_collection.py} +0 -0
  39. {fractal_server-2.7.0a11.dist-info → fractal_server-2.8.0.dist-info}/LICENSE +0 -0
  40. {fractal_server-2.7.0a11.dist-info → fractal_server-2.8.0.dist-info}/WHEEL +0 -0
  41. {fractal_server-2.7.0a11.dist-info → fractal_server-2.8.0.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,77 @@
1
+ import re
2
+
3
+ from fractal_server.logger import get_logger
4
+
5
+
6
+ def _parse_wheel_filename(wheel_filename: str) -> dict[str, str]:
7
+ """
8
+ Extract distribution and version from a wheel filename.
9
+
10
+ The structure of a wheel filename is fixed, and it must start with
11
+ `{distribution}-{version}` (see
12
+ https://packaging.python.org/en/latest/specifications/binary-distribution-format
13
+ ).
14
+
15
+ Note that we transform exceptions in `ValueError`s, since this function is
16
+ also used within Pydantic validators.
17
+ """
18
+ if "/" in wheel_filename:
19
+ raise ValueError(
20
+ "[_parse_wheel_filename] Input must be a filename, not a full "
21
+ f"path (given: {wheel_filename})."
22
+ )
23
+ try:
24
+ parts = wheel_filename.split("-")
25
+ return dict(distribution=parts[0], version=parts[1])
26
+ except Exception as e:
27
+ raise ValueError(
28
+ f"Invalid {wheel_filename=}. Original error: {str(e)}."
29
+ )
30
+
31
+
32
+ def normalize_package_name(name: str) -> str:
33
+ """
34
+ Implement PyPa specifications for package-name normalization
35
+
36
+ The name should be lowercased with all runs of the characters `.`, `-`,
37
+ or `_` replaced with a single `-` character. This can be implemented in
38
+ Python with the re module.
39
+ (https://packaging.python.org/en/latest/specifications/name-normalization)
40
+
41
+ Args:
42
+ name: The non-normalized package name.
43
+
44
+ Returns:
45
+ The normalized package name.
46
+ """
47
+ return re.sub(r"[-_.]+", "-", name).lower()
48
+
49
+
50
+ def compare_package_names(
51
+ *,
52
+ pkg_name_pip_show: str,
53
+ pkg_name_task_group: str,
54
+ logger_name: str,
55
+ ) -> None:
56
+ """
57
+ Compare the package names from `pip show` and from the db.
58
+ """
59
+ logger = get_logger(logger_name)
60
+
61
+ if pkg_name_pip_show == pkg_name_task_group:
62
+ return
63
+
64
+ logger.warning(
65
+ f"Package name mismatch: "
66
+ f"{pkg_name_task_group=}, {pkg_name_pip_show=}."
67
+ )
68
+ normalized_pkg_name_pip = normalize_package_name(pkg_name_pip_show)
69
+ normalized_pkg_name_taskgroup = normalize_package_name(pkg_name_task_group)
70
+ if normalized_pkg_name_pip != normalized_pkg_name_taskgroup:
71
+ error_msg = (
72
+ f"Package name mismatch persists, after normalization: "
73
+ f"{pkg_name_task_group=}, "
74
+ f"{pkg_name_pip_show=}."
75
+ )
76
+ logger.error(error_msg)
77
+ raise ValueError(error_msg)
@@ -31,29 +31,3 @@ def get_python_interpreter_v2(
31
31
  if value is None:
32
32
  raise ValueError(f"Requested {python_version=}, but {key}={value}.")
33
33
  return value
34
-
35
-
36
- def _parse_wheel_filename(wheel_filename: str) -> dict[str, str]:
37
- """
38
- Extract distribution and version from a wheel filename.
39
-
40
- The structure of a wheel filename is fixed, and it must start with
41
- `{distribution}-{version}` (see
42
- https://packaging.python.org/en/latest/specifications/binary-distribution-format
43
- ).
44
-
45
- Note that we transform exceptions in `ValueError`s, since this function is
46
- also used within Pydantic validators.
47
- """
48
- if "/" in wheel_filename:
49
- raise ValueError(
50
- "[_parse_wheel_filename] Input must be a filename, not a full "
51
- f"path (given: {wheel_filename})."
52
- )
53
- try:
54
- parts = wheel_filename.split("-")
55
- return dict(distribution=parts[0], version=parts[1])
56
- except Exception as e:
57
- raise ValueError(
58
- f"Invalid {wheel_filename=}. Original error: {str(e)}."
59
- )
@@ -0,0 +1,59 @@
1
+ from pathlib import Path
2
+
3
+ TEMPLATES_DIR = Path(__file__).parent / "templates"
4
+
5
+
6
+ def customize_template(
7
+ *,
8
+ template_name: str,
9
+ replacements: list[tuple[str, str]],
10
+ script_path: str,
11
+ ) -> str:
12
+ """
13
+ Customize a bash-script template and write it to disk.
14
+
15
+ Args:
16
+ template_filename:
17
+ templates_folder:
18
+ replacements:
19
+ """
20
+ # Read template
21
+ template_path = TEMPLATES_DIR / template_name
22
+ with template_path.open("r") as f:
23
+ template_data = f.read()
24
+ # Customize template
25
+ script_data = template_data
26
+ for old_new in replacements:
27
+ script_data = script_data.replace(old_new[0], old_new[1])
28
+ # Write script locally
29
+ with open(script_path, "w") as f:
30
+ f.write(script_data)
31
+
32
+
33
+ def parse_script_5_stdout(stdout: str) -> dict[str, str]:
34
+ """
35
+ Parse standard output of template 5.
36
+ """
37
+ searches = [
38
+ ("Python interpreter:", "python_bin"),
39
+ ("Package name:", "package_name"),
40
+ ("Package version:", "package_version"),
41
+ ("Package parent folder:", "package_root_parent"),
42
+ ("Manifest absolute path:", "manifest_path"),
43
+ ]
44
+ stdout_lines = stdout.splitlines()
45
+ attributes = dict()
46
+ for search, attribute_name in searches:
47
+ matching_lines = [_line for _line in stdout_lines if search in _line]
48
+ if len(matching_lines) == 0:
49
+ raise ValueError(f"String '{search}' not found in stdout.")
50
+ elif len(matching_lines) > 1:
51
+ raise ValueError(
52
+ f"String '{search}' found too many times "
53
+ f"({len(matching_lines)})."
54
+ )
55
+ else:
56
+ actual_line = matching_lines[0]
57
+ attribute_value = actual_line.split(search)[-1].strip(" ")
58
+ attributes[attribute_name] = attribute_value
59
+ return attributes
fractal_server/utils.py CHANGED
@@ -14,13 +14,15 @@ This module provides general purpose utilities that are not specific to any
14
14
  subsystem.
15
15
  """
16
16
  import asyncio
17
+ import shlex
18
+ import subprocess # nosec
17
19
  from datetime import datetime
18
20
  from datetime import timezone
19
21
  from pathlib import Path
20
- from shlex import split as shlex_split
21
22
  from typing import Optional
22
23
 
23
24
  from .logger import get_logger
25
+ from .string_tools import validate_cmd
24
26
 
25
27
 
26
28
  def get_timestamp() -> datetime:
@@ -30,7 +32,7 @@ def get_timestamp() -> datetime:
30
32
  return datetime.now(tz=timezone.utc)
31
33
 
32
34
 
33
- async def execute_command(
35
+ async def execute_command_async(
34
36
  *,
35
37
  command: str,
36
38
  cwd: Optional[Path] = None,
@@ -56,7 +58,7 @@ async def execute_command(
56
58
  RuntimeError: if the process exited with non-zero status. The error
57
59
  string is set to the `stderr` of the process.
58
60
  """
59
- command_split = shlex_split(command)
61
+ command_split = shlex.split(command)
60
62
  cmd, *args = command_split
61
63
 
62
64
  logger = get_logger(logger_name)
@@ -75,3 +77,46 @@ async def execute_command(
75
77
  if proc.returncode != 0:
76
78
  raise RuntimeError(stderr.decode("utf-8"))
77
79
  return stdout.decode("utf-8")
80
+
81
+
82
+ def execute_command_sync(
83
+ *,
84
+ command: str,
85
+ logger_name: Optional[str] = None,
86
+ allow_char: Optional[str] = None,
87
+ ) -> str:
88
+ """
89
+ Execute arbitrary command
90
+
91
+ If the command returns a return code different from zero, a `RuntimeError`
92
+ is raised.
93
+
94
+ Arguments:
95
+ command: Command to be executed.
96
+ logger_name: Name of the logger.
97
+ allow_char: Argument propagated to `validate_cmd`.
98
+ """
99
+ logger = get_logger(logger_name)
100
+ logger.debug(f"START subprocess call to '{command}'")
101
+ validate_cmd(command=command, allow_char=allow_char)
102
+ res = subprocess.run( # nosec
103
+ shlex.split(command),
104
+ capture_output=True,
105
+ encoding="utf-8",
106
+ )
107
+ returncode = res.returncode
108
+ stdout = res.stdout
109
+ stderr = res.stderr
110
+ logger.debug(f"{returncode=}")
111
+ logger.debug(f"{stdout=}")
112
+ logger.debug(f"{stderr=}")
113
+ if res.returncode != 0:
114
+ logger.debug(f"ERROR in subprocess call to '{command}'")
115
+ raise RuntimeError(
116
+ f"Command {command} failed.\n"
117
+ f"returncode={res.returncode}\n"
118
+ f"{stdout=}\n"
119
+ f"{stderr=}\n"
120
+ )
121
+ logger.debug(f"END subprocess call to '{command}'")
122
+ return stdout
@@ -1,35 +1,29 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fractal-server
3
- Version: 2.7.0a11
3
+ Version: 2.8.0
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
7
7
  Author: Tommaso Comparin
8
8
  Author-email: tommaso.comparin@exact-lab.it
9
- Requires-Python: >=3.9,<4.0
9
+ Requires-Python: >=3.10,<4.0
10
10
  Classifier: License :: OSI Approved :: BSD License
11
11
  Classifier: Programming Language :: Python :: 3
12
- Classifier: Programming Language :: Python :: 3.9
13
12
  Classifier: Programming Language :: Python :: 3.10
14
13
  Classifier: Programming Language :: Python :: 3.11
15
14
  Classifier: Programming Language :: Python :: 3.12
16
- Provides-Extra: gunicorn
17
- Provides-Extra: postgres
18
- Provides-Extra: postgres-psycopg-binary
19
15
  Requires-Dist: aiosqlite (>=0.19.0,<0.20.0)
20
16
  Requires-Dist: alembic (>=1.13.1,<2.0.0)
21
- Requires-Dist: asyncpg (>=0.29.0,<0.30.0) ; extra == "postgres"
22
17
  Requires-Dist: bcrypt (==4.0.1)
23
18
  Requires-Dist: cloudpickle (>=3.0.0,<3.1.0)
24
19
  Requires-Dist: clusterfutures (>=0.5,<0.6)
25
20
  Requires-Dist: fabric (>=3.2.2,<4.0.0)
26
21
  Requires-Dist: fastapi (>=0.115.0,<0.116.0)
27
22
  Requires-Dist: fastapi-users[oauth] (>=12.1.0,<13.0.0)
28
- Requires-Dist: gunicorn (>=21.2,<23.0) ; extra == "gunicorn"
23
+ Requires-Dist: gunicorn (>=21.2,<23.0)
29
24
  Requires-Dist: packaging (>=23.2,<24.0)
30
25
  Requires-Dist: psutil (>=5.9.8,<6.0.0)
31
- Requires-Dist: psycopg2 (>=2.9.5,<3.0.0) ; extra == "postgres"
32
- Requires-Dist: psycopg[binary] (>=3.1.0,<4.0.0) ; extra == "postgres-psycopg-binary"
26
+ Requires-Dist: psycopg[binary] (>=3.1.0,<4.0.0)
33
27
  Requires-Dist: pydantic (>=1.10.8,<2)
34
28
  Requires-Dist: python-dotenv (>=1.0.0,<2.0.0)
35
29
  Requires-Dist: sqlalchemy[asyncio] (>=2.0.23,<2.1)
@@ -43,15 +37,20 @@ Description-Content-Type: text/markdown
43
37
 
44
38
  # Fractal Server
45
39
 
40
+ <p align="center">
41
+ <img src="https://github.com/user-attachments/assets/16e9cf11-d47d-4db8-a9b1-f5349e4175b7" alt="Fractal server" width="400">
42
+ </p>
43
+
46
44
  [![PyPI version](https://img.shields.io/pypi/v/fractal-server?color=gree)](https://pypi.org/project/fractal-server/)
45
+ [![License](https://img.shields.io/badge/License-BSD_3--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause)
47
46
  [![CI Status](https://github.com/fractal-analytics-platform/fractal-server/actions/workflows/ci.yml/badge.svg)](https://github.com/fractal-analytics-platform/fractal-server/actions/workflows/ci.yml?query=branch%3Amain)
48
47
  [![Coverage](https://raw.githubusercontent.com/fractal-analytics-platform/fractal-server/python-coverage-comment-action-data/badge.svg)](https://htmlpreview.github.io/?https://github.com/fractal-analytics-platform/fractal-server/blob/python-coverage-comment-action-data/htmlcov/index.html)
49
- [![License](https://img.shields.io/badge/License-BSD_3--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause)
48
+ [![Documentation Status](https://github.com/fractal-analytics-platform/fractal-server/actions/workflows/documentation.yaml/badge.svg)](https://fractal-analytics-platform.github.io/fractal-server)
50
49
  [![Benchmarks](https://img.shields.io/badge/Benchmarks-Done-blue)](https://htmlpreview.github.io/?https://github.com/fractal-analytics-platform/fractal-server/blob/benchmark-api/benchmarks/bench.html)
51
50
 
52
51
  [Fractal](https://fractal-analytics-platform.github.io/) is a framework developed at the [BioVisionCenter](https://www.biovisioncenter.uzh.ch/en.html) to process bioimaging data at scale in the OME-Zarr format and prepare the images for interactive visualization.
53
52
 
54
- ![Fractal_overview](https://github.com/user-attachments/assets/286122d9-08cf-48e8-996d-3cf53e0a81c6)
53
+ ![Fractal_overview](https://github.com/user-attachments/assets/666c8797-2594-4b8e-b1d2-b43fca66d1df)
55
54
 
56
55
  This is the server component of the fractal analytics platform.
57
56
  Find more information about Fractal in general and the other repositories at
@@ -64,14 +63,12 @@ See https://fractal-analytics-platform.github.io/fractal-server.
64
63
 
65
64
  # Contributors and license
66
65
 
67
- Unless otherwise stated in each individual module, all Fractal components are
68
- released according to a BSD 3-Clause License, and Copyright is with Friedrich
69
- Miescher Institute for Biomedical Research and University of Zurich.
66
+ Fractal was conceived in the Liberali Lab at the Friedrich Miescher Institute for Biomedical Research and in the Pelkmans Lab at the University of Zurich by [@jluethi](https://github.com/jluethi) and [@gusqgm](https://github.com/gusqgm). The Fractal project is now developed at the [BioVisionCenter](https://www.biovisioncenter.uzh.ch/en.html) at the University of Zurich and the project lead is with [@jluethi](https://github.com/jluethi). The core development is done under contract by [eXact lab S.r.l.](https://www.exact-lab.it).
67
+
68
+ Unless otherwise specified, Fractal components are released under the BSD 3-Clause License, and copyright is with the BioVisionCenter at the University of Zurich.
70
69
 
71
70
  The SLURM compatibility layer is based on
72
71
  [`clusterfutures`](https://github.com/sampsyo/clusterfutures), by
73
72
  [@sampsyo](https://github.com/sampsyo) and collaborators, and it is released
74
73
  under the terms of the MIT license.
75
74
 
76
- Fractal was conceived in the Liberali Lab at the Friedrich Miescher Institute for Biomedical Research and in the Pelkmans Lab at the University of Zurich by [@jluethi](https://github.com/jluethi) and [@gusqgm](https://github.com/gusqgm). The Fractal project is now developed at the [BioVisionCenter](https://www.biovisioncenter.uzh.ch/en.html) at the University of Zurich and the project lead is with [@jluethi](https://github.com/jluethi). The core development is done under contract by [eXact lab S.r.l.](https://www.exact-lab.it/).
77
-
@@ -1,4 +1,4 @@
1
- fractal_server/__init__.py,sha256=U6Vt70hce3I5-D3BcN_SgVx3kKrnUis8AS0m58E-7IY,25
1
+ fractal_server/__init__.py,sha256=G56kqxabLk9eJUznRHuCU6TnwgJOf5nsccv59FmRQWI,22
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
@@ -7,7 +7,7 @@ fractal_server/app/models/__init__.py,sha256=aG7mf1zZbsgzDSp7GHEcZhdjHfW3TGPOLCI
7
7
  fractal_server/app/models/linkusergroup.py,sha256=LWTUfhH2uAnn_4moK7QdRUIHWtpw-hPZuW-5jClv_OE,610
8
8
  fractal_server/app/models/linkuserproject.py,sha256=eQaourbGRshvlMVlKzLYJKHEjfsW1CbWws9yW4eHXhA,567
9
9
  fractal_server/app/models/security.py,sha256=2npjgRKBZ7OAnhAXNbYxjtuOsSm1P4kak__qfk2SpeM,3770
10
- fractal_server/app/models/user_settings.py,sha256=0YXCAwoAVGqI2irRLdXgr9-JS0STtHhSaoFENigAnrk,1312
10
+ fractal_server/app/models/user_settings.py,sha256=3LodhERbRz3ajjmCnZiU1TOitduKu_9Lyv_Rgdnyusw,1350
11
11
  fractal_server/app/models/v1/__init__.py,sha256=hUI7dEbPaiZGN0IbHW4RSmSicyvtn_xeuevoX7zvUwI,466
12
12
  fractal_server/app/models/v1/dataset.py,sha256=99GDgt7njx8yYQApkImqp_7bHA5HH3ElvbR6Oyj9kVI,2017
13
13
  fractal_server/app/models/v1/job.py,sha256=QLGXcWdVRHaUHQNDapYYlLpEfw4K7QyD8TmcwhrWw2o,3304
@@ -20,7 +20,7 @@ fractal_server/app/models/v2/collection_state.py,sha256=Yx18ZbywjraOdlHFyRVlb3VP
20
20
  fractal_server/app/models/v2/dataset.py,sha256=-7sxHEw4IIAvF_uSan7tA3o8hvoakBkQ0SRvqS2iOQU,1455
21
21
  fractal_server/app/models/v2/job.py,sha256=ypJmN-qspkKBGhBG7Mt-HypSQqcQ2EmB4Bzzb2-y550,1535
22
22
  fractal_server/app/models/v2/project.py,sha256=rAHoh5KfYwIaW7rTX0_O0jvWmxEvfo1BafvmcXuSSRk,786
23
- fractal_server/app/models/v2/task.py,sha256=8cT_YBA5dyjBjunqCg23I-t3XZ62xJgiR-6brXISuLA,3337
23
+ fractal_server/app/models/v2/task.py,sha256=NmDGtSX5kGahAnsvFG__QEpyXCKxO9-E2Y_1lK6kKM8,3712
24
24
  fractal_server/app/models/v2/workflow.py,sha256=YBgFGCziUgU0aJ5EM3Svu9W2c46AewZO9VBlFCHiSps,1069
25
25
  fractal_server/app/models/v2/workflowtask.py,sha256=iDuJYk8kp4PNqGmbKRtGI7y-QsbjkNd_gDsbMzL4i-g,1274
26
26
  fractal_server/app/routes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -30,7 +30,7 @@ fractal_server/app/routes/admin/v2/__init__.py,sha256=zkdrk3mSQWfgTJugS8Sc_Q_xCA
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
32
  fractal_server/app/routes/admin/v2/task.py,sha256=Y0eujBgGhVapNXfW9azDxw4EBzLmEmCdh70y1RNQcb0,3895
33
- fractal_server/app/routes/admin/v2/task_group.py,sha256=loxjJe9C2BBsG8gWkhHgrn6ReeE4mnipQ21PMP3MrKI,5398
33
+ fractal_server/app/routes/admin/v2/task_group.py,sha256=KAp7QJ6AmrNLnYb8nXEEZj5AN8MqTUM6G2PpWEYKL7s,5726
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
36
36
  fractal_server/app/routes/api/v1/_aux_functions.py,sha256=P9Q48thGH95w0h5cacYoibxqgiiLW4oqZ8rNJ2LIISY,13219
@@ -43,16 +43,17 @@ fractal_server/app/routes/api/v1/workflow.py,sha256=2T93DuEnSshaDCue-JPmjuvGCtbk
43
43
  fractal_server/app/routes/api/v1/workflowtask.py,sha256=OYYConwJbmNULDw5I3T-UbSJKrbbBiAHbbBeVcpoFKQ,5785
44
44
  fractal_server/app/routes/api/v2/__init__.py,sha256=jybEV-vrknPoQvbgKJl0QQvHDPHOJXbDUG5vatHeis4,1963
45
45
  fractal_server/app/routes/api/v2/_aux_functions.py,sha256=mb4R_qqFxeW0LAis2QJIIfVx8Sydv1jTYaRIMsMxnIk,11720
46
+ fractal_server/app/routes/api/v2/_aux_functions_task_collection.py,sha256=MtUoI0XWHuPSousDeH2IC2WU--AUKQVup6Q6AbHiNUA,4102
46
47
  fractal_server/app/routes/api/v2/_aux_functions_tasks.py,sha256=IVzSb7J4ls5qp1HI8WcjRLIq6nx3ffcMI3vUi_aM_gc,10565
47
- fractal_server/app/routes/api/v2/dataset.py,sha256=Eilf_BAGjicIhqUiVwI86jlW45ineA5sVzxXW4b2GoQ,8329
48
+ fractal_server/app/routes/api/v2/dataset.py,sha256=Y6uZz--YSEGgnPYu05rZ9sr1Ug08bNl2v1h3VeApBe8,9441
48
49
  fractal_server/app/routes/api/v2/images.py,sha256=JR1rR6qEs81nacjriOXAOBQjAbCXF4Ew7M7mkWdxBU0,7920
49
50
  fractal_server/app/routes/api/v2/job.py,sha256=Bga2Kz1OjvDIdxZObWaaXVhNIhC_5JKhKRjEH2_ayEE,5157
50
51
  fractal_server/app/routes/api/v2/project.py,sha256=eWYFJ7F2ZYQcpi-_n-rhPF-Q4gJhzYBsVGYFhHZZXAE,6653
51
52
  fractal_server/app/routes/api/v2/status.py,sha256=6N9DSZ4iFqbZImorWfEAPoyoFUgEruo4Hweqo0x0xXU,6435
52
53
  fractal_server/app/routes/api/v2/submit.py,sha256=tq-NGnUlpIcm_MRN47rJRHkRcIJ5HiL4Wj1wItJy3o8,8185
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=gCxOwigT_tfs8lCDNoE7nxl9-9iuRp1gW__3YXqsioc,11478
55
- fractal_server/app/routes/api/v2/task_collection_custom.py,sha256=9T0U_4gqrQbJCy6uFDCMSZ-b1sfNIzyz_qm4P41W2Gs,6133
54
+ fractal_server/app/routes/api/v2/task.py,sha256=K0ik33t7vL8BAK5S7fqyJDNdRK4stGqb_73bSa8tvPE,7159
55
+ fractal_server/app/routes/api/v2/task_collection.py,sha256=aCOg9zhRtGfJvRpukS_mSah19jhGEqXaE8hUDOMIZUs,10479
56
+ fractal_server/app/routes/api/v2/task_collection_custom.py,sha256=CTxRy0ghYZahlS6WNr6qRFa0xfAQbbU6xZh6F9VykAY,6212
56
57
  fractal_server/app/routes/api/v2/task_group.py,sha256=P32EUYbtGThexSWe5zI9WUFrgoOMof035fJBILTNnfQ,5580
57
58
  fractal_server/app/routes/api/v2/workflow.py,sha256=PyvkrUHHzFGUGZE5X0VW5u3DPQA7wtXXNcEpG7-N66I,8687
58
59
  fractal_server/app/routes/api/v2/workflow_import.py,sha256=rD26vZ-ztjehvglrERixTeHtXuzepAtgAuPiKRNz84Q,10981
@@ -134,7 +135,7 @@ fractal_server/app/schemas/__init__.py,sha256=stURAU_t3AOBaH0HSUbV-GKhlPKngnnIMo
134
135
  fractal_server/app/schemas/_validators.py,sha256=XKEGEHxp3H6YSJewtFWXe_2Nh7SDdNtAXmlEmJO6Vb0,3606
135
136
  fractal_server/app/schemas/user.py,sha256=aUD8YAcfYTEO06TEUoTx4heVrXFiX7E2Mb8D2--4FsA,2130
136
137
  fractal_server/app/schemas/user_group.py,sha256=YwJvYgj-PI66LWy38CEd_FIZPsBV1_2N5zJPGFcFvBw,2143
137
- fractal_server/app/schemas/user_settings.py,sha256=UEST1MSmd9w2YypCji3SONSFlJcr2u4uG3bTczZy_Pk,3102
138
+ fractal_server/app/schemas/user_settings.py,sha256=TalISeEfCrtN8LgqbLx1Q8ZPoeiZnbksg5NYAVzkIqY,3527
138
139
  fractal_server/app/schemas/v1/__init__.py,sha256=CrBGgBhoemCvmZ70ZUchM-jfVAICnoa7AjZBAtL2UB0,1852
139
140
  fractal_server/app/schemas/v1/applyworkflow.py,sha256=uuIh7fHlHEL4yLqL-dePI6-nfCsqgBYATmht7w_KITw,4302
140
141
  fractal_server/app/schemas/v1/dataset.py,sha256=n71lNUO3JLy2K3IM9BZM2Fk1EnKQOTU7pm2s2rJ1FGY,3444
@@ -145,22 +146,21 @@ fractal_server/app/schemas/v1/state.py,sha256=GYeOE_1PtDOgu5W4t_3gw3DBHXH2aCGzIN
145
146
  fractal_server/app/schemas/v1/task.py,sha256=7BxOZ_qoRQ8n3YbQpDvB7VMcxB5fSYQmR5RLIWhuJ5U,3704
146
147
  fractal_server/app/schemas/v1/task_collection.py,sha256=uvq9bcMaGD_qHsh7YtcpoSAkVAbw12eY4DocIO3MKOg,3057
147
148
  fractal_server/app/schemas/v1/workflow.py,sha256=tuOs5E5Q_ozA8if7YPZ07cQjzqB_QMkBS4u92qo4Ro0,4618
148
- fractal_server/app/schemas/v2/__init__.py,sha256=G44JgD_i_zCpV7yjXcoS5ygOS3IfsIWoktLVZao6TaE,2323
149
- fractal_server/app/schemas/v2/dataset.py,sha256=865ia13E9mWu1DaYyppKW2csNYglaInrScrprdVYX7A,2552
149
+ fractal_server/app/schemas/v2/__init__.py,sha256=97y6QY0I4322CPXQCt3WO3QBWhVkmFgwLn8y2ZwWNR0,2382
150
+ fractal_server/app/schemas/v2/dataset.py,sha256=_RAm-DX2nR7QUe6iHWbs3fYZPE0xnitnR6wD2dVutdM,2618
150
151
  fractal_server/app/schemas/v2/dumps.py,sha256=s6dg-pHZFui6t2Ktm0SMxjKDN-v-ZqBHz9iTsBQF3eU,1712
151
152
  fractal_server/app/schemas/v2/job.py,sha256=oYSLYkQ0HL83QyjEGIaggtZ117FndzFlONMKWd9sTXM,3270
152
153
  fractal_server/app/schemas/v2/manifest.py,sha256=Uqtd7DbyOkf9bxBOKkU7Sv7nToBIFGUcfjY7rd5iO7c,6981
153
154
  fractal_server/app/schemas/v2/project.py,sha256=UXEA0UUUe0bFFOVLLmVtvDFLBO5vmD1JVI7EeTIcwDo,756
154
155
  fractal_server/app/schemas/v2/status.py,sha256=SQaUpQkjFq5c5k5J4rOjNhuQaDOEg8lksPhkKmPU5VU,332
155
156
  fractal_server/app/schemas/v2/task.py,sha256=FFAbYwDlqowB8gVMdjFVPVHvAM0T89PYLixUth49xfQ,6870
156
- fractal_server/app/schemas/v2/task_collection.py,sha256=Ddw_7QaQ93kdEIwWQvzLQDu03gho_OHdhah3n0ioK3M,6296
157
- fractal_server/app/schemas/v2/task_group.py,sha256=F40u64z-wXHNPFjx9RHozzl_SySTHfKFc-sBFyn_e0I,2352
157
+ fractal_server/app/schemas/v2/task_collection.py,sha256=99ohBL9CSX4N7PwDgZH8U27N0x4xLNII0_fw7ln_IxI,6843
158
+ fractal_server/app/schemas/v2/task_group.py,sha256=oWy7NNsw8Co85qpLyK8FPNTgpAMvx0ZuXjIOVZuLEpM,2466
158
159
  fractal_server/app/schemas/v2/workflow.py,sha256=HSNQSrBRdoBzh8Igr76FUWCAWvVzykrqmUv1vGv-8og,2026
159
160
  fractal_server/app/schemas/v2/workflowtask.py,sha256=vDdMktYbHeYBgB5OuWSv6wRPRXWqvetkeqQ7IC5YtfA,5751
160
- fractal_server/app/security/__init__.py,sha256=V1NOWlmaFZHMR6SrkMl62jyAuqYONyo8lyGvR6UZesM,12312
161
+ fractal_server/app/security/__init__.py,sha256=8Xd4GxumZgvxEH1Vli3ULehwdesEPiaAbtffJvAEgNo,12509
161
162
  fractal_server/app/user_settings.py,sha256=aZgQ3i0JkHfgwLGW1ee6Gzr1ae3IioFfJKKSsSS8Svk,1312
162
- fractal_server/config.py,sha256=gX0aYwDwbC5y7JNorifON84YMveubb7XTb4sH14N3KM,23667
163
- fractal_server/data_migrations/2_7_0.py,sha256=DQQJ_tLYFteH3Jw246ovIh3Dac_9SaAefoy7FLw5Cso,11145
163
+ fractal_server/config.py,sha256=-G1RvmaeSb6_wffUFuaAmhJV3u1q3HRpMLEfpGXBrz4,22797
164
164
  fractal_server/data_migrations/README.md,sha256=_3AEFvDg9YkybDqCLlFPdDmGJvr6Tw7HRI14aZ3LOIw,398
165
165
  fractal_server/data_migrations/tools.py,sha256=LeMeASwYGtEqd-3wOLle6WARdTGAimoyMmRbbJl-hAM,572
166
166
  fractal_server/gunicorn_fractal.py,sha256=u6U01TLGlXgq1v8QmEpLih3QnsInZD7CqphgJ_GrGzc,1230
@@ -175,6 +175,7 @@ fractal_server/migrations/naming_convention.py,sha256=htbKrVdetx3pklowb_9Cdo5Rqe
175
175
  fractal_server/migrations/script.py.mako,sha256=oMXw9LC3zRbinWWPPDgeZ4z9FJrV2zhRWiYdS5YgNbI,526
176
176
  fractal_server/migrations/versions/034a469ec2eb_task_groups.py,sha256=vrPhC8hfFu1c4HmLHNZyCuqEfecFD8-bWc49bXMNes0,6199
177
177
  fractal_server/migrations/versions/091b01f51f88_add_usergroup_and_linkusergroup_table.py,sha256=-BSS9AFTPcu3gYC-sYbawSy4MWQQx8TfMb5BW5EBKmQ,1450
178
+ fractal_server/migrations/versions/19eca0dd47a9_user_settings_project_dir.py,sha256=Q1Gj1cJ0UrdLBJ5AXfFK9QpxTtmcv-4Z3NEGDnxOme4,961
178
179
  fractal_server/migrations/versions/4c308bcaea2b_add_task_args_schema_and_task_args_.py,sha256=-wHe-fOffmYeAm0JXVl_lxZ7hhDkaEVqxgxpHkb_uL8,954
179
180
  fractal_server/migrations/versions/4cedeb448a53_workflowtask_foreign_keys_not_nullables.py,sha256=Mob8McGYAcmgvrseyyYOa54E6Gsgr-4SiGdC-r9O4_A,1157
180
181
  fractal_server/migrations/versions/501961cfcd85_remove_link_between_v1_and_v2_tasks_.py,sha256=5ROUgcoZOdjf8kMt6cxuvPhzHmV6xaCxvZEbhUEyZM4,3271
@@ -183,6 +184,7 @@ fractal_server/migrations/versions/5bf02391cfef_v2.py,sha256=axhNkr_H6R4rRbY7oGY
183
184
  fractal_server/migrations/versions/70e77f1c38b0_add_applyworkflow_first_task_index_and_.py,sha256=Q-DsMzG3IcUV2Ol1dhJWosDvKERamBE6QvA2zzS5zpQ,1632
184
185
  fractal_server/migrations/versions/71eefd1dd202_add_slurm_accounts.py,sha256=mbWuCkTpRAdGbRhW7lhXs_e5S6O37UAcCN6JfoY5H8A,1353
185
186
  fractal_server/migrations/versions/84bf0fffde30_add_dumps_to_applyworkflow.py,sha256=NSCuhANChsg76vBkShBl-9tQ4VEHubOjtAv1etHhlvY,2684
187
+ fractal_server/migrations/versions/8e8f227a3e36_update_taskv2_post_2_7_0.py,sha256=68y9-fpSuKx6KPtM_9n8Ho0I1qwa8IoG-yJqXUYQrGg,1111
186
188
  fractal_server/migrations/versions/8f79bd162e35_add_docs_info_and_docs_link_to_task_.py,sha256=6pgODDtyAxevZvAJBj9IJ41inhV1RpwbpZr_qfPPu1A,1115
187
189
  fractal_server/migrations/versions/94a47ea2d3ff_remove_cache_dir_slurm_user_and_slurm_.py,sha256=yL3-Hvzw5jBLKj4LFP1z5ofZE9L9W3tLwYtPNW7z4ko,1508
188
190
  fractal_server/migrations/versions/97f444d47249_add_applyworkflow_project_dump.py,sha256=eKTZm3EgUgapXBxO0RuHkEfTKic-TZG3ADaMpGLuc0k,1057
@@ -201,30 +203,31 @@ fractal_server/ssh/_fabric.py,sha256=Pha-gRVUImj1cMsxulrJzaQa6Z60CmMYRAS4o22FcP0
201
203
  fractal_server/string_tools.py,sha256=Z4qcleqXSG6RCG4hqS1emm0U-Bvv0sgTm_T87ZdYn7M,2395
202
204
  fractal_server/syringe.py,sha256=3qSMW3YaMKKnLdgnooAINOPxnCOxP7y2jeAQYB21Gdo,2786
203
205
  fractal_server/tasks/__init__.py,sha256=kadmVUoIghl8s190_Tt-8f-WBqMi8u8oU4Pvw39NHE8,23
204
- fractal_server/tasks/utils.py,sha256=8sbVCxvgfuzGxEhSfnLWRv36Rx4ZUwR7IAPP1TXfJFM,2178
206
+ fractal_server/tasks/utils.py,sha256=lJeaGX0xw4uE_dQGMnFAvmz03gUVh_nv8m47yuwFcKc,1340
205
207
  fractal_server/tasks/v1/_TaskCollectPip.py,sha256=ARq5AoHYXH0hziEsb-nFAqbsLA-VIddXOdXL38O6_zA,3746
206
208
  fractal_server/tasks/v1/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
207
- fractal_server/tasks/v1/background_operations.py,sha256=zYhqAP3-hedHxF9AMHFf8Y1znoFvC7Lq1qhqJPNROfk,11781
208
- fractal_server/tasks/v1/endpoint_operations.py,sha256=YyMU1Y3Xt7D9WOKqaMLuwEoIaAqQP2Klz3I-ypAgOLI,5077
209
+ fractal_server/tasks/v1/background_operations.py,sha256=0Zm8TT_RV0BxJCXbruYJCu1eXOkEcHpqnWn_BEe7huw,11829
210
+ fractal_server/tasks/v1/endpoint_operations.py,sha256=NQYvgh-_qEI9YhsLiulfOFPDacCd-rgl3cCbPbkJUA0,5103
209
211
  fractal_server/tasks/v1/get_collection_data.py,sha256=5C22jp356rCH5IIC0J57wOu-DCC_kp3B6p68JooN7IM,508
210
- fractal_server/tasks/v1/utils.py,sha256=J9oKys-82OehBxOon5wWl3CxjVBgYWeVEEyWGVFnreI,1759
212
+ fractal_server/tasks/v1/utils.py,sha256=HYFyNAyZofmf--mVgdwGC5TJpGShIWIDaS01yRr4HxM,1771
211
213
  fractal_server/tasks/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
212
- fractal_server/tasks/v2/_venv_pip.py,sha256=FOD20yKfTsW7sim3h7CsB6pgp85JBhELyYvbkpaiDKA,6390
213
- fractal_server/tasks/v2/background_operations.py,sha256=jWmg_XkBmcXQfPKJu_eu0wtDL4sMp1QP2bIZ9QtMj_Y,15411
214
- fractal_server/tasks/v2/background_operations_ssh.py,sha256=W-w_a7FgrSc9FAVSXoVBzvXSCmH9oQkaDJx2S9hQPlc,13616
214
+ fractal_server/tasks/v2/collection_local.py,sha256=pRGF2NYIc5hwwNZOruyb7RSChWytRMxC2e8WSeMuYMI,13615
215
+ fractal_server/tasks/v2/collection_ssh.py,sha256=Yv8TgUK0yqiRjVo1mHXLbYV2NpTWE_nPzBFGdCPJX0E,13437
215
216
  fractal_server/tasks/v2/database_operations.py,sha256=6r56yyFPnEBrXl6ncmO6D76znzISQCFZqCYcD-Ummd4,1213
216
- fractal_server/tasks/v2/endpoint_operations.py,sha256=MtUoI0XWHuPSousDeH2IC2WU--AUKQVup6Q6AbHiNUA,4102
217
- fractal_server/tasks/v2/templates/_1_create_venv.sh,sha256=7tt-B6n8KRN-pannZ0enE6XSxyq-hKRYRGY63CvtINI,1151
218
- fractal_server/tasks/v2/templates/_2_upgrade_pip.sh,sha256=ca5Yng6JgJYu-a4QrsIsatwUmrLdRWBKw7_VJrY7WLY,555
219
- fractal_server/tasks/v2/templates/_3_pip_install.sh,sha256=T9sabeB9iQzVZpLfuLkKGz9EpfHkUrJHKWO4HNij6yM,595
217
+ fractal_server/tasks/v2/templates/_1_create_venv.sh,sha256=bfpX3GJtrns1ogidyQHmYaAZjVdQLG-YYazc2GR4z5w,967
218
+ fractal_server/tasks/v2/templates/_2_preliminary_pip_operations.sh,sha256=nRDvTbGljCmJdzfRJz_w-RptyyJoeAtIMiP7NCwVNnU,625
219
+ fractal_server/tasks/v2/templates/_3_pip_install.sh,sha256=nTw8mGmZEVGc-WGDaIK3WVSsJRDuIS8X2l1T3gl34OM,1371
220
220
  fractal_server/tasks/v2/templates/_4_pip_freeze.sh,sha256=qHdDKu1svXi1VQKGePciEJK4_uEKuwAvwaDCcGxSvNk,274
221
- fractal_server/tasks/v2/templates/_5_pip_show.sh,sha256=GrJ19uHYQxANEy9JaeNJZVTquY9c8Ww9eCdnC7eLVr0,1754
222
- fractal_server/tasks/v2/utils.py,sha256=MnY6MhcxDRo4rPuXo2tQ252eWEPZF3OlCGe-p5MrG9U,1846
221
+ fractal_server/tasks/v2/templates/_5_pip_show.sh,sha256=OdPKVUu3gU0N9ygLoRWvW5rBe8_HO4YCCNX8ulsy9-M,1754
222
+ fractal_server/tasks/v2/utils_background.py,sha256=Q88PtbeyfYXfxupTU9d71EcNRurxKwCjuunXN567SC0,6569
223
+ fractal_server/tasks/v2/utils_package_names.py,sha256=RDg__xrvQs4ieeVzmVdMcEh95vGQYrv9Hfal-5EDBM8,2393
224
+ fractal_server/tasks/v2/utils_python_interpreter.py,sha256=-EWh3Y3VqHLDOWUO_wG_wknqmGqKAD0O2KTLhNjrZaI,948
225
+ fractal_server/tasks/v2/utils_templates.py,sha256=61uz9WSb4BDe6JUyJGiasw8BjVrPAmtc8pnNSJ51yS4,1840
223
226
  fractal_server/urls.py,sha256=5o_qq7PzKKbwq12NHSQZDmDitn5RAOeQ4xufu-2v9Zk,448
224
- fractal_server/utils.py,sha256=jrlCBPmC7F0ptBVcDac-EbZNsdYTLbHfX9oxkXthS5Q,2193
227
+ fractal_server/utils.py,sha256=BTvNYA8xG-2K42x_hhsKmxrludbSvUbPpbWPq-Dousg,3481
225
228
  fractal_server/zip_tools.py,sha256=xYpzBshysD2nmxkD5WLYqMzPYUcCRM3kYy-7n9bJL-U,4426
226
- fractal_server-2.7.0a11.dist-info/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
227
- fractal_server-2.7.0a11.dist-info/METADATA,sha256=7vwgLiEeN-_a0vB2gnMmsPX_WMaa9BH3azyswEIT128,4631
228
- fractal_server-2.7.0a11.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
229
- fractal_server-2.7.0a11.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
230
- fractal_server-2.7.0a11.dist-info/RECORD,,
229
+ fractal_server-2.8.0.dist-info/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
230
+ fractal_server-2.8.0.dist-info/METADATA,sha256=qHNx9Z6smCqff4r4-raosWiFCRh9E2ICeZyjRoiIZYg,4588
231
+ fractal_server-2.8.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
232
+ fractal_server-2.8.0.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
233
+ fractal_server-2.8.0.dist-info/RECORD,,