From f9cfc98ebf12f3f04479bee9fab9358fdf9d4559 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Fri, 28 Sep 2018 20:06:48 -0400 Subject: Get qualified names for method contexts --- coverage/context.py | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) (limited to 'coverage/context.py') diff --git a/coverage/context.py b/coverage/context.py index 24d01f2a..f167de36 100644 --- a/coverage/context.py +++ b/coverage/context.py @@ -7,5 +7,41 @@ def should_start_context_test_function(frame): """Is this frame calling a test_* function?""" fn_name = frame.f_code.co_name if fn_name.startswith("test"): - return fn_name + return qualname_from_frame(frame) return None + + +def qualname_from_frame(frame): + """Get a qualified name for the code running in `frame`.""" + co = frame.f_code + fname = co.co_name + if not co.co_varnames: + return fname + + locs = frame.f_locals + first_arg = co.co_varnames[0] + if co.co_argcount and first_arg == "self": + self = locs["self"] + #elif co.co_flags & 0x04: # *args syntax + # self = locs[first_arg][0] + else: + return fname + + method = getattr(self, fname, None) + if method is None: + return fname + + func = method.__func__ + if hasattr(func, '__qualname__'): + qname = func.__qualname__ + else: + for cls in self.__class__.__mro__: + f = cls.__dict__.get(fname, None) + if f is None: + continue + if f is func: + qname = cls.__name__ + "." + fname + break + else: + qname = fname + return qname -- cgit v1.2.1