Coverage for tests/unit/json_serialize/serializable_dataclass/test_sdc_defaults.py: 100%

33 statements  

« prev     ^ index     » next       coverage.py v7.6.1, created at 2025-04-04 03:33 -0600

1from __future__ import annotations 

2 

3 

4from muutils.json_serialize import ( 

5 JsonSerializer, 

6 SerializableDataclass, 

7 serializable_dataclass, 

8 serializable_field, 

9) 

10from muutils.json_serialize.util import _FORMAT_KEY 

11 

12# pylint: disable=missing-class-docstring 

13 

14 

15@serializable_dataclass 

16class Config(SerializableDataclass): 

17 name: str = serializable_field(default="default_name") 

18 save_model: bool = serializable_field(default=True) 

19 batch_size: int = serializable_field(default=64) 

20 

21 

22def test_sdc_empty(): 

23 instance = Config() 

24 serialized = instance.serialize() 

25 assert serialized == { 

26 "name": "default_name", 

27 "save_model": True, 

28 "batch_size": 64, 

29 _FORMAT_KEY: "Config(SerializableDataclass)", 

30 } 

31 recovered = Config.load(serialized) 

32 assert recovered == instance 

33 

34 

35def test_sdc_strip_format_jser(): 

36 instance = Config() 

37 jser: JsonSerializer = JsonSerializer(write_only_format=True) 

38 serialized = jser.json_serialize(instance) 

39 assert serialized == { 

40 "name": "default_name", 

41 "save_model": True, 

42 "batch_size": 64, 

43 "__write_format__": "Config(SerializableDataclass)", 

44 } 

45 recovered = Config.load(serialized) # type: ignore[arg-type] 

46 assert recovered == instance 

47 

48 

49TYPE_MAP: dict[str, type] = {x.__name__: x for x in [int, float, str, bool]} 

50 

51 

52@serializable_dataclass 

53class ComplicatedConfig(SerializableDataclass): 

54 name: str = serializable_field(default="default_name") 

55 save_model: bool = serializable_field(default=True) 

56 batch_size: int = serializable_field(default=64) 

57 

58 some_type: type = serializable_field( 

59 default=float, 

60 serialization_fn=lambda x: x.__name__, 

61 loading_fn=lambda data: TYPE_MAP[data["some_type"]], 

62 ) 

63 

64 

65def test_sdc_empty_complicated(): 

66 instance = ComplicatedConfig() 

67 serialized = instance.serialize() 

68 recovered = ComplicatedConfig.load(serialized) 

69 assert recovered == instance