From c58a9597917e80355a0ab4603c20774d287b8be5 Mon Sep 17 00:00:00 2001 From: Lukas Plank Date: Mon, 20 Jan 2025 16:57:34 +0100 Subject: [PATCH] refactor: make ModelBindingsMapper private As indicated in the docstring for ModelBindingsMapper, the class is somewhat coupled to SPARQLModelAdapter, because ModelBindinsMapper does not run model sanity by itself - sanity checking should happen in SPARQLModelAdapter, i.e. as early as possible. See issue #108. Once sanity checking is implemented, RDFProxy will make a public ModelBindingsMapper class available which will run model sanity checking itself. --- rdfproxy/__init__.py | 1 - rdfproxy/adapter.py | 4 ++-- rdfproxy/mapper.py | 2 +- tests/tests_mapper/test_model_bindings_mapper.py | 4 ++-- .../tests_mapper/test_model_bindings_mapper_model_bool.py | 4 ++-- tests/tests_mapper/test_sad_path_mapper_grouped_models.py | 7 ++++--- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/rdfproxy/__init__.py b/rdfproxy/__init__.py index abb8cfd..5cde0d8 100644 --- a/rdfproxy/__init__.py +++ b/rdfproxy/__init__.py @@ -1,5 +1,4 @@ from rdfproxy.adapter import SPARQLModelAdapter # noqa: F401 -from rdfproxy.mapper import ModelBindingsMapper # noqa: F401 from rdfproxy.sparql_strategies import ( SPARQLStrategy, # noqa: F401 SPARQLWrapperStrategy, # noqa: F401 diff --git a/rdfproxy/adapter.py b/rdfproxy/adapter.py index ebb4902..1faeffc 100644 --- a/rdfproxy/adapter.py +++ b/rdfproxy/adapter.py @@ -6,7 +6,7 @@ from typing import Generic from rdfproxy.constructor import QueryConstructor -from rdfproxy.mapper import ModelBindingsMapper +from rdfproxy.mapper import _ModelBindingsMapper from rdfproxy.sparql_strategies import HttpxStrategy, SPARQLStrategy from rdfproxy.utils._types import _TModelInstance from rdfproxy.utils.models import Page, QueryParameters @@ -70,7 +70,7 @@ def query( logger.debug(f"Running items query: \n{items_query}") items_query_bindings: Iterator[dict] = self.sparql_strategy.query(items_query) - mapper = ModelBindingsMapper(self._model, *items_query_bindings) + mapper = _ModelBindingsMapper(self._model, *items_query_bindings) items: list[_TModelInstance] = mapper.get_models() logger.debug(f"Running count query: \n{count_query}") diff --git a/rdfproxy/mapper.py b/rdfproxy/mapper.py index c38e752..5ae7250 100644 --- a/rdfproxy/mapper.py +++ b/rdfproxy/mapper.py @@ -16,7 +16,7 @@ from rdfproxy.utils.utils import CurryModel, FieldsBindingsMap -class ModelBindingsMapper(Generic[_TModelInstance]): +class _ModelBindingsMapper(Generic[_TModelInstance]): """Utility class for mapping bindings to nested/grouped Pydantic models. RDFProxy utilizes Pydantic models also as a modelling grammar for grouping diff --git a/tests/tests_mapper/test_model_bindings_mapper.py b/tests/tests_mapper/test_model_bindings_mapper.py index 4dea3c3..cc5566b 100644 --- a/tests/tests_mapper/test_model_bindings_mapper.py +++ b/tests/tests_mapper/test_model_bindings_mapper.py @@ -3,7 +3,7 @@ import pytest from pydantic import BaseModel -from rdfproxy.mapper import ModelBindingsMapper +from rdfproxy.mapper import _ModelBindingsMapper from tests.tests_mapper.params.model_bindings_mapper_parameters import ( author_array_collection_parameters, author_work_title_parameters, @@ -31,6 +31,6 @@ def test_basic_model_bindings_mapper(model, bindings, expected): Given a model and a set of bindings, run the BindingsModelMapper logic and compare the result against the expected shape. """ - mapper: ModelBindingsMapper = ModelBindingsMapper(model, *bindings) + mapper: _ModelBindingsMapper = _ModelBindingsMapper(model, *bindings) models: list[BaseModel] = mapper.get_models() assert [model.model_dump() for model in models] == expected diff --git a/tests/tests_mapper/test_model_bindings_mapper_model_bool.py b/tests/tests_mapper/test_model_bindings_mapper_model_bool.py index a14077b..b9c6709 100644 --- a/tests/tests_mapper/test_model_bindings_mapper_model_bool.py +++ b/tests/tests_mapper/test_model_bindings_mapper_model_bool.py @@ -3,7 +3,7 @@ import pytest from pydantic import BaseModel -from rdfproxy.mapper import ModelBindingsMapper +from rdfproxy.mapper import _ModelBindingsMapper from tests.tests_mapper.params.model_bindings_mapper_model_bool_parameters import ( parent_child_parameters, ) @@ -19,6 +19,6 @@ def test_basic_model_bindings_mapper(model, bindings, expected): Given a model and a set of bindings, run the BindingsModelMapper logic and compare the result against the expected shape. """ - mapper: ModelBindingsMapper = ModelBindingsMapper(model, *bindings) + mapper: _ModelBindingsMapper = _ModelBindingsMapper(model, *bindings) models: list[BaseModel] = mapper.get_models() assert [model.model_dump() for model in models] == expected diff --git a/tests/tests_mapper/test_sad_path_mapper_grouped_models.py b/tests/tests_mapper/test_sad_path_mapper_grouped_models.py index 8b18a63..98ed00c 100644 --- a/tests/tests_mapper/test_sad_path_mapper_grouped_models.py +++ b/tests/tests_mapper/test_sad_path_mapper_grouped_models.py @@ -1,11 +1,12 @@ import pytest from pydantic import BaseModel -from rdfproxy import ConfigDict, ModelBindingsMapper +from rdfproxy.mapper import _ModelBindingsMapper from rdfproxy.utils._exceptions import ( InvalidGroupingKeyException, MissingModelConfigException, ) +from rdfproxy.utils._types import ConfigDict class ModelMissingGroupByConfig(BaseModel): @@ -21,10 +22,10 @@ class ModelMissingGroupByValue(BaseModel): @pytest.mark.xfail(reason="Not yet implemented, checks will run in model checkers.") def test_sad_path_adapter_missing_grouping_config(): with pytest.raises(MissingModelConfigException): - ModelBindingsMapper(ModelMissingGroupByConfig, {"x": 1}).get_models() + _ModelBindingsMapper(ModelMissingGroupByConfig, {"x": 1}).get_models() @pytest.mark.xfail(reason="Not yet implemented, checks will run in model checkers.") def test_sad_path_adapter_missing_grouping_value(): with pytest.raises(InvalidGroupingKeyException): - ModelBindingsMapper(ModelMissingGroupByValue, {"x": 1}).get_models() + _ModelBindingsMapper(ModelMissingGroupByValue, {"x": 1}).get_models()