fractal-server 2.15.3__py3-none-any.whl → 2.15.4__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 (55) hide show
  1. fractal_server/__init__.py +1 -1
  2. fractal_server/app/models/v2/project.py +0 -1
  3. fractal_server/app/models/v2/task_group.py +0 -1
  4. fractal_server/app/models/v2/workflow.py +0 -1
  5. fractal_server/app/routes/admin/v2/accounting.py +0 -1
  6. fractal_server/app/routes/admin/v2/job.py +0 -1
  7. fractal_server/app/routes/admin/v2/task.py +0 -4
  8. fractal_server/app/routes/admin/v2/task_group.py +0 -3
  9. fractal_server/app/routes/api/v2/_aux_functions.py +0 -1
  10. fractal_server/app/routes/api/v2/_aux_functions_tasks.py +0 -1
  11. fractal_server/app/routes/api/v2/history.py +0 -2
  12. fractal_server/app/routes/api/v2/images.py +0 -5
  13. fractal_server/app/routes/api/v2/pre_submission_checks.py +0 -1
  14. fractal_server/app/routes/api/v2/submit.py +0 -1
  15. fractal_server/app/routes/api/v2/task_collection_custom.py +0 -2
  16. fractal_server/app/routes/api/v2/task_collection_pixi.py +0 -1
  17. fractal_server/app/routes/api/v2/task_group.py +0 -2
  18. fractal_server/app/routes/api/v2/task_group_lifecycle.py +0 -2
  19. fractal_server/app/routes/api/v2/task_version_update.py +0 -2
  20. fractal_server/app/routes/api/v2/workflow.py +0 -2
  21. fractal_server/app/routes/auth/group.py +0 -5
  22. fractal_server/app/routes/pagination.py +0 -2
  23. fractal_server/app/runner/executors/local/runner.py +0 -3
  24. fractal_server/app/runner/v2/db_tools.py +0 -1
  25. fractal_server/app/runner/v2/merge_outputs.py +0 -2
  26. fractal_server/app/runner/v2/runner.py +0 -1
  27. fractal_server/app/runner/v2/task_interface.py +1 -4
  28. fractal_server/app/schemas/v2/accounting.py +0 -1
  29. fractal_server/app/schemas/v2/project.py +0 -3
  30. fractal_server/app/schemas/v2/workflow.py +0 -3
  31. fractal_server/config.py +2 -2
  32. fractal_server/data_migrations/2_14_10.py +0 -1
  33. fractal_server/main.py +0 -1
  34. fractal_server/migrations/versions/1eac13a26c83_drop_v1_tables.py +0 -1
  35. fractal_server/migrations/versions/501961cfcd85_remove_link_between_v1_and_v2_tasks_.py +0 -1
  36. fractal_server/tasks/v2/local/_utils.py +32 -0
  37. fractal_server/tasks/v2/local/collect.py +0 -1
  38. fractal_server/tasks/v2/local/collect_pixi.py +7 -6
  39. fractal_server/tasks/v2/local/deactivate.py +0 -2
  40. fractal_server/tasks/v2/local/deactivate_pixi.py +0 -1
  41. fractal_server/tasks/v2/local/reactivate_pixi.py +5 -0
  42. fractal_server/tasks/v2/ssh/_utils.py +38 -0
  43. fractal_server/tasks/v2/ssh/collect.py +0 -1
  44. fractal_server/tasks/v2/ssh/collect_pixi.py +11 -4
  45. fractal_server/tasks/v2/ssh/deactivate.py +0 -1
  46. fractal_server/tasks/v2/ssh/reactivate_pixi.py +10 -0
  47. fractal_server/tasks/v2/utils_pixi.py +67 -0
  48. fractal_server/tasks/v2/utils_python_interpreter.py +1 -1
  49. fractal_server/types/validators/_filter_validators.py +1 -1
  50. fractal_server/zip_tools.py +0 -1
  51. {fractal_server-2.15.3.dist-info → fractal_server-2.15.4.dist-info}/METADATA +2 -1
  52. {fractal_server-2.15.3.dist-info → fractal_server-2.15.4.dist-info}/RECORD +55 -55
  53. {fractal_server-2.15.3.dist-info → fractal_server-2.15.4.dist-info}/LICENSE +0 -0
  54. {fractal_server-2.15.3.dist-info → fractal_server-2.15.4.dist-info}/WHEEL +0 -0
  55. {fractal_server-2.15.3.dist-info → fractal_server-2.15.4.dist-info}/entry_points.txt +0 -0
@@ -1 +1 @@
1
- __VERSION__ = "2.15.3"
1
+ __VERSION__ = "2.15.4"
@@ -12,7 +12,6 @@ from fractal_server.utils import get_timestamp
12
12
 
13
13
 
14
14
  class ProjectV2(SQLModel, table=True):
15
-
16
15
  id: int | None = Field(default=None, primary_key=True)
17
16
  name: str
