Don't load py.test.config inside py._code._assertionnew

Loading py.test.config triggers py.test initialisation while py.code
should stay independent of py.test.  By adding the hook as an
attribute to py.test AssertionError py.code can get access to the
hooks only when py.test is loaded already.

--HG--
branch : trunk
This commit is contained in:
Floris Bruynooghe
2010-09-22 00:26:12 +01:00
parent abab8f6f63
commit b86207a6c1
2 changed files with 20 additions and 8 deletions

View File

@@ -108,10 +108,16 @@ unary_map = {
class DebugInterpreter(ast.NodeVisitor):
"""Interpret AST nodes to gleam useful debugging information."""
"""Interpret AST nodes to gleam useful debugging information.
The _pytesthook attribute is used to detect if the py.test
pytest_assertion plugin is loaded and if so call it's hooks.
"""
def __init__(self, frame):
self.frame = frame
self._pytesthook = getattr(py.builtin.builtins.AssertionError,
"_pytesthook")
def generic_visit(self, node):
# Fallback when we don't have a special implementation.
@@ -177,13 +183,14 @@ class DebugInterpreter(ast.NodeVisitor):
if not result:
break
left_explanation, left_result = next_explanation, next_result
hook_result = py.test.config.hook.pytest_assert_compare(
op=op_symbol, left=left_result, right=next_result)
if hook_result:
for new_expl in hook_result:
if new_expl:
explanation = '\n~'.join(new_expl)
break
if self._pytesthook:
hook_result = self._pytesthook.pytest_assert_compare(
op=op_symbol, left=left_result, right=next_result)
if hook_result:
for new_expl in hook_result:
if new_expl:
explanation = '\n~'.join(new_expl)
break
return explanation, result
def visit_BoolOp(self, boolop):