Skip to content

Commit 731dd9a

Browse files
authored
♻️ Datcore-adapter refactoring (#7270)
1 parent 603a27d commit 731dd9a

File tree

37 files changed

+556
-276
lines changed

37 files changed

+556
-276
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
from datetime import datetime
2+
from enum import Enum, unique
3+
from pathlib import Path
4+
5+
from pydantic import BaseModel, ByteSize
6+
7+
8+
class DatasetMetaData(BaseModel):
9+
id: str
10+
display_name: str
11+
12+
13+
@unique
14+
class DataType(str, Enum):
15+
FILE = "FILE"
16+
FOLDER = "FOLDER"
17+
18+
19+
class PackageMetaData(BaseModel):
20+
path: Path
21+
display_path: Path
22+
package_id: str
23+
name: str
24+
filename: str
25+
s3_bucket: str
26+
size: ByteSize
27+
created_at: datetime
28+
updated_at: datetime
29+
30+
31+
class FileMetaData(BaseModel):
32+
dataset_id: str
33+
package_id: str
34+
id: str
35+
name: str
36+
type: str
37+
path: Path
38+
size: int
39+
created_at: datetime
40+
last_modified_at: datetime
41+
data_type: DataType

packages/pytest-simcore/src/pytest_simcore/helpers/httpx_assert_checks.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ def assert_status(
3232
response.status_code == expected_status_code
3333
), f"received {response.status_code}: {response.text}, expected {get_code_display_name(expected_status_code)}"
3434

35-
# reponse
35+
# response
3636
if expected_status_code == status.HTTP_204_NO_CONTENT:
3737
assert response.text == ""
3838
return None, None

packages/service-library/src/servicelib/fastapi/http_error.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,3 +99,17 @@ def set_app_default_http_error_handlers(app: FastAPI) -> None:
9999
envelope_error=True,
100100
),
101101
)
102+
103+
# SEE https://docs.python.org/3/library/exceptions.html#exception-hierarchy
104+
app.add_exception_handler(
105+
NotImplementedError,
106+
make_http_error_handler_for_exception(
107+
status.HTTP_501_NOT_IMPLEMENTED, NotImplementedError, envelope_error=True
108+
),
109+
)
110+
app.add_exception_handler(
111+
Exception,
112+
make_http_error_handler_for_exception(
113+
status.HTTP_500_INTERNAL_SERVER_ERROR, Exception, envelope_error=True
114+
),
115+
)

services/datcore-adapter/requirements/_test.in

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77

88
asgi_lifespan
9+
botocore-stubs
10+
boto3-stubs
911
coverage
1012
faker
1113
pytest
@@ -19,5 +21,3 @@ pytest-sugar
1921
pytest-xdist
2022
requests
2123
respx
22-
types-boto3
23-
types-botocore

services/datcore-adapter/requirements/_test.txt

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@ anyio==4.3.0
44
# httpx
55
asgi-lifespan==2.1.0
66
# via -r requirements/_test.in
7+
boto3-stubs==1.37.0
8+
# via -r requirements/_test.in
79
botocore-stubs==1.36.6
810
# via
9-
# types-boto3
10-
# types-botocore
11+
# -r requirements/_test.in
12+
# boto3-stubs
1113
certifi==2024.2.2
1214
# via
1315
# -c requirements/../../../requirements/constraints.txt
@@ -110,17 +112,13 @@ termcolor==2.5.0
110112
# via pytest-sugar
111113
types-awscrt==0.23.7
112114
# via botocore-stubs
113-
types-boto3==1.36.6
114-
# via -r requirements/_test.in
115-
types-botocore==1.0.2
116-
# via -r requirements/_test.in
117115
types-s3transfer==0.11.2
118-
# via types-boto3
116+
# via boto3-stubs
119117
typing-extensions==4.12.2
120118
# via
121119
# -c requirements/_base.txt
120+
# boto3-stubs
122121
# faker
123-
# types-boto3
124122
urllib3==2.2.3
125123
# via
126124
# -c requirements/../../../requirements/constraints.txt

services/datcore-adapter/src/simcore_service_datcore_adapter/api/dependencies/application.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@
66
assert get_app # nosec
77

88
__all__: tuple[str, ...] = (
9-
"get_reverse_url_mapper",
109
"get_app",
10+
"get_reverse_url_mapper",
1111
)

