tools/automation/style/pylint_disable_check.py (51 lines of code) (raw):
# --------------------------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for license information.
# --------------------------------------------------------------------------------------------
# gather all the pylint disable statements
import os
import re
import itertools
import tabulate
from ..utilities.path import get_repo_root
def get_files(root):
for root, dirs, files in os.walk('src'):
for py_file in files:
if py_file.endswith('.py'):
yield os.path.join(root, py_file)
def get_rules(file_path):
rgx = re.compile('# pylint: disable=(\w|-|,|\s)+')
with open(file_path) as f:
for index, l in enumerate(f.readlines()):
if not l:
break
m = rgx.search(l)
if m:
rules = (r.strip() for r in m.group(0).strip().split('=')[1].split(','))
for r in rules:
yield r, index, file_path
def get_all_rules(root):
return itertools.chain.from_iterable(get_rules(f) for f in get_files('src'))
def group_by_rules(rules_iter):
sortiter = sorted(rules_iter, key=lambda each: each[0])
for k, g in itertools.groupby(sortiter, lambda each: each[0]):
group = list(g)
yield k, len(group)
def group_by_files(rules_iter):
sortiter = sorted(rules_iter, key=lambda each: each[2])
for k, g in itertools.groupby(sortiter, lambda each: each[2]):
group = list(g)
count = len(group)
with open(k, 'r') as f:
line_number = len(f.readlines())
yield k, count, line_number, int(line_number / count)
def main():
src_folder = os.path.join(get_repo_root(), 'src')
all_rules = [e for e in get_all_rules(src_folder)]
with open('pylint_report.txt', 'w') as f:
f.write('GROUP BY RULES\n')
f.writelines(tabulate.tabulate(sorted(group_by_rules(all_rules), key=lambda each: each[1], reverse=True),
headers=('rule', 'count')))
f.write('\n\nGROUP BY FILES\n')
f.writelines(tabulate.tabulate(sorted(group_by_files(all_rules), key=lambda each: each[1], reverse=True),
headers=('file', 'pylint count', 'total lines', 'every n line')))
with open('pylint_all_disables.csv', 'w') as f:
for r in all_rules:
f.write('{},{},{}\n'.format(*r))
if __name__ == '__main__':
main()