from glob import glob as gl
import sys
from pathlib import Path
from termcolor import colored
import os

files = gl(str(Path(sys.argv[1]) / "**/*"), recursive=True)
print(files)
numfiles = len(files)
numfailed = 0

for fil in files:
    if not os.path.isfile(fil):
        continue
    with open(fil, 'r') as f:
        print(fil)
        failed = False
        for line in f.readlines():
            if line.strip() == '':
                pass
            elif line.startswith('Circuit: '):
                pass
            elif line.startswith('Note: No ".plot", ".print", or ".fourier" lines; no simulations run'):
                pass
            elif line.startswith('Scale set'):
                pass
            elif 'fatal' in line.lower() or 'error' in line.lower():
                print(colored(line, 'red'))
                failed = True
            else:
                print(colored(line, 'yellow'))
                failed = True
        if failed:
            numfailed += 1

print("{} out of {} failed:  {}".format(numfailed, numfiles, (numfiles - numfailed) / numfiles))
