fractal-server 2.0.5__py3-none-any.whl → 2.1.0__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.0.5"
1
+ __VERSION__ = "2.1.0"
@@ -1,7 +1,3 @@
1
- """
2
- `models` module
3
- """
4
- from .security import * # noqa: F401, F403
5
1
  from .v1 import Project # noqa: F401
6
2
  from .v2 import ProjectV2 # noqa: F401
7
3
 
@@ -18,9 +18,6 @@ from sqlmodel import Field
18
18
  from sqlmodel import Relationship
19
19
  from sqlmodel import SQLModel
20
20
 
21
- from .linkuserproject import LinkUserProject
22
- from .linkuserproject import LinkUserProjectV2
23
-
24
21
 
25
22
  class OAuthAccount(SQLModel, table=True):
26
23
  """
@@ -103,16 +100,6 @@ class UserOAuth(SQLModel, table=True):
103
100
  back_populates="user",
104
101
  sa_relationship_kwargs={"lazy": "joined", "cascade": "all, delete"},
105
102
  )
106
- project_list: list["Project"] = Relationship( # noqa
107
- back_populates="user_list",
108
- link_model=LinkUserProject,
109
- sa_relationship_kwargs={"lazy": "selectin"},
110
- )
111
- project_list_v2: list["ProjectV2"] = Relationship( # noqa
112
- back_populates="user_list",
113
- link_model=LinkUserProjectV2,
114
- sa_relationship_kwargs={"lazy": "selectin"},
115
- )
116
103
 
117
104
  class Config:
118
105
  orm_mode = True
@@ -1,12 +1,13 @@
1
1
  """
2
2
  `models` module
