|
7 | 7 | from collections import deque
|
8 | 8 | from dataclasses import is_dataclass
|
9 | 9 | from pathlib import Path
|
10 |
| -from typing import TYPE_CHECKING, Any, List, Mapping, Sequence, Tuple, Union |
| 10 | +from typing import TYPE_CHECKING, Any, List, Mapping, Sequence, Tuple, Union, cast |
11 | 11 |
|
12 |
| -from pydantic import BaseModel |
| 12 | +from pydantic import AliasChoices, AliasPath, BaseModel |
13 | 13 | from pydantic._internal._typing_extra import origin_is_union
|
14 | 14 | from pydantic._internal._utils import deep_update, lenient_issubclass
|
15 | 15 | from pydantic.fields import FieldInfo
|
@@ -122,19 +122,23 @@ def _extract_field_info(self, field: FieldInfo, field_name: str) -> list[tuple[s
|
122 | 122 | field_name (str): The field name.
|
123 | 123 |
|
124 | 124 | Returns:
|
125 |
| - list[tuple[str, str, bool]]: List of tuples, each tuple contanis field_key, env_name, and value_is_complex. |
| 125 | + list[tuple[str, str, bool]]: List of tuples, each tuple contains field_key, env_name, and value_is_complex. |
126 | 126 | """
|
127 | 127 | field_info: list[tuple[str, str, bool]] = []
|
128 |
| - v_alias = field.validation_alias |
| 128 | + if isinstance(field.validation_alias, (AliasChoices, AliasPath)): |
| 129 | + v_alias: str | list[str | int] | list[list[str | int]] | None = field.validation_alias.convert_to_aliases() |
| 130 | + else: |
| 131 | + v_alias = field.validation_alias |
129 | 132 |
|
130 | 133 | if v_alias:
|
131 | 134 | if isinstance(v_alias, list): # AliasChoices, AliasPath
|
132 | 135 | for alias in v_alias:
|
133 | 136 | if isinstance(alias, str): # AliasPath
|
134 | 137 | field_info.append((alias, self._apply_case_sensitive(alias), True if len(alias) > 1 else False))
|
135 | 138 | elif isinstance(alias, list): # AliasChoices
|
| 139 | + first_arg = cast(str, alias[0]) # first item of an AliasChoices must be a str |
136 | 140 | field_info.append(
|
137 |
| - (alias[0], self._apply_case_sensitive(alias[0]), True if len(alias) > 1 else False) |
| 141 | + (first_arg, self._apply_case_sensitive(first_arg), True if len(alias) > 1 else False) |
138 | 142 | )
|
139 | 143 | else: # string validation alias
|
140 | 144 | field_info.append((v_alias, self._apply_case_sensitive(v_alias), False))
|
|
0 commit comments