Class: Etna::GenerateCompletionScript
- Inherits:
-
Command
- Object
- Command
- Etna::GenerateCompletionScript
- Defined in:
- lib/etna/generate_autocompletion_script.rb
Instance Method Summary collapse
- #enable_flags(flags_container) ⇒ Object
- #execute ⇒ Object
- #generate_flag_handling ⇒ Object
- #generate_for_command(command) ⇒ Object
- #generate_for_scope(scope) ⇒ Object
- #generate_start_match(completions, include_flags = true) ⇒ Object
- #program_name ⇒ Object
- #write(string) ⇒ Object
Instance Method Details
#enable_flags(flags_container) ⇒ Object
61 62 63 64 65 66 67 68 69 70 71 72 73 |
# File 'lib/etna/generate_autocompletion_script.rb', line 61 def enable_flags(flags_container) boolean_flags = flags_container.boolean_flags multi_flags = flags_container.multi_flags arg_flags = flags_container.string_flags + multi_flags flags = boolean_flags + arg_flags write %Q(all_flag_completion_names="$all_flag_completion_names #{flags.join(' ')} ") write %Q(arg_flag_completion_names="$arg_flag_completion_names #{arg_flags.join(' ')} ") write %Q(multi_flags="$multi_flags #{multi_flags.join(' ')} ") arg_flags.each do |flag| write %Q(declare _completions_for_#{flag_as_parameter(flag)}="#{completions_for(flag_as_parameter(flag)).join(' ')}") end end |
#execute ⇒ Object
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
# File 'lib/etna/generate_autocompletion_script.rb', line 102 def execute name = File.basename(program_name) write <<-EOF #!/usr/bin/env bash function _#{name}_completions() { _#{name}_inner_completions "${COMP_WORDS[@]:1:COMP_CWORD}" } function _#{name}_inner_completions() { local all_flag_completion_names='' local arg_flag_completion_names='' local multi_flags='' local all_completion_names='' local i='' local a='' EOF generate_for_scope(parent) write <<-EOF } complete -o default -F _#{name}_completions #{name} EOF File.open("#{name}.completion", 'w') { |f| f.write(@script) } end |
#generate_flag_handling ⇒ Object
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
# File 'lib/etna/generate_autocompletion_script.rb', line 28 def generate_flag_handling write %Q(elif [[ -z "$(echo $all_flag_completion_names | xargs)" ]]; then) write "return" write %Q(elif [[ "$all_flag_completion_names" =~ $1\\ ]]; then) write %Q(if ! [[ "$multi_flags" =~ $1\\ ]]; then) write %Q(all_flag_completion_names="${all_flag_completion_names//$1\\ /}") write 'fi' write 'a=$1' write 'shift' write %Q(if [[ "$arg_flag_completion_names" =~ $a\\ ]]; then) write 'if [[ "$#" == "1" ]]; then' write %Q(a="${a//--/}") write %Q(a="${a//-/_}") write %Q(i="_completions_for_$a") write %Q(all_completion_names="${!i}") write 'COMPREPLY=($(compgen -W "$all_completion_names" -- "$1"))' write 'return' write 'fi' write 'shift' write 'fi' end |
#generate_for_command(command) ⇒ Object
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# File 'lib/etna/generate_autocompletion_script.rb', line 8 def generate_for_command(command) completions = command.completions completions.each do |c| generate_start_match(c, false) write "fi" write "shift" end enable_flags(command.class) write 'while [[ "$#" != "0" ]]; do' generate_start_match([]) generate_flag_handling write "else" write "return" write 'fi' write 'done' write "return" end |
#generate_for_scope(scope) ⇒ Object
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
# File 'lib/etna/generate_autocompletion_script.rb', line 75 def generate_for_scope(scope) enable_flags(scope.class) write 'while [[ "$#" != "0" ]]; do' generate_start_match(scope.subcommands.keys) scope.subcommands.each do |name, command| write %Q(elif [[ "$1" == "#{name}" ]]; then) write 'shift' if command.class.included_modules.include?(CommandExecutor) generate_for_scope(command) else generate_for_command(command) end end generate_flag_handling write "else" write "return" write "fi" write 'done' end |
#generate_start_match(completions, include_flags = true) ⇒ Object
50 51 52 53 54 55 56 57 58 59 |
# File 'lib/etna/generate_autocompletion_script.rb', line 50 def generate_start_match(completions, include_flags=true) write 'if [[ "$#" == "1" ]]; then' write %Q(all_completion_names="#{completions.join(' ')}") write %Q(all_completion_names="$all_completion_names $all_flag_completion_names") if include_flags write %Q(if [[ -z "$(echo $all_completion_names | xargs)" ]]; then) write 'return' write 'fi' write 'COMPREPLY=($(compgen -W "$all_completion_names" -- "$1"))' write 'return' end |
#program_name ⇒ Object
98 99 100 |
# File 'lib/etna/generate_autocompletion_script.rb', line 98 def program_name $PROGRAM_NAME end |
#write(string) ⇒ Object
130 131 132 133 134 |
# File 'lib/etna/generate_autocompletion_script.rb', line 130 def write(string) @script ||= "" @script << string @script << "\n" end |