From 6858d849417dd539bc1080fd6b2f97ebacbe76ab Mon Sep 17 00:00:00 2001 From: Doug Hellmann Date: Thu, 27 Aug 2015 18:06:32 +0000 Subject: [PATCH] add report command Change-Id: Iffc4e6bcf0b3f4ae0d9af483f1eb0bcb8aa72b40 --- reno/main.py | 17 ++++++++++ reno/report.py | 87 ++++++++++++++++++++++++++++++++++++++++++++++++ requirements.txt | 1 + 3 files changed, 105 insertions(+) create mode 100644 reno/report.py diff --git a/reno/main.py b/reno/main.py index 1aab047..2b3cbe4 100644 --- a/reno/main.py +++ b/reno/main.py @@ -15,6 +15,7 @@ import sys from reno import create from reno import lister +from reno import report def main(argv=sys.argv[1:]): @@ -55,5 +56,21 @@ def main(argv=sys.argv[1:]): ) do_list.set_defaults(func=lister.list_cmd) + do_report = subparsers.add_parser( + 'report', + help='generate release notes report', + ) + do_report.add_argument( + 'reporoot', + help='root of the git repository', + ) + do_report.add_argument( + '--version', + default=[], + action='append', + help='the version(s) to include, defaults to all', + ) + do_report.set_defaults(func=report.report_cmd) + args = parser.parse_args() return args.func(args) diff --git a/reno/report.py b/reno/report.py new file mode 100644 index 0000000..f634456 --- /dev/null +++ b/reno/report.py @@ -0,0 +1,87 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from __future__ import print_function + +from reno import scanner +from reno import utils + +import yaml + + +_SECTION_ORDER = [ + ('features', 'New Features'), + ('issues', 'Known Issues'), + ('upgrade', 'Upgrade Notes'), + ('critical', 'Critical Issues'), + ('security', 'Security Issues'), + ('fixes', 'Bug Fixes'), + ('other', 'Other Notes'), +] + + +def format_report(scanner_output, versions_to_include): + report = [] + report.append('=============') + report.append('Release Notes') + report.append('=============') + report.append('') + + # Read all of the notes files. + file_contents = {} + for version in versions_to_include: + for filename in scanner_output[version]: + with open(filename, 'r') as f: + y = yaml.safe_load(f) + file_contents[filename] = y + + for version in versions_to_include: + report.append(version) + report.append('=' * len(version)) + report.append('') + + # Add the preambles. + notefiles = scanner_output[version] + for n in notefiles: + if 'preamble' in file_contents[n]: + report.append(file_contents[n]['preamble']) + report.append('') + + for section_name, section_title in _SECTION_ORDER: + notes = [ + n + for fn in notefiles + for n in file_contents[fn].get(section_name, []) + ] + if notes: + report.append(section_title) + report.append('-' * len(section_title)) + report.append('') + for n in notes: + report.append('- %s' % n) + report.append('') + + return '\n'.join(report) + + +def report_cmd(args): + "Generates a release notes report" + reporoot = args.reporoot.rstrip('/') + '/' + notesdir = utils.get_notes_dir(args) + notes = scanner.get_notes_by_version(reporoot, notesdir) + if args.version: + versions = args.version + else: + versions = notes.keys() + text = format_report(notes, versions) + print(text) + return diff --git a/requirements.txt b/requirements.txt index 5b3077e..2dc6330 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,3 +4,4 @@ pbr<2.0,>=1.4 Babel>=1.3 +PyYAML>=3.1.0