From 083b5dcd6937987ac23e8316c36e793ce78eec47 Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Fri, 24 Jul 2015 22:42:29 +0200 Subject: travis-ci: Use container-based infrastructure The new travis infrastructure is container-based and does not allow the use of sudo, but travis allows to install whitelisted apt packages (http://docs.travis-ci.com/user/migrating-from-legacy/). --- testsuite/install.sh | 6 ------ 1 file changed, 6 deletions(-) (limited to 'testsuite') diff --git a/testsuite/install.sh b/testsuite/install.sh index 4d8778ad7..6f182bc0a 100755 --- a/testsuite/install.sh +++ b/testsuite/install.sh @@ -2,9 +2,6 @@ # install script for Travis-CI -sudo apt-get update -qq -sudo apt-get install swig libxml2-utils - pip install -r testsuite/requirements.txt PYVER=$(python -c 'import sys;print(".".join(str(v) for v in sys.version_info[0:2]))') @@ -14,9 +11,6 @@ if [[ ${PYVER:0:1} == "2" && $PYVER != "2.7" ]]; then fi if [[ "$WITH_OPTIONAL_DEPS" == "yes" ]]; then - sudo apt-get install -y yum libaugeas0 augeas-lenses libacl1-dev libssl-dev \ - python-gamin python-selinux - pip install PyYAML pyinotify boto pylibacl Jinja2 mercurial guppy cherrypy python-augeas if [[ ${PYVER:0:1} == "2" ]]; then -- cgit v1.2.3-1-g7c22 From c5529d8979672d4cf92d4ba54ce01256ca1d0842 Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Wed, 20 Jul 2016 21:47:17 +0200 Subject: travis-ci: Cache common xml schema files --- testsuite/Testschema/test_schema.py | 11 ++++++++--- testsuite/install.sh | 20 ++++++++++++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) (limited to 'testsuite') diff --git a/testsuite/Testschema/test_schema.py b/testsuite/Testschema/test_schema.py index cd9b74cdf..138468a91 100644 --- a/testsuite/Testschema/test_schema.py +++ b/testsuite/Testschema/test_schema.py @@ -34,13 +34,18 @@ NSMAP = dict(xs=XS) class TestSchemas(Bcfg2TestCase): schema_url = "http://www.w3.org/2001/XMLSchema.xsd" + catalog_file = os.path.expanduser("~/.cache/xml/catalog.xml") @skipUnless(HAS_XMLLINT, "xmllint not installed") def test_valid(self): + env = os.environ.copy() + if os.path.exists(self.catalog_file): + print('Using cached schema files.') + env["SGML_CATALOG_FILES"] = self.catalog_file schemas = [s for s in glob.glob(os.path.join(srcpath, '*.xsd'))] - xmllint = Popen(['xmllint', '--xinclude', '--noout', '--schema', - self.schema_url] + schemas, - stdout=PIPE, stderr=STDOUT) + xmllint = Popen(['xmllint', '--xinclude', '--noout', '--catalogs', + '--schema', self.schema_url] + schemas, + stdout=PIPE, stderr=STDOUT, env=env) print(xmllint.communicate()[0].decode()) self.assertEqual(xmllint.wait(), 0) diff --git a/testsuite/install.sh b/testsuite/install.sh index 6f182bc0a..1c9cc36b9 100755 --- a/testsuite/install.sh +++ b/testsuite/install.sh @@ -23,3 +23,23 @@ if [[ "$WITH_OPTIONAL_DEPS" == "yes" ]]; then fi fi fi + +# Setup the local xml schema cache +download_schema() { + if [[ ! -e "$1" ]]; then + wget -O "$1" "$2" + fi +} + +mkdir -p "$HOME/.cache/xml/" +download_schema "$HOME/.cache/xml/XMLSchema.xsd" "http://www.w3.org/2001/XMLSchema.xsd" +download_schema "$HOME/.cache/xml/xml.xsd" "http://www.w3.org/2001/xml.xsd" + +cat > "$HOME/.cache/xml/catalog.xml" < + + + + + +EOF -- cgit v1.2.3-1-g7c22 From 4f3cb4335c6d934c34d851efa587c525e6fcd876 Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Thu, 23 Mar 2017 20:19:34 +0100 Subject: travis-ci: Cache wheels for python deps The python dependencies are only build once to create the wheel and cached using the travis-ci infrastructure. All builds afterwards will be faster because the cached version is used. --- testsuite/install.sh | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) (limited to 'testsuite') diff --git a/testsuite/install.sh b/testsuite/install.sh index 1c9cc36b9..eb569ec56 100755 --- a/testsuite/install.sh +++ b/testsuite/install.sh @@ -1,25 +1,31 @@ #!/bin/bash -ex # install script for Travis-CI +pip install --upgrade pip -pip install -r testsuite/requirements.txt +pip_wheel() { + pip wheel --find-links="$HOME/.cache/wheels/" --wheel-dir="$HOME/.cache/wheels/" "$@" + pip install --no-index --find-links="$HOME/.cache/wheels/" "$@" +} + +pip_wheel -r testsuite/requirements.txt PYVER=$(python -c 'import sys;print(".".join(str(v) for v in sys.version_info[0:2]))') if [[ ${PYVER:0:1} == "2" && $PYVER != "2.7" ]]; then - pip install unittest2 + pip_wheel unittest2 fi if [[ "$WITH_OPTIONAL_DEPS" == "yes" ]]; then - pip install PyYAML pyinotify boto pylibacl Jinja2 mercurial guppy cherrypy python-augeas + pip_wheel PyYAML pyinotify boto pylibacl Jinja2 mercurial guppy cherrypy python-augeas if [[ ${PYVER:0:1} == "2" ]]; then - pip install cheetah m2crypto + pip_wheel cheetah m2crypto if [[ $PYVER != "2.7" ]]; then - pip install 'django<1.7' 'South<0.8' + pip_wheel 'django<1.7' 'South<0.8' else - pip install django + pip_wheel django fi fi fi -- cgit v1.2.3-1-g7c22 From d5f24fed13339d01424c4f7748c239ae33e0b606 Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Sat, 25 Jul 2015 01:32:05 +0200 Subject: travis-ci: Also run tests with python2.4 and python2.5 --- testsuite/install.sh | 44 +++++++++++++++++++++------------------ testsuite/prepare-python.sh | 8 +++++++ testsuite/requirements-legacy.txt | 13 ++++++++++++ 3 files changed, 45 insertions(+), 20 deletions(-) create mode 100755 testsuite/prepare-python.sh create mode 100644 testsuite/requirements-legacy.txt (limited to 'testsuite') diff --git a/testsuite/install.sh b/testsuite/install.sh index eb569ec56..13a2e9d01 100755 --- a/testsuite/install.sh +++ b/testsuite/install.sh @@ -1,31 +1,35 @@ #!/bin/bash -ex # install script for Travis-CI -pip install --upgrade pip - -pip_wheel() { - pip wheel --find-links="$HOME/.cache/wheels/" --wheel-dir="$HOME/.cache/wheels/" "$@" - pip install --no-index --find-links="$HOME/.cache/wheels/" "$@" -} - -pip_wheel -r testsuite/requirements.txt - PYVER=$(python -c 'import sys;print(".".join(str(v) for v in sys.version_info[0:2]))') -if [[ ${PYVER:0:1} == "2" && $PYVER != "2.7" ]]; then - pip_wheel unittest2 -fi +if [[ ${PYVER:0:1} == "2" && $PYVER != "2.7" && $PYVER != "2.6" ]]; then + pip install -r testsuite/requirements-legacy.txt +else + pip install --upgrade pip + + pip_wheel() { + pip wheel --find-links="$HOME/.cache/wheels/" --wheel-dir="$HOME/.cache/wheels/" "$@" + pip install --no-index --find-links="$HOME/.cache/wheels/" "$@" + } -if [[ "$WITH_OPTIONAL_DEPS" == "yes" ]]; then - pip_wheel PyYAML pyinotify boto pylibacl Jinja2 mercurial guppy cherrypy python-augeas + pip_wheel -r testsuite/requirements.txt - if [[ ${PYVER:0:1} == "2" ]]; then - pip_wheel cheetah m2crypto + if [[ $PYVER == "2.6" ]]; then + pip_wheel unittest2 + fi - if [[ $PYVER != "2.7" ]]; then - pip_wheel 'django<1.7' 'South<0.8' - else - pip_wheel django + if [[ "$WITH_OPTIONAL_DEPS" == "yes" ]]; then + pip_wheel PyYAML pyinotify boto pylibacl Jinja2 mercurial guppy cherrypy python-augeas + + if [[ ${PYVER:0:1} == "2" ]]; then + pip_wheel cheetah m2crypto + + if [[ $PYVER != "2.7" ]]; then + pip_wheel 'django<1.7' 'South<0.8' + else + pip_wheel django + fi fi fi fi diff --git a/testsuite/prepare-python.sh b/testsuite/prepare-python.sh new file mode 100755 index 000000000..7b72a6dc4 --- /dev/null +++ b/testsuite/prepare-python.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +if [ -n "$PYTHON" ]; then + echo "Try to use custom python version: $PYTHON" + pip install 'virtualenv<1.8' + mkdir -p "$HOME/custom-virtualenv" + virtualenv -p "python$PYTHON" --use-distribute "$HOME/custom-virtualenv" +fi diff --git a/testsuite/requirements-legacy.txt b/testsuite/requirements-legacy.txt new file mode 100644 index 000000000..87af9cfc6 --- /dev/null +++ b/testsuite/requirements-legacy.txt @@ -0,0 +1,13 @@ +lxml<3.4 +lockfile<0.9 +python-daemon<1.4 +argparse +ssl + +nose +mock<1.1 +unittest2<0.6 +logilab-common==0.53.0 +logilab-astng==0.20.3 +pylint<0.22 +pep8<1.3 -- cgit v1.2.3-1-g7c22 From 73045f451a8cdfb0c48e87e736c3b6a28b22f6fb Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Wed, 22 Mar 2017 20:20:40 +0100 Subject: testsuite: Server requires Python2.6 We do not want to run the test for the Server with Python2.4 and Python2.5 and use the nose-exclude plugin to disable the Server tests based on the directory. We do not even want to import the modules of the Server, as it might not be possible anymore (missing dependencies or invalid syntax). nose-exclude-0.2 breaks compatibility with Python2.5 and below (it is using the "with open(..):" syntax), so we have to stick to the last version below. --- testsuite/Testsrc/test_code_checks.py | 5 +++-- testsuite/requirements-legacy.txt | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) (limited to 'testsuite') diff --git a/testsuite/Testsrc/test_code_checks.py b/testsuite/Testsrc/test_code_checks.py index c26d8c139..44c4633a7 100644 --- a/testsuite/Testsrc/test_code_checks.py +++ b/testsuite/Testsrc/test_code_checks.py @@ -79,9 +79,10 @@ no_checks = { "lib/Bcfg2/Server/migrations": ["*.py"], "lib/Bcfg2/Server/south_migrations": ["*.py"], } + if sys.version_info < (2, 6): - # multiprocessing core requires py2.6 - no_checks['lib/Bcfg2/Server'] = ['MultiprocessingCore.py'] + # Server requires python 2.6 + no_checks['lib/Bcfg2'] = ['Server'] try: any diff --git a/testsuite/requirements-legacy.txt b/testsuite/requirements-legacy.txt index 87af9cfc6..7d918cb45 100644 --- a/testsuite/requirements-legacy.txt +++ b/testsuite/requirements-legacy.txt @@ -5,6 +5,7 @@ argparse ssl nose +nose-exclude<0.2 mock<1.1 unittest2<0.6 logilab-common==0.53.0 -- cgit v1.2.3-1-g7c22 From 97a113956f8211a2e718afe98a623cafebc03922 Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Thu, 21 Jul 2016 04:20:45 +0200 Subject: testsuite: ExceptionMessageChecker support for old python --- testsuite/ext/exception_messages.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'testsuite') diff --git a/testsuite/ext/exception_messages.py b/testsuite/ext/exception_messages.py index cd3d7112c..5c59916df 100644 --- a/testsuite/ext/exception_messages.py +++ b/testsuite/ext/exception_messages.py @@ -35,10 +35,15 @@ class ExceptionMessageChecker(BaseChecker): priority = -1 def visit_raise(self, node): - if node.exc is None: + exc = None + try: + exc = node.exc + except AttributeError: + exc = node.type + if exc is None: return - if isinstance(node.exc, ast.Name): - raised = safe_infer(node.exc) + if isinstance(exc, ast.Name): + raised = safe_infer(exc) if (isinstance(raised, ast.Class) and raised.name not in self.config.exceptions_without_args): self.add_message('R9901', node=node.exc) -- cgit v1.2.3-1-g7c22 From 2e3ac3bd311ecf4d26032cd029dcc5e92170fe7f Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Tue, 28 Jul 2015 17:55:17 +0200 Subject: testsuite: Support for ancient pylint versions For Python2.4 and Python2.5 we need very old pylint versions (0.21.x). So we have to work around some bugs: - This adds some ugly monkey patching to backport some bugfixes from newer pylint versions (that does not support Python2.4 anymore). - Another problem is, that pylint-0.24 changed its message IDs. So this translates the new IDs into the older ones, so that the old pylint can match the disabled messages. - The newer version of pylint support more messages and some of the new messages have to be disabled. The old pylint versions have to silently ignore unknown message ids. - The compatible astng version of the old pylint does not support register_transformer, so we need to build out own variant by monkey patching the ASTNGBuilder. --- testsuite/ext/pylint_compat.py | 275 +++++++++++++++++++++++++++++++++++++++++ testsuite/ext/ssl_protocols.py | 12 +- testsuite/pylintrc.conf | 2 +- 3 files changed, 286 insertions(+), 3 deletions(-) create mode 100644 testsuite/ext/pylint_compat.py (limited to 'testsuite') diff --git a/testsuite/ext/pylint_compat.py b/testsuite/ext/pylint_compat.py new file mode 100644 index 000000000..8ccfbc89b --- /dev/null +++ b/testsuite/ext/pylint_compat.py @@ -0,0 +1,275 @@ +from pylint.__pkginfo__ import version as pylint_version +from logilab.astng.__pkginfo__ import version as astng_version + +def register(linter): + if pylint_version < '0.24.0': + import pylint.utils + orig_check_message_id = pylint.utils.MessagesHandlerMixIn.check_message_id + def check_message_id(self, msgid): + # translate the new message ids back into the old ones + replacements = {'12': '65', '13': '99'} + new = msgid[1:3] + if new in replacements: + msgid = msgid[0] + replacements[new] + msgid[3:] + return orig_check_message_id(self, msgid) + pylint.utils.MessagesHandlerMixIn.check_message_id = check_message_id + + def ignore(meth, msgid, *args, **kwargs): + # ignore non-existent message ids in disable/enable comments + ignore = ['W1401', 'R0924'] + if msgid in ignore: + return + return meth(msgid, *args, **kwargs) + linter._options_methods['disable'] = lambda *args, **kwargs: ignore(linter.disable, *args, **kwargs) + linter._options_methods['enable'] = lambda *args, **kwargs: ignore(linter.enable, *args, **kwargs) + + if pylint_version < '0.22.0': + import pylint.checkers.exceptions + orig_visit_raise = pylint.checkers.exceptions.ExceptionsChecker.visit_raise + def visit_raise(self, node): + if not hasattr(node, 'type') and hasattr(node, 'exc'): + node.type = node.exc + return orig_visit_raise(self, node) + pylint.checkers.exceptions.ExceptionsChecker.visit_raise = visit_raise + + if astng_version < '0.23': + import logilab.astng.scoped_nodes + from logilab.astng.bases import InferenceContext, InferenceError + + # backport import bug fix (e642ba33ba1bdde04ac9f0c75a25dc40131c55e7) + def ancestors(self, recurs=True, context=None): + yielded = set([self]) + if context is None: + context = InferenceContext() + for stmt in self.bases: + path = set(context.path) + try: + for baseobj in stmt.infer(context): + if not isinstance(baseobj, logilab.astng.scoped_nodes.Class): + # duh ? + continue + if baseobj in yielded: + continue # cf xxx above + yielded.add(baseobj) + yield baseobj + if recurs: + for grandpa in baseobj.ancestors(True, context): + if grandpa in yielded: + continue # cf xxx above + yielded.add(grandpa) + yield grandpa + except InferenceError: + # XXX log error ? + pass + context.path = path + logilab.astng.scoped_nodes.Class.ancestors = ancestors + + # support for classpropery (d110bcf2de4b8bc48e41638cf430f17c5714ffbc) + try: + from logilab.astng.rebuilder import TreeRebuilder + except: + try: + from logilab.astng._nodes_ast import TreeRebuilder + except: + from logilab.astng._nodes_compiler import TreeRebuilder + from logilab.astng import nodes + + orig_visit_function = TreeRebuilder.visit_function + def visit_function(self, node, parent): + newnode = orig_visit_function(self, node, parent) + if newnode.decorators is not None: + for decorator_expr in newnode.decorators.nodes: + if isinstance(decorator_expr, nodes.Name): + if decorator_expr.name == 'classproperty': + newnode.type = 'classmethod' + return newnode + TreeRebuilder.visit_function = visit_function + + if astng_version < '0.22': + from logilab.astng import nodes + from logilab.astng.bases import _infer_stmts, copy_context, path_wrapper, \ + InferenceError, NotFoundError + from logilab.astng._exceptions import ASTNGBuildingException + import logilab.astng.scoped_nodes + from logilab.astng.node_classes import List, DelName + + # backport of 11886551cfdcf969f0a661f8ab63c1fa1a6dd399 with + # a bit revert of af896e299ce5e381a928a77a9c28941cad90a243 + def infer_from(self, context=None, asname=True): + name = context.lookupname + if name is None: + raise InferenceError() + if asname: + name = self.real_name(name) + module = self.do_import_module(self.modname) + try: + context = copy_context(context) + context.lookupname = name + return _infer_stmts(module.getattr(name, ignore_locals=module is self.root()), context) + except NotFoundError: + raise InferenceError(name) + nodes.From.infer = path_wrapper(infer_from) + + def getattr(self, name, context=None, ignore_locals=False): + if name in self.special_attributes: + if name == '__file__': + return [cf(self.file)] + self.locals.get(name, []) + if name == '__path__' and self.package: + return [List()] + self.locals.get(name, []) + return std_special_attributes(self, name) + if not ignore_locals and name in self.locals: + return self.locals[name] + if self.package: + try: + return [self.import_module(name, relative_only=True)] + except (KeyboardInterrupt, SystemExit): + raise + except: + pass + raise NotFoundError(name) + logilab.astng.scoped_nodes.Module.getattr = logilab.astng.scoped_nodes.remove_nodes(getattr, DelName) + + if astng_version < '0.21.1': + # backport of 3d463da455e33e7ddc53a295b6a33db7b9e4288b + from logilab.astng.scoped_nodes import Function + from logilab.astng.rebuilder import RebuildVisitor + from logilab.astng.bases import YES, Instance + + orig_init = Function.__init__ + def init(self, name, doc): + orig_init(self, name, doc) + self.instance_attrs = {} + Function.__init__ = init + + orig_getattr = Function.getattr + def getattr(self, name, context=None): + if name != '__module__' and name in self.instance_attrs: + return self.instance_attrs[name] + return orig_getattr(self, name, context) + Function.getattr = getattr + + def delayed_assattr(self, node): + """visit a AssAttr node -> add name to locals, handle members + definition + """ + try: + frame = node.frame() + for infered in node.expr.infer(): + if infered is YES: + continue + try: + if infered.__class__ is Instance: + infered = infered._proxied + iattrs = infered.instance_attrs + elif isinstance(infered, Instance): + # Const, Tuple, ... we may be wrong, may be not, but + # anyway we don't want to pollute builtin's namespace + continue + elif infered.is_function: + iattrs = infered.instance_attrs + else: + iattrs = infered.locals + except AttributeError: + # XXX log error + #import traceback + #traceback.print_exc() + continue + values = iattrs.setdefault(node.attrname, []) + if node in values: + continue + # get assign in __init__ first XXX useful ? + if frame.name == '__init__' and values and not \ + values[0].frame().name == '__init__': + values.insert(0, node) + else: + values.append(node) + except InferenceError: + pass + RebuildVisitor.delayed_assattr = delayed_assattr + + if astng_version < '0.20.4': + try: + from logilab.astng._nodes_ast import TreeRebuilder, _lineno_parent + except: + from logilab.astng._nodes_compiler import TreeRebuilder + _lineno_parent = (lambda *args: TreeRebuilder._set_infos(None, *args)) + from logilab.astng import nodes + from logilab.astng.bases import NodeNG, Instance + from logilab.astng.mixins import ParentAssignTypeMixin + + class Set(NodeNG, Instance, ParentAssignTypeMixin): + _astng_fields = ('elts',) + elts = None + + def pytype(self): + return '__builtin__.set' + + def itered(self): + return self.elts + + def visit_set(self, node, parent): + newnode = Set() + _lineno_parent(node, newnode, parent) + newnode.elts = [self.visit(child, newnode) for child in node.elts] + newnode.set_line_info(newnode.last_child()) + return newnode + TreeRebuilder.visit_set = visit_set + + def visit_setcomp(self, node, parent): + newnode = nodes.SetComp() + _lineno_parent(node, newnode, parent) + newnode.elt = self.visit(node.elt, newnode) + newnode.generators = [self.visit(child, newnode) + for child in node.generators] + newnode.set_line_info(newnode.last_child()) + return newnode + TreeRebuilder.visit_setcomp = visit_setcomp + + class DictComp(NodeNG): + _astng_fields = ('key', 'value', 'generators') + key = None + value = None + generators = None + + def visit_dictcomp(self, node, parent): + newnode = DictComp() + _lineno_parent(node, newnode, parent) + newnode.key = self.visit(node.key, newnode) + newnode.value = self.visit(node.value, newnode) + newnode.generators = [self.visit(child, newnode) + for child in node.generators] + newnode.set_line_info(newnode.last_child()) + return newnode + TreeRebuilder.visit_dictcomp = visit_dictcomp + + # backport of bfe9e5c53cfb75c3b45ebb5cb8e8902464782c7d + from logilab.astng.node_classes import From + orig_from_init = From.__init__ + def from_init(self, fromname, names, level=0): + orig_from_init(self, fromname or '', names, level) + From.__init__ = from_init + + # partial backport of 6d59ad07d722d01e458aaf8fd14fd7dfc7ebaa6e + from logilab.astng.scoped_nodes import Module + orig_absolute_modname = Module.absolute_modname + def absolute_modname(self, modname, level): + result = orig_absolute_modname(self, modname, level) + if result[-1] == '.': + return result[:-1] + return result + Module.absolute_modname = absolute_modname + + # python2.4 compatibility (no super on old-style classes) + from logilab.astng.bases import Proxy, UnboundMethod + + def unbound_igetattr(self, name, context=None): + if name == 'im_func': + return iter((self._proxied,)) + return Proxy.igetattr(self, name, context) + UnboundMethod.igetattr = unbound_igetattr + + def unbound_getattr(self, name, context=None): + if name == 'im_func': + return [self._proxied] + return Proxy.getattr(self, name, context) + UnboundMethod.getattr = unbound_getattr diff --git a/testsuite/ext/ssl_protocols.py b/testsuite/ext/ssl_protocols.py index 66068d2a9..a56293669 100644 --- a/testsuite/ext/ssl_protocols.py +++ b/testsuite/ext/ssl_protocols.py @@ -1,5 +1,5 @@ try: - from logilab.astng import MANAGER, scoped_nodes, node_classes + from logilab.astng import MANAGER, builder, scoped_nodes, node_classes PYLINT=0 except ImportError: from astroid import MANAGER, scoped_nodes, node_classes @@ -12,6 +12,14 @@ def ssl_transform(module): def register(linter): if PYLINT == 0: - MANAGER.register_transformer(ssl_transform) + if hasattr(MANAGER, 'register_transformer'): + MANAGER.register_transformer(ssl_transform) + else: + safe = builder.ASTNGBuilder.string_build + def _string_build(self, data, modname='', path=None): + if modname == 'ssl': + data += '\n\nPROTOCOL_SSLv23 = 0\nPROTOCOL_TLSv1 = 0' + return safe(self, data, modname, path) + builder.ASTNGBuilder.string_build = _string_build else: MANAGER.register_transform(scoped_nodes.Module, ssl_transform) diff --git a/testsuite/pylintrc.conf b/testsuite/pylintrc.conf index 50ece77db..ce7e407df 100644 --- a/testsuite/pylintrc.conf +++ b/testsuite/pylintrc.conf @@ -19,7 +19,7 @@ persistent=no # List of plugins (as comma separated values of python modules names) to load, # usually to register additional checkers. -load-plugins=ext.exception_messages,ext.ssl_protocols +load-plugins=ext.exception_messages,ext.ssl_protocols,ext.pylint_compat [MESSAGES CONTROL] -- cgit v1.2.3-1-g7c22 From 306c3dc42b55d6f3925d144c84aae00dbf4439ab Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Wed, 22 Mar 2017 20:43:18 +0100 Subject: testsuite: No doc test is the default For the doc test all (optional) dependencies have to be installed, so the doc test is only usefull in a few special test environments. --- testsuite/Testsrc/test_doc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'testsuite') diff --git a/testsuite/Testsrc/test_doc.py b/testsuite/Testsrc/test_doc.py index 93c8d1bb4..d105254c5 100644 --- a/testsuite/Testsrc/test_doc.py +++ b/testsuite/Testsrc/test_doc.py @@ -20,7 +20,7 @@ except ImportError: HAS_SPHINX = False -TEST_SPHINX = bool(os.environ.get('TEST_SPHINX', 'yes') != 'no') +TEST_SPHINX = bool(os.environ.get('TEST_SPHINX', 'no') != 'no') class DocTest(Bcfg2TestCase): -- cgit v1.2.3-1-g7c22 From 730ef612d9bbd9fc94a8e5d916831a91af033868 Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Wed, 22 Mar 2017 21:03:21 +0100 Subject: travis-ci: Show skipped tests For the test environment with all optional dependencies, we want to run all tests. So let's print all skipped tests. --- testsuite/install.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'testsuite') diff --git a/testsuite/install.sh b/testsuite/install.sh index 13a2e9d01..604872a5e 100755 --- a/testsuite/install.sh +++ b/testsuite/install.sh @@ -20,8 +20,9 @@ else fi if [[ "$WITH_OPTIONAL_DEPS" == "yes" ]]; then - pip_wheel PyYAML pyinotify boto pylibacl Jinja2 mercurial guppy cherrypy python-augeas - + pip_wheel PyYAML pyinotify boto pylibacl Jinja2 mercurial guppy \ + cherrypy python-augeas nose-show-skipped + if [[ ${PYVER:0:1} == "2" ]]; then pip_wheel cheetah m2crypto -- cgit v1.2.3-1-g7c22 From 260ed3e5d8895bf74f7433b73c9e7c6e2fa9ee3b Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Thu, 23 Mar 2017 21:20:47 +0100 Subject: testsuite: Django should work on Python3, too --- testsuite/install.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'testsuite') diff --git a/testsuite/install.sh b/testsuite/install.sh index 604872a5e..076d91a4c 100755 --- a/testsuite/install.sh +++ b/testsuite/install.sh @@ -25,12 +25,12 @@ else if [[ ${PYVER:0:1} == "2" ]]; then pip_wheel cheetah m2crypto - - if [[ $PYVER != "2.7" ]]; then - pip_wheel 'django<1.7' 'South<0.8' - else - pip_wheel django - fi + fi + + if [[ $PYVER == "2.6" ]]; then + pip_wheel 'django<1.7' 'South<0.8' + else + pip_wheel django fi fi fi -- cgit v1.2.3-1-g7c22 From 9c21072a9d10744ef39c3fdc4a5a6a0797401810 Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Wed, 16 Aug 2017 10:01:21 +0200 Subject: testsuite: Use older mercurial for python2.6 > Mercurial 4.2.2 is the last release to support Python 2.6. > Use this if you need to run Mercurial on old platforms and > you cannot update your Python installation. See also: https://www.mercurial-scm.org/wiki/SupportedPythonVersions --- testsuite/install.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'testsuite') diff --git a/testsuite/install.sh b/testsuite/install.sh index 076d91a4c..1bd214936 100755 --- a/testsuite/install.sh +++ b/testsuite/install.sh @@ -20,7 +20,7 @@ else fi if [[ "$WITH_OPTIONAL_DEPS" == "yes" ]]; then - pip_wheel PyYAML pyinotify boto pylibacl Jinja2 mercurial guppy \ + pip_wheel PyYAML pyinotify boto pylibacl Jinja2 guppy \ cherrypy python-augeas nose-show-skipped if [[ ${PYVER:0:1} == "2" ]]; then @@ -28,9 +28,9 @@ else fi if [[ $PYVER == "2.6" ]]; then - pip_wheel 'django<1.7' 'South<0.8' + pip_wheel 'django<1.7' 'South<0.8' 'mercurial<4.3' else - pip_wheel django + pip_wheel django mercurial fi fi fi -- cgit v1.2.3-1-g7c22 From 57e4c9e500b0c1094548d8a16699117cedb07598 Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Thu, 17 Aug 2017 16:37:08 +0200 Subject: travis-ci: Simplified test script --- testsuite/test.sh | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100755 testsuite/test.sh (limited to 'testsuite') diff --git a/testsuite/test.sh b/testsuite/test.sh new file mode 100755 index 000000000..739c3c2b0 --- /dev/null +++ b/testsuite/test.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +NOSE_OPTS="" + +if [ "$WITH_OPTIONAL_DEPS" = "yes" ]; then + NOSE_OPTS="--show-skipped" +fi + +exec nosetests $NOSE_OPTS testsuite -- cgit v1.2.3-1-g7c22 From 870ce516689f55f20ffd569786951ba0311df88a Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Thu, 17 Aug 2017 16:47:33 +0200 Subject: testsuite: Requirements for Python3 --- testsuite/install.sh | 5 +++-- testsuite/requirements-26.txt | 9 +++++++++ testsuite/requirements.txt | 9 +++++---- 3 files changed, 17 insertions(+), 6 deletions(-) create mode 100644 testsuite/requirements-26.txt (limited to 'testsuite') diff --git a/testsuite/install.sh b/testsuite/install.sh index 1bd214936..b8220d217 100755 --- a/testsuite/install.sh +++ b/testsuite/install.sh @@ -13,10 +13,11 @@ else pip install --no-index --find-links="$HOME/.cache/wheels/" "$@" } - pip_wheel -r testsuite/requirements.txt - if [[ $PYVER == "2.6" ]]; then + pip_wheel -r testsuite/requirements-26.txt pip_wheel unittest2 + else + pip_wheel -r testsuite/requirements.txt fi if [[ "$WITH_OPTIONAL_DEPS" == "yes" ]]; then diff --git a/testsuite/requirements-26.txt b/testsuite/requirements-26.txt new file mode 100644 index 000000000..f85dc6de4 --- /dev/null +++ b/testsuite/requirements-26.txt @@ -0,0 +1,9 @@ +lxml +python-daemon<2.0.0 +argparse +genshi + +nose +mock +pylint<0.29 +pep8 diff --git a/testsuite/requirements.txt b/testsuite/requirements.txt index 0d8c297aa..80ba8e067 100644 --- a/testsuite/requirements.txt +++ b/testsuite/requirements.txt @@ -1,9 +1,10 @@ lxml +python-daemon +genshi +argparse + nose mock -sphinx<1.5 pylint<0.29 pep8 -python-daemon<2.0.0 -genshi -argparse +sphinx<1.5 -- cgit v1.2.3-1-g7c22 From 74f37ee90939e3deb811fe4e44c9aeda4180c87e Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Thu, 17 Aug 2017 17:09:14 +0200 Subject: testsuite: guppy does not support Python3 --- testsuite/install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'testsuite') diff --git a/testsuite/install.sh b/testsuite/install.sh index b8220d217..4ea811de0 100755 --- a/testsuite/install.sh +++ b/testsuite/install.sh @@ -21,11 +21,11 @@ else fi if [[ "$WITH_OPTIONAL_DEPS" == "yes" ]]; then - pip_wheel PyYAML pyinotify boto pylibacl Jinja2 guppy \ + pip_wheel PyYAML pyinotify boto pylibacl Jinja2 \ cherrypy python-augeas nose-show-skipped if [[ ${PYVER:0:1} == "2" ]]; then - pip_wheel cheetah m2crypto + pip_wheel cheetah m2crypto guppy fi if [[ $PYVER == "2.6" ]]; then -- cgit v1.2.3-1-g7c22 From bba671cf8df8dfadeec926acb7a3d15d07946dc7 Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Thu, 17 Aug 2017 17:11:04 +0200 Subject: testsuite: Use cheetah3 if possible cheetah3 is a fork of cheetah for Python2.7 and Python3. --- testsuite/install.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'testsuite') diff --git a/testsuite/install.sh b/testsuite/install.sh index 4ea811de0..d2fd20acb 100755 --- a/testsuite/install.sh +++ b/testsuite/install.sh @@ -25,13 +25,13 @@ else cherrypy python-augeas nose-show-skipped if [[ ${PYVER:0:1} == "2" ]]; then - pip_wheel cheetah m2crypto guppy + pip_wheel m2crypto guppy fi if [[ $PYVER == "2.6" ]]; then - pip_wheel 'django<1.7' 'South<0.8' 'mercurial<4.3' + pip_wheel 'django<1.7' 'South<0.8' 'mercurial<4.3' cheetah else - pip_wheel django mercurial + pip_wheel django mercurial cheetah3 fi fi fi -- cgit v1.2.3-1-g7c22 From 47ebf4e59cf84295aa072d909fe3312ff57e305b Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Thu, 17 Aug 2017 17:32:22 +0200 Subject: testsuite: Fix building of m2crypto with Python2.6 --- testsuite/install.sh | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) (limited to 'testsuite') diff --git a/testsuite/install.sh b/testsuite/install.sh index d2fd20acb..758d5bdf8 100755 --- a/testsuite/install.sh +++ b/testsuite/install.sh @@ -24,13 +24,18 @@ else pip_wheel PyYAML pyinotify boto pylibacl Jinja2 \ cherrypy python-augeas nose-show-skipped - if [[ ${PYVER:0:1} == "2" ]]; then - pip_wheel m2crypto guppy - fi - if [[ $PYVER == "2.6" ]]; then - pip_wheel 'django<1.7' 'South<0.8' 'mercurial<4.3' cheetah + pip install \ + --global-option='build_ext' \ + --global-option='--include-dirs=/usr/include/x86_64-linux-gnu' \ + m2crypto + + pip_wheel 'django<1.7' 'South<0.8' 'mercurial<4.3' cheetah guppy else + if [[ $PYVER == "2.7" ]]; then + pip_wheel m2crypto guppy + fi + pip_wheel django mercurial cheetah3 fi fi -- cgit v1.2.3-1-g7c22 From 92606b5f9f881cf29a7d57210c57fe6ec6dc85e8 Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Thu, 17 Aug 2017 17:37:50 +0200 Subject: testsuite: Fix syntax --- testsuite/common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'testsuite') diff --git a/testsuite/common.py b/testsuite/common.py index 944471ade..e0ff3ed19 100644 --- a/testsuite/common.py +++ b/testsuite/common.py @@ -167,7 +167,7 @@ class Bcfg2TestCase(TestCase): sys.stderr = cls._stderr if hasattr(TestCase, "assertCountEqual"): - assertItemsEqual = assertCountEqual + assertItemsEqual = TestCase.assertCountEqual def assertXMLEqual(self, el1, el2, msg=None): """ Test that the two XML trees given are equal. """ -- cgit v1.2.3-1-g7c22 From 3b372355f0d8e6799abc29f149ee479a0b89095e Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Thu, 17 Aug 2017 18:09:57 +0200 Subject: testsuite: Bump pylint version for Python3 --- testsuite/ext/pylint_compat.py | 7 ++++++- testsuite/ext/ssl_protocols.py | 2 +- testsuite/install.sh | 5 +++++ 3 files changed, 12 insertions(+), 2 deletions(-) (limited to 'testsuite') diff --git a/testsuite/ext/pylint_compat.py b/testsuite/ext/pylint_compat.py index 8ccfbc89b..5300df8e6 100644 --- a/testsuite/ext/pylint_compat.py +++ b/testsuite/ext/pylint_compat.py @@ -1,5 +1,10 @@ from pylint.__pkginfo__ import version as pylint_version -from logilab.astng.__pkginfo__ import version as astng_version + +try: + from logilab.astng.__pkginfo__ import version as astng_version +except ImportError: + from astroid.__pkginfo__ import version as astng_version + def register(linter): if pylint_version < '0.24.0': diff --git a/testsuite/ext/ssl_protocols.py b/testsuite/ext/ssl_protocols.py index a56293669..f92e3e355 100644 --- a/testsuite/ext/ssl_protocols.py +++ b/testsuite/ext/ssl_protocols.py @@ -8,7 +8,7 @@ except ImportError: def ssl_transform(module): if module.name == 'ssl': for proto in ('SSLv23', 'TLSv1'): - module.locals['PROTOCOL_%s' % proto] = [node_classes.Const()] + module.locals['PROTOCOL_%s' % proto] = [node_classes.Const(0)] def register(linter): if PYLINT == 0: diff --git a/testsuite/install.sh b/testsuite/install.sh index 758d5bdf8..01c5199f2 100755 --- a/testsuite/install.sh +++ b/testsuite/install.sh @@ -18,6 +18,11 @@ else pip_wheel unittest2 else pip_wheel -r testsuite/requirements.txt + + if [[ ${PYVER:0:1} == "3" ]]; then + # TODO: Move to "requirements.txt" if all the new errors are fixed. + pip_wheel 'pylint>1.4' + fi fi if [[ "$WITH_OPTIONAL_DEPS" == "yes" ]]; then -- cgit v1.2.3-1-g7c22 From e1dad29296e49c574c16c43e6753a4f685056f25 Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Thu, 17 Aug 2017 18:28:22 +0200 Subject: testsuite: Bump sphinx version https://github.com/sphinx-doc/sphinx/issues/3234 should be fixed now. --- testsuite/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'testsuite') diff --git a/testsuite/requirements.txt b/testsuite/requirements.txt index 80ba8e067..665ed961d 100644 --- a/testsuite/requirements.txt +++ b/testsuite/requirements.txt @@ -7,4 +7,4 @@ nose mock pylint<0.29 pep8 -sphinx<1.5 +sphinx -- cgit v1.2.3-1-g7c22 From 0fdabbcb4668d5f70f76c08a6e3216c5542e7457 Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Thu, 17 Aug 2017 21:32:52 +0200 Subject: travis-ci: Fix "with_system_site_packages" The "with_system_site_packages" virtualenv seems to be missing the pymodules directory containing python modules installed with the python-support debian helper. So we use the default environment and manually add the references to the system-wide python packages. --- testsuite/install.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'testsuite') diff --git a/testsuite/install.sh b/testsuite/install.sh index 01c5199f2..af07de0a9 100755 --- a/testsuite/install.sh +++ b/testsuite/install.sh @@ -2,6 +2,7 @@ # install script for Travis-CI PYVER=$(python -c 'import sys;print(".".join(str(v) for v in sys.version_info[0:2]))') +SITE_PACKAGES=$(python -c 'from distutils.sysconfig import get_python_lib; print(get_python_lib())') if [[ ${PYVER:0:1} == "2" && $PYVER != "2.7" && $PYVER != "2.6" ]]; then pip install -r testsuite/requirements-legacy.txt @@ -46,6 +47,15 @@ else fi fi +# Use system site-packages and pymodules +if [[ "$WITH_SYSTEM_SITE_PACKAGES" == "yes" ]]; then + cat < "$SITE_PACKAGES/system-packages.pth" +/usr/lib/python$PYVER/site-packages/ +/usr/lib/python$PYVER/dist-packages/ +/usr/lib/pymodules/python$PYVER/ +EOF +fi + # Setup the local xml schema cache download_schema() { if [[ ! -e "$1" ]]; then -- cgit v1.2.3-1-g7c22