-
Notifications
You must be signed in to change notification settings - Fork 0
/
config_manager.py
102 lines (80 loc) · 3.32 KB
/
config_manager.py
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
"""
This file is part of the PetalVault password manager distribution. See <https://github.com/F33RNI/PetalVault>.
Copyright (C) 2024 Fern Lane
This program is free software: you can redistribute it and/or modify it under the terms of the
GNU General Public License as published by the Free Software Foundation, version 3.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program.
If not, see <http://www.gnu.org/licenses/>.
"""
import json
import locale
import logging
import os
from typing import Any
from _version import __version__
# Crude way to get default language
# pyright: reportConstantRedefinition=none
_LOCALE = "eng"
try:
_LOCALE = locale.getlocale()[0]
except:
pass
LANG_ID_DEFAULT = "eng"
try:
LANG_ID_DEFAULT = "rus" if _LOCALE.startswith("ru") else "eng"
except:
pass
CONFIG_DEFAULT = {"version": __version__, "lang_id": LANG_ID_DEFAULT, "camera_index": 0}
class ConfigManager:
def __init__(self, config_file: str) -> None:
"""Initializes ConfigManager and reads config file
Args:
config_file (str): config file (.json)
"""
self._config_file = config_file
self._config = {}
# Try to load config file
if os.path.exists(config_file):
logging.debug(f"Loading {config_file}")
with open(config_file, encoding="utf-8", errors="replace") as config_file_io:
json_content = json.load(config_file_io)
if json_content is not None and isinstance(json_content, dict):
self._config = json_content
else:
logging.warning(f"Unable to load config from {config_file}")
def get(self, key: str, default_value: Any | None = None) -> Any:
"""Retrieves value from config by key
Args:
key (str): config key to get value of
default_value (Any or None): value to return if key doesn't exists in config file and in CONFIG_DEFAULT
Returns:
Any: key's value or default_value
"""
# Retrieve from config
if key in self._config:
# Disable auto theme to prevent "FileNotFoundError: [Errno 2] No such file or directory: 'gsettings'"
if key == "theme" and self._config[key] == "auto":
return "light"
return self._config[key]
# Use default value
elif key in CONFIG_DEFAULT:
return CONFIG_DEFAULT[key]
# No key -> return default value
else:
logging.debug(f"Key {key} doesn't exist in config")
return default_value
def set(self, key: str, value: Any) -> None:
"""Updates config values and saves it to the file
Args:
key (str): config key
value (Any): key's value
"""
# Set value
self._config[key] = value
# Save to file
logging.debug(f"Saving config to {self._config_file}")
with open(self._config_file, "w+", encoding="utf-8") as config_file_io:
json.dump(self._config, config_file_io, indent=4, ensure_ascii=False)