Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

♻️ Datcore-adapter refactoring #7270

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
from datetime import datetime
from enum import Enum, unique
from pathlib import Path

from pydantic import BaseModel, ByteSize


class DatasetMetaData(BaseModel):
id: str
display_name: str


@unique
class DataType(str, Enum):
FILE = "FILE"
FOLDER = "FOLDER"


class PackageMetaData(BaseModel):
path: Path
display_path: Path
package_id: str
name: str
filename: str
s3_bucket: str
size: ByteSize
created_at: datetime
updated_at: datetime


class FileMetaData(BaseModel):
dataset_id: str
package_id: str
id: str
name: str
type: str
path: Path
size: int
created_at: datetime
last_modified_at: datetime
data_type: DataType
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ def assert_status(
response.status_code == expected_status_code
), f"received {response.status_code}: {response.text}, expected {get_code_display_name(expected_status_code)}"

# reponse
# response
if expected_status_code == status.HTTP_204_NO_CONTENT:
assert response.text == ""
return None, None
Expand Down
14 changes: 14 additions & 0 deletions packages/service-library/src/servicelib/fastapi/http_error.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,3 +99,17 @@ def set_app_default_http_error_handlers(app: FastAPI) -> None:
envelope_error=True,
),
)

# SEE https://docs.python.org/3/library/exceptions.html#exception-hierarchy
app.add_exception_handler(
NotImplementedError,
make_http_error_handler_for_exception(
status.HTTP_501_NOT_IMPLEMENTED, NotImplementedError, envelope_error=True
),
)
app.add_exception_handler(
Exception,
make_http_error_handler_for_exception(
status.HTTP_500_INTERNAL_SERVER_ERROR, Exception, envelope_error=True
),
)
4 changes: 2 additions & 2 deletions services/datcore-adapter/requirements/_test.in
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@


asgi_lifespan
botocore-stubs
boto3-stubs
coverage
faker
pytest
Expand All @@ -19,5 +21,3 @@ pytest-sugar
pytest-xdist
requests
respx
types-boto3
types-botocore
14 changes: 6 additions & 8 deletions services/datcore-adapter/requirements/_test.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@ anyio==4.3.0
# httpx
asgi-lifespan==2.1.0
# via -r requirements/_test.in
boto3-stubs==1.37.0
# via -r requirements/_test.in
botocore-stubs==1.36.6
# via
# types-boto3
# types-botocore
# -r requirements/_test.in
# boto3-stubs
certifi==2024.2.2
# via
# -c requirements/../../../requirements/constraints.txt
Expand Down Expand Up @@ -110,17 +112,13 @@ termcolor==2.5.0
# via pytest-sugar
types-awscrt==0.23.7
# via botocore-stubs
types-boto3==1.36.6
# via -r requirements/_test.in
types-botocore==1.0.2
# via -r requirements/_test.in
types-s3transfer==0.11.2
# via types-boto3
# via boto3-stubs
typing-extensions==4.12.2
# via
# -c requirements/_base.txt
# boto3-stubs
# faker
# types-boto3
urllib3==2.2.3
# via
# -c requirements/../../../requirements/constraints.txt
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,6 @@
assert get_app # nosec

__all__: tuple[str, ...] = (
"get_reverse_url_mapper",
"get_app",
"get_reverse_url_mapper",
)
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import cast
from typing import Annotated, cast

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


def get_pennsieve_api_client(
app: FastAPI = Depends(_get_app),
app: Annotated[FastAPI, Depends(_get_app)],
) -> PennsieveApiClient:
client = PennsieveApiClient.get_instance(app)
assert client # nosec
Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,13 @@
from fastapi_pagination import Page, Params
from fastapi_pagination.api import create_page, resolve_params
from fastapi_pagination.bases import RawParams
from models_library.api_schemas_datcore_adapter.datasets import (
DatasetMetaData,
FileMetaData,
)
from servicelib.fastapi.requests_decorators import cancel_on_disconnect
from starlette import status

from ...models.domains.datasets import DatasetsOut, FileMetaDataOut
from ...modules.pennsieve import PennsieveApiClient
from ..dependencies.pennsieve import get_pennsieve_api_client

