URL: https://github.com/freeipa/freeipa/pull/593 Author: tiran Title: #593: Add make patchcheck for developers Action: synchronized
To pull the PR as Git branch: git remote add ghfreeipa https://github.com/freeipa/freeipa git fetch ghfreeipa pull/593/head:pr593 git checkout pr593
From 3c67b4314fb4a4dbe521d612862cc8937cebc4a7 Mon Sep 17 00:00:00 2001 From: Christian Heimes <chei...@redhat.com> Date: Wed, 15 Mar 2017 08:31:38 +0100 Subject: [PATCH] Add make patchcheck for developers Ticket 6604 makes pylint and jsl optional dependencies. The change is controversal, because some developers prefer that pylint and jsl should be required unless explicitly disabled. `make patchcheck` is my answer to address the concerns. It's a superior solution to `make lint` as pre-commit check. It combines several additional checks under a single, easy rememberable and convenient make target: * build all * acilint, apiclient, jslint, polint * make check * pylint under Python 2 and 3 * subset of unit test suite https://fedorahosted.org/freeipa/ticket/6604 Signed-off-by: Christian Heimes <chei...@redhat.com> --- Makefile.am | 31 ++++++++++++++++++++++++++++++- configure.ac | 12 ++++++++++++ ipatests/util.py | 28 ++++++++++++++-------------- 3 files changed, 56 insertions(+), 15 deletions(-) diff --git a/Makefile.am b/Makefile.am index df4e05a..024ea4c 100644 --- a/Makefile.am +++ b/Makefile.am @@ -146,6 +146,35 @@ JSLINT_TARGET = jslint endif WITH_JSLINT lint: acilint apilint $(POLINT_TARGET) $(PYLINT_TARGET) $(JSLINT_TARGET) +.PHONY: patchcheck +patchcheck: all +if ! WITH_POLINT + @echo "ERROR: polint not available"; exit 1 +endif +if ! WITH_PYLINT + @echo "ERROR: pylint not available"; exit 1 +endif +if ! WITH_JSLINT + @echo "ERROR: jslint not available"; exit 1 +endif +if ! WITH_PYTHON2 + @echo "ERROR: python2 not available"; exit 1 +endif + @ # run all linters, tests, and check with Python 2 + PYTHONPATH=$(top_srcdir) $(PYTHON2) ipatests/ipa-run-tests \ + --ipaclient-unittests + $(MAKE) $(AM_MAKEFLAGS) acilint apilint polint jslint check + $(MAKE) $(AM_MAKEFLAGS) PYTHON=$(PYTHON2) pylint +if WITH_PYTHON3 + @ # just tests and pylint on Python 3 + PYTHONPATH=$(top_srcdir) $(PYTHON3) ipatests/ipa-run-tests \ + --ipaclient-unittests + $(MAKE) $(AM_MAKEFLAGS) PYTHON=$(PYTHON3) pylint +else + @echo "WARNING: python3 not available" +endif + @echo "All tests passed." + .PHONY: $(top_builddir)/ipapython/version.py $(top_builddir)/ipapython/version.py: (cd $(top_builddir)/ipapython && make version.py) @@ -182,7 +211,7 @@ pylint: $(top_builddir)/ipapython/version.py ipasetup.py -name '*~' -o \ -name '*.py' -print -o \ -type f -exec grep -qsm1 '^#!.*\bpython' '{}' \; -print`; \ - echo "Pylint is running, please wait ..."; \ + echo "Pylint on $(PYTHON) is running, please wait ..."; \ PYTHONPATH=$(top_srcdir) $(PYTHON) -m pylint \ --rcfile=$(top_srcdir)/pylintrc \ --load-plugins pylint_plugins \ diff --git a/configure.ac b/configure.ac index 2d84426..b1a0c28 100644 --- a/configure.ac +++ b/configure.ac @@ -111,6 +111,18 @@ if test "x$PYTHON" = "x" ; then fi dnl --------------------------------------------------------------------------- +dnl - Check for Python 2/3 for patchcheck +dnl --------------------------------------------------------------------------- + +AC_PATH_PROG(PYTHON2, python2) +AC_SUBST([PYTHON2]) +AM_CONDITIONAL([WITH_PYTHON2], [test "x${PYTHON2}" != "x"]) + +AC_PATH_PROG(PYTHON3, python3) +AC_SUBST([PYTHON3]) +AM_CONDITIONAL([WITH_PYTHON3], [test "x${PYTHON3}" != "x"]) + +dnl --------------------------------------------------------------------------- dnl - Check for cmocka unit test framework http://cmocka.cryptomilk.org/ dnl --------------------------------------------------------------------------- PKG_CHECK_EXISTS(cmocka, diff --git a/ipatests/util.py b/ipatests/util.py index 4379c30..0e7d2b8 100644 --- a/ipatests/util.py +++ b/ipatests/util.py @@ -178,9 +178,9 @@ class Fuzzy(object): Use of a regular expression by default implies the ``unicode`` type, so comparing with an ``str`` instance will evaluate to ``False``: - >>> phone.type - <type 'unicode'> - >>> '123-456-7890' == phone + >>> phone.type is six.text_type + True + >>> b'123-456-7890' == phone False The *type* kwarg allows you to specify a type constraint, so you can force @@ -220,15 +220,15 @@ class Fuzzy(object): >>> fuzzy = Fuzzy('.+', type=str, test=lambda other: True) >>> fuzzy.regex '.+' - >>> fuzzy.type - <type 'str'> + >>> fuzzy.type is str + True >>> fuzzy.test # doctest:+ELLIPSIS <function <lambda> at 0x...> To aid debugging, `Fuzzy.__repr__()` reveals these kwargs as well: >>> fuzzy # doctest:+ELLIPSIS - Fuzzy('.+', <type 'str'>, <function <lambda> at 0x...>) + Fuzzy('.+', <... 'str'>, <function <lambda> at 0x...>) """ def __init__(self, regex=None, type=None, test=None): @@ -328,20 +328,20 @@ def assert_deepequal(expected, got, doc='', stack=tuple()): If the tests fails, it will raise an ``AssertionError`` with detailed information, including the path to the offending value. For example: - >>> expected = [u'Hello', dict(world=u'how are you?')] - >>> got = [u'Hello', dict(world='how are you?')] + >>> expected = [u'Hello', dict(world=1)] + >>> got = [u'Hello', dict(world=1.0)] >>> expected == got True - >>> assert_deepequal(expected, got, doc='Testing my nested data') + >>> assert_deepequal(expected, got, doc='Testing my nested data') # doctest:+ELLIPSIS Traceback (most recent call last): ... AssertionError: assert_deepequal: type(expected) is not type(got). Testing my nested data - type(expected) = <type 'unicode'> - type(got) = <type 'str'> - expected = u'how are you?' - got = 'how are you?' - path = (0, 'world') + type(expected) = <... 'int'> + type(got) = <... 'float'> + expected = 1 + got = 1.0 + path = (..., 'world') Note that lists and tuples are considered equivalent, and the order of their elements does not matter.
-- Manage your subscription for the Freeipa-devel mailing list: https://www.redhat.com/mailman/listinfo/freeipa-devel Contribute to FreeIPA: http://www.freeipa.org/page/Contribute/Code