fractal-server 2.5.0a0__tar.gz → 2.5.1__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 (214) hide show
  1. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/PKG-INFO +1 -1
  2. fractal_server-2.5.1/fractal_server/__init__.py +1 -0
  3. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/api/v2/task_collection_custom.py +2 -1
  4. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/auth/_aux_auth.py +11 -5
  5. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/auth/current_user.py +5 -1
  6. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/auth/users.py +9 -8
  7. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/compress_folder.py +1 -1
  8. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/executors/slurm/sudo/_subprocess_run_as_user.py +2 -0
  9. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/executors/slurm/sudo/executor.py +3 -0
  10. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/run_subprocess.py +5 -1
  11. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/v1/_common.py +2 -0
  12. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/v2/runner_functions_low_level.py +5 -0
  13. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/schemas/user.py +32 -10
  14. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/schemas/v2/dumps.py +11 -2
  15. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/schemas/v2/task.py +6 -0
  16. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/ssh/_fabric.py +6 -0
  17. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/string_tools.py +25 -0
  18. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/pyproject.toml +2 -2
  19. fractal_server-2.5.0a0/fractal_server/__init__.py +0 -1
  20. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/LICENSE +0 -0
  21. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/README.md +0 -0
  22. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/__main__.py +0 -0
  23. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/alembic.ini +0 -0
  24. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/__init__.py +0 -0
  25. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/db/__init__.py +0 -0
  26. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/models/__init__.py +0 -0
  27. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/models/linkusergroup.py +0 -0
  28. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/models/linkuserproject.py +0 -0
  29. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/models/security.py +0 -0
  30. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/models/v1/__init__.py +0 -0
  31. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/models/v1/dataset.py +0 -0
  32. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/models/v1/job.py +0 -0
  33. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/models/v1/project.py +0 -0
  34. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/models/v1/state.py +0 -0
  35. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/models/v1/task.py +0 -0
  36. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/models/v1/workflow.py +0 -0
  37. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/models/v2/__init__.py +0 -0
  38. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/models/v2/collection_state.py +0 -0
  39. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/models/v2/dataset.py +0 -0
  40. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/models/v2/job.py +0 -0
  41. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/models/v2/project.py +0 -0
  42. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/models/v2/task.py +0 -0
  43. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/models/v2/workflow.py +0 -0
  44. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/models/v2/workflowtask.py +0 -0
  45. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/__init__.py +0 -0
  46. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/admin/__init__.py +0 -0
  47. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/admin/v1.py +0 -0
  48. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/admin/v2.py +0 -0
  49. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/api/__init__.py +0 -0
  50. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/api/v1/__init__.py +0 -0
  51. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/api/v1/_aux_functions.py +0 -0
  52. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/api/v1/dataset.py +0 -0
  53. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/api/v1/job.py +0 -0
  54. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/api/v1/project.py +0 -0
  55. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/api/v1/task.py +0 -0
  56. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/api/v1/task_collection.py +0 -0
  57. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/api/v1/workflow.py +0 -0
  58. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/api/v1/workflowtask.py +0 -0
  59. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/api/v2/__init__.py +0 -0
  60. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/api/v2/_aux_functions.py +0 -0
  61. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/api/v2/dataset.py +0 -0
  62. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/api/v2/images.py +0 -0
  63. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/api/v2/job.py +0 -0
  64. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/api/v2/project.py +0 -0
  65. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/api/v2/status.py +0 -0
  66. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/api/v2/submit.py +0 -0
  67. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/api/v2/task.py +0 -0
  68. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/api/v2/task_collection.py +0 -0
  69. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/api/v2/workflow.py +0 -0
  70. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/api/v2/workflowtask.py +0 -0
  71. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/auth/__init__.py +0 -0
  72. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/auth/group.py +0 -0
  73. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/auth/group_names.py +0 -0
  74. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/auth/login.py +0 -0
  75. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/auth/oauth.py +0 -0
  76. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/auth/register.py +0 -0
  77. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/auth/router.py +0 -0
  78. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/aux/__init__.py +0 -0
  79. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/aux/_job.py +0 -0
  80. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/routes/aux/_runner.py +0 -0
  81. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/.gitignore +0 -0
  82. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/__init__.py +0 -0
  83. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/async_wrap.py +0 -0
  84. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/components.py +0 -0
  85. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/exceptions.py +0 -0
  86. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/executors/__init__.py +0 -0
  87. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/executors/slurm/__init__.py +0 -0
  88. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/executors/slurm/_batching.py +0 -0
  89. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/executors/slurm/_slurm_config.py +0 -0
  90. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/executors/slurm/remote.py +0 -0
  91. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/executors/slurm/ssh/__init__.py +0 -0
  92. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/executors/slurm/ssh/_executor_wait_thread.py +0 -0
  93. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/executors/slurm/ssh/_slurm_job.py +0 -0
  94. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/executors/slurm/ssh/executor.py +0 -0
  95. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/executors/slurm/sudo/__init__.py +0 -0
  96. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/executors/slurm/sudo/_check_jobs_status.py +0 -0
  97. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/executors/slurm/sudo/_executor_wait_thread.py +0 -0
  98. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/extract_archive.py +0 -0
  99. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/filenames.py +0 -0
  100. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/set_start_and_last_task_index.py +0 -0
  101. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/shutdown.py +0 -0
  102. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/task_files.py +0 -0
  103. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/v1/__init__.py +0 -0
  104. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/v1/_local/__init__.py +0 -0
  105. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/v1/_local/_local_config.py +0 -0
  106. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/v1/_local/_submit_setup.py +0 -0
  107. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/v1/_local/executor.py +0 -0
  108. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/v1/_slurm/__init__.py +0 -0
  109. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/v1/_slurm/_submit_setup.py +0 -0
  110. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/v1/_slurm/get_slurm_config.py +0 -0
  111. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/v1/common.py +0 -0
  112. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/v1/handle_failed_job.py +0 -0
  113. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/v2/__init__.py +0 -0
  114. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/v2/_local/__init__.py +0 -0
  115. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/v2/_local/_local_config.py +0 -0
  116. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/v2/_local/_submit_setup.py +0 -0
  117. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/v2/_local/executor.py +0 -0
  118. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/v2/_local_experimental/__init__.py +0 -0
  119. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/v2/_local_experimental/_local_config.py +0 -0
  120. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/v2/_local_experimental/_submit_setup.py +0 -0
  121. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/v2/_local_experimental/executor.py +0 -0
  122. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/v2/_slurm_common/__init__.py +0 -0
  123. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/v2/_slurm_common/get_slurm_config.py +0 -0
  124. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/v2/_slurm_ssh/__init__.py +0 -0
  125. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/v2/_slurm_ssh/_submit_setup.py +0 -0
  126. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/v2/_slurm_sudo/__init__.py +0 -0
  127. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/v2/_slurm_sudo/_submit_setup.py +0 -0
  128. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/v2/deduplicate_list.py +0 -0
  129. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/v2/handle_failed_job.py +0 -0
  130. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/v2/merge_outputs.py +0 -0
  131. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/v2/runner.py +0 -0
  132. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/v2/runner_functions.py +0 -0
  133. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/v2/task_interface.py +0 -0
  134. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/runner/versions.py +0 -0
  135. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/schemas/__init__.py +0 -0
  136. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/schemas/_validators.py +0 -0
  137. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/schemas/user_group.py +0 -0
  138. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/schemas/v1/__init__.py +0 -0
  139. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/schemas/v1/applyworkflow.py +0 -0
  140. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/schemas/v1/dataset.py +0 -0
  141. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/schemas/v1/dumps.py +0 -0
  142. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/schemas/v1/manifest.py +0 -0
  143. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/schemas/v1/project.py +0 -0
  144. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/schemas/v1/state.py +0 -0
  145. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/schemas/v1/task.py +0 -0
  146. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/schemas/v1/task_collection.py +0 -0
  147. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/schemas/v1/workflow.py +0 -0
  148. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/schemas/v2/__init__.py +0 -0
  149. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/schemas/v2/dataset.py +0 -0
  150. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/schemas/v2/job.py +0 -0
  151. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/schemas/v2/manifest.py +0 -0
  152. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/schemas/v2/project.py +0 -0
  153. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/schemas/v2/status.py +0 -0
  154. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/schemas/v2/task_collection.py +0 -0
  155. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/schemas/v2/workflow.py +0 -0
  156. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/schemas/v2/workflowtask.py +0 -0
  157. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/app/security/__init__.py +0 -0
  158. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/config.py +0 -0
  159. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/data_migrations/2_4_0.py +0 -0
  160. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/data_migrations/README.md +0 -0
  161. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/gunicorn_fractal.py +0 -0
  162. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/images/__init__.py +0 -0
  163. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/images/models.py +0 -0
  164. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/images/tools.py +0 -0
  165. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/logger.py +0 -0
  166. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/main.py +0 -0
  167. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/migrations/README +0 -0
  168. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/migrations/env.py +0 -0
  169. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/migrations/naming_convention.py +0 -0
  170. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/migrations/script.py.mako +0 -0
  171. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/migrations/versions/091b01f51f88_add_usergroup_and_linkusergroup_table.py +0 -0
  172. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/migrations/versions/4c308bcaea2b_add_task_args_schema_and_task_args_.py +0 -0
  173. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/migrations/versions/4cedeb448a53_workflowtask_foreign_keys_not_nullables.py +0 -0
  174. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/migrations/versions/501961cfcd85_remove_link_between_v1_and_v2_tasks_.py +0 -0
  175. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/migrations/versions/50a13d6138fd_initial_schema.py +0 -0
  176. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/migrations/versions/5bf02391cfef_v2.py +0 -0
  177. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/migrations/versions/70e77f1c38b0_add_applyworkflow_first_task_index_and_.py +0 -0
  178. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/migrations/versions/71eefd1dd202_add_slurm_accounts.py +0 -0
  179. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/migrations/versions/84bf0fffde30_add_dumps_to_applyworkflow.py +0 -0
  180. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/migrations/versions/8f79bd162e35_add_docs_info_and_docs_link_to_task_.py +0 -0
  181. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/migrations/versions/97f444d47249_add_applyworkflow_project_dump.py +0 -0
  182. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/migrations/versions/99ea79d9e5d2_add_dataset_history.py +0 -0
  183. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/migrations/versions/9fd26a2b0de4_add_workflow_timestamp_created.py +0 -0
  184. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/migrations/versions/a7f4d6137b53_add_workflow_dump_to_applyworkflow.py +0 -0
  185. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/migrations/versions/d4fe3708d309_make_applyworkflow_workflow_dump_non_.py +0 -0
  186. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/migrations/versions/e75cac726012_make_applyworkflow_start_timestamp_not_.py +0 -0
  187. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/migrations/versions/efa89c30e0a4_add_project_timestamp_created.py +0 -0
  188. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/migrations/versions/f384e1c0cf5d_drop_task_default_args_columns.py +0 -0
  189. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/py.typed +0 -0
  190. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/ssh/__init__.py +0 -0
  191. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/syringe.py +0 -0
  192. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/tasks/__init__.py +0 -0
  193. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/tasks/utils.py +0 -0
  194. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/tasks/v1/_TaskCollectPip.py +0 -0
  195. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/tasks/v1/__init__.py +0 -0
  196. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/tasks/v1/background_operations.py +0 -0
  197. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/tasks/v1/endpoint_operations.py +0 -0
  198. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/tasks/v1/get_collection_data.py +0 -0
  199. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/tasks/v1/utils.py +0 -0
  200. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/tasks/v2/_TaskCollectPip.py +0 -0
  201. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/tasks/v2/__init__.py +0 -0
  202. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/tasks/v2/_venv_pip.py +0 -0
  203. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/tasks/v2/background_operations.py +0 -0
  204. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/tasks/v2/background_operations_ssh.py +0 -0
  205. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/tasks/v2/endpoint_operations.py +0 -0
  206. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/tasks/v2/templates/_1_create_venv.sh +0 -0
  207. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/tasks/v2/templates/_2_upgrade_pip.sh +0 -0
  208. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/tasks/v2/templates/_3_pip_install.sh +0 -0
  209. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/tasks/v2/templates/_4_pip_freeze.sh +0 -0
  210. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/tasks/v2/templates/_5_pip_show.sh +0 -0
  211. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/tasks/v2/utils.py +0 -0
  212. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/urls.py +0 -0
  213. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/utils.py +0 -0
  214. {fractal_server-2.5.0a0 → fractal_server-2.5.1}/fractal_server/zip_tools.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fractal-server
