From c6b00c39ebfe3558d147c4eea9747fbd47e42625 Mon Sep 17 00:00:00 2001 From: Dominik Jain Date: Mon, 26 Jan 2026 22:20:37 +0100 Subject: [PATCH] Separate YAML and dataclass utils --- src/serena/util/dataclass.py | 21 +++++++++++++++++++++ src/serena/util/{general.py => yaml.py} | 22 +--------------------- 2 files changed, 22 insertions(+), 21 deletions(-) create mode 100644 src/serena/util/dataclass.py rename src/serena/util/{general.py => yaml.py} (60%) diff --git a/src/serena/util/dataclass.py b/src/serena/util/dataclass.py new file mode 100644 index 00000000..c5518bf4 --- /dev/null +++ b/src/serena/util/dataclass.py @@ -0,0 +1,21 @@ +from dataclasses import MISSING, Field +from typing import Any, cast + + +def get_dataclass_default(cls: type, field_name: str) -> Any: + """ + Gets the default value of a dataclass field. + + :param cls: The dataclass type. + :param field_name: The name of the field. + :return: The default value of the field (either from default or default_factory). + """ + field = cast(Field, cls.__dataclass_fields__[field_name]) # type: ignore[attr-defined] + + if field.default is not MISSING: + return field.default + + if field.default_factory is not MISSING: # default_factory is a function + return field.default_factory() + + raise AttributeError(f"{field_name} has no default") diff --git a/src/serena/util/general.py b/src/serena/util/yaml.py similarity index 60% rename from src/serena/util/general.py rename to src/serena/util/yaml.py index f380c699..4a1397e2 100644 --- a/src/serena/util/general.py +++ b/src/serena/util/yaml.py @@ -1,6 +1,5 @@ import os -from dataclasses import MISSING, Field -from typing import Any, Literal, cast, overload +from typing import Literal, overload from ruamel.yaml import YAML from ruamel.yaml.comments import CommentedMap @@ -33,22 +32,3 @@ def save_yaml(path: str, data: dict | CommentedMap, preserve_comments: bool = Fa os.makedirs(os.path.dirname(path), exist_ok=True) with open(path, "w", encoding=SERENA_FILE_ENCODING) as f: yaml.dump(data, f) - - -def get_dataclass_default(cls: type, field_name: str) -> Any: - """ - Gets the default value of a dataclass field. - - :param cls: The dataclass type. - :param field_name: The name of the field. - :return: The default value of the field (either from default or default_factory). - """ - field = cast(Field, cls.__dataclass_fields__[field_name]) # type: ignore[attr-defined] - - if field.default is not MISSING: - return field.default - - if field.default_factory is not MISSING: # default_factory is a function - return field.default_factory() - - raise AttributeError(f"{field_name} has no default")