|
1 | 1 | import json
|
2 | 2 | import logging
|
| 3 | +import os |
| 4 | +from ast import literal_eval |
| 5 | +from typing import Any, Dict |
3 | 6 |
|
4 | 7 | from .constants import FileLocations
|
5 | 8 |
|
6 | 9 | log = logging.getLogger(__name__)
|
7 | 10 |
|
| 11 | +MUST_SET = object() |
| 12 | + |
8 | 13 |
|
9 | 14 | class Defaults:
|
10 |
| - token = None |
11 |
| - command_prefix = ">" |
12 |
| - mongodb_uri = None |
| 15 | + TOKEN = MUST_SET |
| 16 | + COMMAND_PREFIX = ">" |
| 17 | + MONGO_URI = MUST_SET |
| 18 | + MONGO_DATABASE = "Gisi" |
13 | 19 |
|
14 |
| - webhook_url = None |
| 20 | + WEBHOOK_URL = None |
15 | 21 |
|
16 |
| - default_font = "arial" |
| 22 | + DEFAULT_FONT = "arial" |
17 | 23 |
|
18 | 24 |
|
19 |
| -# noinspection PyPep8Naming |
20 |
| -def SetDefaults(defaults: dict): |
| 25 | +def set_defaults(defaults: dict): |
21 | 26 | for key, value in defaults.items():
|
22 | 27 | setattr(Defaults, key, value)
|
23 | 28 | log.debug(f"added {len(defaults)} setting(s) to default config")
|
24 | 29 |
|
25 | 30 |
|
26 | 31 | class Config:
|
27 |
| - def __init__(self, config): |
| 32 | + def __init__(self, config: Dict[str, Any]): |
28 | 33 | self.config = config
|
29 | 34 |
|
30 |
| - def __str__(self): |
| 35 | + def __str__(self) -> str: |
31 | 36 | return "<Config>"
|
32 | 37 |
|
33 |
| - def __getattr__(self, item): |
| 38 | + def __getattr__(self, item: str) -> Any: |
34 | 39 | return self.get(item)
|
35 | 40 |
|
36 |
| - def __getitem__(self, item): |
| 41 | + def __getitem__(self, item: str) -> Any: |
37 | 42 | return self.get(item)
|
38 | 43 |
|
39 |
| - def __setitem__(self, key, value): |
| 44 | + def __setitem__(self, key: str, value: Any): |
40 | 45 | return self.set(key, value)
|
41 | 46 |
|
42 | 47 | @classmethod
|
43 | 48 | def load(cls):
|
44 |
| - with open(FileLocations.CONFIG, "r") as f: |
45 |
| - data = json.load(f) |
| 49 | + try: |
| 50 | + with open(FileLocations.CONFIG, "r") as f: |
| 51 | + data = json.load(f) |
| 52 | + except FileNotFoundError: |
| 53 | + data = {} |
46 | 54 | return cls(data)
|
47 | 55 |
|
48 | 56 | def save(self):
|
49 | 57 | with open(FileLocations.CONFIG, "w+") as f:
|
50 | 58 | json.dump(self.config, f)
|
51 | 59 | log.info("saved config")
|
52 | 60 |
|
53 |
| - def get(self, key): |
54 |
| - return self.config.get(key, getattr(Defaults, key)) |
| 61 | + def get(self, key: str) -> Any: |
| 62 | + try: |
| 63 | + return self.config[key] |
| 64 | + except KeyError: |
| 65 | + try: |
| 66 | + return literal_eval(os.environ[key]) |
| 67 | + except (KeyError, SyntaxError): |
| 68 | + return getattr(Defaults, key) |
55 | 69 |
|
56 |
| - def set(self, key, value): |
| 70 | + def set(self, key: str, value: Any): |
57 | 71 | if not hasattr(Defaults, key):
|
58 | 72 | raise KeyError(f"Key not in Defaults! ({key})")
|
59 | 73 | self.config[key] = value
|
60 | 74 | self.save()
|
| 75 | + |
| 76 | + |
| 77 | +def extract_env(config: Config): |
| 78 | + env = os.environ |
| 79 | + for key, default_value in vars(Defaults).items(): |
| 80 | + value = env.get(key) |
| 81 | + if value: |
| 82 | + value = literal_eval(value) |
| 83 | + config.config[key] = value |
| 84 | + elif default_value == MUST_SET: |
| 85 | + if key not in config.config: |
| 86 | + raise KeyError(f"Key {key} missing in environment variables!") |
0 commit comments