Skip to content

Commit

Permalink
add script for auto complete shell script generation
Browse files Browse the repository at this point in the history
which except not only scripts but also directories
  • Loading branch information
vanyakosmos committed Oct 18, 2019
1 parent 5964438 commit e988122
Show file tree
Hide file tree
Showing 5 changed files with 73 additions and 11 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ 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/))
- [auto completion](https://argser.readthedocs.io/en/latest/examples.html#auto-completion) in shell (tnx to [argcomplete](https://argcomplete.readthedocs.io/en/latest/))

------

Expand Down
43 changes: 43 additions & 0 deletions argser/__main__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import argparse
import glob
import os
import sys
from typing import List

import argser

argcomplete_desc = "Add auto completion for scripts. Ex: eval \"$(python -m argser auto foo.py)\""


class AutoArgs:
executables: List[str] = argser.PosArg()
use_defaults = True
complete_arguments = argser.Arg(nargs=argparse.REMAINDER)
shell: str = argser.Arg(choices=('bash', 'tcsh', 'fish'), default='bash')


def autocomplete(args: AutoArgs):
import argcomplete

exs = []
for i, ex in enumerate(args.executables):
if os.path.isdir(ex):
exs.extend(glob.glob(os.path.join(ex, '*.py')))
else:
exs.append(ex)
# noinspection PyTypeChecker
sys.stdout.write(argcomplete.shellcode(exs, args.use_defaults, args.shell, args.complete_arguments))


class Args:
auto = argser.sub_command(AutoArgs, help=argcomplete_desc, description=argcomplete_desc)


def main():
args = argser.parse_args(Args, parser_prog='argser')
if args.auto:
autocomplete(args.auto)


if __name__ == '__main__':
main()
27 changes: 21 additions & 6 deletions docs/source/examples.rst
Original file line number Diff line number Diff line change
Expand Up @@ -86,13 +86,13 @@ Actions

.. code-block:: python
class Args:
a = Arg(action='store_const', default='42', const=42)
class Args:
a = Arg(action='store_const', default='42', const=42)
args = parse_args(Args, '')
assert args.a == '42'
args = parse_args(Args, '-a')
assert args.a == 42
args = parse_args(Args, '')
assert args.a == '42'
args = parse_args(Args, '-a')
assert args.a == 42
.. code-block:: python
Expand All @@ -115,3 +115,18 @@ Actions
args = parse_args(Args, '-vvv')
assert args.verbose == 3
Auto completion
**************

Check out argcomplete_.

.. _argcomplete: https://argcomplete.readthedocs.io/en/latest

.. code-block::
eval "$(register-python-argcomplete foo.py)"
eval "$(argser auto foo.py)" # specific file
eval "$(argser auto /path/to/dir)" # all .py files in dir
eval "$(argser auto /path/to/dir foo.py)" # combine
7 changes: 4 additions & 3 deletions docs/source/installation.rst
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ Installation

.. code-block::
pip install argser
pip install argser[tabulate] # for fancy table support
pip install argser[argcomplete] # for shell auto completion
pip install argser
pip install argser[tabulate] # for fancy table support
pip install argser[argcomplete] # for shell auto completion
pip install argser[all]
5 changes: 4 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "argser"
version = "0.0.7"
version = "0.0.8"
description = "Arguments parsing without boilerplate."
authors = ["Bachynin Ivan <bachynin.i@gmail.com>"]
license = "MIT"
Expand Down Expand Up @@ -36,3 +36,6 @@ all = ["tabulate", "argcomplete"]
[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"

[tool.poetry.scripts]
argser = "argser.__main__:main"

0 comments on commit e988122

Please sign in to comment.