3
3
  """
4
- from .dataset import Dataset # noqa: F401
5
- from .dataset import Resource # noqa: F401
6
- from .job import ApplyWorkflow # noqa: F403, F401
7
- from .job import JobStatusTypeV1 # noqa: F401, F403
8
- from .project import Project # noqa: F403, F401
9
- from .state import State # noqa: F403, F401
10
- from .task import Task # noqa: F403, F401
11
- from .workflow import Workflow # noqa: F401, F403
12
- from .workflow import WorkflowTask # noqa: F401, F403
4
+ from ..linkuserproject import LinkUserProject # noqa F401
5
+ from .dataset import Dataset # noqa F401
6
+ from .dataset import Resource # noqa F401
7
+ from .job import ApplyWorkflow # noqa F401
8
+ from .job import JobStatusTypeV1 # noqa F401
9
+ from .project import Project # noqa F401
10
+ from .state import State # noqa F401
11
+ from .task import Task # noqa F401
12
+ from .workflow import Workflow # noqa F401
13
+ from .workflow import WorkflowTask # noqa F401
@@ -7,9 +7,9 @@ from sqlmodel import Field
7
7
  from sqlmodel import Relationship
8
8
  from sqlmodel import SQLModel
9
9
 
10
+ from . import LinkUserProject
10
11
  from ....utils import get_timestamp
11
12
  from ...schemas.v1.project import _ProjectBaseV1
12
- from ..linkuserproject import LinkUserProject
13
13
  from ..security import UserOAuth
14
14
 
15
15
 
@@ -23,7 +23,6 @@ class Project(_ProjectBaseV1, SQLModel, table=True):
23
23
 
24
24
  user_list: list[UserOAuth] = Relationship(
25
25
  link_model=LinkUserProject,
26
- back_populates="project_list",
27
26
  sa_relationship_kwargs={
28
27
  "lazy": "selectin",
29
28
  },
@@ -7,8 +7,8 @@ from sqlmodel import Field
7
7
  from sqlmodel import Relationship
8
8
  from sqlmodel import SQLModel
9
9
 
10
+ from . import LinkUserProjectV2
10
11
  from ....utils import get_timestamp
11
- from ..linkuserproject import LinkUserProjectV2
12
12
  from ..security import UserOAuth
13
13
 
14
14
 
@@ -23,7 +23,6 @@ class ProjectV2(SQLModel, table=True):
23
23
 
24
24
  user_list: list[UserOAuth] = Relationship(
25
25
  link_model=LinkUserProjectV2,
26
- back_populates="project_list_v2",
27
26
  sa_relationship_kwargs={
28
27
  "lazy": "selectin",
29
28
  },
@@ -12,9 +12,9 @@ from sqlmodel import select
12
12
  from sqlmodel.sql.expression import SelectOfScalar
13
13
 
14
14
  from ....db import AsyncSession
15
- from ....models import LinkUserProject
16
15
  from ....models.v1 import ApplyWorkflow
17
16
  from ....models.v1 import Dataset
17
+ from ....models.v1 import LinkUserProject
18
18
  from ....models.v1 import Project
19
19
  from ....models.v1 import Task
20
20
  from ....models.v1 import Workflow
@@ -18,9 +18,9 @@ from .....logger import set_logger
18
18
  from .....syringe import Inject
19
19
  from ....db import AsyncSession
20
20
  from ....db import get_async_db
21
- from ....models import LinkUserProject
22
21
  from ....models.v1 import ApplyWorkflow
23
22
  from ....models.v1 import Dataset
23
+ from ....models.v1 import LinkUserProject
24
24
  from ....models.v1 import Project
25
25
  from ....models.v1 import Workflow
26
26
  from ....runner.set_start_and_last_task_index import (
@@ -195,21 +195,16 @@ async def apply_workflow(
195
195
 
196
196
  # Define server-side job directory
197
197
  timestamp_string = get_timestamp().strftime("%Y%m%d_%H%M%S")
198
- WORKFLOW_DIR = (
199
- settings.FRACTAL_RUNNER_WORKING_BASE_DIR
200
- / (
201
- f"proj_v2_{project_id:07d}_wf_{workflow_id:07d}_job_{job.id:07d}"
202
- f"_{timestamp_string}"
203
- )
204
- ).resolve()
198
+ WORKFLOW_DIR = settings.FRACTAL_RUNNER_WORKING_BASE_DIR / (
199
+ f"proj_v2_{project_id:07d}_wf_{workflow_id:07d}_job_{job.id:07d}"
200
+ f"_{timestamp_string}"
201
+ )
205
202
 
206
203
  # Define user-side job directory
207
204
  if FRACTAL_RUNNER_BACKEND == "local":
208
205
  WORKFLOW_DIR_USER = WORKFLOW_DIR
209
206
  elif FRACTAL_RUNNER_BACKEND == "slurm":
210
- WORKFLOW_DIR_USER = (
211
- Path(user.cache_dir) / f"{WORKFLOW_DIR.name}"
212
- ).resolve()
207
+ WORKFLOW_DIR_USER = Path(user.cache_dir) / f"{WORKFLOW_DIR.name}"
213
208
 
214
209
  # Update job folders in the db
215
210
  job.working_dir = WORKFLOW_DIR.as_posix()
@@ -141,7 +141,7 @@ def _glob_as_user_strict(
141
141
  new_output = []
142
142
  known_filenames = [
143
143
  f"{startswith}{suffix}"
144
- for suffix in [".args.json", ".metadiff.json", ".err", ".out"]
144
+ for suffix in [".args.json", ".metadiff.json", ".err", ".out", ".log"]
145
145
  ]
146
146
  for filename in output:
147
147
  if filename in known_filenames:
@@ -1188,3 +1188,15 @@ class FractalSlurmExecutor(SlurmExecutor):
1188
1188
  raise JobExecutionError(info=error_msg)
1189
1189
 
1190
1190
  logger.debug("Executor shutdown: end")
1191
+
1192
+ def __exit__(self, *args, **kwargs):
1193
+ """
1194
+ See
1195
+ https://github.com/fractal-analytics-platform/fractal-server/issues/1508
1196
+ """
1197
+ logger.debug(
1198
+ "[FractalSlurmExecutor.__exit__] Stop and join `wait_thread`"
1199
+ )
1200
+ self.wait_thread.stop()
1201
+ self.wait_thread.join()
1202
+ logger.debug("[FractalSlurmExecutor.__exit__] End")
@@ -137,13 +137,10 @@ async def submit_workflow(
137
137
  # Define and create server-side working folder
138
138
  project_id = workflow.project_id
139
139
  timestamp_string = get_timestamp().strftime("%Y%m%d_%H%M%S")
140
- WORKFLOW_DIR = (
141
- settings.FRACTAL_RUNNER_WORKING_BASE_DIR
142
- / (
143
- f"proj_{project_id:07d}_wf_{workflow_id:07d}_job_{job_id:07d}"
144
- f"_{timestamp_string}"
145
- )
146
- ).resolve()
140
+ WORKFLOW_DIR = settings.FRACTAL_RUNNER_WORKING_BASE_DIR / (
141
+ f"proj_{project_id:07d}_wf_{workflow_id:07d}_job_{job_id:07d}"
142
+ f"_{timestamp_string}"
143
+ )
147
144
 
148
145
  if WORKFLOW_DIR.exists():
149
146
  raise RuntimeError(f"Workflow dir {WORKFLOW_DIR} already exists.")
@@ -162,9 +159,7 @@ async def submit_workflow(
162
159
  _mkdir_as_user,
163
160
  )
164
161
 
165
- WORKFLOW_DIR_USER = (
166
- Path(user_cache_dir) / f"{WORKFLOW_DIR.name}"
167
- ).resolve()
162
+ WORKFLOW_DIR_USER = Path(user_cache_dir) / f"{WORKFLOW_DIR.name}"
168
163
  _mkdir_as_user(folder=str(WORKFLOW_DIR_USER), user=slurm_user)
169
164
  else:
170
165
  raise ValueError(f"{FRACTAL_RUNNER_BACKEND=} not supported")
@@ -57,9 +57,8 @@ from sqlmodel import select
57
57
  from ...config import get_settings
58
58
  from ...syringe import Inject
59
59
  from ..db import get_async_db
60
- from ..models.security import OAuthAccount
61
- from ..models.security import UserOAuth as User
62
- from fractal_server.app.models.security import UserOAuth
60
+ from fractal_server.app.models.security import OAuthAccount
61
+ from fractal_server.app.models.security import UserOAuth as User
63
62
  from fractal_server.app.schemas.user import UserCreate
64
63
  from fractal_server.logger import get_logger
65
64
 
@@ -287,8 +286,8 @@ async def _create_first_user(
287
286
 
288
287
  if is_superuser is True:
289
288
  # If a superuser already exists, exit
290
- stm = select(UserOAuth).where(
291
- UserOAuth.is_superuser == True # noqa: E712
289
+ stm = select(User).where(
290
+ User.is_superuser == True # noqa E712
292
291
  )
293
292
  res = await session.execute(stm)
294
293
  existing_superuser = res.scalars().first()
fractal_server/config.py CHANGED
@@ -289,6 +289,27 @@ class Settings(BaseSettings):
289
289
  )
290
290
  return FRACTAL_TASKS_DIR_path
291
291
 
292
+ @validator("FRACTAL_RUNNER_WORKING_BASE_DIR", always=True)
293
+ def make_FRACTAL_RUNNER_WORKING_BASE_DIR_absolute(cls, v):
294
+ """
295
+ (Copy of make_FRACTAL_TASKS_DIR_absolute)
296
+ If `FRACTAL_RUNNER_WORKING_BASE_DIR` is a non-absolute path,
297
+ make it absolute (based on the current working directory).
298
+ """
299
+ if v is None:
300
+ return None
301
+ FRACTAL_RUNNER_WORKING_BASE_DIR_path = Path(v)
302
+ if not FRACTAL_RUNNER_WORKING_BASE_DIR_path.is_absolute():
303
+ FRACTAL_RUNNER_WORKING_BASE_DIR_path = (
304
+ FRACTAL_RUNNER_WORKING_BASE_DIR_path.resolve()
305
+ )
306
+ logging.warning(
307
+ f'FRACTAL_RUNNER_WORKING_BASE_DIR="{v}" is not an absolute '
308
+ "path; converting it to "
309
+ f'"{str(FRACTAL_RUNNER_WORKING_BASE_DIR_path)}"'
310
+ )
311
+ return FRACTAL_RUNNER_WORKING_BASE_DIR_path
312
+
292
313
  FRACTAL_RUNNER_BACKEND: Literal["local", "slurm"] = "local"
293
314
  """
