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

Reply via email to