140 lines
4.2 KiB
Python
140 lines
4.2 KiB
Python
"""
|
|
Check code quality using pep8, pylint, and diff_quality.
|
|
"""
|
|
from paver.easy import sh, task, cmdopts, needs
|
|
import os
|
|
import errno
|
|
from .utils.envs import Env
|
|
|
|
@task
|
|
@needs('pavelib.prereqs.install_python_prereqs')
|
|
@cmdopts([
|
|
("system=", "s", "System to act on"),
|
|
("errors", "e", "Check for errors only"),
|
|
])
|
|
def run_pylint(options):
|
|
"""
|
|
Run pylint on system code
|
|
"""
|
|
errors = getattr(options, 'errors', False)
|
|
systems = getattr(options, 'system', 'lms,cms,common').split(',')
|
|
|
|
for system in systems:
|
|
# Directory to put the pylint report in.
|
|
# This makes the folder if it doesn't already exist.
|
|
report_dir = (Env.REPORT_DIR / system).makedirs_p()
|
|
|
|
flags = '-E' if errors else ''
|
|
|
|
apps = [system]
|
|
|
|
for directory in ['djangoapps', 'lib']:
|
|
dirs = os.listdir(os.path.join(system, directory))
|
|
apps.extend([d for d in dirs if os.path.isdir(os.path.join(system, directory, d))])
|
|
|
|
apps_list = ' '.join(apps)
|
|
|
|
pythonpath_prefix = (
|
|
"PYTHONPATH={system}:{system}/djangoapps:{system}/"
|
|
"lib:common/djangoapps:common/lib".format(
|
|
system=system
|
|
)
|
|
)
|
|
|
|
sh(
|
|
"{pythonpath_prefix} pylint {flags} -f parseable {apps} | "
|
|
"tee {report_dir}/pylint.report".format(
|
|
pythonpath_prefix=pythonpath_prefix,
|
|
flags=flags,
|
|
apps=apps_list,
|
|
report_dir=report_dir
|
|
)
|
|
)
|
|
|
|
|
|
@task
|
|
@needs('pavelib.prereqs.install_python_prereqs')
|
|
@cmdopts([
|
|
("system=", "s", "System to act on"),
|
|
])
|
|
def run_pep8(options):
|
|
"""
|
|
Run pep8 on system code
|
|
"""
|
|
systems = getattr(options, 'system', 'lms,cms,common').split(',')
|
|
|
|
for system in systems:
|
|
# Directory to put the pep8 report in.
|
|
# This makes the folder if it doesn't already exist.
|
|
report_dir = (Env.REPORT_DIR / system).makedirs_p()
|
|
|
|
sh('pep8 {system} | tee {report_dir}/pep8.report'.format(system=system, report_dir=report_dir))
|
|
|
|
|
|
@task
|
|
@needs('pavelib.prereqs.install_python_prereqs')
|
|
def run_quality():
|
|
"""
|
|
Build the html diff quality reports, and print the reports to the console.
|
|
"""
|
|
|
|
# Directory to put the diff reports in.
|
|
# This makes the folder if it doesn't already exist.
|
|
dquality_dir = (Env.REPORT_DIR / "diff_quality").makedirs_p()
|
|
|
|
# Generage diff-quality html report for pep8, and print to console
|
|
# If pep8 reports exist, use those
|
|
# Otherwise, `diff-quality` will call pep8 itself
|
|
|
|
pep8_files = []
|
|
for subdir, _dirs, files in os.walk(os.path.join(Env.REPORT_DIR)):
|
|
for f in files:
|
|
if f == "pep8.report":
|
|
pep8_files.append(os.path.join(subdir, f))
|
|
|
|
pep8_reports = u' '.join(pep8_files)
|
|
|
|
sh(
|
|
"diff-quality --violations=pep8 --html-report {dquality_dir}/"
|
|
"diff_quality_pep8.html {pep8_reports}".format(
|
|
dquality_dir=dquality_dir, pep8_reports=pep8_reports)
|
|
)
|
|
|
|
sh(
|
|
"diff-quality --violations=pep8 {pep8_reports}".format(
|
|
pep8_reports=pep8_reports)
|
|
)
|
|
|
|
# Generage diff-quality html report for pylint, and print to console
|
|
# If pylint reports exist, use those
|
|
# Otherwise, `diff-quality` will call pylint itself
|
|
|
|
pylint_files = []
|
|
for subdir, _dirs, files in os.walk(os.path.join(Env.REPORT_DIR)):
|
|
for f in files:
|
|
if f == "pylint.report":
|
|
pylint_files.append(os.path.join(subdir, f))
|
|
|
|
pylint_reports = u' '.join(pylint_files)
|
|
|
|
pythonpath_prefix = (
|
|
"PYTHONPATH=$PYTHONPATH:lms:lms/djangoapps:lms/lib:cms:cms/djangoapps:cms/lib:"
|
|
"common:common/djangoapps:common/lib"
|
|
)
|
|
|
|
sh(
|
|
"{pythonpath_prefix} diff-quality --violations=pylint --html-report "
|
|
"{dquality_dir}/diff_quality_pylint.html {pylint_reports}".format(
|
|
pythonpath_prefix=pythonpath_prefix,
|
|
dquality_dir=dquality_dir,
|
|
pylint_reports=pylint_reports
|
|
)
|
|
)
|
|
|
|
sh(
|
|
"{pythonpath_prefix} diff-quality --violations=pylint {pylint_reports}".format(
|
|
pythonpath_prefix=pythonpath_prefix,
|
|
pylint_reports=pylint_reports
|
|
)
|
|
)
|