services/datcore-adapter/src/simcore_service_datcore_adapter/api/dependencies/pennsieve.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import cast
1+
from typing import Annotated, cast
22

33
from fastapi import Depends, FastAPI
44
from fastapi.requests import Request
@@ -11,7 +11,7 @@ def _get_app(request: Request) -> FastAPI:
1111

1212

1313
def get_pennsieve_api_client(
14-
app: FastAPI = Depends(_get_app),
14+
app: Annotated[FastAPI, Depends(_get_app)],
1515
) -> PennsieveApiClient:
1616
client = PennsieveApiClient.get_instance(app)
1717
assert client # nosec

services/datcore-adapter/src/simcore_service_datcore_adapter/api/errors/http_error.py

Lines changed: 0 additions & 36 deletions
This file was deleted.

services/datcore-adapter/src/simcore_service_datcore_adapter/api/errors/validation_error.py

Lines changed: 0 additions & 28 deletions
This file was deleted.

services/datcore-adapter/src/simcore_service_datcore_adapter/api/module_setup.py

Lines changed: 0 additions & 31 deletions
This file was deleted.

services/datcore-adapter/src/simcore_service_datcore_adapter/api/routes/datasets.py renamed to services/datcore-adapter/src/simcore_service_datcore_adapter/api/rest/datasets.py

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,13 @@
66
from fastapi_pagination import Page, Params
77
from fastapi_pagination.api import create_page, resolve_params
88
from fastapi_pagination.bases import RawParams
9+
from models_library.api_schemas_datcore_adapter.datasets import (
10+
DatasetMetaData,
11+
FileMetaData,
12+
)
913
from servicelib.fastapi.requests_decorators import cancel_on_disconnect
1014
from starlette import status
1115

12-
from ...models.domains.datasets import DatasetsOut, FileMetaDataOut
1316
from ...modules.pennsieve import PennsieveApiClient
1417
from ..dependencies.pennsieve import get_pennsieve_api_client
1518

@@ -26,7 +29,7 @@
2629
"/datasets",
2730
summary="list datasets",
2831
status_code=status.HTTP_200_OK,
29-
response_model=Page[DatasetsOut],
32+
response_model=Page[DatasetMetaData],
3033
)
3134
@cancel_on_disconnect
3235
@cached(
@@ -39,7 +42,7 @@ async def list_datasets(
3942
x_datcore_api_secret: Annotated[str, Header(..., description="Datcore API Secret")],
4043
pennsieve_client: Annotated[PennsieveApiClient, Depends(get_pennsieve_api_client)],
4144
params: Annotated[Params, Depends()],
42-
) -> Page[DatasetsOut]:
45+
) -> Page[DatasetMetaData]:
4346
assert request # nosec
4447
raw_params: RawParams = resolve_params(params).to_raw_params()
4548
assert raw_params.limit is not None # nosec
@@ -57,7 +60,7 @@ async def list_datasets(
5760
"/datasets/{dataset_id}/files",
5861
summary="list top level files/folders in a dataset",
5962
status_code=status.HTTP_200_OK,
60-
response_model=Page[FileMetaDataOut],
63+
response_model=Page[FileMetaData],
6164
)
6265
@cancel_on_disconnect
6366
@cached(
@@ -71,7 +74,7 @@ async def list_dataset_top_level_files(
7174
x_datcore_api_secret: Annotated[str, Header(..., description="Datcore API Secret")],
7275
pennsieve_client: Annotated[PennsieveApiClient, Depends(get_pennsieve_api_client)],
7376
params: Annotated[Params, Depends()],
74-
) -> Page[FileMetaDataOut]:
77+
) -> Page[FileMetaData]:
7578
assert request # nosec
7679
raw_params: RawParams = resolve_params(params).to_raw_params()
7780

