Coverage for gidappdata\standard_appdata\appdata_storager.py : 87%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1# region [Imports]
4from pprint import pformat
5from enum import Enum, auto
6import os
7import sys
8import shutil
9import logging
10from gidappdata.utility.functions import appendwriteit, linereadit, pathmaker, readit, writeit, writejson, loadjson, create_folder
12import gidlogger as glog
14import appdirs
16# endregion [Imports]
19# region [Logging]
21log = logging.getLogger('gidappdata')
22log.info(glog.imported(__name__))
24# endregion [Logging]
27# region [Constants]
30# endregion [Constants]
33class _AppDataFolder(Enum):
34 AllFolder = auto()
35 LogFolder = "log_folder"
36 AppStorageFolder = "appstorage_folder"
39class AppDataStorager:
40 # region [ClassAttributes]
42 AllFolder = _AppDataFolder.AllFolder
43 LogFolder = _AppDataFolder.LogFolder
44 AppStorageFolder = _AppDataFolder.AppStorageFolder
46# endregion[ClassAttributes]
47# region [Init]
49 def __init__(self, author_name: str, app_name: str, dev: bool = False, redirect: str = None, log_folder: str = None):
50 # sourcery skip: simplify-boolean-comparison
51 self.dev = dev
52 self.author_name = author_name
53 self.app_name = app_name
54 self.redirect = redirect
55 self.managed_folder = []
56 self.operating_system = sys.platform
57 self.appstorage_folder = None if self.dev is False else self.redirect
58 self.log_folder = None if self.dev is False else pathmaker(log_folder, 'logs')
59 if self.dev is False:
60 self.setup_app_storage_base()
62# endregion[Init]
63# region [Properties]
65 @property
66 def folder(self):
67 _out = {}
68 for dirname, dirlist, _ in os.walk(self.appstorage_folder):
69 for _dir in dirlist:
70 _out[_dir] = pathmaker(dirname, _dir)
71 return _out
73 @property
74 def files(self):
75 _out = {}
76 for dirname, _, filelist in os.walk(self.appstorage_folder):
77 for _file in filelist:
78 _out[_file] = pathmaker(dirname, _file)
79 return _out
81# endregion[Properties]
83 def setup_app_storage_base(self):
84 self.appstorage_folder = pathmaker(appdirs.user_data_dir(appauthor=self.author_name, appname=self.app_name, roaming=True))
85 self.managed_folder.append(self.appstorage_folder)
86 if os.path.isdir(self.appstorage_folder) is False:
87 os.makedirs(self.appstorage_folder)
89 self.log_folder = pathmaker(appdirs.user_log_dir(appauthor=self.author_name, appname=self.app_name, opinion=True))
90 self.managed_folder.append(self.log_folder)
91 if os.path.isdir(self.log_folder) is False:
92 os.makedirs(self.log_folder)
94 def add_folder(self, folder_name, parent_folder=None):
95 if parent_folder is None:
96 _folder = pathmaker(self.appstorage_folder, folder_name)
97 else:
98 _folder = pathmaker(self[parent_folder], folder_name)
99 if os.path.isdir(_folder) is False:
100 os.makedirs(_folder)
102 def copy_file(self, source, target_filename, folder=None, overwrite=False):
103 _path = self._get_filepath(target_filename, folder)
104 if os.path.isfile(_path) is False or overwrite is True:
105 shutil.copyfile(source, _path)
107 def _get_filepath(self, filename, folder):
108 if folder is not None:
109 return pathmaker(self.folder[folder], filename)
110 else:
111 return pathmaker(self.appstorage_folder, filename)
113 def _get_app_base_folder(self, in_folder):
114 _folder = in_folder
115 while os.path.basename(_folder) != self.author_name:
116 _folder = _folder.rsplit('/', 1)[0]
117 return _folder
119 def clean(self, folder_to_clean: _AppDataFolder):
120 _to_delete = []
121 if folder_to_clean is self.AllFolder:
122 _to_delete = self.managed_folder
123 else:
124 _to_delete.append(getattr(self, folder_to_clean.value))
126 for _folder in _to_delete:
127 _base_folder = self._get_app_base_folder(_folder)
128 shutil.rmtree(_base_folder)
129 log.info('deleted appdata folder "%s"', _base_folder)
131# region [SpecialMethods]
133 def __getitem__(self, key):
134 if '/' in pathmaker(key):
135 first_part, *other_parts = pathmaker(key).split('/')
136 if first_part in self.folder:
137 return pathmaker(self.folder[first_part], *other_parts)
138 _out = None
139 if key in self.files:
140 _out = self.files[key]
141 elif key in self.folder:
142 _out = self.folder[key]
143 else:
144 if '.' in key:
145 create_folder(pathmaker(self.appstorage_folder, 'unfoldered_files'))
146 _out = pathmaker(self.appstorage_folder, 'unfoldered_files', key)
147 log.debug("file '%s' does not exist, providing path to 'unfoldered_files' folder", key)
148 else:
149 log.debug("folder '%s' does not exist, providing path to hypothetical folder in base dir", key)
150 _out = pathmaker(self.appstorage_folder, key)
151 return _out
153 def __str__(self):
154 return self.appstorage_folder
156 def __repr__(self) -> str:
157 return f"{self.__class__.__name__}({self.author_name}, {self.app_name}, {str(self.dev)}, {str(self.redirect)})"
159# endregion[SpecialMethods]