Skip to content

Commit

Permalink
add argcomplete support
Browse files Browse the repository at this point in the history
  • Loading branch information
vanyakosmos committed Oct 18, 2019
1 parent d9edbe8 commit 5964438
Show file tree
Hide file tree
Showing 7 changed files with 57 additions and 19 deletions.
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,17 @@ Features:
- 𝕡𝕣𝕖𝕥𝕥𝕪 𝕡𝕣𝕚𝕟𝕥𝕚𝕟𝕘
- support for argparse actions
- auto shortcuts generation: `--verbose -> -v, --foo_bar -> --fb`
- auto completion in shell (with [argcomplete](https://argcomplete.readthedocs.io/en/latest/))

------

## install

```text
pip install argser
pip install argser tabulate # for fancy table support
pip install argser[tabulate] # for fancy tables support
pip install argser[argcomplete] # for shell auto completion
pip install argser[all]
```

## [docs](https://argser.readthedocs.io/en/latest/)
Expand Down
34 changes: 21 additions & 13 deletions argser/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ def __init__(
help=None,
metavar=None,
action='store',
# argcomplete
completer=None,
# extra
bool_flag=True,
one_dash=False,
Expand All @@ -43,6 +45,8 @@ def __init__(
self.help = help
self._metavar = metavar
self.action = action
# argcomplete
self.completer = completer
# extra
self.bool_flag = bool_flag
self.one_dash = one_dash
Expand Down Expand Up @@ -96,22 +100,26 @@ def inject_bool(self, parser: ArgumentParser):
params['help'] = IGNORE
parser.add_argument(*self.names(prefix='no-'), action='store_false', **params)
parser.set_defaults(**{self.dest: self.default})
else:
params = self.params(type=str2bool)
parser.add_argument(*self.names(), **params)
return action
params = self.params(type=str2bool)
return parser.add_argument(*self.names(), **params)

def inject(self, parser: ArgumentParser):
if self.type is bool:
return self.inject_bool(parser)
params = self.params()
action = params.get('action')
if action in (
'store_const', 'store_true', 'store_false', 'append_const', 'version', 'count'
) and 'type' in params:
params.pop('type')
if action in ('store_true', 'store_false', 'count', 'version') and 'metavar' in params:
params.pop('metavar')
parser.add_argument(*self.names(), **params)
action = self.inject_bool(parser)
else:
params = self.params()
action = params.get('action')
if action in (
'store_const', 'store_true', 'store_false', 'append_const', 'version', 'count'
) and 'type' in params:
params.pop('type')
if action in ('store_true', 'store_false', 'count', 'version') and 'metavar' in params:
params.pop('metavar')
action = parser.add_argument(*self.names(), **params)
if callable(self.completer):
action.completer = self.completer
return action


class PosArg(Arg):
Expand Down
15 changes: 13 additions & 2 deletions argser/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,14 @@ def _add_prefixed_key(source: dict, target: dict, prefix: str):
target[m[1]] = value


def _setup_argcomplete(parser, **kwargs):
try:
import argcomplete
argcomplete.autocomplete(parser, **kwargs)
except ImportError:
logger.log(VERBOSE, "argcomplete is not installed")


def parse_args(
args_cls: Type[Args],
args=None,
Expand All @@ -197,6 +205,7 @@ def parse_args(
override=False,
parser_kwargs=None,
tabulate_kwargs=None,
argcomplete_kwargs=None,
**kwargs,
) -> Args:
"""
Expand All @@ -220,12 +229,15 @@ def parse_args(
cols: number of columns. Can be 'auto' - len(args)/N, int - just number of columns,
'sub' / 'sub-auto' / 'sub-INT' - split by sub-commands,
gap: string, space between tables/columns
:param argcomplete_kwargs: argcomplete kwargs
:param kwargs: params for tabulate and parser - tabulate_ARG=VAL or parser_ARG=VAL
"""
tabulate_kwargs = tabulate_kwargs or {}
_add_prefixed_key(kwargs, tabulate_kwargs, 'tabulate_')
parser_kwargs = parser_kwargs or {}
_add_prefixed_key(kwargs, parser_kwargs, 'parser_')
argcomplete_kwargs = argcomplete_kwargs or {}
_add_prefixed_key(kwargs, argcomplete_kwargs, 'argcomplete_')

if isinstance(args, str):
args_to_parse = shlex.split(args)
Expand All @@ -236,15 +248,14 @@ def parse_args(
args_cls,
override=override,
bool_flag=bool_flag,
help_format=help_format,
keep_default_help=keep_default_help,
one_dash=one_dash,
)
if make_shortcuts:
_make_shortcuts_sub_wise(args, sub_commands)
if help_color:
parser_kwargs.setdefault('formatter_class', ColoredHelpFormatter)
parser = _make_parser('root', args, sub_commands, **parser_kwargs)
_setup_argcomplete(parser, **argcomplete_kwargs)

namespace = parser.parse_args(args_to_parse)
logger.log(VERBOSE, namespace)
Expand Down
3 changes: 2 additions & 1 deletion docs/source/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,9 @@
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [
'm2r',
'sphinx.ext.autodoc',
'sphinxcontrib.apidoc',
'm2r',
]

# Add any paths that contain templates here, relative to this directory.
Expand Down
3 changes: 2 additions & 1 deletion docs/source/installation.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@ Installation
.. code-block::
pip install argser
pip install argser tabulate # for fancy table support
pip install argser[tabulate] # for fancy table support
pip install argser[argcomplete] # for shell auto completion
13 changes: 12 additions & 1 deletion poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ classifiers = [
[tool.poetry.dependencies]
python = "^3.6"
tabulate = {version = "^0.8.5", optional = true}
argcomplete = {version = "^1.10", optional = true}

[tool.poetry.dev-dependencies]
pytest = "^5.2"
Expand All @@ -29,6 +30,8 @@ m2r = "^0.2.1"

[tool.poetry.extras]
tabulate = ["tabulate"]
argcomplete = ["argcomplete"]
all = ["tabulate", "argcomplete"]

[build-system]
requires = ["poetry>=0.12"]
Expand Down

0 comments on commit 5964438

Please sign in to comment.