On Tue, Feb 18, 2014 at 3:39 PM, Hrvoje Ribicic <[email protected]> wrote:

> The PrintGenericInfo function in cli.py did not handle tuples as
> containers of items, making it impossible for these to be deserialized
> automatically when a YAML parser is used. This patch adds separate
> handling of tuples, including inlining them for readability when
> possible.
>
> Signed-off-by: Hrvoje Ribicic <[email protected]>
> ---
>  lib/cli.py | 25 ++++++++++++++++++++++++-
>  1 file changed, 24 insertions(+), 1 deletion(-)
>
> diff --git a/lib/cli.py b/lib/cli.py
> index 951ef4a..97c16ba 100644
> --- a/lib/cli.py
> +++ b/lib/cli.py
> @@ -4172,6 +4172,16 @@ def CreateIPolicyFromOpts(ispecs_mem_size=None,
>    return ipolicy_out
>
>
> +def _NotAContainer(data):
> +  """ Checks whether the input is not a container data type.
> +
> +  @rtype: bool
> +
> +  """
> +  return not (isinstance(data, list) or isinstance(data, dict) or
> +              isinstance(data, tuple))
>

At other places in the code I've seen

  isinstance(data, (list, dict, tuple))

perhaps this could be used as well (but I'm not so familiar with isinstance
to be 100% sure).


> +
> +
>  def _SerializeGenericInfo(buf, data, level, afterkey=False):
>    """Formatting core of L{PrintGenericInfo}.
>
> @@ -4217,7 +4227,20 @@ def _SerializeGenericInfo(buf, data, level,
> afterkey=False):
>        buf.write(key)
>        buf.write(": ")
>        _SerializeGenericInfo(buf, val, level + 1, afterkey=True)
> -  elif isinstance(data, list):
> +  elif isinstance(data, tuple) and all(map(_NotAContainer, data)):
> +    # tuples with simple content are serialized as inline lists
> +    first = True
> +    buf.write('[')
> +    for item in data:
> +      if first:
> +        first = False
> +      else:
> +        buf.write(", ")
> +      buf.write(str(item))
> +    buf.write(']')
> +    buf.write("\n")
>

Perhaps this could be simplified something like this (untested):

  buf.write("[" + ", ".join(map(str, data)) + "]\n")

or even better

  buf.write("[" + utils.CommaJoin(data) + "]\n")

or (as I've seen at some place in our code)

  buf.write("[%s]\n" % utils.CommaJoin(data))

(at slight performance cost.)


> +  elif isinstance(data, list) or isinstance(data, tuple):
> +    # lists and tuples
>      if not data:
>        buf.write("\n")
>      else:
> --
> 1.9.0.rc1.175.g0b1dcb5
>
>
Otherwise LGTM

Reply via email to