separate value in slave
This commit is contained in:
@ -47,7 +47,7 @@ class StorageBase(object):
|
||||
'_master_slaves',
|
||||
'_choice_values',
|
||||
'_choice_values_params',
|
||||
#autre
|
||||
#other
|
||||
'_state_master_slaves',
|
||||
'_state_callback',
|
||||
'_state_callback_params',
|
||||
|
@ -15,8 +15,8 @@
|
||||
# You should have received a copy of the GNU Lesser General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
# ____________________________________________________________
|
||||
from copy import copy
|
||||
from ..util import Cache
|
||||
from tiramisu.setting import undefined
|
||||
|
||||
|
||||
class Values(Cache):
|
||||
@ -25,52 +25,167 @@ class Values(Cache):
|
||||
def __init__(self, storage):
|
||||
"""init plugin means create values storage
|
||||
"""
|
||||
self._values = {}
|
||||
self._values = (tuple(), tuple(), tuple(), tuple())
|
||||
self._informations = {}
|
||||
# should init cache too
|
||||
super(Values, self).__init__(storage)
|
||||
|
||||
# value
|
||||
def setvalue(self, path, value, owner):
|
||||
def setvalue(self, path, value, owner, index):
|
||||
"""set value for a path
|
||||
a specified value must be associated to an owner
|
||||
"""
|
||||
self._values[path] = (owner, value)
|
||||
values = []
|
||||
vidx = None
|
||||
|
||||
def getvalue(self, path):
|
||||
def _setvalue_info(nb, idx, value, vidx):
|
||||
lst = list(self._values[nb])
|
||||
if idx is None:
|
||||
if index is None or nb == 0:
|
||||
lst.append(value)
|
||||
else:
|
||||
lst.append([value])
|
||||
else:
|
||||
if index is None or nb == 0:
|
||||
lst[idx] = value
|
||||
else:
|
||||
if nb == 1:
|
||||
try:
|
||||
vidx = lst[idx].index(index)
|
||||
except ValueError:
|
||||
vidx = None
|
||||
if vidx is None:
|
||||
lst[idx].append(value)
|
||||
elif nb != 1:
|
||||
lst[idx][vidx] = value
|
||||
values.append(tuple(lst))
|
||||
return vidx
|
||||
try:
|
||||
idx = self._values[0].index(path)
|
||||
except ValueError:
|
||||
idx = None
|
||||
vidx = _setvalue_info(0, idx, path, vidx)
|
||||
vidx = _setvalue_info(1, idx, index, vidx)
|
||||
vidx = _setvalue_info(2, idx, value, vidx)
|
||||
_setvalue_info(3, idx, owner, vidx)
|
||||
self._values = tuple(values)
|
||||
|
||||
def getvalue(self, path, index=None):
|
||||
"""get value for a path
|
||||
return: only value, not the owner
|
||||
"""
|
||||
return self._values[path][1]
|
||||
return self._getvalue(path, 2, index)
|
||||
|
||||
def hasvalue(self, path):
|
||||
def hasvalue(self, path, index=None):
|
||||
"""if path has a value
|
||||
return: boolean
|
||||
"""
|
||||
return path in self._values
|
||||
return path in self._values[0]
|
||||
|
||||
def resetvalue(self, path):
|
||||
"""remove value means delete value in storage
|
||||
"""
|
||||
del(self._values[path])
|
||||
def _resetvalue(nb):
|
||||
lst = list(self._values[nb])
|
||||
lst.pop(idx)
|
||||
values.append(tuple(lst))
|
||||
values = []
|
||||
idx = self._values[0].index(path)
|
||||
_resetvalue(0)
|
||||
_resetvalue(1)
|
||||
_resetvalue(2)
|
||||
_resetvalue(3)
|
||||
self._values = tuple(values)
|
||||
|
||||
def get_modified_values(self):
|
||||
"""return all values in a dictionary
|
||||
example: {'path1': (owner, 'value1'), 'path2': (owner, 'value2')}
|
||||
"""
|
||||
return copy(self._values)
|
||||
values = {}
|
||||
for idx, path in enumerate(self._values[0]):
|
||||
values[path] = (self._values[3][idx], self._values[2][idx])
|
||||
return values
|
||||
|
||||
# owner
|
||||
def setowner(self, path, owner):
|
||||
def setowner(self, path, owner, index=None):
|
||||
"""change owner for a path
|
||||
"""
|
||||
self._values[path] = (owner, self._values[path][1])
|
||||
idx = self._values[0].index(path)
|
||||
if isinstance(self._values[3][idx], list):
|
||||
if index is None:
|
||||
raise ValueError('list but no index')
|
||||
owner = list(self._values[3][idx])[index] = owner
|
||||
elif index is not None:
|
||||
raise ValueError('index set but not a list')
|
||||
lst = list(self._values[3])
|
||||
lst[idx] = owner
|
||||
values = list(self._values)
|
||||
values[3] = tuple(lst)
|
||||
self._values = tuple(values)
|
||||
|
||||
def getowner(self, path, default):
|
||||
def get_max_length(self, path):
|
||||
try:
|
||||
idx = self._values[0].index(path)
|
||||
except ValueError:
|
||||
return 0
|
||||
return max(self._values[1][idx]) + 1
|
||||
|
||||
def getowner(self, path, default, index=None, only_default=False):
|
||||
"""get owner for a path
|
||||
return: owner object
|
||||
"""
|
||||
return self._values.get(path, (default, None))[0]
|
||||
if index is None:
|
||||
if only_default:
|
||||
if path in self._values[0]:
|
||||
return None
|
||||
else:
|
||||
return default
|
||||
val = self._getvalue(path, 3, index)
|
||||
if val is None:
|
||||
return default
|
||||
return val
|
||||
else:
|
||||
value = self._getvalue(path, 3, index)
|
||||
if value is None:
|
||||
return default
|
||||
else:
|
||||
return value
|
||||
|
||||
def _getvalue(self, path, nb, index):
|
||||
"""
|
||||
_values == ((path1, path2), ((value1_1, value1_2), value2), ((owner1_1, owner1_2), owner2), ((idx1_1, idx1_2), None))
|
||||
"""
|
||||
try:
|
||||
idx = self._values[0].index(path)
|
||||
except ValueError:
|
||||
value = None
|
||||
else:
|
||||
if isinstance(self._values[1][idx], list):
|
||||
if index is None:
|
||||
raise ValueError('list but no index')
|
||||
elif index is not None:
|
||||
raise ValueError('index set but not a list')
|
||||
|
||||
if self._values[1][idx] is None:
|
||||
if index is None:
|
||||
value = self._values[nb][idx]
|
||||
else:
|
||||
value = self._values[nb][idx][index]
|
||||
else:
|
||||
if index is not None:
|
||||
try:
|
||||
subidx = self._values[1][idx].index(index)
|
||||
value = self._values[nb][idx][subidx]
|
||||
except ValueError:
|
||||
value = None
|
||||
else:
|
||||
value = []
|
||||
for i in xrange(0, max(self._values[1][idx])):
|
||||
if i in self._values[1][idx]:
|
||||
value.append(self._values[nb][idx][self._values[1][idx].index(i)])
|
||||
else:
|
||||
value.append(undefined)
|
||||
return value
|
||||
|
||||
def set_information(self, key, value):
|
||||
"""updates the information's attribute
|
||||
|
@ -47,11 +47,20 @@ class Cache(object):
|
||||
value = getattr(self, slot)
|
||||
#value has owners object, need 'str()' it
|
||||
if slot == '_values':
|
||||
_value = {}
|
||||
for key, values in value.items():
|
||||
vals = list(values)
|
||||
vals[0] = str(vals[0])
|
||||
_value[key] = tuple(vals)
|
||||
_value = []
|
||||
_value.append(value[0])
|
||||
_value.append(value[1])
|
||||
str_owner = []
|
||||
_value.append(value[2])
|
||||
for owner in value[3]:
|
||||
if isinstance(owner, list):
|
||||
str_owners = []
|
||||
for subowner in owner:
|
||||
str_owners.append(str(subowner))
|
||||
str_owner.append(str_owners)
|
||||
else:
|
||||
str_owner.append(str(owner))
|
||||
_value.append(str_owner)
|
||||
states[slot] = _value
|
||||
else:
|
||||
states[slot] = value
|
||||
@ -60,19 +69,32 @@ class Cache(object):
|
||||
return states
|
||||
|
||||
def __setstate__(self, states):
|
||||
def convert_owner(owner):
|
||||
try:
|
||||
owner = getattr(owners, owner)
|
||||
except AttributeError:
|
||||
owners.addowner(owner)
|
||||
owner = getattr(owners, owner)
|
||||
return owner
|
||||
|
||||
for key, value in states.items():
|
||||
#value has owners object, need to reconstruct it
|
||||
if key == '_values':
|
||||
_value = {}
|
||||
for key_, values_ in value.items():
|
||||
vals = list(values_)
|
||||
try:
|
||||
vals[0] = getattr(owners, vals[0])
|
||||
except AttributeError:
|
||||
owners.addowner(vals[0])
|
||||
vals[0] = getattr(owners, vals[0])
|
||||
_value[key_] = tuple(vals)
|
||||
value = _value
|
||||
_value = []
|
||||
_value.append(value[0])
|
||||
_value.append(value[1])
|
||||
_value.append(value[2])
|
||||
obj_owner = []
|
||||
for owner in value[3]:
|
||||
if isinstance(owner, list):
|
||||
obj_owners = []
|
||||
for subowner in owner:
|
||||
obj_owners.append(convert_owner(subowner))
|
||||
obj_owner.append(tuple(obj_owners))
|
||||
else:
|
||||
obj_owner.append(convert_owner(owner))
|
||||
_value.append(tuple(obj_owner))
|
||||
value = tuple(_value)
|
||||
setattr(self, key, value)
|
||||
|
||||
def setcache(self, path, val, time):
|
||||
|
Reference in New Issue
Block a user