Skip to content

Commit

Permalink
feat!: AsdfPydanticConverter is no longer a singleton instance
Browse files Browse the repository at this point in the history
  • Loading branch information
ketozhang committed Nov 17, 2024
1 parent 467f145 commit e211978
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 19 deletions.
30 changes: 11 additions & 19 deletions asdf_pydantic/converter.py
Original file line number Diff line number Diff line change
@@ -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]:
Expand Down
13 changes: 13 additions & 0 deletions tests/test_converter.py
Original file line number Diff line number Diff line change
@@ -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)

0 comments on commit e211978

Please sign in to comment.