solidity/scripts/pylint_all.py

58 lines
2.2 KiB
Python
Executable File

#! /usr/bin/env python3
"""
Performs pylint on all python files in the project repo's {test,script,docs} directory recursively.
This script is meant to be run from the CI but can also be easily in local dev environment,
where you can optionally pass `-d` as command line argument to let this script abort on first error.
"""
from os import path, walk, system
from sys import argv, exit as exitwith
PROJECT_ROOT = path.dirname(path.realpath(__file__))
PYLINT_RCFILE = "{}/pylintrc".format(PROJECT_ROOT)
SGR_INFO = "\033[1;32m"
SGR_CLEAR = "\033[0m"
def pylint_all_filenames(dev_mode, rootdirs):
""" Performs pylint on all python files within given root directory (recursively). """
filenames = []
for rootdir in rootdirs:
for rootpath, _, filenames_w in walk(rootdir):
for filename in filenames_w:
if filename.endswith('.py'):
filenames.append(path.join(rootpath, filename))
checked_count = 0
failed = []
for filename in filenames:
checked_count += 1
cmdline = "pylint --rcfile=\"{}\" \"{}\"".format(PYLINT_RCFILE, filename)
print("{}[{}/{}] Running pylint on file: {}{}".format(SGR_INFO, checked_count, len(filenames),
filename, SGR_CLEAR))
exit_code = system(cmdline)
if exit_code != 0:
if dev_mode:
return 1, checked_count
failed.append(filename)
return len(failed), len(filenames)
def main():
""" Collects all python script root dirs and runs pylint on them. You can optionally
pass `-d` as command line argument to let this script abort on first error. """
dev_mode = len(argv) == 2 and argv[1] == "-d"
failed_count, total_count = pylint_all_filenames(dev_mode, [
path.abspath(path.dirname(__file__) + "/../docs"),
path.abspath(path.dirname(__file__) + "/../scripts"),
path.abspath(path.dirname(__file__) + "/../test")])
if failed_count != 0:
exitwith("pylint failed on {}/{} files.".format(failed_count, total_count))
else:
print("Successfully tested {} files.".format(total_count))
if __name__ == "__main__":
main()