1010
1111from tqdm import tqdm
1212
13- from .safe_open import safe_open , safe_open_dict_reader , safe_open_json , safe_open_yaml
13+ from .safe_open import (
14+ _open_read_text ,
15+ _open_write_text ,
16+ safe_open_dict_reader ,
17+ safe_open_json ,
18+ safe_open_yaml ,
19+ write_json ,
20+ write_yaml ,
21+ )
1422
1523if TYPE_CHECKING :
1624 import pydantic
1927 "ModelValidateFailureAction" ,
2028 "iter_pydantic_jsonl" ,
2129 "iter_pydantic_tsv" ,
30+ "model_dump_yaml" ,
2231 "read_pydantic_json" ,
2332 "read_pydantic_jsonl" ,
2433 "read_pydantic_tsv" ,
2534 "read_pydantic_yaml" ,
2635 "stream_write_pydantic_jsonl" ,
36+ "write_pydantic_json" ,
2737 "write_pydantic_jsonl" ,
38+ "write_pydantic_yaml" ,
2839]
2940
3041logger = logging .getLogger (__name__ )
@@ -55,9 +66,7 @@ def iter_pydantic_jsonl(
5566 }
5667 if tqdm_kwargs is not None :
5768 _tqdm_kwargs .update (tqdm_kwargs )
58- with safe_open (
59- file , operation = "read" , representation = "text" , encoding = encoding , newline = newline
60- ) as file :
69+ with _open_read_text (file , encoding = encoding , newline = newline ) as file :
6170 for i , line in enumerate (tqdm (file , disable = not progress , ** _tqdm_kwargs )):
6271 try :
6372 yv = model_cls .model_validate_json (line .strip ())
@@ -85,7 +94,7 @@ def write_pydantic_jsonl(
8594 kwargs .setdefault ("exclude_none" , True )
8695 kwargs .setdefault ("exclude_unset" , True )
8796 kwargs .setdefault ("exclude_defaults" , True )
88- with safe_open (file , operation = "write" , representation = "text" ) as file :
97+ with _open_write_text (file ) as file :
8998 for model in models :
9099 file .write (model .model_dump_json (** kwargs ) + "\n " )
91100
@@ -97,7 +106,7 @@ def stream_write_pydantic_jsonl(
97106 kwargs .setdefault ("exclude_none" , True )
98107 kwargs .setdefault ("exclude_unset" , True )
99108 kwargs .setdefault ("exclude_defaults" , True )
100- with safe_open (file , operation = "write" , representation = "text" ) as file :
109+ with _open_write_text (file ) as file :
101110 for model in models :
102111 file .write (model .model_dump_json (** kwargs ) + "\n " )
103112 yield model
@@ -161,3 +170,44 @@ def read_pydantic_yaml(
161170) -> BaseModelVar :
162171 """Read a YAML file into a model."""
163172 return model_cls .model_validate (safe_open_yaml (path_or_url , encoding = encoding , newline = newline ))
173+
174+
175+ def model_dump_yaml (
176+ model : pydantic .BaseModel ,
177+ * ,
178+ exclude_none : bool = False ,
179+ exclude_unset : bool = False ,
180+ ) -> str :
181+ """Dump the model as YAML string."""
182+ import yaml
183+
184+ data = model .model_dump (mode = "json" , exclude_none = exclude_none , exclude_unset = exclude_unset )
185+ return yaml .safe_dump (data )
186+
187+
188+ def write_pydantic_yaml (
189+ model : pydantic .BaseModel ,
190+ path : str | Path | TextIO ,
191+ * ,
192+ exclude_none : bool = False ,
193+ exclude_unset : bool = False ,
194+ encoding : str | None = None ,
195+ newline : str | None = None ,
196+ ) -> None :
197+ """Write a model to a YAML file."""
198+ data = model_dump_yaml (model , exclude_none = exclude_none , exclude_unset = exclude_unset )
199+ write_yaml (data , path , encoding = encoding , newline = newline )
200+
201+
202+ def write_pydantic_json (
203+ model : pydantic .BaseModel ,
204+ path : str | Path | TextIO ,
205+ * ,
206+ exclude_none : bool = False ,
207+ exclude_unset : bool = False ,
208+ encoding : str | None = None ,
209+ newline : str | None = None ,
210+ ) -> None :
211+ """Write a model to a JSON file."""
212+ data = model .model_dump (mode = "json" , exclude_none = exclude_none , exclude_unset = exclude_unset )
213+ write_json (data , path , encoding = encoding , newline = newline )
0 commit comments