Skip to content

Commit 1403437

Browse files
nicorumolofk
authored andcommitted
Added basic 'argcomplete' completion
completes argument names, sub_parser names and available cores/tools/generators argcomplete completion can be enabled by two ways: 1. Global: can be enabled with the 'activate-global-python-argcomplete' command this only works for zsh and bash 2: Per command: for zsh and bash: eval "$(register-python-argcomplete fusesoc)" for other shells (e.g. powershell): https://github.com/kislyuk/argcomplete/tree/develop/contrib
1 parent cc13f2a commit 1403437

File tree

2 files changed

+53
-5
lines changed

2 files changed

+53
-5
lines changed

fusesoc/main.py

Lines changed: 52 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#!/usr/bin/env python
2+
# PYTHON_ARGCOMPLETE_OK
23
# Copyright FuseSoC contributors
34
# Licensed under the 2-Clause BSD License, see LICENSE for details.
45
# SPDX-License-Identifier: BSD-2-Clause
@@ -11,6 +12,8 @@
1112
import warnings
1213
from pathlib import Path
1314

15+
import argcomplete
16+
1417
try:
1518
from fusesoc.version import version as __version__
1619
except ImportError:
@@ -397,6 +400,41 @@ def update(fs, args):
397400
fs.update_libraries(args.libraries)
398401

399402

403+
class CoreCompleter:
404+
def __call__(self, parsed_args, **kwargs):
405+
config = Config(parsed_args.config)
406+
args_to_config(parsed_args, config)
407+
fs = Fusesoc(config)
408+
cores = fs.get_cores()
409+
return cores
410+
411+
412+
class ToolCompleter:
413+
def __call__(self, parsed_args, **kwargs):
414+
from edalize.edatool import get_edatool, walk_tool_packages
415+
416+
_tp = list(walk_tool_packages())
417+
tools = []
418+
for tool_name in _tp:
419+
try:
420+
tool_class = get_edatool(tool_name)
421+
if tool_class.get_doc(0)["description"]:
422+
tools += [tool_name]
423+
# Ignore any misbehaving backends
424+
except Exception:
425+
pass
426+
return tools
427+
428+
429+
class GenCompleter:
430+
def __call__(self, parsed_args, **kwargs):
431+
config = Config(parsed_args.config)
432+
args_to_config(parsed_args, config)
433+
fs = Fusesoc(config)
434+
cores = fs.get_generators()
435+
return cores
436+
437+
400438
def get_parser():
401439
parser = argparse.ArgumentParser()
402440
subparsers = parser.add_subparsers()
@@ -448,7 +486,9 @@ def get_parser():
448486
parser_core_show = core_subparsers.add_parser(
449487
"show", help="Show information about a core"
450488
)
451-
parser_core_show.add_argument("core", help="Name of the core to show")
489+
parser_core_show.add_argument(
490+
"core", help="Name of the core to show"
491+
).completer = CoreCompleter()
452492
parser_core_show.set_defaults(func=core_info)
453493

454494
# tool subparser
@@ -470,7 +510,7 @@ def get_parser():
470510
parser_core_info = subparsers.add_parser(
471511
"core-info", help="Display details about a core"
472512
)
473-
parser_core_info.add_argument("core")
513+
parser_core_info.add_argument("core").completer = CoreCompleter()
474514
parser_core_info.set_defaults(func=core_info)
475515

476516
# gen subparser
@@ -490,7 +530,9 @@ def get_parser():
490530
parser_gen_show = gen_subparsers.add_parser(
491531
"show", help="Show information about a generator"
492532
)
493-
parser_gen_show.add_argument("generator", help="Name of the generator to show")
533+
parser_gen_show.add_argument(
534+
"generator", help="Name of the generator to show"
535+
).completer = GenCompleter()
494536
parser_gen_show.set_defaults(func=gen_show)
495537

496538
# gen clean subparser
@@ -596,7 +638,9 @@ def get_parser():
596638
parser_run.add_argument("--build", action="store_true", help="Execute build stage")
597639
parser_run.add_argument("--run", action="store_true", help="Execute run stage")
598640
parser_run.add_argument("--target", help="Override default target")
599-
parser_run.add_argument("--tool", help="Override default tool for target")
641+
parser_run.add_argument(
642+
"--tool", help="Override default tool for target"
643+
).completer = ToolCompleter()
600644
parser_run.add_argument(
601645
"--flag",
602646
help="Set custom use flags. Can be specified multiple times",
@@ -616,7 +660,9 @@ def get_parser():
616660
action="store_true",
617661
help="Allow additional properties in core files",
618662
)
619-
parser_run.add_argument("system", help="Select a system to operate on")
663+
parser_run.add_argument(
664+
"system", help="Select a system to operate on"
665+
).completer = CoreCompleter()
620666
parser_run.add_argument(
621667
"backendargs", nargs=argparse.REMAINDER, help="arguments to be sent to backend"
622668
)
@@ -639,6 +685,7 @@ def get_parser():
639685
def parse_args(argv):
640686
parser = get_parser()
641687

688+
argcomplete.autocomplete(parser, always_complete_options=False)
642689
args = parser.parse_args(argv)
643690

644691
if hasattr(args, "func"):

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ dependencies = [
3131
"simplesat>=0.9.1",
3232
"fastjsonschema",
3333
"jsonschema2md",
34+
"argcomplete",
3435
]
3536
requires-python = ">=3.6, <4"
3637

0 commit comments

Comments
 (0)