[pytest-dev] Custom reporting for asserts without comparison operators?
RonnyPfannschmidt
opensource at ronnypfannschmidt.de
Mon Mar 19 14:02:55 EDT 2018
hi everyone,
**re-sent using the other sending address**
this is just about single value assertion helpers
i logged an feature request about that a few year back
see https://github.com/pytest-dev/pytest/issues/95 -
so basically this use-case was known since 2011 ^^ and doesn't require
ast rewriting lice macros,
just proper engineering of the representation and handling of single
values in the assertion rewriter.
-- Ronny
Am 19.03.2018 um 15:13 schrieb holger krekel:
> On Mon, Mar 19, 2018 at 15:03 +0100, Floris Bruynooghe wrote:
>> On Sun, Mar 18 2018, Shawn Brown wrote:
>>> Unfortunately, this does not solve my usecase. I'm trying to handle cases
>>> where the following statement would pass:
>>>
>>> assert myfunc(failing_input) == False
>>>
>>> But where this next statement would fail using my custom report:
>>>
>>> assert myfunc(failing_input)
>>>
>>> Calling myfunc() needs to return True or False (or at least Truthy or
>>> Falsy)--this is locked-in behavior.
>> I'm not sure if this is compatible with Python's semantics really. If I
>> understand correctly you're asking for a full-on macro implementation on
>> Python or something. Which in theory you could do with an AST
>> NodeVisitor, but really Python isn't made for this -- sounds like you'd
>> enjoy lisp! ;-)
>>
>> The best thing I can suggest is to make use of the::
>>
>> assert myfunc(failing_input), repr(myfunc(failing_input()))
> i wonder if one could try to rewrite the ast for "assert myfunc(x)" to
> "assert __pytest_funcrepr_helper(myfunc(x), 'myfunc(x)')" with something like:
>
> class __pytest_funcrepr_helper:
> def __init__(self, val, source):
> self.val = val
> self.source = source
> def __bool__(self):
> return bool(self.val)
> def __repr__(self):
> return "{!r} returned non-true {!r}".format(self.source, self.val)
>
> but maybe i am not grasping all details involved. It's been a while since
> i looked into ast-rewriting ...
>
> holger
>
>
>> functionality to also get a custom error message. Here your myfunc()
>> whould have to return some object which both implements __bool__ as well
>> as __repr__ I guess.
>>
>> Maybe there's a feature request in here for something like this::
>>
>> class Foo:
>> def __bool__(self):
>> return False
>>
>> def __repr__(self):
>> return 'multiline\nstring'
>>
>> assert Foo()
>>
>> To actually show the repr in the error message, which it currently
>> doesn't. I'd like to know what other people think of such a feature
>> though, and haven't thought through all the implications yet. But I'm
>> curious, would something like that solve your case?
>>
>> Cheers,
>> Floris
>> _______________________________________________
>> pytest-dev mailing list
>> pytest-dev at python.org
>> https://mail.python.org/mailman/listinfo/pytest-dev
> _______________________________________________
> pytest-dev mailing list
> pytest-dev at python.org
> https://mail.python.org/mailman/listinfo/pytest-dev
More information about the pytest-dev
mailing list