294
315
  Select which runner backend to use.
@@ -361,6 +382,11 @@ class Settings(BaseSettings):
361
382
  attribute in their input-arguments JSON file.
362
383
  """
363
384
 
385
+ FRACTAL_API_V1_MODE: Literal["include", "exclude"] = "include"
386
+ """
387
+ Whether to include the v1 API.
388
+ """
389
+
364
390
  ###########################################################################
365
391
  # BUSINESS LOGIC
366
392
  ###########################################################################
@@ -17,8 +17,8 @@ from pathlib import Path
17
17
  from typing import Optional
18
18
  from typing import Union
19
19
 
20
- from .config import get_settings
21
- from .syringe import Inject
20
+ from ..config import get_settings
21
+ from ..syringe import Inject
22
22
 
23
23
 
24
24
  LOG_FORMAT = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
@@ -136,3 +136,29 @@ def reset_logger_handlers(logger: logging.Logger) -> None:
136
136
  """
137
137
  close_logger(logger)
138
138
  logger.handlers.clear()
139
+
140
+
141
+ def config_uvicorn_loggers():
142
+ """
143
+ Change the formatter for the uvicorn access/error loggers.
144
+
145
+ This is similar to https://stackoverflow.com/a/68864979/19085332. See also
146
+ https://github.com/tiangolo/fastapi/issues/1508.
147
+
148
+ This function is meant to work in two scenarios:
149
+
150
+ 1. The most relevant case is for a `gunicorn` startup command, with
151
+ `--access-logfile` and `--error-logfile` options set.
152
+ 2. The case of `fractalctl start` (directly calling `uvicorn`).
153
+
154
+ Because of the second use case, we need to check whether uvicorn loggers
155
+ already have a handler. If not, we skip the formatting.
156
+ """
157
+
158
+ access_logger = logging.getLogger("uvicorn.access")
159
+ if len(access_logger.handlers) > 0:
160
+ access_logger.handlers[0].setFormatter(LOG_FORMATTER)
161
+
162
+ error_logger = logging.getLogger("uvicorn.error")
163
+ if len(error_logger.handlers) > 0:
164
+ error_logger.handlers[0].setFormatter(LOG_FORMATTER)
@@ -0,0 +1,19 @@
1
+ """
2
+ This module (which is only executed if `gunicorn` can be imported) subclasses
3
+ the gunicorn `Logger` class in order to slightly change its log formats.
4
+
5
+ This class can be used by including this `gunicorn` command-line option:
6
+ ```
7
+ --logger-class fractal_server.logger.gunicorn_logger.FractalGunicornLogger
8
+ ```
9
+ """
10
+
11
+ try:
12
+ from gunicorn.glogging import Logger as GunicornLogger
13
+
14
+ class FractalGunicornLogger(GunicornLogger):
15
+ error_fmt = r"%(asctime)s - gunicorn.error - %(levelname)s - [pid %(process)d] - %(message)s" # noqa: E501
16
+ datefmt = r"%Y-%m-%d %H:%M:%S,%u"
17
+
18
+ except (ModuleNotFoundError, ImportError):
19
+ pass
fractal_server/main.py CHANGED
@@ -15,10 +15,13 @@
15
15
 
