old_contents: # Copyright 2013 Spanish National Research Council (CSIC)
  #
  # 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.
  
  import os
  import sys
  
  import prettytable
  
  
  def arg(*args, **kwargs):
      """Decorator for CLI args."""
      def _decorator(func):
          add_arg(func, *args, **kwargs)
          return func
      return _decorator
  
  
  def add_arg(f, *args, **kwargs):
      """Bind CLI arguments to a shell.py `do_foo` function."""
  
      if not hasattr(f, 'arguments'):
          f.arguments = []
  
      # NOTE(sirp): avoid dups that can occur when the module is shared across
      # tests.
      if (args, kwargs) not in f.arguments:
          # Because of the sematics of decorator composition if we just append
          # to the options list positional options will appear to be backwards.
          f.arguments.insert(0, (args, kwargs))
  
  
  def env(*vars, **kwargs):
      """
      returns the first environment variable set
      if none are non-empty, defaults to '' or keyword arg default
      """
      for v in vars:
          value = os.environ.get(v, None)
          if value:
              return value
      return kwargs.get('default', '')
  
  
  def import_class(import_str):
      """Returns a class from a string including module and class."""
      mod_str, _sep, class_str = import_str.rpartition('.')
      __import__(mod_str)
      return getattr(sys.modules[mod_str], class_str)
  
  
  def print_list(objs, fields, sortby=None):
      pt = prettytable.PrettyTable([f for f in fields], caching=False)
      pt.align = 'l'
  
      for o in objs:
          row = []
          for field in fields:
              row.append(o.get(field, None))
  #        for k, v in o.iteritems():
  #            row.append(k)
          pt.add_row(row)
  
      result = pt.get_string(sortby=sortby)
      print(result)
  
new_contents: # Copyright 2013 Spanish National Research Council (CSIC)
  #
  # 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.
  
  import os
  import sys
  
  import prettytable
  
  
  def arg(*args, **kwargs):
      """Decorator for CLI args."""
      def _decorator(func):
          add_arg(func, *args, **kwargs)
          return func
      return _decorator
  
  
  def add_arg(f, *args, **kwargs):
      """Bind CLI arguments to a shell.py `do_foo` function."""
  
      if not hasattr(f, 'arguments'):
          f.arguments = []
  
      # NOTE(sirp): avoid dups that can occur when the module is shared across
      # tests.
      if (args, kwargs) not in f.arguments:
          # Because of the sematics of decorator composition if we just append
          # to the options list positional options will appear to be backwards.
          f.arguments.insert(0, (args, kwargs))
  
  
  def env(*vars, **kwargs):
      """
      returns the first environment variable set
      if none are non-empty, defaults to '' or keyword arg default
      """
      for v in vars:
          value = os.environ.get(v, None)
          if value:
              return value
      return kwargs.get('default', '')
  
  
  def import_class(import_str):
      """Returns a class from a string including module and class."""
      mod_str, _sep, class_str = import_str.rpartition('.')
      __import__(mod_str)
      return getattr(sys.modules[mod_str], class_str)
  
  
  def print_list(objs, fields, sortby=None):
      pt = prettytable.PrettyTable([f for f in fields], caching=False)
      pt.align = 'l'
  
      for o in objs:
          row = []
          for field in fields:
              row.append(o.get(field, None))
  #        for k, v in o.iteritems():
  #            row.append(k)
          pt.add_row(row)
  
      result = pt.get_string(sortby=sortby)
      print(result)
  
  
  def print_dict(d, dict_property="Property", dict_value="Value", wrap=0):
      pt = prettytable.PrettyTable([dict_property, dict_value], caching=False)
      pt.align = 'l'
      for k, v in sorted(d.items()):
          # if value has a newline, add in multiple rows
          # e.g. fault with stacktrace
          if v and isinstance(v, basestring) and r'\n' in v:
              lines = v.strip().split(r'\n')
              col1 = k
              for line in lines:
                  pt.add_row([col1, line])
                  col1 = ''
          else:
              if v is None:
                  v = '-'
              pt.add_row([k, v])
  
      result = pt.get_string()
  
      print(result)
  
subject: Add print_dict function