From 5175a7cd0d2c6d803a9e92b09521d61e5b3841c5 Mon Sep 17 00:00:00 2001 From: Jim Garrison Date: Mon, 7 Oct 2024 17:03:05 -0400 Subject: [PATCH] Fix GitHub source code links for decorated functions (#691) * Fix GitHub source code links for decorated functions * style updates --------- Co-authored-by: Eric Arellano <14852634+Eric-Arellano@users.noreply.github.com> --- docs/conf.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 9c97ac495..c18e66f8d 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -163,17 +163,24 @@ def linkcode_resolve(domain, info): if module is None or "qiskit_addon_cutting" not in module_name: return None + def is_valid_code_object(obj): + return inspect.isclass(obj) or inspect.ismethod(obj) or inspect.isfunction(obj) + obj = module for part in info["fullname"].split("."): try: obj = getattr(obj, part) except AttributeError: return None - is_valid_code_object = ( - inspect.isclass(obj) or inspect.ismethod(obj) or inspect.isfunction(obj) - ) - if not is_valid_code_object: + if not is_valid_code_object(obj): + return None + + # Unwrap decorators. This requires they used `functools.wrap()`. + while hasattr(obj, "__wrapped__"): + obj = getattr(obj, "__wrapped__") + if not is_valid_code_object(obj): return None + try: full_file_name = inspect.getsourcefile(obj) except TypeError: