44import json
55from datetime import datetime
66from pathlib import Path
7- from typing import (
8- Annotated ,
9- Any ,
10- Literal ,
11- )
7+ from typing import Annotated , Any , Literal
128
139from jinja2 import Environment , StrictUndefined , Template
1410from pydantic import (
@@ -1147,8 +1143,6 @@ class WidgetTemplate:
11471143 ```
11481144 """
11491145
1150- adapter : TypeAdapter [DynamicWidgetRoot ] = TypeAdapter (DynamicWidgetRoot )
1151-
11521146 def __init__ (self , definition : dict [str , Any ]):
11531147 self .version = definition ["version" ]
11541148 if self .version != "1.0" :
@@ -1163,7 +1157,7 @@ def __init__(self, definition: dict[str, Any]):
11631157 self .data_schema = definition .get ("jsonSchema" , {})
11641158
11651159 @classmethod
1166- def from_file (cls , file_path : str ) -> " WidgetTemplate" :
1160+ def from_file (cls , file_path : str ) -> WidgetTemplate :
11671161 path = Path (file_path )
11681162 if not path .is_absolute ():
11691163 caller_frame = inspect .stack ()[1 ]
@@ -1178,10 +1172,19 @@ def from_file(cls, file_path: str) -> "WidgetTemplate":
11781172 def build (
11791173 self , data : dict [str , Any ] | BaseModel | None = None
11801174 ) -> DynamicWidgetRoot :
1181- if data is None :
1182- data = {}
1183- if isinstance (data , BaseModel ):
1184- data = data .model_dump ()
1185- rendered = self .template .render (** data )
1175+ rendered = self .template .render (** self ._normalize_data (data ))
11861176 widget_dict = json .loads (rendered )
1187- return self .adapter .validate_python (widget_dict )
1177+ return TypeAdapter (DynamicWidgetRoot ).validate_python (widget_dict )
1178+
1179+ def build_basic (self , data : dict [str , Any ] | BaseModel | None = None ) -> BasicRoot :
1180+ """Separate method for building basic root widgets until BasicRoot is supported for streamed widgets."""
1181+ rendered = self .template .render (** self ._normalize_data (data ))
1182+ widget_dict = json .loads (rendered )
1183+ return TypeAdapter (BasicRoot ).validate_python (widget_dict )
1184+
1185+ def _normalize_data (
1186+ self , data : dict [str , Any ] | BaseModel | None
1187+ ) -> dict [str , Any ]:
1188+ if data is None :
1189+ return {}
1190+ return data .model_dump () if isinstance (data , BaseModel ) else data
0 commit comments