import importlib import os import pkgutil from crc.api.common import ApiError class Script: """ Provides an abstract class that defines how scripts should work, this must be extended in all Script Tasks.""" def get_description(self): raise ApiError("invalid_script", "This script does not supply a description.") def do_task(self, task, study_id, **kwargs): raise ApiError("invalid_script", "This is an internal error. The script you are trying to execute " + "does not properly implement the do_task function.") @staticmethod def get_all_subclasses(): return Script._get_all_subclasses(Script) @staticmethod def _get_all_subclasses(cls): # hackish mess to make sure we have all the modules loaded for the scripts pkg_dir = os.path.dirname(__file__) for (module_loader, name, ispkg) in pkgutil.iter_modules([pkg_dir]): importlib.import_module('.' + name, __package__) """Returns a list of all classes that extend this class.""" all_subclasses = [] for subclass in cls.__subclasses__(): all_subclasses.append(subclass) all_subclasses.extend(Script._get_all_subclasses(subclass)) return all_subclasses