Skip to content

Commit f574e3f

Browse files
committed
Initial scriptconfig support
[pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci Fix test
1 parent 6c89858 commit f574e3f

File tree

2 files changed

+90
-2
lines changed

2 files changed

+90
-2
lines changed

jsonargparse/_parameter_resolvers.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,22 @@ class ParamData:
4444
component: Optional[Union[Callable, Type, Tuple]] = None
4545
parent: Optional[Union[Type, Tuple]] = None
4646
origin: Optional[Union[str, Tuple]] = None
47+
short_aliases: Optional[List[str]] = None
48+
long_aliases: Optional[List[str]] = None
49+
50+
def _resolve_args_and_dest(self, is_required=False, as_positional=False, nested_key: Optional[str] = None):
51+
name = self.name
52+
dest = (nested_key + "." if nested_key else "") + name
53+
if is_required and as_positional:
54+
args = [dest]
55+
else:
56+
long_names = [name] + list((self.long_aliases or []))
57+
short_names = list(self.short_aliases or [])
58+
nest_prefix = nested_key + "." if nested_key else ""
59+
short_option_strings = ["-" + nest_prefix + n for n in short_names]
60+
long_option_strings = ["--" + nest_prefix + n for n in long_names]
61+
args = short_option_strings + long_option_strings
62+
return args, dest
4763

4864

4965
ParamList = List[ParamData]

jsonargparse/_signatures.py

Lines changed: 74 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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,78 @@ 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+
)
322+
301323
return added_args
302324

325+
def _add_scriptconfig_arguments(
326+
self,
327+
config_cls,
328+
added_args,
329+
function_or_class,
330+
component,
331+
container,
332+
nested_key,
333+
fail_untyped: bool = True,
334+
as_positional: bool = False,
335+
sub_configs: bool = False,
336+
skip: Optional[Set[Union[str, int]]] = None,
337+
linked_targets: Optional[Set[str]] = None,
338+
):
339+
340+
for key, value in config_cls.__default__.items():
341+
from scriptconfig import value as value_mod
342+
343+
if not isinstance(value, value_mod.Value):
344+
# hack
345+
value = value_mod.Value(value)
346+
type_ = value.parsekw["type"]
347+
if type_ is None or not isinstance(type_, type):
348+
annotation = inspect._empty
349+
else:
350+
annotation = type_
351+
param = ParamData(
352+
name=key,
353+
annotation=annotation,
354+
kind=inspect.Parameter.KEYWORD_ONLY,
355+
default=value.value,
356+
doc=value.parsekw["help"],
357+
component=component,
358+
parent=function_or_class,
359+
short_aliases=value.short_alias,
360+
long_aliases=value.alias,
361+
)
362+
self._add_signature_parameter(
363+
container,
364+
nested_key,
365+
param,
366+
added_args,
367+
skip={s for s in (skip or []) if isinstance(s, str)},
368+
fail_untyped=fail_untyped,
369+
sub_configs=sub_configs,
370+
linked_targets=linked_targets,
371+
as_positional=as_positional,
372+
)
373+
303374
def _add_signature_parameter(
304375
self,
305376
container,
@@ -355,8 +426,9 @@ def _add_signature_parameter(
355426
kwargs["required"] = True
356427
is_subclass_typehint = False
357428
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]
429+
# dest = (nested_key + "." if nested_key else "") + name
430+
# args = [dest if is_required and as_positional else "--" + dest]
431+
args, dest = param._resolve_args_and_dest(is_required, as_positional, nested_key)
360432
if param.origin:
361433
parser = container
362434
if not isinstance(container, ArgumentParser):

0 commit comments

Comments
 (0)