From bfd58afa2a302356193f18df5e6708fead70ceca Mon Sep 17 00:00:00 2001 From: Julian Dehm Date: Wed, 26 Jun 2024 15:36:04 +0200 Subject: [PATCH] add CHANGELOG --- CHANGELOG.md | 8 +++++ changelog/README.md | 47 ++++++++++++++++++++++++++++ changelog/_0001.md | 3 ++ changelog/parse_changelogs.py | 59 +++++++++++++++++++++++++++++++++++ 4 files changed, 117 insertions(+) create mode 100644 CHANGELOG.md create mode 100644 changelog/README.md create mode 100644 changelog/_0001.md create mode 100755 changelog/parse_changelogs.py diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..4c4c560f --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,8 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +Since version unreleased the format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +This project (not yet) adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## unreleased diff --git a/changelog/README.md b/changelog/README.md new file mode 100644 index 00000000..ab684f07 --- /dev/null +++ b/changelog/README.md @@ -0,0 +1,47 @@ +### Changelogs + +Temporary folder to add new changes. Each change should go into a separate file +(unless it makes sense to group some changes into one file, e.g. a story). +During release the changes will be moved to CHANGELOG.md. + +Each file should follow one of the below naming patterns: + +- \.md + or +- \.md + or +- \.md + or +- \.md if none of other apply + +The content of the file should look like this: + +``` +### + +- description of the change in one or max two sentences (# or !) +``` + +< type of change > can be one of: + +- **Added** for new features. +- **Changed**: for changes in existing functionality. +- **Deprecated**: for soon-to-be removed features. +- **Removed**: for now removed features. +- **Fixed**: for any bug fixes. +- **Security**: in case of vulnerabilities. + +## Example + +``` +### Fixed + +- improve userdashboard filter performance (#2449) +``` + +## Create release changelog + +To create the changelog for a release you can either copy the content +of all the changelog files into CHANGELOG.md manually or use the +`parse_changelogs.py` in this folder by running it here: +`./parse_changelogs.py`. diff --git a/changelog/_0001.md b/changelog/_0001.md new file mode 100644 index 00000000..0dd15915 --- /dev/null +++ b/changelog/_0001.md @@ -0,0 +1,3 @@ +### Added + +- add a CHANGELOG.md and changelog/ folder diff --git a/changelog/parse_changelogs.py b/changelog/parse_changelogs.py new file mode 100755 index 00000000..564489a2 --- /dev/null +++ b/changelog/parse_changelogs.py @@ -0,0 +1,59 @@ +#!/bin/python3 + +import logging +import os +import re +from collections import OrderedDict + +logger = logging.getLogger(__name__) + + +def combine_sections_in_folder(folder_path): + """Parser for changelog files following the https://keepachangelog.com + format. + """ + allowed_section_headers = [ + "Added", + "Changed", + "Deprecated", + "Removed", + "Fixed", + "Security", + ] + sections = OrderedDict() + + for filename in os.listdir(folder_path): + if filename.endswith(".md") and filename != "README.md": + filepath = os.path.join(folder_path, filename) + with open(filepath, "r") as file: + current_section = None + for line in file: + # find all headings starting with # (they should always + # start with ### but we seem to sometimes use # or ##) + match = re.match(r"^#+ (.*)", line) + if match: + section_header = match.group(1).strip().capitalize() + if section_header not in allowed_section_headers: + logger.warning( + f"warning: section_header {section_header} " + f"in file {filename} is invalid, " + "see https://keepachangelog.com for a list of " + "allowed types." + ) + current_section = sections.get(section_header, []) + elif current_section is not None and line.strip(): + current_section.append(line) + sections[section_header] = current_section + + combined_md = "" + for section_header, lines in sections.items(): + combined_md += "### " + section_header + "\n\n" + combined_md += "".join(lines) + "\n" + + return combined_md + + +if __name__ == "__main__": + folder_path = "." + combined_md = combine_sections_in_folder(folder_path) + print(combined_md)