@@ -73,7 +73,7 @@ def render_unreleased(paths: Iterable[Path] | None = None) -> str:
7373 """Render all fragments as one deterministic ``Unreleased`` Markdown block."""
7474 selected = fragment_paths () if paths is None else tuple (paths )
7575 if not selected :
76- raise ValueError ( "at least one changelog fragment is required" )
76+ return "## Unreleased \n "
7777
7878 grouped : dict [str , list [tuple [str , tuple [str , ...]]]] = defaultdict (list )
7979 for path in selected :
@@ -94,10 +94,15 @@ def render_unreleased(paths: Iterable[Path] | None = None) -> str:
9494
9595def _managed_block (rendered : str ) -> str :
9696 """Return the marker-delimited fragment body embedded under Unreleased."""
97- heading , separator , body = rendered .partition ("\n \n " )
98- if heading != "## Unreleased" or not separator or not body .strip ():
99- raise ValueError ("rendered changelog must contain one non-empty Unreleased block" )
100- return f"{ BEGIN_MARKER } \n { body .rstrip ()} \n { END_MARKER } \n "
97+ if rendered == "## Unreleased\n " :
98+ return f"{ BEGIN_MARKER } \n { END_MARKER } \n "
99+ prefix = "## Unreleased\n \n "
100+ if not rendered .startswith (prefix ):
101+ raise ValueError ("rendered changelog must contain one Unreleased block" )
102+ body = rendered [len (prefix ) :].rstrip ()
103+ if not body :
104+ raise ValueError ("rendered changelog has an invalid empty fragment body" )
105+ return f"{ BEGIN_MARKER } \n { body } \n { END_MARKER } \n "
101106
102107
103108def synchronize_text (changelog : str , rendered : str ) -> str :
0 commit comments