summaryrefslogtreecommitdiff
path: root/test-definitions-ci.py
blob: 23a0efaff95360496a39bf5fac4f62067503cae8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#!/usr/bin/python
import sys
import os
import subprocess
import traceback
import yaml

run_pep8 = False
try:
    import pep8
    run_pep8 = True
except:
    print "PEP8 is not available"


def print_stderr(message):
    sys.stderr.write(message)
    sys.stderr.write("\n")


def publish_result(result_message_list):
    result_message = '\n'.join(result_message_list)
    f = open('build-error.txt', 'a')
    f.write("\n\n")
    f.write(result_message)
    f.write("\n\n")
    f.close()
    print_stderr(result_message)


def pep8_check(filepath, ignore_options=None):
    _fmt = "%(row)d:%(col)d: %(code)s %(text)s"
    options = {
        'ignore': ignore_options,
        "show_source": True}
    pep8_checker = pep8.StyleGuide(options)
    fchecker = pep8_checker.checker_class(
        filepath,
        options=pep8_checker.options)
    fchecker.check_all()
    if fchecker.report.file_errors > 0:
        result_message_list = []
        result_message_list.append("* PEP8: [WARNING]: " + filepath)
        fchecker.report.print_statistics()
        for line_number, offset, code, text, doc in fchecker.report._deferred_print:
            result_message_list.append(
                _fmt % {
                    'path': filepath,
                    'row': fchecker.report.line_offset + line_number,
                    'col': offset + 1,
                    'code': code, 'text': text,
                })
        publish_result(result_message_list)


def validate_yaml(filename):
    with open(filename, "r") as f:
        try:
            y = yaml.load(f.read())
            message = "* YAMLVALID: [PASSED]: " + filename
            print_stderr(message)
        except:
            message = "* YAMLVALID: [FAILED]: " + filename
            result_message_list = []
            result_message_list.append(message)
            result_message_list.append("\n\n")
            exc_type, exc_value, exc_traceback = sys.exc_info()
            for line in traceback.format_exception_only(exc_type, exc_value):
                result_message_list.append(' ' + line)
            publish_result(result_message_list)
            exit(1)


def validate_shell(filename):
    cmd = './checkbashisms %s 2>&1' % filename
    try:
        output = subprocess.check_output(cmd, shell=True)
        message = '* CHECKBASHISMS: [PASSED]: %s' % filename
        print_stderr(message)
    except subprocess.CalledProcessError as e:
        result_message_list = []
        result_message_list.append('* CHECKBASHISMS: [FAILED]: %s' % filename)
        result_message_list.append('* CHECKBASHISMS: [OUTPUT]:')
        for line in e.output.splitlines():
            result_message_list.append(' ' + line)
        publish_result(result_message_list)
        exit(1)


def run_unit_tests(ignore_options):
    for root, dirs, files in os.walk('.'):
        if not root.startswith("./.git"):
            for name in files:
                if name.endswith("yaml"):
                    validate_yaml(root + "/" + name)
                if run_pep8 and name.endswith("py"):
                    pep8_check(root + "/" + name, ignore_options)
                # disable checkbashisms for now
                #if name.endswith("sh"):
                #    validate_shell(root + "/" + name)


def main(ignore_options=None):
    run_unit_tests(ignore_options)
    exit(0)


if __name__ == '__main__':
    if len(sys.argv) > 1:
        main(sys.argv[1])
    else:
        main()