From e97fdd5ba8cf25da84d4730e71afbcaa2884e144 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Dec 19 2019 12:39:47 +0000 Subject: Add a test for the coding style we want to follow on pagure-dist-git Signed-off-by: Pierre-Yves Chibon --- diff --git a/pagure_distgit_tests/tests_style.py b/pagure_distgit_tests/tests_style.py new file mode 100644 index 0000000..c2f4b9a --- /dev/null +++ b/pagure_distgit_tests/tests_style.py @@ -0,0 +1,109 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" + (c) 2019 - Copyright Red Hat Inc + + Authors: + Pierre-Yves Chibon + +Tests for flake8 and black compliance of the code + +""" + +from __future__ import unicode_literals, absolute_import + +import os +import subprocess +import sys +import unittest + +import six + +REPO_PATH = os.path.abspath( + os.path.join(os.path.dirname(__file__), "..", "pagure_distgit") +) +TESTS_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__))) + + +class TestStyle(unittest.TestCase): + """This test class contains tests pertaining to code style.""" + + def test_code_with_flake8(self): + """Enforce PEP-8 compliance on the codebase. + + This test runs flake8 on the code, and will fail if it returns a + non-zero exit code. + """ + # We ignore E712, which disallows non-identity comparisons with True and False + # We ignore W503, which disallows line break before binary operator + flake8_command = [ + sys.executable, + "-m", + "flake8", + "--ignore=E712,W503,E203", + REPO_PATH, + ] + + # check if we have an old flake8 or not + import flake8 + + flake8_v = flake8.__version__.split(".") + for idx, val in enumerate(flake8_v): + try: + val = int(val) + except ValueError: + pass + flake8_v[idx] = val + old_flake = tuple(flake8_v) < (3, 0) + + if old_flake: + raise unittest.SkipTest("Flake8 version too old to be useful") + + proc = subprocess.Popen( + flake8_command, stdout=subprocess.PIPE, cwd=REPO_PATH + ) + print(proc.communicate()) + + self.assertEqual(proc.returncode, 0) + + @unittest.skipIf( + not (six.PY3 and sys.version_info.minor >= 6), + "Black is only available in python 3.6+", + ) + def test_code_with_black(self): + """Enforce black compliance on the codebase. + + This test runs black on the code, and will fail if it returns a + non-zero exit code. + """ + black_command = [ + sys.executable, + "-m", + "black", + "-l", + "79", + "--check", + "--exclude", + '"/(\.eggs|\.git|\.hg|\.mypy_cache|\.nox|\.tox|\.venv|' + '_build|buck-out|build|dist)/"', # noqa + REPO_PATH, + TESTS_PATH, + ] + proc = subprocess.Popen( + black_command, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + cwd=REPO_PATH, + ) + stdout, stderr = proc.communicate() + print("stdout: ") + print(stdout.decode("utf-8")) + print("stderr: ") + print(stderr.decode("utf-8")) + + self.assertEqual(proc.returncode, 0) + + +if __name__ == "__main__": + unittest.main(verbosity=2)