from copy import deepcopy from dataclasses import dataclass from nullptr.util import sg @dataclass class Base: symbol: str store: object def __init__(self, symbol, store): self.store = store self.symbol = symbol def __hash__(self): return hash(self.symbol) def seta(self, attr, d, name=None): if name is None: name = attr val = sg(d, name) if val is not None: setattr(self, attr, val) def setlst(self, attr, d, name, member): val = sg(d, name) if val is not None: lst = [sg(x, member) for x in val] setattr(self, attr, lst) def __setattr__(self, name, value): if name not in ['symbol','store']: self.store.dirty(self) super().__setattr__(name, value) def update(self, d): pass def dict(self): r = {} for k,v in self.__dict__.items(): if k == 'store': continue r[k] = deepcopy(v) return r def path(self): raise NotImplementedError('path') @classmethod def ext(self): raise NotImplementedError('extension') def type(self): return self.__class__.__name__ def __str__(self): return self.f() def f(self, detail=1): r = self.symbol if detail > 1: r += '.' + self.ext() return r