Skip to content

Commit d66335f

Browse files
committed
move validation to external function
1 parent 436d7f1 commit d66335f

File tree

2 files changed

+27
-23
lines changed

2 files changed

+27
-23
lines changed

fractal_server/app/routes/api/v2/task_collection_pixi.py

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@
88
from fastapi import Response
99
from fastapi import status
1010
from fastapi import UploadFile
11-
from packaging.version import InvalidVersion
12-
from packaging.version import parse
1311

1412
from fractal_server.app.db import AsyncSession
1513
from fractal_server.app.db import get_async_db
@@ -26,9 +24,29 @@
2624
logger = set_logger(__name__)
2725

2826

27+
def get_pkgname_and_version(filename: str) -> tuple[str, str]:
28+
if not filename.endswith(".tar.gz"):
29+
raise HTTPException(
30+
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
31+
detail=f"{filename=} does not end with '.tar.gz'.",
32+
)
33+
filename_splitted = filename.split("-")
34+
if len(filename_splitted) < 2:
35+
raise HTTPException(
36+
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
37+
detail=(
38+
f"{filename=} does not contain a '-' to separate "
39+
"'pkg_name' from 'version'."
40+
),
41+
)
42+
pkg_name = filename_splitted[0]
43+
version = filename.removeprefix(f"{pkg_name}-").removesuffix(".tar.gz")
44+
return pkg_name, version
45+
46+
2947
@router.post(
3048
"/collect/pixi/",
31-
status_code=201,
49+
status_code=202,
3250
# response_model=TaskGroupActivityV2Read,
3351
)
3452
async def collect_task_pixi(
@@ -42,20 +60,4 @@ async def collect_task_pixi(
4260
user: UserOAuth = Depends(current_active_verified_user),
4361
db: AsyncSession = Depends(get_async_db),
4462
): # -> TaskGroupActivityV2Read:
45-
filename = file.filename
46-
if not filename.endswith(".tar.gz"):
47-
raise HTTPException(
48-
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
49-
detail=f"{filename=} does not end with '.tar.gz'.",
50-
)
51-
pkg_name = filename.split("-")[0]
52-
version = filename.removeprefix(f"{pkg_name}-").removesuffix(".tar.gz")
53-
try:
54-
parse(version)
55-
except InvalidVersion:
56-
raise HTTPException(
57-
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
58-
detail=(
59-
f"Detected {pkg_name=} and {version=}, but version is invalid."
60-
),
61-
)
63+
pkg_name, version = get_pkgname_and_version(file.filename)

tests/v2/test_06_tasks_lifecycle/test_api_task_collection_pixi.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,18 +28,20 @@ def empty_tar_gz(filename) -> dict:
2828
data={"pixi_version": "1.2.3"},
2929
files=empty_tar_gz("mypackage-0.1.2-a345"),
3030
)
31-
assert res.status_code == 201
31+
assert res.status_code == 202
3232

3333
res = await client.post(
3434
"api/v2/task/collect/pixi/",
3535
data={"pixi_version": "1.2.3"},
3636
files=empty_tar_gz("my-package-0.1.2-a345"),
3737
)
38-
assert res.status_code == 422
38+
# pkg_name == my
39+
# version == package-0.1.2-a345
40+
assert res.status_code == 202
3941

4042
res = await client.post(
4143
"api/v2/task/collect/pixi/",
4244
data={"pixi_version": "1.2.3"},
43-
files=empty_tar_gz("mypackage-a.b.c"),
45+
files=empty_tar_gz("mypackage0.1.2a345"),
4446
)
4547
assert res.status_code == 422

0 commit comments

Comments
 (0)