Source code for flytrap.sessions

import json
from collections.abc import Mapping
from copy import deepcopy
from pathlib import Path


[docs]def nested_update(d, u): for k, v in u.items(): if isinstance(v, Mapping): d[k] = nested_update(d.get(k, {}), v) else: d[k] = v return d
BASE_DIR = Path(__file__).absolute().parent.parent SESSION_DIR = BASE_DIR / "session" # Импровизированная база данных _stack = dict()
[docs]class SessionBD: def _init_file(self): if not SESSION_DIR.is_dir(): SESSION_DIR.mkdir() self._file = SESSION_DIR / f"{self._session_id}.json" if not self._file.exists(): self.write({}) def __init__(self, session_id: str): self._session_id = session_id self._init_file()
[docs] def update(self, data: dict): d = self.get() nested_update(d, data) self.set(d)
[docs] def set(self, data): global _stack # Никакой грязной записи! # Мы сохраняем только полную последнюю копию из оперативной памяти, # Что означает, что сессия не должна жить долго. Это нам подходит, так как сессии по идеи одноразовые _stack[self._session_id] = deepcopy(data) self.write(data)
[docs] def write(self, data): with open(self._file, "w") as sf: json.dump(data, sf, ensure_ascii=False, sort_keys=True, indent=4)
[docs] def get(self) -> dict: global _stack return deepcopy(_stack.get(self._session_id, dict()))
[docs] def read(self) -> dict: data = dict() with self._file.open("r") as sf: data = json.load(sf) return data