forked from pvx/litsimaja
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
41 lines
1.6 KiB
41 lines
1.6 KiB
from os import scandir |
|
from lib.Litsimaja import Litsimaja |
|
from 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
|
|
|