Coverage for tdom / tnodes.py: 100%

48 statements  

« prev     ^ index     » next       coverage.py v7.13.0, created at 2025-12-17 23:32 +0000

1import typing as t 

2from dataclasses import dataclass, field 

3 

4from .template_utils import TemplateRef 

5 

6 

7@dataclass(slots=True, frozen=True) 

8class TLiteralAttribute: 

9 name: str 

10 value: str | None 

11 

12 

13@dataclass(slots=True, frozen=True) 

14class TInterpolatedAttribute: 

15 name: str 

16 value_i_index: int 

17 

18 

19@dataclass(slots=True, frozen=True) 

20class TTemplatedAttribute: 

21 name: str 

22 value_ref: TemplateRef 

23 

24 

25@dataclass(slots=True, frozen=True) 

26class TSpreadAttribute: 

27 i_index: int 

28 

29 

30type TAttribute = ( 

31 TLiteralAttribute | TTemplatedAttribute | TInterpolatedAttribute | TSpreadAttribute 

32) 

33 

34 

35@dataclass(slots=True, frozen=True) 

36class TNode: 

37 def __html__(self) -> str: 

38 raise NotImplementedError("Cannot render TNode to HTML directly.") 

39 

40 def __str__(self) -> str: 

41 raise NotImplementedError("Cannot render TNode to string directly.") 

42 

43 

44@dataclass(slots=True, frozen=True) 

45class TText(TNode): 

46 ref: TemplateRef 

47 

48 @classmethod 

49 def empty(cls) -> t.Self: 

50 return cls(TemplateRef.empty()) 

51 

52 @classmethod 

53 def literal(cls, text: str) -> t.Self: 

54 return cls(TemplateRef.literal(text)) 

55 

56 

57@dataclass(slots=True, frozen=True) 

58class TComment(TNode): 

59 ref: TemplateRef 

60 

61 @classmethod 

62 def literal(cls, text: str) -> t.Self: 

63 return cls(TemplateRef.literal(text)) 

64 

65 

66@dataclass(slots=True, frozen=True) 

67class TDocumentType(TNode): 

68 text: str 

69 

70 

71@dataclass(slots=True, frozen=True) 

72class TFragment(TNode): 

73 children: tuple[TNode, ...] = field(default_factory=tuple) 

74 

75 

76@dataclass(slots=True, frozen=True) 

77class TElement(TNode): 

78 tag: str 

79 attrs: tuple[TAttribute, ...] = field(default_factory=tuple) 

80 children: tuple[TNode, ...] = field(default_factory=tuple) 

81 

82 

83@dataclass(slots=True, frozen=True) 

84class TComponent(TNode): 

85 start_i_index: int 

86 """The interpolation index for the component's starting tag name.""" 

87 

88 end_i_index: int | None = None 

89 """The interpolation index for the component's ending tag name, if any.""" 

90 

91 # TODO: hold on to _s_indexes too, when we start to need them. 

92 

93 attrs: tuple[TAttribute, ...] = field(default_factory=tuple) 

94 children: tuple[TNode, ...] = field(default_factory=tuple) 

95 

96 

97type TTag = TElement | TComponent | TFragment