fractal-server 2.11.0a0__py3-none-any.whl → 2.11.0a2__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 (34) hide show
  1. fractal_server/__init__.py +1 -1
  2. fractal_server/app/models/v2/dataset.py +9 -6
  3. fractal_server/app/models/v2/job.py +5 -0
  4. fractal_server/app/models/v2/workflowtask.py +5 -8
  5. fractal_server/app/routes/api/v2/_aux_functions.py +3 -10
  6. fractal_server/app/routes/api/v2/images.py +29 -6
  7. fractal_server/app/routes/api/v2/submit.py +5 -1
  8. fractal_server/app/routes/api/v2/workflowtask.py +3 -3
  9. fractal_server/app/runner/v2/__init__.py +1 -0
  10. fractal_server/app/runner/v2/_local/__init__.py +5 -0
  11. fractal_server/app/runner/v2/_local_experimental/__init__.py +5 -0
  12. fractal_server/app/runner/v2/_slurm_ssh/__init__.py +7 -3
  13. fractal_server/app/runner/v2/_slurm_sudo/__init__.py +5 -0
  14. fractal_server/app/runner/v2/merge_outputs.py +13 -16
  15. fractal_server/app/runner/v2/runner.py +33 -34
  16. fractal_server/app/runner/v2/task_interface.py +41 -2
  17. fractal_server/app/schemas/_filter_validators.py +47 -0
  18. fractal_server/app/schemas/_validators.py +13 -2
  19. fractal_server/app/schemas/v2/dataset.py +58 -12
  20. fractal_server/app/schemas/v2/dumps.py +6 -8
  21. fractal_server/app/schemas/v2/job.py +14 -0
  22. fractal_server/app/schemas/v2/task.py +9 -9
  23. fractal_server/app/schemas/v2/task_group.py +2 -2
  24. fractal_server/app/schemas/v2/workflowtask.py +42 -19
  25. fractal_server/data_migrations/2_11_0.py +67 -0
  26. fractal_server/images/__init__.py +0 -1
  27. fractal_server/images/models.py +12 -35
  28. fractal_server/images/tools.py +29 -13
  29. fractal_server/migrations/versions/db09233ad13a_split_filters_and_keep_old_columns.py +96 -0
  30. {fractal_server-2.11.0a0.dist-info → fractal_server-2.11.0a2.dist-info}/METADATA +1 -1
  31. {fractal_server-2.11.0a0.dist-info → fractal_server-2.11.0a2.dist-info}/RECORD +34 -31
  32. {fractal_server-2.11.0a0.dist-info → fractal_server-2.11.0a2.dist-info}/LICENSE +0 -0
  33. {fractal_server-2.11.0a0.dist-info → fractal_server-2.11.0a2.dist-info}/WHEEL +0 -0
  34. {fractal_server-2.11.0a0.dist-info → fractal_server-2.11.0a2.dist-info}/entry_points.txt +0 -0
@@ -3,15 +3,16 @@ from typing import Optional
3
3
  from typing import Union
4
4
 
5
5
  from pydantic import BaseModel
6
- from pydantic import Extra
7
6
  from pydantic import Field
8
7
  from pydantic import validator
9
8
 
10
- from fractal_server.app.schemas._validators import valdictkeys
9
+ from fractal_server.app.schemas._validators import valdict_keys
11
10
  from fractal_server.urls import normalize_url
12
11
 
12
+ AttributeFiltersType = dict[str, Optional[list[Any]]]
13
13
 
14
- class SingleImageBase(BaseModel):
14
+
15
+ class _SingleImageBase(BaseModel):
15
16
  """
16
17
  Base for SingleImage and SingleImageTaskOutput.
17
18
 
@@ -30,9 +31,9 @@ class SingleImageBase(BaseModel):
30
31
 
31
32
  # Validators
32
33
  _attributes = validator("attributes", allow_reuse=True)(
33
- valdictkeys("attributes")
34
+ valdict_keys("attributes")
34
35
  )
35
- _types = validator("types", allow_reuse=True)(valdictkeys("types"))
36
+ _types = validator("types", allow_reuse=True)(valdict_keys("types"))
36
37
 
37
38
  @validator("zarr_url")
38
39
  def normalize_zarr_url(cls, v: str) -> str:
@@ -44,7 +45,7 @@ class SingleImageBase(BaseModel):
44
45
  return normalize_url(v)
45
46
 
46
47
 
47
- class SingleImageTaskOutput(SingleImageBase):
48
+ class SingleImageTaskOutput(_SingleImageBase):
48
49
  """
49
50
  `SingleImageBase`, with scalar `attributes` values (`None` included).
50
51
  """
@@ -63,7 +64,7 @@ class SingleImageTaskOutput(SingleImageBase):
63
64
  return v
64
65
 
65
66
 
66
- class SingleImage(SingleImageBase):
67
+ class SingleImage(_SingleImageBase):
67
68
  """
68
69
  `SingleImageBase`, with scalar `attributes` values (`None` excluded).
