diff --git a/dvc/utils/hydra.py b/dvc/utils/hydra.py index 793d9664f..274ae2fd0 100644 --- a/dvc/utils/hydra.py +++ b/dvc/utils/hydra.py @@ -54,8 +54,12 @@ def compose_and_dump( with initialize_config_dir(config_dir, version_base=None): cfg = compose(config_name=config_name, overrides=overrides) - dumper = DUMPERS[Path(output_file).suffix.lower()] - dumper(output_file, OmegaConf.to_object(cfg)) + suffix = Path(output_file).suffix.lower() + if suffix not in [".yml", ".yaml"]: + dumper = DUMPERS[suffix] + dumper(output_file, OmegaConf.to_object(cfg)) + else: + Path(output_file).write_text(OmegaConf.to_yaml(cfg), encoding="utf-8") def apply_overrides(path: "StrPath", overrides: List[str]) -> None: diff --git a/tests/func/utils/test_hydra.py b/tests/func/utils/test_hydra.py index 8338e3cbe..cfde109a6 100644 --- a/tests/func/utils/test_hydra.py +++ b/tests/func/utils/test_hydra.py @@ -174,12 +174,25 @@ def test_compose_and_dump(tmp_dir, suffix, overrides, expected): from dvc.utils.hydra import compose_and_dump config_name = "config" - config_dir = hydra_setup(tmp_dir, "conf", "config") output_file = tmp_dir / f"params.{suffix}" + config_dir = hydra_setup(tmp_dir, "conf", "config") compose_and_dump(output_file, config_dir, config_name, overrides) assert output_file.parse() == expected +@pytest.mark.skipif(sys.version_info >= (3, 11), reason="unsupported on 3.11") +def test_compose_and_dump_yaml_handles_string(tmp_dir): + """Regression test for 8583""" + from dvc.utils.hydra import compose_and_dump + + config = tmp_dir / "conf" / "config.yaml" + config.parent.mkdir() + config.write_text("foo: 'no'\n") + output_file = tmp_dir / "params.yaml" + compose_and_dump(output_file, str(config.parent), "config", []) + assert output_file.read_text() == "foo: 'no'\n" + + @pytest.mark.parametrize( "overrides, expected", [