18
17
  timestamp_created: datetime = Field(
@@ -107,7 +107,6 @@ class TaskGroupV2(SQLModel, table=True):
107
107
 
108
108
 
109
109
  class TaskGroupActivityV2(SQLModel, table=True):
110
-
111
110
  id: int | None = Field(default=None, primary_key=True)
112
111
  user_id: int = Field(foreign_key="user_oauth.id")
113
112
  taskgroupv2_id: int | None = Field(
@@ -12,7 +12,6 @@ from .workflowtask import WorkflowTaskV2
12
12
 
13
13
 
14
14
  class WorkflowV2(SQLModel, table=True):
15
-
16
15
  id: int | None = Field(default=None, primary_key=True)
17
16
  name: str
18
17
  project_id: int = Field(foreign_key="projectv2.id", ondelete="CASCADE")
@@ -82,7 +82,6 @@ async def query_accounting_slurm(
82
82
  superuser: UserOAuth = Depends(current_active_superuser),
83
83
  db: AsyncSession = Depends(get_async_db),
84
84
  ) -> JSONResponse:
85
-
86
85
  stm = select(AccountingRecordSlurm.slurm_job_ids)
87
86
  if query.user_id is not None:
88
87
  stm = stm.where(AccountingRecordSlurm.user_id == query.user_id)
@@ -111,7 +111,6 @@ async def view_single_job(
111
111
  user: UserOAuth = Depends(current_active_superuser),
112
112
  db: AsyncSession = Depends(get_async_db),
113
113
  ) -> JobReadV2:
114
-
115
114
  job = await db.get(JobV2, job_id)
116
115
  if not job:
117
116
  raise HTTPException(
@@ -20,7 +20,6 @@ router = APIRouter()
20
20
 
21
21
 
22
22
  class TaskV2Minimal(BaseModel):
23
-
24
23
  id: int
25
24
  name: str
26
25
  type: str
@@ -32,13 +31,11 @@ class TaskV2Minimal(BaseModel):
32
31
 
33
32
 
34
33
  class ProjectUser(BaseModel):
35
-
36
34
  id: int
37
35
  email: EmailStr
38
36
 
39
37
 
40
38
  class TaskV2Relationship(BaseModel):
41
-
42
39
  workflow_id: int
43
40
  workflow_name: str
44
41
  project_id: int
@@ -47,7 +44,6 @@ class TaskV2Relationship(BaseModel):
47
44
 
48
45
 
49
46
  class TaskV2Info(BaseModel):
50
-
51
47
  task: TaskV2Minimal
52
48
  relationships: list[TaskV2Relationship]
53
49
 
@@ -43,7 +43,6 @@ async def get_task_group_activity_list(
43
43
  superuser: UserOAuth = Depends(current_active_superuser),
44
44
  db: AsyncSession = Depends(get_async_db),
45
45
  ) -> list[TaskGroupActivityV2Read]:
46
-
47
46
  stm = select(TaskGroupActivityV2)
48
47
  if task_group_activity_id is not None:
49
48
  stm = stm.where(TaskGroupActivityV2.id == task_group_activity_id)
@@ -73,7 +72,6 @@ async def query_task_group(
73
72
  user: UserOAuth = Depends(current_active_superuser),
74
73
  db: AsyncSession = Depends(get_async_db),
75
74
  ) -> TaskGroupReadV2:
76
-
77
75
  task_group = await db.get(TaskGroupV2, task_group_id)
78
76
  if task_group is None:
79
77
  raise HTTPException(
@@ -96,7 +94,6 @@ async def query_task_group_list(
96
94
  user: UserOAuth = Depends(current_active_superuser),
97
95
  db: AsyncSession = Depends(get_async_db),
98
96
  ) -> list[TaskGroupReadV2]:
99
-
100
97
  stm = select(TaskGroupV2)
101
98
 
102
99
  if user_group_id is not None and private is True:
@@ -333,7 +333,6 @@ async def _workflow_has_submitted_job(
333
333
  workflow_id: int,
334
334
  db: AsyncSession,
335
335
  ) -> bool:
336
-
337
336
  res = await db.execute(
338
337
  select(JobV2.id)
339
338
  .where(JobV2.status == JobStatusTypeV2.SUBMITTED)
@@ -224,7 +224,6 @@ async def _get_collection_task_group_activity_status_message(
224
224
  task_group_id: int,
225
225
  db: AsyncSession,
226
226
  ) -> str:
227
-
228
227
  res = await db.execute(
229
228
  select(TaskGroupActivityV2)
230
229
  .where(TaskGroupActivityV2.taskgroupv2_id == task_group_id)
@@ -71,7 +71,6 @@ async def get_workflow_tasks_statuses(
71
71
  user: UserOAuth = Depends(current_active_user),
72
72
  db: AsyncSession = Depends(get_async_db),
73
73
  ) -> JSONResponse:
74
-
75
74
  # Access control
76
75
  workflow = await _get_workflow_check_owner(
77
76
  project_id=project_id,
@@ -335,7 +334,6 @@ async def get_history_images(
335
334
  db: AsyncSession = Depends(get_async_db),
336
335
  pagination: PaginationRequest = Depends(get_pagination_params),
337
336
  ) -> ImagePage:
338
-
339
337
  # Access control and object retrieval
340
338
  wftask = await get_wftask_check_owner(
341
339
  project_id=project_id,
@@ -31,7 +31,6 @@ router = APIRouter()
31
31
 
32
32
 
33
33
  class ImagePage(PaginationResponse[SingleImage]):
34
-
35
34
  attributes: dict[str, list[ImageAttributeValue]]
36
35
  types: list[str]
37
36
 
@@ -64,7 +63,6 @@ async def post_new_image(
64
63
  user: UserOAuth = Depends(current_active_user),
65
64
  db: AsyncSession = Depends(get_async_db),
66
65
  ) -> Response:
67
-
68
66
  output = await _get_dataset_check_owner(
69
67
  project_id=project_id, dataset_id=dataset_id, user_id=user.id, db=db
70
68
  )
@@ -117,7 +115,6 @@ async def query_dataset_images(
117
115
  user: UserOAuth = Depends(current_active_user),
118
116
  db: AsyncSession = Depends(get_async_db),
119
117
  ) -> ImagePage:
120
-
121
118
  page = pagination.page
122
119
  page_size = pagination.page_size
123
120
 
@@ -131,7 +128,6 @@ async def query_dataset_images(
131
128
  types = aggregate_types(images)
132
129
 
133
130
  if query is not None:
134
-
135
131
  if query.zarr_url is not None:
136
132
  image = next(
137
133
  (
@@ -190,7 +186,6 @@ async def delete_dataset_images(
190
186
  user: UserOAuth = Depends(current_active_user),
191
187
  db: AsyncSession = Depends(get_async_db),
192
188
  ) -> Response:
193
-
194
189
  output = await _get_dataset_check_owner(
195
190
  project_id=project_id, dataset_id=dataset_id, user_id=user.id, db=db
196
191
  )
@@ -96,7 +96,6 @@ async def check_non_processed_images(
96
96
  user: UserOAuth = Depends(current_active_user),
97
97
  db: AsyncSession = Depends(get_async_db),
98
98
  ) -> JSONResponse:
99
-
100
99
  db_workflow_task, db_workflow = await _get_workflow_task_check_owner(
101
100
  project_id=project_id,
102
101
  workflow_task_id=workflowtask_id,
@@ -57,7 +57,6 @@ async def apply_workflow(
57
57
  user: UserOAuth = Depends(current_active_verified_user),
58
58
  db: AsyncSession = Depends(get_async_db),
59
59
  ) -> JobReadV2 | None:
60
-
61
60
  # Remove non-submitted V2 jobs from the app state when the list grows
62
61
  # beyond a threshold
63
62
  settings = Inject(get_settings)
@@ -47,7 +47,6 @@ async def collect_task_custom(
47
47
  user: UserOAuth = Depends(current_active_verified_user),
48
48
  db: AsyncSession = Depends(get_async_db),
49
49
  ) -> list[TaskReadV2]:
50
-
51
50
  settings = Inject(get_settings)
52
51
 
53
52
  # Validate query parameters related to user-group ownership
@@ -97,7 +96,6 @@ async def collect_task_custom(
97
96
  )
98
97
 
99
98
  if task_collect.package_root is None:
100
-
101
99
  package_name_underscore = task_collect.package_name.replace("-", "_")
102
100
  # Note that python_command is then used as part of a subprocess.run
103
101
  # statement: be careful with mixing `'` and `"`.
@@ -89,7 +89,6 @@ async def collect_task_pixi(
89
89
  user: UserOAuth = Depends(current_active_verified_user),
90
90
  db: AsyncSession = Depends(get_async_db),
91
91
  ) -> TaskGroupActivityV2Read:
92
-
93
92
  settings = Inject(get_settings)
94
93
  # Check if Pixi is available
95
94
  if settings.pixi is None:
@@ -72,7 +72,6 @@ async def get_task_group_activity_list(
72
72
  user: UserOAuth = Depends(current_active_user),
73
73
  db: AsyncSession = Depends(get_async_db),
74
74
  ) -> list[TaskGroupActivityV2Read]:
75
-
76
75
  stm = select(TaskGroupActivityV2).where(
77
76
  TaskGroupActivityV2.user_id == user.id
78
77
  )
@@ -105,7 +104,6 @@ async def get_task_group_activity(
105
104
  user: UserOAuth = Depends(current_active_user),
106
105
  db: AsyncSession = Depends(get_async_db),
107
106
  ) -> TaskGroupActivityV2Read:
108
-
109
107
  activity = await db.get(TaskGroupActivityV2, task_group_activity_id)
110
108
 
111
109
  if activity is None:
@@ -115,7 +115,6 @@ async def deactivate_task_group(
115
115
  # Submit background task
116
116
  settings = Inject(get_settings)
117
117
  if settings.FRACTAL_RUNNER_BACKEND == "slurm_ssh":
118
-
119
118
  # Validate user settings (backend-specific)
120
119
  user_settings = await validate_user_settings(
121
120
  user=user, backend=settings.FRACTAL_RUNNER_BACKEND, db=db
@@ -242,7 +241,6 @@ async def reactivate_task_group(
242
241
  # Submit background task
243
242
  settings = Inject(get_settings)
244
243
  if settings.FRACTAL_RUNNER_BACKEND == "slurm_ssh":
245
-
246
244
  # Validate user settings (backend-specific)
247
245
  user_settings = await validate_user_settings(
248
246
  user=user, backend=settings.FRACTAL_RUNNER_BACKEND, db=db
@@ -78,7 +78,6 @@ async def get_workflow_version_update_candidates(
78
78
  user: UserOAuth = Depends(current_active_user),
79
79
  db: AsyncSession = Depends(get_async_db),
80
80
  ) -> list[list[TaskVersionRead]]:
81
-
82
81
  workflow = await _get_workflow_check_owner(
83
82
  project_id=project_id,
84
83
  workflow_id=workflow_id,
@@ -181,7 +180,6 @@ async def replace_workflowtask(
181
180
  user: UserOAuth = Depends(current_active_user),
182
181
  db: AsyncSession = Depends(get_async_db),
183
182
  ) -> WorkflowTaskReadV2:
184
-
185
183
  # Get objects from database
186
184
  workflow_task, workflow = await _get_workflow_task_check_owner(
187
185
  project_id=project_id,
@@ -147,7 +147,6 @@ async def update_workflow(
147
147
 
148
148
  for key, value in patch.model_dump(exclude_unset=True).items():
149
149
  if key == "reordered_workflowtask_ids":
150
-
151
150
  if await _workflow_has_submitted_job(
152
151
  workflow_id=workflow_id, db=db
153
152
  ):
@@ -329,7 +328,6 @@ async def get_workflow_type_filters(
329
328
 
330
329
  response_items = []
331
330
  for wftask in workflow.task_list:
332
-
333
331
  # Compute input_type_filters, based on wftask and task manifest
334
332
  input_type_filters = merge_type_filters(
335
333
  wftask_type_filters=wftask.type_filters,
@@ -39,7 +39,6 @@ async def get_list_user_groups(
39
39
  user: UserOAuth = Depends(current_active_superuser),
40
40
  db: AsyncSession = Depends(get_async_db),
41
41
  ) -> list[UserGroupRead]:
42
-
43
42
  # Get all groups
44
43
  stm_all_groups = select(UserGroup)
45
44
  res = await db.execute(stm_all_groups)
@@ -88,7 +87,6 @@ async def create_single_group(
88
87
  user: UserOAuth = Depends(current_active_superuser),
89
88
  db: AsyncSession = Depends(get_async_db),
90
89
  ) -> UserGroupRead:
91
-
92
90
  # Check that name is not already in use
93
91
  existing_name_str = select(UserGroup).where(
94
92
  UserGroup.name == group_create.name
@@ -121,7 +119,6 @@ async def update_single_group(
121
119
  user: UserOAuth = Depends(current_active_superuser),
122
120
  db: AsyncSession = Depends(get_async_db),
123
121
  ) -> UserGroupRead:
124
-
125
122
  group = await _usergroup_or_404(group_id, db)
126
123
 
127
124
  # Patch `viewer_paths`
@@ -143,7 +140,6 @@ async def delete_single_group(
143
140
  user: UserOAuth = Depends(current_active_superuser),
144
141
  db: AsyncSession = Depends(get_async_db),
145
142
  ) -> Response:
146
-
147
143
  group = await _usergroup_or_404(group_id, db)
148
144
 
149
145
  if group.name == FRACTAL_DEFAULT_GROUP_NAME:
@@ -219,7 +215,6 @@ async def remove_user_from_group(
219
215
  superuser: UserOAuth = Depends(current_active_superuser),
220
216
  db: AsyncSession = Depends(get_async_db),
221
217
  ) -> UserGroupRead:
222
-
223
218
  # Check that user and group exist
224
219
  await _usergroup_or_404(group_id, db)
225
220
  user = await _user_or_404(user_id, db)
@@ -11,7 +11,6 @@ T = TypeVar("T")
11
11
 
12
12
 
13
13
  class PaginationRequest(BaseModel):
14
-
15
14
  page: int = Field(ge=1)
16
15
  page_size: int | None = Field(ge=1)
17
16
 
@@ -38,7 +37,6 @@ def get_pagination_params(
38
37
 
39
38
 
40
39
  class PaginationResponse(BaseModel, Generic[T]):
41
-
42
40
  current_page: int = Field(ge=1)
43
41
  page_size: int = Field(ge=0)
44
42
  total_count: int = Field(ge=0)
@@ -28,7 +28,6 @@ def run_single_task(
28
28
  parameters: dict[str, Any],
29
29
  task_files: TaskFiles,
30
30
  ):
31
-
32
31
  # Write args.json file
33
32
  with open(task_files.args_file_local, "w") as f:
34
33
  json.dump(parameters, f)
@@ -169,7 +168,6 @@ class LocalRunner(BaseRunner):
169
168
  exceptions: dict[int, BaseException] = {}
170
169
 
171
170
  try:
172
-
173
171
  self.validate_multisubmit_parameters(
174
172
  list_parameters=list_parameters,
175
173
  task_type=task_type,
@@ -208,7 +206,6 @@ class LocalRunner(BaseRunner):
208
206
 
209
207
  # Execute tasks, in chunks of size `parallel_tasks_per_job`
210
208
  for ind_chunk in range(0, n_elements, parallel_tasks_per_job):
211
-
212
209
  list_parameters_chunk = list_parameters[
213
210
  ind_chunk : ind_chunk + parallel_tasks_per_job
214
211
  ]
@@ -50,7 +50,6 @@ def bulk_update_status_of_history_unit(
50
50
  status: HistoryUnitStatus,
51
51
  db_sync: Session,
52
52
  ) -> None:
53
-
54
53
  len_history_unit_ids = len(history_unit_ids)
55
54
  logger.debug(
56
55
  f"[bulk_update_status_of_history_unit] {len_history_unit_ids=}."
@@ -3,7 +3,6 @@ from fractal_server.app.runner.v2.task_interface import TaskOutput
3
3
 
4
4
 
5
5
  def merge_outputs(task_outputs: list[TaskOutput]) -> TaskOutput:
6
-
7
6
  if len(task_outputs) == 0:
8
7
  return TaskOutput()
9
8
 
@@ -11,7 +10,6 @@ def merge_outputs(task_outputs: list[TaskOutput]) -> TaskOutput:
11
10
  final_image_list_removals = []
12
11
 
13
12
  for task_output in task_outputs:
14
-
15
13
  final_image_list_updates.extend(task_output.image_list_updates)
16
14
  final_image_list_removals.extend(task_output.image_list_removals)
17
15
 
@@ -415,7 +415,6 @@ def execute_tasks_v2(
415
415
  # Write current dataset images into the database.
416
416
  db_dataset = db.get(DatasetV2, dataset.id)
417
417
  if ENRICH_IMAGES_WITH_STATUS:
418
-
419
418
  db_dataset.images = _remove_status_from_attributes(tmp_images)
420
419
  else:
421
420
  db_dataset.images = tmp_images
@@ -11,7 +11,6 @@ from fractal_server.types import ZarrUrlStr
11
11
 
12
12
 
13
13
  class TaskOutput(BaseModel):
14
-
15
14
  model_config = ConfigDict(extra="forbid")
16
15
 
17
16
  image_list_updates: list[SingleImageTaskOutput] = Field(
@@ -40,7 +39,6 @@ class TaskOutput(BaseModel):
40
39
 
41
40
 
42
41
  class InitArgsModel(BaseModel):
43
-
44
42
  model_config = ConfigDict(extra="forbid")
45
43
 
46
44
  zarr_url: ZarrUrlStr
@@ -48,14 +46,13 @@ class InitArgsModel(BaseModel):
48
46
 
49
47
 
50
48
  class InitTaskOutput(BaseModel):
51
-
52
49
  model_config = ConfigDict(extra="forbid")
53
50
 
54
51
  parallelization_list: list[InitArgsModel] = Field(default_factory=list)
55
52
 
56
53
 
57
54
  def _cast_and_validate_TaskOutput(
58
- task_output: dict[str, Any]
55
+ task_output: dict[str, Any],
59
56
  ) -> TaskOutput | None:
60
57
  try:
61
58
  validated_task_output = TaskOutput(**task_output)
@@ -6,7 +6,6 @@ from pydantic.types import AwareDatetime
6
6
 
7
7
 
8
8
  class AccountingRecordRead(BaseModel):
9
-
10
9
  id: int
11
10
  user_id: int
12
11
  timestamp: AwareDatetime
@@ -9,14 +9,12 @@ from fractal_server.types import NonEmptyStr
9
9
 
10
10
 
11
11
  class ProjectCreateV2(BaseModel):
12
-
13
12
  model_config = ConfigDict(extra="forbid")
14
13
 
15
14
  name: NonEmptyStr
16
15
 
17
16
 
18
17
  class ProjectReadV2(BaseModel):
19
-
20
18
  id: int
21
19
  name: str
22
20
  timestamp_created: AwareDatetime
@@ -27,7 +25,6 @@ class ProjectReadV2(BaseModel):
27
25
 
28
26
 
29
27
  class ProjectUpdateV2(BaseModel):
30
-
31
28
  model_config = ConfigDict(extra="forbid")
32
29
 
33
30
  name: NonEmptyStr = None
@@ -17,14 +17,12 @@ from fractal_server.types import NonEmptyStr
17
17
 
18
18
 
19
19
  class WorkflowCreateV2(BaseModel):
20
-
21
20
  model_config = ConfigDict(extra="forbid")
22
21
 
23
22
  name: NonEmptyStr
24
23
 
25
24
 
26
25
  class WorkflowReadV2(BaseModel):
27
-
28
26
  id: int
29
27
  name: str
30
28
  project_id: int
@@ -42,7 +40,6 @@ class WorkflowReadV2WithWarnings(WorkflowReadV2):
42
40
 
43
41
 
44
42
  class WorkflowUpdateV2(BaseModel):
45
-
46
43
  model_config = ConfigDict(extra="forbid")
47
44
 
48
45
  name: NonEmptyStr = None
fractal_server/config.py CHANGED
@@ -95,10 +95,11 @@ class PixiSettings(BaseModel):
95
95
  PIXI_CONCURRENT_SOLVES: int = 4
96
96
  PIXI_CONCURRENT_DOWNLOADS: int = 4
97
97
  TOKIO_WORKER_THREADS: int = 2
98
+ DEFAULT_ENVIRONMENT: str = "default"
99
+ DEFAULT_PLATFORM: str = "linux-64"
98
100
 
99
101
  @model_validator(mode="after")
100
102
  def check_pixi_settings(self):
101
-
102
103
  if self.default_version not in self.versions:
103
104
  raise ValueError(
104
105
  f"Default version '{self.default_version}' not in "
@@ -108,7 +109,6 @@ class PixiSettings(BaseModel):
108
109
  pixi_base_dir = Path(self.versions[self.default_version]).parent
109
110
 
110
111
  for key, value in self.versions.items():
111
-
112
112
  pixi_path = Path(value)
113
113
 
114
114
  if pixi_path.parent != pixi_base_dir:
@@ -15,7 +15,6 @@ def fix_db():
15
15
  logger.info("START execution of fix_db function")
16
16
 
17
17
  with next(get_sync_db()) as db:
18
-
19
18
  stm = select(HistoryRun).order_by(HistoryRun.id)
20
19
  history_runs = db.execute(stm).scalars().all()
21
20
 
fractal_server/main.py CHANGED
@@ -83,7 +83,6 @@ async def lifespan(app: FastAPI):
83
83
  settings = Inject(get_settings)
84
84
 
85
85
  if settings.FRACTAL_RUNNER_BACKEND == "slurm_ssh":
86
-
87
86
  from fractal_server.ssh._fabric import FractalSSHList
88
87
 
89
88
  app.state.fractal_ssh_list = FractalSSHList()
@@ -33,7 +33,6 @@ TABLES_V1 = [
33
33
 
34
34
 
35
35
  def upgrade() -> None:
36
-
37
36
  logger = logging.getLogger("alembic.runtime.migration")
38
37
 
39
38
  target_metadata = SQLModel.metadata
@@ -18,7 +18,6 @@ depends_on = None
18
18
 
19
19
 
20
20
  def upgrade() -> None:
21
-
22
21
  with op.batch_alter_table("workflowtaskv2") as batch_op:
23
22
  batch_op.alter_column(
24
23
  "task_id", existing_type=sa.INTEGER(), nullable=False
@@ -1,11 +1,18 @@
1
1
  from pathlib import Path
2
2
 
3
+ from ..utils_pixi import simplify_pyproject_toml
3
4
  from fractal_server.app.schemas.v2 import TaskCreateV2
5
+ from fractal_server.config import get_settings
4
6
  from fractal_server.logger import get_logger
7
+ from fractal_server.logger import set_logger
8
+ from fractal_server.syringe import Inject
5
9
  from fractal_server.tasks.v2.utils_templates import customize_template
6
10
  from fractal_server.utils import execute_command_sync
7
11
 
8
12
 
13
+ logger = set_logger(__name__)
14
+
15
+
9
16
  def _customize_and_run_template(
10
17
  template_filename: str,
11
18
  replacements: list[tuple[str, str]],
@@ -69,3 +76,28 @@ def check_task_files_exist(task_list: list[TaskCreateV2]) -> None:
69
76
  f"Task `{_task.name}` has `command_parallel` "
70
77
  f"pointing to missing file `{_task_path}`."
71
78
  )
79
+
80
+
81
+ def edit_pyproject_toml_in_place_local(pyproject_toml_path: Path) -> None:
82
+ """
83
+ Wrapper of `simplify_pyproject_toml`, with I/O.
84
+ """
85
+
86
+ # Read `pyproject.toml`
87
+ with pyproject_toml_path.open() as f:
88
+ pyproject_contents = f.read()
89
+
90
+ # Simplify contents
91
+ settings = Inject(get_settings)
92
+ new_pyproject_contents = simplify_pyproject_toml(
93
+ original_toml_string=pyproject_contents,
94
+ pixi_environment=settings.pixi.DEFAULT_ENVIRONMENT,
95
+ pixi_platform=settings.pixi.DEFAULT_PLATFORM,
96
+ )
97
+ # Write new `pyproject.toml`
98
+ with pyproject_toml_path.open("w") as f:
99
+ f.write(new_pyproject_contents)
100
+ logger.debug(
101
+ f"Replaced local {pyproject_toml_path.as_posix()} "
102
+ "with simplified version."
103
+ )
@@ -99,7 +99,6 @@ def collect_local(
99
99
 
100
100
  # Write wheel file and set task_group.archive_path
101
101
  if wheel_file is not None:
102
-
103
102
  archive_path = (
104
103
  Path(task_group.path) / wheel_file.filename
105
104
  ).as_posix()
@@ -7,6 +7,7 @@ from tempfile import TemporaryDirectory
7
7
  from ..utils_database import create_db_tasks_and_update_task_group_sync
8
8
  from ..utils_pixi import parse_collect_stdout
9
9
  from ..utils_pixi import SOURCE_DIR_NAME
10
+ from ._utils import edit_pyproject_toml_in_place_local
10
11
  from fractal_server.app.db import get_sync_db
11
12
  from fractal_server.app.schemas.v2 import FractalUploadedFile
12
13
  from fractal_server.app.schemas.v2 import TaskGroupActivityActionV2
@@ -134,6 +135,11 @@ def collect_local_pixi(
134
135
  activity.log = get_current_log(log_file_path)
135
136
  activity = add_commit_refresh(obj=activity, db=db)
136
137
 
138
+ # Simplify `pyproject.toml`
139
+ source_dir = Path(task_group.path, SOURCE_DIR_NAME).as_posix()
140
+ pyproject_toml_path = Path(source_dir, "pyproject.toml")
141
+ edit_pyproject_toml_in_place_local(pyproject_toml_path)
142
+
137
143
  # Run script 2
138
144
  _customize_and_run_template(
139
145
  template_filename="pixi_2_install.sh",
@@ -160,7 +166,6 @@ def collect_local_pixi(
160
166
  ]
161
167
 
162
168
  # Make task folder 755
163
- source_dir = Path(task_group.path, SOURCE_DIR_NAME).as_posix()
164
169
  command = f"chmod -R 755 {source_dir}"
165
170
  execute_command_sync(
166
171
  command=command,
@@ -205,11 +210,7 @@ def collect_local_pixi(
205
210
  "Add env_info, venv_size and venv_file_number "
206
211
  "to TaskGroupV2 - start"
207
212
  )
208
- with Path(
209
- task_group.path,
210
- SOURCE_DIR_NAME,
211
- "pixi.lock",
212
- ).open() as f:
213
+ with Path(source_dir, "pixi.lock").open() as f:
213
214
  pixi_lock_contents = f.read()
214
215
 
215
216
  # NOTE: see issue 2626 about whether to keep `pixi.lock` files
@@ -72,7 +72,6 @@ def deactivate_local(
72
72
  return
73
73
 
74
74
  try:
75
-
76
75
  activity.status = TaskGroupActivityStatusV2.ONGOING
77
76
  activity = add_commit_refresh(obj=activity, db=db)
78
77
 
@@ -115,7 +114,6 @@ def deactivate_local(
115
114
 
116
115
  # Handle some specific cases for wheel-file case
117
116
  if task_group.origin == TaskGroupV2OriginEnum.WHEELFILE:
118
-
119
117
  logger.info(
120
118
  f"Handle specific cases for {task_group.origin=}."
121
119
  )
@@ -66,7 +66,6 @@ def deactivate_local_pixi(
66
66
  return
67
67
 
68
68
  try:
69
-
70
69
  activity.status = TaskGroupActivityStatusV2.ONGOING
71
70
  activity = add_commit_refresh(obj=activity, db=db)
72
71
 
@@ -7,6 +7,7 @@ from ..utils_background import add_commit_refresh
7
7
  from ..utils_background import fail_and_cleanup
8
8
  from ..utils_background import get_activity_and_task_group
9
9
  from ..utils_pixi import SOURCE_DIR_NAME
10
+ from ._utils import edit_pyproject_toml_in_place_local
10
11
  from fractal_server.app.db import get_sync_db
11
12
  from fractal_server.app.schemas.v2 import TaskGroupActivityActionV2
12
13
  from fractal_server.app.schemas.v2.task_group import TaskGroupActivityStatusV2
@@ -121,6 +122,10 @@ def reactivate_local_pixi(
121
122
  activity.log = get_current_log(log_file_path)
122
123
  activity = add_commit_refresh(obj=activity, db=db)
123
124
 
125
+ # Simplify `pyproject.toml`
126
+ pyproject_toml_path = Path(source_dir, "pyproject.toml")
127
+ edit_pyproject_toml_in_place_local(pyproject_toml_path)
128
+
124
129
  # Write pixi.lock into `source_dir`
125
130
  logger.debug(f"start - writing {source_dir}/pixi.lock")
126
131
  with Path(source_dir, "pixi.lock").open("w") as f:
@@ -4,12 +4,18 @@ from pathlib import Path
4
4
  from sqlalchemy.ext.asyncio import AsyncSession
5
5
 
6
6
  from ..utils_background import fail_and_cleanup
7
+ from ..utils_pixi import simplify_pyproject_toml
7
8
  from fractal_server.app.models.v2 import TaskGroupActivityV2
8
9
  from fractal_server.app.models.v2 import TaskGroupV2
10
+ from fractal_server.config import get_settings
9
11
  from fractal_server.logger import get_logger
12
+ from fractal_server.logger import set_logger
10
13
  from fractal_server.ssh._fabric import FractalSSH
14
+ from fractal_server.syringe import Inject
11
15
  from fractal_server.tasks.v2.utils_templates import customize_template
12
16
 
17
+ logger = set_logger(__name__)
18
+
13
19
 
14
20
  def _customize_and_run_template(
15
21
  *,
@@ -126,3 +132,35 @@ def check_ssh_or_fail_and_cleanup(
126
132
  db=db,
127
133
  )
128
134
  return False
135
+
136
+
137
+ def edit_pyproject_toml_in_place_ssh(
138
+ *,
139
+ fractal_ssh: FractalSSH,
140
+ pyproject_toml_path: Path,
141
+ ) -> None:
142
+ """
143
+ Wrapper of `simplify_pyproject_toml`, with I/O.
144
+ """
145
+
146
+ # Read `pyproject.toml`
147
+ pyproject_contents = fractal_ssh.read_remote_text_file(
148
+ pyproject_toml_path.as_posix()
149
+ )
150
+
151
+ # Simplify contents
152
+ settings = Inject(get_settings)
153
+ new_pyproject_contents = simplify_pyproject_toml(
154
+ original_toml_string=pyproject_contents,
155
+ pixi_environment=settings.pixi.DEFAULT_ENVIRONMENT,
156
+ pixi_platform=settings.pixi.DEFAULT_PLATFORM,
157
+ )
158
+ # Write new `pyproject.toml`
159
+ fractal_ssh.write_remote_file(
160
+ path=pyproject_toml_path.as_posix(),
161
+ content=new_pyproject_contents,
162
+ )
163
+ logger.debug(
164
+ f"Replaced remote {pyproject_toml_path.as_posix()} "
165
+ "with simplified version."
166
+ )
@@ -84,7 +84,6 @@ def collect_ssh(
84
84
  ssh_config=ssh_config,
85
85
  logger_name=LOGGER_NAME,
86
86
  ) as fractal_ssh:
87
-
88
87
  try:
89
88
  # Check SSH connection
90
89
  ssh_ok = check_ssh_or_fail_and_cleanup(
@@ -9,6 +9,7 @@ from ..utils_database import create_db_tasks_and_update_task_group_sync
9
9
  from ..utils_pixi import parse_collect_stdout
10
10
  from ..utils_pixi import SOURCE_DIR_NAME
11
11
  from ._utils import check_ssh_or_fail_and_cleanup
12
+ from ._utils import edit_pyproject_toml_in_place_ssh
12
13
  from fractal_server.app.db import get_sync_db
13
14
  from fractal_server.app.schemas.v2 import FractalUploadedFile
14
15
  from fractal_server.app.schemas.v2 import TaskGroupActivityActionV2
@@ -80,7 +81,6 @@ def collect_ssh_pixi(
80
81
  ssh_config=ssh_config,
81
82
  logger_name=LOGGER_NAME,
82
83
  ) as fractal_ssh:
83
-
84
84
  try:
85
85
  # Check SSH connection
86
86
  ssh_ok = check_ssh_or_fail_and_cleanup(
@@ -191,6 +191,16 @@ def collect_ssh_pixi(
191
191
  activity.log = get_current_log(log_file_path)
192
192
  activity = add_commit_refresh(obj=activity, db=db)
193
193
 
194
+ # Simplify `pyproject.toml`
195
+ source_dir = Path(
196
+ task_group.path, SOURCE_DIR_NAME
197
+ ).as_posix()
198
+ pyproject_toml_path = Path(source_dir, "pyproject.toml")
199
+ edit_pyproject_toml_in_place_ssh(
200
+ fractal_ssh=fractal_ssh,
201
+ pyproject_toml_path=pyproject_toml_path,
202
+ )
203
+
194
204
  stdout = _customize_and_run_template(
195
205
  template_filename="pixi_2_install.sh",
196
206
  replacements=replacements,
@@ -218,9 +228,6 @@ def collect_ssh_pixi(
218
228
  "project_python_wrapper"
219
229
  ]
220
230
 
221
- source_dir = Path(
222
- task_group.path, SOURCE_DIR_NAME
223
- ).as_posix()
224
231
  fractal_ssh.run_command(cmd=f"chmod -R 755 {source_dir}")
225
232
 
226
233
  # Read and validate remote manifest file
@@ -155,7 +155,6 @@ def deactivate_ssh(
155
155
 
156
156
  # Handle some specific cases for wheel-file case
157
157
  if task_group.origin == TaskGroupV2OriginEnum.WHEELFILE:
158
-
159
158
  logger.info(
160
159
  f"Handle specific cases for {task_group.origin=}."
161
160
  )
@@ -6,6 +6,7 @@ from ..utils_background import fail_and_cleanup
6
6
  from ..utils_background import get_activity_and_task_group
7
7
  from ..utils_pixi import SOURCE_DIR_NAME
8
8
  from ._utils import check_ssh_or_fail_and_cleanup
9
+ from ._utils import edit_pyproject_toml_in_place_ssh
9
10
  from fractal_server.app.db import get_sync_db
10
11
  from fractal_server.app.schemas.v2 import TaskGroupActivityActionV2
11
12
  from fractal_server.app.schemas.v2 import TaskGroupActivityStatusV2
@@ -161,6 +162,15 @@ def reactivate_ssh_pixi(
161
162
  activity.log = get_current_log(log_file_path)
162
163
  activity = add_commit_refresh(obj=activity, db=db)
163
164
 
165
+ # Simplify `pyproject.toml`
166
+ source_dir = Path(
167
+ task_group.path, SOURCE_DIR_NAME
168
+ ).as_posix()
169
+ pyproject_toml_path = Path(source_dir, "pyproject.toml")
170
+ edit_pyproject_toml_in_place_ssh(
171
+ fractal_ssh=fractal_ssh,
172
+ pyproject_toml_path=pyproject_toml_path,
173
+ )
164
174
  # Write pixi.lock into `source_dir`
165
175
  pixi_lock_local = Path(tmpdir, "pixi.lock").as_posix()
166
176
  pixi_lock_remote = Path(
@@ -1,5 +1,12 @@
1
+ import tomllib
1
2
  from typing import TypedDict
2
3
 
4
+ import tomli_w
5
+
6
+ from fractal_server.logger import set_logger
7
+
8
+ logger = set_logger(__name__)
9
+
3
10
  SOURCE_DIR_NAME = "source_dir"
4
11
 
5
12
 
@@ -36,3 +43,63 @@ def parse_collect_stdout(stdout: str) -> ParsedOutput:
36
43
  attribute_value = actual_line.split(search)[-1].strip(" ")
37
44
  attributes[attribute_name] = attribute_value
38
45
  return attributes
46
+
47
+
48
+ def simplify_pyproject_toml(
49
+ *,
50
+ original_toml_string: str,
51
+ pixi_environment: str,
52
+ pixi_platform: str,
53
+ ) -> str:
54
+ """
55
+ Simplify `pyproject.toml` contents to make `pixi install` less heavy.
56
+
57
+ Args:
58
+ original_toml_string: Original `pyproject.toml` contents
59
+ environment: Name of the pixi environment to use (e.g. `default`).
60
+ target_platform: Name of the platform (e.g. `linux-64`)
61
+
62
+ Returns:
63
+ New `pyproject.toml` contents
64
+ """
65
+
66
+ # Parse TOML string
67
+ data = tomllib.loads(original_toml_string)
68
+ try:
69
+ pixi_data = data["tool"]["pixi"]
70
+ except KeyError:
71
+ logger.warning(
72
+ "KeyError when looking for tool/pixi path. Return original value."
73
+ )
74
+ return original_toml_string
75
+
76
+ # Use a single platform (or skip, if not set)
77
+ try:
78
+ pixi_data["workspace"]["platforms"] = [pixi_platform]
79
+ except KeyError:
80
+ logger.info("KeyError for workspace/platforms - skip.")
81
+
82
+ # Keep a single environment (or skip, if not set)
83
+ try:
84
+ current_environments = pixi_data["environments"]
85
+ pixi_data["environments"] = {
86
+ key: value
87
+ for key, value in current_environments.items()
88
+ if key == pixi_environment
89
+ }
90
+ if pixi_data["environments"] == {}:
91
+ raise ValueError(
92
+ f"No '{pixi_environment}' pixi environment found."
93
+ )
94
+ except KeyError:
95
+ logger.info("KeyError for workspace/platforms - skip.")
96
+
97
+ # Drop pixi.tasks
98
+ pixi_data.pop("tasks", None)
99
+
100
+ # Prepare and validate new `pyprojectl.toml` contents
101
+ data["tool"]["pixi"] = pixi_data
102
+ new_toml_string = tomli_w.dumps(data)
103
+ tomllib.loads(new_toml_string)
104
+
105
+ return new_toml_string
@@ -5,7 +5,7 @@ from fractal_server.syringe import Inject
5
5
 
6
6
 
7
7
  def get_python_interpreter_v2(
8
- python_version: Literal["3.9", "3.10", "3.11", "3.12"]
8
+ python_version: Literal["3.9", "3.10", "3.11", "3.12"],
9
9
  ) -> str:
10
10
  """
11
11
  Return the path to the Python interpreter
@@ -4,7 +4,7 @@ from ._common_validators import valdict_keys
4
4
 
5
5
 
6
6
  def validate_attribute_filters(
7
- attribute_filters: dict[str, list[int | float | str | bool]]
7
+ attribute_filters: dict[str, list[int | float | str | bool]],
8
8
  ) -> dict[str, list[Any]]:
9
9
  attribute_filters = valdict_keys(attribute_filters)
10
10
  for key, values in attribute_filters.items():
@@ -62,7 +62,6 @@ def _zip_folder_to_byte_stream_iterator(folder: str) -> Iterator:
62
62
  return iterfile()
63
63
 
64
64
  else:
65
-
66
65
  byte_stream = _create_zip(folder, output=BytesIO())
67
66
  return iter([byte_stream.getvalue()])
68
67
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: fractal-server
3
- Version: 2.15.3
3
+ Version: 2.15.4
4
4
  Summary: Backend component of the Fractal analytics platform
5
5
  License: BSD-3-Clause
6
6
  Author: Tommaso Comparin
@@ -23,6 +23,7 @@ Requires-Dist: pydantic-settings (>=2.7.0)
23
23
  Requires-Dist: python-dotenv (>=1.1.0,<1.2.0)
24
24
  Requires-Dist: sqlalchemy[asyncio] (>=2.0.23,<2.1)
25
25
  Requires-Dist: sqlmodel (==0.0.24)
26
+ Requires-Dist: tomli_w (>=1.2.0,<1.3.0)
26
27
  Requires-Dist: uvicorn (>=0.29.0,<0.35.0)
27
28
  Requires-Dist: uvicorn-worker (==0.3.0)
28
29
  Project-URL: Documentation, https://fractal-analytics-platform.github.io/fractal-server
@@ -1,4 +1,4 @@
1
- fractal_server/__init__.py,sha256=TohihjKSFnz5CZYMVH94PEv_l0OHohZckQFN39DhyqE,23
1
+ fractal_server/__init__.py,sha256=oQyZUHcUuOnv7ZqsoVjwEhBSMPbobwbvTyb3GUD_ZT8,23
2
2
  fractal_server/__main__.py,sha256=rkM8xjY1KeS3l63irB8yCrlVobR-73uDapC4wvrIlxI,6957
3
3
  fractal_server/alembic.ini,sha256=MWwi7GzjzawI9cCAK1LW7NxIBQDUqD12-ptJoq5JpP0,3153
4
4
  fractal_server/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -13,51 +13,51 @@ fractal_server/app/models/v2/accounting.py,sha256=i-2TsjqyuclxFQ21C-TeDoss7ZBTRu
13
13
  fractal_server/app/models/v2/dataset.py,sha256=P_zy4dPQAqrCALQ6737VkAFk1SvcgYjnslGUZhPI8sc,1226
14
14
  fractal_server/app/models/v2/history.py,sha256=CBN2WVg9vW5pHU1RP8TkB_nnJrwnuifCcxgnd53UtEE,2163
15
15
  fractal_server/app/models/v2/job.py,sha256=e3Un_rUgWC-KazGLDQqy17NQK_2ZsL3EmEmDAky_bN0,1998
16
- fractal_server/app/models/v2/project.py,sha256=RmU5BQR4HD6xifRndUhvPBy30wntml-giBRoEysdWXw,755
16
+ fractal_server/app/models/v2/project.py,sha256=XLna1SSKdywdDS3qfcVaGtafyVKMZq6CiLvHOe-AjhU,754
17
17
  fractal_server/app/models/v2/task.py,sha256=iBIQB8POQE5MyKvLZhw7jZWlBhbrThzCDzRTcgiAczQ,1493
18
- fractal_server/app/models/v2/task_group.py,sha256=1cn14RKKOOCCjh42iaT-HyuRrRpCPcYhWRrlMK-Enwc,3857
19
- fractal_server/app/models/v2/workflow.py,sha256=wuK9SV1TXrlYcieYLYj5fGvV3K3bW7g9jCM1uv9HHjA,1058
18
+ fractal_server/app/models/v2/task_group.py,sha256=-x-BLtE2biV6kR0hENFgcq3N0B1QuLehdUWhCCO34tk,3856
19
+ fractal_server/app/models/v2/workflow.py,sha256=gBjDXO-RytVT81aAlesImBhmVHrwNUrmsF_UsGa1qLM,1057
20
20
  fractal_server/app/models/v2/workflowtask.py,sha256=qkTc-hcFLpJUVsEUbnDq2BJL0qg9jagy2doZeusF1ek,1266
21
21
  fractal_server/app/routes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
22
  fractal_server/app/routes/admin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
23
  fractal_server/app/routes/admin/v2/__init__.py,sha256=_5lqb6-M8-fZqE1HRMep6pAFYRUKMxrvbZOKs-RXWkw,933
24
- fractal_server/app/routes/admin/v2/accounting.py,sha256=YPWwCWylXrJpV4bq_dJ3t6Kn5uuveTrFx-5w1wzfETU,3594
24
+ fractal_server/app/routes/admin/v2/accounting.py,sha256=-eLzBirENvdhjhrCf6bs1pTriIui19DAr_k-zuJB7Y8,3593
25
25
  fractal_server/app/routes/admin/v2/impersonate.py,sha256=gc4lshfEPFR6W2asH7aKu6hqE6chzusdhAUVV9p51eU,1131
26
- fractal_server/app/routes/admin/v2/job.py,sha256=VcyXHYjieOKnTAi1NsiO_bK3A6UufUwX2lmWCwa4sa0,7585
26
+ fractal_server/app/routes/admin/v2/job.py,sha256=fl_1hWrriCA24OPlHZhxfnM1j0C4UL5hqjcG1ww8Fac,7584
27
27
  fractal_server/app/routes/admin/v2/project.py,sha256=MA_LdoEuSuisSGRO43TapMuJ080y5iaUGSAUgKuuKOg,1188
28
- fractal_server/app/routes/admin/v2/task.py,sha256=93QIbWZNnqaBhG9R9-RStDX2mpqRNN3G7BIb0KM-jeE,4312
29
- fractal_server/app/routes/admin/v2/task_group.py,sha256=biibAvMPD2w-267eyTm3wH2s3mITjiS5gYzwCCwmLbI,7099
28
+ fractal_server/app/routes/admin/v2/task.py,sha256=8njjq_zcvNW-Ewxn7WfsRQbs_aV5h-7pgcRIAegzTnc,4308
29
+ fractal_server/app/routes/admin/v2/task_group.py,sha256=JUCxKnwSNmOKyh6lpqfG5jT5BuRE_U2X6HqD5VVhWPg,7096
30
30
  fractal_server/app/routes/admin/v2/task_group_lifecycle.py,sha256=2J3M9VXWD_0j9jRTZ5APuUXl9E-aVv0qF8K02vvcO3s,9150
31
31
  fractal_server/app/routes/api/__init__.py,sha256=B8l6PSAhR10iZqHEiyTat-_0tkeKdrCigIE6DJGP5b8,638
32
32
  fractal_server/app/routes/api/v2/__init__.py,sha256=D3sRRsqkmZO6kBxUjg40q0aRDsnuXI4sOOfn0xF9JsM,2820
33
- fractal_server/app/routes/api/v2/_aux_functions.py,sha256=YU7yT9L6yc01VMWozXPnRcx0X0063rTylmeU6PKNyKM,14260
33
+ fractal_server/app/routes/api/v2/_aux_functions.py,sha256=tfnxqbufKqd5dbFUzOFlRPc9EgURhpNa5V2V4agzndg,14259
34
34
  fractal_server/app/routes/api/v2/_aux_functions_history.py,sha256=Z23xwvBaVEEQ5B-JsWZJpjj4_QqoXqHYONztnbAH6gw,4425
35
35
  fractal_server/app/routes/api/v2/_aux_functions_task_lifecycle.py,sha256=GpKfw9yj01LmOAuNMTOreU1PFkCKpjK5oCt7_wp35-A,6741
36
36
  fractal_server/app/routes/api/v2/_aux_functions_task_version_update.py,sha256=WLDOYCnb6fnS5avKflyx6yN24Vo1n5kJk5ZyiKbzb8Y,1175
37
- fractal_server/app/routes/api/v2/_aux_functions_tasks.py,sha256=MNty8CBnTMPSAKE5gMT7tCY8QWpCQyhft_shq12hHpA,12208
37
+ fractal_server/app/routes/api/v2/_aux_functions_tasks.py,sha256=-KTPouwPQga5SGe2n0diWm-Fev31DPAfXKMo6PijBSI,12207
38
38
  fractal_server/app/routes/api/v2/_aux_task_group_disambiguation.py,sha256=8x1_q9FyCzItnPmdSdLQuwUTy4B9xCsXscp97_lJcpM,4635
39
39
  fractal_server/app/routes/api/v2/dataset.py,sha256=6u4MFqJ3YZ0Zq6Xx8CRMrTPKW55ZaR63Uno21DqFr4Q,8889
40
- fractal_server/app/routes/api/v2/history.py,sha256=ErLqkJbhx9XzHL4KQvMraVAtD9WOmDNh5tZi5wmNkL0,17114
41
- fractal_server/app/routes/api/v2/images.py,sha256=TS1ltUhP0_SaViupdHrSh3MLDi5OVk-lOhE1VCVyZj0,7869
40
+ fractal_server/app/routes/api/v2/history.py,sha256=03QPe08pyy-NWEe21NVKprsLgqxljQO4gMZ8plt9wys,17112
41
+ fractal_server/app/routes/api/v2/images.py,sha256=amQz2uoaeSSuUeYfjfQ_zyEak6h_F7KSgI5RM81cqDI,7864
42
42
  fractal_server/app/routes/api/v2/job.py,sha256=8xRTwh_OCHmK9IfI_zUASa2ozewR0qu0zVBl_a4IvHw,6467
43
- fractal_server/app/routes/api/v2/pre_submission_checks.py,sha256=2jaaM5WJBTGpOWhm6a42JViT8j4X5hixltxIY1p-188,4936
43
+ fractal_server/app/routes/api/v2/pre_submission_checks.py,sha256=AEN6w2X5kCkSpZydudvuTPhl_VZUQ4zUav6D3NiF6r8,4935
44
44
  fractal_server/app/routes/api/v2/project.py,sha256=ldMEyjtwGpX2teu85sCNWaubDFlw-En8U1SA7G1VaIw,4567
45
45
  fractal_server/app/routes/api/v2/status_legacy.py,sha256=ZckHeBy8y21cyQ_OLY-VmkapzMhd3g9ae-qg-r4-uVo,6317
46
- fractal_server/app/routes/api/v2/submit.py,sha256=_BDkWtFdo8-p7kZ0Oxaidei04MfuBeaEsWtwJaKZQ_Y,8781
46
+ fractal_server/app/routes/api/v2/submit.py,sha256=3RPfpuMWEp-orB6iUQCQYmxXu9nRC0m1V5-dznsDrks,8780
47
47
  fractal_server/app/routes/api/v2/task.py,sha256=ptS47XtxnHzk9bPNZV24Wfroo5sP19RE0-LsfX0ZvOc,7018
48
48
  fractal_server/app/routes/api/v2/task_collection.py,sha256=UcS7tb9RjiDimeI-iWwD0wqnXYQEdEZT56PnPa0zC9Q,12233
49
- fractal_server/app/routes/api/v2/task_collection_custom.py,sha256=3EZAzTVlt3wrHAuwxfcYo7LpHefLCcQUctZuolJOQHE,6728
50
- fractal_server/app/routes/api/v2/task_collection_pixi.py,sha256=LS5xOYRRvI25TyvPWR9anxQt3emTfuV610zUVKc7eJU,7518
51
- fractal_server/app/routes/api/v2/task_group.py,sha256=Wmp5Rt6NQm8_EbdJyi3XOkTXxJTTd4MNIy0ja6K-ifA,9205
52
- fractal_server/app/routes/api/v2/task_group_lifecycle.py,sha256=-uS_z8E3__t_twEqhZOzcEcAxZsgnpg-c7Ya9RF3_bs,9998
53
- fractal_server/app/routes/api/v2/task_version_update.py,sha256=o8W_C0I84X0u8gAMnCvi8ChiVAKrb5WzUBuJLSuujCA,8235
54
- fractal_server/app/routes/api/v2/workflow.py,sha256=SfjegoVO4DaGmDD7OPhWNLkcvZhJKwNX4DTQAcVKk9Q,10699
49
+ fractal_server/app/routes/api/v2/task_collection_custom.py,sha256=j-vI1_FjoxU59VwkwUTYW5HhMVB5NObMkWLCjAKbers,6726
50
+ fractal_server/app/routes/api/v2/task_collection_pixi.py,sha256=1rCBfKANT9zcKcOVMQTByVpP8GjdrzeaMzyQT05k0nY,7517
51
+ fractal_server/app/routes/api/v2/task_group.py,sha256=DrXMc0D7IYqUsrlrpF5JO1zVKvx7RPdKPPOhz3FqqJE,9203
52
+ fractal_server/app/routes/api/v2/task_group_lifecycle.py,sha256=itsldN_aYT_-wuCmwAoVKbH8D6eZpL_z89gCBZDM5cg,9996
53
+ fractal_server/app/routes/api/v2/task_version_update.py,sha256=RoeN21kYvBwc8xLcJZ8t0hZtl32P3FhMqiofntHyrjQ,8233
54
+ fractal_server/app/routes/api/v2/workflow.py,sha256=n0sRsDHGrjDAoo_0klqoYW4AuZ1LajWtlzEd6gKmvps,10697
55
55
  fractal_server/app/routes/api/v2/workflow_import.py,sha256=kOGDaCj0jCGK1WSYGbnUjtUg2U1YxUY9UMH-2ilqJg4,9027
56
56
  fractal_server/app/routes/api/v2/workflowtask.py,sha256=5_SQAG8ztDnaaRXwKalcO69HVpSl-QbrhiI7fCP3YRI,7924
57
57
  fractal_server/app/routes/auth/__init__.py,sha256=fao6CS0WiAjHDTvBzgBVV_bSXFpEAeDBF6Z6q7rRkPc,1658
58
58
  fractal_server/app/routes/auth/_aux_auth.py,sha256=UZgauY0V6mSqjte_sYI1cBl2h8bcbLaeWzgpl1jdJlk,4883
59
59
  fractal_server/app/routes/auth/current_user.py,sha256=EjkwMxUA0l6FLbDJdertHGnuOoSS-HEysmm6l5FkAlY,5903
60
- fractal_server/app/routes/auth/group.py,sha256=P6naOD11Jud2IbdXKpHVjrdRo3IKAqnyXspT8k49k_w,7893
60
+ fractal_server/app/routes/auth/group.py,sha256=VBeV5PbSYkyevvg2USrMPHR2sD1DUp8IsDyhC2Gb7vI,7888
61
61
  fractal_server/app/routes/auth/login.py,sha256=tSu6OBLOieoBtMZB4JkBAdEgH2Y8KqPGSbwy7NIypIo,566
62
62
  fractal_server/app/routes/auth/oauth.py,sha256=KCtJHSzemC4S8AfX9bLLdVhlF1nU4DOyox-sNQtcWew,1978
63
63
  fractal_server/app/routes/auth/register.py,sha256=DlHq79iOvGd_gt2v9uwtsqIKeO6i_GKaW59VIkllPqY,587
@@ -67,7 +67,7 @@ fractal_server/app/routes/aux/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5N
67
67
  fractal_server/app/routes/aux/_job.py,sha256=XWyWpOObcV55YyK7uzGRlaslmPDCBZy4hiSZBpoa_bg,616
68
68
  fractal_server/app/routes/aux/_runner.py,sha256=spNudutueHTBJPhm55RlOuYzb31DhyheSjl2rk6dloM,873
69
69
  fractal_server/app/routes/aux/validate_user_settings.py,sha256=FLVi__8YFcm_6c_K5uMQo7raWWXQLBcZtx8yaPO4jaE,2301
70
- fractal_server/app/routes/pagination.py,sha256=jjzYG40KecXTc23fDl5-hg_wt3_sVMWowblkLS_mY_E,1176
70
+ fractal_server/app/routes/pagination.py,sha256=IGy8Ll5lYr6ENYE18h3huH5s0GMX1DCs5VdCi6j1cdk,1174
71
71
  fractal_server/app/runner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
72
72
  fractal_server/app/runner/components.py,sha256=-Ii5l8d_V6f5DFOd-Zsr8VYmOsyqw0Hox9fEFQiuqxY,66
73
73
  fractal_server/app/runner/exceptions.py,sha256=tJxs7WCQ86kjezunFm4o_VAiUAyD70l3GiH6ht0waWA,3958
@@ -76,7 +76,7 @@ fractal_server/app/runner/executors/base_runner.py,sha256=7ujN6gN92X9sWAlDwkc07G
76
76
  fractal_server/app/runner/executors/call_command_wrapper.py,sha256=1BHl-zbXoX2oGUWGAFprVZMmg5QjutPH0-VZJSIC0II,1419
77
77
  fractal_server/app/runner/executors/local/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
78
78
  fractal_server/app/runner/executors/local/get_local_config.py,sha256=KBYOkcuwpSYl-ZIAwPBxpn59QSyFF8eJ-fLKVIhwwzA,3594
79
- fractal_server/app/runner/executors/local/runner.py,sha256=DZK_oVxjIewyo7tjB7HvTds0nDHxIbpLJ4ABn4Mly8w,10841
79
+ fractal_server/app/runner/executors/local/runner.py,sha256=syJcUYkdKeGYbD33VzuX9Ysr7OjK34TkZjB7xvkzqXU,10838
80
80
  fractal_server/app/runner/executors/slurm_common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
81
  fractal_server/app/runner/executors/slurm_common/_batching.py,sha256=gbHZIxt90GjUwhB9_UInwVqpX-KdxRQMDeXzUagdL3U,8816
82
82
  fractal_server/app/runner/executors/slurm_common/_job_states.py,sha256=nuV-Zba38kDrRESOVB3gaGbrSPZc4q7YGichQaeqTW0,238
@@ -100,37 +100,37 @@ fractal_server/app/runner/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NM
100
100
  fractal_server/app/runner/v2/_local.py,sha256=tTJgABK-zAZmmRzoie_MPNTXJx_zBAXiZiiWl1CC2qo,3035
101
101
  fractal_server/app/runner/v2/_slurm_ssh.py,sha256=JlDngsVSOUNqEubDl-5jkIxQQmV4mhTqbMbJVY_rL6M,2840
102
102
  fractal_server/app/runner/v2/_slurm_sudo.py,sha256=Gvsh4tUlc1_3KdF3B7zEqs-YIntC_joLtTGSNFbKKSs,2939
103
- fractal_server/app/runner/v2/db_tools.py,sha256=du5dKhMMFMErQXbGIgu9JvO_vtMensodyPsyDeqz1yQ,3324
103
+ fractal_server/app/runner/v2/db_tools.py,sha256=ozp4RFLB3LNI0rM0q0udi6ja8-5vooH_dVqrbmTPNDg,3323
104
104
  fractal_server/app/runner/v2/deduplicate_list.py,sha256=IVTE4abBU1bUprFTkxrTfYKnvkNTanWQ-KWh_etiT08,645
105
- fractal_server/app/runner/v2/merge_outputs.py,sha256=D1L4Taieq9i71SPQyNc1kMokgHh-sV_MqF3bv7QMDBc,907
106
- fractal_server/app/runner/v2/runner.py,sha256=84aEfpMMEXxCWyhJckGpkC9REEoBNnV_MshAMuwKZlE,18990
105
+ fractal_server/app/runner/v2/merge_outputs.py,sha256=YOTKbGOM9s-uqY4KN2onoIxuHNm-v3hr5zv6Aa1KEtA,905
106
+ fractal_server/app/runner/v2/runner.py,sha256=IsQhSxASVI-yPBO2G2uuVvZkRIoAlSY6Ev7gcSYmDOw,18989
107
107
  fractal_server/app/runner/v2/runner_functions.py,sha256=aEwEDzI2l-QvgfJSj-M2LGvqA89nOiJYIFVryKEq_3M,18988
108
108
  fractal_server/app/runner/v2/submit_workflow.py,sha256=AMnXdozwIGlXD55ch0_SNAG-ntKBO-QRhkbInrvsShU,13140
109
- fractal_server/app/runner/v2/task_interface.py,sha256=V2TWBK6tbhycyMrJvFaoJ9IpuKlrLrvmjJbfNMsBBXo,2527
109
+ fractal_server/app/runner/v2/task_interface.py,sha256=BRSKpitGproY48JQdCbfrghbDonA-EqPP1yIopohpPo,2525
110
110
  fractal_server/app/runner/versions.py,sha256=4BW-8Et8RVgILgpFoUJLWkEnZz53pv8hv_2ucG480ns,398
111
111
  fractal_server/app/schemas/__init__.py,sha256=stURAU_t3AOBaH0HSUbV-GKhlPKngnnIMoqWc3orFyI,135
112
112
  fractal_server/app/schemas/user.py,sha256=t9nbyYjGCSOsxm9K97PDG3-9o27CsaFfhWb_L5nrjqA,1910
113
113
  fractal_server/app/schemas/user_group.py,sha256=x3-kqbo0q2wTP7QI0iZ7PU_9Dr957UYrFMKqS7BXLhE,1425
114
114
  fractal_server/app/schemas/user_settings.py,sha256=NpdC0Me0fgwwdfJuTSlFLCnLUjiWWzrJlPn_UPLjXnw,1862
115
115
  fractal_server/app/schemas/v2/__init__.py,sha256=GqV6kJ0nKDq2vsSA4uph-nb5pmuaq013LUCcm9LbpLE,3097
116
- fractal_server/app/schemas/v2/accounting.py,sha256=Wylt7uWTiDIFlHJOh4XEtYitk2FjFlmnodDrJDxcr0E,397
116
+ fractal_server/app/schemas/v2/accounting.py,sha256=C_ekrYQwhi7PtrxxB07oVAG2y1NLigXjYwyp4E38fao,396
117
117
  fractal_server/app/schemas/v2/dataset.py,sha256=NKCjBwGBC7mPiSlXktZAcleJsvlLY6KfNKw7Wx4Zfqk,1728
118
118
  fractal_server/app/schemas/v2/dumps.py,sha256=MoQHjKZy-_ujSfr7XmZ6FjB_VR-zLedx9XJj_sp5xvc,2210
119
119
  fractal_server/app/schemas/v2/history.py,sha256=pZiMKfh6nMWbTp5MUtrnGySPKbeRFf5tM1VLFaTgGcw,1784
120
120
  fractal_server/app/schemas/v2/job.py,sha256=fPay7dLSr-skKRdVRoZig8rf_sZwUdVdHZaJ4XM8vMI,3288
121
121
  fractal_server/app/schemas/v2/manifest.py,sha256=QUpXMDB8WkB1F4UK-yYmm3O8bXoHwDGURnqwn6ayO_I,6674
122
- fractal_server/app/schemas/v2/project.py,sha256=l96-3bCfB3knhITaLj1WSyBgbzP_k8CdtvgX_5jO_fU,657
122
+ fractal_server/app/schemas/v2/project.py,sha256=7UC0aZLgtmkaAiPykeUj-9OZXhMkoyi3V-475UW_EQs,654
123
123
  fractal_server/app/schemas/v2/status_legacy.py,sha256=eQT1zGxbkzSwd0EqclsOdZ60n1x6J3DB1CZ3m4LYyxc,955
124
124
  fractal_server/app/schemas/v2/task.py,sha256=IJv8loB4kx9FBkaIHoiMsswQyq02FxvyAnHK1u074fU,4364
125
125
  fractal_server/app/schemas/v2/task_collection.py,sha256=EPGe4bTRka-Y3S3_h6Wfmstq1889Cn-5cZ9ODdnsKG8,4154
126
126
  fractal_server/app/schemas/v2/task_group.py,sha256=NwU3FRPzPtoEhunE7dcF3su20dxaL_4YJQw4fPnTcgo,3231
127
- fractal_server/app/schemas/v2/workflow.py,sha256=JtjxbDO52bmY06WUMACUKpFSdJysO4DBv7wezsvODRQ,1775
127
+ fractal_server/app/schemas/v2/workflow.py,sha256=L-dW6SzCH_VNoH6ENip44lTgGGqVYHHBk_3PtM-Ooy8,1772
128
128
  fractal_server/app/schemas/v2/workflowtask.py,sha256=6eweAMyziwaoMT-7R1fVJYunIeZKzT0-7fAVgPO_FEc,3639
129
129
  fractal_server/app/security/__init__.py,sha256=oJ8RVglpOvWPQY4RokiE2YA72Nqo42dZEjywWTt8xr8,14032
130
130
  fractal_server/app/security/signup_email.py,sha256=Xd6QYxcdmg0PHpDwmUE8XQmPcOj3Xjy5oROcIMhmltM,1472
131
131
  fractal_server/app/user_settings.py,sha256=OP1yiYKtPadxwM51_Q0hdPk3z90TCN4z1BLpQsXyWiU,1316
132
- fractal_server/config.py,sha256=JvFF2nbXOKI6WPKv2UwvJmT4loStBytdG8EU6qZckY8,28259
133
- fractal_server/data_migrations/2_14_10.py,sha256=gMRR5QB0SDv0ToEiXVLg1VrHprM_Ii-9O1Kg-ZF-YhY,1599
132
+ fractal_server/config.py,sha256=oVNGnbyLhvVzcFnCPS4UCCEXbAVyACZR_u4fDsBa534,28337
133
+ fractal_server/data_migrations/2_14_10.py,sha256=jzMg2c1zNO8C_Nho_9_EZJD6kR1-gkFNpNrMR5Hr8hM,1598
134
134
  fractal_server/data_migrations/README.md,sha256=_3AEFvDg9YkybDqCLlFPdDmGJvr6Tw7HRI14aZ3LOIw,398
135
135
  fractal_server/data_migrations/tools.py,sha256=LeMeASwYGtEqd-3wOLle6WARdTGAimoyMmRbbJl-hAM,572
136
136
  fractal_server/exceptions.py,sha256=7ftpWwNsTQmNonWCynhH5ErUh1haPPhIaVPrNHla7-o,53
@@ -140,18 +140,18 @@ fractal_server/images/models.py,sha256=6WchcIzLLLwdkLNRfg71Dl4Y-9UFLPyrrzh1lWgju
140
140
  fractal_server/images/status_tools.py,sha256=KICcThwHniHNkDftzJmK_n2gQK2IeTKlR_PFAesf204,4912
141
141
  fractal_server/images/tools.py,sha256=92kmt2Fnyp8ycTbyuar9_U8kJTi0wKpBk8ZagARWl9Y,4177
142
142
  fractal_server/logger.py,sha256=QIeVn3QpZsiIL2jDdrKotr-MLyDcZYgiPiTluFU46lE,5317
143
- fractal_server/main.py,sha256=FD9KzTTsXTQnTW0z3Hu7y0Nj_oAkBeZEInKDXFd4hjE,4561
143
+ fractal_server/main.py,sha256=0lh7JQGt7e6wekLHzhiSWURKzkE8GeRz6lhlCWjF8Ho,4560
144
144
  fractal_server/migrations/env.py,sha256=nfyBpMIOT3kny6t-b-tUjyRjZ4k906bb1_wCQ7me1BI,1353
145
145
  fractal_server/migrations/naming_convention.py,sha256=htbKrVdetx3pklowb_9Cdo5RqeF0fJ740DNecY5de_M,265
146
146
  fractal_server/migrations/versions/034a469ec2eb_task_groups.py,sha256=vrPhC8hfFu1c4HmLHNZyCuqEfecFD8-bWc49bXMNes0,6199
147
147
  fractal_server/migrations/versions/091b01f51f88_add_usergroup_and_linkusergroup_table.py,sha256=-BSS9AFTPcu3gYC-sYbawSy4MWQQx8TfMb5BW5EBKmQ,1450
148
148
  fractal_server/migrations/versions/19eca0dd47a9_user_settings_project_dir.py,sha256=Q1Gj1cJ0UrdLBJ5AXfFK9QpxTtmcv-4Z3NEGDnxOme4,961
149
- fractal_server/migrations/versions/1eac13a26c83_drop_v1_tables.py,sha256=ok8dl4IkI-dfsyE_NZ8IndjQrnQ_g6CDZo4PwozpIwE,1605
149
+ fractal_server/migrations/versions/1eac13a26c83_drop_v1_tables.py,sha256=7OW3HmqAePHx53OWdEPzNxvtupxSR0lB_6tZF1b3JIM,1604
150
150
  fractal_server/migrations/versions/316140ff7ee1_remove_usersettings_cache_dir.py,sha256=lANgTox0rz459_yo1Rw7fGCT1qw5sUCUXTLUMc_Bzf8,911
151
151
  fractal_server/migrations/versions/47351f8c7ebc_drop_dataset_filters.py,sha256=vePkVm1iUHiPNKLQ3KR7BBLdHruqBdl87j_tUCbMbEA,1414
152
152
  fractal_server/migrations/versions/4c308bcaea2b_add_task_args_schema_and_task_args_.py,sha256=-wHe-fOffmYeAm0JXVl_lxZ7hhDkaEVqxgxpHkb_uL8,954
153
153
  fractal_server/migrations/versions/4cedeb448a53_workflowtask_foreign_keys_not_nullables.py,sha256=Mob8McGYAcmgvrseyyYOa54E6Gsgr-4SiGdC-r9O4_A,1157
154
- fractal_server/migrations/versions/501961cfcd85_remove_link_between_v1_and_v2_tasks_.py,sha256=5ROUgcoZOdjf8kMt6cxuvPhzHmV6xaCxvZEbhUEyZM4,3271
154
+ fractal_server/migrations/versions/501961cfcd85_remove_link_between_v1_and_v2_tasks_.py,sha256=JOrVa6mGzqZ6H61YCFVOed64vFRjTWGWyN3z7NE3T08,3270
155
155
  fractal_server/migrations/versions/50a13d6138fd_initial_schema.py,sha256=zwXegXs9J40eyCWi3w0c_iIBVJjXNn4VdVnQaT3KxDg,8770
156
156
  fractal_server/migrations/versions/5bf02391cfef_v2.py,sha256=axhNkr_H6R4rRbY7oGYazNbFvPXeSyBDWFVbKNmiqs8,8433
157
157
  fractal_server/migrations/versions/70e77f1c38b0_add_applyworkflow_first_task_index_and_.py,sha256=Q-DsMzG3IcUV2Ol1dhJWosDvKERamBE6QvA2zzS5zpQ,1632
@@ -192,21 +192,21 @@ fractal_server/tasks/__init__.py,sha256=kadmVUoIghl8s190_Tt-8f-WBqMi8u8oU4Pvw39N
192
192
  fractal_server/tasks/utils.py,sha256=V7dj8o2AnoHhGSTYlqJHcRFhCIpmOrMOUhtiE_DvRVA,291
193
193
  fractal_server/tasks/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
194
194
  fractal_server/tasks/v2/local/__init__.py,sha256=S842wRersYKBKjc7xbmj0ov8b5i1YuCHa2f_yYuxcaI,312
195
- fractal_server/tasks/v2/local/_utils.py,sha256=p2KJ4BvEwJxahICpzbvzrc5-ciLCFnLXWPCwdNGi-3Q,2495
196
- fractal_server/tasks/v2/local/collect.py,sha256=MQncScKbWv3g9lrjF8WOhzuEoTEOOgS02RqOJno5csI,11897
197
- fractal_server/tasks/v2/local/collect_pixi.py,sha256=coV9SqOf5rz2dgUFG7uVisPFS0xvXEubFwU7rb3QHe8,10753
198
- fractal_server/tasks/v2/local/deactivate.py,sha256=LoEs2TUoHQOq3JfxufW6zroXD-Xx_b-hLtdigEBi1JU,9732
199
- fractal_server/tasks/v2/local/deactivate_pixi.py,sha256=_ycvnLIZ8zUFB3fZbCzDlNudh-SSetl4UkyFrClCcUU,3494
195
+ fractal_server/tasks/v2/local/_utils.py,sha256=vhi0LKWXeU4-2xVYe1G52-wzfl11fxgkM9SDFGo-NlM,3485
196
+ fractal_server/tasks/v2/local/collect.py,sha256=mO1gDIQH5VbpvFQL4H37RhFRlQ1h7dInqy9RASiiBx4,11896
197
+ fractal_server/tasks/v2/local/collect_pixi.py,sha256=Ej4ovQeFZMTN-ZQNjMZDwRxSWivEWAS233CIZlEzWDc,10897
198
+ fractal_server/tasks/v2/local/deactivate.py,sha256=0gIOk8Cych-QCMwKPcw29tTly3pBzmWtqsJS8JseNyo,9730
199
+ fractal_server/tasks/v2/local/deactivate_pixi.py,sha256=x9YCILEP1EjCrZccAcj5C5i0NBzqSXQc2L-r3hfOL6s,3493
200
200
  fractal_server/tasks/v2/local/reactivate.py,sha256=Q43DOadNeFyyfgNP67lUqaXmZsS6onv67XwxH_-5ANA,5756
201
- fractal_server/tasks/v2/local/reactivate_pixi.py,sha256=X1gdeuFGPtohjWEZ7OX2v8m6aI7Z93M-y64FqtYjApg,7320
201
+ fractal_server/tasks/v2/local/reactivate_pixi.py,sha256=IuxDRaj8i6Rc582TIbc9HVKQ9pOvR4IepyXSaJx2PfQ,7565
202
202
  fractal_server/tasks/v2/ssh/__init__.py,sha256=vX5aIM9Hbn2T_cIP_LrZ5ekRqJzYm_GSfp-4Iv7kqeI,300
203
- fractal_server/tasks/v2/ssh/_utils.py,sha256=ktVH7psQSAhh353fVUe-BwiBZHzTdgXnR-Xv_vfuX0Y,3857
204
- fractal_server/tasks/v2/ssh/collect.py,sha256=M9gFD1h9Q1Z-BFQq65dI0vFs6HPCkKQzOkxaLddmChY,14334
205
- fractal_server/tasks/v2/ssh/collect_pixi.py,sha256=MYxHY5P69P7DdM4uC8FAsAoQBuqr8UJdDti0CPHAn_U,13801
206
- fractal_server/tasks/v2/ssh/deactivate.py,sha256=XAIy84cLT9MSTMiN67U-wfOjxMm5s7lmrGwhW0qp7BU,12439
203
+ fractal_server/tasks/v2/ssh/_utils.py,sha256=jMe3eg2duad8wtGS_RD6oOIvA0LyJEg5cn--qanGuwE,4954
204
+ fractal_server/tasks/v2/ssh/collect.py,sha256=WesUBtNaax9ST7CtgqAD2qd-ZII4t1JFPzRzltEOuM8,14333
205
+ fractal_server/tasks/v2/ssh/collect_pixi.py,sha256=PWv-5cQFLA3n4NeFsTU-zfE1xWEy8LoLvHy41gRtWW8,14169
206
+ fractal_server/tasks/v2/ssh/deactivate.py,sha256=7gJ2mOah0wKwUnK0S9QpaXg08_WE95P0rC-oExAGhLE,12438
207
207
  fractal_server/tasks/v2/ssh/deactivate_pixi.py,sha256=K0yK_NPUqhFMj6cp6G_0Kfn0Yo7oQux4kT5dFPulnos,4748
208
208
  fractal_server/tasks/v2/ssh/reactivate.py,sha256=NJIgMNFKaXMhbvK0iZOsMwMtsms6Boj9f8N4L01X9Bo,8271
209
- fractal_server/tasks/v2/ssh/reactivate_pixi.py,sha256=Vay6kfsrc5XKx2WJVTu_pLhgpuHZDdnrEB6Er8XchYo,9784
209
+ fractal_server/tasks/v2/ssh/reactivate_pixi.py,sha256=JGP19nbmCCuE8Ya7sBfgrm78vORM0bF0tkt3bWakvF0,10281
210
210
  fractal_server/tasks/v2/templates/1_create_venv.sh,sha256=PK0jdHKtQpda1zULebBaVPORt4t6V17wa4N1ohcj5ac,548
211
211
  fractal_server/tasks/v2/templates/2_pip_install.sh,sha256=jMJPQJXHKznO6fxOOXtFXKPdCmTf1VLLWj_JL_ZdKxo,1644
212
212
  fractal_server/tasks/v2/templates/3_pip_freeze.sh,sha256=JldREScEBI4cD_qjfX4UK7V4aI-FnX9ZvVNxgpSOBFc,168
@@ -219,19 +219,19 @@ fractal_server/tasks/v2/templates/pixi_3_post_install.sh,sha256=99J8KXkNeQk9utuE
219
219
  fractal_server/tasks/v2/utils_background.py,sha256=_4wGETgZ3JdnJXLYKSI0Lns8LwokJL-NEzUOK5SxCJU,4811
220
220
  fractal_server/tasks/v2/utils_database.py,sha256=yi7793Uue32O59OBVUgomO42oUrVKdSKXoShBUNDdK0,1807
221
221
  fractal_server/tasks/v2/utils_package_names.py,sha256=RDg__xrvQs4ieeVzmVdMcEh95vGQYrv9Hfal-5EDBM8,2393
222
- fractal_server/tasks/v2/utils_pixi.py,sha256=QrRVtN8SZM_ZDoRadXK98R27irOvTJuZO4c_mCfJ92A,1221
223
- fractal_server/tasks/v2/utils_python_interpreter.py,sha256=5_wrlrTqXyo1YuLZvAW9hrSoh5MyLOzdPVUlUwM7uDQ,955
222
+ fractal_server/tasks/v2/utils_pixi.py,sha256=VNcHNaHH8uceEtBvuiD-hCjkJHutAP6F4BbEVrAKfbU,3102
223
+ fractal_server/tasks/v2/utils_python_interpreter.py,sha256=JOYHou_zgV83zsmNeR9tX0F2xjiYVwKvEASh9nIDGlw,956
224
224
  fractal_server/tasks/v2/utils_templates.py,sha256=GR8z7ODkR9tLftNAI1g1NrtN7pvDGrasp2jIlfdg4cI,3518
225
225
  fractal_server/types/__init__.py,sha256=aA_8J1xXzuiLqpwO_Qf18-qzaRcYkHzevhH_T-diXWM,2026
226
226
  fractal_server/types/validators/__init__.py,sha256=5uj6KJ9MelFZgyoq3MzXLhgWCl0yiriS7XKmb0gathg,392
227
227
  fractal_server/types/validators/_common_validators.py,sha256=MpxyaP2kwgbyCTOaVRjYnJ74Lfi0f2X0q3rjX9w3vTk,1170
228
- fractal_server/types/validators/_filter_validators.py,sha256=_s2dG9aCkiNWyX3ZLLuYlAgNKlQVm-ORdF-HpnyhX10,830
228
+ fractal_server/types/validators/_filter_validators.py,sha256=irmjzycmiR6F4fmWUeA45Pdh7AeLufwVjNItskDsknk,831
229
229
  fractal_server/types/validators/_workflow_task_arguments_validators.py,sha256=HL7NgV8d56XbcD6gG5PVFUPMHjDm5Q-d7cXhVLdFAGU,387
230
230
  fractal_server/urls.py,sha256=QjIKAC1a46bCdiPMu3AlpgFbcv6a4l3ABcd5xz190Og,471
231
231
  fractal_server/utils.py,sha256=Vn35lApt1T1J8nc09sAVqd10Cy0sa3dLipcljI-hkuk,2185
232
- fractal_server/zip_tools.py,sha256=tqz_8f-vQ9OBRW-4OQfO6xxY-YInHTyHmZxU7U4PqZo,4885
233
- fractal_server-2.15.3.dist-info/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
234
- fractal_server-2.15.3.dist-info/METADATA,sha256=-Z1TLhBsEtPcHcx4oq8Hij5f1mUfDyTiL3ttW1cBmTE,4243
235
- fractal_server-2.15.3.dist-info/WHEEL,sha256=7dDg4QLnNKTvwIDR9Ac8jJaAmBC_owJrckbC0jjThyA,88
236
- fractal_server-2.15.3.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
237
- fractal_server-2.15.3.dist-info/RECORD,,
232
+ fractal_server/zip_tools.py,sha256=H0w7wS5yE4ebj7hw1_77YQ959dl2c-L0WX6J_ro1TY4,4884
233
+ fractal_server-2.15.4.dist-info/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
234
+ fractal_server-2.15.4.dist-info/METADATA,sha256=xtZoBMySmrfFIEf-RXzQHmqZUUvZr2Ud1cyR1rMLqoM,4283
235
+ fractal_server-2.15.4.dist-info/WHEEL,sha256=7dDg4QLnNKTvwIDR9Ac8jJaAmBC_owJrckbC0jjThyA,88
236
+ fractal_server-2.15.4.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
237
+ fractal_server-2.15.4.dist-info/RECORD,,