fractal-server 2.0.0a4__py3-none-any.whl → 2.0.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 (27) hide show
  1. fractal_server/__init__.py +1 -1
  2. fractal_server/app/models/v2/dataset.py +0 -1
  3. fractal_server/app/models/v2/project.py +0 -1
  4. fractal_server/app/routes/api/v1/task_collection.py +10 -0
  5. fractal_server/app/routes/api/v2/__init__.py +5 -1
  6. fractal_server/app/routes/api/v2/submit.py +0 -9
  7. fractal_server/app/routes/api/v2/task_collection.py +11 -1
  8. fractal_server/app/routes/api/v2/task_legacy.py +59 -0
  9. fractal_server/app/runner/v1/_common.py +1 -1
  10. fractal_server/app/runner/v2/deduplicate_list.py +2 -1
  11. fractal_server/app/runner/v2/runner.py +19 -0
  12. fractal_server/app/runner/v2/task_interface.py +4 -2
  13. fractal_server/app/schemas/v1/task.py +0 -1
  14. fractal_server/app/schemas/v2/__init__.py +1 -0
  15. fractal_server/app/schemas/v2/dataset.py +2 -5
  16. fractal_server/app/schemas/v2/dumps.py +0 -2
  17. fractal_server/app/schemas/v2/project.py +0 -3
  18. fractal_server/app/schemas/v2/task.py +5 -0
  19. fractal_server/app/schemas/v2/workflow.py +2 -2
  20. fractal_server/images/__init__.py +1 -0
  21. fractal_server/images/models.py +35 -1
  22. fractal_server/migrations/versions/{d71e732236cd_v2.py → 80e12e1bc4fd_v2.py} +4 -6
  23. {fractal_server-2.0.0a4.dist-info → fractal_server-2.0.0a6.dist-info}/METADATA +1 -1
  24. {fractal_server-2.0.0a4.dist-info → fractal_server-2.0.0a6.dist-info}/RECORD +27 -26
  25. {fractal_server-2.0.0a4.dist-info → fractal_server-2.0.0a6.dist-info}/LICENSE +0 -0
  26. {fractal_server-2.0.0a4.dist-info → fractal_server-2.0.0a6.dist-info}/WHEEL +0 -0
  27. {fractal_server-2.0.0a4.dist-info → fractal_server-2.0.0a6.dist-info}/entry_points.txt +0 -0
@@ -1 +1 @@
1
- __VERSION__ = "2.0.0a4"
1
+ __VERSION__ = "2.0.0a6"
@@ -28,7 +28,6 @@ class DatasetV2(SQLModel, table=True):
28
28
  history: list[dict[str, Any]] = Field(
29
29
  sa_column=Column(JSON, server_default="[]", nullable=False)
30
30
  )
31
- read_only: bool = False
32
31
 
