-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathsettings.py
More file actions
78 lines (70 loc) · 2.53 KB
/
Copy pathsettings.py
File metadata and controls
78 lines (70 loc) · 2.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import os
import json
class SettingsManager:
def __init__(self, name, settings_directory):
self.settings_file = os.path.join(settings_directory, f"{name}.json")
self.settings = {}
self.recovery_file = None
self.read_settings()
def preserve_corrupt_settings(self):
recovery_file = f"{self.settings_file}.corrupt"
suffix = 1
while os.path.exists(recovery_file):
recovery_file = f"{self.settings_file}.corrupt.{suffix}"
suffix += 1
try:
os.replace(self.settings_file, recovery_file)
self.recovery_file = recovery_file
except OSError:
pass
def read_settings(self):
if os.path.exists(self.settings_file):
try:
with open(self.settings_file, "r", encoding="utf-8") as f:
self.settings = json.load(f)
if not isinstance(self.settings, dict):
raise ValueError("settings root must be an object")
except (OSError, ValueError, json.JSONDecodeError):
self.settings = {}
self.preserve_corrupt_settings()
def getSetting(self, key, default):
return self.settings.get(key, default)
def setSetting(self, key, value):
return self.setSettings({key: value})
def setSettings(self, values):
previous = dict(self.settings)
self.settings.update(values)
if self.save_settings():
return True
self.settings = previous
return False
def unsetSettings(self, keys):
previous = dict(self.settings)
changed = False
for key in keys:
if key in self.settings:
del self.settings[key]
changed = True
if not changed:
return True
if self.save_settings():
return True
self.settings = previous
return False
def save_settings(self):
temp_file = f"{self.settings_file}.tmp"
try:
os.makedirs(os.path.dirname(self.settings_file), exist_ok=True)
with open(temp_file, "w", encoding="utf-8") as f:
json.dump(self.settings, f, indent=4)
f.flush()
os.fsync(f.fileno())
os.replace(temp_file, self.settings_file)
return True
except Exception:
try:
if os.path.exists(temp_file):
os.remove(temp_file)
except OSError:
pass
return False