16
16
  This module sets up the FastAPI application that serves the Fractal Server.
17
17
  """
18
+ from contextlib import asynccontextmanager
19
+
18
20
  from fastapi import FastAPI
19
21
 
20
22
  from .app.security import _create_first_user
21
23
  from .config import get_settings
24
+ from .logger import config_uvicorn_loggers
22
25
  from .logger import reset_logger_handlers
23
26
  from .logger import set_logger
24
27
  from .syringe import Inject
@@ -39,12 +42,15 @@ def collect_routers(app: FastAPI) -> None:
39
42
  from .app.routes.admin.v2 import router_admin_v2
40
43
  from .app.routes.auth import router_auth
41
44
 
45
+ settings = Inject(get_settings)
46
+
42
47
  app.include_router(router_api, prefix="/api")
43
- app.include_router(router_api_v1, prefix="/api/v1")
48
+ if settings.FRACTAL_API_V1_MODE == "include":
49
+ app.include_router(router_api_v1, prefix="/api/v1")
50
+ app.include_router(
51
+ router_admin_v1, prefix="/admin/v1", tags=["V1 Admin area"]
52
+ )
44
53
  app.include_router(router_api_v2, prefix="/api/v2")
45
- app.include_router(
46
- router_admin_v1, prefix="/admin/v1", tags=["V1 Admin area"]
47
- )
48
54
  app.include_router(
49
55
  router_admin_v2, prefix="/admin/v2", tags=["V2 Admin area"]
50
56
  )
@@ -73,14 +79,27 @@ def check_settings() -> None:
73
79
  reset_logger_handlers(logger)
74
80
 
75
81
 
76
- async def __on_startup() -> None:
77
- """
78
- Private wrapper for routines that need to be executed at server start-up.
79
-
80
- It should only be called from a `@app.on_event("startup")`-decorated
81
- callable.
82
- """
82
+ @asynccontextmanager
83
+ async def lifespan(app: FastAPI):
84
+ logger = set_logger("fractal_server.lifespan")
85
+ logger.info("Start application startup")
83
86
  check_settings()
87
+ settings = Inject(get_settings)
88
+ await _create_first_user(
89
+ email=settings.FRACTAL_DEFAULT_ADMIN_EMAIL,
90
+ password=settings.FRACTAL_DEFAULT_ADMIN_PASSWORD,
91
+ username=settings.FRACTAL_DEFAULT_ADMIN_USERNAME,
92
+ is_superuser=True,
93
+ is_verified=True,
94
+ )
95
+ config_uvicorn_loggers()
96
+ logger.info("End application startup")
97
+ reset_logger_handlers(logger)
98
+ yield
99
+ logger = set_logger("fractal_server.lifespan")
100
+ logger.info("Start application shutdown")
101
+ logger.info("End application shutdown")
102
+ reset_logger_handlers(logger)
84
103
 
85
104
 
86
105
  def start_application() -> FastAPI:
@@ -91,27 +110,9 @@ def start_application() -> FastAPI:
91
110
  app:
92
111
  The fully initialised application.
93
112
  """
