From 4b54ea812a29416e7b6b453cbf1f52dacade58f4 Mon Sep 17 00:00:00 2001 From: Anatoly Makarevich Date: Wed, 26 Apr 2023 19:30:05 +0200 Subject: [PATCH] Fix writing with pre-opened file (#54) * Fixing #53 * Add regression test for the failing case. --- src/pydantic_yaml/dumper.py | 3 ++- src/test/test_basic.py | 9 ++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/pydantic_yaml/dumper.py b/src/pydantic_yaml/dumper.py index 32ed464..2176588 100644 --- a/src/pydantic_yaml/dumper.py +++ b/src/pydantic_yaml/dumper.py @@ -22,7 +22,7 @@ def _chk_model(model: Any) -> BaseModel: raise TypeError(f"We can currently only write `pydantic.BaseModel`, but recieved: {model!r}") -def _write_yaml_model(stream: IOBase, model: BaseModel, **kwargs): +def _write_yaml_model(stream: IOBase, model: BaseModel, **kwargs) -> None: """Write YAML model to the stream object. This uses JSON dumping as an intermediary. @@ -88,6 +88,7 @@ def to_yaml_file(file: Union[Path, str, IOBase], model: BaseModel, **kwargs) -> model = _chk_model(model) if isinstance(file, IOBase): _write_yaml_model(file, model, **kwargs) + return if isinstance(file, str): file = Path(file).resolve() diff --git a/src/test/test_basic.py b/src/test/test_basic.py index 23d2dc3..7813d70 100644 --- a/src/test/test_basic.py +++ b/src/test/test_basic.py @@ -1,12 +1,13 @@ """Tests for basic functionality.""" +from pathlib import Path from typing import Type import pydantic import pytest from pydantic import BaseModel -from pydantic_yaml import parse_yaml_file_as, parse_yaml_raw_as, to_yaml_str +from pydantic_yaml import parse_yaml_file_as, parse_yaml_raw_as, to_yaml_str, to_yaml_file from pydantic_yaml.examples.base_models import ( A, B, @@ -77,3 +78,9 @@ def test_secret_yes_rt(): mdl = parse_yaml_raw_as(SecretTstModelDumpable, raw) assert mdl.ss.get_secret_value() == "123" assert mdl.sb.get_secret_value() == b"321" + + +def test_write_open_file(tmpdir): + """Test writing to a pre-opened file.""" + with (Path(tmpdir) / "test_write_open_file.yaml").open(mode="w") as f: + to_yaml_file(f, A(a="a"))