From a7d458ee60b56f69913a508aff1e5087670f5fac Mon Sep 17 00:00:00 2001 From: MatthieuDartiailh Date: Tue, 7 Jan 2025 22:39:55 +0100 Subject: [PATCH] fix handling of Enum default value --- atom/meta/annotation_utils.py | 8 ++++++++ tests/test_atom_from_annotations.py | 2 ++ 2 files changed, 10 insertions(+) diff --git a/atom/meta/annotation_utils.py b/atom/meta/annotation_utils.py index 969cb9e4..c9a22c67 100644 --- a/atom/meta/annotation_utils.py +++ b/atom/meta/annotation_utils.py @@ -67,6 +67,14 @@ def generate_member_from_type_or_generic( # We are dealing with a Literal, so use an Enum member elif not types: m_cls = Enum + if default is not _NO_DEFAULT: + if default not in parameters: + raise ValueError("Default value does not appear in Literal") + # Make the default value the first in the enum arguments. + p = list(parameters) + p.pop(p.index(default)) + parameters = (default, *p) + default = _NO_DEFAULT # Int, Float, Str, Bytes, List, Dict, Set, Tuple, Bool, Callable elif len(types) == 1 and types[0] in _TYPE_TO_MEMBER: t = types[0] diff --git a/tests/test_atom_from_annotations.py b/tests/test_atom_from_annotations.py index 4e3aafa6..8e595fe3 100644 --- a/tests/test_atom_from_annotations.py +++ b/tests/test_atom_from_annotations.py @@ -312,6 +312,8 @@ class A(Atom, use_annotations=True): assert isinstance(A.a, member) if member is Subclass: assert A.a.default_value_mode == member(int, default=default).default_value_mode + elif member is Enum: + assert A.a.default_value_mode[1] == default elif member is not Instance: assert A.a.default_value_mode == member(default=default).default_value_mode