Expand All @@ -26,7 +29,7 @@
"/datasets",
summary="list datasets",
status_code=status.HTTP_200_OK,
response_model=Page[DatasetsOut],
response_model=Page[DatasetMetaData],
)
@cancel_on_disconnect
@cached(
Expand All @@ -39,7 +42,7 @@ async def list_datasets(
x_datcore_api_secret: Annotated[str, Header(..., description="Datcore API Secret")],
pennsieve_client: Annotated[PennsieveApiClient, Depends(get_pennsieve_api_client)],
params: Annotated[Params, Depends()],
) -> Page[DatasetsOut]:
) -> Page[DatasetMetaData]:
assert request # nosec
raw_params: RawParams = resolve_params(params).to_raw_params()
assert raw_params.limit is not None # nosec
Expand All @@ -57,7 +60,7 @@ async def list_datasets(
"/datasets/{dataset_id}/files",
summary="list top level files/folders in a dataset",
status_code=status.HTTP_200_OK,
response_model=Page[FileMetaDataOut],
response_model=Page[FileMetaData],
)
@cancel_on_disconnect
@cached(
Expand All @@ -71,7 +74,7 @@ async def list_dataset_top_level_files(
x_datcore_api_secret: Annotated[str, Header(..., description="Datcore API Secret")],
pennsieve_client: Annotated[PennsieveApiClient, Depends(get_pennsieve_api_client)],
params: Annotated[Params, Depends()],
) -> Page[FileMetaDataOut]:
) -> Page[FileMetaData]:
assert request # nosec
raw_params: RawParams = resolve_params(params).to_raw_params()

Expand All @@ -91,7 +94,7 @@ async def list_dataset_top_level_files(
"/datasets/{dataset_id}/files/{collection_id}",
summary="list top level files/folders in a collection in a dataset",
status_code=status.HTTP_200_OK,
response_model=Page[FileMetaDataOut],
response_model=Page[FileMetaData],
)
@cancel_on_disconnect
@cached(
Expand All @@ -106,7 +109,7 @@ async def list_dataset_collection_files(
x_datcore_api_secret: Annotated[str, Header(..., description="Datcore API Secret")],
pennsieve_client: Annotated[PennsieveApiClient, Depends(get_pennsieve_api_client)],
params: Annotated[Params, Depends()],
) -> Page[FileMetaDataOut]:
) -> Page[FileMetaData]:
assert request # nosec
raw_params: RawParams = resolve_params(params).to_raw_params()
assert raw_params.limit is not None # nosec
Expand All @@ -126,7 +129,7 @@ async def list_dataset_collection_files(
"/datasets/{dataset_id}/files_legacy",
summary="list all file meta data in dataset",
status_code=status.HTTP_200_OK,
response_model=list[FileMetaDataOut],
response_model=list[FileMetaData],
)
@cancel_on_disconnect
@cached(
Expand All @@ -139,7 +142,7 @@ async def list_dataset_files_legacy(
x_datcore_api_key: Annotated[str, Header(..., description="Datcore API Key")],
x_datcore_api_secret: Annotated[str, Header(..., description="Datcore API Secret")],
pennsieve_client: Annotated[PennsieveApiClient, Depends(get_pennsieve_api_client)],
) -> list[FileMetaDataOut]:
) -> list[FileMetaData]:
assert request # nosec
return await pennsieve_client.list_all_dataset_files(
api_key=x_datcore_api_key,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
import logging
from typing import Annotated, Any
from typing import Annotated

from fastapi import APIRouter, Depends, Header, Request
from models_library.api_schemas_datcore_adapter.datasets import PackageMetaData
from pydantic import AnyUrl, TypeAdapter
from servicelib.fastapi.requests_decorators import cancel_on_disconnect
from starlette import status

from ...models.domains.files import FileDownloadOut
from ...models.files import FileDownloadOut
from ...modules.pennsieve import PennsieveApiClient
from ..dependencies.pennsieve import get_pennsieve_api_client

router = APIRouter()
log = logging.getLogger(__file__)
_logger = logging.getLogger(__file__)


@router.get(
Expand Down Expand Up @@ -62,7 +63,7 @@ async def delete_file(
"/packages/{package_id}/files",
summary="returns a package (i.e. a file)",
status_code=status.HTTP_200_OK,
response_model=list[dict[str, Any]],
response_model=list[PackageMetaData],
)
@cancel_on_disconnect
async def get_package(
Expand All @@ -71,12 +72,15 @@ async def get_package(
x_datcore_api_key: Annotated[str, Header(..., description="Datcore API Key")],
x_datcore_api_secret: Annotated[str, Header(..., description="Datcore API Secret")],
pennsieve_client: Annotated[PennsieveApiClient, Depends(get_pennsieve_api_client)],
) -> list[dict[str, Any]]:
) -> list[PackageMetaData]:
assert request # nosec
return await pennsieve_client.get_package_files(

data = await pennsieve_client.get_package_files(
api_key=x_datcore_api_key,
api_secret=x_datcore_api_secret,
package_id=package_id,
limit=1,
offset=0,
fill_path=True,
)
return [_.to_api_model() for _ in data]
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import logging
from collections.abc import Callable
from datetime import datetime, timezone
from datetime import UTC, datetime
from typing import Annotated

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


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