On Fri, Feb 21, 2014 at 4:13 PM, Petr Pudlák <[email protected]> wrote:
> > > > On Tue, Feb 18, 2014 at 3:39 PM, Hrvoje Ribicic <[email protected]> wrote: > >> Aligning dictionary entries makes no difference to the YAML parser, but >> > Just nitpicking: I'd say "a YAML parser" > > Ack. > makes the output much easier to read and compare. This patch adds the >> possibility of specifying alignment groups to ordered dictionary >> entries. >> >> Signed-off-by: Hrvoje Ribicic <[email protected]> >> --- >> lib/cli.py | 34 +++++++++++++++++++++++++++++++++- >> 1 file changed, 33 insertions(+), 1 deletion(-) >> >> diff --git a/lib/cli.py b/lib/cli.py >> index 97c16ba..6dc415f 100644 >> --- a/lib/cli.py >> +++ b/lib/cli.py >> @@ -4182,6 +4182,30 @@ def _NotAContainer(data): >> isinstance(data, tuple)) >> >> >> +def _GetAlignmentMapping(data): >> + """ Returns info about alignment if present in an encoded ordered >> dictionary. >> + >> + @type data: list of tuple >> + @param data: The encoded ordered dictionary, as defined in >> + L{_SerializeGenericInfo}. >> + @rtype: dict of any to int >> + @return: The dictionary mapping alignment groups to the maximum length >> of the >> + dictionary key found in the group. >> + >> + """ >> + alignment_map = {} >> + for entry in data: >> + if len(entry) > 2: >> + group_key = entry[2] >> + key_length = len(entry[0]) >> + if group_key in alignment_map: >> + alignment_map[group_key] = max(alignment_map[group_key], >> key_length) >> + else: >> + alignment_map[group_key] = key_length >> + >> + return alignment_map >> + >> + >> def _SerializeGenericInfo(buf, data, level, afterkey=False): >> """Formatting core of L{PrintGenericInfo}. >> >> @@ -4214,18 +4238,26 @@ def _SerializeGenericInfo(buf, data, level, >> afterkey=False): >> _SerializeGenericInfo(buf, data[key], level + 1, afterkey=True) >> elif isinstance(data, list) and len(data) > 0 and isinstance(data[0], >> tuple): >> # list of tuples (an ordered dictionary) >> + # the tuples may have two or three members - key, value, and >> alignment group >> + # if the alignment group is present, align all values sharing the >> same group >> if afterkey: >> buf.write("\n") >> doindent = True >> else: >> doindent = False >> - for (key, val) in data: >> + >> + alignment_mapping = _GetAlignmentMapping(data) >> + for entry in data: >> + key, val = entry[0:2] >> if doindent: >> buf.write(baseind * level) >> else: >> doindent = True >> buf.write(key) >> buf.write(": ") >> + if len(entry) > 2: >> + max_key_length = alignment_mapping[entry[2]] >> + buf.write(" " * (max_key_length - len(key))) >> _SerializeGenericInfo(buf, val, level + 1, afterkey=True) >> elif isinstance(data, tuple) and all(map(_NotAContainer, data)): >> # tuples with simple content are serialized as inline lists >> -- >> 1.9.0.rc1.175.g0b1dcb5 >> >> > Also please include the new behavior in the docs for PrintGenericInfo. > > Ack. > Otherwise LGTM, thanks. > Thanks for the review, interdiff (barring the minor commit message change) is: diff --git a/lib/cli.py b/lib/cli.py index 15dcd3f..d89042a 100644 --- a/lib/cli.py +++ b/lib/cli.py @@ -4295,9 +4295,11 @@ def PrintGenericInfo(data): can be: - dictionaries, where keys are strings and values are of any of the types listed here - - lists of pairs (key, value), where key is a string and value is of - any of the types listed here; it's a way to encode ordered - dictionaries + - lists of tuples (key, value) or (key, value, alignment_group), where + key is a string, value is of any of the types listed here, and + alignment_group can be any hashable value; it's a way to encode + ordered dictionaries; any entries sharing the same alignment group are + aligned by appending whitespace before the value as needed - lists of any of the types listed here - strings
