fractal-server 2.0.0a2__tar.gz → 2.0.0a4__tar.gz

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 (165) hide show
  1. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/PKG-INFO +7 -7
  2. fractal_server-2.0.0a4/fractal_server/__init__.py +1 -0
  3. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/models/v2/dataset.py +2 -2
  4. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/routes/admin/v2.py +37 -2
  5. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/routes/api/v2/__init__.py +1 -1
  6. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/routes/api/v2/_aux_functions.py +14 -9
  7. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/routes/api/v2/dataset.py +0 -1
  8. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/routes/api/v2/images.py +16 -8
  9. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/routes/api/v2/project.py +0 -4
  10. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/routes/api/v2/submit.py +3 -4
  11. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/routes/api/v2/workflow.py +19 -36
  12. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/routes/api/v2/workflowtask.py +14 -24
  13. fractal_server-2.0.0a4/fractal_server/app/runner/__init__.py +0 -0
  14. fractal_server-2.0.0a4/fractal_server/app/runner/executors/__init__.py +0 -0
  15. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/executors/slurm/executor.py +0 -2
  16. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/v1/_local/__init__.py +2 -1
  17. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/v1/_slurm/__init__.py +4 -2
  18. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/v1/_slurm/_submit_setup.py +2 -2
  19. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/v2/__init__.py +3 -3
  20. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/v2/_local/__init__.py +11 -16
  21. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/v2/_slurm/__init__.py +4 -2
  22. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/v2/_slurm/_submit_setup.py +2 -3
  23. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/v2/handle_failed_job.py +9 -7
  24. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/v2/runner.py +29 -27
  25. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/v2/runner_functions.py +5 -5
  26. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/v2/task_interface.py +12 -7
  27. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/v2/v1_compat.py +4 -4
  28. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/schemas/_validators.py +22 -0
  29. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/schemas/v1/task.py +1 -0
  30. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/schemas/v2/dumps.py +1 -1
  31. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/schemas/v2/task.py +27 -1
  32. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/schemas/v2/task_collection.py +4 -0
  33. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/schemas/v2/workflowtask.py +60 -17
  34. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/images/models.py +14 -1
  35. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/images/tools.py +7 -7
  36. fractal_server-2.0.0a4/fractal_server/py.typed +0 -0
  37. fractal_server-2.0.0a4/fractal_server/tasks/v1/__init__.py +0 -0
  38. fractal_server-2.0.0a4/fractal_server/tasks/v2/__init__.py +0 -0
  39. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/pyproject.toml +20 -18
  40. fractal_server-2.0.0a2/fractal_server/__init__.py +0 -1
  41. fractal_server-2.0.0a2/fractal_server/app/schemas/json_schemas/manifest.json +0 -81
  42. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/LICENSE +0 -0
  43. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/README.md +0 -0
  44. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/__main__.py +0 -0
  45. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/alembic.ini +0 -0
  46. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/__init__.py +0 -0
  47. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/db/__init__.py +0 -0
  48. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/models/__init__.py +0 -0
  49. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/models/linkuserproject.py +0 -0
  50. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/models/security.py +0 -0
  51. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/models/state.py +0 -0
  52. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/models/v1/__init__.py +0 -0
  53. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/models/v1/dataset.py +0 -0
  54. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/models/v1/job.py +0 -0
  55. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/models/v1/project.py +0 -0
  56. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/models/v1/task.py +0 -0
  57. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/models/v1/workflow.py +0 -0
  58. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/models/v2/__init__.py +0 -0
  59. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/models/v2/job.py +0 -0
  60. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/models/v2/project.py +0 -0
  61. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/models/v2/task.py +0 -0
  62. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/models/v2/workflow.py +0 -0
  63. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/models/v2/workflowtask.py +0 -0
  64. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/routes/__init__.py +0 -0
  65. {fractal_server-2.0.0a2/fractal_server/app/routes/aux → fractal_server-2.0.0a4/fractal_server/app/routes/admin}/__init__.py +0 -0
  66. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/routes/admin/v1.py +0 -0
  67. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/routes/api/__init__.py +0 -0
  68. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/routes/api/v1/__init__.py +0 -0
  69. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/routes/api/v1/_aux_functions.py +0 -0
  70. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/routes/api/v1/dataset.py +0 -0
  71. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/routes/api/v1/job.py +0 -0
  72. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/routes/api/v1/project.py +0 -0
  73. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/routes/api/v1/task.py +0 -0
  74. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/routes/api/v1/task_collection.py +0 -0
  75. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/routes/api/v1/workflow.py +0 -0
  76. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/routes/api/v1/workflowtask.py +0 -0
  77. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/routes/api/v2/job.py +0 -0
  78. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/routes/api/v2/task.py +0 -0
  79. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/routes/api/v2/task_collection.py +0 -0
  80. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/routes/auth.py +0 -0
  81. /fractal_server-2.0.0a2/fractal_server/py.typed → /fractal_server-2.0.0a4/fractal_server/app/routes/aux/__init__.py +0 -0
  82. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/routes/aux/_job.py +0 -0
  83. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/routes/aux/_runner.py +0 -0
  84. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/.gitignore +0 -0
  85. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/async_wrap.py +0 -0
  86. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/components.py +0 -0
  87. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/exceptions.py +0 -0
  88. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/executors/slurm/__init__.py +0 -0
  89. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/executors/slurm/_batching.py +0 -0
  90. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/executors/slurm/_check_jobs_status.py +0 -0
  91. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/executors/slurm/_executor_wait_thread.py +0 -0
  92. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/executors/slurm/_slurm_config.py +0 -0
  93. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/executors/slurm/_subprocess_run_as_user.py +0 -0
  94. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/executors/slurm/remote.py +0 -0
  95. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/filenames.py +0 -0
  96. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/set_start_and_last_task_index.py +0 -0
  97. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/task_files.py +0 -0
  98. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/v1/__init__.py +0 -0
  99. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/v1/_common.py +0 -0
  100. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/v1/_local/_local_config.py +0 -0
  101. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/v1/_local/_submit_setup.py +0 -0
  102. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/v1/_local/executor.py +0 -0
  103. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/v1/_slurm/get_slurm_config.py +0 -0
  104. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/v1/common.py +0 -0
  105. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/v1/handle_failed_job.py +0 -0
  106. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/v2/_local/_local_config.py +0 -0
  107. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/v2/_local/_submit_setup.py +0 -0
  108. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/v2/_local/executor.py +0 -0
  109. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/v2/_slurm/get_slurm_config.py +0 -0
  110. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/v2/deduplicate_list.py +0 -0
  111. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/v2/merge_outputs.py +0 -0
  112. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/runner/v2/runner_functions_low_level.py +0 -0
  113. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/schemas/__init__.py +0 -0
  114. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/schemas/state.py +0 -0
  115. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/schemas/user.py +0 -0
  116. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/schemas/v1/__init__.py +0 -0
  117. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/schemas/v1/applyworkflow.py +0 -0
  118. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/schemas/v1/dataset.py +0 -0
  119. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/schemas/v1/dumps.py +0 -0
  120. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/schemas/v1/manifest.py +0 -0
  121. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/schemas/v1/project.py +0 -0
  122. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/schemas/v1/task_collection.py +0 -0
  123. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/schemas/v1/workflow.py +0 -0
  124. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/schemas/v2/__init__.py +0 -0
  125. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/schemas/v2/dataset.py +0 -0
  126. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/schemas/v2/job.py +0 -0
  127. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/schemas/v2/manifest.py +0 -0
  128. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/schemas/v2/project.py +0 -0
  129. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/schemas/v2/workflow.py +0 -0
  130. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/app/security/__init__.py +0 -0
  131. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/config.py +0 -0
  132. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/data_migrations/README.md +0 -0
  133. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/images/__init__.py +0 -0
  134. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/logger.py +0 -0
  135. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/main.py +0 -0
  136. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/migrations/README +0 -0
  137. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/migrations/env.py +0 -0
  138. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/migrations/script.py.mako +0 -0
  139. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/migrations/versions/4c308bcaea2b_add_task_args_schema_and_task_args_.py +0 -0
  140. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/migrations/versions/4cedeb448a53_workflowtask_foreign_keys_not_nullables.py +0 -0
  141. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/migrations/versions/50a13d6138fd_initial_schema.py +0 -0
  142. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/migrations/versions/70e77f1c38b0_add_applyworkflow_first_task_index_and_.py +0 -0
  143. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/migrations/versions/71eefd1dd202_add_slurm_accounts.py +0 -0
  144. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/migrations/versions/84bf0fffde30_add_dumps_to_applyworkflow.py +0 -0
  145. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/migrations/versions/8f79bd162e35_add_docs_info_and_docs_link_to_task_.py +0 -0
  146. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/migrations/versions/97f444d47249_add_applyworkflow_project_dump.py +0 -0
  147. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/migrations/versions/99ea79d9e5d2_add_dataset_history.py +0 -0
  148. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/migrations/versions/9fd26a2b0de4_add_workflow_timestamp_created.py +0 -0
  149. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/migrations/versions/a7f4d6137b53_add_workflow_dump_to_applyworkflow.py +0 -0
  150. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/migrations/versions/d4fe3708d309_make_applyworkflow_workflow_dump_non_.py +0 -0
  151. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/migrations/versions/d71e732236cd_v2.py +0 -0
  152. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/migrations/versions/e75cac726012_make_applyworkflow_start_timestamp_not_.py +0 -0
  153. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/migrations/versions/efa89c30e0a4_add_project_timestamp_created.py +0 -0
  154. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/migrations/versions/f384e1c0cf5d_drop_task_default_args_columns.py +0 -0
  155. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/syringe.py +0 -0
  156. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/tasks/__init__.py +0 -0
  157. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/tasks/endpoint_operations.py +0 -0
  158. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/tasks/utils.py +0 -0
  159. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/tasks/v1/_TaskCollectPip.py +0 -0
  160. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/tasks/v1/background_operations.py +0 -0
  161. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/tasks/v1/get_collection_data.py +0 -0
  162. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/tasks/v2/_TaskCollectPip.py +0 -0
  163. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/tasks/v2/background_operations.py +0 -0
  164. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/tasks/v2/get_collection_data.py +0 -0
  165. {fractal_server-2.0.0a2 → fractal_server-2.0.0a4}/fractal_server/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fractal-server
