@@ -52,7 +52,10 @@ def CLI(
5252 module = inspect .getmodule (caller ).__name__ # type: ignore
5353 components = [
5454 v for v in caller .f_locals .values ()
55- if (inspect .isfunction (v ) or inspect .isclass (v )) and inspect .getmodule (v ).__name__ == module # type: ignore
55+ if (
56+ (inspect .isclass (v ) or callable (v )) and
57+ getattr (inspect .getmodule (v ), '__name__' , None ) == module
58+ )
5659 ]
5760 if len (components ) == 0 :
5861 raise ValueError ('Either components argument must be given or there must be at least one '
@@ -61,6 +64,10 @@ def CLI(
6164 elif not isinstance (components , list ):
6265 components = [components ]
6366
67+ unexpected = [c for c in components if not (inspect .isclass (c ) or callable (c ))]
68+ if unexpected :
69+ raise ValueError (f'Unexpected components, not class or function: { unexpected } ' )
70+
6471 parser = parser_class (default_meta = False , ** kwargs )
6572 parser .add_argument ('--config' , action = ActionConfigFile , help = config_help )
6673
@@ -108,11 +115,7 @@ def get_help_str(component, logger):
108115
109116def _add_component_to_parser (component , parser , as_positional , fail_untyped , config_help ):
110117 kwargs = dict (as_positional = as_positional , fail_untyped = fail_untyped , sub_configs = True )
111- if inspect .isfunction (component ):
112- added_args = parser .add_function_arguments (component , as_group = False , ** kwargs )
113- if not parser .description :
114- parser .description = get_help_str (component , parser .logger )
115- else :
118+ if inspect .isclass (component ):
116119 added_args = parser .add_class_arguments (component , ** kwargs )
117120 subcommands = parser .add_subcommands (required = True )
118121 for key in [k for k , v in inspect .getmembers (component ) if callable (v ) and k [0 ] != '_' ]:
@@ -124,12 +127,16 @@ def _add_component_to_parser(component, parser, as_positional, fail_untyped, con
124127 if not added_subargs :
125128 remove_actions (subparser , (ActionConfigFile , _ActionPrintConfig ))
126129 subcommands .add_subcommand (key , subparser , help = get_help_str (getattr (component , key ), parser .logger ))
130+ else :
131+ added_args = parser .add_function_arguments (component , as_group = False , ** kwargs )
132+ if not parser .description :
133+ parser .description = get_help_str (component , parser .logger )
127134 return added_args
128135
129136
130137def _run_component (component , cfg ):
131138 cfg .pop ('config' , None )
132- if inspect .isfunction (component ):
139+ if not inspect .isclass (component ):
133140 return component (** cfg )
134141 subcommand = cfg .pop ('subcommand' )
135142 subcommand_cfg = cfg .pop (subcommand , {})
0 commit comments