94
- app = FastAPI()
113
+ app = FastAPI(lifespan=lifespan)
95
114
  collect_routers(app)
96
115
  return app
97
116
 
98
117
 
99
118
  app = start_application()
100
-
101
-
102
- @app.on_event("startup")
103
- async def on_startup() -> None:
104
- """
105
- Register the starup calls
106
-
107
- If the calls raise any error, the application startup is aborted.
108
- """
109
- settings = Inject(get_settings)
110
- await _create_first_user(
111
- email=settings.FRACTAL_DEFAULT_ADMIN_EMAIL,
112
- password=settings.FRACTAL_DEFAULT_ADMIN_PASSWORD,
113
- username=settings.FRACTAL_DEFAULT_ADMIN_USERNAME,
114
- is_superuser=True,
115
- is_verified=True,
116
- )
117
- await __on_startup()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fractal-server
3
- Version: 2.0.5
3
+ Version: 2.1.0
4
4
  Summary: Server component of the Fractal analytics platform
5
5
  Home-page: https://github.com/fractal-analytics-platform/fractal-server
6
6
  License: BSD-3-Clause
@@ -1,15 +1,15 @@
1
- fractal_server/__init__.py,sha256=iemtcbFq1-Ut2bx94D5rbhyNac6WTU--MpGgUfTDdXI,22
1
+ fractal_server/__init__.py,sha256=M-UCl3baEQIODOL7Zae_0jXfPyeyyPZypKzTHK83oM0,22
2
2
  fractal_server/__main__.py,sha256=CocbzZooX1UtGqPi55GcHGNxnrJXFg5tUU5b3wyFCyo,4958
3
3
  fractal_server/alembic.ini,sha256=MWwi7GzjzawI9cCAK1LW7NxIBQDUqD12-ptJoq5JpP0,3153
4
4
  fractal_server/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  fractal_server/app/db/__init__.py,sha256=WZEVfdJAX7ZyBM1ngfEGeqWWcjK_NygtCbawpmbwGpU,4042
6
- fractal_server/app/models/__init__.py,sha256=FRRDJkx7LgPaUqSp8IV7qevu_VE2dt0-fQtQruHFaVo,267
6
+ fractal_server/app/models/__init__.py,sha256=QGRjxBgk6GzHyyXh_7RuHvpLoe5PTl1g5KLkGqhFYMQ,199
7
7
  fractal_server/app/models/linkuserproject.py,sha256=eQaourbGRshvlMVlKzLYJKHEjfsW1CbWws9yW4eHXhA,567
8
- fractal_server/app/models/security.py,sha256=UG9wCVA5GRSyHrYEFhH8lIF1hXykxsr9LSi8_dFToMY,3378
9
- fractal_server/app/models/v1/__init__.py,sha256=qUlUGnWFaIm3aBXfUuLdhcW9f_s1VzAEuypr31zvHGo,458
8
+ fractal_server/app/models/security.py,sha256=0oYj_cqPcQFsPFDyN4OTsqbXsLlXRcweawjP_iSiRI0,2900
9
+ fractal_server/app/models/v1/__init__.py,sha256=hUI7dEbPaiZGN0IbHW4RSmSicyvtn_xeuevoX7zvUwI,466
10
10
  fractal_server/app/models/v1/dataset.py,sha256=99GDgt7njx8yYQApkImqp_7bHA5HH3ElvbR6Oyj9kVI,2017
11
11
  fractal_server/app/models/v1/job.py,sha256=QLGXcWdVRHaUHQNDapYYlLpEfw4K7QyD8TmcwhrWw2o,3304
12
- fractal_server/app/models/v1/project.py,sha256=sDmAFLOBK5o4dLrwsIN681JcT5J1rzoUNTV9QVqwnA8,859
12
+ fractal_server/app/models/v1/project.py,sha256=tf6fniyBH-sb6rBvGiqNl2wgN9ipR4hDEE3OKvxKaoo,804
13
13
  fractal_server/app/models/v1/state.py,sha256=ew7xw3iPzBwUnPlzmsOEMiPbPEMsJn_TyZ5cK93jBRQ,1095
14
14
  fractal_server/app/models/v1/task.py,sha256=3xZqNeFYUqslh8ddMSXF2nO4nIiOD8T5Ij37wY20kss,2782
15
15
  fractal_server/app/models/v1/workflow.py,sha256=dnY5eMaOe3oZv8arn00RNX9qVkBtTLG-vYdWXcQuyo4,3950