3
- Version: 2.0.0a2
3
+ Version: 2.0.0a4
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
@@ -16,21 +16,21 @@ Classifier: Programming Language :: Python :: 3.12
16
16
  Provides-Extra: gunicorn
17
17
  Provides-Extra: postgres
18
18
  Requires-Dist: aiosqlite (>=0.19.0,<0.20.0)
19
- Requires-Dist: alembic (>=1.9.1,<2.0.0)
19
+ Requires-Dist: alembic (>=1.13.1,<2.0.0)
20
20
  Requires-Dist: asyncpg (>=0.29.0,<0.30.0) ; extra == "postgres"
21
21
  Requires-Dist: bcrypt (==4.0.1)
22
- Requires-Dist: cloudpickle (>=2.2.1,<2.3.0)
22
+ Requires-Dist: cloudpickle (>=3.0.0,<3.1.0)
23
23
  Requires-Dist: clusterfutures (>=0.5,<0.6)
24
- Requires-Dist: fastapi (>=0.109.0,<0.110.0)
24
+ Requires-Dist: fastapi (>=0.110.0,<0.111.0)
25
25
  Requires-Dist: fastapi-users[oauth] (>=12.1.0,<13.0.0)
26
26
  Requires-Dist: gunicorn (>=21.2.0,<22.0.0) ; extra == "gunicorn"
