from os import scandir from pyleds.lib.Litsimaja import Litsimaja from pyleds.lib.Program import Program def resolve(namespace: str, class_name: str): m_name = 'program.' + namespace + '.' + class_name module = __import__(m_name, None, None, [m_name]) return module def run(namespace: str, class_name: str, lm: Litsimaja, logger, args: [] = None): module = resolve(namespace, class_name) loaded_class = getattr(module, class_name) program = loaded_class(lm) logger.info('Loaded "' + module.name() + '" from ' + namespace + '.' + class_name + ' with args: ' + repr(args)) lm.add_loop(program.get_loop()) lm.set_selected_program(namespace + '.' + class_name) program.run(args) def list_all(grouped: bool = False): all_programs = [] programs = [] for entry in scandir('program'): if entry.is_dir(): for file in scandir('program/' + entry.name): if file.is_file() and file.name[-3:] == '.py': try: program_name = file.name[: -3] module = resolve(entry.name, program_name) if hasattr(module, program_name) and issubclass(getattr(module, program_name), Program): programs.append({'prg': entry.name + '.' + program_name, 'name': module.name()}) except AttributeError: continue if grouped and len(programs) > 0: all_programs.append({'group': entry.name, 'programs': programs}) programs = [] if not grouped: all_programs = programs return all_programs