From e42ae7186222519ce1a579be53372effb1a731cd Mon Sep 17 00:00:00 2001 From: furtest Date: Sat, 3 Jan 2026 17:10:06 +0100 Subject: [PATCH 1/3] defaults : Create defaults.py Creates the file defaults.py this is used to store the defaults and easily include them into the config. Changing defaults is thus possible without touching the code leaving less room for errors. --- src/unisync/defaults.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/unisync/defaults.py diff --git a/src/unisync/defaults.py b/src/unisync/defaults.py new file mode 100644 index 0000000..3afa0d6 --- /dev/null +++ b/src/unisync/defaults.py @@ -0,0 +1,18 @@ +# copyright (c) 2026 paul retourné +# spdx-license-identifier: gpl-3.0-or-later + +from pathlib import Path + +# Commented out values are part of the config but are required so there is no defaults. +# This allows this file to be a list of all the config options. + +# DEFAULT_SERVER_USER: str = "" +DEFAULT_SERVER_SSHARGS: str = "" +DEFAULT_SERVER_HOSTNAME: str = "" +DEFAULT_SERVER_IP: str = "" +DEFAULT_SERVER_PORT: int = 22 + +DEFAULT_ROOTS_LOCAL: str = str(Path("~/files").expanduser()) +# DEFAULT_ROOTS_REMOTE: str = "" + +DEFAULT_MISC_CACHE_DIR_PATH: Path = Path("~/.unisync").expanduser() From a223f049092320bd8899382f44a3c0d5eec4d892 Mon Sep 17 00:00:00 2001 From: furtest Date: Sat, 3 Jan 2026 17:15:22 +0100 Subject: [PATCH 2/3] config : take cache_dir_path into account cache_dir_path and all of the OtherConfig was ignored and the default value was loaded, read its value from the config file instead. --- src/unisync/config.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/unisync/config.py b/src/unisync/config.py index 357bf7e..4e1bf2f 100644 --- a/src/unisync/config.py +++ b/src/unisync/config.py @@ -79,6 +79,7 @@ def load_config(config_path:str) -> Config: # Check if sections are provided server_section = "Server" if "Server" in config.sections() else UNNAMED_SECTION roots_section = "Roots" if "Roots" in config.sections() else UNNAMED_SECTION + other_section = "Other" if "Other" in config.sections() else UNNAMED_SECTION server_config = ServerConfig( config.get(server_section, "user"), @@ -91,6 +92,9 @@ def load_config(config_path:str) -> Config: config.get(roots_section, "local"), config.get(roots_section, "remote") ) + other_config = OtherConfig( + config.get(other_section, "cache_dir_path", fallback=DEFAULT_MISC_CACHE_DIR_PATH) + ) args_bool = list() args_val = dict() @@ -104,4 +108,4 @@ def load_config(config_path:str) -> Config: args_val[key] = val unison_config = UnisonConfig(args_bool, args_val) - return Config(server_config, roots_config, unison_config) + return Config(server_config, roots_config, unison_config, other_config) From 0e80ba0b0d1e5dcbabd758b61a7a1b6a5460f7c1 Mon Sep 17 00:00:00 2001 From: furtest Date: Sat, 3 Jan 2026 17:18:19 +0100 Subject: [PATCH 3/3] config : use the defaults from defaults.py Remove the defaults from the dataclasses as they are redundent with the fallbacks of configparser. Use the values in defaults.py as the fallbacks instead of hardcoded values. --- src/unisync/config.py | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/unisync/config.py b/src/unisync/config.py index 4e1bf2f..3294807 100644 --- a/src/unisync/config.py +++ b/src/unisync/config.py @@ -7,16 +7,18 @@ from pathlib import Path import ipaddress import configparser +from unisync.defaults import * + @dataclass class ServerConfig: """ Dataclass keeping the config for connecting to the server """ user: str - sshargs: str = "" - hostname: str = "" - ip: str = "" - port: int = 22 + sshargs: str + hostname: str + ip: str + port: int def __post_init__(self): """ @@ -44,15 +46,15 @@ class UnisonConfig: """ Dataclass keeping unison specific configurations """ - bools: list = field(default_factory=list) - values: dict = field(default_factory=dict) + bools: list + values: dict @dataclass class OtherConfig: """ Dataclass keeping miscellanous configuration options """ - cache_dir_path: Path = Path("~/.unisync").expanduser() + cache_dir_path: Path @dataclass class Config: @@ -62,7 +64,7 @@ class Config: server: ServerConfig roots: RootsConfig unison: UnisonConfig - other: OtherConfig = field(default_factory=OtherConfig) + other: OtherConfig def load_config(config_path:str) -> Config: @@ -83,13 +85,13 @@ def load_config(config_path:str) -> Config: server_config = ServerConfig( config.get(server_section, "user"), - config.get(server_section, "sshargs", fallback=""), - config.get(server_section, "hostname", fallback=""), - config.get(server_section, "ip", fallback=""), - config.getint(server_section, "port", fallback=22) + config.get(server_section, "sshargs", fallback=DEFAULT_SERVER_SSHARGS), + config.get(server_section, "hostname", fallback=DEFAULT_SERVER_HOSTNAME), + config.get(server_section, "ip", fallback=DEFAULT_SERVER_IP), + config.getint(server_section, "port", fallback=DEFAULT_SERVER_PORT) ) roots_config = RootsConfig( - config.get(roots_section, "local"), + config.get(roots_section, "local", fallback=DEFAULT_ROOTS_LOCAL), config.get(roots_section, "remote") ) other_config = OtherConfig(