27
27
  Requires-Dist: packaging (>=23.2,<24.0)
28
28
  Requires-Dist: psycopg2 (>=2.9.5,<3.0.0) ; extra == "postgres"
29
29
  Requires-Dist: pydantic (>=1.10.8,<2)
30
- Requires-Dist: python-dotenv (>=0.21.0,<0.22.0)
30
+ Requires-Dist: python-dotenv (>=1.0.0,<2.0.0)
31
31
  Requires-Dist: sqlalchemy[asyncio] (>=2.0.23,<2.1)
32
- Requires-Dist: sqlmodel (>=0.0.14,<0.0.15)
33
- Requires-Dist: uvicorn (>=0.27.0,<0.28.0)
32
+ Requires-Dist: sqlmodel (>=0.0.16,<0.0.17)
33
+ Requires-Dist: uvicorn (>=0.29.0,<0.30.0)
34
34
  Project-URL: Changelog, https://github.com/fractal-analytics-platform/fractal-server/blob/main/CHANGELOG.md
35
35
  Project-URL: Documentation, https://fractal-analytics-platform.github.io/fractal-server
36
36
  Project-URL: Repository, https://github.com/fractal-analytics-platform/fractal-server
@@ -0,0 +1 @@
1
+ __VERSION__ = "2.0.0a4"
@@ -51,5 +51,5 @@ class DatasetV2(SQLModel, table=True):
51
51
  )
52
52
 
53
53
  @property
54
- def image_paths(self) -> list[str]:
55
- return [image["path"] for image in self.images]
54
+ def image_zarr_urls(self) -> list[str]:
55
+ return [image["zarr_url"] for image in self.images]
@@ -12,6 +12,7 @@ from fastapi import HTTPException
12
12
  from fastapi import Response
13
13
  from fastapi import status
14
14
  from fastapi.responses import StreamingResponse
15
+ from pydantic import BaseModel
15
16
  from sqlmodel import select
16
17
 
17
18
  from ....config import get_settings
@@ -27,6 +28,7 @@ from ...models.v2 import ProjectV2
27
28
  from ...runner.filenames import WORKFLOW_LOG_FILENAME
