#!/usr/bin/python
#
# Common lint functions applicable to multiple types of files.

import re

def VerifyLineLength(filename, lines, max_length):
  """Checks to make sure the file has no lines with lines exceeding the length
  limit.

  Args:
    filename: the file under consideration as string
    lines: contents of the file as string array
    max_length: maximum acceptable line length as number

  Returns:
    A list of tuples with format [(filename, line number, msg), ...] with any
    violations found.
  """
  lint = []
  line_num = 1
  for line in lines:
    length = len(line.rstrip('\n'))
    if length > max_length:
      lint.append((filename, line_num,
                   'Line exceeds %d chars (%d)' % (max_length, length)))
    line_num += 1
  return lint

def VerifyTabs(filename, lines):
  """Checks to make sure the file has no tab characters.

  Args:
    filename: the file under consideration as string
    lines: contents of the file as string array

  Returns:
    A list of tuples with format [(line_number, msg), ...] with any violations
    found.
  """
  lint = []
  tab_re = re.compile(r'\t')
  line_num = 1
  for line in lines:
    if tab_re.match(line.rstrip('\n')):
      lint.append((filename, line_num, 'Tab found instead of whitespace'))
    line_num += 1
  return lint


def VerifyTrailingWhitespace(filename, lines):
  """Checks to make sure the file has no lines with trailing whitespace.

  Args:
    filename: the file under consideration as string
    lines: contents of the file as string array

  Returns:
    A list of tuples with format [(filename, line number, msg), ...] with any
    violations found.
  """
  lint = []
  trailing_whitespace_re = re.compile(r'\s+$')
  line_num = 1
  for line in lines:
    if trailing_whitespace_re.match(line.rstrip('\n')):
      lint.append((filename, line_num, 'Trailing whitespace'))
    line_num += 1
  return lint


class BaseLint:
  def RunOnFile(filename, lines):
    raise Exception('RunOnFile() unimplemented')


def RunLintOverAllFiles(linter, filenames):
  """Runs linter over the contents of all files.

  Args:
    lint: subclass of BaseLint, implementing RunOnFile()
    filenames: list of all files whose contents will be linted

  Returns:
    A list of tuples with format [(filename, line number, msg), ...] with any
    violations found.
  """
  lint = []
  for filename in filenames:
    file = open(filename, 'r')
    if not file:
      print 'Cound not open %s' % filename
      continue
    lines = file.readlines()
    lint.extend(linter.RunOnFile(filename, lines))

  return lint
