12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- # coding=utf-8
- #
- # This file is part of Hypothesis, which may be found at
- # https://github.com/HypothesisWorks/hypothesis-python
- #
- # Most of this work is copyright (C) 2013-2018 David R. MacIver
- # (david@drmaciver.com), but it contains contributions by others. See
- # CONTRIBUTING.rst for a full list of people who may hold copyright, and
- # consult the git log if you need to determine who owns an individual
- # contribution.
- #
- # This Source Code Form is subject to the terms of the Mozilla Public License,
- # v. 2.0. If a copy of the MPL was not distributed with this file, You can
- # obtain one at http://mozilla.org/MPL/2.0/.
- #
- # END HEADER
- from __future__ import division, print_function, absolute_import
- import os
- import sys
- import coverage
- import hypothesis
- from hypothesis.errors import StopTest, DeadlineExceeded, \
- HypothesisException, UnsatisfiedAssumption
- from hypothesis.internal.compat import text_type, binary_type, \
- encoded_filepath
- def belongs_to(package):
- root = os.path.dirname(package.__file__)
- cache = {text_type: {}, binary_type: {}}
- def accept(filepath):
- ftype = type(filepath)
- try:
- return cache[ftype][filepath]
- except KeyError:
- pass
- new_filepath = encoded_filepath(filepath)
- result = os.path.abspath(new_filepath).startswith(root)
- cache[ftype][filepath] = result
- cache[type(new_filepath)][new_filepath] = result
- return result
- accept.__name__ = 'is_%s_file' % (package.__name__,)
- return accept
- PREVENT_ESCALATION = os.getenv('HYPOTHESIS_DO_NOT_ESCALATE') == 'true'
- FILE_CACHE = {}
- is_hypothesis_file = belongs_to(hypothesis)
- is_coverage_file = belongs_to(coverage)
- HYPOTHESIS_CONTROL_EXCEPTIONS = (
- DeadlineExceeded, StopTest, UnsatisfiedAssumption
- )
- def mark_for_escalation(e):
- if not isinstance(e, HYPOTHESIS_CONTROL_EXCEPTIONS):
- e.hypothesis_internal_always_escalate = True
- def escalate_hypothesis_internal_error():
- if PREVENT_ESCALATION:
- return
- error_type, e, tb = sys.exc_info()
- if getattr(e, 'hypothesis_internal_always_escalate', False):
- raise
- import traceback
- filepath = traceback.extract_tb(tb)[-1][0]
- if is_hypothesis_file(filepath) and not isinstance(
- e, (HypothesisException,) + HYPOTHESIS_CONTROL_EXCEPTIONS,
- ):
- raise
- # This is so that if we do something wrong and trigger an internal Coverage
- # error we don't try to catch it. It should be impossible to trigger, but
- # you never know.
- if is_coverage_file(filepath): # pragma: no cover
- raise
|