#!/usr/bin/env python
# -*- coding: utf-8 -*-

#
# Copyright 2015, NICTA
#
# This software may be distributed and modified according to the terms of
# the BSD 2-Clause license. Note that NO WARRANTY is provided.
# See "LICENSE_BSD2.txt" for details.
#
# @TAG(NICTA_BSD)
#

from __future__ import absolute_import, division, print_function, \
    unicode_literals

import os, pylint, re, sys, unittest
from pylint import epylint

ME = os.path.abspath(__file__)

# Make CAmkES importable
sys.path.append(os.path.join(os.path.dirname(ME), '../../..'))

from camkes.internal.tests.utils import CAmkESTest

class TestLint(CAmkESTest):
    pass

def lint(self, path):
    stdout, stderr = epylint.py_run('%s --errors-only' % path, return_std=True)
    err = []
    for line in [x.strip() for x in stdout] + [x.strip() for x in stderr]:
        if line == 'No config file found, using default configuration':
            continue
        if line:
            err.append(line)
    if len(err) > 0:
        self.fail('\n'.join(err))

srcdir = os.path.join(os.path.dirname(ME), '..')
regex = re.compile(r'.*\.py$')
sub = re.compile(r'[^\w]')
for src in os.listdir(srcdir):
    if regex.match(src) is None:
        continue
    path = os.path.abspath(os.path.join(srcdir, src))
    name = 'test_%s' % sub.sub('_', src)
    setattr(TestLint, name, lambda self, path=path: lint(self, path))

if __name__ == '__main__':
    unittest.main()
