Class: Etna::GenerateCompletionScript

Inherits:
Command
  • Object
show all
Defined in:
lib/etna/generate_autocompletion_script.rb

Instance Attribute Summary

Attributes inherited from Command

#parent

Instance Method Summary collapse

Methods inherited from Command

#completions, #fill_in_missing_params, #find_command, #initialize, parent_scope, #setup

Methods included from CommandOrExecutor

#command_name, #completions_for, #desc, #flag_argspec, #flag_as_parameter, included, #parse_flags, #usage

Constructor Details

This class inherits a constructor from Etna::Command

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

#executeObject



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_handlingObject



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_nameObject



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