Skip to content

Commit 17f6750

Browse files
Fix merging nested bigmapdiffs (#28)
1 parent 7309e56 commit 17f6750

File tree

1 file changed

+27
-11
lines changed

1 file changed

+27
-11
lines changed

src/dipdup/models.py

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -67,25 +67,26 @@ class OperationData:
6767
def _merge_bigmapdiffs(self, storage_dict: Dict[str, Any], bigmap_name: str, array: bool) -> None:
6868
if self.diffs is None:
6969
raise Exception('`bigmaps` field missing')
70+
_logger.debug(bigmap_name)
7071
bigmapdiffs = [bm for bm in self.diffs if bm['path'] == bigmap_name]
72+
bigmap_key = bigmap_name.split('.')[-1]
7173
for diff in bigmapdiffs:
7274
_logger.debug('Applying bigmapdiff: %s', diff)
7375
if diff['action'] in ('add_key', 'update_key'):
7476
key = diff['content']['key']
7577
if array is True:
76-
storage_dict[bigmap_name].append({'key': key, 'value': diff['content']['value']})
78+
storage_dict[bigmap_key].append({'key': key, 'value': diff['content']['value']})
7779
else:
78-
storage_dict[bigmap_name][key] = diff['content']['value']
80+
storage_dict[bigmap_key][key] = diff['content']['value']
7981

80-
def get_merged_storage(self, storage_type: Type[StorageType]) -> StorageType:
81-
if self.storage is None:
82-
raise Exception('`storage` field missing')
83-
84-
storage = deepcopy(self.storage)
85-
_logger.debug('Merging storage')
86-
_logger.debug('Before: %s', storage)
82+
def _process_storage(self, storage_type: Type[StorageType], storage: Dict, prefix: str = None):
8783
for key, field in storage_type.__fields__.items():
8884

85+
bigmap_name = key if prefix is None else '.'.join([prefix, key])
86+
87+
if key == '__root__':
88+
continue
89+
8990
if field.alias:
9091
key = field.alias
9192

@@ -95,11 +96,26 @@ def get_merged_storage(self, storage_type: Type[StorageType]) -> StorageType:
9596
if hasattr(field.type_, '__fields__') and 'key' in field.type_.__fields__ and 'value' in field.type_.__fields__:
9697
storage[key] = []
9798
if self.diffs:
98-
self._merge_bigmapdiffs(storage, key, array=True)
99+
self._merge_bigmapdiffs(storage, bigmap_name, array=True)
99100
else:
100101
storage[key] = {}
101102
if self.diffs:
102-
self._merge_bigmapdiffs(storage, key, array=False)
103+
self._merge_bigmapdiffs(storage, bigmap_name, array=False)
104+
elif hasattr(field.type_, '__fields__') and isinstance(storage[key], dict):
105+
storage[key] = self._process_storage(field.type_, storage[key], bigmap_name)
106+
107+
return storage
108+
109+
def get_merged_storage(self, storage_type: Type[StorageType]) -> StorageType:
110+
if self.storage is None:
111+
raise Exception('`storage` field missing')
112+
113+
storage = deepcopy(self.storage)
114+
_logger.debug('Merging storage')
115+
_logger.debug('Before: %s', storage)
116+
_logger.debug('Diffs: %s', self.diffs)
117+
118+
storage = self._process_storage(storage_type, storage, None)
103119

104120
_logger.debug('After: %s', storage)
105121

0 commit comments

Comments
 (0)