fractal-server 2.14.15__py3-none-any.whl → 2.14.16__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.
@@ -1 +1 @@
1
- __VERSION__ = "2.14.15"
1
+ __VERSION__ = "2.14.16"
@@ -65,11 +65,13 @@ class HistoryImageCache(SQLModel, table=True):
65
65
  primary_key=True,
66
66
  foreign_key="datasetv2.id",
67
67
  ondelete="CASCADE",
68
+ index=True,
68
69
  )
69
70
  workflowtask_id: int = Field(
70
71
  primary_key=True,
71
72
  foreign_key="workflowtaskv2.id",
72
73
  ondelete="CASCADE",
74
+ index=True,
73
75
  )
74
76
 
75
77
  latest_history_unit_id: int = Field(
@@ -34,7 +34,7 @@ from fractal_server.app.schemas.v2 import HistoryUnitRead
34
34
  from fractal_server.app.schemas.v2 import HistoryUnitStatus
35
35
  from fractal_server.app.schemas.v2 import HistoryUnitStatusWithUnset
36
36
  from fractal_server.app.schemas.v2 import ImageLogsRequest
37
- from fractal_server.images.status_tools import enrich_images_async
37
+ from fractal_server.images.status_tools import enrich_images_unsorted_async
38
38
  from fractal_server.images.status_tools import IMAGE_STATUS_KEY
39
39
  from fractal_server.images.tools import aggregate_attributes
40
40
  from fractal_server.images.tools import aggregate_types
@@ -334,7 +334,7 @@ async def get_history_images(
334
334
  types = aggregate_types(type_filtered_images)
335
335
 
336
336
  # (3) Enrich images with status attribute
337
- type_filtered_images_with_status = await enrich_images_async(
337
+ type_filtered_images_with_status = await enrich_images_unsorted_async(
338
338
  dataset_id=dataset_id,
339
339
  workflowtask_id=workflowtask_id,
340
340
  images=type_filtered_images,
@@ -14,7 +14,7 @@ from fractal_server.app.models import UserOAuth
14
14
  from fractal_server.app.routes.auth import current_active_user
15
15
  from fractal_server.app.schemas.v2 import HistoryUnitStatus
16
16
  from fractal_server.app.schemas.v2 import TaskType
17
- from fractal_server.images.status_tools import enrich_images_async
17
+ from fractal_server.images.status_tools import enrich_images_unsorted_async
18
18
  from fractal_server.images.status_tools import IMAGE_STATUS_KEY
19
19
  from fractal_server.images.tools import aggregate_types
20
20
  from fractal_server.images.tools import filter_image_list
@@ -46,7 +46,7 @@ async def verify_unique_types(
46
46
  filtered_images = dataset.images
47
47
  else:
48
48
  if IMAGE_STATUS_KEY in query.attribute_filters.keys():
49
- images = await enrich_images_async(
49
+ images = await enrich_images_unsorted_async(
50
50
  dataset_id=dataset_id,
51
51
  workflowtask_id=workflowtask_id,
52
52
  images=dataset.images,
@@ -134,7 +134,7 @@ async def check_non_processed_images(
134
134
  attribute_filters=filters.attribute_filters,
135
135
  )
136
136
 
137
- filtered_images_with_status = await enrich_images_async(
137
+ filtered_images_with_status = await enrich_images_unsorted_async(
138
138
  dataset_id=dataset_id,
139
139
  workflowtask_id=previous_wft.id,
140
140
  images=filtered_images,
@@ -40,8 +40,10 @@ class SlurmSSHRunner(BaseSlurmRunner):
40
40
  self.fractal_ssh = fractal_ssh
41
41
  logger.warning(self.fractal_ssh)
42
42
 
43
- settings = Inject(get_settings)
43
+ # Check SSH connection and try to recover from a closed-socket error
44
+ self.fractal_ssh.check_connection()
44
45
 
46
+ settings = Inject(get_settings)
45
47
  super().__init__(
46
48
  slurm_runner_type="ssh",
47
49
  root_dir_local=root_dir_local,
@@ -32,7 +32,7 @@ from fractal_server.app.schemas.v2 import TaskDumpV2
32
32
  from fractal_server.app.schemas.v2 import TaskGroupDumpV2
33
33
  from fractal_server.app.schemas.v2 import TaskType
34
34
  from fractal_server.images import SingleImage
35
- from fractal_server.images.status_tools import enrich_images_sync
35
+ from fractal_server.images.status_tools import enrich_images_unsorted_sync
36
36
  from fractal_server.images.status_tools import IMAGE_STATUS_KEY
37
37
  from fractal_server.images.tools import filter_image_list
38
38
  from fractal_server.images.tools import find_image_by_zarr_url
@@ -147,7 +147,7 @@ def execute_tasks_v2(
147
147
 
148
148
  if ind_wftask == 0 and ENRICH_IMAGES_WITH_STATUS:
149
149
  # FIXME: Could this be done on `type_filtered_images`?
150
- tmp_images = enrich_images_sync(
150
+ tmp_images = enrich_images_unsorted_sync(
151
151
  images=tmp_images,
152
152
  dataset_id=dataset.id,
153
153
  workflowtask_id=wftask.id,
@@ -1,5 +1,4 @@
1
1
  import time
2
- from copy import deepcopy
3
2
  from typing import Any
4
3
 
5
4
  from sqlalchemy import Select
@@ -11,7 +10,6 @@ from fractal_server.app.models.v2 import HistoryImageCache
11
10
  from fractal_server.app.models.v2 import HistoryUnit
12
11
  from fractal_server.app.schemas.v2 import HistoryUnitStatusWithUnset
13
12
  from fractal_server.logger import set_logger
14
- from fractal_server.types import ImageAttributeValue
15
13
 
16
14
  logger = set_logger(__name__)
17
15
 
@@ -19,36 +17,84 @@ logger = set_logger(__name__)
19
17
  IMAGE_STATUS_KEY = "__wftask_dataset_image_status__"
20
18
 
21
19
 
22
- def _enriched_image(*, img: dict[str, Any], status: str) -> dict[str, Any]:
23
- img["attributes"][IMAGE_STATUS_KEY] = status
24
- return img
20
+ def _enriched_image(
21
+ *,
22
+ img: dict[str, Any],
23
+ status: str,
24
+ ) -> dict[str, Any]:
25
+ return img | {
26
+ "attributes": (img["attributes"] | {IMAGE_STATUS_KEY: status})
27
+ }
25
28
 
26
29
 
27
30
  def _prepare_query(
28
31
  *,
29
32
  dataset_id: int,
30
33
  workflowtask_id: int,
31
- zarr_urls: list[str],
32
34
  ) -> Select:
35
+ """
36
+ Note: the query does not include `.order_by`.
37
+ """
33
38
  stm = (
34
39
  select(HistoryImageCache.zarr_url, HistoryUnit.status)
35
40
  .join(HistoryUnit)
36
41
  .where(HistoryImageCache.dataset_id == dataset_id)
37
42
  .where(HistoryImageCache.workflowtask_id == workflowtask_id)
38
43
  .where(HistoryImageCache.latest_history_unit_id == HistoryUnit.id)
39
- .where(HistoryImageCache.zarr_url.in_(zarr_urls))
40
- .order_by(HistoryImageCache.zarr_url)
41
44
  )
42
45
  return stm
43
46
 
44
47
 
45
- async def enrich_images_async(
48
+ def _postprocess_image_lists(
49
+ target_images: list[dict[str, Any]],
50
+ list_query_url_status: list[tuple[str, str]],
51
+ ) -> list[dict[str, Any]]:
52
+ """ """
53
+ t_1 = time.perf_counter()
54
+
55
+ # Select only processed images that are part of the target image set
56
+ zarr_url_to_image = {img["zarr_url"]: img for img in target_images}
57
+ target_zarr_urls = zarr_url_to_image.keys()
58
+ list_processed_url_status = [
59
+ url_status
60
+ for url_status in list_query_url_status
61
+ if url_status[0] in target_zarr_urls
62
+ ]
63
+
64
+ set_processed_urls = set(
65
+ url_status[0] for url_status in list_processed_url_status
66
+ )
67
+ processed_images_with_status = [
68
+ _enriched_image(
69
+ img=zarr_url_to_image[item[0]],
70
+ status=item[1],
71
+ )
72
+ for item in list_processed_url_status
73
+ ]
74
+
75
+ non_processed_urls = target_zarr_urls - set_processed_urls
76
+ non_processed_images_with_status = [
77
+ _enriched_image(
78
+ img=zarr_url_to_image[zarr_url],
79
+ status=HistoryUnitStatusWithUnset.UNSET,
80
+ )
81
+ for zarr_url in non_processed_urls
82
+ ]
83
+ t_2 = time.perf_counter()
84
+ logger.debug(
85
+ f"[enrich_images_async] post-processing, elapsed={t_2 - t_1:.5f} s"
86
+ )
87
+
88
+ return processed_images_with_status + non_processed_images_with_status
89
+
90
+
91
+ async def enrich_images_unsorted_async(
46
92
  *,
47
93
  images: list[dict[str, Any]],
48
94
  dataset_id: int,
49
95
  workflowtask_id: int,
50
96
  db: AsyncSession,
51
- ) -> list[dict[str, ImageAttributeValue]]:
97
+ ) -> list[dict[str, Any]]:
52
98
  """
53
99
  Enrich images with a status-related attribute.
54
100
 
@@ -59,116 +105,75 @@ async def enrich_images_async(
59
105
  db: An async db session
60
106
 
61
107
  Returns:
62
- The list of enriched images
108
+ The list of enriched images, not necessarily in the same order as
109
+ the input.
63
110
  """
64
111
  t_0 = time.perf_counter()
65
112
  logger.info(
66
113
  f"[enrich_images_async] START, {dataset_id=}, {workflowtask_id=}"
67
114
  )
68
115
 
69
- zarr_url_to_image = {img["zarr_url"]: deepcopy(img) for img in images}
70
-
116
+ # Get `(zarr_url, status)` for _all_ processed images (including those that
117
+ # are not part of the target image set)
71
118
  res = await db.execute(
72
119
  _prepare_query(
73
120
  dataset_id=dataset_id,
74
121
  workflowtask_id=workflowtask_id,
75
- zarr_urls=zarr_url_to_image.keys(),
76
122
  )
77
123
  )
78
- list_processed_url_status = res.all()
124
+ list_query_url_status = res.all()
79
125
  t_1 = time.perf_counter()
80
- logger.debug(f"[enrich_images_async] db-query, elapsed={t_1 - t_0:.3f} s")
126
+ logger.debug(f"[enrich_images_async] query, elapsed={t_1 - t_0:.5f} s")
81
127
 
82
- set_processed_urls = set(item[0] for item in list_processed_url_status)
83
- processed_images_with_status = [
84
- _enriched_image(
85
- img=zarr_url_to_image[item[0]],
86
- status=item[1],
87
- )
88
- for item in list_processed_url_status
89
- ]
90
- t_2 = time.perf_counter()
91
- logger.debug(
92
- "[enrich_images_async] processed-images, " f"elapsed={t_2 - t_1:.3f} s"
93
- )
94
-
95
- non_processed_urls = zarr_url_to_image.keys() - set_processed_urls
96
- non_processed_images_with_status = [
97
- _enriched_image(
98
- img=zarr_url_to_image[zarr_url],
99
- status=HistoryUnitStatusWithUnset.UNSET,
100
- )
101
- for zarr_url in non_processed_urls
102
- ]
103
- t_3 = time.perf_counter()
104
- logger.debug(
105
- "[enrich_images_async] non-processed-images, "
106
- f"elapsed={t_3 - t_2:.3f} s"
128
+ output = _postprocess_image_lists(
129
+ target_images=images,
130
+ list_query_url_status=list_query_url_status,
107
131
  )
108
132
 
109
- return processed_images_with_status + non_processed_images_with_status
133
+ return output
110
134
 
111
135
 
112
- def enrich_images_sync(
136
+ def enrich_images_unsorted_sync(
113
137
  *,
114
138
  images: list[dict[str, Any]],
115
139
  dataset_id: int,
116
140
  workflowtask_id: int,
117
- ) -> list[dict[str, ImageAttributeValue]]:
141
+ ) -> list[dict[str, Any]]:
118
142
  """
119
143
  Enrich images with a status-related attribute.
120
144
 
145
+
121
146
  Args:
122
147
  images: The input image list
123
148
  dataset_id: The dataset ID
124
149
  workflowtask_id: The workflow-task ID
125
150
 
126
151
  Returns:
127
- The list of enriched images
152
+ The list of enriched images, not necessarily in the same order as
153
+ the input.
128
154
  """
155
+
129
156
  t_0 = time.perf_counter()
130
157
  logger.info(
131
158
  f"[enrich_images_async] START, {dataset_id=}, {workflowtask_id=}"
132
159
  )
133
160
 
134
- zarr_url_to_image = {img["zarr_url"]: deepcopy(img) for img in images}
161
+ # Get `(zarr_url, status)` for _all_ processed images (including those that
162
+ # are not part of the target image set)
135
163
  with next(get_sync_db()) as db:
136
164
  res = db.execute(
137
165
  _prepare_query(
138
166
  dataset_id=dataset_id,
139
167
  workflowtask_id=workflowtask_id,
140
- zarr_urls=zarr_url_to_image.keys(),
141
168
  )
142
169
  )
143
- list_processed_url_status = res.all()
170
+ list_query_url_status = res.all()
144
171
  t_1 = time.perf_counter()
145
- logger.debug(f"[enrich_images_async] db-query, elapsed={t_1 - t_0:.3f} s")
146
-
147
- set_processed_urls = set(item[0] for item in list_processed_url_status)
148
- processed_images_with_status = [
149
- _enriched_image(
150
- img=zarr_url_to_image[item[0]],
151
- status=item[1],
152
- )
153
- for item in list_processed_url_status
154
- ]
155
- t_2 = time.perf_counter()
156
- logger.debug(
157
- "[enrich_images_async] processed-images, " f"elapsed={t_2 - t_1:.3f} s"
158
- )
172
+ logger.debug(f"[enrich_images_async] query, elapsed={t_1 - t_0:.5f} s")
159
173
 
160
- non_processed_urls = zarr_url_to_image.keys() - set_processed_urls
161
- non_processed_images_with_status = [
162
- _enriched_image(
163
- img=zarr_url_to_image[zarr_url],
164
- status=HistoryUnitStatusWithUnset.UNSET,
165
- )
166
- for zarr_url in non_processed_urls
167
- ]
168
- t_3 = time.perf_counter()
169
- logger.debug(
170
- "[enrich_images_async] non-processed-images, "
171
- f"elapsed={t_3 - t_2:.3f} s"
174
+ output = _postprocess_image_lists(
175
+ target_images=images,
176
+ list_query_url_status=list_query_url_status,
172
177
  )
173
178
 
174
- return processed_images_with_status + non_processed_images_with_status
179
+ return output
@@ -0,0 +1,41 @@
1
+ """Add indices
2
+
3
+ Revision ID: 791ce783d3d8
4
+ Revises: 969d84257cac
5
+ Create Date: 2025-06-03 09:32:30.757651
6
+
7
+ """
8
+ from alembic import op
9
+
10
+
11
+ # revision identifiers, used by Alembic.
12
+ revision = "791ce783d3d8"
13
+ down_revision = "969d84257cac"
14
+ branch_labels = None
15
+ depends_on = None
16
+
17
+
18
+ def upgrade() -> None:
19
+ # ### commands auto generated by Alembic - please adjust! ###
20
+ with op.batch_alter_table("historyimagecache", schema=None) as batch_op:
21
+ batch_op.create_index(
22
+ batch_op.f("ix_historyimagecache_dataset_id"),
23
+ ["dataset_id"],
24
+ unique=False,
25
+ )
26
+ batch_op.create_index(
27
+ batch_op.f("ix_historyimagecache_workflowtask_id"),
28
+ ["workflowtask_id"],
29
+ unique=False,
30
+ )
31
+
32
+ # ### end Alembic commands ###
33
+
34
+
35
+ def downgrade() -> None:
36
+ # ### commands auto generated by Alembic - please adjust! ###
37
+ with op.batch_alter_table("historyimagecache", schema=None) as batch_op:
38
+ batch_op.drop_index(batch_op.f("ix_historyimagecache_workflowtask_id"))
39
+ batch_op.drop_index(batch_op.f("ix_historyimagecache_dataset_id"))
40
+
41
+ # ### end Alembic commands ###
@@ -642,6 +642,9 @@ class FractalSSHList:
642
642
  connect_kwargs={
643
643
  "key_filename": key_path,
644
644
  "look_for_keys": False,
645
+ "banner_timeout": 30,
646
+ "auth_timeout": 30, # default value
647
+ "channel_timeout": 60 * 60, # default value
645
648
  },
646
649
  )
647
650
  with _acquire_lock_with_timeout(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: fractal-server
3
- Version: 2.14.15
3
+ Version: 2.14.16
4
4
  Summary: Backend component of the Fractal analytics platform
5
5
  License: BSD-3-Clause
6
6
  Author: Tommaso Comparin
@@ -11,16 +11,16 @@ Classifier: Programming Language :: Python :: 3
11
11
  Classifier: Programming Language :: Python :: 3.11
12
12
  Classifier: Programming Language :: Python :: 3.12
13
13
  Requires-Dist: alembic (>=1.13.1,<2.0.0)
14
- Requires-Dist: cryptography (>=44.0.1,<44.1.0)
14
+ Requires-Dist: cryptography (>=45.0.3,<45.1.0)
15
15
  Requires-Dist: fabric (>=3.2.2,<3.3.0)
16
16
  Requires-Dist: fastapi (>=0.115.0,<0.116.0)
17
17
  Requires-Dist: fastapi-users[oauth] (>=14,<15)
18
18
  Requires-Dist: gunicorn (>=23.0,<24.0)
19
- Requires-Dist: packaging (>=24.0.0,<25.0.0)
19
+ Requires-Dist: packaging (>=25.0.0,<26.0.0)
20
20
  Requires-Dist: psycopg[binary] (>=3.1.0,<4.0.0)
21
21
  Requires-Dist: pydantic (>=2.11.0,<2.12.0)
22
22
  Requires-Dist: pydantic-settings (>=2.7.0)
23
- Requires-Dist: python-dotenv (>=1.0.0,<1.1.0)
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
26
  Requires-Dist: uvicorn (>=0.29.0,<0.35.0)
@@ -1,4 +1,4 @@
1
- fractal_server/__init__.py,sha256=1lO5LXhx8fwsKnWQVdnMtEvVmWkDE9cZ0L2RpkoG0O8,24
1
+ fractal_server/__init__.py,sha256=gwWAj4n6TyJ-oQRbdVm1m1OqN5wobWHCuIFtGE6bVzs,24
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
@@ -11,7 +11,7 @@ fractal_server/app/models/user_settings.py,sha256=RxzRBGLHF_wc5csrTeHGUSV77Md_X0
11
11
  fractal_server/app/models/v2/__init__.py,sha256=vjHwek7-IXmaZZL9VF0nD30YL9ca4wNc8P4RXJK_kDc,832
12
12
  fractal_server/app/models/v2/accounting.py,sha256=i-2TsjqyuclxFQ21C-TeDoss7ZBTRuXdzIJfVr2UxwE,1081
13
13
  fractal_server/app/models/v2/dataset.py,sha256=B_bPnYCSLRFN-vBIOc5nJ31JTruQPxLda9mqpPIJmGk,1209
14
- fractal_server/app/models/v2/history.py,sha256=XsaUb2HNIfVekaxfdpFOG2Y6q5QyTm1SO2shl8dLYQ0,2123
14
+ fractal_server/app/models/v2/history.py,sha256=CBN2WVg9vW5pHU1RP8TkB_nnJrwnuifCcxgnd53UtEE,2163
15
15
  fractal_server/app/models/v2/job.py,sha256=LfpwAedMVcA_6Ne0Rr4g3tt0asAQkWz3LSPm7IwZhYc,1978
16
16
  fractal_server/app/models/v2/project.py,sha256=RmU5BQR4HD6xifRndUhvPBy30wntml-giBRoEysdWXw,755
17
17
  fractal_server/app/models/v2/task.py,sha256=P7nsS5mCmVyzr4WtcjoiedesqkWvkHA2cQPsMbQt-7o,1427
@@ -37,10 +37,10 @@ fractal_server/app/routes/api/v2/_aux_functions_task_version_update.py,sha256=WL
37
37
  fractal_server/app/routes/api/v2/_aux_functions_tasks.py,sha256=MFYnyNPBACSHXTDLXe6cSennnpmlpajN84iivOOMW7Y,11599
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=BEmf_ENF5HNMy8yXrxRdo4280rWuRUa1Jw4u8R9-LQQ,15477
40
+ fractal_server/app/routes/api/v2/history.py,sha256=BHBZYFSF5lw-YYOl0OVV5yEZPMxiqjH72_KwR66EtaE,15495
41
41
  fractal_server/app/routes/api/v2/images.py,sha256=TS1ltUhP0_SaViupdHrSh3MLDi5OVk-lOhE1VCVyZj0,7869
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=122MlfYwBBIw39bo9b3xuhvzBG20olPvjCzudAxX8H4,4909
43
+ fractal_server/app/routes/api/v2/pre_submission_checks.py,sha256=2jaaM5WJBTGpOWhm6a42JViT8j4X5hixltxIY1p-188,4936
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
46
  fractal_server/app/routes/api/v2/submit.py,sha256=_BDkWtFdo8-p7kZ0Oxaidei04MfuBeaEsWtwJaKZQ_Y,8781
@@ -86,7 +86,7 @@ fractal_server/app/runner/executors/slurm_common/remote.py,sha256=xWnI6WktHR_7cx
86
86
  fractal_server/app/runner/executors/slurm_common/slurm_job_task_models.py,sha256=K4SdJOKsUWzDlnkb8Ug_UmTx6nBMsTqn9_oKqwE4XDI,3520
87
87
  fractal_server/app/runner/executors/slurm_ssh/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
88
88
  fractal_server/app/runner/executors/slurm_ssh/run_subprocess.py,sha256=SyW6t4egvbiARph2YkFjc88Hj94fCamZVi50L7ph8VM,996
89
- fractal_server/app/runner/executors/slurm_ssh/runner.py,sha256=fCovzTP5jrun5yRh4O67gtw3D4g2hMynQziu8pu1mk4,7872
89
+ fractal_server/app/runner/executors/slurm_ssh/runner.py,sha256=Hzq01rLgOEzS6UPMzW59d4Ox-wwHlxyPF1KiKcGQvIM,7993
90
90
  fractal_server/app/runner/executors/slurm_ssh/tar_commands.py,sha256=g173siyv7qtjov5i-CjTVRT8d19ibK8re3RVWbsdHYA,1845
91
91
  fractal_server/app/runner/executors/slurm_sudo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
92
92
  fractal_server/app/runner/executors/slurm_sudo/_subprocess_run_as_user.py,sha256=W-FxnVcHxMGpv4zGgJVttVQoweyGgR4uBxO22QIZkp0,2576
@@ -102,7 +102,7 @@ fractal_server/app/runner/v2/_slurm_sudo.py,sha256=Gvsh4tUlc1_3KdF3B7zEqs-YIntC_
102
102
  fractal_server/app/runner/v2/db_tools.py,sha256=du5dKhMMFMErQXbGIgu9JvO_vtMensodyPsyDeqz1yQ,3324
103
103
  fractal_server/app/runner/v2/deduplicate_list.py,sha256=IVTE4abBU1bUprFTkxrTfYKnvkNTanWQ-KWh_etiT08,645
104
104
  fractal_server/app/runner/v2/merge_outputs.py,sha256=D1L4Taieq9i71SPQyNc1kMokgHh-sV_MqF3bv7QMDBc,907
105
- fractal_server/app/runner/v2/runner.py,sha256=vi5AAHl-MZwq0FMMCfdgzXv4DB8cCDWsAqvTdpaXh9Q,18972
105
+ fractal_server/app/runner/v2/runner.py,sha256=84aEfpMMEXxCWyhJckGpkC9REEoBNnV_MshAMuwKZlE,18990
106
106
  fractal_server/app/runner/v2/runner_functions.py,sha256=aEwEDzI2l-QvgfJSj-M2LGvqA89nOiJYIFVryKEq_3M,18988
107
107
  fractal_server/app/runner/v2/submit_workflow.py,sha256=AMnXdozwIGlXD55ch0_SNAG-ntKBO-QRhkbInrvsShU,13140
108
108
  fractal_server/app/runner/v2/task_interface.py,sha256=V2TWBK6tbhycyMrJvFaoJ9IpuKlrLrvmjJbfNMsBBXo,2527
@@ -136,7 +136,7 @@ fractal_server/exceptions.py,sha256=7ftpWwNsTQmNonWCynhH5ErUh1haPPhIaVPrNHla7-o,
136
136
  fractal_server/gunicorn_fractal.py,sha256=u6U01TLGlXgq1v8QmEpLih3QnsInZD7CqphgJ_GrGzc,1230
137
137
  fractal_server/images/__init__.py,sha256=-_wjoKtSX02P1KjDxDP_EXKvmbONTRmbf7iGVTsyBpM,154
138
138
  fractal_server/images/models.py,sha256=6WchcIzLLLwdkLNRfg71Dl4Y-9UFLPyrrzh1lWgjuP0,1245
139
- fractal_server/images/status_tools.py,sha256=tLp-Sojlhf-eQ97O1hj-2fg2zmgHfED9EXkec3Jjz_0,5141
139
+ fractal_server/images/status_tools.py,sha256=KICcThwHniHNkDftzJmK_n2gQK2IeTKlR_PFAesf204,4912
140
140
  fractal_server/images/tools.py,sha256=92kmt2Fnyp8ycTbyuar9_U8kJTi0wKpBk8ZagARWl9Y,4177
141
141
  fractal_server/logger.py,sha256=QIeVn3QpZsiIL2jDdrKotr-MLyDcZYgiPiTluFU46lE,5317
142
142
  fractal_server/main.py,sha256=FD9KzTTsXTQnTW0z3Hu7y0Nj_oAkBeZEInKDXFd4hjE,4561
@@ -155,6 +155,7 @@ fractal_server/migrations/versions/50a13d6138fd_initial_schema.py,sha256=zwXegXs
155
155
  fractal_server/migrations/versions/5bf02391cfef_v2.py,sha256=axhNkr_H6R4rRbY7oGYazNbFvPXeSyBDWFVbKNmiqs8,8433
156
156
  fractal_server/migrations/versions/70e77f1c38b0_add_applyworkflow_first_task_index_and_.py,sha256=Q-DsMzG3IcUV2Ol1dhJWosDvKERamBE6QvA2zzS5zpQ,1632
157
157
  fractal_server/migrations/versions/71eefd1dd202_add_slurm_accounts.py,sha256=mbWuCkTpRAdGbRhW7lhXs_e5S6O37UAcCN6JfoY5H8A,1353
158
+ fractal_server/migrations/versions/791ce783d3d8_add_indices.py,sha256=gNE6AgJgeJZY99Fbd336Z9see3gRMQvuNBC0xDk_5sw,1154
158
159
  fractal_server/migrations/versions/84bf0fffde30_add_dumps_to_applyworkflow.py,sha256=NSCuhANChsg76vBkShBl-9tQ4VEHubOjtAv1etHhlvY,2684
159
160
  fractal_server/migrations/versions/8e8f227a3e36_update_taskv2_post_2_7_0.py,sha256=68y9-fpSuKx6KPtM_9n8Ho0I1qwa8IoG-yJqXUYQrGg,1111
160
161
  fractal_server/migrations/versions/8f79bd162e35_add_docs_info_and_docs_link_to_task_.py,sha256=6pgODDtyAxevZvAJBj9IJ41inhV1RpwbpZr_qfPPu1A,1115
@@ -181,7 +182,7 @@ fractal_server/migrations/versions/f384e1c0cf5d_drop_task_default_args_columns.p
181
182
  fractal_server/migrations/versions/fbce16ff4e47_new_history_items.py,sha256=TDWCaIoM0Q4SpRWmR9zr_rdp3lJXhCfBPTMhtrP5xYE,3950
182
183
  fractal_server/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
183
184
  fractal_server/ssh/__init__.py,sha256=sVUmzxf7_DuXG1xoLQ1_00fo5NPhi2LJipSmU5EAkPs,124
184
- fractal_server/ssh/_fabric.py,sha256=RDvAi6x-v4aPqSGpN4-Ee-ZQONGa-EIjU52PXjDAI-o,23991
185
+ fractal_server/ssh/_fabric.py,sha256=AK5E2LXVv0fNilSCy4Zufh0D5QdMozL4OtvNKgMSli4,24155
185
186
  fractal_server/string_tools.py,sha256=qLB5u6-4QxXPiZrUeWn_cEo47axj4OXFzDd47kNTIWw,1847
186
187
  fractal_server/syringe.py,sha256=3YJeIALH-wibuJ9R5VMNYUWh7x1-MkWT0SqGcWG5MY8,2795
187
188
  fractal_server/tasks/__init__.py,sha256=kadmVUoIghl8s190_Tt-8f-WBqMi8u8oU4Pvw39NHE8,23
@@ -216,8 +217,8 @@ fractal_server/types/validators/_workflow_task_arguments_validators.py,sha256=HL
216
217
  fractal_server/urls.py,sha256=QjIKAC1a46bCdiPMu3AlpgFbcv6a4l3ABcd5xz190Og,471
217
218
  fractal_server/utils.py,sha256=Vn35lApt1T1J8nc09sAVqd10Cy0sa3dLipcljI-hkuk,2185
218
219
  fractal_server/zip_tools.py,sha256=tqz_8f-vQ9OBRW-4OQfO6xxY-YInHTyHmZxU7U4PqZo,4885
219
- fractal_server-2.14.15.dist-info/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
220
- fractal_server-2.14.15.dist-info/METADATA,sha256=Sz4teXD8HvAhlbNjhwBKfOiswHcP47lMAIMnHK6puVU,4244
221
- fractal_server-2.14.15.dist-info/WHEEL,sha256=7dDg4QLnNKTvwIDR9Ac8jJaAmBC_owJrckbC0jjThyA,88
222
- fractal_server-2.14.15.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
223
- fractal_server-2.14.15.dist-info/RECORD,,
220
+ fractal_server-2.14.16.dist-info/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
221
+ fractal_server-2.14.16.dist-info/METADATA,sha256=ose9XmKdvMaW1w7zsAUu1gIEy62J4B8OxawPGpmLNrs,4244
222
+ fractal_server-2.14.16.dist-info/WHEEL,sha256=7dDg4QLnNKTvwIDR9Ac8jJaAmBC_owJrckbC0jjThyA,88
223
+ fractal_server-2.14.16.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
224
+ fractal_server-2.14.16.dist-info/RECORD,,