@@ -17,7 +17,7 @@ fractal_server/app/models/v2/__init__.py,sha256=uLzdInqATSwi0bS_V4vKB-TqFrOFaXux
17
17
  fractal_server/app/models/v2/collection_state.py,sha256=nxb042i8tt8rCpmgbFJoBCYWU-34m0HdUfO9YurTp8k,588
18
18
  fractal_server/app/models/v2/dataset.py,sha256=-7sxHEw4IIAvF_uSan7tA3o8hvoakBkQ0SRvqS2iOQU,1455
19
19
  fractal_server/app/models/v2/job.py,sha256=ypJmN-qspkKBGhBG7Mt-HypSQqcQ2EmB4Bzzb2-y550,1535
20
- fractal_server/app/models/v2/project.py,sha256=CqDEKzdVxmFDMee6DnVOyX7WGmdn-dQSLSekzw_OLUc,817
20
+ fractal_server/app/models/v2/project.py,sha256=CRBnZ8QITNp6u1f5bMxvi1_mcvEfXpWyitsWB5f7gn8,759
21
21
  fractal_server/app/models/v2/task.py,sha256=9ZPhug3VWyeqgT8wQ9_8ZXQ2crSiiicRipxrxTslOso,3257
22
22
  fractal_server/app/models/v2/workflow.py,sha256=YBgFGCziUgU0aJ5EM3Svu9W2c46AewZO9VBlFCHiSps,1069
23
23
  fractal_server/app/models/v2/workflowtask.py,sha256=3jEkObsSnlI05Pur_dSsXYdJxRqPL60Z7tK5-EJLOks,1532
@@ -27,10 +27,10 @@ fractal_server/app/routes/admin/v1.py,sha256=uMupmRkicaoWazX8qSX5fgh00O3MbuSfim8
27
27
  fractal_server/app/routes/admin/v2.py,sha256=e0A6RMWfmTO5dVL95XO-P2EljdEwR00FErxahEPzODQ,13757
28
28
  fractal_server/app/routes/api/__init__.py,sha256=EVyZrEq3I_1643QGTPCC5lgCp4xH_auYbrFfogTm4pc,315
29
29
  fractal_server/app/routes/api/v1/__init__.py,sha256=Y2HQdG197J0a7DyQEE2jn53IfxD0EHGhzK1I2JZuEck,958
30
- fractal_server/app/routes/api/v1/_aux_functions.py,sha256=KoSefKiBXximu0df4fJ3l9bKsGaLO8rb3z6xhD8PWj4,11973
30
+ fractal_server/app/routes/api/v1/_aux_functions.py,sha256=lFfGJxbJc-Ryah_pPkiTH2SBncWQ15n0iqVFolzIOCM,11976
31
31
  fractal_server/app/routes/api/v1/dataset.py,sha256=HRE-8vPmVkeXf7WFYkI19mDtbY-iJZeJ7PmMiV0LMgY,16923
32
32
  fractal_server/app/routes/api/v1/job.py,sha256=NwXyhvvzdPDor0ts8Im__9-I0P1H943s4NXIRgaz7PM,5436
33
- fractal_server/app/routes/api/v1/project.py,sha256=tb1M2hhAKyHeToV0RwAQQx0ptIDeX6sEjM7dkfjCpXQ,15799
33
+ fractal_server/app/routes/api/v1/project.py,sha256=DKQ6n1CPmHqsKieBaJlKnOhKaHWgQTZIA_asJTT9Uxo,15802
34
34
  fractal_server/app/routes/api/v1/task.py,sha256=udbKnenzc-Q10elYCVB9JmOPWATraa9tZi0AaByvWo0,6129
35
35
  fractal_server/app/routes/api/v1/task_collection.py,sha256=mFaYyCWtCPRqvs3j6zx_zaiDXn31Uzoa7UHZS-Lu_L0,8882
36
36
  fractal_server/app/routes/api/v1/workflow.py,sha256=7r9IoIevg_rvYCrerMOsIsUabSOQatxdPCfLdkP0dRs,10942
@@ -42,7 +42,7 @@ fractal_server/app/routes/api/v2/images.py,sha256=4r_HblPWyuKSZSJZfn8mbDaLv1ncwZ
42
42
  fractal_server/app/routes/api/v2/job.py,sha256=BtaxErBDbLwjY2zgGD1I6eRpsffoMonifcS1CMEXmLU,5325
43
43
  fractal_server/app/routes/api/v2/project.py,sha256=qyvizYZ4aUFgF3tGdfp4z8AwWgfo19N_KbFEljfUaC8,5594
