#!/usr/bin/env python3 import re from datetime import datetime, timezone, date release = re.compile("^## Release ([0-9]+\\.[0-9]+\\.[0-9]+) - ([0-9]+-[0-9]+-[0-9]+)$") title = "SpaceBeans releases" base_url = "https://www.usebox.net/jjm/spacebeans/" feed_file = "releases.xml" author = "jjm" tz = timezone.utc def get_entries(changes): entries = [] with open(changes, "rt") as fd: lines = fd.readlines() i = 0 while i < len(lines): line = lines[i] m = release.match(line) if m: version = m.group(1) updated_on = datetime.combine( datetime.fromisoformat(m.group(2)), datetime.min.time() ).astimezone(tz) body = "" i += 1 while i < len(lines) and (lines[i] == "" or lines[i][0] != "#"): body += lines[i] i += 1 entries.append(dict(version=version, updated_on=updated_on, body=body)) else: i += 1 entries.sort(key=lambda o: o["updated_on"], reverse=True) return entries def to_atom(post): return """\ {title} {url} {updated_on}
{body}

Download available at SpaceBeans website.

\n""".format( title="Released SpaceBeans " + post["version"], url=base_url + "#" + post["version"], download=base_url + "#download", updated_on=post["updated_on"].isoformat(), body=post["body"].rstrip() + "\n", ) def gen_atom(entries): updated_on = datetime(1900, 1, 1, tzinfo=tz) posts_atom = [] for post in entries: if post["updated_on"] > updated_on: updated_on = post["updated_on"] posts_atom.append(to_atom(post)) return "\n".join( [ """""", """""", """%s""" % title, """""" % base_url, """""" % (base_url + feed_file), """%s""" % updated_on.isoformat(), """%s""" % base_url, """""", """ %s""" % author, """""", ] + posts_atom + [""] ) def main(): entries = get_entries("../CHANGES.md") with open(feed_file, "wt") as fd: fd.write(gen_atom(entries)) if __name__ == "__main__": main()