74 lines
1.9 KiB
Python
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)
|