fractal-server 2.15.9__py3-none-any.whl → 2.15.10a1__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 (24) hide show
  1. fractal_server/__init__.py +1 -1
  2. fractal_server/app/models/v2/job.py +1 -0
  3. fractal_server/app/models/v2/task_group.py +44 -18
  4. fractal_server/app/routes/api/v2/task_collection.py +19 -8
  5. fractal_server/app/runner/executors/base_runner.py +2 -0
  6. fractal_server/app/runner/executors/slurm_common/base_slurm_runner.py +57 -0
  7. fractal_server/app/runner/v2/runner.py +12 -1
  8. fractal_server/app/runner/v2/submit_workflow.py +2 -0
  9. fractal_server/app/schemas/v2/dumps.py +2 -1
  10. fractal_server/app/schemas/v2/job.py +1 -0
  11. fractal_server/app/schemas/v2/task_collection.py +17 -7
  12. fractal_server/app/schemas/v2/task_group.py +4 -2
  13. fractal_server/config.py +0 -5
  14. fractal_server/migrations/versions/0f5f85bb2ae7_add_pre_pinned_packages.py +39 -0
  15. fractal_server/migrations/versions/1a83a5260664_rename.py +31 -0
  16. fractal_server/migrations/versions/981d588fe248_add_executor_error_log.py +39 -0
  17. fractal_server/tasks/v2/templates/2_pip_install.sh +21 -10
  18. fractal_server/tasks/v2/templates/6_pip_install_from_freeze.sh +1 -3
  19. fractal_server/tasks/v2/utils_templates.py +5 -5
  20. {fractal_server-2.15.9.dist-info → fractal_server-2.15.10a1.dist-info}/METADATA +1 -1
  21. {fractal_server-2.15.9.dist-info → fractal_server-2.15.10a1.dist-info}/RECORD +24 -21
  22. {fractal_server-2.15.9.dist-info → fractal_server-2.15.10a1.dist-info}/LICENSE +0 -0
  23. {fractal_server-2.15.9.dist-info → fractal_server-2.15.10a1.dist-info}/WHEEL +0 -0
  24. {fractal_server-2.15.9.dist-info → fractal_server-2.15.10a1.dist-info}/entry_points.txt +0 -0
@@ -1 +1 @@
1
- __VERSION__ = "2.15.9"
1
+ __VERSION__ = "2.15.10a1"
@@ -55,6 +55,7 @@ class JobV2(SQLModel, table=True):
55
55
  )
56
56
  status: str = JobStatusTypeV2.SUBMITTED
57
57
  log: str | None = None
58
+ executor_error_log: str | None = None
58
59
 
