| from __future__ import print_function |
| import os.path |
| import sys |
| |
| import pkg_resources |
| import pytest |
| |
| from .tree_construction import TreeConstructionFile |
| from .tokenizer import TokenizerFile |
| from .sanitizer import SanitizerFile |
| |
| _dir = os.path.abspath(os.path.dirname(__file__)) |
| _root = os.path.join(_dir, "..", "..") |
| _testdata = os.path.join(_dir, "testdata") |
| _tree_construction = os.path.join(_testdata, "tree-construction") |
| _tokenizer = os.path.join(_testdata, "tokenizer") |
| _sanitizer_testdata = os.path.join(_dir, "sanitizer-testdata") |
| |
| |
| def fail_if_missing_pytest_expect(): |
| """Throws an exception halting pytest if pytest-expect isn't working""" |
| try: |
| from pytest_expect import expect # noqa |
| except ImportError: |
| header = '*' * 78 |
| print( |
| '\n' + |
| header + '\n' + |
| 'ERROR: Either pytest-expect or its dependency u-msgpack-python is not\n' + |
| 'installed. Please install them both before running pytest.\n' + |
| header + '\n', |
| file=sys.stderr |
| ) |
| raise |
| |
| |
| fail_if_missing_pytest_expect() |
| |
| |
| def pytest_configure(config): |
| msgs = [] |
| |
| if not os.path.exists(_testdata): |
| msg = "testdata not available! " |
| if os.path.exists(os.path.join(_root, ".git")): |
| msg += ("Please run git submodule update --init --recursive " + |
| "and then run tests again.") |
| else: |
| msg += ("The testdata doesn't appear to be included with this package, " + |
| "so finding the right version will be hard. :(") |
| msgs.append(msg) |
| |
| if config.option.update_xfail: |
| # Check for optional requirements |
| req_file = os.path.join(_root, "requirements-optional.txt") |
| if os.path.exists(req_file): |
| with open(req_file, "r") as fp: |
| for line in fp: |
| if (line.strip() and |
| not (line.startswith("-r") or |
| line.startswith("#"))): |
| if ";" in line: |
| spec, marker = line.strip().split(";", 1) |
| else: |
| spec, marker = line.strip(), None |
| req = pkg_resources.Requirement.parse(spec) |
| if marker and not pkg_resources.evaluate_marker(marker): |
| msgs.append("%s not available in this environment" % spec) |
| else: |
| try: |
| installed = pkg_resources.working_set.find(req) |
| except pkg_resources.VersionConflict: |
| msgs.append("Outdated version of %s installed, need %s" % (req.name, spec)) |
| else: |
| if not installed: |
| msgs.append("Need %s" % spec) |
| |
| # Check cElementTree |
| import xml.etree.ElementTree as ElementTree |
| |
| try: |
| import xml.etree.cElementTree as cElementTree |
| except ImportError: |
| msgs.append("cElementTree unable to be imported") |
| else: |
| if cElementTree.Element is ElementTree.Element: |
| msgs.append("cElementTree is just an alias for ElementTree") |
| |
| if msgs: |
| pytest.exit("\n".join(msgs)) |
| |
| |
| def pytest_collect_file(path, parent): |
| dir = os.path.abspath(path.dirname) |
| dir_and_parents = set() |
| while dir not in dir_and_parents: |
| dir_and_parents.add(dir) |
| dir = os.path.dirname(dir) |
| |
| if _tree_construction in dir_and_parents: |
| if path.ext == ".dat": |
| return TreeConstructionFile(path, parent) |
| elif _tokenizer in dir_and_parents: |
| if path.ext == ".test": |
| return TokenizerFile(path, parent) |
| elif _sanitizer_testdata in dir_and_parents: |
| if path.ext == ".dat": |
| return SanitizerFile(path, parent) |