from models.base import Base from models.waypoint import Waypoint from models.sector import Sector from models.system import System from models.agent import Agent from os.path import isfile, dirname, isdir import os import json from util import * class Store: def __init__(self, data_dir): self.data_dir = data_dir self.data = {} def path(self, obj): return os.path.join(self.data_dir, obj.path()) def load(self, obj): path = self.path(obj) if not isfile(path): return obj with open(path) as f: data = json.load(f) data['store'] = self data['dirty'] = False obj.__dict__ = data def store(self, obj): path = self.path(obj) path_dir = dirname(path) data = obj.dict() if not isdir(path_dir): os.makedirs(path_dir, exist_ok=True) with open(path, 'w') as f: json.dump(data, f, indent=2) obj.dirty = False def get(self, typ, symbol): obj = typ(symbol, self) self.load(obj) self.data[symbol] = obj return obj def update(self, typ, symbol, data): obj = self.get(typ, symbol) obj.update(data) return obj def update_list(self, typ, lst): return [self.update(typ, mg(d, 'symbol'), d) for d in lst] def all(self, path, typ): if hasattr(path, 'path'): path = path.path() path = os.path.join(self.data_dir, path) if not isdir(path): return ext = '.' + typ.ext() for f in os.listdir(path): fil = os.path.join(path, f) if not isfile(fil): continue if not fil.endswith(ext): continue symbol = f[:-len(ext)] yield self.get(typ, symbol) def flush(self): for obj in self.data.values(): if obj.dirty: self.store(obj)