@@ -52,7 +52,10 @@ def CLI(
52
52
module = inspect .getmodule (caller ).__name__ # type: ignore
53
53
components = [
54
54
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
+ )
56
59
]
57
60
if len (components ) == 0 :
58
61
raise ValueError ('Either components argument must be given or there must be at least one '
@@ -61,6 +64,10 @@ def CLI(
61
64
elif not isinstance (components , list ):
62
65
components = [components ]
63
66
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
+
64
71
parser = parser_class (default_meta = False , ** kwargs )
65
72
parser .add_argument ('--config' , action = ActionConfigFile , help = config_help )
66
73
@@ -108,11 +115,7 @@ def get_help_str(component, logger):
108
115
109
116
def _add_component_to_parser (component , parser , as_positional , fail_untyped , config_help ):
110
117
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 ):
116
119
added_args = parser .add_class_arguments (component , ** kwargs )
117
120
subcommands = parser .add_subcommands (required = True )
118
121
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
124
127
if not added_subargs :
125
128
remove_actions (subparser , (ActionConfigFile , _ActionPrintConfig ))
126
129
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 )
127
134
return added_args
128
135
129
136
130
137
def _run_component (component , cfg ):
131
138
cfg .pop ('config' , None )
132
- if inspect .isfunction (component ):
139
+ if not inspect .isclass (component ):
133
140
return component (** cfg )
134
141
subcommand = cfg .pop ('subcommand' )
135
142
subcommand_cfg = cfg .pop (subcommand , {})
0 commit comments