From 7e83f45c592a591379d1ac6adb21adfac1469cd4 Mon Sep 17 00:00:00 2001 From: theapache64 Date: Fri, 8 May 2020 18:00:38 +0530 Subject: [PATCH] =?UTF-8?q?=E2=97=80=EF=B8=8F=20audo=20completion=20script?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 3 + gpm_completion | 262 ++++++++++++++++++ install.sh | 0 .../com/theapache64/gpm/commands/gpm/Gpm.kt | 2 +- 4 files changed, 266 insertions(+), 1 deletion(-) create mode 100644 gpm_completion create mode 100644 install.sh diff --git a/build.gradle b/build.gradle index a71a398..67863ea 100644 --- a/build.gradle +++ b/build.gradle @@ -59,6 +59,9 @@ dependencies { // DaggerMock testImplementation 'com.github.fabioCollini.daggermock:daggermock:0.8.5' testImplementation 'com.github.fabioCollini.daggermock:daggermock-kotlin:0.8.5' + + // OkHttp:For networking + implementation 'com.squareup.okhttp3:okhttp:4.6.0' } compileKotlin { diff --git a/gpm_completion b/gpm_completion new file mode 100644 index 0000000..3042e66 --- /dev/null +++ b/gpm_completion @@ -0,0 +1,262 @@ +#!/usr/bin/env bash +# +# gpm Bash Completion +# ======================= +# +# Bash completion support for the `gpm` command, +# generated by [picocli](http://picocli.info/) version 4.2.0. +# +# Installation +# ------------ +# +# 1. Source all completion scripts in your .bash_profile +# +# cd $YOUR_APP_HOME/bin +# for f in $(find . -name "*_completion"); do line=". $(pwd)/$f"; grep "$line" ~/.bash_profile || echo "$line" >> ~/.bash_profile; done +# +# 2. Open a new bash console, and type `gpm [TAB][TAB]` +# +# 1a. Alternatively, if you have [bash-completion](https://github.com/scop/bash-completion) installed: +# Place this file in a `bash-completion.d` folder: +# +# * /etc/bash-completion.d +# * /usr/local/etc/bash-completion.d +# * ~/bash-completion.d +# +# Documentation +# ------------- +# The script is called by bash whenever [TAB] or [TAB][TAB] is pressed after +# 'gpm (..)'. By reading entered command line parameters, +# it determines possible bash completions and writes them to the COMPREPLY variable. +# Bash then completes the user input if only one entry is listed in the variable or +# shows the options if more than one is listed in COMPREPLY. +# +# References +# ---------- +# [1] http://stackoverflow.com/a/12495480/1440785 +# [2] http://tiswww.case.edu/php/chet/bash/FAQ +# [3] https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html +# [4] http://zsh.sourceforge.net/Doc/Release/Options.html#index-COMPLETE_005fALIASES +# [5] https://stackoverflow.com/questions/17042057/bash-check-element-in-array-for-elements-in-another-array/17042655#17042655 +# [6] https://www.gnu.org/software/bash/manual/html_node/Programmable-Completion.html#Programmable-Completion +# [7] https://stackoverflow.com/questions/3249432/can-a-bash-tab-completion-script-be-used-in-zsh/27853970#27853970 +# + +if [ -n "$BASH_VERSION" ]; then + # Enable programmable completion facilities when using bash (see [3]) + shopt -s progcomp +elif [ -n "$ZSH_VERSION" ]; then + # Make alias a distinct command for completion purposes when using zsh (see [4]) + setopt COMPLETE_ALIASES + alias compopt=complete + + # Enable bash completion in zsh (see [7]) + autoload -U +X compinit && compinit + autoload -U +X bashcompinit && bashcompinit +fi + +# CompWordsContainsArray takes an array and then checks +# if all elements of this array are in the global COMP_WORDS array. +# +# Returns zero (no error) if all elements of the array are in the COMP_WORDS array, +# otherwise returns 1 (error). +function CompWordsContainsArray() { + declare -a localArray + localArray=("$@") + local findme + for findme in "${localArray[@]}"; do + if ElementNotInCompWords "$findme"; then return 1; fi + done + return 0 +} +function ElementNotInCompWords() { + local findme="$1" + local element + for element in "${COMP_WORDS[@]}"; do + if [[ "$findme" = "$element" ]]; then return 1; fi + done + return 0 +} + +# The `currentPositionalIndex` function calculates the index of the current positional parameter. +# +# currentPositionalIndex takes three parameters: +# the command name, +# a space-separated string with the names of options that take a parameter, and +# a space-separated string with the names of boolean options (that don't take any params). +# When done, this function echos the current positional index to std_out. +# +# Example usage: +# local currIndex=$(currentPositionalIndex "mysubcommand" "$ARG_OPTS" "$FLAG_OPTS") +function currentPositionalIndex() { + local commandName="$1" + local optionsWithArgs="$2" + local booleanOptions="$3" + local previousWord + local result=0 + + for i in $(seq $((COMP_CWORD - 1)) -1 0); do + previousWord=${COMP_WORDS[i]} + if [ "${previousWord}" = "$commandName" ]; then + break + fi + if [[ "${optionsWithArgs}" =~ ${previousWord} ]]; then + ((result-=2)) # Arg option and its value not counted as positional param + elif [[ "${booleanOptions}" =~ ${previousWord} ]]; then + ((result-=1)) # Flag option itself not counted as positional param + fi + ((result++)) + done + echo "$result" +} + +# Bash completion entry point function. +# _complete_gpm finds which commands and subcommands have been specified +# on the command line and delegates to the appropriate function +# to generate possible options and subcommands for the last specified subcommand. +function _complete_gpm() { + local cmds0=(install) + local cmds1=(i) + local cmds2=(uninstall) + local cmds3=(u) + local cmds4=(docs) + local cmds5=(d) + + if CompWordsContainsArray "${cmds5[@]}"; then _picocli_gpm_d; return $?; fi + if CompWordsContainsArray "${cmds4[@]}"; then _picocli_gpm_docs; return $?; fi + if CompWordsContainsArray "${cmds3[@]}"; then _picocli_gpm_u; return $?; fi + if CompWordsContainsArray "${cmds2[@]}"; then _picocli_gpm_uninstall; return $?; fi + if CompWordsContainsArray "${cmds1[@]}"; then _picocli_gpm_i; return $?; fi + if CompWordsContainsArray "${cmds0[@]}"; then _picocli_gpm_install; return $?; fi + + # No subcommands were specified; generate completions for the top-level command. + _picocli_gpm; return $?; +} + +# Generates completions for the options and subcommands of the `gpm` command. +function _picocli_gpm() { + # Get completion data + local curr_word=${COMP_WORDS[COMP_CWORD]} + + local commands="install i uninstall u docs d" + local flag_opts="-h --help -V --version" + local arg_opts="" + + if [[ "${curr_word}" == -* ]]; then + COMPREPLY=( $(compgen -W "${flag_opts} ${arg_opts}" -- "${curr_word}") ) + else + local positionals="" + COMPREPLY=( $(compgen -W "${commands} ${positionals}" -- "${curr_word}") ) + fi +} + +# Generates completions for the options and subcommands of the `install` subcommand. +function _picocli_gpm_install() { + # Get completion data + local curr_word=${COMP_WORDS[COMP_CWORD]} + + local commands="" + local flag_opts="-S --save -D --save-dev -DA --save-dev-android" + local arg_opts="" + + if [[ "${curr_word}" == -* ]]; then + COMPREPLY=( $(compgen -W "${flag_opts} ${arg_opts}" -- "${curr_word}") ) + else + local positionals="" + COMPREPLY=( $(compgen -W "${commands} ${positionals}" -- "${curr_word}") ) + fi +} + +# Generates completions for the options and subcommands of the `i` subcommand. +function _picocli_gpm_i() { + # Get completion data + local curr_word=${COMP_WORDS[COMP_CWORD]} + + local commands="" + local flag_opts="-S --save -D --save-dev -DA --save-dev-android" + local arg_opts="" + + if [[ "${curr_word}" == -* ]]; then + COMPREPLY=( $(compgen -W "${flag_opts} ${arg_opts}" -- "${curr_word}") ) + else + local positionals="" + COMPREPLY=( $(compgen -W "${commands} ${positionals}" -- "${curr_word}") ) + fi +} + +# Generates completions for the options and subcommands of the `uninstall` subcommand. +function _picocli_gpm_uninstall() { + # Get completion data + local curr_word=${COMP_WORDS[COMP_CWORD]} + + local commands="" + local flag_opts="-S --save -D --save-dev -DA --save-dev-android" + local arg_opts="" + + if [[ "${curr_word}" == -* ]]; then + COMPREPLY=( $(compgen -W "${flag_opts} ${arg_opts}" -- "${curr_word}") ) + else + local positionals="" + COMPREPLY=( $(compgen -W "${commands} ${positionals}" -- "${curr_word}") ) + fi +} + +# Generates completions for the options and subcommands of the `u` subcommand. +function _picocli_gpm_u() { + # Get completion data + local curr_word=${COMP_WORDS[COMP_CWORD]} + + local commands="" + local flag_opts="-S --save -D --save-dev -DA --save-dev-android" + local arg_opts="" + + if [[ "${curr_word}" == -* ]]; then + COMPREPLY=( $(compgen -W "${flag_opts} ${arg_opts}" -- "${curr_word}") ) + else + local positionals="" + COMPREPLY=( $(compgen -W "${commands} ${positionals}" -- "${curr_word}") ) + fi +} + +# Generates completions for the options and subcommands of the `docs` subcommand. +function _picocli_gpm_docs() { + # Get completion data + local curr_word=${COMP_WORDS[COMP_CWORD]} + + local commands="" + local flag_opts="" + local arg_opts="" + + if [[ "${curr_word}" == -* ]]; then + COMPREPLY=( $(compgen -W "${flag_opts} ${arg_opts}" -- "${curr_word}") ) + else + local positionals="" + COMPREPLY=( $(compgen -W "${commands} ${positionals}" -- "${curr_word}") ) + fi +} + +# Generates completions for the options and subcommands of the `d` subcommand. +function _picocli_gpm_d() { + # Get completion data + local curr_word=${COMP_WORDS[COMP_CWORD]} + + local commands="" + local flag_opts="" + local arg_opts="" + + if [[ "${curr_word}" == -* ]]; then + COMPREPLY=( $(compgen -W "${flag_opts} ${arg_opts}" -- "${curr_word}") ) + else + local positionals="" + COMPREPLY=( $(compgen -W "${commands} ${positionals}" -- "${curr_word}") ) + fi +} + +# Define a completion specification (a compspec) for the +# `gpm`, `gpm.sh`, and `gpm.bash` commands. +# Uses the bash `complete` builtin (see [6]) to specify that shell function +# `_complete_gpm` is responsible for generating possible completions for the +# current word on the command line. +# The `-o default` option means that if the function generated no matches, the +# default Bash completions and the Readline default filename completions are performed. +complete -F _complete_gpm -o default gpm gpm.sh gpm.bash diff --git a/install.sh b/install.sh new file mode 100644 index 0000000..e69de29 diff --git a/src/main/kotlin/com/theapache64/gpm/commands/gpm/Gpm.kt b/src/main/kotlin/com/theapache64/gpm/commands/gpm/Gpm.kt index c0e7250..5ed6deb 100644 --- a/src/main/kotlin/com/theapache64/gpm/commands/gpm/Gpm.kt +++ b/src/main/kotlin/com/theapache64/gpm/commands/gpm/Gpm.kt @@ -20,7 +20,7 @@ import javax.inject.Singleton ] ) @Singleton -class Gpm @Inject constructor(isFromTest: Boolean) : BaseCommand(isFromTest) { +class Gpm @Inject constructor(isFromTest: Boolean = false) : BaseCommand(isFromTest) { init { DaggerGpmComponent.create().inject(this)