settings: store None in persister for non-persisting settings

This commit is contained in:
Peter F. Patel-Schneider 2022-04-25 21:57:53 -04:00
parent 055c8776cc
commit fb74e3b657
1 changed files with 18 additions and 18 deletions

View File

@ -255,10 +255,10 @@ class Setting:
# maybe we have something in the configuration. # maybe we have something in the configuration.
self._value = self._device.persister.get(self.name) self._value = self._device.persister.get(self.name)
if cached and self._value is not None: if cached and self._value is not None:
if self.persist and getattr(self._device, 'persister', None) and self.name not in self._device.persister: if getattr(self._device, 'persister', None) and self.name not in self._device.persister:
# If this is a new device (or a new setting for an old device), # If this is a new device (or a new setting for an old device),
# make sure to save its current value for the next time. # make sure to save its current value for the next time.
self._device.persister[self.name] = self._value self._device.persister[self.name] = self._value if self.persist else None
def read(self, cached=True): def read(self, cached=True):
assert hasattr(self, '_value') assert hasattr(self, '_value')
@ -275,18 +275,18 @@ class Setting:
reply = self._rw.read(self._device) reply = self._rw.read(self._device)
if reply: if reply:
self._value = self._validator.validate_read(reply) self._value = self._validator.validate_read(reply)
if self.persist and self._device.persister and self.name not in self._device.persister: if self._device.persister and self.name not in self._device.persister:
# Don't update the persister if it already has a value, # Don't update the persister if it already has a value,
# otherwise the first read might overwrite the value we wanted. # otherwise the first read might overwrite the value we wanted.
self._device.persister[self.name] = self._value self._device.persister[self.name] = self._value if self.persist else None
return self._value return self._value
def _pre_write(self, save=True): def _pre_write(self, save=True):
# Remember the value we're trying to set, even if the write fails. # Remember the value we're trying to set, even if the write fails.
# This way even if the device is offline or some other error occurs, # This way even if the device is offline or some other error occurs,
# the last value we've tried to write is remembered in the configuration. # the last value we've tried to write is remembered in the configuration.
if self.persist and self._device.persister and save: if self._device.persister and save:
self._device.persister[self.name] = self._value self._device.persister[self.name] = self._value if self.persist else None
def write(self, value, save=True): def write(self, value, save=True):
assert hasattr(self, '_value') assert hasattr(self, '_value')
@ -371,10 +371,10 @@ class Settings(Setting):
if reply: if reply:
reply_map[int(key)] = self._validator.validate_read(reply, key) reply_map[int(key)] = self._validator.validate_read(reply, key)
self._value = reply_map self._value = reply_map
if self.persist and getattr(self._device, 'persister', None) and self.name not in self._device.persister: if getattr(self._device, 'persister', None) and self.name not in self._device.persister:
# Don't update the persister if it already has a value, # Don't update the persister if it already has a value,
# otherwise the first read might overwrite the value we wanted. # otherwise the first read might overwrite the value we wanted.
self._device.persister[self.name] = self._value self._device.persister[self.name] = self._value if self.persist else None
return self._value return self._value
def read_key(self, key, cached=True): def read_key(self, key, cached=True):
@ -392,8 +392,8 @@ class Settings(Setting):
reply = self._rw.read(self._device, key) reply = self._rw.read(self._device, key)
if reply: if reply:
self._value[int(key)] = self._validator.validate_read(reply, key) self._value[int(key)] = self._validator.validate_read(reply, key)
if self.persist and getattr(self._device, 'persister', None) and self.name not in self._device.persister: if getattr(self._device, 'persister', None) and self.name not in self._device.persister:
self._device.persister[self.name] = self._value self._device.persister[self.name] = self._value if self.persist else None
return self._value[int(key)] return self._value[int(key)]
def write(self, map, save=True): def write(self, map, save=True):
@ -470,10 +470,10 @@ class LongSettings(Setting):
if reply: if reply:
reply_map[int(item)] = self._validator.validate_read_item(reply, item) reply_map[int(item)] = self._validator.validate_read_item(reply, item)
self._value = reply_map self._value = reply_map
if self.persist and getattr(self._device, 'persister', None) and self.name not in self._device.persister: if getattr(self._device, 'persister', None) and self.name not in self._device.persister:
# Don't update the persister if it already has a value, # Don't update the persister if it already has a value,
# otherwise the first read might overwrite the value we wanted. # otherwise the first read might overwrite the value we wanted.
self._device.persister[self.name] = self._value self._device.persister[self.name] = self._value if self.persist else None
return self._value return self._value
def read_item(self, item, cached=True): def read_item(self, item, cached=True):
@ -492,8 +492,8 @@ class LongSettings(Setting):
reply = self._rw.read(self._device, r) reply = self._rw.read(self._device, r)
if reply: if reply:
self._value[int(item)] = self._validator.validate_read_item(reply, item) self._value[int(item)] = self._validator.validate_read_item(reply, item)
if self.persist and getattr(self._device, 'persister', None) and self.name not in self._device.persister: if getattr(self._device, 'persister', None) and self.name not in self._device.persister:
self._device.persister[self.name] = self._value self._device.persister[self.name] = self._value if self.persist else None
return self._value[int(item)] return self._value[int(item)]
def write(self, map, save=True): def write(self, map, save=True):
@ -562,10 +562,10 @@ class BitFieldSetting(Setting):
if reply: if reply:
reply_map = self._validator.validate_read(reply) reply_map = self._validator.validate_read(reply)
self._value = reply_map self._value = reply_map
if self.persist and getattr(self._device, 'persister', None) and self.name not in self._device.persister: if getattr(self._device, 'persister', None) and self.name not in self._device.persister:
# Don't update the persister if it already has a value, # Don't update the persister if it already has a value,
# otherwise the first read might overwrite the value we wanted. # otherwise the first read might overwrite the value we wanted.
self._device.persister[self.name] = self._value self._device.persister[self.name] = self._value if self.persist else None
return self._value return self._value
def _do_read(self): def _do_read(self):
@ -587,8 +587,8 @@ class BitFieldSetting(Setting):
reply = self._do_read_key(key) reply = self._do_read_key(key)
if reply: if reply:
self._value = self._validator.validate_read(reply) self._value = self._validator.validate_read(reply)
if self.persist and getattr(self._device, 'persister', None) and self.name not in self._device.persister: if getattr(self._device, 'persister', None) and self.name not in self._device.persister:
self._device.persister[self.name] = self._value self._device.persister[self.name] = self._value if self.persist else None
return self._value[int(key)] return self._value[int(key)]
def _do_read_key(self, key): def _do_read_key(self, key):