diff --git a/lib/modelscan_api/.pre-commit-config.yaml b/lib/modelscan_api/.pre-commit-config.yaml index 0a4c918ca..bb1775b9d 100644 --- a/lib/modelscan_api/.pre-commit-config.yaml +++ b/lib/modelscan_api/.pre-commit-config.yaml @@ -23,19 +23,20 @@ repos: rev: 6.0.0 hooks: - id: isort - args: ['-a', 'from __future__ import annotations'] + args: ['-a', 'from __future__ import annotations', '-l', '120'] - repo: https://github.com/asottile/pyupgrade rev: v3.19.1 hooks: - id: pyupgrade - args: [--py37-plus] + args: [--py39-plus] - repo: https://github.com/hadialqattan/pycln rev: v2.5.0 hooks: - id: pycln - args: [--config=pyproject.toml] + # use the same config as for /lib/python + args: [--config=../python/pyproject.toml] stages: [manual] - repo: https://github.com/codespell-project/codespell diff --git a/lib/modelscan_api/bailo_modelscan_api/config.py b/lib/modelscan_api/bailo_modelscan_api/config.py index b6f6435e6..1bf92409f 100644 --- a/lib/modelscan_api/bailo_modelscan_api/config.py +++ b/lib/modelscan_api/bailo_modelscan_api/config.py @@ -27,7 +27,7 @@ class Settings(BaseSettings): # Update frontend/pages/docs/administration/helm/configuration.mdx if bumping this. app_version: str = "1.0.0" # download_dir is used if it evaluates, otherwise a temporary directory is used. - download_dir: Optional[str] = None + download_dir: str | None = None modelscan_settings: dict[str, Any] = DEFAULT_SETTINGS block_size: int = 1024 diff --git a/lib/modelscan_api/bailo_modelscan_api/main.py b/lib/modelscan_api/bailo_modelscan_api/main.py index 16c7acbb4..7d41c0fe8 100644 --- a/lib/modelscan_api/bailo_modelscan_api/main.py +++ b/lib/modelscan_api/bailo_modelscan_api/main.py @@ -17,6 +17,8 @@ from modelscan.modelscan import ModelScan from pydantic import BaseModel +# isort: split + from bailo_modelscan_api.config import Settings from bailo_modelscan_api.dependencies import safe_join @@ -225,9 +227,7 @@ async def info(settings: Annotated[Settings, Depends(get_settings)]) -> ApiInfor "description": "The server could not complete the request", "content": { "application/json": { - "example": { - "detail": "An error occurred while processing the uploaded file's name." - } + "example": {"detail": "An error occurred while processing the uploaded file's name."} } }, }, @@ -251,11 +251,7 @@ async def scan_file( modelscan_model = ModelScan(settings=settings.modelscan_settings) # Use Setting's download_dir if defined else use a temporary directory. - with ( - TemporaryDirectory() - if not settings.download_dir - else nullcontext(settings.download_dir) - ) as download_dir: + with TemporaryDirectory() if not settings.download_dir else nullcontext(settings.download_dir) as download_dir: if in_file.filename and str(in_file.filename).strip(): # Prevent escaping to a parent dir try: @@ -315,9 +311,7 @@ async def scan_file( background_tasks.add_task(Path.unlink, pathlib_path, missing_ok=True) except UnboundLocalError: # pathlib_path may not exist. - logger.exception( - "An error occurred while trying to cleanup the downloaded file." - ) + logger.exception("An error occurred while trying to cleanup the downloaded file.") if __name__ == "__main__": diff --git a/lib/modelscan_api/tests/test_dependencies.py b/lib/modelscan_api/tests/test_dependencies.py index a190908da..362ef3254 100644 --- a/lib/modelscan_api/tests/test_dependencies.py +++ b/lib/modelscan_api/tests/test_dependencies.py @@ -4,23 +4,20 @@ from __future__ import annotations import itertools +from collections.abc import Iterable from pathlib import Path -from typing import Any, Iterable +from typing import Any import pytest -from bailo_modelscan_api.dependencies import ( - parse_path, - safe_join, - sanitise_unix_filename, -) +# isort: split + +from bailo_modelscan_api.dependencies import parse_path, safe_join, sanitise_unix_filename # Helpers -def type_matrix( - data: Iterable[Any], types: Iterable[type] -) -> itertools.product[tuple[Any, ...]]: +def type_matrix(data: Iterable[Any], types: Iterable[type]) -> itertools.product[tuple[Any, ...]]: """Generate a matrix of all combinations of `data` converted to each type in `types`. For example: `list(type_matrix(["foo", "bar"], [str, Path])) -> [(str(foo), str(bar)), (str(foo), Path(bar)), (Path(foo), str(bar)), (Path(foo), Path(bar))]` @@ -55,7 +52,7 @@ def type_matrix( "".join(['\\[/\\?%*:|"<>0x7F0x00-0x1F]', chr(0x1F) * 15]), "-[----------0x7F0x00-0x1F]---------------", ), - ("ad\nbla'{-+\\)(ç?", "ad-bla'{-+-)(ç-"), # type: ignore + ("ad\nbla'{-+\\)(ç?", "ad-bla'{-+-)(ç-"), ], ) def test_sanitise_unix_filename(path: str, output: str) -> None: diff --git a/lib/modelscan_api/tests/test_integration.py b/lib/modelscan_api/tests/test_integration.py index 87595fe49..dc6e67793 100644 --- a/lib/modelscan_api/tests/test_integration.py +++ b/lib/modelscan_api/tests/test_integration.py @@ -11,6 +11,8 @@ import pytest from fastapi.testclient import TestClient +# isort: split + from bailo_modelscan_api.config import Settings from bailo_modelscan_api.main import app, get_settings diff --git a/lib/modelscan_api/tests/test_integration/generate_test_data.py b/lib/modelscan_api/tests/test_integration/generate_test_data.py index 69459656d..6cf487388 100644 --- a/lib/modelscan_api/tests/test_integration/generate_test_data.py +++ b/lib/modelscan_api/tests/test_integration/generate_test_data.py @@ -14,15 +14,15 @@ def __init__(self, file, protocol, inj_objs): def dump(self, obj): "Pickle data, inject object before or after" - if self.proto >= 2: # type: ignore - self.write(pickle.PROTO + struct.pack("= 4: # type: ignore - self.framer.start_framing() # type: ignore + if self.proto >= 2: + self.write(pickle.PROTO + struct.pack("= 4: + self.framer.start_framing() for inj_obj in self.inj_objs: - self.save(inj_obj) # type: ignore - self.save(obj) # type: ignore - self.write(pickle.STOP) # type: ignore - self.framer.end_framing() # type: ignore + self.save(inj_obj) + self.save(obj) + self.write(pickle.STOP) + self.framer.end_framing() class _PickleInject: diff --git a/lib/modelscan_api/tests/test_main.py b/lib/modelscan_api/tests/test_main.py index 101f265b3..80bddf876 100644 --- a/lib/modelscan_api/tests/test_main.py +++ b/lib/modelscan_api/tests/test_main.py @@ -12,6 +12,8 @@ import pytest from fastapi.testclient import TestClient +# isort: split + from bailo_modelscan_api.config import Settings from bailo_modelscan_api.dependencies import parse_path from bailo_modelscan_api.main import app, get_settings @@ -52,9 +54,7 @@ def test_info(): ("-", EMPTY_CONTENTS, H5_MIME_TYPE), ], ) -def test_scan_file( - mock_scan: Mock, file_name: str, file_content: Any, file_mime_type: str -): +def test_scan_file(mock_scan: Mock, file_name: str, file_content: Any, file_mime_type: str): mock_scan.return_value = {} files = {"in_file": (file_name, file_content, file_mime_type)} @@ -68,17 +68,13 @@ def test_scan_file( ("file_name", "file_content", "file_mime_type"), [("..", EMPTY_CONTENTS, H5_MIME_TYPE)], ) -def test_scan_file_escape_path_error( - file_name: str, file_content: Any, file_mime_type: str -): +def test_scan_file_escape_path_error(file_name: str, file_content: Any, file_mime_type: str): files = {"in_file": (file_name, file_content, file_mime_type)} response = client.post("/scan/file", files=files) assert response.status_code == 500 - assert response.json() == { - "detail": "An error occurred while processing the uploaded file's name." - } + assert response.json() == {"detail": "An error occurred while processing the uploaded file's name."} @patch("modelscan.modelscan.ModelScan.scan") @@ -86,9 +82,7 @@ def test_scan_file_escape_path_error( ("file_name", "file_content", "file_mime_type"), [("foo.h5", EMPTY_CONTENTS, H5_MIME_TYPE)], ) -def test_scan_file_exception( - mock_scan: Mock, file_name: str, file_content: Any, file_mime_type: str -): +def test_scan_file_exception(mock_scan: Mock, file_name: str, file_content: Any, file_mime_type: str): mock_scan.side_effect = Exception("Mocked error!") files = {"in_file": (file_name, file_content, file_mime_type)} @@ -109,14 +103,10 @@ def test_scan_file_exception( ("file_name", "file_content", "file_mime_type"), [(" ", EMPTY_CONTENTS, H5_MIME_TYPE)], ) -def test_scan_file_filename_missing( - file_name: str, file_content: Any, file_mime_type: str -): +def test_scan_file_filename_missing(file_name: str, file_content: Any, file_mime_type: str): files = {"in_file": (file_name, file_content, file_mime_type)} response = client.post("/scan/file", files=files) assert response.status_code == 500 - assert response.json() == { - "detail": "An error occurred while extracting the uploaded file's name." - } + assert response.json() == {"detail": "An error occurred while extracting the uploaded file's name."} diff --git a/lib/python/.pre-commit-config.yaml b/lib/python/.pre-commit-config.yaml index 39cc329a6..b7218c02b 100644 --- a/lib/python/.pre-commit-config.yaml +++ b/lib/python/.pre-commit-config.yaml @@ -23,7 +23,7 @@ repos: rev: 6.0.0 hooks: - id: isort - args: ['-a', 'from __future__ import annotations'] + args: ['-a', 'from __future__ import annotations', '-l', '120'] - repo: https://github.com/asottile/pyupgrade rev: v3.19.1