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()
|