diff --git a/src/pyproject_fmt/formatter/project.py b/src/pyproject_fmt/formatter/project.py index a3577d7..4020567 100644 --- a/src/pyproject_fmt/formatter/project.py +++ b/src/pyproject_fmt/formatter/project.py @@ -22,6 +22,7 @@ from .config import Config _PY_MIN_VERSION: int = 7 +_ANY_WHITESPACE = re.compile(r"\s+") def fmt_project(parsed: TOMLDocument, conf: Config) -> None: # noqa: C901 @@ -40,7 +41,9 @@ def fmt_project(parsed: TOMLDocument, conf: Config) -> None: # noqa: C901 assert isinstance(name, str) # noqa: S101 project["name"] = canonicalize_name(name) if "description" in project: - project["description"] = String.from_raw(str(project["description"]).strip()) + # Convert multiline description to a single line + _description = _ANY_WHITESPACE.sub(" ", str(project["description"]).strip()) + project["description"] = String.from_raw(_description, escape=False) sorted_array(cast(Optional[Array], project.get("keywords")), indent=conf.indent) sorted_array(cast(Optional[Array], project.get("dynamic")), indent=conf.indent) diff --git a/tests/formatter/test_project.py b/tests/formatter/test_project.py index 801b74a..f822a71 100644 --- a/tests/formatter/test_project.py +++ b/tests/formatter/test_project.py @@ -115,6 +115,19 @@ def test_project_description(fmt: Fmt) -> None: fmt(fmt_project, start, expected) +def test_project_description_multiline(fmt: Fmt) -> None: + start = dedent('''\ + [project] + description="""A multi-line + description.""" + ''') + expected = dedent("""\ + [project] + description="A multi-line description." + """) + fmt(fmt_project, start, expected) + + def test_project_scripts(fmt: Fmt) -> None: start = """ [project.scripts]