Generalized the log.assertion() function a bit to be able to provide more information on assertion failure.

- Legacy-Id: 15426
This commit is contained in:
Henrik Levkowetz 2018-08-10 15:31:12 +00:00
parent 993765d513
commit b2bfc7858a
2 changed files with 7 additions and 6 deletions

View file

@ -91,7 +91,7 @@ def validate_submission_rev(name, rev):
expected = 0
existing_revs = [int(i.rev) for i in Document.objects.filter(name=name) if i.rev and i.rev.isdigit() ]
log.assertion('[ i.rev for i in Document.objects.filter(name=name) if not (i.rev and i.rev.isdigit()) ] == []')
log.assertion('[ i.rev for i in Document.objects.filter(name=name) if not (i.rev and i.rev.isdigit()) ]', [])
if existing_revs:
expected = max(existing_revs) + 1

View file

@ -88,7 +88,7 @@ def build_traceback(stack):
break
return tb
def assertion(statement):
def assertion(statement, state=True):
"""
This acts like an assertion. It uses the django logger in order to send
the failed assertion and a backtrace as for an internal server error.
@ -97,9 +97,10 @@ def assertion(statement):
stack = inspect.stack()[1:]
frame = stack[0][0]
value = eval(statement, frame.f_globals, frame.f_locals)
if not value:
if settings.DEBUG is True or settings.SERVER_MODE == 'test':
raise AssertionError("Assertion '%s' failed." % (statement,))
if bool(value) != bool(state):
settings.DEBUG = False
if settings.DEBUG is True or settings.SERVER_MODE == 'test' :
raise AssertionError("Assertion failed: '%s': %s != %s." % (statement, repr(value), state))
else:
# build a simulated traceback object
tb = build_traceback(stack)
@ -108,7 +109,7 @@ def assertion(statement):
for key in [ 'request', 'status_code', ]:
if key in frame.f_locals:
extra[key] = frame.f_locals[key]
logger.error("Assertion '%s' failed.", statement, exc_info=(AssertionError, statement, tb), extra=extra)
logger.error("Assertion failed: '%s': %s != %s", statement, repr(value), state, exc_info=(AssertionError, statement, tb), extra=extra)
def unreachable(date="(unknown)"):
"Raises an assertion or sends traceback to admins if executed."