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")