44
44
  fractal_server/app/routes/api/v2/status.py,sha256=osLexiMOSqmYcEV-41tlrwt9ofyFbtRm5HmPS5BU0t4,6394
45
- fractal_server/app/routes/api/v2/submit.py,sha256=su512HjafuD_lyiLswyxN4T8xwKaMpWOhGsYVPh94sI,7672
45
+ fractal_server/app/routes/api/v2/submit.py,sha256=mdY1fN9VA8-8DkqeAGrzHa4n37QSPP-gN3sc4z-c-wc,7592
46
46
  fractal_server/app/routes/api/v2/task.py,sha256=bRTtGgL8BBGbT7csVeRB-a54clgU2xHydi5XpcByDxg,8297
47
47
  fractal_server/app/routes/api/v2/task_collection.py,sha256=eN3NkZaZHkrqnLGRKE7Xd5mo0cHc8aK2lojCt26ErOQ,8988
48
48
  fractal_server/app/routes/api/v2/task_legacy.py,sha256=P_VJv9v0yzFUBuS-DQHhMVSOe20ecGJJcFBqiiFciOM,1628
@@ -63,13 +63,13 @@ fractal_server/app/runner/executors/slurm/_batching.py,sha256=1P6CgrAOCK9u_EvNFT
63
63
  fractal_server/app/runner/executors/slurm/_check_jobs_status.py,sha256=8d29a7DQ2xoWxoFQCnFfTpHER-qBX8mEatl4Dw5HU_o,1908
64
64
  fractal_server/app/runner/executors/slurm/_executor_wait_thread.py,sha256=J3tjAx33nBgW4eHAXDte7hDs7Oe9FLEZaElEt8inrbg,4421
65
65
  fractal_server/app/runner/executors/slurm/_slurm_config.py,sha256=rF37XDImX1QoWx37MC5hSM9AuY_KfHU5gaWwN4vl4Zk,15552
66
- fractal_server/app/runner/executors/slurm/_subprocess_run_as_user.py,sha256=8CCtxWCuB5UDst3C_WJxBU77xwPrpDyq7iMCZMnodXU,5123
67
- fractal_server/app/runner/executors/slurm/executor.py,sha256=267YTDvyeA0yX2n2HffxP8OAu_CQF5uB9K-_AaUG3iU,44655
66
+ fractal_server/app/runner/executors/slurm/_subprocess_run_as_user.py,sha256=YwfJzZr_y4FL_hirHJdWK0vWzrldjoZZhXVFlO2AOMU,5131
67
+ fractal_server/app/runner/executors/slurm/executor.py,sha256=z2MbI9He1lPhKBPMs0pqoQ9wUiAsxOIZY62s5VFHs-0,45044
68
68
  fractal_server/app/runner/executors/slurm/remote.py,sha256=wLziIsGdSMiO-jIXM8x77JRK82g_2hx0iBKTiMghuIo,5852
69
69
  fractal_server/app/runner/filenames.py,sha256=9lwu3yB4C67yiijYw8XIKaLFn3mJUt6_TCyVFM_aZUQ,206
70
70
  fractal_server/app/runner/set_start_and_last_task_index.py,sha256=-q4zVybAj8ek2XlbENKlfOAJ39hT_zoJoZkqzDqiAMY,1254
71
71
  fractal_server/app/runner/task_files.py,sha256=b5aRDi35QemBQnHT_AU6L_IPJJU_k_f5sJn-JXzkzy0,3180
72
- fractal_server/app/runner/v1/__init__.py,sha256=Uqf9smd4G9JCunXOsJ0U_DJyhYvl8TwItY3TbDLBLMc,13620
72
+ fractal_server/app/runner/v1/__init__.py,sha256=kMiQJJ-XUp2ecI0tUAUYD_Em1vcct9iXULMoI5SGdU4,13520
73
73
  fractal_server/app/runner/v1/_common.py,sha256=2-NScI-7qCIw14Od90so1onw-psIt8x1kx6EXq489Vk,21246
74
74
  fractal_server/app/runner/v1/_local/__init__.py,sha256=ZcWftuGRLmN8-S6QZXm6FhNehsxwmwZRhuRv-a7zA6s,6839
75
75
  fractal_server/app/runner/v1/_local/_local_config.py,sha256=hM7SPxR07luXPcXdrWXRpEB2uOyjSSRUdqW3QBKJn9c,3147
@@ -120,14 +120,15 @@ fractal_server/app/schemas/v2/task.py,sha256=7IfxiZkaVqlARy7WYE_H8m7j_IEcuQaZORU
120
120
  fractal_server/app/schemas/v2/task_collection.py,sha256=sY29NQfJrbjiidmVkVjSIH-20wIsmh7G1QOdr05KoDQ,3171
