improved code for envlist modification

previous matching devices are removed, also when
the previous was an alias pointing to the same device
This commit is contained in:
2022-08-25 09:29:25 +02:00
parent a3e5dd6af6
commit cbbec5647c

View File

@ -31,7 +31,7 @@ import os
from os.path import expanduser
from nicos import config, session
from nicos.core import Override, Param, Moveable, status
from nicos.core import Override, Param, Moveable, status, DeviceAlias
from nicos.devices.secop import SecNodeDevice
from nicos.core import Device, anytype, listof
from nicos.utils.comparestrings import compare
@ -133,8 +133,13 @@ class FrappyConfig(Device):
meaning_name, importance = meaning
sample_devices.setdefault(meaning_name, []).append((importance, devname))
devset = set()
newenv = {e: 1 for e in session.experiment.envlist} # use dict instead of set because of order
envlist = list(session.experiment.envlist)
prev_env_alias = {} # dict [devname] of aliasname of previous aliases in envlist
for devname in envlist:
dev = session.device.get(devname)
if isinstance(dev, DeviceAlias):
prev_env_alias[devname] = dev.alias
newenv = {}
for meaning in self.meanings:
info = getattr(self, meaning)
aliasnames = info.get('alias')
@ -162,20 +167,21 @@ class FrappyConfig(Device):
session.log.debug('create alias %r -> %r', aliasname, devname)
aliasdev = session.createDevice(aliasname, recreate=True, explicit=True)
aliasdev.alias = devname
# only the first item of aliasnames is added to the envlist
aliasname = aliasnames[0]
if devname not in devset and info.get('envlist', True):
# take only the first one
if devname in envlist:
envlist.remove(devname)
else:
prev_alias = prev_env_alias[devname]
if prev_alias in envlist:
envlist.remove(prev_alias)
if devname not in newenv and info.get('envlist', True):
# example: when 'temperature' and 'temperature_regulation' are the
# same device, it is not added twice
devset.add(devname)
newenv[aliasname] = 1
elif aliasname in newenv:
newenv.pop(aliasname, None)
# same device, the first one is kept
newenv[devname] = aliasname
break
else:
for aliasname in aliasnames:
if aliasname in newenv:
newenv.pop(aliasname, None)
envlist = [k for k in envlist if k not in aliasnames]
for aliasname in previous_aliases:
session.destroyDevice(aliasname)
@ -183,8 +189,10 @@ class FrappyConfig(Device):
session.dynamic_devices.pop(aliasname, None)
applyAliasConfig() # for other aliases
if set(newenv) != set(session.experiment.envlist):
session.experiment.setEnvironment(list(newenv))
envlist.extend(newenv.values())
if set(envlist) != set(session.experiment.envlist):
session.experiment.setEnvironment(envlist)
session.log.info('changed environment to: %s', ', '.join(session.experiment.envlist))