mirror of
https://github.com/servo/servo.git
synced 2025-07-23 07:13:52 +01:00
Add a generic LintRunner object for running custom lints
This commit is contained in:
parent
f214765b61
commit
b5cff9db8f
1 changed files with 49 additions and 0 deletions
|
@ -9,6 +9,7 @@
|
||||||
|
|
||||||
import contextlib
|
import contextlib
|
||||||
import fnmatch
|
import fnmatch
|
||||||
|
import imp
|
||||||
import itertools
|
import itertools
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
|
@ -911,6 +912,54 @@ def check_dep_license_errors(filenames, progress=True):
|
||||||
yield (filename, 0, "dependency should contain a valid license.")
|
yield (filename, 0, "dependency should contain a valid license.")
|
||||||
|
|
||||||
|
|
||||||
|
class LintRunner(object):
|
||||||
|
def __init__(self, lint_path=None, only_changed_files=True, exclude_dirs=[], progress=True):
|
||||||
|
self.only_changed_files = only_changed_files
|
||||||
|
self.exclude_dirs = exclude_dirs
|
||||||
|
self.progress = progress
|
||||||
|
self.path = lint_path
|
||||||
|
|
||||||
|
def check(self):
|
||||||
|
if not os.path.exists(self.path):
|
||||||
|
yield (self.path, 0, "file does not exist")
|
||||||
|
return
|
||||||
|
if not self.path.endswith('.py'):
|
||||||
|
yield (self.path, 0, "lint should be a python script")
|
||||||
|
return
|
||||||
|
dir_name, filename = os.path.split(self.path)
|
||||||
|
sys.path.append(dir_name)
|
||||||
|
module = imp.load_source(filename[:-3], self.path)
|
||||||
|
if hasattr(module, 'Lint'):
|
||||||
|
if issubclass(module.Lint, LintRunner):
|
||||||
|
lint = module.Lint(self.path, self.only_changed_files, self.exclude_dirs, self.progress)
|
||||||
|
for error in lint.run():
|
||||||
|
if not hasattr(error, '__iter__'):
|
||||||
|
yield (self.path, 1, "errors should be a tuple of (path, line, reason)")
|
||||||
|
return
|
||||||
|
yield error
|
||||||
|
else:
|
||||||
|
yield (self.path, 1, "class 'Lint' should inherit from 'LintRunner'")
|
||||||
|
else:
|
||||||
|
yield (self.path, 1, "script should contain a class named 'Lint'")
|
||||||
|
sys.path.remove(dir_name)
|
||||||
|
|
||||||
|
def get_files(self, path, **kwargs):
|
||||||
|
args = ['only_changed_files', 'exclude_dirs', 'progress']
|
||||||
|
kwargs = {k: kwargs.get(k, getattr(self, k)) for k in args}
|
||||||
|
return FileList(path, **kwargs)
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
yield (self.path, 0, "class 'Lint' should implement 'run' method")
|
||||||
|
|
||||||
|
|
||||||
|
def run_lint_scripts(only_changed_files=False, progress=True):
|
||||||
|
runner = LintRunner(only_changed_files=only_changed_files, progress=progress)
|
||||||
|
for path in config['lint-scripts']:
|
||||||
|
runner.path = path
|
||||||
|
for error in runner.check():
|
||||||
|
yield error
|
||||||
|
|
||||||
|
|
||||||
def scan(only_changed_files=False, progress=True):
|
def scan(only_changed_files=False, progress=True):
|
||||||
# check config file for errors
|
# check config file for errors
|
||||||
config_errors = check_config_file(CONFIG_FILE_PATH)
|
config_errors = check_config_file(CONFIG_FILE_PATH)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue