ayaka.storage

读写本地文件

  1'''读写本地文件'''
  2import json
  3from pathlib import Path
  4from typing import TYPE_CHECKING
  5from .json_ctrl import AbstractJsonCtrl
  6
  7if TYPE_CHECKING:
  8    from .ayaka import AyakaApp
  9
 10
 11class AyakaStorage:
 12    def __init__(self, app: "AyakaApp") -> None:
 13        self.app = app
 14
 15    def plugin_path(self, *names):
 16        '''获取路径 <create_app_file>/../*names'''
 17        names = [str(name) for name in names]
 18        path = Path(self.app.path.parent, *names)
 19        return AyakaPath(path)
 20
 21    def group_path(self, *names):
 22        '''获取路径 data/groups/<bod_id>/<group_id>/<app.name>/*names'''
 23        names = [
 24            "data", "groups",
 25            self.app.bot_id,
 26            self.app.group_id,
 27            self.app.name,
 28            *names
 29        ]
 30        names = [str(name) for name in names]
 31        path = Path(*names)
 32        return AyakaPath(path)
 33
 34
 35class AyakaPath:
 36    '''文件夹路径'''
 37
 38    def __init__(self, path=Path("test")) -> None:
 39        self.path = path
 40        if not path.exists():
 41            path.mkdir(parents=True)
 42
 43    def iterdir(self):
 44        return self.path.iterdir()
 45
 46    def file(self, name, default=None):
 47        path = self.path / str(name)
 48        file = AyakaFile(path)
 49        if not path.exists() and default is not None:
 50            file.save(default)
 51        return file
 52
 53    def json(self, name, default={}):
 54        path = self.path / str(name)
 55        path = path.with_suffix(".json")
 56        file = AyakaJsonFile(path)
 57        if not path.exists():
 58            file.save(default)
 59        return file
 60
 61
 62class AyakaFile:
 63    '''文件'''
 64
 65    def __init__(self, path: Path):
 66        self.path = path
 67
 68    def load(self):
 69        with self.path.open("r", encoding="utf8") as f:
 70            data = f.read()
 71        return data
 72
 73    def save(self, data):
 74        with self.path.open("w+", encoding="utf8") as f:
 75            f.write(str(data))
 76
 77
 78class AyakaJsonFile:
 79    '''JSON文件'''
 80
 81    def __init__(self, path: Path) -> None:
 82        self.path = path
 83
 84    def chain(self, *keys):
 85        return AyakaJsonFileCtrl(self.path, *keys)
 86
 87    def load(self):
 88        with self.path.open("r", encoding="utf8") as f:
 89            data = json.load(f)
 90        return data
 91
 92    def save(self, data):
 93        with self.path.open("w+", encoding="utf8") as f:
 94            json.dump(data, f, ensure_ascii=False)
 95
 96
 97class AyakaJsonFileCtrl(AbstractJsonCtrl):
 98    '''AyakaJsonFileCtrl实际上可兼容替代AyakaJsonFile,但是为了避免语义上的混乱,仍分作两个类'''
 99
100    def __init__(self, path: Path, *keys) -> None:
101        self._path = path
102        self._keys = [str(k) for k in keys]
103
104    def _load(self):
105        with self._path.open("r", encoding="utf8") as f:
106            data = json.load(f)
107        return data
108
109    def _save(self, data):
110        with self._path.open("w+", encoding="utf8") as f:
111            json.dump(data, f, ensure_ascii=False)
112
113    def chain(self, *keys):
114        return AyakaJsonFileCtrl(self._path, *self._keys, *keys)
class AyakaStorage:
12class AyakaStorage:
13    def __init__(self, app: "AyakaApp") -> None:
14        self.app = app
15
16    def plugin_path(self, *names):
17        '''获取路径 <create_app_file>/../*names'''
18        names = [str(name) for name in names]
19        path = Path(self.app.path.parent, *names)
20        return AyakaPath(path)
21
22    def group_path(self, *names):
23        '''获取路径 data/groups/<bod_id>/<group_id>/<app.name>/*names'''
24        names = [
25            "data", "groups",
26            self.app.bot_id,
27            self.app.group_id,
28            self.app.name,
29            *names
30        ]
31        names = [str(name) for name in names]
32        path = Path(*names)
33        return AyakaPath(path)
AyakaStorage(app: ayaka.ayaka.AyakaApp)
13    def __init__(self, app: "AyakaApp") -> None:
14        self.app = app
def plugin_path(self, *names):
16    def plugin_path(self, *names):
17        '''获取路径 <create_app_file>/../*names'''
18        names = [str(name) for name in names]
19        path = Path(self.app.path.parent, *names)
20        return AyakaPath(path)

