From a255b9b715ffb22ea6f785cf0b531cf1acbb75e1 Mon Sep 17 00:00:00 2001 From: l_samenv Date: Tue, 6 Jun 2023 16:20:37 +0200 Subject: [PATCH] unify do_listcfg and nicos frappy_list() --- frappyman.py | 64 ++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 45 insertions(+), 19 deletions(-) diff --git a/frappyman.py b/frappyman.py index 9d03874..d7b1163 100644 --- a/frappyman.py +++ b/frappyman.py @@ -28,6 +28,17 @@ from configparser import ConfigParser from servicemanager.base import ServiceManager, ServiceDown, UsageError +def dummy(*args, **kwds): + pass + + +class Node: + description = '' + + def __call__(self, equipment_id, description, *args, **kwds): + self.description = description + + class FrappyManager(ServiceManager): group = 'frappy' services = ('main', 'stick', 'addons') @@ -146,31 +157,45 @@ class FrappyManager(ServiceManager): def all_cfg(self, ins, service, by_dir=False): result = {} all_cfg = {} - for ins in [ins] if ins else self.info: - for service in [service] if service else self.services: - for cfgdir in self.config_dirs(ins, service): - result.setdefault(cfgdir, {}) - cfgs = result[cfgdir] - root = self.env[ins].get('FRAPPY_ROOT') - cfg_pattern ='*_cfg.py' if exists(join(root, 'frappy')) else '*.cfg' - for cfgfile in glob(join(cfgdir, cfg_pattern)): - desc = '' - try: + if not ins: + return {} + namespace = {k: dummy for k in ('Mod', 'Param', 'Command', 'Group')} + namespace['Node'] = node = Node() + for service in [service] if service else self.services: + for cfgdir in self.config_dirs(ins, service): + result.setdefault(cfgdir, {}) + cfgs = result[cfgdir] + root = self.env[ins].get('FRAPPY_ROOT') + cfg_pattern ='*_cfg.py' if exists(join(root, 'frappy')) else '*.cfg' + for cfgfile in glob(join(cfgdir, cfg_pattern)): + desc = '' + try: + if cfgfile.endswith('.py'): + node.description = '' + try: + with open(cfgfile, encoding='utf-8') as f: + exec(f.read(), namespace) + except Exception as e: + node.description = repr(e) + desc = node.description + else: parser = ConfigParser() parser.read(cfgfile) for s in parser.sections(): if s == 'NODE' or s.startswith('node '): desc = parser[s].get('description', '').split('\n')[0] break - except Exception: - pass - cfg = basename(cfgfile)[:1-len(cfg_pattern)] - if cfg not in all_cfg: - all_cfg[cfg] = desc - cfgs[cfg] = desc + except Exception: + pass + cfg = basename(cfgfile)[:1-len(cfg_pattern)] + if cfg not in all_cfg: + all_cfg[cfg] = desc + cfgs[cfg] = desc return result if by_dir else all_cfg - def do_listcfg(self, ins='', service=''): + def do_listcfg(self, ins='', service='', prt=print): + if not ins: + raise UsageError('missing instance') if service: all_cfg = self.all_cfg(ins, service, by_dir=True) else: @@ -179,10 +204,11 @@ class FrappyManager(ServiceManager): all_cfg.update(self.all_cfg(ins, service, by_dir=True)) for cfgdir, cfgs in all_cfg.items(): if cfgs: - print('\n--- %s:\n' % cfgdir) + prt('') + prt('--- %s:' % cfgdir) keylen = max(len(k) for k in cfgs) for cfg, desc in cfgs.items(): - print('%s %s' % (cfg.ljust(keylen), desc)) + prt('%s %s' % (cfg.ljust(keylen), desc)) def treat_args(self, argdict, unknown=(), extra=()): if len(unknown) == 1: