From 07ad31e0d8ed7acead8fb02407f44bf72de604b7 Mon Sep 17 00:00:00 2001 From: Shevanio Date: Wed, 8 Jul 2026 18:12:54 +0000 Subject: [PATCH] Prevent PyYAML YAML output from wrapping long scalars by default --- box/converters.py | 47 +++++++++++++++++++++++++++++++++-------- test/test_converters.py | 15 +++++++++++++ 2 files changed, 53 insertions(+), 9 deletions(-) diff --git a/box/converters.py b/box/converters.py index bb91ba6..ca9dd47 100644 --- a/box/converters.py +++ b/box/converters.py @@ -31,7 +31,9 @@ except ImportError: pyyaml_available = False -MISSING_PARSER_ERROR = "No YAML Parser available, please install ruamel.yaml>=0.17 or PyYAML" +MISSING_PARSER_ERROR = ( + "No YAML Parser available, please install ruamel.yaml>=0.17 or PyYAML" +) toml_read_library: Any | None = None toml_write_library: Any | None = None @@ -154,7 +156,11 @@ def _exists(filename: str | PathLike, create: bool = False) -> Path: def _to_json( - obj, filename: str | PathLike | None = None, encoding: str = "utf-8", errors: str = "strict", **json_kwargs + obj, + filename: str | PathLike | None = None, + encoding: str = "utf-8", + errors: str = "strict", + **json_kwargs, ): if filename: _exists(filename, create=True) @@ -213,7 +219,10 @@ def _to_yaml( setattr(yaml_dumper, attr, value) return yaml_dumper.dump(obj, stream=f, **yaml_kwargs) elif pyyaml_available: - return yaml.dump(obj, stream=f, default_flow_style=default_flow_style, width=width, **yaml_kwargs) + yaml_kwargs.setdefault("width", 2**31 - 1 if width == 120 else width) + return yaml.dump( + obj, stream=f, default_flow_style=default_flow_style, **yaml_kwargs + ) else: raise BoxError(MISSING_PARSER_ERROR) @@ -228,7 +237,8 @@ def _to_yaml( yaml_dumper.dump(obj, stream=string_stream, **yaml_kwargs) return string_stream.getvalue() elif pyyaml_available: - return yaml.dump(obj, default_flow_style=default_flow_style, width=width, **yaml_kwargs) + yaml_kwargs.setdefault("width", 2**31 - 1 if width == 120 else width) + return yaml.dump(obj, default_flow_style=default_flow_style, **yaml_kwargs) else: raise BoxError(MISSING_PARSER_ERROR) @@ -275,7 +285,12 @@ def _from_yaml( return data -def _to_toml(obj, filename: str | PathLike | None = None, encoding: str = "utf-8", errors: str = "strict"): +def _to_toml( + obj, + filename: str | PathLike | None = None, + encoding: str = "utf-8", + errors: str = "strict", +): if filename: _exists(filename, create=True) if toml_write_library.__name__ == "toml": # type: ignore @@ -327,7 +342,9 @@ def _to_msgpack(obj, filename: str | PathLike | None = None, **kwargs): return msgpack.packb(obj, **kwargs) -def _from_msgpack(msgpack_bytes: bytes | None = None, filename: str | PathLike | None = None, **kwargs): +def _from_msgpack( + msgpack_bytes: bytes | None = None, filename: str | PathLike | None = None, **kwargs +): if filename: _exists(filename) with open(filename, "rb") as f: @@ -339,7 +356,13 @@ def _from_msgpack(msgpack_bytes: bytes | None = None, filename: str | PathLike | return data -def _to_toon(obj, filename: str | PathLike | None = None, encoding: str = "utf-8", errors: str = "strict", **kwargs): +def _to_toon( + obj, + filename: str | PathLike | None = None, + encoding: str = "utf-8", + errors: str = "strict", + **kwargs, +): if filename: _exists(filename, create=True) with open(filename, "w", encoding=encoding, errors=errors) as f: @@ -367,12 +390,18 @@ def _from_toon( def _to_csv( - box_list, filename: str | PathLike | None = None, encoding: str = "utf-8", errors: str = "strict", **kwargs + box_list, + filename: str | PathLike | None = None, + encoding: str = "utf-8", + errors: str = "strict", + **kwargs, ): csv_column_names = list(box_list[0].keys()) for row in box_list: if list(row.keys()) != csv_column_names: - raise BoxError("BoxList must contain the same dictionary structure for every item to convert to csv") + raise BoxError( + "BoxList must contain the same dictionary structure for every item to convert to csv" + ) if filename: _exists(filename, create=True) diff --git a/test/test_converters.py b/test/test_converters.py index d66b75b..c0cb4b2 100644 --- a/test/test_converters.py +++ b/test/test_converters.py @@ -11,6 +11,7 @@ from ruamel.yaml import YAML from box import BoxError +import box.converters as converters from box.converters import _from_toml, _to_json, _to_msgpack, _to_toml, _to_yaml toml_string = """[movies.Spaceballs] @@ -84,6 +85,20 @@ def test_to_yaml(self): yaml = YAML() assert yaml.load(open(m_file)) == yaml.load(movie_string) + def test_to_yaml_pyyaml_does_not_wrap_long_scalar_by_default(self, monkeypatch): + if not converters.pyyaml_available: + pytest.skip("PyYAML not available") + monkeypatch.setattr(converters, "ruamel_available", False) + long_scalar = " ".join(["word"] * 50) + expected = f"long: {long_scalar}\n" + + yaml_string = _to_yaml({"long": long_scalar}) + assert yaml_string == expected + + out_file = Path(tmp_dir, "long_yaml") + _to_yaml({"long": long_scalar}, filename=out_file) + assert out_file.read_text() == expected + def test_to_msgpack(self): m_file = os.path.join(tmp_dir, "movie_data") msg_data = _to_msgpack(movie_data)