获取路径 /../*names

def group_path(self, *names):
22    def group_path(self, *names):
23        '''获取路径 data/groups/<bod_id>/<group_id>/<app.name>/*names'''
24        names = [
25            "data", "groups",
26            self.app.bot_id,
27            self.app.group_id,
28            self.app.name,
29            *names
30        ]
31        names = [str(name) for name in names]
32        path = Path(*names)
33        return AyakaPath(path)

获取路径 data/groups////*names

class AyakaPath:
36class AyakaPath:
37    '''文件夹路径'''
38
39    def __init__(self, path=Path("test")) -> None:
40        self.path = path
41        if not path.exists():
42            path.mkdir(parents=True)
43
44    def iterdir(self):
45        return self.path.iterdir()
46
47    def file(self, name, default=None):
48        path = self.path / str(name)
49        file = AyakaFile(path)
50        if not path.exists() and default is not None:
51            file.save(default)
52        return file
53
54    def json(self, name, default={}):
55        path = self.path / str(name)
56        path = path.with_suffix(".json")
57        file = AyakaJsonFile(path)
58        if not path.exists():
59            file.save(default)
60        return file

文件夹路径

AyakaPath(path=WindowsPath('test'))
39    def __init__(self, path=Path("test")) -> None:
40        self.path = path
41        if not path.exists():
42            path.mkdir(parents=True)
def iterdir(self):
44    def iterdir(self):
45        return self.path.iterdir()
def file(self, name, default=None):
47    def file(self, name, default=None):
48        path = self.path / str(name)
49        file = AyakaFile(path)
50        if not path.exists() and default is not None:
51            file.save(default)
52        return file
def json(self, name, default={}):
54    def json(self, name, default={}):
55        path = self.path / str(name)
56        path = path.with_suffix(".json")
57        file = AyakaJsonFile(path)
58        if not path.exists():
59            file.save(default)
60        return file
class AyakaFile:
63class AyakaFile:
64    '''文件'''
65
66    def __init__(self, path: Path):
67        self.path = path
68
69    def load(self):
70        with self.path.open("r", encoding="utf8") as f:
71            data = f.read()
72        return data
73
74    def save(self, data):
75        with self.path.open("w+", encoding="utf8") as f:
76            f.write(str(data))

文件

AyakaFile(path: pathlib.Path)
66    def __init__(self, path: Path):
67        self.path = path
def load(self):
69    def load(self):
70        with self.path.open("r", encoding="utf8") as f:
71            data = f.read()
72        return data
def save(self, data):
74    def save(self, data):
75        with self.path.open("w+", encoding="utf8") as f:
76            f.write(str(data))
class AyakaJsonFile:
79class AyakaJsonFile:
80    '''JSON文件'''
81
82    def __init__(self, path: Path) -> None:
83        self.path = path
84
85    def chain(self, *keys):
86        return AyakaJsonFileCtrl(self.path, *keys)
87
88    def load(self):
89        with self.path.open("r", encoding="utf8") as f:
90            data = json.load(f)
91        return data
92
93    def save(self, data):
94        with self.path.open("w+", encoding="utf8") as f:
95            json.dump(data, f, ensure_ascii=False)

JSON文件

AyakaJsonFile(path: pathlib.Path)
82    def __init__(self, path: Path) -> None:
83        self.path = path
def chain(self, *keys):
85    def chain(self, *keys):
86        return AyakaJsonFileCtrl(self.path, *keys)
def load(self):
88    def load(self):
89        with self.path.open("r", encoding="utf8") as f:
90            data = json.load(f)
91        return data
def save(self, data):
93    def save(self, data):
94        with self.path.open("w+", encoding="utf8") as f:
95            json.dump(data, f, ensure_ascii=False)
class AyakaJsonFileCtrl(ayaka.json_ctrl.AbstractJsonCtrl):
 98class AyakaJsonFileCtrl(AbstractJsonCtrl):
 99    '''AyakaJsonFileCtrl实际上可兼容替代AyakaJsonFile,但是为了避免语义上的混乱,仍分作两个类'''
100
101    def __init__(self, path: Path, *keys) -> None:
102        self._path = path
103        self._keys = [str(k) for k in keys]
104
105    def _load(self):
106        with self._path.open("r", encoding="utf8") as f:
107            data = json.load(f)
108        return data
109
110    def _save(self, data):
111        with self._path.open("w+", encoding="utf8") as f:
112            json.dump(data, f, ensure_ascii=False)
113
114    def chain(self, *keys):
115        return AyakaJsonFileCtrl(self._path, *self._keys, *keys)

AyakaJsonFileCtrl实际上可兼容替代AyakaJsonFile,但是为了避免语义上的混乱,仍分作两个类

AyakaJsonFileCtrl(path: pathlib.Path, *keys)
101    def __init__(self, path: Path, *keys) -> None:
102        self._path = path
103        self._keys = [str(k) for k in keys]
def chain(self, *keys):
114    def chain(self, *keys):
115        return AyakaJsonFileCtrl(self._path, *self._keys, *keys)