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