69
70
  """
@@ -83,8 +84,8 @@ class SingleImage(SingleImageBase):
83
84
 
84
85
  class SingleImageUpdate(BaseModel):
85
86
  zarr_url: str
86
- attributes: Optional[dict[str, Any]]
87
- types: Optional[dict[str, bool]]
87
+ attributes: Optional[dict[str, Any]] = None
88
+ types: Optional[dict[str, bool]] = None
88
89
 
89
90
  @validator("zarr_url")
90
91
  def normalize_zarr_url(cls, v: str) -> str:
@@ -96,7 +97,7 @@ class SingleImageUpdate(BaseModel):
96
97
  ) -> dict[str, Union[int, float, str, bool]]:
97
98
  if v is not None:
98
99
  # validate keys
99
- valdictkeys("attributes")(v)
100
+ valdict_keys("attributes")(v)
100
101
  # validate values
101
102
  for key, value in v.items():
102
103
  if not isinstance(value, (int, float, str, bool)):
@@ -107,28 +108,4 @@ class SingleImageUpdate(BaseModel):
107
108
  )
108
109
  return v
109
110
 
110
- _types = validator("types", allow_reuse=True)(valdictkeys("types"))
111
-
112
-
113
- class Filters(BaseModel, extra=Extra.forbid):
114
- attributes: dict[str, Any] = Field(default_factory=dict)
115
- types: dict[str, bool] = Field(default_factory=dict)
116
-
117
- # Validators
118
- _attributes = validator("attributes", allow_reuse=True)(
119
- valdictkeys("attributes")
120
- )
121
- _types = validator("types", allow_reuse=True)(valdictkeys("types"))
122
-
123
- @validator("attributes")
124
- def validate_attributes(
125
- cls, v: dict[str, Any]
126
- ) -> dict[str, Union[int, float, str, bool, None]]:
127
- for key, value in v.items():
128
- if not isinstance(value, (int, float, str, bool, type(None))):
129
- raise ValueError(
130
- f"Filters.attributes[{key}] must be a scalar "
131
- "(int, float, str, bool, or None). "
132
- f"Given {value} ({type(value)})"
133
- )
134
- return v
111
+ _types = validator("types", allow_reuse=True)(valdict_keys("types"))
@@ -4,8 +4,7 @@ from typing import Literal
4
4
  from typing import Optional
5
5
  from typing import Union
6
6
 
7
- from fractal_server.images import Filters
8
-
7
+ from fractal_server.images.models import AttributeFiltersType
9
8
 
10
9
  ImageSearch = dict[Literal["image", "index"], Union[int, dict[str, Any]]]
11
10
 
@@ -33,52 +32,69 @@ def find_image_by_zarr_url(
33
32
  return dict(image=copy(images[ind]), index=ind)
34
33
 
35
34
 
36
- def match_filter(image: dict[str, Any], filters: Filters) -> bool:
35
+ def match_filter(
36
+ *,
37
+ image: dict[str, Any],
38
+ type_filters: dict[str, bool],
39
+ attribute_filters: AttributeFiltersType,
40
+ ) -> bool:
37
41
  """
38
42
  Find whether an image matches a filter set.
39
43
 
40
44
  Arguments:
41
45
  image: A single image.
42
- filters: A set of filters.
46
+ type_filters:
47
+ attribute_filters:
43
48
 
44
49
  Returns:
45
50
  Whether the image matches the filter set.
46
51
  """
52
+
47
53
  # Verify match with types (using a False default)
48
- for key, value in filters.types.items():
54
+ for key, value in type_filters.items():
49
55
  if image["types"].get(key, False) != value:
50
56
  return False
51
- # Verify match with attributes (only for non-None filters)
52
- for key, value in filters.attributes.items():
53
- if value is None:
57
+
58
+ # Verify match with attributes (only for not-None filters)
59
+ for key, values in attribute_filters.items():
60
+ if values is None:
54
61
  continue
55
- if image["attributes"].get(key) != value:
62
+ if image["attributes"].get(key) not in values:
56
63
  return False
64
+
57
65
  return True
58
66
 
59
67
 
60
68
  def filter_image_list(
61
69
  images: list[dict[str, Any]],
62
- filters: Filters,
70
+ type_filters: Optional[dict[str, bool]] = None,
71
+ attribute_filters: Optional[AttributeFiltersType] = None,
63
72
  ) -> list[dict[str, Any]]:
64
73
  """
65
74
  Compute a sublist with images that match a filter set.
66
75
 
67
76
  Arguments:
68
77
  images: A list of images.
69
- filters: A set of filters.
78
+ type_filters:
79
+ attribute_filters:
70
80
 
71
81
  Returns:
72
82
  List of the `images` elements which match the filter set.
