Hide keyboard shortcuts

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] 

2 

3 

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 

11 

12import gidlogger as glog 

13 

14import appdirs 

15 

16# endregion [Imports] 

17 

18 

19# region [Logging] 

20 

21log = logging.getLogger('gidappdata') 

22log.info(glog.imported(__name__)) 

23 

24# endregion [Logging] 

25 

26 

27# region [Constants] 

28 

29 

30# endregion [Constants] 

31 

32 

33class _AppDataFolder(Enum): 

34 AllFolder = auto() 

35 LogFolder = "log_folder" 

36 AppStorageFolder = "appstorage_folder" 

37 

38 

39class AppDataStorager: 

40 # region [ClassAttributes] 

41 

42 AllFolder = _AppDataFolder.AllFolder 

43 LogFolder = _AppDataFolder.LogFolder 

44 AppStorageFolder = _AppDataFolder.AppStorageFolder 

45 

46# endregion[ClassAttributes] 

47# region [Init] 

48 

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() 

61 

62# endregion[Init] 

63# region [Properties] 

64 

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 

72 

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 

80 

81# endregion[Properties] 

82 

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) 

88 

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) 

93 

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) 

101 

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) 

106 

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) 

112 

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 

118 

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)) 

125 

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) 

130 

131# region [SpecialMethods] 

132 

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 

152 

153 def __str__(self): 

154 return self.appstorage_folder 

155 

156 def __repr__(self) -> str: 

157 return f"{self.__class__.__name__}({self.author_name}, {self.app_name}, {str(self.dev)}, {str(self.redirect)})" 

158 

159# endregion[SpecialMethods]