Skip to content

Commit aac2bd1

Browse files
authored
shtab support for optionals parsed as positionals (#700)
1 parent 69b7e33 commit aac2bd1

File tree

3 files changed

+32
-1
lines changed

3 files changed

+32
-1
lines changed

CHANGELOG.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ Added
1919
^^^^^
2020
- ``shtab`` hint for positionals in bash now includes the argument name (`#699
2121
<https://github.com/omni-us/jsonargparse/pull/699>`__).
22+
- ``shtab`` support for optionals parsed as positionals (`#700
23+
<https://github.com/omni-us/jsonargparse/pull/700>`__).
2224

2325
Changed
2426
^^^^^^^

jsonargparse/_completions.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@
66
from collections import defaultdict
77
from contextlib import contextmanager, suppress
88
from contextvars import ContextVar
9+
from copy import deepcopy
910
from enum import Enum
1011
from importlib.util import find_spec
1112
from subprocess import PIPE, Popen
1213
from typing import List, Literal, Union
1314

1415
from ._actions import ActionConfigFile, _ActionConfigLoad, _ActionHelpClassPath, remove_actions
16+
from ._common import get_optionals_as_positionals_actions, get_parsing_setting
1517
from ._parameter_resolvers import get_signature_parameters
1618
from ._typehints import (
1719
ActionTypeHint,
@@ -129,6 +131,12 @@ def shtab_prepare_actions(parser) -> None:
129131
if parser._subcommands_action:
130132
for subparser in parser._subcommands_action._name_parser_map.values():
131133
shtab_prepare_actions(subparser)
134+
if get_parsing_setting("parse_optionals_as_positionals"):
135+
for action in get_optionals_as_positionals_actions(parser):
136+
clone = deepcopy(action)
137+
clone.option_strings = []
138+
clone.nargs = "?"
139+
parser._actions.append(clone)
132140
for action in parser._actions:
133141
shtab_prepare_action(action, parser)
134142

jsonargparse_tests/test_shtab.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
import pytest
1212

13-
from jsonargparse import ArgumentParser
13+
from jsonargparse import ArgumentParser, set_parsing_settings
1414
from jsonargparse._completions import norm_name
1515
from jsonargparse._parameter_resolvers import get_signature_parameters
1616
from jsonargparse._typehints import type_to_str
@@ -196,6 +196,27 @@ def test_bash_positional(parser, subtests):
196196
)
197197

198198

199+
def test_shtab_bash_optionals_as_positionals(parser, subtests):
200+
with patch.dict("jsonargparse._common.parsing_settings"):
201+
set_parsing_settings(parse_optionals_as_positionals=True)
202+
parser.prog = "tool"
203+
204+
parser.add_argument("job", type=str)
205+
parser.add_argument("--amount", type=int, default=0)
206+
parser.add_argument("--flag", type=bool, default=False)
207+
assert_bash_typehint_completions(
208+
subtests,
209+
parser,
210+
[
211+
("job", str, "", [], None),
212+
("job", str, "easy", [], None),
213+
("amount", int, "easy ", [], None),
214+
("amount", int, "easy 10", [], None),
215+
("flag", bool, "easy 10 x", [], "0/2"),
216+
],
217+
)
218+
219+
199220
def test_bash_config(parser):
200221
parser.add_argument("--cfg", action="config")
201222
shtab_script = get_shtab_script(parser, "bash")

0 commit comments

Comments
 (0)