From 73840b30b9943e9b7de03e6172dbe7a51582ff94 Mon Sep 17 00:00:00 2001 From: "Danilo M." Date: Fri, 17 Jul 2026 09:33:16 +0200 Subject: feat: parse hyprsunset.conf profiles Implement minimal config parser with Profile dataclass and parse_config function. Regex-based parsing of hyprsunset.conf format with support for time, identity, temperature, and gamma fields. Foundation for later tasks (serialize, read/write, validation). Co-Authored-By: Claude Opus 4.8 --- hyprsunset_qt/config.py | 40 ++++++++++++++++++++++++++++++++++++++++ tests/test_config.py | 25 +++++++++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 hyprsunset_qt/config.py create mode 100644 tests/test_config.py diff --git a/hyprsunset_qt/config.py b/hyprsunset_qt/config.py new file mode 100644 index 0000000..c2ef010 --- /dev/null +++ b/hyprsunset_qt/config.py @@ -0,0 +1,40 @@ +"""Parse and serialize hyprsunset.conf profile blocks.""" + +from __future__ import annotations + +import re +from dataclasses import dataclass + +_BLOCK_RE = re.compile(r"profile\s*\{(.*?)\}", re.DOTALL) + + +@dataclass +class Profile: + time: str = "" + identity: bool = False + temperature: int | None = None + gamma: float | None = None + + +def _get(body: str, key: str) -> str | None: + m = re.search(rf"^\s*{key}\s*=\s*(.+?)\s*$", body, re.MULTILINE) + return m.group(1) if m else None + + +def parse_config(text: str) -> list[Profile]: + profiles: list[Profile] = [] + for block in _BLOCK_RE.finditer(text): + body = block.group(1) + time = _get(body, "time") or "" + identity = (_get(body, "identity") or "").lower() == "true" + temp = _get(body, "temperature") + gamma = _get(body, "gamma") + profiles.append( + Profile( + time=time, + identity=identity, + temperature=int(temp) if temp is not None else None, + gamma=float(gamma) if gamma is not None else None, + ) + ) + return profiles diff --git a/tests/test_config.py b/tests/test_config.py new file mode 100644 index 0000000..4568160 --- /dev/null +++ b/tests/test_config.py @@ -0,0 +1,25 @@ +from hyprsunset_qt.config import Profile, parse_config + + +def test_parse_two_profiles(): + text = """ +profile { + time = 5:00 + identity = true +} + +profile { + time = 19:40 + temperature = 5500 + gamma = 0.8 +} +""" + profiles = parse_config(text) + assert profiles == [ + Profile(time="5:00", identity=True, temperature=None, gamma=None), + Profile(time="19:40", identity=False, temperature=5500, gamma=0.8), + ] + + +def test_parse_empty(): + assert parse_config("") == [] -- cgit v1.2.3