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 (
1511 BaseModel ,
1612 ConfigDict ,
1713 Field ,
18- TypeAdapter ,
1914 model_serializer ,
2015)
2116from typing_extensions import NotRequired , TypedDict , deprecated
@@ -1147,8 +1142,6 @@ class WidgetTemplate:
11471142 ```
11481143 """
11491144
1150- adapter : TypeAdapter [DynamicWidgetRoot ] = TypeAdapter (DynamicWidgetRoot )
1151-
11521145 def __init__ (self , definition : dict [str , Any ]):
11531146 self .version = definition ["version" ]
11541147 if self .version != "1.0" :
@@ -1163,7 +1156,7 @@ def __init__(self, definition: dict[str, Any]):
11631156 self .data_schema = definition .get ("jsonSchema" , {})
11641157
11651158 @classmethod
1166- def from_file (cls , file_path : str ) -> " WidgetTemplate" :
1159+ def from_file (cls , file_path : str ) -> WidgetTemplate :
11671160 path = Path (file_path )
11681161 if not path .is_absolute ():
11691162 caller_frame = inspect .stack ()[1 ]
@@ -1178,10 +1171,19 @@ def from_file(cls, file_path: str) -> "WidgetTemplate":
11781171 def build (
11791172 self , data : dict [str , Any ] | BaseModel | None = None
11801173 ) -> DynamicWidgetRoot :
1181- if data is None :
1182- data = {}
1183- if isinstance (data , BaseModel ):
1184- data = data .model_dump ()
1185- rendered = self .template .render (** data )
1174+ rendered = self .template .render (** self ._normalize_data (data ))
11861175 widget_dict = json .loads (rendered )
1187- return self .adapter .validate_python (widget_dict )
1176+ return DynamicWidgetRoot .model_validate (widget_dict )
1177+
1178+ def build_basic (self , data : dict [str , Any ] | BaseModel | None = None ) -> BasicRoot :
1179+ """Separate method for building basic root widgets until BasicRoot is supported for streamed widgets."""
1180+ rendered = self .template .render (** self ._normalize_data (data ))
1181+ widget_dict = json .loads (rendered )
1182+ return BasicRoot .model_validate (widget_dict )
1183+
1184+ def _normalize_data (
1185+ self , data : dict [str , Any ] | BaseModel | None
1186+ ) -> dict [str , Any ]:
1187+ if data is None :
1188+ return {}
1189+ return data .model_dump () if isinstance (data , BaseModel ) else data
0 commit comments