28
29
  from ...schemas.v2 import JobReadV2
29
30
  from ...schemas.v2 import JobUpdateV2
31
+ from ...schemas.v2 import ProjectReadV2
30
32
  from ...security import current_active_superuser
31
33
  from ..aux._job import _write_shutdown_file
32
34
  from ..aux._job import _zip_folder_to_byte_stream
@@ -52,6 +54,35 @@ def _convert_to_db_timestamp(dt: datetime) -> datetime:
52
54
  return _dt
53
55
 
54
56
 
57
+ @router_admin_v2.get("/project/", response_model=list[ProjectReadV2])
58
+ async def view_project(
59
+ id: Optional[int] = None,
60
+ user_id: Optional[int] = None,
61
+ user: User = Depends(current_active_superuser),
62
+ db: AsyncSession = Depends(get_async_db),
63
+ ) -> list[ProjectReadV2]:
64
+ """
65
+ Query `ProjectV2` table.
66
+
67
+ Args:
68
+ id: If not `None`, select a given `project.id`.
69
+ user_id: If not `None`, select a given `project.user_id`.
70
+ """
71
+
72
+ stm = select(ProjectV2)
73
+
74
+ if id is not None:
75
+ stm = stm.where(ProjectV2.id == id)
76
+ if user_id is not None:
77
+ stm = stm.where(ProjectV2.user_list.any(User.id == user_id))
78
+
79
+ res = await db.execute(stm)
80
+ project_list = res.scalars().all()
81
+ await db.close()
82
+
83
+ return project_list
84
+
85
+
55
86
  @router_admin_v2.get("/job/", response_model=list[JobReadV2])