3
- Version: 2.5.0a0
3
+ Version: 2.5.1
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
@@ -0,0 +1 @@
1
+ __VERSION__ = "2.5.1"
@@ -20,12 +20,12 @@ from ....schemas.v2 import TaskCreateV2
20
20
  from ....schemas.v2 import TaskReadV2
21
21
  from fractal_server.app.models import UserOAuth
22
22
  from fractal_server.app.routes.auth import current_active_verified_user
23
+ from fractal_server.string_tools import validate_cmd
23
24
  from fractal_server.tasks.v2.background_operations import _insert_tasks
24
25
  from fractal_server.tasks.v2.background_operations import (
25
26
  _prepare_tasks_metadata,
26
27
  )
27
28
 
28
-
29
29
  router = APIRouter()
30
30
 
31
31
  logger = set_logger(__name__)
@@ -74,6 +74,7 @@ async def collect_task_custom(
74
74
  package_name_underscore = task_collect.package_name.replace("-", "_")
75
75
  # Note that python_command is then used as part of a subprocess.run
76
76
  # statement: be careful with mixing `'` and `"`.
77
+ validate_cmd(package_name_underscore)
77
78
  python_command = (
78
79
  "import importlib.util; "
79
80
  "from pathlib import Path; "
@@ -32,7 +32,11 @@ async def _get_single_user_with_group_names(
32
32
  res = await db.execute(stm_groups)
33
33
  groups = res.scalars().unique().all()
34
34
  group_names = [group.name for group in groups]
35
- return UserRead(**user.model_dump(), group_names=group_names)
35
+ return UserRead(
36
+ **user.model_dump(),
37
+ group_names=group_names,
38
+ oauth_accounts=user.oauth_accounts,
39
+ )
36
40
 
37
41
 
38
42
  async def _get_single_user_with_group_ids(
@@ -53,7 +57,11 @@ async def _get_single_user_with_group_ids(
53
57
  res = await db.execute(stm_links)
54
58
  links = res.scalars().unique().all()
55
59
  group_ids = [link.group_id for link in links]
56
- return UserRead(**user.model_dump(), group_ids=group_ids)
60
+ return UserRead(
61
+ **user.model_dump(),
62
+ group_ids=group_ids,
63
+ oauth_accounts=user.oauth_accounts,
64
+ )
57
65
 
58
66
 
59
67
  async def _get_single_group_with_user_ids(
@@ -97,9 +105,7 @@ async def _user_or_404(user_id: int, db: AsyncSession) -> UserOAuth:
97
105
  user_id: ID of the user
98
106
  db: Async db session
99
107
  """
100
- stm = select(UserOAuth).where(UserOAuth.id == user_id)
101
- res = await db.execute(stm)
102
- user = res.scalars().unique().one_or_none()
108
+ user = await db.get(UserOAuth, user_id, populate_existing=True)
103
109
  if user is None:
104
110
  raise HTTPException(
105
111
  status_code=status.HTTP_404_NOT_FOUND, detail="User not found."
@@ -51,9 +51,13 @@ async def patch_current_user(
51
51
  # NOTE: here it would be relevant to catch an `InvalidPasswordException`
52
52
  # (from `fastapi_users.exceptions`), if we were to allow users change
53
53
  # their own password
54
+
54
55
  user = await user_manager.update(update, current_user, safe=True)
55
- patched_user = schemas.model_validate(UserOAuth, user)
56
+ validated_user = schemas.model_validate(UserOAuth, user)
56
57
 
58
+ patched_user = await db.get(
59
+ UserOAuth, validated_user.id, populate_existing=True
60
+ )
57
61
  patched_user_with_groups = await _get_single_user_with_group_names(
58
62
  patched_user, db
59
63
  )
@@ -43,10 +43,8 @@ async def get_user(
43
43
  ) -> UserRead:
44
44
  user = await _user_or_404(user_id, db)
45
45
  if group_ids:
46
- user_with_group_ids = await _get_single_user_with_group_ids(user, db)
47
- return user_with_group_ids
48
- else:
49
- return user
46
+ user = await _get_single_user_with_group_ids(user, db)
47
+ return user
50
48
 
51
49
 
52
50
  @router_users.patch("/users/{user_id}/", response_model=UserRead)
@@ -127,9 +125,7 @@ async def patch_user(
127
125
  status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
128
126
  detail=error_msg,
129
127
  )
130
-
131
128
  patched_user = user_to_patch
132
-
133
129
  elif edit_attributes:
134
130
  # Modify user attributes
135
131
  try:
@@ -142,7 +138,10 @@ async def patch_user(
142
138
  safe=False,
143
139
  request=None,
144
140
  )
145
- patched_user = schemas.model_validate(UserOAuth, user)
141
+ validated_user = schemas.model_validate(UserOAuth, user)
142
+ patched_user = await db.get(
143
+ UserOAuth, validated_user.id, populate_existing=True
144
+ )
146
145
  except exceptions.InvalidPasswordException as e:
147
146
  raise HTTPException(
148
147
  status_code=status.HTTP_400_BAD_REQUEST,
@@ -189,9 +188,11 @@ async def list_users(
189
188
  # https://github.com/fractal-analytics-platform/fractal-server/issues/1742
190
189
  for ind, user in enumerate(user_list):
191
190
  user_list[ind] = dict(
192
- user.model_dump(),
191
+ **user.model_dump(),
192
+ oauth_accounts=user.oauth_accounts,
193
193
  group_ids=[
194
194
  link.group_id for link in links if link.user_id == user.id
195
195
  ],
196
196
  )
197
+
197
198
  return user_list
@@ -48,7 +48,7 @@ def create_tar_archive(
48
48
  "."
49
49
  )
50
50
  logger.debug(f"cmd tar:\n{cmd_tar}")
51
- run_subprocess(cmd=cmd_tar, logger_name=logger_name)
51
+ run_subprocess(cmd=cmd_tar, logger_name=logger_name, allow_char="*")
52
52
 
53
53
 
54
54
  def remove_temp_subfolder(subfolder_path_tmp_copy: Path, logger_name: str):
@@ -20,6 +20,7 @@ import subprocess # nosec
20
20
  from typing import Optional
21
21
 
22
22
  from ......logger import set_logger
23
+ from fractal_server.string_tools import validate_cmd
23
24
 
24
25
  logger = set_logger(__name__)
25
26
 
@@ -47,6 +48,7 @@ def _run_command_as_user(
47
48
  Returns:
48
49
  res: The return value from `subprocess.run`.
49
50
  """
51
+ validate_cmd(cmd)
50
52
  logger.debug(f'[_run_command_as_user] {user=}, cmd="{cmd}"')
51
53
  if user:
52
54
  new_cmd = f"sudo --set-home --non-interactive -u {user} {cmd}"
@@ -47,6 +47,7 @@ from ._subprocess_run_as_user import _path_exists_as_user
47
47
  from ._subprocess_run_as_user import _run_command_as_user
48
48
  from fractal_server import __VERSION__
49
49
  from fractal_server.app.runner.components import _COMPONENT_KEY_
50
+ from fractal_server.string_tools import validate_cmd
50
51
 
51
52
 
52
53
  logger = set_logger(__name__)
@@ -65,6 +66,7 @@ def _subprocess_run_or_raise(full_command: str) -> Optional[CompletedProcess]:
65
66
  Returns:
66
67
  The actual `CompletedProcess` output of `subprocess.run`.
67
68
  """
69
+ validate_cmd(full_command)
68
70
  try:
69
71
  output = subprocess.run( # nosec
70
72
  shlex.split(full_command),
@@ -1266,6 +1268,7 @@ class FractalSlurmExecutor(SlurmExecutor):
1266
1268
  pre_command = f"sudo --non-interactive -u {self.slurm_user}"
1267
1269
  submit_command = f"scancel {scancel_string}"
1268
1270
  full_command = f"{pre_command} {submit_command}"
1271
+ validate_cmd(full_command)
1269
1272
  logger.debug(f"Now execute `{full_command}`")
1270
1273
  try:
1271
1274
  subprocess.run( # nosec
@@ -3,11 +3,15 @@ import subprocess # nosec
3
3
  from typing import Optional
4
4
 
5
5
  from fractal_server.logger import get_logger
6
+ from fractal_server.string_tools import validate_cmd
6
7
 
7
8
 
8
9
  def run_subprocess(
9
- cmd: str, logger_name: Optional[str] = None
10
+ cmd: str,
11
+ allow_char: Optional[str] = None,
12
+ logger_name: Optional[str] = None,
10
13
  ) -> subprocess.CompletedProcess:
14
+ validate_cmd(cmd, allow_char=allow_char)
11
15
  logger = get_logger(logger_name)
12
16
  try:
13
17
  res = subprocess.run( # nosec
@@ -31,6 +31,7 @@ from .common import write_args_file
31
31
  from fractal_server.app.runner.filenames import HISTORY_FILENAME
32
32
  from fractal_server.app.runner.filenames import METADATA_FILENAME
33
33
  from fractal_server.app.runner.task_files import get_task_file_paths
34
+ from fractal_server.string_tools import validate_cmd
34
35
 
35
36
 
36
37
  def no_op_submit_setup_call(
@@ -77,6 +78,7 @@ def _call_command_wrapper(cmd: str, stdout: Path, stderr: Path) -> None:
77
78
  TERM or KILL signal)
78
79
  """
79
80
 
81
+ validate_cmd(cmd)
80
82
  # Verify that task command is executable
81
83
  if shutil.which(shlex_split(cmd)[0]) is None:
82
84
  msg = (
@@ -12,6 +12,7 @@ from ..exceptions import JobExecutionError
12
12
  from ..exceptions import TaskExecutionError
13
13
  from fractal_server.app.models.v2 import WorkflowTaskV2
14
14
  from fractal_server.app.runner.task_files import get_task_file_paths
15
+ from fractal_server.string_tools import validate_cmd
15
16
 
16
17
 
17
18
  def _call_command_wrapper(cmd: str, log_path: Path) -> None:
@@ -25,6 +26,10 @@ def _call_command_wrapper(cmd: str, log_path: Path) -> None:
25
26
  exit code (e.g. due to the subprocess receiving a
26
27
  TERM or KILL signal)
27
28
  """
29
+ try:
30
+ validate_cmd(cmd)
31
+ except ValueError as e:
32
+ raise TaskExecutionError(f"Invalid command. Original error: {str(e)}")
28
33
 
29
34
  # Verify that task command is executable
30
35
  if shutil.which(shlex_split(cmd)[0]) is None:
@@ -10,7 +10,7 @@ from pydantic.types import StrictStr
10
10
  from ._validators import val_absolute_path
11
11
  from ._validators import val_unique_list
12
12
  from ._validators import valstr
13
-
13
+ from fractal_server.string_tools import validate_cmd
14
14
 
15
15
  __all__ = (
16
16
  "UserRead",
@@ -20,6 +20,22 @@ __all__ = (
20
20
  )
21
21
 
22
22
 
23
+ class OAuthAccountRead(BaseModel):
24
+ """
25
+ Schema for storing essential `OAuthAccount` information within
26
+ `UserRead.oauth_accounts`.
27
+
28
+ Attributes:
29
+ id: ID of the row in fractal-owned `oauthaccount` table.
30
+ account_email: Email associated to OAuth account
31
+ oauth_name: Name of the OAuth provider (e.g. `github`)
32
+ """
33
+
34
+ id: int
35
+ account_email: str
36
+ oauth_name: str
37
+
38
+
23
39
  class UserRead(schemas.BaseUser[int]):
24
40
  """
25
41
  Schema for `User` read from database.
@@ -37,6 +53,7 @@ class UserRead(schemas.BaseUser[int]):
37
53
  slurm_accounts: list[str]
38
54
  group_names: Optional[list[str]] = None
39
55
  group_ids: Optional[list[int]] = None
56
+ oauth_accounts: list[OAuthAccountRead]
40
57
 
41
58
 
42
59
  class UserUpdate(schemas.BaseUserUpdate):
@@ -60,14 +77,16 @@ class UserUpdate(schemas.BaseUserUpdate):
60
77
  valstr("slurm_user")
61
78
  )
62
79
  _username = validator("username", allow_reuse=True)(valstr("username"))
63
- _cache_dir = validator("cache_dir", allow_reuse=True)(
64
- val_absolute_path("cache_dir")
65
- )
66
80
 
67
81
  _slurm_accounts = validator("slurm_accounts", allow_reuse=True)(
68
82
  val_unique_list("slurm_accounts")
69
83
  )
70
84
 
85
+ @validator("cache_dir")
86
+ def cache_dir_validator(cls, value):
87
+ validate_cmd(value)
88
+ return val_absolute_path("cache_dir")(value)
89
+
71
90
  @validator(
72
91
  "is_active",
73
92
  "is_verified",
@@ -98,9 +117,10 @@ class UserUpdateStrict(BaseModel, extra=Extra.forbid):
98
117
  val_unique_list("slurm_accounts")
99
118
  )
100
119
 
101
- _cache_dir = validator("cache_dir", allow_reuse=True)(
102
- val_absolute_path("cache_dir")
103
- )
120
+ @validator("cache_dir")
121
+ def cache_dir_validator(cls, value):
122
+ validate_cmd(value)
123
+ return val_absolute_path("cache_dir")(value)
104
124
 
105
125
 
106
126
  class UserUpdateWithNewGroupIds(UserUpdate):
@@ -140,6 +160,8 @@ class UserCreate(schemas.BaseUserCreate):
140
160
  valstr("slurm_user")
141
161
  )
142
162
  _username = validator("username", allow_reuse=True)(valstr("username"))
143
- _cache_dir = validator("cache_dir", allow_reuse=True)(
144
- val_absolute_path("cache_dir")
145
- )
163
+
164
+ @validator("cache_dir")
165
+ def cache_dir_validator(cls, value):
166
+ validate_cmd(value)
167
+ return val_absolute_path("cache_dir")(value)
@@ -39,14 +39,23 @@ class TaskDumpV2(BaseModel):
39
39
 
40
40
 
41
41
  class WorkflowTaskDumpV2(BaseModel):
42
+ """
43
+ Before v2.5.0, WorkflowTaskV2 could have `task_id=task=None` and
44
+ non-`None` `task_legacy_id` and `task_legacy`. Since these objects
45
+ may still exist in the database after version updates, we are setting
46
+ `task_id` and `task` to `Optional` to avoid response-validation errors
47
+ for the endpoints that GET datasets.
48
+ Ref issue #1783.
49
+ """
50
+
42
51
  id: int
43
52
  workflow_id: int
44
53
  order: Optional[int]
45
54
 
46
55
  input_filters: Filters
47
56
 
48
- task_id: int
49
- task: TaskDumpV2
57
+ task_id: Optional[int]
58
+ task: Optional[TaskDumpV2]
50
59
 
51
60
 
52
61
  class WorkflowDumpV2(BaseModel, extra=Extra.forbid):
@@ -11,6 +11,7 @@ from pydantic import validator
11
11
 
12
12
  from .._validators import valdictkeys
13
13
  from .._validators import valstr
14
+ from fractal_server.string_tools import validate_cmd
14
15
 
15
16
 
16
17
  class TaskCreateV2(BaseModel, extra=Extra.forbid):
@@ -43,6 +44,11 @@ class TaskCreateV2(BaseModel, extra=Extra.forbid):
43
44
  "Task must have at least one valid command "
44
45
  "(parallel and/or non_parallel)"
45
46
  )
47
+ if command_parallel is not None:
48
+ validate_cmd(command_parallel)
49
+ if command_non_parallel is not None:
50
+ validate_cmd(command_non_parallel)
51
+
46
52
  return values
47
53
 
48
54
  _name = validator("name", allow_reuse=True)(valstr("name"))
@@ -17,6 +17,7 @@ from paramiko.ssh_exception import NoValidConnectionsError
17
17
  from ..logger import get_logger
18
18
  from ..logger import set_logger
19
19
  from fractal_server.config import get_settings
20
+ from fractal_server.string_tools import validate_cmd
20
21
  from fractal_server.syringe import Inject
21
22
 
22
23
 
@@ -143,6 +144,7 @@ class FractalSSH(object):
143
144
  self,
144
145
  *,
145
146
  cmd: str,
147
+ allow_char: Optional[str] = None,
146
148
  max_attempts: Optional[int] = None,
147
149
  base_interval: Optional[int] = None,
148
150
  lock_timeout: Optional[int] = None,
@@ -152,6 +154,7 @@ class FractalSSH(object):
152
154
 
153
155
  Args:
154
156
  cmd: Command to be run
157
+ allow_char: Forbidden chars to allow for this command
155
158
  max_attempts:
156
159
  base_interval:
157
160
  lock_timeout:
@@ -159,6 +162,9 @@ class FractalSSH(object):
159
162
  Returns:
160
163
  Standard output of the command, if successful.
161
164
  """
165
+
166
+ validate_cmd(cmd, allow_char=allow_char)
167
+
162
168
  actual_max_attempts = self.default_max_attempts
163
169
  if max_attempts is not None:
164
170
  actual_max_attempts = max_attempts
@@ -1,7 +1,12 @@
1
1
  import string
2
+ from typing import Optional
2
3
 
3
4
  __SPECIAL_CHARACTERS__ = f"{string.punctuation}{string.whitespace}"
4
5
 
6
+ # List of invalid characters discussed here:
7
+ # https://github.com/fractal-analytics-platform/fractal-server/issues/1647
8
+ __NOT_ALLOWED_FOR_COMMANDS__ = r"`#$&*()\|[]{};<>?!"
9
+
5
10
 
6
11
  def sanitize_string(value: str) -> str:
7
12
  """
@@ -43,3 +48,23 @@ def slugify_task_name_for_source(task_name: str) -> str:
43
48
  Slug-ified task name.
44
49
  """
45
50
  return task_name.replace(" ", "_").lower()
51
+
52
+
53
+ def validate_cmd(command: str, allow_char: Optional[str] = None):
54
+ """
55
+ Assert that the provided `command` does not contain any of the forbidden
56
+ characters for commands
57
+ (fractal_server.string_tools.__NOT_ALLOWED_FOR_COMMANDS__)
58
+
59
+ Args:
60
+ command: command to validate.
61
+ allow_char: chars to accept among the forbidden ones
62
+ """
63
+ forbidden = set(__NOT_ALLOWED_FOR_COMMANDS__)
64
+ if allow_char is not None:
65
+ forbidden = forbidden - set(allow_char)
66
+ if not forbidden.isdisjoint(set(command)):
67
+ raise ValueError(
68
+ f"Command must not contain any of this characters: '{forbidden}'\n"
69
+ f"Provided command: '{command}'."
70
+ )
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "fractal-server"
3
- version = "2.5.0a0"
3
+ version = "2.5.1"
4
4
  description = "Server component of the Fractal analytics platform"
5
5
  authors = [
6
6
  "Tommaso Comparin <tommaso.comparin@exact-lab.it>",
@@ -92,7 +92,7 @@ filterwarnings = [
92
92
  ]
93
93
 
94
94
  [tool.bumpver]
95
- current_version = "2.5.0a0"
95
+ current_version = "2.5.1"
96
96
  version_pattern = "MAJOR.MINOR.PATCH[PYTAGNUM]"
97
97
  commit_message = "bump version {old_version} -> {new_version}"
98
98
  commit = true
@@ -1 +0,0 @@
1
- __VERSION__ = "2.5.0a0"
File without changes