NiklasRosenstein / slap

Slap is a CLI to assist in the process for developing and releasing Python packages.
https://niklasrosenstein.github.io/slap/
Other
18 stars 11 forks source link

Add command to merge changelogs from multiple sub-projects into one #144

Open NiklasRosenstein opened 3 months ago

NiklasRosenstein commented 3 months ago

from pathlib import Path
from tomli import loads
from tomli_w import dumps

dirs = [
    "databind/.changelog",
    "databind.core/.changelog",
    "databind.json/.changelog",
]

output = ".changelog"

releases = {x.name for d in dirs for x in Path(d).iterdir()}

for release in releases:
    files = [Path(d) / release for d in dirs]
    payloads = [(f.parent.parent.name, loads(f.read_text())) for f in files if f.is_file()]

    release_dates = {x[1].get("release-date") for x in payloads}
    if len(release_dates) != 1:
        release_date = min(filter(None, release_dates))
        print(f"warning: mismatching release-date values in {release}: {release_dates}; using {release_date}")
    else:
        release_date = release_dates.pop()

    entries = [{**e, "component": x[0]} for x in payloads for e in x[1].get("entries", [])]

    dest = Path(output) / release
    result = {"entries": entries}
    if release_date is not None:
        result["release-date"] = release_date
    dest.write_text(dumps(result))