@@ -91,7 +94,7 @@ async def list_dataset_top_level_files(
9194
"/datasets/{dataset_id}/files/{collection_id}",
9295
summary="list top level files/folders in a collection in a dataset",
9396
status_code=status.HTTP_200_OK,
94-
response_model=Page[FileMetaDataOut],
97+
response_model=Page[FileMetaData],
9598
)
9699
@cancel_on_disconnect
97100
@cached(
@@ -106,7 +109,7 @@ async def list_dataset_collection_files(
106109
x_datcore_api_secret: Annotated[str, Header(..., description="Datcore API Secret")],
107110
pennsieve_client: Annotated[PennsieveApiClient, Depends(get_pennsieve_api_client)],
108111
params: Annotated[Params, Depends()],
109-
) -> Page[FileMetaDataOut]:
112+
) -> Page[FileMetaData]:
110113
assert request # nosec
111114
raw_params: RawParams = resolve_params(params).to_raw_params()
112115
assert raw_params.limit is not None # nosec
@@ -126,7 +129,7 @@ async def list_dataset_collection_files(
126129
"/datasets/{dataset_id}/files_legacy",
127130
summary="list all file meta data in dataset",
128131
status_code=status.HTTP_200_OK,
129-
response_model=list[FileMetaDataOut],
132+
response_model=list[FileMetaData],
130133
)
131134
@cancel_on_disconnect
132135
@cached(
@@ -139,7 +142,7 @@ async def list_dataset_files_legacy(
139142
x_datcore_api_key: Annotated[str, Header(..., description="Datcore API Key")],
140143
x_datcore_api_secret: Annotated[str, Header(..., description="Datcore API Secret")],
141144
pennsieve_client: Annotated[PennsieveApiClient, Depends(get_pennsieve_api_client)],
142-
) -> list[FileMetaDataOut]:
145+
) -> list[FileMetaData]:
143146
assert request # nosec
144147
return await pennsieve_client.list_all_dataset_files(
145148
api_key=x_datcore_api_key,

services/datcore-adapter/src/simcore_service_datcore_adapter/api/routes/files.py renamed to services/datcore-adapter/src/simcore_service_datcore_adapter/api/rest/files.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
import logging
2-
from typing import Annotated, Any
2+
from typing import Annotated
33

44
from fastapi import APIRouter, Depends, Header, Request
5+
from models_library.api_schemas_datcore_adapter.datasets import PackageMetaData
56
from pydantic import AnyUrl, TypeAdapter
67
from servicelib.fastapi.requests_decorators import cancel_on_disconnect
78
from starlette import status
89

9-
from ...models.domains.files import FileDownloadOut
10+
from ...models.files import FileDownloadOut
1011
from ...modules.pennsieve import PennsieveApiClient
1112
from ..dependencies.pennsieve import get_pennsieve_api_client
1213

1314
router = APIRouter()
14-
log = logging.getLogger(__file__)
15+
_logger = logging.getLogger(__file__)
1516

1617

1718
@router.get(
@@ -62,7 +63,7 @@ async def delete_file(
6263
"/packages/{package_id}/files",
6364
summary="returns a package (i.e. a file)",
6465
status_code=status.HTTP_200_OK,
65-
response_model=list[dict[str, Any]],
66+
response_model=list[PackageMetaData],
6667
)
6768
@cancel_on_disconnect
6869
async def get_package(
@@ -71,12 +72,15 @@ async def get_package(
7172
x_datcore_api_key: Annotated[str, Header(..., description="Datcore API Key")],
7273
x_datcore_api_secret: Annotated[str, Header(..., description="Datcore API Secret")],
7374
pennsieve_client: Annotated[PennsieveApiClient, Depends(get_pennsieve_api_client)],
74-
) -> list[dict[str, Any]]:
75+
) -> list[PackageMetaData]:
7576
assert request # nosec
76-
return await pennsieve_client.get_package_files(
77+
78+
data = await pennsieve_client.get_package_files(
7779
api_key=x_datcore_api_key,
7880
api_secret=x_datcore_api_secret,
7981
package_id=package_id,
8082
limit=1,
8183
offset=0,
84+
fill_path=True,
8285
)
86+
return [_.to_api_model() for _ in data]

services/datcore-adapter/src/simcore_service_datcore_adapter/api/routes/health.py renamed to services/datcore-adapter/src/simcore_service_datcore_adapter/api/rest/health.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import logging
22
from collections.abc import Callable
3-
from datetime import datetime, timezone
3+
from datetime import UTC, datetime
44
from typing import Annotated
55

66
from fastapi import APIRouter, Depends
@@ -24,7 +24,7 @@
2424
status_code=status.HTTP_200_OK,
2525
)
2626
async def get_service_alive():
27-
return f"{__name__}@{datetime.now(timezone.utc).isoformat()}"
27+
return f"{__name__}@{datetime.now(UTC).isoformat()}"
2828

2929

3030
@router.get("/ready", status_code=status.HTTP_200_OK, response_model=AppStatusCheck)

0 commit comments

Comments
 (0)