Files
edx-platform/scripts/eslint.py

74 lines
1.9 KiB
Python

""" # pylint: disable=django-not-configured
Check code quality using eslint.
"""
import re
import subprocess
import shlex
import sys
class BuildFailure(Exception):
pass
def fail_quality(message):
"""
Fail the specified quality check.
"""
raise BuildFailure(message)
def run_eslint():
"""
Runs eslint on static asset directories.
If limit option is passed, fails build if more violations than the limit are found.
"""
violations_limit = 1285
command = [
"node",
"--max_old_space_size=4096",
"node_modules/.bin/eslint",
"--ext", ".js",
"--ext", ".jsx",
"--format=compact",
"lms",
"cms",
"common",
"openedx",
"xmodule",
]
print("Running command:", shlex.join(command))
result = subprocess.run(
command,
text=True,
check=False,
capture_output=True
)
print(result.stdout)
last_line = result.stdout.strip().splitlines()[-1] if result.stdout.strip().splitlines() else ""
regex = r'^\d+'
try:
num_violations = int(re.search(regex, last_line).group(0)) if last_line else 0
# Fail if number of violations is greater than the limit
if num_violations > violations_limit:
fail_quality(
"FAILURE: Too many eslint violations ({count}).\nThe limit is {violations_limit}.".format(count=num_violations, violations_limit=violations_limit))
else:
print(f"successfully run eslint with '{num_violations}' violations")
# An AttributeError will occur if the regex finds no matches.
except (AttributeError, ValueError):
fail_quality(f"FAILURE: Number of eslint violations could not be found in '{last_line}'")
if __name__ == "__main__":
try:
run_eslint()
except BuildFailure as e:
print(e)
sys.exit(1)