Source code for jube2.completion

# JUBE Benchmarking Environment
# Copyright (C) 2008-2023
# Forschungszentrum Juelich GmbH, Juelich Supercomputing Centre
# http://www.fz-juelich.de/jsc/jube
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
"""Shell Completions"""

from __future__ import (print_function,
                        unicode_literals,
                        division)


import jube2.main


# This is formatted once.
BASH_CASE_TEMPLATE = """\
        "{command}")
            COMPREPLY=( $(compgen -W "{opts}" -- ${{cur}}) )
            return 0
            ;;
"""

# This is formatted once.
BASH_SCRIPT_TEMPLATE = """
_{command_name} ()
{{
    local cur prev words cword comm subparsers subcom iter

    COMPREPLY=()

    words=(${{COMP_WORDS[@]}})
    cword=COMP_CWORD
    comm=${{words[0]}}
    cur="${{words[cword]}}"
    prev="${{words[cword-1]}}"
    subcom="${{words[0]}}"
    for iter in ${{words[@]:1}}; do
        if [[ $iter != -* ]] && [[ " {all_subcoms} " == *" $iter "* ]]; then
            subcom=$iter
            break
        fi
    done
    subparsers="{subparser}"

    if [[ ${{cur}} == -* ]] ; then
        case "${{subcom}}" in
{cases_sub}
            *)
        esac
    elif [[ ${{subcom}} == "$comm" ]] ; then
        COMPREPLY=( $(compgen -W "${{subparsers}}" -- ${{cur}}) )
    fi
}} &&
complete -o bashdefault -o default -F _{command_name} {command_name}
"""


[docs]def complete_function_bash(args): """Print completion function for bash.""" subparser = jube2.main.gen_subparser_conf() all_sub_names = " ".join(sorted(subparser)) parser = sorted([opt for opts, kwargs in jube2.main.gen_parser_conf() for opt in opts if opt.startswith("--")]) command_name = args.command_name[0] complete_options = dict() # Iterate over all subparsers for sub_name, sub in sorted(subparser.items()): if "arguments" not in sub: continue # Iterate over all their options tmp_list = [argument for key in sub["arguments"] for argument in key if argument.startswith("--")] complete_options[sub_name] = " ".join(tmp_list) cases_sub = "".join(BASH_CASE_TEMPLATE.format(command=command, opts=opts) for command, opts in sorted(complete_options.items())) cases_sub += BASH_CASE_TEMPLATE.format(command=command_name, opts=" ".join(parser)) subparser_str = " ".join(sorted(subparser.keys())) script = BASH_SCRIPT_TEMPLATE.format( subparser=subparser_str, cases_sub=cases_sub, command_name=command_name, all_subcoms=all_sub_names) print(script)