88import typing
99import warnings
1010from abc import ABC , abstractmethod
11- from argparse import SUPPRESS , ArgumentParser , HelpFormatter , Namespace , _SubParsersAction
11+ from argparse import SUPPRESS , ArgumentParser , Namespace , RawDescriptionHelpFormatter , _SubParsersAction
1212from collections import deque
1313from dataclasses import is_dataclass
1414from enum import Enum
1515from pathlib import Path
16+ from textwrap import dedent
1617from types import FunctionType
1718from typing import (
1819 TYPE_CHECKING ,
@@ -916,7 +917,7 @@ class CliSettingsSource(EnvSettingsSource, Generic[T]):
916917 Defaults to `argparse._SubParsersAction.add_parser`.
917918 add_subparsers_method: The root parser add subparsers (sub-commands) method.
918919 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 `.
920921 """
921922
922923 def __init__ (
@@ -938,7 +939,7 @@ def __init__(
938939 add_argument_group_method : Callable [..., Any ] | None = ArgumentParser .add_argument_group ,
939940 add_parser_method : Callable [..., Any ] | None = _SubParsersAction .add_parser ,
940941 add_subparsers_method : Callable [..., Any ] | None = ArgumentParser .add_subparsers ,
941- formatter_class : Any = HelpFormatter ,
942+ formatter_class : Any = RawDescriptionHelpFormatter ,
942943 ) -> None :
943944 self .cli_prog_name = (
944945 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__(
990991
991992 root_parser = (
992993 _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 ,
994998 )
995999 if root_parser is None
9961000 else root_parser
@@ -1359,7 +1363,7 @@ def _connect_root_parser(
13591363 add_argument_group_method : Callable [..., Any ] | None = ArgumentParser .add_argument_group ,
13601364 add_parser_method : Callable [..., Any ] | None = _SubParsersAction .add_parser ,
13611365 add_subparsers_method : Callable [..., Any ] | None = ArgumentParser .add_subparsers ,
1362- formatter_class : Any = HelpFormatter ,
1366+ formatter_class : Any = RawDescriptionHelpFormatter ,
13631367 ) -> None :
13641368 self ._root_parser = root_parser
13651369 self ._parse_args = self ._connect_parser_method (parse_args_method , 'parsed_args_method' )
@@ -1413,7 +1417,7 @@ def _add_parser_args(
14131417 field_name ,
14141418 help = field_info .description ,
14151419 formatter_class = self ._formatter_class ,
1416- description = model .__doc__ ,
1420+ description = None if model .__doc__ is None else dedent ( model . __doc__ ) ,
14171421 ),
14181422 model = model ,
14191423 added_args = [],
@@ -1505,7 +1509,9 @@ def _add_parser_submodels(
15051509 model_group_kwargs : dict [str , Any ] = {}
15061510 model_group_kwargs ['title' ] = f'{ arg_names [0 ]} options'
15071511 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__ )
15091515 if self .cli_use_class_docs_for_groups and len (sub_models ) == 1
15101516 else field_info .description
15111517 )
0 commit comments