diff options
author | Ben Brown <ben.brown@codethink.co.uk> | 2017-05-25 16:22:36 +0100 |
---|---|---|
committer | Ben Brown <ben.brown@codethink.co.uk> | 2017-05-26 12:06:13 +0100 |
commit | f431c693228aad296b6c46607223c4a48c3eaeb7 (patch) | |
tree | 673fa091dea089250573e43fce31516d8fd0f876 | |
parent | ebb84714ea7ce2ffffa3a9e64f301f05be54b75a (diff) | |
download | ybd-f431c693228aad296b6c46607223c4a48c3eaeb7.tar.gz |
Improve how differences are displayed
-rw-r--r-- | ybd/release_note.py | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/ybd/release_note.py b/ybd/release_note.py index 899bc01..6cb1e92 100644 --- a/ybd/release_note.py +++ b/ybd/release_note.py @@ -15,9 +15,13 @@ # =*= License: GPL-2 =*= import os +import re from subprocess import check_output import tempfile import app +import yaml +import difflib +import itertools from app import chdir, config, log from pots import Pots from repos import ( @@ -55,6 +59,22 @@ def do_release_note(release_note): release_note) +def represent_str(dumper, data): + if data.count('\n') == 0: + return yaml.representer.SafeRepresenter.represent_str(dumper, data) + return dumper.represent_scalar(u'tag:yaml.org,2002:str', data, style='|') + + +def sanitise_yaml(obj): + stripped = re.sub(r' +(?=\\n)', '', yaml.dump(obj), flags=re.MULTILINE) + yaml.add_representer(str, represent_str) + return yaml.safe_load(stripped) + + +def expand_obj(obj): + return [x for x in yaml.dump(obj, default_flow_style=False).splitlines()] + + def log_changes(dn, tmpdir, old_defs, ref): do_git_log = False old_def = old_defs.get(dn['path'], {}) @@ -68,13 +88,11 @@ def log_changes(dn, tmpdir, old_defs, ref): if type(dn[key]) in (str, unicode, int): f.write('%s | %s\n' % (old_value, dn[key])) if type(dn[key]) not in (str, unicode, int, float): - if old_value: - for x in old_value: - f.write(repr(x)) - f.write('\n vvv\n') - if dn[key]: - for x in dn[key]: - f.write(repr(x)) + before = expand_obj(sanitise_yaml(old_value or "")) + after = expand_obj(sanitise_yaml(dn[key])) + diff = itertools.islice(difflib.unified_diff( + before, after), 2, None) + f.write('\n'.join(diff)) f.write('\n\n') if (dn.get('kind', 'chunk') == 'chunk' and dn.get('repo') and |