121
121
  fractal_server/app/schemas/v2/workflow.py,sha256=Zzx3e-qgkH8le0FUmAx9UrV5PWd7bj14PPXUh_zgZXM,1827
122
122
  fractal_server/app/schemas/v2/workflowtask.py,sha256=atVuVN4aXsVEOmSd-vyg-8_8OnPmqx-gT75rXcn_AlQ,6552
123
- fractal_server/app/security/__init__.py,sha256=wxosoHc3mJYPCdPMyWnRD8w_2OgnKYp2aDkdmwrZh5k,11203
124
- fractal_server/config.py,sha256=lXofyyyMdRQoK39yTBUwVotRT8ptSb5LceHlZrUuK2o,15048
123
+ fractal_server/app/security/__init__.py,sha256=2-QbwuR-nsuHM_uwKS_WzYvkhnuhO5jUv8UVROetyVk,11169
124
+ fractal_server/config.py,sha256=7fF_lTGH_mH_16aYr8m3E5Dv81jH9wdJuGu-2p1x9H0,16081
125
125
  fractal_server/data_migrations/README.md,sha256=_3AEFvDg9YkybDqCLlFPdDmGJvr6Tw7HRI14aZ3LOIw,398
126
126
  fractal_server/images/__init__.py,sha256=xO6jTLE4EZKO6cTDdJsBmK9cdeh9hFTaSbSuWgQg7y4,196
127
127
  fractal_server/images/models.py,sha256=9ipU5h4N6ogBChoB-2vHoqtL0TXOHCv6kRR-fER3mkM,4167
128
128
  fractal_server/images/tools.py,sha256=gxeniYy4Z-cp_ToK2LHPJUTVVUUrdpogYdcBUvBuLiY,2209
129
- fractal_server/logger.py,sha256=AuCmrwIydaFWpotMTM_tGRNJbExQO5fP8Xolo82Vdbg,4178
130
- fractal_server/main.py,sha256=u_MngsZWI-1uKrBpNDUYXKyLgaYodyAEw2dKZrIzS_U,3381
129
+ fractal_server/logger/__init__.py,sha256=Q_e03Lj30VWdCqGBJrKw9A2QEeDbCKC_OOkDQVW9Dyw,5132
130
+ fractal_server/logger/gunicorn_logger.py,sha256=vb5s7mruCHPkKWGrTTOPyrB_658Y2Z05ECdHhCCBhp0,644
131
+ fractal_server/main.py,sha256=faQfINM4k3G7Oakkn8R_EfHLma6Dd-U_TeyWesjs0js,3613
131
132
  fractal_server/migrations/README,sha256=4rQvyDfqodGhpJw74VYijRmgFP49ji5chyEemWGHsuw,59
132
133
  fractal_server/migrations/env.py,sha256=bsl0HGZpjhommztgcs7wQ94sJzI1Orgnij97K8P_uyo,2630
133
134
  fractal_server/migrations/script.py.mako,sha256=oMXw9LC3zRbinWWPPDgeZ4z9FJrV2zhRWiYdS5YgNbI,526
@@ -162,8 +163,8 @@ fractal_server/tasks/v2/background_operations.py,sha256=MAMBn6W2bhkdK59kfUGiD7a1
162
163
  fractal_server/tasks/v2/get_collection_data.py,sha256=Qhf2T_aaqAfqu9_KpUSlXsS7EJoZQbEPEreHHa2jco8,502
163
164
  fractal_server/urls.py,sha256=5o_qq7PzKKbwq12NHSQZDmDitn5RAOeQ4xufu-2v9Zk,448
164
165
  fractal_server/utils.py,sha256=b7WwFdcFZ8unyT65mloFToYuEDXpQoHRcmRNqrhd_dQ,2115
165
- fractal_server-2.0.5.dist-info/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
166
- fractal_server-2.0.5.dist-info/METADATA,sha256=cJupXGRdWtFkGReZMLccMSwEAXunkgL2TQoZZ1pesmM,4222
167
- fractal_server-2.0.5.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
168
- fractal_server-2.0.5.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
169
- fractal_server-2.0.5.dist-info/RECORD,,
166
+ fractal_server-2.1.0.dist-info/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
167
+ fractal_server-2.1.0.dist-info/METADATA,sha256=kyfeNStKB16vegug3_OV6wxtnxDT1Mo1pqj5HKKXG1w,4222
168
+ fractal_server-2.1.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
169
+ fractal_server-2.1.0.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
170
+ fractal_server-2.1.0.dist-info/RECORD,,