7
7
from abc import ABC , abstractmethod
8
8
from collections import deque
9
9
from dataclasses import is_dataclass
10
+ from enum import Enum
10
11
from pathlib import Path
11
12
from typing import TYPE_CHECKING , Any , List , Mapping , Sequence , Tuple , Union , cast
12
13
@@ -179,6 +180,7 @@ def __init__(
179
180
env_prefix : str | None = None ,
180
181
env_ignore_empty : bool | None = None ,
181
182
env_parse_none_str : str | None = None ,
183
+ env_parse_enums : bool | None = None ,
182
184
) -> None :
183
185
super ().__init__ (settings_cls )
184
186
self .case_sensitive = case_sensitive if case_sensitive is not None else self .config .get ('case_sensitive' , False )
@@ -189,6 +191,7 @@ def __init__(
189
191
self .env_parse_none_str = (
190
192
env_parse_none_str if env_parse_none_str is not None else self .config .get ('env_parse_none_str' )
191
193
)
194
+ self .env_parse_enums = env_parse_enums if env_parse_enums is not None else self .config .get ('env_parse_enums' )
192
195
193
196
def _apply_case_sensitive (self , value : str ) -> str :
194
197
return value .lower () if not self .case_sensitive else value
@@ -357,8 +360,11 @@ def __init__(
357
360
env_prefix : str | None = None ,
358
361
env_ignore_empty : bool | None = None ,
359
362
env_parse_none_str : str | None = None ,
363
+ env_parse_enums : bool | None = None ,
360
364
) -> None :
361
- super ().__init__ (settings_cls , case_sensitive , env_prefix , env_ignore_empty , env_parse_none_str )
365
+ super ().__init__ (
366
+ settings_cls , case_sensitive , env_prefix , env_ignore_empty , env_parse_none_str , env_parse_enums
367
+ )
362
368
self .secrets_dir = secrets_dir if secrets_dir is not None else self .config .get ('secrets_dir' )
363
369
364
370
def __call__ (self ) -> dict [str , Any ]:
@@ -447,8 +453,11 @@ def __init__(
447
453
env_nested_delimiter : str | None = None ,
448
454
env_ignore_empty : bool | None = None ,
449
455
env_parse_none_str : str | None = None ,
456
+ env_parse_enums : bool | None = None ,
450
457
) -> None :
451
- super ().__init__ (settings_cls , case_sensitive , env_prefix , env_ignore_empty , env_parse_none_str )
458
+ super ().__init__ (
459
+ settings_cls , case_sensitive , env_prefix , env_ignore_empty , env_parse_none_str , env_parse_enums
460
+ )
452
461
self .env_nested_delimiter = (
453
462
env_nested_delimiter if env_nested_delimiter is not None else self .config .get ('env_nested_delimiter' )
454
463
)
@@ -498,6 +507,10 @@ def prepare_field_value(self, field_name: str, field: FieldInfo, value: Any, val
498
507
ValuesError: When There is an error in deserializing value for complex field.
499
508
"""
500
509
is_complex , allow_parse_failure = self ._field_is_complex (field )
510
+ if self .env_parse_enums and lenient_issubclass (field .annotation , Enum ):
511
+ if value in tuple (val .name for val in field .annotation ): # type: ignore
512
+ value = field .annotation [value ] # type: ignore
513
+
501
514
if is_complex or value_is_complex :
502
515
if value is None :
503
516
# field is complex but no value found so far, try explode_env_vars
@@ -645,13 +658,20 @@ def __init__(
645
658
env_nested_delimiter : str | None = None ,
646
659
env_ignore_empty : bool | None = None ,
647
660
env_parse_none_str : str | None = None ,
661
+ env_parse_enums : bool | None = None ,
648
662
) -> None :
649
663
self .env_file = env_file if env_file != ENV_FILE_SENTINEL else settings_cls .model_config .get ('env_file' )
650
664
self .env_file_encoding = (
651
665
env_file_encoding if env_file_encoding is not None else settings_cls .model_config .get ('env_file_encoding' )
652
666
)
653
667
super ().__init__ (
654
- settings_cls , case_sensitive , env_prefix , env_nested_delimiter , env_ignore_empty , env_parse_none_str
668
+ settings_cls ,
669
+ case_sensitive ,
670
+ env_prefix ,
671
+ env_nested_delimiter ,
672
+ env_ignore_empty ,
673
+ env_parse_none_str ,
674
+ env_parse_enums ,
655
675
)
656
676
657
677
def _load_env_vars (self ) -> Mapping [str , str | None ]:
0 commit comments