|
8 | 8 | import typing |
9 | 9 | import warnings |
10 | 10 | from abc import ABC, abstractmethod |
11 | | - |
12 | | -if sys.version_info >= (3, 9): |
13 | | - from argparse import BooleanOptionalAction |
14 | | -from argparse import SUPPRESS, ArgumentParser, Namespace, RawDescriptionHelpFormatter, _SubParsersAction |
| 11 | +from argparse import ( |
| 12 | + SUPPRESS, |
| 13 | + ArgumentParser, |
| 14 | + BooleanOptionalAction, |
| 15 | + Namespace, |
| 16 | + RawDescriptionHelpFormatter, |
| 17 | + _SubParsersAction, |
| 18 | +) |
15 | 19 | from collections import defaultdict, deque |
| 20 | +from collections.abc import Iterator, Mapping, Sequence |
16 | 21 | from dataclasses import asdict, is_dataclass |
17 | 22 | from enum import Enum |
18 | 23 | from pathlib import Path |
19 | 24 | from textwrap import dedent |
20 | 25 | from types import BuiltinFunctionType, FunctionType, SimpleNamespace |
21 | 26 | from typing import ( |
22 | 27 | TYPE_CHECKING, |
| 28 | + Annotated, |
23 | 29 | Any, |
24 | 30 | Callable, |
25 | | - Dict, |
26 | 31 | Generic, |
27 | | - Iterator, |
28 | | - Mapping, |
29 | 32 | NoReturn, |
30 | 33 | Optional, |
31 | | - Sequence, |
32 | 34 | TypeVar, |
33 | 35 | Union, |
34 | 36 | cast, |
|
44 | 46 | from pydantic.dataclasses import is_pydantic_dataclass |
45 | 47 | from pydantic.fields import FieldInfo |
46 | 48 | from pydantic_core import PydanticUndefined |
47 | | -from typing_extensions import Annotated, _AnnotatedAlias, get_args, get_origin |
| 49 | +from typing_extensions import _AnnotatedAlias, get_args, get_origin |
48 | 50 |
|
49 | 51 | from pydantic_settings.utils import path_type_label |
50 | 52 |
|
@@ -412,7 +414,7 @@ def get_field_value(self, field: FieldInfo, field_name: str) -> tuple[Any, str, |
412 | 414 |
|
413 | 415 | def __call__(self) -> dict[str, Any]: |
414 | 416 | return ( |
415 | | - TypeAdapter(Dict[str, Any]).dump_python(self.init_kwargs) |
| 417 | + TypeAdapter(dict[str, Any]).dump_python(self.init_kwargs) |
416 | 418 | if self.nested_model_default_partial_update |
417 | 419 | else self.init_kwargs |
418 | 420 | ) |
@@ -1253,7 +1255,7 @@ def __init__( |
1253 | 1255 | cli_parse_args = sys.argv[1:] |
1254 | 1256 | elif not isinstance(cli_parse_args, (list, tuple)): |
1255 | 1257 | raise SettingsError( |
1256 | | - f'cli_parse_args must be List[str] or Tuple[str, ...], recieved {type(cli_parse_args)}' |
| 1258 | + f'cli_parse_args must be a list or tuple of strings, received {type(cli_parse_args)}' |
1257 | 1259 | ) |
1258 | 1260 | self._load_env_vars(parsed_args=self._parse_args(self.root_parser, cli_parse_args)) |
1259 | 1261 |
|
@@ -1512,12 +1514,6 @@ def _verify_cli_flag_annotations(self, model: type[BaseModel], field_name: str, |
1512 | 1514 |
|
1513 | 1515 | if field_info.annotation is not bool: |
1514 | 1516 | raise SettingsError(f'{cli_flag_name} argument {model.__name__}.{field_name} is not of type bool') |
1515 | | - elif sys.version_info < (3, 9) and ( |
1516 | | - field_info.default is PydanticUndefined and field_info.default_factory is None |
1517 | | - ): |
1518 | | - raise SettingsError( |
1519 | | - f'{cli_flag_name} argument {model.__name__}.{field_name} must have default for python versions < 3.9' |
1520 | | - ) |
1521 | 1517 |
|
1522 | 1518 | def _sort_arg_fields(self, model: type[BaseModel]) -> list[tuple[str, FieldInfo]]: |
1523 | 1519 | positional_variadic_arg = [] |
@@ -1812,19 +1808,11 @@ def _check_kebab_name(self, name: str) -> str: |
1812 | 1808 |
|
1813 | 1809 | def _convert_bool_flag(self, kwargs: dict[str, Any], field_info: FieldInfo, model_default: Any) -> None: |
1814 | 1810 | if kwargs['metavar'] == 'bool': |
1815 | | - default = None |
1816 | | - if field_info.default is not PydanticUndefined: |
1817 | | - default = field_info.default |
1818 | | - if model_default is not PydanticUndefined: |
1819 | | - default = model_default |
1820 | | - if sys.version_info >= (3, 9) or isinstance(default, bool): |
1821 | | - if (self.cli_implicit_flags or _CliImplicitFlag in field_info.metadata) and ( |
1822 | | - _CliExplicitFlag not in field_info.metadata |
1823 | | - ): |
1824 | | - del kwargs['metavar'] |
1825 | | - kwargs['action'] = ( |
1826 | | - BooleanOptionalAction if sys.version_info >= (3, 9) else f'store_{str(not default).lower()}' |
1827 | | - ) |
| 1811 | + if (self.cli_implicit_flags or _CliImplicitFlag in field_info.metadata) and ( |
| 1812 | + _CliExplicitFlag not in field_info.metadata |
| 1813 | + ): |
| 1814 | + del kwargs['metavar'] |
| 1815 | + kwargs['action'] = BooleanOptionalAction |
1828 | 1816 |
|
1829 | 1817 | def _convert_positional_arg( |
1830 | 1818 | self, kwargs: dict[str, Any], field_info: FieldInfo, preferred_alias: str, model_default: Any |
|
0 commit comments