33from benedict .dicts .base import BaseDict
44from benedict .dicts .io import io_util
55from benedict .exceptions import ExtrasRequireModuleNotFoundError
6- from benedict .utils import type_util
6+ from benedict .utils import pydantic_util , type_util
7+ from benedict .utils .pydantic_util import PydanticModel
78
89
910class IODict (BaseDict ):
@@ -20,18 +21,24 @@ def __init__(self, *args, **kwargs):
2021 d = IODict ._decode_init (arg , ** kwargs )
2122 super ().__init__ (d )
2223 return
24+
25+ schema = kwargs .pop ("schema" , None )
2326 super ().__init__ (* args , ** kwargs )
27+ if schema :
28+ self .validate (schema = schema )
2429
2530 @staticmethod
2631 def _decode_init (s , ** kwargs ):
2732 autodetected_format = io_util .autodetect_format (s )
2833 default_format = autodetected_format or "json"
2934 format = kwargs .pop ("format" , default_format ).lower ()
3035 # decode data-string and initialize with dict data.
31- return IODict ._decode (s , format , ** kwargs )
36+ data = IODict ._decode (s , format , ** kwargs )
37+ return data
3238
3339 @staticmethod
3440 def _decode (s , format , ** kwargs ):
41+ schema = kwargs .pop ("schema" , None )
3542 data = None
3643 try :
3744 data = io_util .decode (s , format , ** kwargs )
@@ -45,12 +52,15 @@ def _decode(s, format, **kwargs):
4552 ) from None
4653 # if possible return data as dict, otherwise raise exception
4754 if type_util .is_dict (data ):
48- return data
55+ pass
4956 elif type_util .is_list (data ):
5057 # force list to dict
51- return {"values" : data }
58+ data = {"values" : data }
5259 else :
5360 raise ValueError (f"Invalid data type: { type (data )} , expected dict or list." )
61+ if schema :
62+ data = pydantic_util .validate_data (data , schema = schema )
63+ return data
5464
5565 @staticmethod
5666 def _encode (d , format , ** kwargs ):
@@ -325,3 +335,14 @@ def to_yaml(self, **kwargs):
325335 A ValueError is raised in case of failure.
326336 """
327337 return self ._encode (self .dict (), "yaml" , ** kwargs )
338+
339+ def validate (self , * , schema : PydanticModel ):
340+ """
341+ Validate the dict and update it using a Pydantic schema.
342+
343+ Args:
344+ schema: Pydantic model class for validation
345+ """
346+ data = pydantic_util .validate_data (self , schema = schema )
347+ self .clear ()
348+ self .update (data )
0 commit comments