Coverage for src/certus/nodes/struct.py: 100%

33 statements  

« prev     ^ index     » next       coverage.py v7.10.6, created at 2025-09-04 09:44 +0100

1"""Node models for structured outputs.""" 

2 

3import dataclasses 

4import typing 

5 

6from .core import Composite, NodeType 

7 

8 

9@dataclasses.dataclass(kw_only=True) 

10class Array(Composite): 

11 """ 

12 Node representing a JSON array. 

13 

14 Parameters 

15 ---------- 

16 elements : list of NodeType 

17 Ordered child nodes representing the array elements. 

18 """ 

19 

20 elements: list[NodeType] = dataclasses.field(default_factory=list) 

21 

22 def __post_init__(self) -> None: 

23 self.children = self.elements 

24 super().__post_init__() 

25 

26 def __getitem__(self, index: int) -> NodeType: 

27 return self.elements[index] 

28 

29 def __iter__(self) -> typing.Iterator[NodeType]: 

30 return iter(self.elements) 

31 

32 def __len__(self) -> int: 

33 return len(self.elements) 

34 

35 def __repr__(self) -> str: 

36 return f"{self.__class__.__name__}(elements={self.elements!r})" 

37 

38 

39@dataclasses.dataclass(kw_only=True) 

40class Object(Composite): 

41 """ 

42 Node representing a JSON object. 

43 

44 Parameters 

45 ---------- 

46 fields : dict[str, NodeType] 

47 Mapping from field names to child nodes. 

48 

49 Attributes 

50 ---------- 

51 fields : dict[str, NodeType] 

52 Stored mapping of field names to parsed nodes. 

53 """ 

54 

55 fields: dict[str, NodeType] = dataclasses.field(default_factory=dict) 

56 

57 def __post_init__(self) -> None: 

58 self.children = list(self.fields.values()) 

59 super().__post_init__() 

60 

61 def __getitem__(self, key: str) -> NodeType: 

62 return self.fields[key] 

63 

64 def __repr__(self) -> str: 

65 return f"{self.__class__.__name__}(fields={self.fields!r})" 

66 

67 def keys(self) -> typing.KeysView[str]: 

68 """Return the object's field keys.""" 

69 return self.fields.keys() 

70 

71 def items(self) -> typing.ItemsView[str, NodeType]: 

72 """Return the object's (key, node) pairs.""" 

73 return self.fields.items() 

74 

75 def values(self) -> typing.ValuesView[NodeType]: 

76 """Return the object's field values.""" 

77 return self.fields.values()