59
60
  attribute_filters: AttributeFilters = Field(
60
61
  sa_column=Column(JSONB, nullable=False, server_default="{}")
@@ -12,6 +12,24 @@ from .task import TaskV2
12
12
  from fractal_server.utils import get_timestamp
13
13
 
14
14
 
15
+ def _check_origin_not_pixi(origin: str):
16
+ """
17
+ Raise `ValueError` if `origin=="pixi"`
18
+ """
19
+ if origin == "pixi":
20
+ raise ValueError(f"Cannot call 'pip_install_string' if {origin=}.")
21
+
22
+
23
+ def _create_dependency_string(pinned_versions: dict[str, str]) -> str:
24
+ """
25
+ Expand e.g. `{"a": "1.2", "b": "3"}` into `"a==1.2 b==3"`.
26
+ """
27
+ output = " ".join(
28
+ [f"{key}=={value}" for key, value in pinned_versions.items()]
29
+ )
30
+ return output
31
+
32
+
15
33
  class TaskGroupV2(SQLModel, table=True):
16
34
  id: int | None = Field(default=None, primary_key=True)
17
35
  task_list: list[TaskV2] = Relationship(
@@ -33,7 +51,15 @@ class TaskGroupV2(SQLModel, table=True):
33
51
  path: str | None = None
34
52
  archive_path: str | None = None
35
53
  pip_extras: str | None = None
36
- pinned_package_versions: dict[str, str] = Field(
54
+ pinned_package_versions_pre: dict[str, str] = Field(
55
+ sa_column=Column(
56
+ JSONB,
57
+ server_default="{}",
58
+ default={},
59
+ nullable=True,
60
+ ),
61
+ )
62
+ pinned_package_versions_post: dict[str, str] = Field(
37
63
  sa_column=Column(
38
64
  JSONB,
39
65
  server_default="{}",
@@ -67,10 +93,7 @@ class TaskGroupV2(SQLModel, table=True):
67
93
  """
68
94
  Prepare string to be used in `python -m pip install`.
69
95
  """
70
- if self.origin == "pixi":
71
- raise ValueError(
72
- f"Cannot call 'pip_install_string' if {self.origin=}."
73
- )
96
+ _check_origin_not_pixi(self.origin)
74
97
 
75
98
  extras = f"[{self.pip_extras}]" if self.pip_extras is not None else ""
76
99
 
@@ -85,24 +108,27 @@ class TaskGroupV2(SQLModel, table=True):
85
108
  return f"{self.pkg_name}{extras}=={self.version}"
86
109
 
87
110
  @property
88
- def pinned_package_versions_string(self) -> str:
111
+ def pinned_package_versions_pre_string(self) -> str:
112
+ """
113
+ Prepare string to be used in `python -m pip install`.
114
+ """
115
+ _check_origin_not_pixi(self.origin)
116
+
117
+ if self.pinned_package_versions_pre is None:
118
+ return ""
119
+ output = _create_dependency_string(self.pinned_package_versions_pre)
120
+ return output
121
+
122
+ @property
123
+ def pinned_package_versions_post_string(self) -> str:
89
124
  """
90
125
  Prepare string to be used in `python -m pip install`.
91
126
  """
92
- if self.origin == "pixi":
93
- raise ValueError(
94
- "Cannot call 'pinned_package_versions_string' if "
95
- f"{self.origin=}."
96
- )
127
+ _check_origin_not_pixi(self.origin)
97
128
 
98
- if self.pinned_package_versions is None:
129
+ if self.pinned_package_versions_post is None:
99
130
  return ""
100
- output = " ".join(
101
- [
102
- f"{key}=={value}"
103
- for key, value in self.pinned_package_versions.items()
104
- ]
105
- )
131
+ output = _create_dependency_string(self.pinned_package_versions_post)
106
132
  return output
107
133
 
108
134
 
@@ -108,7 +108,8 @@ def parse_request_data(
108
108
  package_version: str | None = Form(None),
109
109
  package_extras: str | None = Form(None),
110
110
  python_version: str | None = Form(None),
111
- pinned_package_versions: str | None = Form(None),
111
+ pinned_package_versions_pre: str | None = Form(None),
112
+ pinned_package_versions_post: str | None = Form(None),
112
113
  file: UploadFile | None = File(None),
113
114
  ) -> CollectionRequestData:
114
115
  """
@@ -117,9 +118,14 @@ def parse_request_data(
117
118
 
118
119
  try:
119
120
  # Convert dict_pinned_pkg from a JSON string into a Python dictionary
120
- dict_pinned_pkg = (
121
- json.loads(pinned_package_versions)
122
- if pinned_package_versions
121
+ dict_pinned_pkg_pre = (
122
+ json.loads(pinned_package_versions_pre)
123
+ if pinned_package_versions_pre
124
+ else None
125
+ )
126
+ dict_pinned_pkg_post = (
127
+ json.loads(pinned_package_versions_post)
128
+ if pinned_package_versions_post
123
129
  else None
124
130
  )
125
131
  # Validate and coerce form data
@@ -128,7 +134,8 @@ def parse_request_data(
128
134
  package_version=package_version,
129
135
  package_extras=package_extras,
130
136
  python_version=python_version,
131
- pinned_package_versions=dict_pinned_pkg,
137
+ pinned_package_versions_pre=dict_pinned_pkg_pre,
138
+ pinned_package_versions_post=dict_pinned_pkg_post,
132
139
  )
133
140
 
134
141
  data = CollectionRequestData(
@@ -198,10 +205,14 @@ async def collect_tasks_pip(
198
205
  task_group_attrs["pip_extras"] = task_collect.package_extras
199
206
 
200
207
  # Set pinned_package_versions
201
- if task_collect.pinned_package_versions is not None:
208
+ if task_collect.pinned_package_versions_pre is not None:
209
+ task_group_attrs[
210
+ "pinned_package_versions_pre"
211
+ ] = task_collect.pinned_package_versions_pre
212
+ if task_collect.pinned_package_versions_post is not None:
202
213
  task_group_attrs[
203
- "pinned_package_versions"
204
- ] = task_collect.pinned_package_versions
214
+ "pinned_package_versions_post"
215
+ ] = task_collect.pinned_package_versions_post
205
216
 
206
217
  # Initialize wheel_file_content as None
207
218
  wheel_file = None
@@ -39,6 +39,8 @@ class BaseRunner:
39
39
  Base class for Fractal runners.
40
40
  """
41
41
 
42
+ executor_error_log: str | None = None
43
+
42
44
  def submit(
43
45
  self,
44
46
  base_command: str,
@@ -517,6 +517,48 @@ class BaseSlurmRunner(BaseRunner):
517
517
  Path(task.input_file_local).unlink(missing_ok=True)
518
518
  Path(task.output_file_local).unlink(missing_ok=True)
519
519
 
520
+ def _extract_slurm_error(self, slurm_job: SlurmJob) -> str | None:
521
+ """
522
+ Extract stderr of SLURM job, or `None`.
523
+
524
+ Note: this method reads the _local_ stderr file, and then it should
525
+ always be called _after_ fetching remote artifacts (e.g. in an SSH
526
+ deployment).
527
+ """
528
+
529
+ stderr_path = slurm_job.slurm_stderr_local_path
530
+
531
+ if not stderr_path.exists():
532
+ return None
533
+
534
+ try:
535
+ with open(stderr_path) as f:
536
+ stderr_content = f.read().strip()
537
+ if stderr_content:
538
+ return stderr_content
539
+ except Exception as e:
540
+ logger.error(f"Failed to read SLURM stderr file: {e}")
541
+
542
+ return None
543
+
544
+ def _set_executor_error_log(self, slurm_jobs: list[SlurmJob]) -> None:
545
+ """
546
+ If `executor_error_log` is unset, update it based on a list of jobs.
547
+
548
+ Notes:
549
+ 1. This method must be executed **after** `_fetch_artifacts`.
550
+ 2. This method only captures the first error it finds.
551
+ """
552
+ if self.executor_error_log is not None:
553
+ # `executor_error_log` is already set, exit
554
+ return
555
+ for slurm_job in slurm_jobs:
556
+ slurm_error = self._extract_slurm_error(slurm_job)
557
+ if slurm_error is not None:
558
+ logger.warning(f"SLURM error detected: {slurm_error}")
559
+ self.executor_error_log = slurm_error
560
+ return
561
+
520
562
  def is_shutdown(self) -> bool:
521
563
  return self.shutdown_file.exists()
522
564
 
@@ -573,6 +615,9 @@ class BaseSlurmRunner(BaseRunner):
573
615
  ) -> tuple[Any, Exception]:
574
616
  logger.debug("[submit] START")
575
617
 
618
+ # Always refresh `executor_error_log` before starting a task
619
+ self.executor_error_log = None
620
+
576
621
  config = self._enrich_slurm_config(config)
577
622
 
578
623
  try:
@@ -658,7 +703,12 @@ class BaseSlurmRunner(BaseRunner):
658
703
  self.jobs[_slurm_job_id]
659
704
  for _slurm_job_id in finished_job_ids
660
705
  ]
706
+
661
707
  self._fetch_artifacts(finished_jobs)
708
+
709
+ # Extract SLURM errors
710
+ self._set_executor_error_log(finished_jobs)
711
+
662
712
  with next(get_sync_db()) as db:
663
713
  for slurm_job_id in finished_job_ids:
664
714
  logger.debug(f"[submit] Now process {slurm_job_id=}")
@@ -724,6 +774,9 @@ class BaseSlurmRunner(BaseRunner):
724
774
  input images, while for compound tasks these can differ.
725
775
  """
726
776
 
777
+ # Always refresh `executor_error_log` before starting a task
778
+ self.executor_error_log = None
779
+
727
780
  config = self._enrich_slurm_config(config)
728
781
 
729
782
  logger.debug(f"[multisubmit] START, {len(list_parameters)=}")
@@ -868,6 +921,7 @@ class BaseSlurmRunner(BaseRunner):
868
921
  finished_jobs = [
869
922
  self.jobs[_slurm_job_id] for _slurm_job_id in finished_job_ids
870
923
  ]
924
+
871
925
  fetch_artifacts_exception = None
872
926
  try:
873
927
  self._fetch_artifacts(finished_jobs)
@@ -879,6 +933,9 @@ class BaseSlurmRunner(BaseRunner):
879
933
  )
880
934
  fetch_artifacts_exception = e
881
935
 
936
+ # Extract SLURM errors
937
+ self._set_executor_error_log(finished_jobs)
938
+
882
939
  with next(get_sync_db()) as db:
883
940
  for slurm_job_id in finished_job_ids:
884
941
  logger.debug(f"[multisubmit] Now process {slurm_job_id=}")
@@ -22,6 +22,7 @@ from fractal_server.app.models.v2 import DatasetV2
22
22
  from fractal_server.app.models.v2 import HistoryImageCache
23
23
  from fractal_server.app.models.v2 import HistoryRun
24
24
  from fractal_server.app.models.v2 import HistoryUnit
25
+ from fractal_server.app.models.v2 import JobV2
25
26
  from fractal_server.app.models.v2 import TaskGroupV2
26
27
  from fractal_server.app.models.v2 import WorkflowTaskV2
27
28
  from fractal_server.app.runner.exceptions import JobExecutionError
@@ -210,8 +211,8 @@ def execute_tasks_v2(
210
211
  get_runner_config=get_runner_config,
211
212
  history_run_id=history_run_id,
212
213
  dataset_id=dataset.id,
213
- user_id=user_id,
214
214
  task_type=task.type,
215
+ user_id=user_id,
215
216
  )
216
217
  elif task.type == TaskType.PARALLEL:
217
218
  outcomes_dict, num_tasks = run_v2_task_parallel(
@@ -435,6 +436,16 @@ def execute_tasks_v2(
435
436
  db.commit()
436
437
  db.close() # NOTE: this is needed, but the reason is unclear
437
438
 
439
+ # Store the SLURM error in the job database
440
+ job_db = db.get(JobV2, job_id)
441
+ job_db.executor_error_log = runner.executor_error_log
442
+ logger.debug(
443
+ f"Setting JobV2[{job_id}].executor_error_log "
444
+ f"to '{job_db.executor_error_log}'."
445
+ )
446
+ db.merge(job_db)
447
+ db.commit()
448
+
438
449
  # Create accounting record
439
450
  record = AccountingRecord(
440
451
  user_id=user_id,
@@ -51,6 +51,7 @@ def fail_job(
51
51
  if emit_log:
52
52
  logger.error(log_msg)
53
53
  reset_logger_handlers(logger)
54
+ job = db.get(JobV2, job.id) # refetch, in case it was updated
54
55
  job.status = JobStatusTypeV2.FAILED
55
56
  job.end_timestamp = get_timestamp()
56
57
  job.log = log_msg
@@ -302,6 +303,7 @@ def submit_workflow(
302
303
  logger.debug(f'END workflow "{workflow.name}"')
303
304
 
304
305
  # Update job DB entry
306
+ job = db_sync.get(JobV2, job_id) # refetch, in case it was updated
305
307
  job.status = JobStatusTypeV2.DONE
306
308
  job.end_timestamp = get_timestamp()
307
309
  with log_file_path.open("r") as f:
@@ -82,7 +82,8 @@ class TaskGroupDumpV2(BaseModel):
82
82
  version: str | None = None
83
83
  python_version: str | None = None
84
84
  pip_extras: str | None = None
85
- pinned_package_versions: dict[str, str] = Field(default_factory=dict)
85
+ pinned_package_versions_pre: dict[str, str] = Field(default_factory=dict)
86
+ pinned_package_versions_post: dict[str, str] = Field(default_factory=dict)
86
87
 
87
88
  path: str | None = None
88
89
  venv_path: str | None = None
@@ -79,6 +79,7 @@ class JobReadV2(BaseModel):
79
79
  end_timestamp: AwareDatetime | None = None
80
80
  status: str
81
81
  log: str | None = None
82
+ executor_error_log: str | None = None
82
83
  working_dir: str | None = None
83
84
  working_dir_user: str | None = None
84
85
  first_task_index: int | None = None
@@ -39,10 +39,12 @@ class TaskCollectPipV2(BaseModel):
39
39
  package_version: Version of the package
40
40
  package_extras: Package extras to include in the `pip install` command
41
41
  python_version: Python version to install and run the package tasks
42
- pinned_package_versions:
43
- dictionary 'package':'version' used to pin versions for specific
44
- packages.
45
-
42
+ pinned_package_versions_pre:
43
+ dictionary 'package':'version' used to pre-pin versions for
44
+ specific packages.
45
+ pinned_package_versions_post:
46
+ dictionary 'package':'version' used to post-pin versions for
47
+ specific packages.
46
48
  """
47
49
 
48
50
  model_config = ConfigDict(extra="forbid")
@@ -52,10 +54,14 @@ class TaskCollectPipV2(BaseModel):
52
54
  python_version: Literal[
53
55
  "3.9", "3.10", "3.11", "3.12", "3.13"
54
56
  ] | None = None
55
- pinned_package_versions: DictStrStr | None = None
57
+ pinned_package_versions_pre: DictStrStr | None = None
58
+ pinned_package_versions_post: DictStrStr | None = None
56
59
 
57
60
  @field_validator(
58
- "package", "package_version", "package_extras", mode="after"
61
+ "package",
62
+ "package_version",
63
+ "package_extras",
64
+ mode="after",
59
65
  )
60
66
  @classmethod
61
67
  def validate_commands(cls, value):
@@ -63,7 +69,11 @@ class TaskCollectPipV2(BaseModel):
63
69
  validate_cmd(value)
64
70
  return value
65
71
 
66
- @field_validator("pinned_package_versions", mode="after")
72
+ @field_validator(
73
+ "pinned_package_versions_pre",
74
+ "pinned_package_versions_post",
75
+ mode="after",
76
+ )
67
77
  @classmethod
68
78
  def validate_pinned_package_versions(cls, value):
69
79
  if value is not None:
@@ -48,7 +48,8 @@ class TaskGroupCreateV2(BaseModel):
48
48
  archive_path: AbsolutePathStr = None
49
49
  pip_extras: NonEmptyStr = None
50
50
  env_info: str | None = None
51
- pinned_package_versions: DictStrStr = Field(default_factory=dict)
51
+ pinned_package_versions_pre: DictStrStr = Field(default_factory=dict)
52
+ pinned_package_versions_post: DictStrStr = Field(default_factory=dict)
52
53
 
53
54
 
54
55
  class TaskGroupCreateV2Strict(TaskGroupCreateV2):
@@ -78,7 +79,8 @@ class TaskGroupReadV2(BaseModel):
78
79
  venv_path: str | None = None
79
80
  archive_path: str | None = None
80
81
  pip_extras: str | None = None
81
- pinned_package_versions: dict[str, str] = Field(default_factory=dict)
82
+ pinned_package_versions_pre: dict[str, str] = Field(default_factory=dict)
83
+ pinned_package_versions_post: dict[str, str] = Field(default_factory=dict)
82
84
 
83
85
  venv_size_in_kB: int | None = None
84
86
  venv_file_number: int | None = None
fractal_server/config.py CHANGED
@@ -579,11 +579,6 @@ class Settings(BaseSettings):
579
579
  else:
580
580
  return "--no-cache-dir"
581
581
 
582
- FRACTAL_MAX_PIP_VERSION: str = "25.2"
583
- """
584
- Maximum value at which to update `pip` before performing task collection.
585
- """
586
-
587
582
  FRACTAL_VIEWER_AUTHORIZATION_SCHEME: Literal[
588
583
  "viewer-paths", "users-folders", "none"
589
584
  ] = "none"
@@ -0,0 +1,39 @@
1
+ """Add pre-pinned packages
2
+
3
+ Revision ID: 0f5f85bb2ae7
4
+ Revises: 1a83a5260664
5
+ Create Date: 2025-09-10 14:36:06.028179
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 = "0f5f85bb2ae7"
14
+ down_revision = "1a83a5260664"
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("taskgroupv2", schema=None) as batch_op:
22
+ batch_op.add_column(
23
+ sa.Column(
24
+ "pinned_package_versions_pre",
25
+ postgresql.JSONB(astext_type=sa.Text()),
26
+ server_default="{}",
27
+ nullable=True,
28
+ )
29
+ )
30
+
31
+ # ### end Alembic commands ###
32
+
33
+
34
+ def downgrade() -> None:
35
+ # ### commands auto generated by Alembic - please adjust! ###
36
+ with op.batch_alter_table("taskgroupv2", schema=None) as batch_op:
37
+ batch_op.drop_column("pinned_package_versions_pre")
38
+
39
+ # ### end Alembic commands ###
@@ -0,0 +1,31 @@
1
+ """Rename `pinned_package_versions`
2
+
3
+ Revision ID: 1a83a5260664
4
+ Revises: b3ffb095f973
5
+ Create Date: 2025-09-10 14:16:51.202765
6
+
7
+ """
8
+ from alembic import op
9
+
10
+
11
+ # revision identifiers, used by Alembic.
12
+ revision = "1a83a5260664"
13
+ down_revision = "b3ffb095f973"
14
+ branch_labels = None
15
+ depends_on = None
16
+
17
+
18
+ def upgrade() -> None:
19
+ with op.batch_alter_table("taskgroupv2", schema=None) as batch_op:
20
+ batch_op.alter_column(
21
+ column_name="pinned_package_versions",
22
+ new_column_name="pinned_package_versions_post",
23
+ )
24
+
25
+
26
+ def downgrade() -> None:
27
+ with op.batch_alter_table("taskgroupv2", schema=None) as batch_op:
28
+ batch_op.alter_column(
29
+ column_name="pinned_package_versions_post",
30
+ new_column_name="pinned_package_versions",
31
+ )
@@ -0,0 +1,39 @@
1
+ """Add executor error log
2
+
3
+ Revision ID: 981d588fe248
4
+ Revises: 0f5f85bb2ae7
5
+ Create Date: 2025-09-15 08:31:10.363449
6
+
7
+ """
8
+ import sqlalchemy as sa
9
+ import sqlmodel
10
+ from alembic import op
11
+
12
+
13
+ # revision identifiers, used by Alembic.
14
+ revision = "981d588fe248"
15
+ down_revision = "0f5f85bb2ae7"
16
+ branch_labels = None
17
+ depends_on = None
18
+
19
+
20
+ def upgrade() -> None:
21
+ # ### commands auto generated by Alembic - please adjust! ###
22
+ with op.batch_alter_table("jobv2", schema=None) as batch_op:
23
+ batch_op.add_column(
24
+ sa.Column(
25
+ "executor_error_log",
26
+ sqlmodel.sql.sqltypes.AutoString(),
27
+ nullable=True,
28
+ )
29
+ )
30
+
31
+ # ### end Alembic commands ###
32
+
33
+
34
+ def downgrade() -> None:
35
+ # ### commands auto generated by Alembic - please adjust! ###
36
+ with op.batch_alter_table("jobv2", schema=None) as batch_op:
37
+ batch_op.drop_column("executor_error_log")
38
+
39
+ # ### end Alembic commands ###
@@ -8,8 +8,8 @@ write_log(){
8
8
  # Variables to be filled within fractal-server
9
9
  PACKAGE_ENV_DIR=__PACKAGE_ENV_DIR__
10
10
  INSTALL_STRING="__INSTALL_STRING__"
11
- PINNED_PACKAGE_LIST="__PINNED_PACKAGE_LIST__"
12
- FRACTAL_MAX_PIP_VERSION="__FRACTAL_MAX_PIP_VERSION__"
11
+ PINNED_PACKAGE_LIST_PRE="__PINNED_PACKAGE_LIST_PRE__"
12
+ PINNED_PACKAGE_LIST_POST="__PINNED_PACKAGE_LIST_POST__"
13
13
  FRACTAL_PIP_CACHE_DIR_ARG="__FRACTAL_PIP_CACHE_DIR_ARG__"
14
14
 
15
15
  TIME_START=$(date +%s)
@@ -18,25 +18,36 @@ VENVPYTHON=${PACKAGE_ENV_DIR}/bin/python
18
18
 
19
19
  # Upgrade `pip` and install `setuptools`
20
20
  write_log "START upgrade pip and install setuptools"
21
- "$VENVPYTHON" -m pip install ${FRACTAL_PIP_CACHE_DIR_ARG} "pip<=${FRACTAL_MAX_PIP_VERSION}" --upgrade
22
- "$VENVPYTHON" -m pip install ${FRACTAL_PIP_CACHE_DIR_ARG} setuptools
21
+ "$VENVPYTHON" -m pip install ${FRACTAL_PIP_CACHE_DIR_ARG} pip setuptools --upgrade
23
22
  write_log "END upgrade pip and install setuptools"
24
23
  echo
25
24
 
25
+
26
+ # Install pre-pinned packages (note: do not quote $PINNED_PACKAGE_LIST_PRE since it could be e.g. "numpy==1.2.3 torch=3.2.1")
27
+ if [ "$PINNED_PACKAGE_LIST_PRE" != "" ]; then
28
+ write_log "START install with PINNED_PACKAGE_LIST_PRE=${PINNED_PACKAGE_LIST_PRE}"
29
+ "$VENVPYTHON" -m pip install ${FRACTAL_PIP_CACHE_DIR_ARG} $PINNED_PACKAGE_LIST_PRE
30
+ write_log "END install with PINNED_PACKAGE_LIST_PRE=${PINNED_PACKAGE_LIST_PRE}"
31
+ echo
32
+ else
33
+ write_log "SKIP installing pre-pinned versions $PINNED_PACKAGE_LIST_PRE (empty list)"
34
+ fi
35
+
36
+
26
37
  # Install package
27
38
  write_log "START install with INSTALL_STRING=${INSTALL_STRING}"
28
39
  "$VENVPYTHON" -m pip install ${FRACTAL_PIP_CACHE_DIR_ARG} "$INSTALL_STRING"
29
40
  write_log "END install with INSTALL_STRING=${INSTALL_STRING}"
30
41
  echo
31
42
 
32
- # Install pinned packages (note: do not quote $PINNED_PACKAGE_LIST since it could be e.g. "numpy==1.2.3 torch=3.2.1")
33
- if [ "$PINNED_PACKAGE_LIST" != "" ]; then
34
- write_log "START install with PINNED_PACKAGE_LIST=${PINNED_PACKAGE_LIST}"
35
- "$VENVPYTHON" -m pip install ${FRACTAL_PIP_CACHE_DIR_ARG} $PINNED_PACKAGE_LIST
36
- write_log "END install with PINNED_PACKAGE_LIST=${PINNED_PACKAGE_LIST}"
43
+ # Install post-pinned packages (note: do not quote $PINNED_PACKAGE_LIST_POST since it could be e.g. "numpy==1.2.3 torch=3.2.1")
44
+ if [ "$PINNED_PACKAGE_LIST_POST" != "" ]; then
45
+ write_log "START install with PINNED_PACKAGE_LIST_POST=${PINNED_PACKAGE_LIST_POST}"
46
+ "$VENVPYTHON" -m pip install ${FRACTAL_PIP_CACHE_DIR_ARG} $PINNED_PACKAGE_LIST_POST
47
+ write_log "END install with PINNED_PACKAGE_LIST_POST=${PINNED_PACKAGE_LIST_POST}"
37
48
  echo
38
49
  else
39
- write_log "SKIP installing pinned versions $PINNED_PACKAGE_LIST (empty list)"
50
+ write_log "SKIP installing post-pinned versions $PINNED_PACKAGE_LIST_POST (empty list)"
40
51
  fi
41
52
 
42
53
  # End
@@ -8,7 +8,6 @@ write_log(){
8
8
  # Variables to be filled within fractal-server
9
9
  PACKAGE_ENV_DIR=__PACKAGE_ENV_DIR__
10
10
  PIP_FREEZE_FILE=__PIP_FREEZE_FILE__
11
- FRACTAL_MAX_PIP_VERSION=__FRACTAL_MAX_PIP_VERSION__
12
11
  FRACTAL_PIP_CACHE_DIR_ARG="__FRACTAL_PIP_CACHE_DIR_ARG__"
13
12
 
14
13
  TIME_START=$(date +%s)
@@ -17,8 +16,7 @@ VENVPYTHON=${PACKAGE_ENV_DIR}/bin/python
17
16
 
18
17
  # Upgrade `pip` and install `setuptools`
19
18
  write_log "START upgrade pip and install setuptools"
20
- "$VENVPYTHON" -m pip install ${FRACTAL_PIP_CACHE_DIR_ARG} "pip<=${FRACTAL_MAX_PIP_VERSION}" --upgrade
21
- "$VENVPYTHON" -m pip install ${FRACTAL_PIP_CACHE_DIR_ARG} setuptools
19
+ "$VENVPYTHON" -m pip install ${FRACTAL_PIP_CACHE_DIR_ARG} pip setuptools --upgrade
22
20
  write_log "END upgrade pip and install setuptools"
23
21
  echo
24
22
 
@@ -93,14 +93,14 @@ def get_collection_replacements(
93
93
  ("__PACKAGE_ENV_DIR__", task_group.venv_path),
94
94
  ("__PYTHON__", python_bin),
95
95
  ("__INSTALL_STRING__", task_group.pip_install_string),
96
+ ("__FRACTAL_PIP_CACHE_DIR_ARG__", settings.PIP_CACHE_DIR_ARG),
96
97
  (
97
- "__FRACTAL_MAX_PIP_VERSION__",
98
- settings.FRACTAL_MAX_PIP_VERSION,
98
+ "__PINNED_PACKAGE_LIST_PRE__",
99
+ task_group.pinned_package_versions_pre_string,
99
100
  ),
100
- ("__FRACTAL_PIP_CACHE_DIR_ARG__", settings.PIP_CACHE_DIR_ARG),
101
101
  (
102
- "__PINNED_PACKAGE_LIST__",
103
- task_group.pinned_package_versions_string,
102
+ "__PINNED_PACKAGE_LIST_POST__",
103
+ task_group.pinned_package_versions_post_string,
104
104
  ),
105
105
  ]
106
106
  logger.info(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: fractal-server
3
- Version: 2.15.9
3
+ Version: 2.15.10a1
4
4
  Summary: Backend component of the Fractal analytics platform
5
5
  License: BSD-3-Clause
6
6
  Author: Tommaso Comparin
@@ -1,4 +1,4 @@
1
- fractal_server/__init__.py,sha256=Gvh-OyCbsn-ww63peFcKRjQRDTKP9siJQsqqO9Y34W0,23
1
+ fractal_server/__init__.py,sha256=V5nQUbEgpEH813xbpBCXis4dIIHC2JqzZinrp2rq_qw,26
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
@@ -12,10 +12,10 @@ fractal_server/app/models/v2/__init__.py,sha256=vjHwek7-IXmaZZL9VF0nD30YL9ca4wNc
12
12
  fractal_server/app/models/v2/accounting.py,sha256=i-2TsjqyuclxFQ21C-TeDoss7ZBTRuXdzIJfVr2UxwE,1081
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
- fractal_server/app/models/v2/job.py,sha256=e3Un_rUgWC-KazGLDQqy17NQK_2ZsL3EmEmDAky_bN0,1998
15
+ fractal_server/app/models/v2/job.py,sha256=RsJY5B-HBOa2uMJYDefMbe8traBVIbwheAWk4H79EcU,2040
16
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=-x-BLtE2biV6kR0hENFgcq3N0B1QuLehdUWhCCO34tk,3856
18
+ fractal_server/app/models/v2/task_group.py,sha256=kMHvCROfQZ6Tl7iEOjM9sXQ0qvFSu6Kkg_5pKeP011Y,4590
19
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
@@ -45,7 +45,7 @@ fractal_server/app/routes/api/v2/project.py,sha256=ldMEyjtwGpX2teu85sCNWaubDFlw-
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=C9cLecHoVl_VXQFAHs2Y2LVE6S_v2PHpa-w5XQIaT-M,9174
47
47
  fractal_server/app/routes/api/v2/task.py,sha256=WxkWRw-0fJkgmMt9fSDc6oikBFd6nSS-JdPwR0z24tg,7024
48
- fractal_server/app/routes/api/v2/task_collection.py,sha256=UcS7tb9RjiDimeI-iWwD0wqnXYQEdEZT56PnPa0zC9Q,12233
48
+ fractal_server/app/routes/api/v2/task_collection.py,sha256=Phb_ORpJ9J8oa1c75qcThJjOWSpv66qfwoePpoUQ_no,12738
49
49
  fractal_server/app/routes/api/v2/task_collection_custom.py,sha256=j-vI1_FjoxU59VwkwUTYW5HhMVB5NObMkWLCjAKbers,6726
50
50
  fractal_server/app/routes/api/v2/task_collection_pixi.py,sha256=1rCBfKANT9zcKcOVMQTByVpP8GjdrzeaMzyQT05k0nY,7517
51
51
  fractal_server/app/routes/api/v2/task_group.py,sha256=DrXMc0D7IYqUsrlrpF5JO1zVKvx7RPdKPPOhz3FqqJE,9203
@@ -72,7 +72,7 @@ fractal_server/app/runner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJW
72
72
  fractal_server/app/runner/components.py,sha256=-Ii5l8d_V6f5DFOd-Zsr8VYmOsyqw0Hox9fEFQiuqxY,66
73
73
  fractal_server/app/runner/exceptions.py,sha256=lzYefT6IpA2ajcQUzm9kT9pTxRl5UGIJKyLs6v1JczA,1731
74
74
  fractal_server/app/runner/executors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
75
- fractal_server/app/runner/executors/base_runner.py,sha256=5Y0VACW3YZtXwLH-ll963miWWYsNJ1ZD0V2S5-N8vGI,6026
75
+ fractal_server/app/runner/executors/base_runner.py,sha256=bznvlTrRPk_-ER9DrG8iRQI6bqKM66_uMd7VV5mIUhg,6069
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
@@ -81,7 +81,7 @@ fractal_server/app/runner/executors/slurm_common/__init__.py,sha256=47DEQpj8HBSa
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
83
83
  fractal_server/app/runner/executors/slurm_common/_slurm_config.py,sha256=FI2p4yQ16571C_YM3Vs_tJnb71urVykwxfIXDXa79I8,15721
84
- fractal_server/app/runner/executors/slurm_common/base_slurm_runner.py,sha256=yWl71_rTp34t9KvB6jjCBQIJPEg-btsWm3oZC7ytRgI,38141
84
+ fractal_server/app/runner/executors/slurm_common/base_slurm_runner.py,sha256=7pI46LpmnbBzNKxsK0YC0Uv5YfyNwVYWA3dMuAoa_Lg,40020
85
85
  fractal_server/app/runner/executors/slurm_common/get_slurm_config.py,sha256=KhQQJrGQZLX5u8fsMcIx7FN8jUKSGEeG68yO7Ay_LXg,7454
86
86
  fractal_server/app/runner/executors/slurm_common/remote.py,sha256=LHK2Ram8X8q6jNSCxnnwKUwmSJMsyQyRem_VjH53qdw,3811
87
87
  fractal_server/app/runner/executors/slurm_common/slurm_job_task_models.py,sha256=K4SdJOKsUWzDlnkb8Ug_UmTx6nBMsTqn9_oKqwE4XDI,3520
@@ -103,9 +103,9 @@ fractal_server/app/runner/v2/_slurm_sudo.py,sha256=Gvsh4tUlc1_3KdF3B7zEqs-YIntC_
103
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
105
  fractal_server/app/runner/v2/merge_outputs.py,sha256=YOTKbGOM9s-uqY4KN2onoIxuHNm-v3hr5zv6Aa1KEtA,905
106
- fractal_server/app/runner/v2/runner.py,sha256=IE7Ups3LqMy4ijV427xugYtEz003xM7UzJD3G8Jw_T4,18995
106
+ fractal_server/app/runner/v2/runner.py,sha256=IrC4f0SaaFdN3iKoVa7XK87Gb8f9GSLjhImtvwNODCM,19417
107
107
  fractal_server/app/runner/v2/runner_functions.py,sha256=xteoDSXKxStl3ABEXyjrggPiXdXAPy9sJPfT3B8CQ3Y,19050
108
- fractal_server/app/runner/v2/submit_workflow.py,sha256=L6WqQC3Vm-tLe_CJXHIMbYLAeulAN2no_4HZD4cbhR0,12554
108
+ fractal_server/app/runner/v2/submit_workflow.py,sha256=VM5GaDZrbLTemOglJ0U15HaP3etpnSIrKQ6l9S5sE5w,12697
109
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
@@ -115,21 +115,21 @@ fractal_server/app/schemas/user_settings.py,sha256=NpdC0Me0fgwwdfJuTSlFLCnLUjiWW
115
115
  fractal_server/app/schemas/v2/__init__.py,sha256=GqV6kJ0nKDq2vsSA4uph-nb5pmuaq013LUCcm9LbpLE,3097
116
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
- fractal_server/app/schemas/v2/dumps.py,sha256=MoQHjKZy-_ujSfr7XmZ6FjB_VR-zLedx9XJj_sp5xvc,2210
118
+ fractal_server/app/schemas/v2/dumps.py,sha256=LCYiNF_FNYiA6HYp5GyFao3IKRX0RpzgNpiX56IwgCE,2293
119
119
  fractal_server/app/schemas/v2/history.py,sha256=pZiMKfh6nMWbTp5MUtrnGySPKbeRFf5tM1VLFaTgGcw,1784
120
- fractal_server/app/schemas/v2/job.py,sha256=fPay7dLSr-skKRdVRoZig8rf_sZwUdVdHZaJ4XM8vMI,3288
120
+ fractal_server/app/schemas/v2/job.py,sha256=BuiNzAX2Kl-b7LJnAiqCGDC9h6bGEjKvsHQIgf5mjHQ,3330
121
121
  fractal_server/app/schemas/v2/manifest.py,sha256=QUpXMDB8WkB1F4UK-yYmm3O8bXoHwDGURnqwn6ayO_I,6674
122
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
- fractal_server/app/schemas/v2/task_collection.py,sha256=1sz2fJEUgRVVjwGGXFyRsr4L6RnNvTKQJsRXbMjNmps,4176
126
- fractal_server/app/schemas/v2/task_group.py,sha256=NwU3FRPzPtoEhunE7dcF3su20dxaL_4YJQw4fPnTcgo,3231
125
+ fractal_server/app/schemas/v2/task_collection.py,sha256=BzHQXq2_zLZTbigWauOR5Zi-mlsqCIF2NEF_z12Nqxg,4480
126
+ fractal_server/app/schemas/v2/task_group.py,sha256=Gw_YK648PL1GuXyiYmB2b13pdt_3OBeEGCL3UuHGoTg,3393
127
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=vNaDkzjqOzQMQyNVCWJ9qNMvfXKDuk2L0mMTPGzX79U,29505
132
+ fractal_server/config.py,sha256=1urzZC54g7CKRFKbfCPZqQrAc-JMmKoMTWxhx3qqIv0,29368
133
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
@@ -145,7 +145,9 @@ fractal_server/migrations/env.py,sha256=nfyBpMIOT3kny6t-b-tUjyRjZ4k906bb1_wCQ7me
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
+ fractal_server/migrations/versions/0f5f85bb2ae7_add_pre_pinned_packages.py,sha256=FxnIvfktnSjy2nBKDIow24on1nMkLw1THhO84FtNZSo,1055
148
149
  fractal_server/migrations/versions/19eca0dd47a9_user_settings_project_dir.py,sha256=Q1Gj1cJ0UrdLBJ5AXfFK9QpxTtmcv-4Z3NEGDnxOme4,961
150
+ fractal_server/migrations/versions/1a83a5260664_rename.py,sha256=EkzTAjbJm7CfsLraIUbH9hkTj4M6XvmziVb4K9ZjKmQ,790
149
151
  fractal_server/migrations/versions/1eac13a26c83_drop_v1_tables.py,sha256=7OW3HmqAePHx53OWdEPzNxvtupxSR0lB_6tZF1b3JIM,1604
150
152
  fractal_server/migrations/versions/316140ff7ee1_remove_usersettings_cache_dir.py,sha256=lANgTox0rz459_yo1Rw7fGCT1qw5sUCUXTLUMc_Bzf8,911
151
153
  fractal_server/migrations/versions/47351f8c7ebc_drop_dataset_filters.py,sha256=vePkVm1iUHiPNKLQ3KR7BBLdHruqBdl87j_tUCbMbEA,1414
@@ -163,6 +165,7 @@ fractal_server/migrations/versions/8f79bd162e35_add_docs_info_and_docs_link_to_t
163
165
  fractal_server/migrations/versions/94a47ea2d3ff_remove_cache_dir_slurm_user_and_slurm_.py,sha256=yL3-Hvzw5jBLKj4LFP1z5ofZE9L9W3tLwYtPNW7z4ko,1508
164
166
  fractal_server/migrations/versions/969d84257cac_add_historyrun_task_id.py,sha256=4nLSYEMp_Tm7VRfo8p9YKLHVnoizTXaPV6lfcfvWhj0,1143
165
167
  fractal_server/migrations/versions/97f444d47249_add_applyworkflow_project_dump.py,sha256=eKTZm3EgUgapXBxO0RuHkEfTKic-TZG3ADaMpGLuc0k,1057
168
+ fractal_server/migrations/versions/981d588fe248_add_executor_error_log.py,sha256=p51lFxxpU-9vSdOHr_idkK3215NQsFD8oX9M6qRCASU,956
166
169
  fractal_server/migrations/versions/99ea79d9e5d2_add_dataset_history.py,sha256=0im6TxDr53sKKcjiPgeH4ftVRGnRXZSh2lPbRQ1Ir9w,883
167
170
  fractal_server/migrations/versions/9c5ae74c9b98_add_user_settings_table.py,sha256=syONdZNf4-OnAcWIsbzXpYwpXPsXZ4SsmjwVvmVG0PU,2256
168
171
  fractal_server/migrations/versions/9db60297b8b2_set_ondelete.py,sha256=F0IdXk8vclViOGKe2SOHO3MsQsqe7SsZRSqz9cXhhrE,7928
@@ -208,11 +211,11 @@ fractal_server/tasks/v2/ssh/deactivate_pixi.py,sha256=K0yK_NPUqhFMj6cp6G_0Kfn0Yo
208
211
  fractal_server/tasks/v2/ssh/reactivate.py,sha256=NJIgMNFKaXMhbvK0iZOsMwMtsms6Boj9f8N4L01X9Bo,8271
209
212
  fractal_server/tasks/v2/ssh/reactivate_pixi.py,sha256=UOlG01wOv-eQCtUxSwphEY-Ey7OoUm5PMCSP9J-i1rY,10323
210
213
  fractal_server/tasks/v2/templates/1_create_venv.sh,sha256=PK0jdHKtQpda1zULebBaVPORt4t6V17wa4N1ohcj5ac,548
211
- fractal_server/tasks/v2/templates/2_pip_install.sh,sha256=jMJPQJXHKznO6fxOOXtFXKPdCmTf1VLLWj_JL_ZdKxo,1644
214
+ fractal_server/tasks/v2/templates/2_pip_install.sh,sha256=vN9DX-eucJjB-XCuQuZmkuATGBzL4FlDQJTQdVewJG8,2155
212
215
  fractal_server/tasks/v2/templates/3_pip_freeze.sh,sha256=JldREScEBI4cD_qjfX4UK7V4aI-FnX9ZvVNxgpSOBFc,168
213
216
  fractal_server/tasks/v2/templates/4_pip_show.sh,sha256=qm1vPy6AkKhWDjCJGXS8LqCLYO3KsAyRK325ZsFcF6U,1747
214
217
  fractal_server/tasks/v2/templates/5_get_venv_size_and_file_number.sh,sha256=q-6ZUvA6w6FDVEoSd9O63LaJ9tKZc7qAFH72SGPrd_k,284
215
- fractal_server/tasks/v2/templates/6_pip_install_from_freeze.sh,sha256=A2y8RngEjAcRhG-_owA6P7tAdrS_AszFuGXnaeMV8u0,1122
218
+ fractal_server/tasks/v2/templates/6_pip_install_from_freeze.sh,sha256=jHoALPagSCD1_HuqrxEYibWAJNOUxQGm-A2oE3f_LPE,982
216
219
  fractal_server/tasks/v2/templates/pixi_1_extract.sh,sha256=Jdy5OyKo2jxe_qIDB9Zi4a0FL0cMBysxvBPHlUrARQM,1099
217
220
  fractal_server/tasks/v2/templates/pixi_2_install.sh,sha256=h6-M101Q1AdAfZNZyPfSUc8AlZ-uS84Hae4vJdDSglY,1601
218
221
  fractal_server/tasks/v2/templates/pixi_3_post_install.sh,sha256=99J8KXkNeQk9utuEtUxfAZS6VCThC32X7I7HAp2gdTU,2501
@@ -221,7 +224,7 @@ fractal_server/tasks/v2/utils_database.py,sha256=yi7793Uue32O59OBVUgomO42oUrVKdS
221
224
  fractal_server/tasks/v2/utils_package_names.py,sha256=RDg__xrvQs4ieeVzmVdMcEh95vGQYrv9Hfal-5EDBM8,2393
222
225
  fractal_server/tasks/v2/utils_pixi.py,sha256=tqCnxMdxs7KGWncWvk0alrdvDbX-w77P3fAot68Bqh4,3257
223
226
  fractal_server/tasks/v2/utils_python_interpreter.py,sha256=kF86UClk6HxghRLDYY4rKOXwnWGUYQfrNsVNxOmOGxM,964
224
- fractal_server/tasks/v2/utils_templates.py,sha256=GR8z7ODkR9tLftNAI1g1NrtN7pvDGrasp2jIlfdg4cI,3518
227
+ fractal_server/tasks/v2/utils_templates.py,sha256=BU2F2Hn0At-QjtUc6-BmU9CAsL3ljqvVv7cGxrsFluc,3541
225
228
  fractal_server/types/__init__.py,sha256=aA_8J1xXzuiLqpwO_Qf18-qzaRcYkHzevhH_T-diXWM,2026
226
229
  fractal_server/types/validators/__init__.py,sha256=5uj6KJ9MelFZgyoq3MzXLhgWCl0yiriS7XKmb0gathg,392
227
230
  fractal_server/types/validators/_common_validators.py,sha256=MpxyaP2kwgbyCTOaVRjYnJ74Lfi0f2X0q3rjX9w3vTk,1170
@@ -230,8 +233,8 @@ fractal_server/types/validators/_workflow_task_arguments_validators.py,sha256=HL
230
233
  fractal_server/urls.py,sha256=QjIKAC1a46bCdiPMu3AlpgFbcv6a4l3ABcd5xz190Og,471
231
234
  fractal_server/utils.py,sha256=Vn35lApt1T1J8nc09sAVqd10Cy0sa3dLipcljI-hkuk,2185
232
235
  fractal_server/zip_tools.py,sha256=H0w7wS5yE4ebj7hw1_77YQ959dl2c-L0WX6J_ro1TY4,4884
233
- fractal_server-2.15.9.dist-info/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
234
- fractal_server-2.15.9.dist-info/METADATA,sha256=TRPQhHKsxpbePglpT_A3xYW2QC-3OCJr5GmeOIIBB1I,4334
235
- fractal_server-2.15.9.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
236
- fractal_server-2.15.9.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
237
- fractal_server-2.15.9.dist-info/RECORD,,
236
+ fractal_server-2.15.10a1.dist-info/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
237
+ fractal_server-2.15.10a1.dist-info/METADATA,sha256=6hd5XmF5LcCsfzIOdEn4CJlQWLRpZUoTlNvxvLotirs,4337
238
+ fractal_server-2.15.10a1.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
239
+ fractal_server-2.15.10a1.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
240
+ fractal_server-2.15.10a1.dist-info/RECORD,,