#!/usr/bin/env python3 # Copyright 2019 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Wrapper to run linters and pytest with the right settings.""" import functools import os import subprocess import sys from typing import List import pytest ROOT_DIR = os.path.dirname(os.path.realpath(__file__)) @functools.lru_cache() def is_ci() -> bool: """Whether we're running in our CI system.""" return os.getenv("LUCI_CQ") == "yes" def run_pytest(argv: List[str]) -> int: """Returns the exit code from pytest.""" if is_ci(): argv = ["-m", "not skip_cq"] + argv return pytest.main(argv) def run_black(): """Returns the exit code from black.""" # Black by default only matches .py files. We have to list standalone # scripts manually. extra_programs = [ "repo", "run_tests", "release/update-hooks", "release/update-manpages", ] return subprocess.run( [sys.executable, "-m", "black", "--check", ROOT_DIR] + extra_programs, check=False, ).returncode def run_flake8(): """Returns the exit code from flake8.""" return subprocess.run( [sys.executable, "-m", "flake8", ROOT_DIR], check=False ).returncode def run_isort(): """Returns the exit code from isort.""" return subprocess.run( [sys.executable, "-m", "isort", "--check", ROOT_DIR], check=False ).returncode def main(argv): """The main entry.""" checks = ( functools.partial(run_pytest, argv), run_black, run_flake8, run_isort, ) # Run all the tests all the time to get full feedback. Don't exit on the # first error as that makes it more difficult to iterate in the CQ. return 1 if sum(c() for c in checks) else 0 if __name__ == "__main__": sys.exit(main(sys.argv[1:]))