@@ -52,34 +52,10 @@ def load_source(self,
5252 :return: Instance of the target class if loader worked
5353 """
5454
55- # Makes coding easier down the line if we've got this, even if it is strictly internal
56- if metadata is None :
57- metadata = FileInfo ()
58- if not isinstance (source , dict ):
59- data = hbread (source , metadata , metadata .base_path , accept_header )
60- else :
61- data = source
55+ data = self ._read_source (source , metadata = metadata , base_dir = metadata .base_path , accept_header = accept_header )
6256 data_as_dict = loader (data , metadata )
57+ return self ._construct_target_class (data_as_dict , target_class = target_class )
6358
64- if data_as_dict :
65- if isinstance (data_as_dict , list ):
66- if issubclass (target_class , YAMLRoot ):
67- return [target_class (** as_dict (x )) for x in data_as_dict ]
68- elif issubclass (target_class , BaseModel ):
69- return [target_class .parse_obj (** as_dict (x )) for x in data_as_dict ]
70- else :
71- raise ValueError (f'Cannot load list of { target_class } ' )
72- elif isinstance (data_as_dict , dict ):
73- if issubclass (target_class , BaseModel ):
74- return target_class .parse_obj (data_as_dict )
75- else :
76- return target_class (** data_as_dict )
77- elif isinstance (data_as_dict , JsonObj ):
78- return [target_class (** as_dict (x )) for x in data_as_dict ]
79- else :
80- raise ValueError (f'Unexpected type { data_as_dict } ' )
81- else :
82- return None
8359
8460 def load (self , * args , ** kwargs ) -> Union [BaseModel , YAMLRoot ]:
8561 """
@@ -97,6 +73,9 @@ def load(self, *args, **kwargs) -> Union[BaseModel, YAMLRoot]:
9773 return results
9874 else :
9975 raise ValueError (f'Result is not an instance of BaseModel or YAMLRoot: { type (results )} ' )
76+
77+ def load_as_dict (self , * args , ** kwargs ) -> Union [dict , List [dict ]]:
78+ raise NotImplementedError ()
10079
10180 @abstractmethod
10281 def load_any (self , source : Union [str , dict , TextIO ], target_class : Type [Union [BaseModel , YAMLRoot ]], * , base_dir : Optional [str ] = None ,
@@ -134,3 +113,44 @@ def loads(self, source: str, target_class: Type[Union[BaseModel, YAMLRoot]], *,
134113 :return: instance of taarget_class
135114 """
136115 return self .load (source , target_class , metadata = metadata )
116+
117+ def _construct_target_class (self ,
118+ data_as_dict : Union [dict , List [dict ]],
119+ target_class : Union [Type [YAMLRoot ], Type [BaseModel ]]) -> Optional [Union [BaseModel , YAMLRoot , List [BaseModel ], List [YAMLRoot ]]]:
120+ if data_as_dict :
121+ if isinstance (data_as_dict , list ):
122+ if issubclass (target_class , YAMLRoot ):
123+ return [target_class (** as_dict (x )) for x in data_as_dict ]
124+ elif issubclass (target_class , BaseModel ):
125+ return [target_class .parse_obj (** as_dict (x )) for x in data_as_dict ]
126+ else :
127+ raise ValueError (f'Cannot load list of { target_class } ' )
128+ elif isinstance (data_as_dict , dict ):
129+ if issubclass (target_class , BaseModel ):
130+ return target_class .parse_obj (data_as_dict )
131+ else :
132+ return target_class (** data_as_dict )
133+ elif isinstance (data_as_dict , JsonObj ):
134+ return [target_class (** as_dict (x )) for x in data_as_dict ]
135+ else :
136+ raise ValueError (f'Unexpected type { data_as_dict } ' )
137+ else :
138+ return None
139+
140+ def _read_source (self ,
141+ source : Union [str , dict , TextIO ],
142+ * ,
143+ base_dir : Optional [str ] = None ,
144+ metadata : Optional [FileInfo ] = None ,
145+ accept_header : Optional [str ] = "text/plain, application/yaml;q=0.9" ) -> Union [dict , str ]:
146+ if metadata is None :
147+ metadata = FileInfo ()
148+ if base_dir and not metadata .base_path :
149+ metadata .base_path = base_dir
150+
151+ if not isinstance (source , dict ):
152+ data = hbread (source , metadata , metadata .base_path , accept_header )
153+ else :
154+ data = source
155+
156+ return data
0 commit comments