@@ -784,11 +784,15 @@ def parse_known_args(self, args=None, namespace=None):
784784 return super ().parse_known_args (args , namespace )
785785
786786
787+ # type aliases
788+ Flags = t .Union [str , t .Tuple [str , ...]]
789+ SubcommandsDict = t .Dict [str , t .Any ]
790+
791+
787792class ArgParseConfigLoader (CommandLineConfigLoader ):
788793 """A loader that uses the argparse module to load from the command line."""
789794
790795 parser_class = ArgumentParser
791- Flags = t .Union [str , t .Tuple [str , ...]]
792796
793797 def __init__ (
794798 self ,
@@ -797,6 +801,7 @@ def __init__(
797801 flags : t .Optional [t .Dict [Flags , str ]] = None ,
798802 log : t .Any = None ,
799803 classes : t .Optional [t .List [t .Type [t .Any ]]] = None ,
804+ subcommands : t .Optional [SubcommandsDict ] = None ,
800805 * parser_args : t .Any ,
801806 ** parser_kw : t .Any ,
802807 ) -> None :
@@ -837,6 +842,7 @@ def __init__(
837842 self .aliases = aliases or {}
838843 self .flags = flags or {}
839844 self .classes = classes
845+ self .subcommands = subcommands # only used for argcomplete currently
840846
841847 self .parser_args = parser_args
842848 self .version = parser_kw .pop ("version" , None )
@@ -874,6 +880,7 @@ def load_config(self, argv=None, aliases=None, flags=_deprecated, classes=None):
874880 if classes is not None :
875881 self .classes = classes
876882 self ._create_parser ()
883+ self ._argcomplete (self .classes , self .subcommands )
877884 self ._parse_args (argv )
878885 self ._convert_to_config ()
879886 return self .config
@@ -893,6 +900,12 @@ def _create_parser(self):
893900 def _add_arguments (self , aliases , flags , classes ):
894901 raise NotImplementedError ("subclasses must implement _add_arguments" )
895902
903+ def _argcomplete (
904+ self , classes : t .List [t .Any ], subcommands : t .Optional [SubcommandsDict ]
905+ ) -> None :
906+ """If argcomplete is enabled, allow triggering command-line autocompletion"""
907+ pass
908+
896909 def _parse_args (self , args ):
897910 """self.parser->self.parsed_data"""
898911 uargs = [cast_unicode (a ) for a in args ]
@@ -1047,7 +1060,6 @@ def _add_arguments(self, aliases, flags, classes):
10471060 if argcompleter is not None :
10481061 # argcomplete's completers are callables returning list of completion strings
10491062 action .completer = functools .partial (argcompleter , key = key ) # type: ignore
1050- self .argcomplete (classes )
10511063
10521064 def _convert_to_config (self ):
10531065 """self.parsed_data->self.config, parse unrecognized extra args via KVLoader."""
@@ -1097,7 +1109,10 @@ def _handle_unrecognized_alias(self, arg: str) -> None:
10971109 """
10981110 self .log .warning ("Unrecognized alias: '%s', it will have no effect." , arg )
10991111
1100- def argcomplete (self , classes : t .List [t .Any ]) -> None :
1112+ def _argcomplete (
1113+ self , classes : t .List [t .Any ], subcommands : t .Optional [SubcommandsDict ]
1114+ ) -> None :
1115+ """If argcomplete is enabled, allow triggering command-line autocompletion"""
11011116 try :
11021117 import argcomplete # type: ignore[import] # noqa
11031118 except ImportError :
@@ -1107,6 +1122,7 @@ def argcomplete(self, classes: t.List[t.Any]) -> None:
11071122
11081123 finder = argcomplete_config .ExtendedCompletionFinder ()
11091124 finder .config_classes = classes
1125+ finder .subcommands = list (subcommands or [])
11101126 # for ease of testing, pass through self._argcomplete_kwargs if set
11111127 finder (self .parser , ** getattr (self , "_argcomplete_kwargs" , {}))
11121128
0 commit comments