73
83
  """
74
84
 
75
85
  # When no filter is provided, return all images
76
- if filters.attributes == {} and filters.types == {}:
86
+ if type_filters is None and attribute_filters is None:
77
87
  return images
88
+ actual_type_filters = type_filters or {}
89
+ actual_attribute_filters = attribute_filters or {}
78
90
 
79
91
  filtered_images = [
80
92
  copy(this_image)
81
93
  for this_image in images
82
- if match_filter(this_image, filters=filters)
94
+ if match_filter(
95
+ image=this_image,
96
+ type_filters=actual_type_filters,
97
+ attribute_filters=actual_attribute_filters,
98
+ )
83
99
  ]
84
100
  return filtered_images
@@ -0,0 +1,96 @@
1
+ """split filters and keep old columns
2
+
3
+ Revision ID: db09233ad13a
4
+ Revises: 316140ff7ee1
5
+ Create Date: 2025-01-14 14:50:46.007222
6
+
7
+ """
8
+ import sqlalchemy as sa
9
+ from alembic import op
10
+ from sqlalchemy.dialects import postgresql
11
+
12
+ # revision identifiers, used by Alembic.
13
+ revision = "db09233ad13a"
14
+ down_revision = "316140ff7ee1"
15
+ branch_labels = None
16
+ depends_on = None
17
+
18
+
19
+ def upgrade() -> None:
20
+ # ### commands auto generated by Alembic - please adjust! ###
21
+ with op.batch_alter_table("datasetv2", schema=None) as batch_op:
22
+ batch_op.add_column(
23
+ sa.Column(
24
+ "type_filters", sa.JSON(), server_default="{}", nullable=False
25
+ )
26
+ )
27
+ batch_op.add_column(
28
+ sa.Column(
29
+ "attribute_filters",
30
+ sa.JSON(),
31
+ server_default="{}",
32
+ nullable=False,
33
+ )
34
+ )
35
+ batch_op.alter_column(
36
+ "filters",
37
+ existing_type=postgresql.JSON(astext_type=sa.Text()),
38
+ nullable=True,
39
+ server_default="null",
40
+ )
41
+
42
+ with op.batch_alter_table("jobv2", schema=None) as batch_op:
43
+ batch_op.add_column(
44
+ sa.Column(
45
+ "attribute_filters",
46
+ sa.JSON(),
47
+ server_default="{}",
48
+ nullable=False,
49
+ )
50
+ )
51
+
52
+ with op.batch_alter_table("workflowtaskv2", schema=None) as batch_op:
53
+ batch_op.add_column(
54
+ sa.Column(
55
+ "type_filters", sa.JSON(), server_default="{}", nullable=False
56
+ )
57
+ )
58
+ batch_op.alter_column(
59
+ "input_filters",
60
+ existing_type=postgresql.JSON(astext_type=sa.Text()),
61
+ nullable=True,
62
+ server_default="null",
63
+ )
64
+
65
+ # ### end Alembic commands ###
66
+
67
+
68
+ def downgrade() -> None:
69
+ # ### commands auto generated by Alembic - please adjust! ###
70
+ with op.batch_alter_table("workflowtaskv2", schema=None) as batch_op:
71
+ batch_op.alter_column(
72
+ "input_filters",
73
+ existing_type=postgresql.JSON(astext_type=sa.Text()),
74
+ nullable=False,
75
+ existing_server_default=sa.text(
76
+ '\'{"attributes": {}, "types": {}}\'::json'
77
+ ),
78
+ )
79
+ batch_op.drop_column("type_filters")
80
+
81
+ with op.batch_alter_table("jobv2", schema=None) as batch_op:
82
+ batch_op.drop_column("attribute_filters")
83
+
84
+ with op.batch_alter_table("datasetv2", schema=None) as batch_op:
85
+ batch_op.alter_column(
86
+ "filters",
87
+ existing_type=postgresql.JSON(astext_type=sa.Text()),
88
+ nullable=False,
89
+ existing_server_default=sa.text(
90
+ '\'{"attributes": {}, "types": {}}\'::json'
91
+ ),
92
+ )
93
+ batch_op.drop_column("attribute_filters")
94
+ batch_op.drop_column("type_filters")
95
+
96
+ # ### end Alembic commands ###
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: fractal-server
3
- Version: 2.11.0a0
3
+ Version: 2.11.0a2
4
4
  Summary: Backend 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=mDKrGJqt2VCe76rX51KUhjV5LzNikbT0m0A7-304kpM,25
1
+ fractal_server/__init__.py,sha256=cLEMnMolltFsZpt1oovn_8aqXHHx58LNsl6plIarbDM,25
2
2
  fractal_server/__main__.py,sha256=D2YTmSowmXNyvqOjW_HeItCZT2UliWlySl_owicaZg0,8026
3
3
  fractal_server/alembic.ini,sha256=MWwi7GzjzawI9cCAK1LW7NxIBQDUqD12-ptJoq5JpP0,3153
4
4
  fractal_server/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -16,13 +16,13 @@ fractal_server/app/models/v1/state.py,sha256=m9gMZqqnm3oDpJNJp-Lht4kM7oO7pcEI7sL
16
16
  fractal_server/app/models/v1/task.py,sha256=uFXam7eu3Ye1Yt7_g7llCzY8BetmDRilsq5hR2C1Zbg,2640
17
17
  fractal_server/app/models/v1/workflow.py,sha256=dnY5eMaOe3oZv8arn00RNX9qVkBtTLG-vYdWXcQuyo4,3950
18
18
  fractal_server/app/models/v2/__init__.py,sha256=63THGEZQlxWcosGCI74SEvJU7wOoOn1j1byTjf4NFOI,526
19
- fractal_server/app/models/v2/dataset.py,sha256=-7sxHEw4IIAvF_uSan7tA3o8hvoakBkQ0SRvqS2iOQU,1455
20
- fractal_server/app/models/v2/job.py,sha256=ypJmN-qspkKBGhBG7Mt-HypSQqcQ2EmB4Bzzb2-y550,1535
19
+ fractal_server/app/models/v2/dataset.py,sha256=gO_V_Fsmw44uB1Nc6MLBVOGxQeutxpDi8nvhhwkggbE,1696
20
+ fractal_server/app/models/v2/job.py,sha256=BMmu5oXdZvN7jEIAMZvQMB3PQBcCYzxn6Qm6HdRWre4,1725
21
21
  fractal_server/app/models/v2/project.py,sha256=rAHoh5KfYwIaW7rTX0_O0jvWmxEvfo1BafvmcXuSSRk,786
22
22
  fractal_server/app/models/v2/task.py,sha256=jebD28Pz8tGcsWCItxj6uKjcD8BMMnnU8dqYhvhEB6c,1520
23
23
  fractal_server/app/models/v2/task_group.py,sha256=Sd-fb7EN18eOxrS-RT4ekczLWp-tQcbX5C4LrcmjoIM,3443
24
24
  fractal_server/app/models/v2/workflow.py,sha256=YBgFGCziUgU0aJ5EM3Svu9W2c46AewZO9VBlFCHiSps,1069
25
- fractal_server/app/models/v2/workflowtask.py,sha256=iDuJYk8kp4PNqGmbKRtGI7y-QsbjkNd_gDsbMzL4i-g,1274
25
+ fractal_server/app/models/v2/workflowtask.py,sha256=nidHo87GNgMVvL2WDm0HOfGLwGY3m65GTDAInwbqk1Q,1312
26
26
  fractal_server/app/routes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
27
  fractal_server/app/routes/admin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
28
  fractal_server/app/routes/admin/v1.py,sha256=ggJZMeKhRijfVe2h2VzfIcpR15FqkKImANhkTXl0mSk,12908
@@ -43,15 +43,15 @@ fractal_server/app/routes/api/v1/task_collection.py,sha256=5EMh3yhS1Z4x25kp5Iaxa
43
43
  fractal_server/app/routes/api/v1/workflow.py,sha256=2T93DuEnSshaDCue-JPmjuvGCtbk6lt9pFMuPt783t8,11217
44
44
  fractal_server/app/routes/api/v1/workflowtask.py,sha256=OYYConwJbmNULDw5I3T-UbSJKrbbBiAHbbBeVcpoFKQ,5785
45
45
  fractal_server/app/routes/api/v2/__init__.py,sha256=w4c9WzagaVV5d4TWBX5buu5ENk8jf3YftMQYmhavz9Q,2172
46
- fractal_server/app/routes/api/v2/_aux_functions.py,sha256=mb4R_qqFxeW0LAis2QJIIfVx8Sydv1jTYaRIMsMxnIk,11720
46
+ fractal_server/app/routes/api/v2/_aux_functions.py,sha256=NJ6_1biN_hhIEK1w8Vj6XhLmdkQ5kMVd_MX5JC_nHLU,11524
47
47
  fractal_server/app/routes/api/v2/_aux_functions_task_lifecycle.py,sha256=c8eqPXdMhc3nIixX50B1Ka5n7LgbOZm2JbEs7lICQ04,6767
48
48
  fractal_server/app/routes/api/v2/_aux_functions_tasks.py,sha256=PuapLtvSk9yhBAsKNEp1w2oagOMr0YZTo247-CU3hdM,11008
49
49
  fractal_server/app/routes/api/v2/dataset.py,sha256=Y6uZz--YSEGgnPYu05rZ9sr1Ug08bNl2v1h3VeApBe8,9441
50
- fractal_server/app/routes/api/v2/images.py,sha256=JR1rR6qEs81nacjriOXAOBQjAbCXF4Ew7M7mkWdxBU0,7920
50
+ fractal_server/app/routes/api/v2/images.py,sha256=EI2Gu4vNVepXDBRjQLtU2Il3ciQSY9fpEyIsGEm8UVU,8845
51
51
  fractal_server/app/routes/api/v2/job.py,sha256=Bga2Kz1OjvDIdxZObWaaXVhNIhC_5JKhKRjEH2_ayEE,5157
52
52
  fractal_server/app/routes/api/v2/project.py,sha256=eWYFJ7F2ZYQcpi-_n-rhPF-Q4gJhzYBsVGYFhHZZXAE,6653
53
53
  fractal_server/app/routes/api/v2/status.py,sha256=_cDZW-ESYw6zpf-lLFFqko5bLpKhqKrCM6yv1OfqxN4,6300
54
- fractal_server/app/routes/api/v2/submit.py,sha256=cQwt0oK8xjHMGA_bQrw4Um8jd_aCvgmWfoqSQDh12hQ,8246
54
+ fractal_server/app/routes/api/v2/submit.py,sha256=Vxvqgu9nh0UCAXEYGEl_XvEfudCrvl_H2nmZwvsFzTo,8429
55
55
  fractal_server/app/routes/api/v2/task.py,sha256=K0ik33t7vL8BAK5S7fqyJDNdRK4stGqb_73bSa8tvPE,7159
56
56
  fractal_server/app/routes/api/v2/task_collection.py,sha256=9p8w9UnN6RFszC1ohy9Uo3I4HIMVdfD8fYGWuQqzxMU,12682
57
57
  fractal_server/app/routes/api/v2/task_collection_custom.py,sha256=cctW61-C2QYF2KXluS15lLhZJS_kt30Ca6UGLFO32z0,6207
@@ -59,7 +59,7 @@ fractal_server/app/routes/api/v2/task_group.py,sha256=4o2N0z7jK7VUVlJZMM4GveCCc4
59
59
  fractal_server/app/routes/api/v2/task_group_lifecycle.py,sha256=3o9bCC8ubMwffQPPaxQZy-CjH9IB2RkIReIecI6L2_w,9300
60
60
  fractal_server/app/routes/api/v2/workflow.py,sha256=vjCNRzMHaAB4YWbAEWGlELHXDN4GjtE26IkIiB15RGM,8682
61
61
  fractal_server/app/routes/api/v2/workflow_import.py,sha256=-7Er3FWGF_1xI2qHFO9gfLVQAok5bojd7mbzQxa9Ofw,10858
62
- fractal_server/app/routes/api/v2/workflowtask.py,sha256=dh8IxFSx50dY7kXldr9vC_NdQrFqv_heefOuZBX-7XE,10714
62
+ fractal_server/app/routes/api/v2/workflowtask.py,sha256=NueHDKbrPWxP4Jo2hpBvuU_XBCccAyoeZOBNybF74zg,10709
63
63
  fractal_server/app/routes/auth/__init__.py,sha256=fao6CS0WiAjHDTvBzgBVV_bSXFpEAeDBF6Z6q7rRkPc,1658
64
64
  fractal_server/app/routes/auth/_aux_auth.py,sha256=ifkNocTYatBSMYGwiR14qohmvR9SfMldceiEj6uJBrU,4783
65
65
  fractal_server/app/routes/auth/current_user.py,sha256=I3aVY5etWAJ_SH6t65Mj5TjvB2X8sAGuu1KG7FxLyPU,5883
@@ -110,31 +110,32 @@ fractal_server/app/runner/v1/_slurm/_submit_setup.py,sha256=KO9c694d318adoPQh9UG
110
110
  fractal_server/app/runner/v1/_slurm/get_slurm_config.py,sha256=6pQNNx997bLIfLp0guF09t_O0ZYRXnbEGLktSAcKnic,5999
111
111
  fractal_server/app/runner/v1/common.py,sha256=_L-vjLnWato80VdlB_BFN4G8P4jSM07u-5cnl1T3S34,3294
112
112
  fractal_server/app/runner/v1/handle_failed_job.py,sha256=R8IsM_ucX0_lqFCly8BYuzf-VAVafE5wj_1JXapnxeQ,4696
113
- fractal_server/app/runner/v2/__init__.py,sha256=txN9kUugjxZZqLZ8CReXz5JHDK_0MJQvkVSlaMIPI_E,15184
114
- fractal_server/app/runner/v2/_local/__init__.py,sha256=bgN-fUYh6rgZSrBaCThNi2A5naOAIqeynQy_B6r7iu4,5529
113
+ fractal_server/app/runner/v2/__init__.py,sha256=s28z04JgwdXsvd5nA87NBTLza-syEar-TsvZQp6M8wI,15241
114
+ fractal_server/app/runner/v2/_local/__init__.py,sha256=QilCzO5E26E48pFViBDGTU5NDB2AgehROQNJgQCZREU,5799
115
115
  fractal_server/app/runner/v2/_local/_local_config.py,sha256=9oi209Dlp35ANfxb_DISqmMKKc6DPaMsmYVWbZLseME,3630
116
116
  fractal_server/app/runner/v2/_local/_submit_setup.py,sha256=MucNOo8Er0F5ZIwH7CnTeXgnFMc6d3pKPkv563QNVi0,1630
117
117
  fractal_server/app/runner/v2/_local/executor.py,sha256=QrJlD77G6q4WohoJQO7XXbvi2RlCUsNvMnPDEZIoAqA,3620
118
- fractal_server/app/runner/v2/_local_experimental/__init__.py,sha256=Gb8AmDoZ1Q2b79eLNv8ZW4KNFqihuaiN5zBWbP619ZU,5247
118
+ fractal_server/app/runner/v2/_local_experimental/__init__.py,sha256=-_s4pi0mF1tthvWGCZr8lqNSzPOXEnWrcYZrXO2_bUc,5521
119
119
  fractal_server/app/runner/v2/_local_experimental/_local_config.py,sha256=QiS5ODe-iGmUQdIT8QgpbyMc7-ZpIRv1V_f2q3qfPQ8,3211
120
120
  fractal_server/app/runner/v2/_local_experimental/_submit_setup.py,sha256=we7r-sQf0CJ9gxbfbgHcYdC6pKjx8eXweljIjthxkv8,1212
121
121
  fractal_server/app/runner/v2/_local_experimental/executor.py,sha256=plvEqqdcXOSohYsQoykYlyDwCING7OO5h-4XAZtwdPs,5503
122
122
  fractal_server/app/runner/v2/_slurm_common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
123
123
  fractal_server/app/runner/v2/_slurm_common/get_slurm_config.py,sha256=UdkoFF0HF_TdKbay-d9bjkxT2ltcOE5i8H_FoOu64HU,6202
124
- fractal_server/app/runner/v2/_slurm_ssh/__init__.py,sha256=ZeiXWoex96FcvG8DZQ5PJPJ922-QZC_XWegJxWtm1rk,4147
124
+ fractal_server/app/runner/v2/_slurm_ssh/__init__.py,sha256=51XQJANan0DrL63LMK3Kfzx5QXPKcYSwiVgBy0IsNCM,4416
125
125
  fractal_server/app/runner/v2/_slurm_ssh/_submit_setup.py,sha256=a5_FDPH_yxYmrjAjMRLgh_Y4DSG3mRslCLQodGM3-t4,2838
126
- fractal_server/app/runner/v2/_slurm_sudo/__init__.py,sha256=dOwfDItdcM1pS99xxemwePpjxqy8zAU-pCmmIm4u1io,3930
126
+ fractal_server/app/runner/v2/_slurm_sudo/__init__.py,sha256=sGc1wGMPD6yQv6-MmTTGmHoXq-PRzEoJKoajjYl8N4c,4200
127
127
  fractal_server/app/runner/v2/_slurm_sudo/_submit_setup.py,sha256=a5_FDPH_yxYmrjAjMRLgh_Y4DSG3mRslCLQodGM3-t4,2838
128
128
  fractal_server/app/runner/v2/deduplicate_list.py,sha256=-imwO7OB7ATADEnqVbTElUwoY0YIJCTf_SbWJNN9OZg,639
129
129
  fractal_server/app/runner/v2/handle_failed_job.py,sha256=-zFWw4d208bQEFUF_sAdH2LdHEARyg1FC8BENr1SjhU,2045
130
- fractal_server/app/runner/v2/merge_outputs.py,sha256=IHuHqbKmk97K35BFvTrKVBs60z3e_--OzXTnsvmA02c,1281
131
- fractal_server/app/runner/v2/runner.py,sha256=u-AhvSrZ_ca18LEOgJTwnXapvNq0OnRjbwOsM7NAvcw,12964
130
+ fractal_server/app/runner/v2/merge_outputs.py,sha256=DW1d-fT0UcSnJUmz8xfU-AEeI7p_G0aQ_lNpDAe9C2o,1226
131
+ fractal_server/app/runner/v2/runner.py,sha256=tdEjF2SWwDKXCHXz0wFRtKTRCG2I5BSjuqY08YSjMHs,12906
132
132
  fractal_server/app/runner/v2/runner_functions.py,sha256=BLREIcQaE6FSc2AEJyZuiYk6rGazEz_9gprUqUZDljs,9488
133
133
  fractal_server/app/runner/v2/runner_functions_low_level.py,sha256=1fWvQ6YZUUnDhO_mipXC5hnaT-zK-GHxg8ayoxZX82k,3648
134
- fractal_server/app/runner/v2/task_interface.py,sha256=hT3p-bRGsLNAR_dNv_PYFoqzIF_EQtSsGwl38j1haYA,1824
134
+ fractal_server/app/runner/v2/task_interface.py,sha256=DU0fppTqvwhVkKwjPvfWPuZt09rV7AV2U5Vpu5CRqX8,3268
135
135
  fractal_server/app/runner/versions.py,sha256=dSaPRWqmFPHjg20kTCHmi_dmGNcCETflDtDLronNanU,852
136
136
  fractal_server/app/schemas/__init__.py,sha256=stURAU_t3AOBaH0HSUbV-GKhlPKngnnIMoqWc3orFyI,135
137
- fractal_server/app/schemas/_validators.py,sha256=T5EswIJAJRvawfzqWtPcN2INAfiBXyE4m0iwQm4ht-0,3149
137
+ fractal_server/app/schemas/_filter_validators.py,sha256=9oGzf1yghFkIMbzluvxeRCjPei8V7dn7ot4ggQUmz8w,1731
138
+ fractal_server/app/schemas/_validators.py,sha256=3dotVxUHWKAmUO3aeoluYDLRKrw1OS-NxcZ4Fg_HOYk,3560
138
139
  fractal_server/app/schemas/user.py,sha256=icjox9gK_invW44Nh_L4CvqfRa92qghyQhmevyg09nQ,2243
139
140
  fractal_server/app/schemas/user_group.py,sha256=t30Kd07PY43G_AqFDb8vjdInTeLeU9WvFZDx8fVLPSI,1750
140
141
  fractal_server/app/schemas/user_settings.py,sha256=re7ZFS8BLjR9MdIoZNRt2DNPc7znCgDpEYFKr8ZsAZg,2980
@@ -149,27 +150,28 @@ fractal_server/app/schemas/v1/task.py,sha256=7BxOZ_qoRQ8n3YbQpDvB7VMcxB5fSYQmR5R
149
150
  fractal_server/app/schemas/v1/task_collection.py,sha256=uvq9bcMaGD_qHsh7YtcpoSAkVAbw12eY4DocIO3MKOg,3057
150
151
  fractal_server/app/schemas/v1/workflow.py,sha256=oRKamLSuAgrTcv3gMMxGcotDloLL2c3NNgPA39UEmmM,4467
151
152
  fractal_server/app/schemas/v2/__init__.py,sha256=IT2a6fbRx3rt8h6jri_4gZWzTN9EVXewiWoIuBcZ-xA,2618
152
- fractal_server/app/schemas/v2/dataset.py,sha256=zRlcO0wDZahTW1PINdVEuARZ7GZUuEqqop7UdE3-5do,2470
153
- fractal_server/app/schemas/v2/dumps.py,sha256=s6dg-pHZFui6t2Ktm0SMxjKDN-v-ZqBHz9iTsBQF3eU,1712
154
- fractal_server/app/schemas/v2/job.py,sha256=42V-bFfMvysRplwTKGsL_WshAVsWSM6yjFqypxwrY3k,3020
153
+ fractal_server/app/schemas/v2/dataset.py,sha256=qf8JtNbJUSeCTNlR0dXu9iIpkSEM_18StUmc7hcSXls,4049
154
+ fractal_server/app/schemas/v2/dumps.py,sha256=Yiyma6pMnEk1c-Ekf0e-IWgM20_R4qWyHuoqfdc6brE,1635
155
+ fractal_server/app/schemas/v2/job.py,sha256=qIisYTznE1mU6z65zxbOqSTOlkeFvncqbFLzyVyN12Y,3589
155
156
  fractal_server/app/schemas/v2/manifest.py,sha256=Uqtd7DbyOkf9bxBOKkU7Sv7nToBIFGUcfjY7rd5iO7c,6981
156
157
  fractal_server/app/schemas/v2/project.py,sha256=ABv9LSLVCq1QYthEhBvZOTn_4DFEC-7cH28tFGFdM7I,589
157
158
  fractal_server/app/schemas/v2/status.py,sha256=SQaUpQkjFq5c5k5J4rOjNhuQaDOEg8lksPhkKmPU5VU,332
158
- fractal_server/app/schemas/v2/task.py,sha256=FFAbYwDlqowB8gVMdjFVPVHvAM0T89PYLixUth49xfQ,6870
159
+ fractal_server/app/schemas/v2/task.py,sha256=9W4xe-p19pbLpjsNJrYVIMpkrlwuCxGAJNO_gl0TfMc,6879
159
160
  fractal_server/app/schemas/v2/task_collection.py,sha256=9c_yyFcVBXdAZpQQniy1bROhYnQT7G1BflOpMY1joPE,6250
160
- fractal_server/app/schemas/v2/task_group.py,sha256=EPQ1WHjIA8WDrpsTfvfRESjwUVzu6jKiaKZx45b36N4,3215
161
+ fractal_server/app/schemas/v2/task_group.py,sha256=zZfvAH7c3MZC4_An09TMuOkNE_e1Z9XsYEnmN-axHdU,3217
161
162
  fractal_server/app/schemas/v2/workflow.py,sha256=-KWvXnbHBFA3pj5n7mfSyLKJQSqkJmoziIEe7mpLl3M,1875
162
- fractal_server/app/schemas/v2/workflowtask.py,sha256=FthKErVgx3a-k7WVk3nqJe1G-fl_iHND4rVrDXJ0F84,5942
163
+ fractal_server/app/schemas/v2/workflowtask.py,sha256=EBmKuLmQeXsM-20DAOWFSxu3EPXRAb5RV66tkGRAiF8,6686
163
164
  fractal_server/app/security/__init__.py,sha256=qn6idYgl-p5HWea0gTVnz4JnkoxGEkmQjPzvKpDWT0I,14035
164
165
  fractal_server/app/security/signup_email.py,sha256=DrL51UdTSrgjleynMD5CRZwTSOpPrZ96fasRV0fvxDE,1165
165
166
  fractal_server/app/user_settings.py,sha256=OP1yiYKtPadxwM51_Q0hdPk3z90TCN4z1BLpQsXyWiU,1316
166
167
  fractal_server/config.py,sha256=9rAzw7OO6ZeHEz-I8NJHuGoHf4xCHxfFLyRNZQD9ytY,27019
168
+ fractal_server/data_migrations/2_11_0.py,sha256=PPFg1GxpfW5hElwzr_kx0_fYuEaNSyH23uCxztExO14,2411
167
169
  fractal_server/data_migrations/README.md,sha256=_3AEFvDg9YkybDqCLlFPdDmGJvr6Tw7HRI14aZ3LOIw,398
168
170
  fractal_server/data_migrations/tools.py,sha256=LeMeASwYGtEqd-3wOLle6WARdTGAimoyMmRbbJl-hAM,572
169
171
  fractal_server/gunicorn_fractal.py,sha256=u6U01TLGlXgq1v8QmEpLih3QnsInZD7CqphgJ_GrGzc,1230
170
- fractal_server/images/__init__.py,sha256=xO6jTLE4EZKO6cTDdJsBmK9cdeh9hFTaSbSuWgQg7y4,196
171
- fractal_server/images/models.py,sha256=UlWazUOFQtpS3pZuROjcJXviG_Ai453jqUDHdzuvD5w,4170
172
- fractal_server/images/tools.py,sha256=gxeniYy4Z-cp_ToK2LHPJUTVVUUrdpogYdcBUvBuLiY,2209
172
+ fractal_server/images/__init__.py,sha256=-_wjoKtSX02P1KjDxDP_EXKvmbONTRmbf7iGVTsyBpM,154
173
+ fractal_server/images/models.py,sha256=fAecChXhs4utRX4123Lgz5e_b_H0YtHrvNHCenR7tOs,3359
174
+ fractal_server/images/tools.py,sha256=VFjm5pCOWjc2ms0t0s4nH6bK53ZU867JDL5oTEm4M1Q,2648
173
175
  fractal_server/logger.py,sha256=zwg_AjIHkNP0ruciXjm5lI5UFP3n6tMHullsM9lDjz4,5039
174
176
  fractal_server/main.py,sha256=gStLT9Du5QMpc9SyvRvtKU21EKwp-dG4HL3zGHzE06A,4908
175
177
  fractal_server/migrations/env.py,sha256=9t_OeKVlhM8WRcukmTrLbWNup-imiBGP_9xNgwCbtpI,2730
@@ -197,6 +199,7 @@ fractal_server/migrations/versions/a7f4d6137b53_add_workflow_dump_to_applyworkfl
197
199
  fractal_server/migrations/versions/d256a7379ab8_taskgroup_activity_and_venv_info_to_.py,sha256=HN3_Pk8G81SzdYjg4K1RZAyjKSlsZGvcYE2nWOUbwxQ,3861
198
200
  fractal_server/migrations/versions/d4fe3708d309_make_applyworkflow_workflow_dump_non_.py,sha256=6cHEZFuTXiQg9yu32Y3RH1XAl71av141WQ6UMbiITIg,949
199
201
  fractal_server/migrations/versions/da2cb2ac4255_user_group_viewer_paths.py,sha256=yGWSA2HIHUybcVy66xBITk08opV2DFYSCIIrulaUZhI,901
202
+ fractal_server/migrations/versions/db09233ad13a_split_filters_and_keep_old_columns.py,sha256=NumyjvciIjgShLZcmpDvh3ggJxnc-W1kc7vofrpcNOs,2906
200
203
  fractal_server/migrations/versions/e75cac726012_make_applyworkflow_start_timestamp_not_.py,sha256=lOggSvzGWqQvnxxFuSM6W50Ui49R918A-uBuiZJ0pNM,963
201
204
  fractal_server/migrations/versions/efa89c30e0a4_add_project_timestamp_created.py,sha256=jilQW3QIqYQ4Q6hCnUiG7UtNMpA41ujqrB3tPFiPM1Q,1221
202
205
  fractal_server/migrations/versions/f384e1c0cf5d_drop_task_default_args_columns.py,sha256=9BwqUS9Gf7UW_KjrzHbtViC880qhD452KAytkHWWZyk,746
@@ -238,8 +241,8 @@ fractal_server/tasks/v2/utils_templates.py,sha256=07TZpJ0Mh_A4lXVXrrH2o1VLFFGwxe
238
241
  fractal_server/urls.py,sha256=QjIKAC1a46bCdiPMu3AlpgFbcv6a4l3ABcd5xz190Og,471
239
242
  fractal_server/utils.py,sha256=utvmBx8K9I8hRWFquxna2pBaOqe0JifDL_NVPmihEJI,3525
240
243
  fractal_server/zip_tools.py,sha256=GjDgo_sf6V_DDg6wWeBlZu5zypIxycn_l257p_YVKGc,4876
241
- fractal_server-2.11.0a0.dist-info/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
242
- fractal_server-2.11.0a0.dist-info/METADATA,sha256=aeiYrMcHVQT6PdF1ZBf1VXrLNlHNMjxDWQ_WJYNxElI,4564
243
- fractal_server-2.11.0a0.dist-info/WHEEL,sha256=RaoafKOydTQ7I_I3JTrPCg6kUmTgtm4BornzOqyEfJ8,88
244
- fractal_server-2.11.0a0.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
245
- fractal_server-2.11.0a0.dist-info/RECORD,,
244
+ fractal_server-2.11.0a2.dist-info/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
245
+ fractal_server-2.11.0a2.dist-info/METADATA,sha256=JeUj4i-iNqKHT2UD0H9a7WuGNmEM44jzbD79zjsvf-Q,4564
246
+ fractal_server-2.11.0a2.dist-info/WHEEL,sha256=RaoafKOydTQ7I_I3JTrPCg6kUmTgtm4BornzOqyEfJ8,88
247
+ fractal_server-2.11.0a2.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
248
+ fractal_server-2.11.0a2.dist-info/RECORD,,