Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 38 additions & 9 deletions box/converters.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)

Expand All @@ -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)

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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:
Expand All @@ -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:
Expand Down Expand Up @@ -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)
Expand Down
15 changes: 15 additions & 0 deletions test/test_converters.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down Expand Up @@ -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)
Expand Down