From 6c56cb2ad7394d5cfb1080dfd05fc2233d3ac70e Mon Sep 17 00:00:00 2001 From: "Keto D. Zhang" Date: Sat, 16 Nov 2024 21:38:59 -0800 Subject: [PATCH] feat!: AsdfPydanticConverter is no longer a singleton instance --- asdf_pydantic/converter.py | 30 +++++++++++------------------- tests/test_converter.py | 13 +++++++++++++ 2 files changed, 24 insertions(+), 19 deletions(-) create mode 100644 tests/test_converter.py diff --git a/asdf_pydantic/converter.py b/asdf_pydantic/converter.py index 89b54af..4be2684 100644 --- a/asdf_pydantic/converter.py +++ b/asdf_pydantic/converter.py @@ -1,37 +1,29 @@ from __future__ import annotations -from typing import Optional, Type +from typing import Type from asdf.extension import Converter from asdf_pydantic.model import AsdfPydanticModel -_ASDF_PYDANTIC_SINGLETON_CONVERTER: Optional[AsdfPydanticConverter] = None - class AsdfPydanticConverter(Converter): - """Implements a converter compatible with all subclass of AsdfPydanticModel. - - The instance is a singleton. - """ - - _tag_to_class: dict[str, Type[AsdfPydanticModel]] = {} + """Implements a converter compatible with all subclass of AsdfPydanticModel.""" + _tag_to_class: dict[str, Type[AsdfPydanticModel]] - def __new__(cls, *args, **kwargs): - global _ASDF_PYDANTIC_SINGLETON_CONVERTER - if _ASDF_PYDANTIC_SINGLETON_CONVERTER is None: - _ASDF_PYDANTIC_SINGLETON_CONVERTER = super().__new__(cls) + def __init__(self, *model_classes: Type[AsdfPydanticModel]) -> None: + self._tag_to_class = {} + self.add_models(*model_classes) + super().__init__() - return _ASDF_PYDANTIC_SINGLETON_CONVERTER - - @classmethod def add_models( - cls, *model_classes: Type[AsdfPydanticModel] + self, *model_classes: Type[AsdfPydanticModel] ) -> "AsdfPydanticConverter": for model_class in model_classes: - cls._tag_to_class[model_class.get_tag_uri()] = model_class - return cls() + self._tag_to_class[model_class.get_tag_uri()] = model_class + + return self @property def tags(self) -> tuple[str]: diff --git a/tests/test_converter.py b/tests/test_converter.py new file mode 100644 index 0000000..5421296 --- /dev/null +++ b/tests/test_converter.py @@ -0,0 +1,13 @@ +import pytest + +from asdf_pydantic.converter import AsdfPydanticConverter +from asdf_pydantic.model import AsdfPydanticModel + + +class TestModel(AsdfPydanticModel): + _tag = "https://example.org/test_model" + + +@pytest.mark.parametrize("args", [tuple(), (TestModel,)]) +def test_converter_is_unscoped_by_default(args): + assert AsdfPydanticConverter(*args) is not AsdfPydanticConverter(*args)