Esempio n. 1
0
class Pyble(object):

  def __init__(self, row_token=None, column_token=None, 
              header_color='STRONG_YELLOW', header_background_color='BG_BLUE',
              cell_a_color='BLUE', cell_b_color='YELLOW',
              cell_a_background_color='BG_YELLOW', cell_b_background_color='BG_BLUE'):
  
    self.table        = list()
    self.header       = list()
    self.lines        = list()
    self.title        = None
    self.longest      = 0
    self.row_token    = '-'
    self.column_token = '|'

    self.c = Colors()
    self.c.set_header_color(header_color)
    self.c.set_header_background_color(header_background_color)
    self.c.set_cell_a_color(header_color)
    self.c.set_cell_b_color(header_color)
    self.c.set_cell_a_background_color(header_color)
    self.c.set_cell_b_background_color(header_color)
    self.c.set_cell_a_color(cell_a_color)
    self.c.set_cell_b_color(cell_b_color)
    self.c.set_cell_a_background_color(cell_a_background_color)
    self.c.set_cell_b_background_color(cell_b_background_color)

    self.color = False

    if row_token != None:
      self.row_token = row_token[0]

    if column_token != None:
      self.column_token = column_token[0]

  def __str__(self):
    return "<Pyble(columns_count='%s', rows_count='%s', color='%s')>" % (len(self.header),
                                                                         len(self.lines),
                                                                         self.color)
                   

  def get_color(self):
    return self.color

  def set_color(self, color):
    self.color = color

  def add_title(self, title):
    self.title = title

  def set_header(self, header, force=False):
    if len(self.header) != 0 and force:
      self.header = header
    if len(self.header) == 0:
      self.header = header
    else:
      raise HeaderAlreadySetNotForce

    if len(self.lines) == 0:
      self.header = header
    else:
      raise HeaderAlreadySet    

  def add_column(self, title):
    if len(self.lines) == 0:
      self.header.append(title) 
    else:
      raise HeaderAlreadySet

  def add_line(self, line):
    if len(line) == self.__get_columns_count():
      self.lines.append(line)
    else:
      raise IncorrectNumberOfCells

  def add_separator(self):
    empty = list()

    for i in range(len(self.header)):
      empty.append(i)

    empty[0] = '_SEPARATOR_'

    self.lines.append(empty)

  def __get_columns_count(self):
    return len(self.header)

  def __configure_length(self, old_header, old_lines):
    header = list()
    lines  = list()

    for cell in old_header:
      header.append( {'name': cell, 'len': len(cell)} )

    for line in old_lines:
      tmp_line = list()
      for cell in line:
        try:
          tmp_line.append( {'name': cell, 'len': len(cell)} )
        except TypeError:
          tmp_line.append( {'name': cell, 'len': len(str(cell))} )

      lines.append(tmp_line)

    return header, lines

  def __set_column_length(self, header, lines):
    for cellnumber in range(len(header)):
      for line in lines:
        if header[cellnumber]['len'] < line[cellnumber]['len']:
          header[cellnumber]['len'] = line[cellnumber]['len']

    for cellnumber in range(len(header)):
      for line in lines:
        line[cellnumber]['len'] = header[cellnumber]['len']        

    return header, lines

  def __show_dots(self, header):
    dots = 0
    for cell in header:
      dots += cell['len']

    dots = self.row_token * (dots + (3 * len(header)) + 1)

    print dots

  def __get_dots(self, header):
    dots = 0
    for cell in header:
      dots += cell['len']

    dots = self.row_token * (dots + (3 * len(header)) + 1)

    return dots

  def __show_title(self):
    line = "-" * (len(self.title) + 2)
    print " %s" % line
    print "/ %s \\" % self.title.upper()

  def __show_header(self, header):
    t = Terminal()
    header_as_string = self.column_token

    self.__show_dots(header)

    for cell in header:
      if self.color:
        header_as_string += " %s%s%s%s%s %s" % (self.c.get_header_background_color(), 
                                                self.c.get_header_color(), 
                                                cell['name'].upper(), 
                                                " " * (cell['len'] - len(cell['name'])), 
                                                self.c.ENDC, self.column_token)
      else:
        header_as_string += " %s%s %s" % (cell['name'].upper(), 
                                          " " * (cell['len'] - len(cell['name'])), 
                                          self.column_token)

    print header_as_string

    self.__show_dots(header)

  def __show_lines(self, lines, header, highlight=None):
    lines_as_string = ""
    t = Terminal()
    color = 0

    for line in lines:

      if line[0]['name'] == '_SEPARATOR_':
        #import pdb;pdb.set_trace()
        lines_as_string += "%s\n" % self.__get_dots(header)
        continue
      else:
        lines_as_string += self.column_token

      for cell in line:

        try:
          name = cell['name']
          if highlight in name:
            name = "%s" % t.bold_black_on_yellow(name)

          lines_as_string += " %s%s %s" % (name,
                                           " " * (cell['len'] - len(cell['name'])),
                                           self.column_token)
        except TypeError:
          if self.color:
            if color == 1:
              lines_as_string += " %s%s%s%s%s %s" % (self.c.get_cell_a_background_color(), 
                                                     self.c.get_cell_a_color(), 
                                                     name, 
                                                     " " * (cell['len'] - len(str(cell['name']))), 
                                                     self.c.ENDC, 
                                                     self.column_token)
            else:
              lines_as_string += " %s%s%s%s%s %s" % (self.c.get_cell_b_background_color(), 
                                                   self.c.get_cell_b_color(),
                                                   name,
                                                   " " * (cell['len'] - len(str(cell['name']))),
                                                   self.c.ENDC, 
                                                   self.column_token)
              
          else:
            lines_as_string += " %s%s %s" % (name, 
                                             " " * (cell['len'] - len(str(cell['name']))),
                                             self.column_token)

      if self.color:
        if color == 0:
          color = 1
        else:
          color = 0

      lines_as_string += "\n"

    print lines_as_string.strip("\n") 
    self.__show_dots(header)

  def get_table_as_json(self):
    header, lines = self.__configure_length(self.header, self.lines)
    header, lines = self.__set_column_length(header, lines)

    table = {}
    table['header'] = header
    table['rows'] = lines

    return json.dumps(table)

  def get_table_info(self):
    print "Table information"
    print "Columns count: %s" % len(self.header)
    print "Rows count: %s" % len(self.lines)

  def show_table(self, highlight=None):
    header, lines = self.__configure_length(self.header, self.lines)
    header, lines = self.__set_column_length(header, lines)

    if self.title is not None:
      self.__show_title()

    if len(header) != 0:
      self.__show_header(header)

    if len(lines) != 0:
      self.__show_lines(lines, header, highlight)