33
32
  timestamp_created: datetime = Field(
34
33
  default_factory=get_timestamp,
@@ -16,7 +16,6 @@ class ProjectV2(SQLModel, table=True):
16
16
 
17
17
  id: Optional[int] = Field(default=None, primary_key=True)
18
18
  name: str
19
- read_only: bool = False
20
19
  timestamp_created: datetime = Field(
21
20
  default_factory=get_timestamp,
22
21
  sa_column=Column(DateTime(timezone=True), nullable=False),
@@ -140,6 +140,16 @@ async def collect_tasks_pip(
140
140
  f"Original error: {e}"
141
141
  ),
142
142
  )
143
+ except ValidationError as e:
144
+ await db.close()
145
+ raise HTTPException(
146
+ status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
147
+ detail=(
148
+ "Cannot collect package. Possible reason: an old version "
149
+ "of the same package has already been collected. "
150
+ f"Original error: {e}"
151
+ ),
152
+ )
143
153
  task_collect_status.info = "Already installed"
144
154
  state = State(data=task_collect_status.sanitised_dict())
145
155
  response.status_code == status.HTTP_200_OK
@@ -10,6 +10,7 @@ from .project import router as project_router_v2
10
10
  from .submit import router as submit_job_router_v2
11
11
  from .task import router as task_router_v2
12
12
  from .task_collection import router as task_collection_router_v2
13
+ from .task_legacy import router as task_legacy_router_v2
13
14
  from .workflow import router as workflow_router_v2
14
15
  from .workflowtask import router as workflowtask_router_v2
15
16
 
@@ -20,9 +21,12 @@ router_api_v2.include_router(job_router_v2, tags=["V2 Job"])
20
21
  router_api_v2.include_router(images_routes_v2, tags=["V2 Images"])
21
22
  router_api_v2.include_router(project_router_v2, tags=["V2 Project"])
22
23
  router_api_v2.include_router(submit_job_router_v2, tags=["V2 Job"])
23
- router_api_v2.include_router(task_router_v2, prefix="/task", tags=["V2 Task"])
24
24
  router_api_v2.include_router(
25
25
  task_collection_router_v2, prefix="/task", tags=["V2 Task Collection"]
26
26
  )
27
+ router_api_v2.include_router(task_router_v2, prefix="/task", tags=["V2 Task"])
28
+ router_api_v2.include_router(
29
+ task_legacy_router_v2, prefix="/task-legacy", tags=["V2 Task Legacy"]
30
+ )
27
31
  router_api_v2.include_router(workflow_router_v2, tags=["V2 Workflow"])
28
32
  router_api_v2.include_router(workflowtask_router_v2, tags=["V2 WorkflowTask"])
@@ -59,15 +59,6 @@ async def apply_workflow(
59
59
  project = output["project"]
60
60
  dataset = output["dataset"]
61
61
 
62
- if dataset.read_only:
63
- raise HTTPException(
64
- status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
65
- detail=(
66
- "Cannot apply workflow because dataset "
67
- f"({dataset_id=}) is read_only."
68
- ),
69
- )
70
-
71
62
  workflow = await _get_workflow_check_owner(
72
63
  project_id=project_id, workflow_id=workflow_id, user_id=user.id, db=db
73
64
  )
@@ -137,7 +137,17 @@ async def collect_tasks_pip(
137
137
  detail=(
138
138
  "Cannot collect package. Possible reason: another "
139
139
  "collection of the same package is in progress. "
140
- f"Original error: {e}"
140
+ f"Original FileNotFoundError: {e}"
141
+ ),
142
+ )
143
+ except ValidationError as e:
144
+ await db.close()
145
+ raise HTTPException(
146
+ status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
147
+ detail=(
148
+ "Cannot collect package. Possible reason: an old version "
149
+ "of the same package has already been collected. "
150
+ f"Original ValidationError: {e}"
141
151
  ),
142
152
  )
143
153
  task_collect_status.info = "Already installed"
@@ -0,0 +1,59 @@
1
+ from fastapi import APIRouter
2
+ from fastapi import Depends
3
+ from fastapi import HTTPException
4
+ from fastapi import status
5
+ from sqlmodel import select
6
+
7
+ from .....logger import set_logger
8
+ from ....db import AsyncSession
9
+ from ....db import get_async_db
10
+ from ....models.v1 import Task as TaskV1
11
+ from ....schemas.v2 import TaskLegacyReadV2
12
+ from ....security import current_active_user
13
+ from ....security import User
14
+
15
+ router = APIRouter()
16
+
17
+ logger = set_logger(__name__)
18
+
19
+
20
+ @router.get("/", response_model=list[TaskLegacyReadV2])
21
+ async def get_list_task_legacy(
22
+ args_schema: bool = True,
23
+ only_v2_compatible: bool = False,
24
+ user: User = Depends(current_active_user),
25
+ db: AsyncSession = Depends(get_async_db),
26
+ ) -> list[TaskLegacyReadV2]:
27
+ """
28
+ Get list of available legacy tasks
29
+ """
30
+ stm = select(TaskV1)
31
+ if only_v2_compatible:
32
+ stm = stm.where(TaskV1.is_v2_compatible)
33
+ res = await db.execute(stm)
34
+ task_list = res.scalars().all()
35
+ await db.close()
36
+ if args_schema is False:
37
+ for task in task_list:
38
+ setattr(task, "args_schema", None)
39
+
40
+ return task_list
41
+
42
+
43
+ @router.get("/{task_id}/", response_model=TaskLegacyReadV2)
44
+ async def get_task_legacy(
45
+ task_id: int,
46
+ user: User = Depends(current_active_user),
47
+ db: AsyncSession = Depends(get_async_db),
48
+ ) -> TaskLegacyReadV2:
49
+ """
50
+ Get info on a specific legacy task
51
+ """
52
+ task = await db.get(TaskV1, task_id)
53
+ await db.close()
54
+ if not task:
55
+ raise HTTPException(
56
+ status_code=status.HTTP_404_NOT_FOUND,
57
+ detail=f"TaskV1[{task_id}] not found",
58
+ )
59
+ return task
@@ -207,7 +207,7 @@ def call_single_task(
207
207
  with task_files.metadiff.open("r") as f_metadiff:
208
208
  diff_metadata = json.load(f_metadiff)
209
209
  except FileNotFoundError as e:
210
- logger.error(
210
+ logger.warning(
211
211
  f"Skip collection of updated metadata. Original error: {str(e)}"
212
212
  )
213
213
  diff_metadata = {}
@@ -1,9 +1,10 @@
1
1
  from typing import TypeVar
2
2
 
3
3
  from ....images import SingleImage
4
+ from ....images import SingleImageTaskOutput
4
5
  from .task_interface import InitArgsModel
5
6
 
6
- T = TypeVar("T", SingleImage, InitArgsModel)
7
+ T = TypeVar("T", SingleImage, SingleImageTaskOutput, InitArgsModel)
7
8
 
8
9
 
9
10
  def deduplicate_list(
@@ -157,6 +157,20 @@ def execute_tasks_v2(
157
157
  updated_types.update(image["types"])
158
158
  updated_types.update(task.output_types)
159
159
 
160
+ # Unset attributes with None value
161
+ updated_attributes = {
162
+ key: value
163
+ for key, value in updated_attributes.items()
164
+ if value is not None
165
+ }
166
+
167
+ # Validate new image
168
+ SingleImage(
169
+ zarr_url=image["zarr_url"],
170
+ types=updated_types,
171
+ attributes=updated_attributes,
172
+ )
173
+
160
174
  # Update image in the dataset image list
161
175
  tmp_images[original_index]["attributes"] = updated_attributes
162
176
  tmp_images[original_index]["types"] = updated_types
@@ -182,6 +196,11 @@ def execute_tasks_v2(
182
196
  updated_types = copy(original_img["types"])
183
197
  # Update image attributes/types with task output and manifest
184
198
  updated_attributes.update(image["attributes"])
199
+ updated_attributes = {
200
+ key: value
201
+ for key, value in updated_attributes.items()
202
+ if value is not None
203
+ }
185
204
  updated_types.update(image["types"])
186
205
  updated_types.update(task.output_types)
187
206
  new_image = dict(
@@ -3,7 +3,7 @@ from typing import Any
3
3
  from pydantic import BaseModel
4
4
  from pydantic import Field
5
5
 
6
- from ....images import SingleImage
6
+ from ....images import SingleImageTaskOutput
7
7
  from fractal_server.images import Filters
8
8
 
9
9
 
@@ -11,7 +11,9 @@ class TaskOutput(BaseModel):
11
11
  class Config:
12
12
  extra = "forbid"
13
13
 
14
- image_list_updates: list[SingleImage] = Field(default_factory=list)
14
+ image_list_updates: list[SingleImageTaskOutput] = Field(
15
+ default_factory=list
16
+ )
15
17
  image_list_removals: list[str] = Field(default_factory=list)
16
18
  filters: Filters = Field(default_factory=Filters)
17
19
 
@@ -122,7 +122,6 @@ class TaskReadV1(_TaskBaseV1):
122
122
  args_schema_version: Optional[str]
123
123
  docs_info: Optional[str]
124
124
  docs_link: Optional[HttpUrl]
125
- is_v2_compatible: bool
126
125
 
127
126
 
128
127
  class TaskCreateV1(_TaskBaseV1):
@@ -17,6 +17,7 @@ from .project import ProjectUpdateV2 # noqa F401
17
17
  from .task import TaskCreateV2 # noqa F401
18
18
  from .task import TaskExportV2 # noqa F401
19
19
  from .task import TaskImportV2 # noqa F401
20
+ from .task import TaskLegacyReadV2 # noqa F401
20
21
  from .task import TaskReadV2 # noqa F401
21
22
  from .task import TaskUpdateV2 # noqa F401
22
23
  from .task_collection import TaskCollectPipV2 # noqa F401
@@ -8,8 +8,8 @@ from pydantic import validator
8
8
 
9
9
  from .._validators import valstr
10
10
  from .._validators import valutc
11
- from ..v1.project import ProjectReadV1
12
11
  from .dumps import WorkflowTaskDumpV2
12
+ from .project import ProjectReadV2
13
13
  from .workflowtask import WorkflowTaskStatusTypeV2
14
14
  from fractal_server.images import Filters
15
15
 
@@ -45,7 +45,6 @@ class DatasetCreateV2(BaseModel, extra=Extra.forbid):
45
45
 
46
46
  name: str
47
47
 
48
- read_only: bool = False
49
48
  zarr_dir: str
50
49
 
51
50
  filters: Filters = Field(default_factory=Filters)
@@ -60,10 +59,9 @@ class DatasetReadV2(BaseModel):
60
59
  name: str
61
60
 
62
61
  project_id: int
63
- project: ProjectReadV1
62
+ project: ProjectReadV2
64
63
 
65
64
  history: list[_DatasetHistoryItemV2]
66
- read_only: bool
67
65
 
68
66
  timestamp_created: datetime
69
67
 
@@ -81,7 +79,6 @@ class DatasetUpdateV2(BaseModel):
81
79
  extra = "forbid"
82
80
 
83
81
  name: Optional[str]
84
- read_only: Optional[bool]
85
82
  zarr_dir: Optional[str]
86
83
  filters: Optional[Filters]
87
84
 
@@ -22,7 +22,6 @@ class ProjectDumpV2(BaseModel, extra=Extra.forbid):
22
22
 
23
23
  id: int
24
24
  name: str
25
- read_only: bool
26
25
  timestamp_created: str
27
26
 
28
27
 
@@ -80,7 +79,6 @@ class DatasetDumpV2(BaseModel):
80
79
  id: int
81
80
  name: str
82
81
  project_id: int
83
- read_only: bool
84
82
  timestamp_created: str
85
83
 
86
84
  zarr_dir: str
@@ -12,7 +12,6 @@ from .._validators import valutc
12
12
  class ProjectCreateV2(BaseModel, extra=Extra.forbid):
13
13
 
14
14
  name: str
15
- read_only: bool = False
16
15
  # Validators
17
16
  _name = validator("name", allow_reuse=True)(valstr("name"))
18
17
 
@@ -21,7 +20,6 @@ class ProjectReadV2(BaseModel):
21
20
 
22
21
  id: int
23
22
  name: str
24
- read_only: bool
25
23
  timestamp_created: datetime
26
24
  # Validators
27
25
  _timestamp_created = validator("timestamp_created", allow_reuse=True)(
@@ -32,6 +30,5 @@ class ProjectReadV2(BaseModel):
32
30
  class ProjectUpdateV2(BaseModel):
33
31
 
34
32
  name: Optional[str]
35
- read_only: Optional[bool]
36
33
  # Validators
37
34
  _name = validator("name", allow_reuse=True)(valstr("name"))
@@ -11,6 +11,7 @@ from pydantic import validator
11
11
 
12
12
  from .._validators import valdictkeys
13
13
  from .._validators import valstr
14
+ from ..v1.task import TaskReadV1
14
15
 
15
16
 
16
17
  class TaskCreateV2(BaseModel, extra=Extra.forbid):
@@ -100,6 +101,10 @@ class TaskReadV2(BaseModel):
100
101
  output_types: dict[str, bool]
101
102
 
102
103
 
104
+ class TaskLegacyReadV2(TaskReadV1):
105
+ is_v2_compatible: bool
106
+
107
+
103
108
  class TaskUpdateV2(BaseModel):
104
109
 
105
110
  name: Optional[str]
@@ -7,7 +7,7 @@ from pydantic import validator
7
7
 
8
8
  from .._validators import valstr
9
9
  from .._validators import valutc
10
- from ..v1.project import ProjectReadV1
10
+ from .project import ProjectReadV2
11
11
  from .workflowtask import WorkflowTaskExportV2
12
12
  from .workflowtask import WorkflowTaskImportV2
13
13
  from .workflowtask import WorkflowTaskReadV2
@@ -27,7 +27,7 @@ class WorkflowReadV2(BaseModel):
27
27
  name: str
28
28
  project_id: int
29
29
  task_list: list[WorkflowTaskReadV2]
30
- project: ProjectReadV1
30
+ project: ProjectReadV2
31
31
  timestamp_created: datetime
32
32
 
33
33
  _timestamp_created = validator("timestamp_created", allow_reuse=True)(
@@ -1,2 +1,3 @@
1
1
  from .models import Filters # noqa: F401
2
2
  from .models import SingleImage # noqa: F401
3
+ from .models import SingleImageTaskOutput # noqa: F401
@@ -9,7 +9,16 @@ from pydantic import validator
9
9
  from fractal_server.app.schemas._validators import valdictkeys
10
10
 
11
11
 
12
- class SingleImage(BaseModel):
12
+ class SingleImageBase(BaseModel):
13
+ """
14
+ Base for SingleImage and SingleImageTaskOutput.
15
+
16
+ Attributes:
17
+ zarr_url:
18
+ origin:
19
+ attributes:
20
+ types:
21
+ """
13
22
 
14
23
  zarr_url: str
15
24
  origin: Optional[str] = None
@@ -23,6 +32,31 @@ class SingleImage(BaseModel):
23
32
  )
24
33
  _types = validator("types", allow_reuse=True)(valdictkeys("types"))
25
34
 
35
+
36
+ class SingleImageTaskOutput(SingleImageBase):
37
+ """
38
+ `SingleImageBase`, with scalar `attributes` values (`None` included).
39
+ """
40
+
41
+ @validator("attributes")
42
+ def validate_attributes(
43
+ cls, v: dict[str, Any]
44
+ ) -> dict[str, Union[int, float, str, bool, None]]:
45
+ for key, value in v.items():
46
+ if not isinstance(value, (int, float, str, bool, type(None))):
47
+ raise ValueError(
48
+ f"SingleImageTaskOutput.attributes[{key}] must be a "
49
+ "scalar (int, float, str or bool). "
50
+ f"Given {value} ({type(value)})"
51
+ )
52
+ return v
53
+
54
+
55
+ class SingleImage(SingleImageBase):
56
+ """
57
+ `SingleImageBase`, with scalar `attributes` values (`None` excluded).
58
+ """
59
+
26
60
  @validator("attributes")
27
61
  def validate_attributes(
28
62
  cls, v: dict[str, Any]
@@ -1,8 +1,8 @@
1
- """v2
1
+ """V2
2
2
 
3
- Revision ID: d71e732236cd
3
+ Revision ID: 80e12e1bc4fd
4
4
  Revises: 9fd26a2b0de4
5
- Create Date: 2024-04-05 11:09:17.639183
5
+ Create Date: 2024-04-12 10:13:58.085788
6
6
 
7
7
  """
8
8
  import sqlalchemy as sa
@@ -11,7 +11,7 @@ from alembic import op
11
11
 
12
12
 
13
13
  # revision identifiers, used by Alembic.
14
- revision = "d71e732236cd"
14
+ revision = "80e12e1bc4fd"
15
15
  down_revision = "9fd26a2b0de4"
16
16
  branch_labels = None
17
17
  depends_on = None
@@ -23,7 +23,6 @@ def upgrade() -> None:
23
23
  "projectv2",
24
24
  sa.Column("id", sa.Integer(), nullable=False),
25
25
  sa.Column("name", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
26
- sa.Column("read_only", sa.Boolean(), nullable=False),
27
26
  sa.Column(
28
27
  "timestamp_created", sa.DateTime(timezone=True), nullable=False
29
28
  ),
@@ -81,7 +80,6 @@ def upgrade() -> None:
81
80
  sa.Column("name", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
82
81
  sa.Column("project_id", sa.Integer(), nullable=False),
83
82
  sa.Column("history", sa.JSON(), server_default="[]", nullable=False),
84
- sa.Column("read_only", sa.Boolean(), nullable=False),
85
83
  sa.Column(
86
84
  "timestamp_created", sa.DateTime(timezone=True), nullable=False
87
85
  ),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fractal-server
3
- Version: 2.0.0a4
3
+ Version: 2.0.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=uHs4bTZmEbcmtx5XxScG5VXDbybTf8PipF9cI0iR8qk,24
1
+ fractal_server/__init__.py,sha256=5qWDQ_nyhHlAAd6zm7X6HCZpyfGaVJKhBA0qSF2KZfA,24
2
2
  fractal_server/__main__.py,sha256=CocbzZooX1UtGqPi55GcHGNxnrJXFg5tUU5b3wyFCyo,4958
3
3
  fractal_server/alembic.ini,sha256=MWwi7GzjzawI9cCAK1LW7NxIBQDUqD12-ptJoq5JpP0,3153
4
4
  fractal_server/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -14,9 +14,9 @@ fractal_server/app/models/v1/project.py,sha256=sDmAFLOBK5o4dLrwsIN681JcT5J1rzoUN
14
14
  fractal_server/app/models/v1/task.py,sha256=3xZqNeFYUqslh8ddMSXF2nO4nIiOD8T5Ij37wY20kss,2782
15
15
  fractal_server/app/models/v1/workflow.py,sha256=dnY5eMaOe3oZv8arn00RNX9qVkBtTLG-vYdWXcQuyo4,3950
16
16
  fractal_server/app/models/v2/__init__.py,sha256=2T_ZXpP9n5IktoX3bkQUKUKzGAN5tJiR1LKWOtOCclM,400
17
- fractal_server/app/models/v2/dataset.py,sha256=rTDSNeB7jCNa9QwgRPK_vB5a8oM1EhO7KKuV63EIMjE,1483
17
+ fractal_server/app/models/v2/dataset.py,sha256=-7sxHEw4IIAvF_uSan7tA3o8hvoakBkQ0SRvqS2iOQU,1455
18
18
  fractal_server/app/models/v2/job.py,sha256=PCJf0_NYIc5boXL6e6P72BvYJGydCZOGKnW2DT4Sw9g,1535
19
- fractal_server/app/models/v2/project.py,sha256=VJvkQexFSS150KxDQxOWBAZYDlV3Ve4l3h2oabzE-tM,845
19
+ fractal_server/app/models/v2/project.py,sha256=CqDEKzdVxmFDMee6DnVOyX7WGmdn-dQSLSekzw_OLUc,817
20
20
  fractal_server/app/models/v2/task.py,sha256=9ZPhug3VWyeqgT8wQ9_8ZXQ2crSiiicRipxrxTslOso,3257
21
21
  fractal_server/app/models/v2/workflow.py,sha256=4pSTeZC78OQbgHHC5S0ge6pK1AP6ak7Qew_0ZNM9xuw,1256
22
22
  fractal_server/app/models/v2/workflowtask.py,sha256=f2a85MSAyBAdC7oG6SR8mViMNqlomQWaIB08n3ZhT-0,2727
@@ -31,18 +31,19 @@ fractal_server/app/routes/api/v1/dataset.py,sha256=7z57FGBTCyz_G6Ivr1PeGIXGyd15f
31
31
  fractal_server/app/routes/api/v1/job.py,sha256=NwXyhvvzdPDor0ts8Im__9-I0P1H943s4NXIRgaz7PM,5436
32
32
  fractal_server/app/routes/api/v1/project.py,sha256=keqA0gYM48lyFP8zJgZ6cv34V6Js8DD-gbzE316H46k,15765
33
33
  fractal_server/app/routes/api/v1/task.py,sha256=4zUXMtq5M95XjaZs1t9oibYHiDIwxpM-3sTAxN95aRk,6123
34
- fractal_server/app/routes/api/v1/task_collection.py,sha256=LtOakYF30XiKo4ei7i09WSZ7u4D9pPJhhQBxHaSLr9M,8457
34
+ fractal_server/app/routes/api/v1/task_collection.py,sha256=_cY3pPRGchdWPuJ1XudMZMVJ0IC0_XVH0XwLTiAbRGg,8873
35
35
  fractal_server/app/routes/api/v1/workflow.py,sha256=ZObifWTPi100oRQ1wEER8Sgsr3Neo8QVdCCFQnWMNZ0,10930
36
36
  fractal_server/app/routes/api/v1/workflowtask.py,sha256=ox-DIIqYV4K35hCu86eGa2SHnR5IQml-I00UHEwnmHQ,5579
37
- fractal_server/app/routes/api/v2/__init__.py,sha256=0E6_ju5g8wp3TVW5frzJB2lqXEWzcRkwDkC3-WkPJYI,1210
37
+ fractal_server/app/routes/api/v2/__init__.py,sha256=x56HcY1uBNCgq4BRVj-0j6bAj6OsTN97RNDqY8NefJ8,1373
38
38
  fractal_server/app/routes/api/v2/_aux_functions.py,sha256=TCHf3aM-KQxaNJen10CGX1Da5IIra00xRF39FUTU698,14301
39
39
  fractal_server/app/routes/api/v2/dataset.py,sha256=qQi9jfT9YLu6DrRCPh280J3MoFWs9yMiejkCNaauCyQ,9680
40
40
  fractal_server/app/routes/api/v2/images.py,sha256=b1NM9Y0ocuRYRec-3UcVAizB0vFkmzPEHfObaoCnIMY,5956
41
41
  fractal_server/app/routes/api/v2/job.py,sha256=9mXaKCX_N3FXM0GIxdE49nWl_hJZ8CBLBIaMMhaCKOM,5334
42
42
  fractal_server/app/routes/api/v2/project.py,sha256=i9a19HAqE36N92G60ZYgObIP9nv-hR7Jt5nd9Dkhz1g,6024
43
- fractal_server/app/routes/api/v2/submit.py,sha256=egu5jE93sU7sRu3x_4Rp9t3uUJFATK4dwj4Pl3iJPN0,7171
43
+ fractal_server/app/routes/api/v2/submit.py,sha256=iszII5CvWDEjGPTphBgH9FVS1pNb5m11Xc8xozGgjgI,6901
44
44
  fractal_server/app/routes/api/v2/task.py,sha256=gJ0LruSk-Q1iMw8ZOX8C0wrZ4S4DGlQTr_5SdJJud0Q,7130
45
- fractal_server/app/routes/api/v2/task_collection.py,sha256=kxSOOSsTFq2w1SeDwMeX6mSDPYbH5Uds18xpdLU5kTo,8466
45
+ fractal_server/app/routes/api/v2/task_collection.py,sha256=iw74UF8qdQa9pJf0DvSjihng6ri2k2HtW2UhMS_a8Zc,8904
46
+ fractal_server/app/routes/api/v2/task_legacy.py,sha256=P_VJv9v0yzFUBuS-DQHhMVSOe20ecGJJcFBqiiFciOM,1628
46
47
  fractal_server/app/routes/api/v2/workflow.py,sha256=sw-1phO_rrmDAcWX9Zqb9M8SfrWF78-02AuLB1-D1PU,11845
47
48
  fractal_server/app/routes/api/v2/workflowtask.py,sha256=L4hYpb-ihKNfPxM5AnZqPhCdiojI9Eq5TR0wf-0vP_s,8414
48
49
  fractal_server/app/routes/auth.py,sha256=Xv80iqdyfY3lyicYs2Y8B6zEDEnyUu_H6_6psYtv3R4,4885
@@ -67,7 +68,7 @@ fractal_server/app/runner/filenames.py,sha256=9lwu3yB4C67yiijYw8XIKaLFn3mJUt6_TC
67
68
  fractal_server/app/runner/set_start_and_last_task_index.py,sha256=-q4zVybAj8ek2XlbENKlfOAJ39hT_zoJoZkqzDqiAMY,1254
68
69
  fractal_server/app/runner/task_files.py,sha256=c5mggMy7BIK_yBUvbimFgvKFZPKKDu6RRfWepwinBVk,3219
69
70
  fractal_server/app/runner/v1/__init__.py,sha256=meqMG2UejFa_1hm5xlsmkDxsM7Y_hqftsexuteQXOrE,13608
70
- fractal_server/app/runner/v1/_common.py,sha256=hlSh-lUWbDCWP2k4isswoU9hh7huoT2Zy7cEwjXwnzk,21238
71
+ fractal_server/app/runner/v1/_common.py,sha256=fIt8BVW7u6ReZbHgQ5kV2kDtWoHMQNjPoeuWP5YfWQk,21240
71
72
  fractal_server/app/runner/v1/_local/__init__.py,sha256=8PjeyPLvj6KHdZ3HyzWZCdlrubgedA1hZLXGAsLNOKI,6926
72
73
  fractal_server/app/runner/v1/_local/_local_config.py,sha256=hM7SPxR07luXPcXdrWXRpEB2uOyjSSRUdqW3QBKJn9c,3147
73
74
  fractal_server/app/runner/v1/_local/_submit_setup.py,sha256=kvNPT7ey2mEamORzPMMVThbFHtzZcSr-0A9tYw9uVDA,1493
@@ -85,13 +86,13 @@ fractal_server/app/runner/v2/_local/executor.py,sha256=QrJlD77G6q4WohoJQO7XXbvi2
85
86
  fractal_server/app/runner/v2/_slurm/__init__.py,sha256=srxn5-KdQxqD8cWJmOJlSoctbXYlyCMM249xWGY9bhI,4409
86
87
  fractal_server/app/runner/v2/_slurm/_submit_setup.py,sha256=tsZHQdVy3VxENMdsBzHltrVWzugBppq0cFrHtaVzoUA,2793
87
88
  fractal_server/app/runner/v2/_slurm/get_slurm_config.py,sha256=sqP-hs58TPt849rx10VRFKWX_DgLDPQcKZJcE0zKBXs,6621
88
- fractal_server/app/runner/v2/deduplicate_list.py,sha256=UShgbFy8d8elUE5sa1_jLDqQWip4Bi21VDhcFFM0fpU,571
89
+ fractal_server/app/runner/v2/deduplicate_list.py,sha256=-imwO7OB7ATADEnqVbTElUwoY0YIJCTf_SbWJNN9OZg,639
89
90
  fractal_server/app/runner/v2/handle_failed_job.py,sha256=fipRJT5Y8UY0US4bXUX-4ORTAQ1AetZcCAOVCjDO3_c,5202
90
91
  fractal_server/app/runner/v2/merge_outputs.py,sha256=IHuHqbKmk97K35BFvTrKVBs60z3e_--OzXTnsvmA02c,1281
91
- fractal_server/app/runner/v2/runner.py,sha256=hLLGE6wD8nVSFWui0LlNTqn63WYYCPFeRvIAn4sBLlU,11119
92
+ fractal_server/app/runner/v2/runner.py,sha256=rBRehRDduGU0TUOkgQN6WbIGhDWZ6GOat4bv7IVB8cA,11784
92
93
  fractal_server/app/runner/v2/runner_functions.py,sha256=LfO1-FJF70_Qh78NQTCHJWyzyr011wvvtnzB6nTj5ZM,10087
93
94
  fractal_server/app/runner/v2/runner_functions_low_level.py,sha256=Pp3hsj1i1t4ExDMcUBkQ27yEi7kjlvymY6q6eDiC8DM,3845
94
- fractal_server/app/runner/v2/task_interface.py,sha256=3M0xDaARCVCD3yX2-N6YaFsYwZwsPpCKqAFMp0YqRDA,1376
95
+ fractal_server/app/runner/v2/task_interface.py,sha256=NJZUMHtEs5C3bFdXX42Kv1GMzQ7xPW2v5ZRxGNANOec,1410
95
96
  fractal_server/app/runner/v2/v1_compat.py,sha256=6UijuRYbB2ry2mM073u1fW4CSTeelB11lmoj_TOGtm4,511
96
97
  fractal_server/app/schemas/__init__.py,sha256=VL55f3CTFngXHYkOsFaLBEEkEEewEWI5ODlcGTI7cqA,157
97
98
  fractal_server/app/schemas/_validators.py,sha256=Pdff5plJJmoUTf_nZpMA24tZlFJb84EdRSnLwRZDxfE,3264
@@ -103,24 +104,24 @@ fractal_server/app/schemas/v1/dataset.py,sha256=n71lNUO3JLy2K3IM9BZM2Fk1EnKQOTU7
103
104
  fractal_server/app/schemas/v1/dumps.py,sha256=67VXnyLh_0Ufo7rPM2jZ9P9rk0CnYcVAkilx_cLX6sg,1274
104
105
  fractal_server/app/schemas/v1/manifest.py,sha256=Yht7guhs0Pcl2U0RMOCbI_UHBZ9YO_YU0H8hxACx3TY,3829
105
106
  fractal_server/app/schemas/v1/project.py,sha256=TO2TjI4m9FO-A9IB9lUCld7E4Ld0k4MacLcyA9j6Qi4,1218
106
- fractal_server/app/schemas/v1/task.py,sha256=8L9CBW5kPO4l9EVYldgm1tWDokONyTGcLq53RmVmabM,3731
107
+ fractal_server/app/schemas/v1/task.py,sha256=7BxOZ_qoRQ8n3YbQpDvB7VMcxB5fSYQmR5RLIWhuJ5U,3704
107
108
  fractal_server/app/schemas/v1/task_collection.py,sha256=uvq9bcMaGD_qHsh7YtcpoSAkVAbw12eY4DocIO3MKOg,3057
108
109
  fractal_server/app/schemas/v1/workflow.py,sha256=tuOs5E5Q_ozA8if7YPZ07cQjzqB_QMkBS4u92qo4Ro0,4618
109
- fractal_server/app/schemas/v2/__init__.py,sha256=U3WXzQ1o26dSq3jR8n0rA-Zsq6uIpoN3oCKPOABytvA,1704
110
- fractal_server/app/schemas/v2/dataset.py,sha256=ThUwme1uVhamZhlvlN0873bTDTbhTaoFanQBlgp0F5k,1839
111
- fractal_server/app/schemas/v2/dumps.py,sha256=CPJ5hS5z6S0sPJ5frAMe7yFvF5Yv76c07jiddqQpRyU,2037
110
+ fractal_server/app/schemas/v2/__init__.py,sha256=zlCYrplCWwnCL9-BYsExRMfVzhBy21IMBfdHPMgJZYk,1752
111
+ fractal_server/app/schemas/v2/dataset.py,sha256=VSAB8np2TdZf_a2NJKkpBVJFDSs0IYpLan5RDzu6g3E,1757
112
+ fractal_server/app/schemas/v2/dumps.py,sha256=Xen0OPf1Ax9i_7ItrAPvCk1OCNcUsnhlLRiyny89aLM,1997
112
113
  fractal_server/app/schemas/v2/job.py,sha256=zfF9K3v4jWUJ7M482ta2CkqUJ4tVT4XfVt60p9IRhP0,3250
113
114
  fractal_server/app/schemas/v2/manifest.py,sha256=N37IWohcfO3_y2l8rVM0h_1nZq7m4Izxk9iL1vtwBJw,6243
114
- fractal_server/app/schemas/v2/project.py,sha256=Okm9n4KqUUs8oxFo6yIV3Y_4mJznLeKCI2ccjY0X8Vo,814
115
- fractal_server/app/schemas/v2/task.py,sha256=xQfQxL2h-Vw0YL3yEiYvVIXTybE1lyRE0pPUu59nZes,4574
115
+ fractal_server/app/schemas/v2/project.py,sha256=u7S4B-bote1oGjzAGiZ-DuQIyeRAGqJsI71Tc1EtYE0,736
116
+ fractal_server/app/schemas/v2/task.py,sha256=7IfxiZkaVqlARy7WYE_H8m7j_IEcuQaZORUrs6b5YuY,4672
116
117
  fractal_server/app/schemas/v2/task_collection.py,sha256=sY29NQfJrbjiidmVkVjSIH-20wIsmh7G1QOdr05KoDQ,3171
117
- fractal_server/app/schemas/v2/workflow.py,sha256=KnzsuTQZ8S1wwoRDY3poWTnO3GbogFTLqCoBJNYzIFU,1831
118
+ fractal_server/app/schemas/v2/workflow.py,sha256=Zzx3e-qgkH8le0FUmAx9UrV5PWd7bj14PPXUh_zgZXM,1827
118
119
  fractal_server/app/schemas/v2/workflowtask.py,sha256=vRyPca8smu6fzwd9gO1eOd3qdPLJ-Zq2AAAbSLCou3I,5051
119
120
  fractal_server/app/security/__init__.py,sha256=wxosoHc3mJYPCdPMyWnRD8w_2OgnKYp2aDkdmwrZh5k,11203
120
121
  fractal_server/config.py,sha256=CA8ASObADaME5chDiBXawAJZ3MvjTRpCKP0jvdYtSh8,15080
121
122
  fractal_server/data_migrations/README.md,sha256=_3AEFvDg9YkybDqCLlFPdDmGJvr6Tw7HRI14aZ3LOIw,398
122
- fractal_server/images/__init__.py,sha256=JnTf7TflCdTbhcMHi12s3CJhEtuAXNulwauUU1wDpp0,88
123
- fractal_server/images/models.py,sha256=6V4saVpxLKC6bMVwkxMbtxyOFWOFJBylbyE-kHCv7KM,1969
123
+ fractal_server/images/__init__.py,sha256=KWLVMlWqTY85qq1VUpzaJi5Sl2VOYWEn0vIEiD-QZ5k,144
124
+ fractal_server/images/models.py,sha256=hgDQf1-SsMJw504GFUufVETedPPEweCQxUhA2uDfdao,2904
124
125
  fractal_server/images/tools.py,sha256=Q7jM60r_jq5bttrt1b4bU29n717RSUMMPbAbAkzWjgw,2234
125
126
  fractal_server/logger.py,sha256=95duXY8eSxf1HWg0CVn8SUGNzgJw9ZR0FlapDDF6WAY,3924
126
127
  fractal_server/main.py,sha256=7CpwPfCsHxBAo5fWuXPCsYOFCpbBI0F7Z0jsgCQdou8,3001
@@ -132,6 +133,7 @@ fractal_server/migrations/versions/4cedeb448a53_workflowtask_foreign_keys_not_nu
132
133
  fractal_server/migrations/versions/50a13d6138fd_initial_schema.py,sha256=zwXegXs9J40eyCWi3w0c_iIBVJjXNn4VdVnQaT3KxDg,8770
133
134
  fractal_server/migrations/versions/70e77f1c38b0_add_applyworkflow_first_task_index_and_.py,sha256=Q-DsMzG3IcUV2Ol1dhJWosDvKERamBE6QvA2zzS5zpQ,1632
134
135
  fractal_server/migrations/versions/71eefd1dd202_add_slurm_accounts.py,sha256=mbWuCkTpRAdGbRhW7lhXs_e5S6O37UAcCN6JfoY5H8A,1353
136
+ fractal_server/migrations/versions/80e12e1bc4fd_v2.py,sha256=WsgwzUVN2WNkaDaLawpYGwvGfoYmD0Vl3EZFdrIqXhg,8116
135
137
  fractal_server/migrations/versions/84bf0fffde30_add_dumps_to_applyworkflow.py,sha256=NSCuhANChsg76vBkShBl-9tQ4VEHubOjtAv1etHhlvY,2684
136
138
  fractal_server/migrations/versions/8f79bd162e35_add_docs_info_and_docs_link_to_task_.py,sha256=6pgODDtyAxevZvAJBj9IJ41inhV1RpwbpZr_qfPPu1A,1115
137
139
  fractal_server/migrations/versions/97f444d47249_add_applyworkflow_project_dump.py,sha256=eKTZm3EgUgapXBxO0RuHkEfTKic-TZG3ADaMpGLuc0k,1057
@@ -139,7 +141,6 @@ fractal_server/migrations/versions/99ea79d9e5d2_add_dataset_history.py,sha256=0i
139
141
  fractal_server/migrations/versions/9fd26a2b0de4_add_workflow_timestamp_created.py,sha256=4l1AHGUsa0ONoJVZlr3fTXw_xbbQ8O7wlD92Az2aRfM,1849
140
142
  fractal_server/migrations/versions/a7f4d6137b53_add_workflow_dump_to_applyworkflow.py,sha256=ekDUML7ILpmdoqEclKbEUdyLi4uw9HSG_sTjG2hp_JE,867
141
143
  fractal_server/migrations/versions/d4fe3708d309_make_applyworkflow_workflow_dump_non_.py,sha256=6cHEZFuTXiQg9yu32Y3RH1XAl71av141WQ6UMbiITIg,949
142
- fractal_server/migrations/versions/d71e732236cd_v2.py,sha256=ayEPVYvQwq7fZF9I_8oik8Hp-6Ay_0lFRk1xCoyS6-8,8240
143
144
  fractal_server/migrations/versions/e75cac726012_make_applyworkflow_start_timestamp_not_.py,sha256=lOggSvzGWqQvnxxFuSM6W50Ui49R918A-uBuiZJ0pNM,963
144
145
  fractal_server/migrations/versions/efa89c30e0a4_add_project_timestamp_created.py,sha256=jilQW3QIqYQ4Q6hCnUiG7UtNMpA41ujqrB3tPFiPM1Q,1221
145
146
  fractal_server/migrations/versions/f384e1c0cf5d_drop_task_default_args_columns.py,sha256=9BwqUS9Gf7UW_KjrzHbtViC880qhD452KAytkHWWZyk,746
@@ -157,8 +158,8 @@ fractal_server/tasks/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG
157
158
  fractal_server/tasks/v2/background_operations.py,sha256=zr6j3uoWmCeW2EA9auxWNZ0sG3SHgSxUVTC1OpQXE3Y,12803
158
159
  fractal_server/tasks/v2/get_collection_data.py,sha256=Qhf2T_aaqAfqu9_KpUSlXsS7EJoZQbEPEreHHa2jco8,502
159
160
  fractal_server/utils.py,sha256=b7WwFdcFZ8unyT65mloFToYuEDXpQoHRcmRNqrhd_dQ,2115
160
- fractal_server-2.0.0a4.dist-info/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
161
- fractal_server-2.0.0a4.dist-info/METADATA,sha256=IVuqu0v4f5PnP2gq8m5Bk1deyKcHqQqIdCdhM8BRkc0,4204
162
- fractal_server-2.0.0a4.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
163
- fractal_server-2.0.0a4.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
164
- fractal_server-2.0.0a4.dist-info/RECORD,,
161
+ fractal_server-2.0.0a6.dist-info/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
162
+ fractal_server-2.0.0a6.dist-info/METADATA,sha256=VzuxOIkkB0Uv-MzjnyEf9Xu3xhQzJQUNCYROj_tVrwM,4204
163
+ fractal_server-2.0.0a6.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
164
+ fractal_server-2.0.0a6.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
165
+ fractal_server-2.0.0a6.dist-info/RECORD,,