From eeb063f307b9c4799317b6ae8ecc2ff9f4662c03 Mon Sep 17 00:00:00 2001 From: Richard Bronkhorst Date: Fri, 9 Jun 2023 22:20:46 +0200 Subject: [PATCH] Store setup --- command_line.py | 1 - commander.py | 7 +++++++ models/base.py | 9 +++++++++ models/system.py | 4 ++++ store.py | 45 ++++++++++++++++++++++++++++++++++++++++----- 5 files changed, 60 insertions(+), 6 deletions(-) diff --git a/command_line.py b/command_line.py index 75903fe..050b5b2 100644 --- a/command_line.py +++ b/command_line.py @@ -42,7 +42,6 @@ class CommandLine: def do_quit(self): print('byebye!') self.stopping = True - def do_reload(self): self.reloading = True diff --git a/commander.py b/commander.py index d6bd555..2883d54 100644 --- a/commander.py +++ b/commander.py @@ -10,7 +10,14 @@ class Commander(CommandLine): def do_foo(self): self.store.foo() + self.store.flush() def main(args): + c = Commander(args.store_dir) + c.run() + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('-s', '--store-dir', default='data') args = parser.parse_args() main(args) diff --git a/models/base.py b/models/base.py index 6a306e4..b1e39be 100644 --- a/models/base.py +++ b/models/base.py @@ -1,9 +1,18 @@ +from copy import deepcopy + class Base: symbol: str def __init__(self, symbol, store): self.symbol = symbol self.store = store + self.dirty = True + + def dict(self): + r = deepcopy(self.__dict__) + del r['store'] + del r['dirty'] + return r def path(self): raise NotImplementedError('path') diff --git a/models/system.py b/models/system.py index d15db70..5778003 100644 --- a/models/system.py +++ b/models/system.py @@ -5,3 +5,7 @@ from .base import Base class System(Base): def ext(self): return 'stm' + + def path(self): + sector, symbol = self.symbol.split('-') + return f'atlas/{sector}/{symbol}.{self.ext()}' diff --git a/store.py b/store.py index 72bdbe3..16c481a 100644 --- a/store.py +++ b/store.py @@ -3,12 +3,47 @@ from models.waypoint import Waypoint from models.sector import Sector from models.system import System from models.setting import Setting +from os.path import isfile, dirname, isdir +import os +import json class Store: - def __init__(self, fil): - pass + 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 + 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 flush(self): + for obj in self.data.values(): + self.store(obj) + def foo(self): - w = Waypoint('jdjdj', self) - print(w.__dict__) - + s = self.get(System, 'dez-hq14') + print(s)