mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			102 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			102 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
| #! /usr/bin/env python3
 | |
| 
 | |
| """
 | |
| Runs pylint on all Python files in project directories known to contain Python scripts.
 | |
| """
 | |
| 
 | |
| from argparse import ArgumentParser
 | |
| from os import path, walk
 | |
| from textwrap import dedent
 | |
| import subprocess
 | |
| import sys
 | |
| 
 | |
| PROJECT_ROOT = path.dirname(path.dirname(path.realpath(__file__)))
 | |
| PYLINT_RCFILE = f"{PROJECT_ROOT}/scripts/pylintrc"
 | |
| 
 | |
| 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).  """
 | |
| 
 | |
|     BARE_COMMAND = [
 | |
|         "pylint",
 | |
|         f"--rcfile={PYLINT_RCFILE}",
 | |
|         "--output-format=colorized",
 | |
|         "--score=n"
 | |
|     ]
 | |
| 
 | |
|     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))
 | |
| 
 | |
|     if not dev_mode:
 | |
|         # NOTE: We could just give pylint the directories and it would find the files on its
 | |
|         # own but it would treat them as packages, which would result in lots of import errors.
 | |
|         command_line = BARE_COMMAND + filenames
 | |
|         return subprocess.run(command_line, check=False).returncode == 0
 | |
| 
 | |
|     for i, filename in enumerate(filenames):
 | |
|         command_line = BARE_COMMAND + [filename]
 | |
|         print(
 | |
|             f"{SGR_INFO}"
 | |
|             f"[{i + 1}/{len(filenames)}] "
 | |
|             f"Running pylint on file: {filename}{SGR_CLEAR}"
 | |
|         )
 | |
| 
 | |
|         process = subprocess.run(command_line, check=False)
 | |
| 
 | |
|         if process.returncode != 0:
 | |
|             return False
 | |
| 
 | |
|     print()
 | |
|     return True
 | |
| 
 | |
| 
 | |
| def parse_command_line():
 | |
|     script_description = dedent("""
 | |
|         Runs pylint on all Python files in project directories known to contain Python scripts.
 | |
| 
 | |
|         This script is meant to be run from the CI but can also be easily used in the local dev
 | |
|         environment.
 | |
|     """)
 | |
| 
 | |
|     parser = ArgumentParser(description=script_description)
 | |
|     parser.add_argument(
 | |
|         '-d', '--dev-mode',
 | |
|         dest='dev_mode',
 | |
|         default=False,
 | |
|         action='store_true',
 | |
|         help=(
 | |
|             "Abort on first error. "
 | |
|             "In this mode every script is passed to pylint separately. "
 | |
|         )
 | |
|     )
 | |
|     return parser.parse_args()
 | |
| 
 | |
| 
 | |
| def main():
 | |
|     options = parse_command_line()
 | |
| 
 | |
|     rootdirs = [
 | |
|         f"{PROJECT_ROOT}/docs",
 | |
|         f"{PROJECT_ROOT}/scripts",
 | |
|         f"{PROJECT_ROOT}/test",
 | |
|     ]
 | |
|     success = pylint_all_filenames(options.dev_mode, rootdirs)
 | |
| 
 | |
|     if not success:
 | |
|         sys.exit(1)
 | |
|     else:
 | |
|         print("No problems found.")
 | |
| 
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|     try:
 | |
|         main()
 | |
|     except KeyboardInterrupt:
 | |
|         sys.exit("Interrupted by user. Exiting.")
 |