|
@@ -30,16 +30,17 @@ class TrackedDict(dict):
|
30
|
30
|
|
31
|
31
|
def __init__(self, seq=None, **kwargs):
|
32
|
32
|
self.key = kwargs.pop('key')
|
|
33
|
+ self.original_key = kwargs.pop('original_key')
|
33
|
34
|
self.shared = kwargs.pop('shared')
|
34
|
35
|
super().__init__(seq, **kwargs)
|
35
|
36
|
|
36
|
37
|
def __setitem__(self, key, value):
|
37
|
38
|
super().__setitem__(key, value)
|
38
|
|
- self.shared.set(self.key, dict(self))
|
|
39
|
+ self.shared.set(self.key, dict(self), original_key=self.original_key)
|
39
|
40
|
|
40
|
41
|
def setdefault(self, k, d=None):
|
41
|
42
|
v = super().setdefault(k, d)
|
42
|
|
- self.shared.set(self.key, dict(self))
|
|
43
|
+ self.shared.set(self.key, dict(self), original_key=self.original_key)
|
43
|
44
|
return v
|
44
|
45
|
# TODO: Cover all methods
|
45
|
46
|
|
|
@@ -49,12 +50,13 @@ class TrackedList(list):
|
49
|
50
|
|
50
|
51
|
def __init__(self, seq=(), **kwargs):
|
51
|
52
|
self.key = kwargs.pop('key')
|
|
53
|
+ self.original_key = kwargs.pop('original_key')
|
52
|
54
|
self.shared = kwargs.pop('shared')
|
53
|
55
|
super().__init__(seq)
|
54
|
56
|
|
55
|
57
|
def append(self, p_object):
|
56
|
58
|
super().append(p_object)
|
57
|
|
- self.shared.set(self.key, list(self))
|
|
59
|
+ self.shared.set(self.key, list(self), original_key=self.original_key)
|
58
|
60
|
|
59
|
61
|
# TODO: Cover all methods
|
60
|
62
|
|
|
@@ -86,15 +88,20 @@ class SharedDataManager(object):
|
86
|
88
|
self.commit()
|
87
|
89
|
self._data = {}
|
88
|
90
|
|
89
|
|
- def set(self, key: str, value: typing.Any) -> None:
|
|
91
|
+ def set(self, key: str, value: typing.Any, original_key: str=None) -> None:
|
90
|
92
|
try:
|
91
|
|
- special_type = self._special_types[key]
|
92
|
|
- value = special_type(value, key=key, shared=self)
|
|
93
|
+ special_type, original_key_ = self._special_types[key]
|
|
94
|
+ value = special_type(value, key=key, shared=self, original_key=original_key)
|
93
|
95
|
except KeyError:
|
94
|
|
- pass
|
|
96
|
+ try:
|
|
97
|
+ # TODO: Code degeu pour gerer les {id}_truc
|
|
98
|
+ special_type, original_key_ = self._special_types[original_key]
|
|
99
|
+ value = special_type(value, key=key, shared=self, original_key=original_key)
|
|
100
|
+ except KeyError:
|
|
101
|
+ pass
|
95
|
102
|
|
96
|
103
|
self._data[key] = value
|
97
|
|
- self._modified_keys.add(key)
|
|
104
|
+ self._modified_keys.add((key, original_key))
|
98
|
105
|
|
99
|
106
|
def get(self, *key_args: typing.Union[str, float, int]) -> typing.Any:
|
100
|
107
|
key = '_'.join([str(v) for v in key_args])
|
|
@@ -111,25 +118,31 @@ class SharedDataManager(object):
|
111
|
118
|
special_type = None
|
112
|
119
|
|
113
|
120
|
try:
|
114
|
|
- special_type = self._special_types[key]
|
|
121
|
+ special_type, original_key = self._special_types[key]
|
115
|
122
|
except KeyError:
|
116
|
123
|
pass
|
117
|
124
|
|
118
|
125
|
if special_type:
|
119
|
|
- self._data[key] = special_type(value, key=key, shared=self)
|
|
126
|
+ self._data[key] = special_type(value, key=key, shared=self, original_key=original_key)
|
120
|
127
|
else:
|
121
|
128
|
self._data[key] = value
|
122
|
129
|
|
123
|
130
|
return self._data[key]
|
124
|
131
|
|
125
|
132
|
def commit(self) -> None:
|
126
|
|
- for key in self._modified_keys:
|
|
133
|
+ for key, original_key in self._modified_keys:
|
127
|
134
|
try:
|
128
|
|
- special_type = self._special_types[key]
|
|
135
|
+ special_type, original_key = self._special_types[key]
|
129
|
136
|
value = special_type.base(self.get(key))
|
130
|
137
|
self._r.set(key, pickle.dumps(value))
|
131
|
138
|
except KeyError:
|
132
|
|
- self._r.set(key, pickle.dumps(self.get(key)))
|
|
139
|
+ # Code degeu pour gerer les {id}_truc
|
|
140
|
+ try:
|
|
141
|
+ special_type, original_key = self._special_types[original_key]
|
|
142
|
+ value = special_type.base(self.get(key))
|
|
143
|
+ self._r.set(key, pickle.dumps(value))
|
|
144
|
+ except KeyError:
|
|
145
|
+ self._r.set(key, pickle.dumps(self.get(key)))
|
133
|
146
|
self._modified_keys = set()
|
134
|
147
|
|
135
|
148
|
def refresh(self) -> None:
|
|
@@ -156,11 +169,11 @@ class SharedDataManager(object):
|
156
|
169
|
indexes = indexes or []
|
157
|
170
|
|
158
|
171
|
if type(value) is dict:
|
159
|
|
- value = TrackedDict(value, key=key, shared=shared)
|
160
|
|
- self._special_types[key] = TrackedDict
|
|
172
|
+ value = TrackedDict(value, key=key, shared=shared, original_key=key)
|
|
173
|
+ self._special_types[key] = TrackedDict, key
|
161
|
174
|
elif type(value) is list:
|
162
|
|
- value = TrackedList(value, key=key, shared=shared)
|
163
|
|
- self._special_types[key] = TrackedList
|
|
175
|
+ value = TrackedList(value, key=key, shared=shared, original_key=key)
|
|
176
|
+ self._special_types[key] = TrackedList, key
|
164
|
177
|
|
165
|
178
|
def get_key(obj):
|
166
|
179
|
return key
|
|
@@ -186,7 +199,7 @@ class SharedDataManager(object):
|
186
|
199
|
except UnknownSharedData:
|
187
|
200
|
pass # If no shared data, no previous value to remove
|
188
|
201
|
|
189
|
|
- self.set(key_formatter(self_), value_)
|
|
202
|
+ self.set(key_formatter(self_), value_, original_key=key)
|
190
|
203
|
|
191
|
204
|
for index in indexes:
|
192
|
205
|
index.add(value_)
|