refactor: add get_config func

This commit is contained in:
2 * r + 2 * t
2026-06-13 02:25:09 +10:00
parent d7b65b5946
commit 002a9c287f
6 changed files with 40 additions and 37 deletions
+2 -5
View File
@@ -1,4 +1,3 @@
import json
import re import re
import shutil import shutil
import subprocess import subprocess
@@ -9,7 +8,7 @@ from pathlib import Path
from caelestia.utils import hypr from caelestia.utils import hypr
from caelestia.utils.notify import close_notification, notify from caelestia.utils.notify import close_notification, notify
from caelestia.utils.paths import recording_notif_path, recording_path, recordings_dir, user_config_path from caelestia.utils.paths import get_config, recording_notif_path, recording_path, recordings_dir
RECORDER = "gpu-screen-recorder" RECORDER = "gpu-screen-recorder"
@@ -65,12 +64,10 @@ class Command:
if self.args.sound: if self.args.sound:
args += ["-a", "default_output"] args += ["-a", "default_output"]
config = get_config()
try: try:
config = json.loads(user_config_path.read_text())
if "record" in config and "extraArgs" in config["record"]: if "record" in config and "extraArgs" in config["record"]:
args += config["record"]["extraArgs"] args += config["record"]["extraArgs"]
except (json.JSONDecodeError, FileNotFoundError):
pass
except TypeError as e: except TypeError as e:
raise ValueError(f"Config option 'record.extraArgs' should be an array: {e}") raise ValueError(f"Config option 'record.extraArgs' should be an array: {e}")
+3 -3
View File
@@ -8,7 +8,7 @@ from typing import Any, Dict, Optional
from caelestia.utils import hypr from caelestia.utils import hypr
from caelestia.utils.io import log_message from caelestia.utils.io import log_message
from caelestia.utils.paths import user_config_path from caelestia.utils.paths import get_config
class WindowRule: class WindowRule:
@@ -52,8 +52,8 @@ class Command:
WindowRule("^[Pp]icture(-| )in(-| )[Pp]icture$", "titleRegex", "", "", ["pip"]), WindowRule("^[Pp]icture(-| )in(-| )[Pp]icture$", "titleRegex", "", "", ["pip"]),
] ]
config = get_config()
try: try:
config = json.loads(user_config_path.read_text())
if "resizer" in config and "rules" in config["resizer"]: if "resizer" in config and "rules" in config["resizer"]:
rules = [] rules = []
for rule_config in config["resizer"]["rules"]: for rule_config in config["resizer"]["rules"]:
@@ -67,7 +67,7 @@ class Command:
) )
) )
return rules return rules
except (json.JSONDecodeError, KeyError): except KeyError:
log_message("ERROR: invalid config") log_message("ERROR: invalid config")
except FileNotFoundError: except FileNotFoundError:
pass pass
+3 -3
View File
@@ -6,7 +6,7 @@ from collections import ChainMap
from typing import Any, Callable, cast from typing import Any, Callable, cast
from caelestia.utils import hypr from caelestia.utils import hypr
from caelestia.utils.paths import user_config_path from caelestia.utils.paths import get_config
def is_subset(superset, subset): def is_subset(superset, subset):
@@ -103,8 +103,8 @@ class Command:
}, },
} }
try: try:
self.cfg = DeepChainMap(json.loads(user_config_path.read_text())["toggles"], self.cfg) self.cfg = DeepChainMap(get_config()["toggles"], self.cfg)
except (FileNotFoundError, json.JSONDecodeError, KeyError): except KeyError:
pass pass
def run(self) -> None: def run(self) -> None:
+12
View File
@@ -5,6 +5,8 @@ import tempfile
from pathlib import Path from pathlib import Path
from typing import Any from typing import Any
from caelestia.utils.io import warn
config_dir: Path = Path(os.getenv("XDG_CONFIG_HOME", Path.home() / ".config")) config_dir: Path = Path(os.getenv("XDG_CONFIG_HOME", Path.home() / ".config"))
data_dir: Path = Path(os.getenv("XDG_DATA_HOME", Path.home() / ".local/share")) data_dir: Path = Path(os.getenv("XDG_DATA_HOME", Path.home() / ".local/share"))
state_dir: Path = Path(os.getenv("XDG_STATE_HOME", Path.home() / ".local/state")) state_dir: Path = Path(os.getenv("XDG_STATE_HOME", Path.home() / ".local/state"))
@@ -67,3 +69,13 @@ def atomic_write(path: Path, content: str) -> None:
def atomic_dump(path: Path, content: dict[str, Any]) -> None: def atomic_dump(path: Path, content: dict[str, Any]) -> None:
atomic_write(path, json.dumps(content)) atomic_write(path, json.dumps(content))
def get_config() -> dict[str, Any]:
try:
return json.loads(user_config_path.read_text())
except json.JSONDecodeError:
warn("failed to parse config, invalid JSON")
except FileNotFoundError:
pass
return {}
+2 -5
View File
@@ -15,9 +15,9 @@ from caelestia.utils.paths import (
c_state_dir, c_state_dir,
config_dir, config_dir,
data_dir, data_dir,
get_config,
templates_dir, templates_dir,
theme_dir, theme_dir,
user_config_path,
user_templates_dir, user_templates_dir,
) )
from caelestia.utils.scheme import get_scheme from caelestia.utils.scheme import get_scheme
@@ -417,10 +417,7 @@ def apply_colours(colours: dict[str, str], mode: str) -> None:
except BlockingIOError: except BlockingIOError:
return return
try: cfg = get_config().get("theme", {})
cfg = json.loads(user_config_path.read_text())["theme"]
except (FileNotFoundError, json.JSONDecodeError, KeyError):
cfg = {}
def check(key: str) -> bool: def check(key: str) -> bool:
return cfg[key] if key in cfg else True return cfg[key] if key in cfg else True
+18 -21
View File
@@ -16,7 +16,7 @@ from caelestia.utils.material import get_colours_for_image
from caelestia.utils.colourfulness import get_variant from caelestia.utils.colourfulness import get_variant
from caelestia.utils.paths import ( from caelestia.utils.paths import (
compute_hash, compute_hash,
user_config_path, get_config,
wallpaper_link_path, wallpaper_link_path,
wallpaper_path_path, wallpaper_path_path,
wallpaper_thumbnail_path, wallpaper_thumbnail_path,
@@ -186,26 +186,23 @@ def set_wallpaper(wall: Path, no_smart: bool) -> None:
apply_colours(scheme.colours, scheme.mode) apply_colours(scheme.colours, scheme.mode)
# Run custom post-hook if configured # Run custom post-hook if configured
try: cfg = get_config().get("wallpaper", {})
cfg = json.loads(user_config_path.read_text()).get("wallpaper", {}) if post_hook := cfg.get("postHook"):
if post_hook := cfg.get("postHook"): subprocess.run(
subprocess.run( post_hook,
post_hook, shell=True,
shell=True, env={
env={ **os.environ,
**os.environ, "WALLPAPER_PATH": str(wall),
"WALLPAPER_PATH": str(wall), "SCHEME_NAME": scheme.name,
"SCHEME_NAME": scheme.name, "SCHEME_FLAVOUR": scheme.flavour,
"SCHEME_FLAVOUR": scheme.flavour, "SCHEME_MODE": scheme.mode,
"SCHEME_MODE": scheme.mode, "SCHEME_VARIANT": scheme.variant,
"SCHEME_VARIANT": scheme.variant, "SCHEME_COLOURS": json.dumps(scheme.colours),
"SCHEME_COLOURS": json.dumps(scheme.colours), "THUMBNAIL_PATH": str(thumb),
"THUMBNAIL_PATH": str(thumb), },
}, stderr=subprocess.DEVNULL,
stderr=subprocess.DEVNULL, )
)
except (FileNotFoundError, json.JSONDecodeError):
pass
def set_random(args: Namespace) -> None: def set_random(args: Namespace) -> None: