8
8
import typing
9
9
import warnings
10
10
from abc import ABC , abstractmethod
11
- from argparse import SUPPRESS , ArgumentParser , HelpFormatter , Namespace , _SubParsersAction
11
+ from argparse import SUPPRESS , ArgumentParser , Namespace , RawDescriptionHelpFormatter , _SubParsersAction
12
12
from collections import deque
13
13
from dataclasses import is_dataclass
14
14
from enum import Enum
15
15
from pathlib import Path
16
+ from textwrap import dedent
16
17
from types import FunctionType
17
18
from typing import (
18
19
TYPE_CHECKING ,
@@ -916,7 +917,7 @@ class CliSettingsSource(EnvSettingsSource, Generic[T]):
916
917
Defaults to `argparse._SubParsersAction.add_parser`.
917
918
add_subparsers_method: The root parser add subparsers (sub-commands) method.
918
919
Defaults to `argparse.ArgumentParser.add_subparsers`.
919
- formatter_class: A class for customizing the root parser help text. Defaults to `argparse.HelpFormatter `.
920
+ formatter_class: A class for customizing the root parser help text. Defaults to `argparse.RawDescriptionHelpFormatter `.
920
921
"""
921
922
922
923
def __init__ (
@@ -938,7 +939,7 @@ def __init__(
938
939
add_argument_group_method : Callable [..., Any ] | None = ArgumentParser .add_argument_group ,
939
940
add_parser_method : Callable [..., Any ] | None = _SubParsersAction .add_parser ,
940
941
add_subparsers_method : Callable [..., Any ] | None = ArgumentParser .add_subparsers ,
941
- formatter_class : Any = HelpFormatter ,
942
+ formatter_class : Any = RawDescriptionHelpFormatter ,
942
943
) -> None :
943
944
self .cli_prog_name = (
944
945
cli_prog_name if cli_prog_name is not None else settings_cls .model_config .get ('cli_prog_name' , sys .argv [0 ])
@@ -990,7 +991,10 @@ def __init__(
990
991
991
992
root_parser = (
992
993
_CliInternalArgParser (
993
- cli_exit_on_error = self .cli_exit_on_error , prog = self .cli_prog_name , description = settings_cls .__doc__
994
+ cli_exit_on_error = self .cli_exit_on_error ,
995
+ prog = self .cli_prog_name ,
996
+ description = None if settings_cls .__doc__ is None else dedent (settings_cls .__doc__ ),
997
+ formatter_class = formatter_class ,
994
998
)
995
999
if root_parser is None
996
1000
else root_parser
@@ -1359,7 +1363,7 @@ def _connect_root_parser(
1359
1363
add_argument_group_method : Callable [..., Any ] | None = ArgumentParser .add_argument_group ,
1360
1364
add_parser_method : Callable [..., Any ] | None = _SubParsersAction .add_parser ,
1361
1365
add_subparsers_method : Callable [..., Any ] | None = ArgumentParser .add_subparsers ,
1362
- formatter_class : Any = HelpFormatter ,
1366
+ formatter_class : Any = RawDescriptionHelpFormatter ,
1363
1367
) -> None :
1364
1368
self ._root_parser = root_parser
1365
1369
self ._parse_args = self ._connect_parser_method (parse_args_method , 'parsed_args_method' )
@@ -1413,7 +1417,7 @@ def _add_parser_args(
1413
1417
field_name ,
1414
1418
help = field_info .description ,
1415
1419
formatter_class = self ._formatter_class ,
1416
- description = model .__doc__ ,
1420
+ description = None if model .__doc__ is None else dedent ( model . __doc__ ) ,
1417
1421
),
1418
1422
model = model ,
1419
1423
added_args = [],
@@ -1505,7 +1509,9 @@ def _add_parser_submodels(
1505
1509
model_group_kwargs : dict [str , Any ] = {}
1506
1510
model_group_kwargs ['title' ] = f'{ arg_names [0 ]} options'
1507
1511
model_group_kwargs ['description' ] = (
1508
- sub_models [0 ].__doc__
1512
+ None
1513
+ if sub_models [0 ].__doc__ is None
1514
+ else dedent (sub_models [0 ].__doc__ )
1509
1515
if self .cli_use_class_docs_for_groups and len (sub_models ) == 1
1510
1516
else field_info .description
1511
1517
)
0 commit comments