56
87
  async def view_job(
57
88
  id: Optional[int] = None,
@@ -249,13 +280,17 @@ async def download_job_logs(
249
280
  )
250
281
 
251
282
 
283
+ class TaskCompatibility(BaseModel):
284
+ is_v2_compatible: bool
285
+
286
+
252
287
  @router_admin_v2.patch(
253
288
  "/task-v1/{task_id}/",
254
289
  status_code=status.HTTP_200_OK,
255
290
  )
256
291
  async def flag_task_v1_as_v2_compatible(
257
292
  task_id: int,
258
- is_v2_compatible: bool,
293
+ compatibility: TaskCompatibility,
259
294
  user: User = Depends(current_active_superuser),
260
295
  db: AsyncSession = Depends(get_async_db),
261
296
  ) -> Response:
@@ -267,7 +302,7 @@ async def flag_task_v1_as_v2_compatible(
267
302
  detail=f"Task {task_id} not found",
268
303
  )
269
304
 
270
- task.is_v2_compatible = is_v2_compatible
305
+ task.is_v2_compatible = compatibility.is_v2_compatible
271
306
  await db.commit()
272
307
  await db.close()
273
308
 
@@ -19,7 +19,7 @@ router_api_v2.include_router(dataset_router_v2, tags=["V2 Dataset"])
19
19
  router_api_v2.include_router(job_router_v2, tags=["V2 Job"])
20
20
  router_api_v2.include_router(images_routes_v2, tags=["V2 Images"])
21
21
  router_api_v2.include_router(project_router_v2, tags=["V2 Project"])
22
- router_api_v2.include_router(submit_job_router_v2, tags=["V2 Submit Job"])
22
+ router_api_v2.include_router(submit_job_router_v2, tags=["V2 Job"])
23
23
  router_api_v2.include_router(task_router_v2, prefix="/task", tags=["V2 Task"])
24
24
  router_api_v2.include_router(
25
25
  task_collection_router_v2, prefix="/task", tags=["V2 Task Collection"]
@@ -8,6 +8,7 @@ from typing import Union
8
8
 
9
9
  from fastapi import HTTPException
10
10
  from fastapi import status
11
+ from sqlalchemy.orm.attributes import flag_modified
11
12
  from sqlmodel import select
12
13
  from sqlmodel.sql.expression import SelectOfScalar
13
14
 
@@ -38,7 +39,6 @@ async def _get_project_check_owner(
38
39
  project_id:
39
40
  user_id:
40
41
  db:
41
- version:
42
42
 
43
43
  Returns:
44
44
  The project object
@@ -381,8 +381,8 @@ async def _get_task_check_owner(
381
381
  def _get_submitted_jobs_statement() -> SelectOfScalar:
382
382
  """
383
383
  Returns:
384
- A sqlmodel statement that selects all `ApplyWorkflow`s with
385
- `ApplyWorkflow.status` equal to `submitted`.
384
+ A sqlmodel statement that selects all `Job`s with
385
+ `Job.status` equal to `submitted`.
386
386
  """
387
387
  stm = select(JobV2).where(JobV2.status == JobStatusTypeV1.SUBMITTED)
388
388
  return stm
@@ -405,11 +405,16 @@ async def _workflow_insert_task(
405
405
  Insert a new WorkflowTask into Workflow.task_list
406
406
 
407
407
  Args:
408
- task_id: TBD
409
- args: TBD
410
- meta: TBD
411
- order: TBD
412
- db: TBD
408
+ workflow_id:
409
+ task_id:
410
+ is_legacy_task:
411
+ order:
412
+ meta_parallel:
413
+ meta_non_parallel:
414
+ args_non_parallel:
415
+ args_parallel:
416
+ input_filters:
417
+ db:
413
418
  """
414
419
  db_workflow = await db.get(WorkflowV2, workflow_id)
415
420
  if db_workflow is None:
@@ -488,9 +493,9 @@ async def _workflow_insert_task(
488
493
  meta_non_parallel=final_meta_non_parallel,
489
494
  **input_filters_kwarg,
490
495
  )
491
- db.add(wf_task)
492
496
  db_workflow.task_list.insert(order, wf_task)
493
497
  db_workflow.task_list.reorder() # type: ignore
498
+ flag_modified(db_workflow, "task_list")
494
499
  await db.commit()
495
500
  await db.refresh(wf_task)
496
501
 
@@ -186,7 +186,6 @@ async def delete_dataset(
186
186
  jobs = res.scalars().all()
187
187
  for job in jobs:
188
188
  job.dataset_id = None
189
- await db.commit()
190
189
 
191
190
  # Delete dataset
192
191
  await db.delete(dataset)
@@ -35,7 +35,7 @@ class ImagePage(BaseModel):
35
35
 
36
36
 
37
37
  class ImageQuery(BaseModel):
38
- path: Optional[str]
38
+ zarr_url: Optional[str]
39
39
  filters: Filters = Field(default_factory=Filters)
40
40
 
41
41
 
@@ -56,11 +56,11 @@ async def post_new_image(
56
56
  )
57
57
  dataset = output["dataset"]
58
58
 
59
- if new_image.path in dataset.image_paths:
59
+ if new_image.zarr_url in dataset.image_zarr_urls:
60
60
  raise HTTPException(
61
61
  status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
62
62
  detail=(
63
- f"Image with path '{new_image.path}' "
63
+ f"Image with zarr_url '{new_image.zarr_url}' "
64
64
  f"already in DatasetV2 {dataset_id}",
65
65
  ),
66
66
  )
@@ -121,9 +121,13 @@ async def query_dataset_images(
121
121
 
122
122
  if query is not None:
123
123
 
124
- if query.path is not None:
124
+ if query.zarr_url is not None:
125
125
  image = next(
126
- (image for image in images if image["path"] == query.path),
126
+ (
127
+ image
128
+ for image in images
129
+ if image["zarr_url"] == query.zarr_url
130
+ ),
127
131
  None,
128
132
  )
129
133
  if image is None:
@@ -180,7 +184,7 @@ async def query_dataset_images(
180
184
  async def delete_dataset_images(
181
185
  project_id: int,
182
186
  dataset_id: int,
183
- path: str,
187
+ zarr_url: str,
184
188
  user: User = Depends(current_active_user),
185
189
  db: AsyncSession = Depends(get_async_db),
186
190
  ) -> Response:
@@ -191,12 +195,16 @@ async def delete_dataset_images(
191
195
  dataset = output["dataset"]
192
196
 
193
197
  image_to_remove = next(
194
- (image for image in dataset.images if image["path"] == path), None
198
+ (image for image in dataset.images if image["zarr_url"] == zarr_url),
199
+ None,
195
200
  )
196
201
  if image_to_remove is None:
197
202
  raise HTTPException(
198
203
  status_code=status.HTTP_404_NOT_FOUND,
199
- detail=f"No image with path '{path}' in DatasetV2 {dataset_id}.",
204
+ detail=(
205
+ f"No image with zarr_url '{zarr_url}' in "
206
+ f"DatasetV2 {dataset_id}."
207
+ ),
200
208
  )
201
209
 
202
210
  dataset.images.remove(image_to_remove)
@@ -169,7 +169,6 @@ async def delete_project(
169
169
  job.workflow_id = None
170
170
  # Delete workflow
171
171
  await db.delete(wf)
172
- await db.commit()
173
172
 
174
173
  # Dataset
175
174
  stm = select(DatasetV2).where(DatasetV2.project_id == project_id)
@@ -185,7 +184,6 @@ async def delete_project(
185
184
  job.dataset_id = None
186
185
  # Delete dataset
187
186
  await db.delete(ds)
188
- await db.commit()
189
187
 
190
188
  # Job
191
189
  stm = select(JobV2).where(JobV2.project_id == project_id)
@@ -194,8 +192,6 @@ async def delete_project(
194
192
  for job in jobs:
195
193
  job.project_id = None
196
194
 
197
- await db.commit()
198
-
199
195
  await db.delete(project)
200
196
  await db.commit()
201
197
 
@@ -148,7 +148,7 @@ async def apply_workflow(
148
148
  if len(user.slurm_accounts) > 0:
149
149
  job_create.slurm_account = user.slurm_accounts[0]
150
150
 
151
- # Add new ApplyWorkflow object to DB
151
+ # Add new Job object to DB
152
152
  job = JobV2(
153
153
  project_id=project_id,
154
154
  dataset_id=dataset_id,
@@ -192,9 +192,8 @@ async def apply_workflow(
192
192
  raise HTTPException(
193
193
  status_code=status.HTTP_429_TOO_MANY_REQUESTS,
194
194
  detail=(
195
- f"The endpoint 'POST /api/v2/project/{project_id}/workflow/"
196
- f"{workflow_id}/apply/' "
197
- "was called several times within an interval of less "
195
+ f"The endpoint 'POST /api/v2/project/{project_id}/job/submit/'"
196
+ " was called several times within an interval of less "
198
197
  f"than {settings.FRACTAL_API_SUBMIT_RATE_LIMIT} seconds, using"
199
198
  " the same foreign keys. If it was intentional, please wait "
200
199
  "and try again."
@@ -16,7 +16,6 @@ from ....models.v2 import JobV2
16
16
  from ....models.v2 import ProjectV2
17
17
  from ....models.v2 import TaskV2
18
18
  from ....models.v2 import WorkflowV2
19
- from ....schemas.v1 import WorkflowTaskCreateV1
20
19
  from ....schemas.v2 import WorkflowCreateV2
21
20
  from ....schemas.v2 import WorkflowExportV2
22
21
  from ....schemas.v2 import WorkflowImportV2
@@ -213,7 +212,6 @@ async def delete_workflow(
213
212
  jobs = res.scalars().all()
214
213
  for job in jobs:
215
214
  job.workflow_id = None
216
- await db.commit()
217
215
 
218
216
  # Delete workflow
219
217
  await db.delete(workflow)
@@ -341,40 +339,25 @@ async def import_workflow(
341
339
  await db.refresh(db_workflow)
342
340
 
343
341
  # Insert tasks
344
- async with db: # FIXME why?
345
-
346
- for wf_task in workflow.task_list:
347
- if wf_task.is_legacy_task is True:
348
- # Identify task_id
349
- source = wf_task.task_legacy.source
350
- task_id = source_to_id_legacy[source]
351
- # Prepare new_wf_task
352
- new_wf_task = WorkflowTaskCreateV1(
353
- **wf_task.dict(exclude_none=True)
354
- )
355
- # Insert task
356
- await _workflow_insert_task(
357
- **new_wf_task.dict(),
358
- is_legacy_task=True,
359
- workflow_id=db_workflow.id,
360
- task_id=task_id,
361
- db=db,
362
- )
363
- else:
364
- # Identify task_id
365
- source = wf_task.task.source
366
- task_id = source_to_id[source]
367
- # Prepare new_wf_task
368
- new_wf_task = WorkflowTaskCreateV2(
369
- **wf_task.dict(exclude_none=True)
370
- )
371
- # Insert task
372
- await _workflow_insert_task(
373
- **new_wf_task.dict(),
374
- workflow_id=db_workflow.id,
375
- task_id=task_id,
376
- db=db,
377
- )
342
+
343
+ for wf_task in workflow.task_list:
344
+ if wf_task.is_legacy_task is True:
345
+ source = wf_task.task_legacy.source
346
+ task_id = source_to_id_legacy[source]
347
+ else:
348
+ source = wf_task.task.source
349
+ task_id = source_to_id[source]
350
+
351
+ new_wf_task = WorkflowTaskCreateV2(
352
+ **wf_task.dict(exclude_none=True, exclude={"task", "task_legacy"})
353
+ )
354
+ # Insert task
355
+ await _workflow_insert_task(
356
+ **new_wf_task.dict(),
357
+ workflow_id=db_workflow.id,
358
+ task_id=task_id,
359
+ db=db,
360
+ )
378
361
 
379
362
  await db.close()
380
363
  return db_workflow
@@ -91,19 +91,18 @@ async def create_workflowtask(
91
91
  ),
92
92
  )
93
93
 
94
- async with db:
95
- workflow_task = await _workflow_insert_task(
96
- workflow_id=workflow.id,
97
- is_legacy_task=new_task.is_legacy_task,
98
- task_id=task_id,
99
- order=new_task.order,
100
- meta_non_parallel=new_task.meta_non_parallel,
101
- meta_parallel=new_task.meta_parallel,
102
- args_non_parallel=new_task.args_non_parallel,
103
- args_parallel=new_task.args_parallel,
104
- input_filters=new_task.input_filters,
105
- db=db,
106
- )
94
+ workflow_task = await _workflow_insert_task(
95
+ workflow_id=workflow.id,
96
+ is_legacy_task=new_task.is_legacy_task,
97
+ task_id=task_id,
98
+ order=new_task.order,
99
+ meta_non_parallel=new_task.meta_non_parallel,
100
+ meta_parallel=new_task.meta_parallel,
101
+ args_non_parallel=new_task.args_non_parallel,
102
+ args_parallel=new_task.args_parallel,
103
+ input_filters=new_task.input_filters,
104
+ db=db,
105
+ )
107
106
 
108
107
  await db.close()
109
108
 
@@ -212,17 +211,8 @@ async def update_workflowtask(
212
211
  if not actual_args:
213
212
  actual_args = None
214
213
  setattr(db_wf_task, key, actual_args)
215
- elif key == "meta_parallel":
216
- current_meta_parallel = deepcopy(db_wf_task.meta_parallel) or {}
217
- current_meta_parallel.update(value)
218
- setattr(db_wf_task, key, current_meta_parallel)
219
- elif key == "meta_non_parallel":
220
- current_meta_non_parallel = (
221
- deepcopy(db_wf_task.meta_non_parallel) or {}
222
- )
223
- current_meta_non_parallel.update(value)
224
- setattr(db_wf_task, key, current_meta_non_parallel)
225
- # FIXME handle `input_filters`
214
+ elif key in ["meta_parallel", "meta_non_parallel", "input_filters"]:
215
+ setattr(db_wf_task, key, value)
226
216
  else:
227
217
  raise HTTPException(
228
218
  status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
@@ -417,8 +417,6 @@ class FractalSlurmExecutor(SlurmExecutor):
417
417
  A `TaskFiles` object; if `None`, use
418
418
  `self.get_default_task_files()`.
419
419
 
420
- Returns:
421
- An iterator of results.
422
420
  """
423
421
 
424
422
  def _result_or_cancel(fut):
@@ -49,7 +49,8 @@ def _process_workflow(
49
49
 
50
50
  Schedules the workflow using a `FractalThreadPoolExecutor`.
51
51
 
52
- Cf. [process_workflow][fractal_server.app.runner._local.process_workflow]
52
+ Cf.
53
+ [process_workflow][fractal_server.app.runner.v1._local.process_workflow]
53
54
  for the call signature.
54
55
  """
55
56
 
@@ -66,7 +66,8 @@ def _process_workflow(
66
66
  workflow working dir and user to impersonate. It then schedules the
67
67
  workflow tasks and returns the output dataset metadata.
68
68
 
69
- Cf. [process_workflow][fractal_server.app.runner._local.process_workflow]
69
+ Cf.
70
+ [process_workflow][fractal_server.app.runner.v1._local.process_workflow]
70
71
 
71
72
  Returns:
72
73
  output_dataset_metadata: Metadata of the output dataset
@@ -132,7 +133,8 @@ async def process_workflow(
132
133
  """
133
134
  Process workflow (SLURM backend public interface)
134
135
 
135
- Cf. [process_workflow][fractal_server.app.runner._local.process_workflow]
136
+ Cf.
137
+ [process_workflow][fractal_server.app.runner.v1._local.process_workflow]
136
138
  """
137
139
 
138
140
  # Set values of first_task_index and last_task_index
@@ -12,7 +12,7 @@
12
12
  """
13
13
  Submodule to define _slurm_submit_setup, which is also the reference
14
14
  implementation of `submit_setup_call` in
15
- [fractal_server.app.runner._common][]).
15
+ [fractal_server.app.runner.v1._common][]).
16
16
  """
17
17
  from pathlib import Path
18
18
 
@@ -38,7 +38,7 @@ def _slurm_submit_setup(
38
38
 
39
39
  For now, this is the reference implementation for the argument
40
40
  `submit_setup_call` of
41
- [fractal_server.app.runner._common.execute_tasks][].
41
+ [fractal_server.app.runner.v1._common.execute_tasks][].
42
42
 
43
43
  Arguments:
44
44
  wftask:
@@ -248,7 +248,7 @@ async def submit_workflow(
248
248
  job,
249
249
  dataset,
250
250
  workflow,
251
- logger,
251
+ logger_name=logger_name,
252
252
  failed_wftask=failed_wftask,
253
253
  )
254
254
  latest_filters = assemble_filters_failed_job(job)
@@ -283,7 +283,7 @@ async def submit_workflow(
283
283
  job,
284
284
  dataset,
285
285
  workflow,
286
- logger,
286
+ logger_name=logger_name,
287
287
  )
288
288
  latest_filters = assemble_filters_failed_job(job)
289
289
  if latest_filters is not None:
@@ -313,7 +313,7 @@ async def submit_workflow(
313
313
  job,
314
314
  dataset,
315
315
  workflow,
316
- logger,
316
+ logger_name=logger_name,
317
317
  )
318
318
  latest_filters = assemble_filters_failed_job(job)
319
319
  if latest_filters is not None:
@@ -45,7 +45,8 @@ def _process_workflow(
45
45
 
46
46
  Schedules the workflow using a `FractalThreadPoolExecutor`.
47
47
 
48
- Cf. [process_workflow][fractal_server.app.runner._local.process_workflow]
48
+ Cf.
49
+ [process_workflow][fractal_server.app.runner.v2._local.process_workflow]
49
50
  for the call signature.
50
51
  """
51
52
 
@@ -91,21 +92,21 @@ async def process_workflow(
91
92
  Args:
92
93
  workflow:
93
94
  The workflow to be run
94
- input_paths:
95
- The paths to the input files to pass to the first task of the
96
- workflow
97
- output_path:
98
- The destination path for the last task of the workflow
99
- input_metadata:
100
- Initial metadata, passed to the first task
101
- logger_name:
102
- Name of the logger to log information on the run to
95
+ dataset:
96
+ Initial dataset.
103
97
  workflow_dir:
104
98
  Working directory for this run.
105
99
  workflow_dir_user:
106
100
  Working directory for this run, on the user side. This argument is
107
101
  present for compatibility with the standard backend interface, but
108
102
  for the `local` backend it cannot be different from `workflow_dir`.
103
+ first_task_index:
104
+ Positional index of the first task to execute; if `None`, start
105
+ from `0`.
106
+ last_task_index:
107
+ Positional index of the last task to execute; if `None`, proceed
108
+ until the last task.
109
+ logger_name: Logger name
109
110
  slurm_user:
110
111
  Username to impersonate to run the workflow. This argument is
111
112
  present for compatibility with the standard backend interface, but
@@ -123,12 +124,6 @@ async def process_workflow(
123
124
  to the backend executor. This argument is present for compatibility
124
125
  with the standard backend interface, but is ignored in the `local`
125
126
  backend.
126
- first_task_index:
127
- Positional index of the first task to execute; if `None`, start
128
- from `0`.
129
- last_task_index:
130
- Positional index of the last task to execute; if `None`, proceed
131
- until the last task.
132
127
 
133
128
  Raises:
134
129
  TaskExecutionError: wrapper for errors raised during tasks' execution
@@ -56,7 +56,8 @@ def _process_workflow(
56
56
  workflow working dir and user to impersonate. It then schedules the
57
57
  workflow tasks and returns the new dataset attributes
58
58
 
59
- Cf. [process_workflow][fractal_server.app.runner._local.process_workflow]
59
+ Cf.
60
+ [process_workflow][fractal_server.app.runner.v2._local.process_workflow]
60
61
 
61
62
  Returns:
62
63
  new_dataset_attributes:
@@ -112,7 +113,8 @@ async def process_workflow(
112
113
  """
113
114
  Process workflow (SLURM backend public interface)
114
115
 
115
- Cf. [process_workflow][fractal_server.app.runner._local.process_workflow]
116
+ Cf.
117
+ [process_workflow][fractal_server.app.runner.v2._local.process_workflow]
116
118
  """
117
119
 
118
120
  # Set values of first_task_index and last_task_index
@@ -11,8 +11,7 @@
11
11
  # Zurich.
12
12
  """
13
13
  Submodule to define _slurm_submit_setup, which is also the reference
14
- implementation of `submit_setup_call` in
15
- [fractal_server.app.runner._common][]).
14
+ implementation of `submit_setup_call`.
16
15
  """
17
16
  from pathlib import Path
18
17
  from typing import Literal
@@ -40,7 +39,7 @@ def _slurm_submit_setup(
40
39
 
41
40
  For now, this is the reference implementation for the argument
42
41
  `submit_setup_call` of
43
- [fractal_server.app.runner._common.execute_tasks][].
42
+ [fractal_server.app.runner.v2.runner][].
44
43
 
45
44
  Arguments:
46
45
  wftask: