diff --git a/src/unitgrade/utils.py b/src/unitgrade/utils.py index 712297a897223d07d0685ad85e42045d7398b579..e106e1032687d4e57ee90a0968dc596756910c82 100644 --- a/src/unitgrade/utils.py +++ b/src/unitgrade/utils.py @@ -258,10 +258,26 @@ def methodsWithDecorator(cls, decorator): print(inspect.getsourcelines(f) ) # How to get all hidden questions. """ for maybeDecorated in cls.__dict__.values(): - if hasattr(maybeDecorated, 'decorator'): - if maybeDecorated.decorator == decorator: - print(maybeDecorated) - yield maybeDecorated + from types import FunctionType + + def extract_wrapped(decorated): + if decorated.__closure__ is None: + return decorated + closure = (c.cell_contents for c in decorated.__closure__) + return next((c for c in closure if isinstance(c, FunctionType)), None) + import inspect + if inspect.isfunction(maybeDecorated): + # elif not isinstance(maybeDecorated, func): + f = extract_wrapped(maybeDecorated) + source, position = inspect.getsourcelines(f) + for l in source: + if l.strip().startswith("@hide"): + yield f + + # if hasattr(maybeDecorated, 'decorator'): + # if maybeDecorated.decorator == decorator: + # print(maybeDecorated) + # yield maybeDecorated """ Methods responsible for turning a dictionary into a string that can be pickled or put into a json file. """