@@ -285,6 +285,7 @@ def _add_signature_arguments(
285285
286286 ## Add parameter arguments ##
287287 added_args : List [str ] = []
288+
288289 for param in params :
289290 self ._add_signature_parameter (
290291 container ,
@@ -298,8 +299,76 @@ def _add_signature_arguments(
298299 as_positional = as_positional ,
299300 )
300301
302+ if hasattr (function_or_class , '__scriptconfig__' ):
303+ # Integrate with scriptconfig style classes.
304+ # When a function/class has a __scriptconfig__ object that means it
305+ # should accept any of the options defined in the config as keyword
306+ # arguments. We can utilize additional metadata stored in the
307+ # scriptconfig object to enrich our CLI.
308+ config_cls = function_or_class .__scriptconfig__
309+ self ._add_scriptconfig_arguments (
310+ config_cls = config_cls ,
311+ added_args = added_args ,
312+ function_or_class = function_or_class ,
313+ component = component ,
314+ container = container ,
315+ nested_key = nested_key ,
316+ fail_untyped = fail_untyped ,
317+ as_positional = as_positional ,
318+ sub_configs = sub_configs ,
319+ skip = skip ,
320+ linked_targets = linked_targets )
321+
301322 return added_args
302323
324+ def _add_scriptconfig_arguments (
325+ self ,
326+ config_cls ,
327+ added_args ,
328+ function_or_class ,
329+ component ,
330+ container ,
331+ nested_key ,
332+ fail_untyped : bool = True ,
333+ as_positional : bool = False ,
334+ sub_configs : bool = False ,
335+ skip : Optional [Set [Union [str , int ]]] = None ,
336+ linked_targets : Optional [Set [str ]] = None ,
337+ ):
338+
339+ for key , value in config_cls .__default__ .items ():
340+ from scriptconfig import value as value_mod
341+ if not isinstance (value , value_mod .Value ):
342+ # hack
343+ value = value_mod .Value (value )
344+ type_ = value .parsekw ['type' ]
345+ if type_ is None or not isinstance (type_ , type ):
346+ annotation = inspect ._empty
347+ else :
348+ annotation = type_
349+ param = ParamData (
350+ name = key ,
351+ annotation = annotation ,
352+ kind = inspect .Parameter .KEYWORD_ONLY ,
353+ default = value .value ,
354+ doc = value .parsekw ['help' ],
355+ component = component ,
356+ parent = function_or_class ,
357+ short_aliases = value .short_alias ,
358+ long_aliases = value .alias ,
359+ )
360+ self ._add_signature_parameter (
361+ container ,
362+ nested_key ,
363+ param ,
364+ added_args ,
365+ skip = {s for s in (skip or []) if isinstance (s , str )},
366+ fail_untyped = fail_untyped ,
367+ sub_configs = sub_configs ,
368+ linked_targets = linked_targets ,
369+ as_positional = as_positional ,
370+ )
371+
303372 def _add_signature_parameter (
304373 self ,
305374 container ,
@@ -355,8 +424,9 @@ def _add_signature_parameter(
355424 kwargs ["required" ] = True
356425 is_subclass_typehint = False
357426 is_dataclass_like_typehint = is_dataclass_like (annotation )
358- dest = (nested_key + "." if nested_key else "" ) + name
359- args = [dest if is_required and as_positional else "--" + dest ]
427+ # dest = (nested_key + "." if nested_key else "") + name
428+ # args = [dest if is_required and as_positional else "--" + dest]
429+ args , dest = param ._resolve_args_and_dest (is_required , as_positional , nested_key )
360430 if param .origin :
361431 parser = container
362432 if not isinstance (container , ArgumentParser ):
0 commit comments