Coverage for python/lsst/scarlet/lite/io/blend_base.py: 74%

25 statements  

« prev     ^ index     » next       coverage.py v7.11.0, created at 2025-11-07 01:40 -0800

1from __future__ import annotations 

2 

3from abc import ABC, abstractmethod 

4from dataclasses import dataclass 

5from typing import Any, ClassVar 

6 

7from numpy.typing import DTypeLike 

8 

9from .utils import PersistenceError 

10 

11__all__ = ["ScarletBlendBaseData"] 

12 

13 

14@dataclass(kw_only=True) 

15class ScarletBlendBaseData(ABC): 

16 """Base data for a scarlet Blend data. 

17 

18 Attributes 

19 ---------- 

20 blend_registry : 

21 A registry of all known blend types used for deserialization. 

22 blend_type : 

23 The type of blend being stored. 

24 metadata : 

25 Metadata associated with the blend. 

26 version : 

27 The schema version of the exact data class. 

28 """ 

29 

30 blend_registry: ClassVar[dict[str, type[ScarletBlendBaseData]]] = {} 

31 blend_type: str 

32 metadata: dict[str, Any] | None = None 

33 version: str 

34 

35 @classmethod 

36 def register(cls) -> None: 

37 """Register a new Blend type""" 

38 ScarletBlendBaseData.blend_registry[cls.blend_type] = cls 

39 

40 @abstractmethod 

41 def as_dict(self) -> dict: 

42 """Return the object encoded into a dict for JSON serialization 

43 

44 Returns 

45 ------- 

46 result : 

47 The object encoded as a JSON compatible dict 

48 """ 

49 

50 @staticmethod 

51 def from_dict(data: dict, dtype: DTypeLike | None = None) -> ScarletBlendBaseData: 

52 """Reconstruct `ScarletBlendBaseData` from JSON compatible dict. 

53 

54 Parameters 

55 ---------- 

56 data : 

57 Dictionary representation of the object 

58 dtype : 

59 Datatype of the resulting model. 

60 

61 Returns 

62 ------- 

63 result : 

64 The reconstructed object 

65 """ 

66 # Default to "blend" for backwards compatibility 

67 blend_type = data.get("blend_type", "blend") 

68 

69 if blend_type not in ScarletBlendBaseData.blend_registry: 

70 raise PersistenceError(f"Unknown blend type: {blend_type}") 

71 

72 cls = ScarletBlendBaseData.blend_registry[blend_type] 

73 return cls.from_dict(data, dtype=dtype)