From a5c8d89b9c6e162459b693428f060e698d460069 Mon Sep 17 00:00:00 2001 From: Mahhheshh <100200105+Mahhheshh@users.noreply.github.com> Date: Sun, 22 Feb 2026 16:03:48 +0530 Subject: [PATCH] add extra error messages and fix response schema --- src/core/errors.py | 41 ++++++++++++++++++++++++++ src/routers/openml/qualities.py | 36 ++++++++++++++-------- tests/routers/openml/qualities_test.py | 3 +- 3 files changed, 66 insertions(+), 14 deletions(-) diff --git a/src/core/errors.py b/src/core/errors.py index 3f53364a..315aab6d 100644 --- a/src/core/errors.py +++ b/src/core/errors.py @@ -374,6 +374,47 @@ class ServiceNotFoundError(ProblemDetailError): _default_status_code = HTTPStatus.NOT_FOUND +# ============================================================================= +# Quality Errors +# ============================================================================= + + +class QualityUnknownDatasetError(ProblemDetailError): + """Raised when requesting qualities for an unknown or inaccessible dataset.""" + + uri = "https://openml.org/problems/quality-unknown-dataset" + title = "Unknown Dataset" + _default_status_code = HTTPStatus.PRECONDITION_FAILED + _default_code = 361 + + +class QualityNoQualitiesError(ProblemDetailError): + """Raised when a dataset has no stored quality values.""" + + uri = "https://openml.org/problems/quality-no-qualities" + title = "No Qualities Found" + _default_status_code = HTTPStatus.PRECONDITION_FAILED + _default_code = 362 + + +class QualityDatasetNotProcessedError(ProblemDetailError): + """Raised when quality values are requested before dataset processing finished.""" + + uri = "https://openml.org/problems/quality-dataset-not-processed" + title = "Dataset Not Processed" + _default_status_code = HTTPStatus.PRECONDITION_FAILED + _default_code = 363 + + +class QualityDatasetProcessingError(ProblemDetailError): + """Raised when quality values are unavailable due to processing errors.""" + + uri = "https://openml.org/problems/quality-dataset-processing-error" + title = "Dataset Processed With Error" + _default_status_code = HTTPStatus.PRECONDITION_FAILED + _default_code = 364 + + # ============================================================================= # Internal Errors # ============================================================================= diff --git a/src/routers/openml/qualities.py b/src/routers/openml/qualities.py index 0f40f848..bcac1eee 100644 --- a/src/routers/openml/qualities.py +++ b/src/routers/openml/qualities.py @@ -7,7 +7,12 @@ import database.datasets import database.qualities from core.access import _user_has_access -from core.errors import DatasetNotFoundError +from core.errors import ( + DatasetNotFoundError, + QualityDatasetNotProcessedError, + QualityDatasetProcessingError, + QualityNoQualitiesError, +) from database.users import User from routers.dependencies import expdb_connection, fetch_user from schemas.datasets.openml import Quality @@ -37,17 +42,24 @@ async def get_qualities( if not dataset or not await _user_has_access(dataset, user): # Backwards compatibility: PHP API returns 412 with code 113 msg = f"Dataset with id {dataset_id} not found." - no_data_file = 113 raise DatasetNotFoundError( msg, - code=no_data_file, + code=113, status_code=HTTPStatus.PRECONDITION_FAILED, - ) - return await database.qualities.get_for_dataset(dataset_id, expdb) - # The PHP API provided (sometime) helpful error messages - # if not qualities: - # check if dataset exists: error 360 - # check if user has access: error 361 - # check if there is a data processed entry and forward the error: 364 - # if nothing in process table: 363 - # otherwise: error 362 + ) from None + + processing = await database.datasets.get_latest_processing_update(dataset_id, expdb) + if processing is None: + msg = f"Dataset not processed yet for dataset {dataset_id}." + raise QualityDatasetNotProcessedError(msg) + + if processing.error: + msg = f"Dataset processed with error for dataset {dataset_id}." + raise QualityDatasetProcessingError(msg) + + qualities = await database.qualities.get_for_dataset(dataset_id, expdb) + if not qualities: + msg = f"No qualities found for dataset {dataset_id}." + raise QualityNoQualitiesError(msg) + + return qualities diff --git a/tests/routers/openml/qualities_test.py b/tests/routers/openml/qualities_test.py index a1360cfc..673ea404 100644 --- a/tests/routers/openml/qualities_test.py +++ b/tests/routers/openml/qualities_test.py @@ -317,9 +317,8 @@ async def test_get_quality_identical_error( py_api: httpx.AsyncClient, php_api: httpx.AsyncClient, ) -> None: - if data_id in [55, 56, 59]: - pytest.skip("Detailed error for code 364 (failed processing) not yet supported.") if data_id in [116]: # noqa: FURB171 + # skipping 116 is not valid case for 362 pytest.skip("Detailed error for code 362 (no qualities) not yet supported.") python_response, php_response = await asyncio.gather( py_api.get(f"/datasets/qualities/{data_id}"),