Skip to content

Commit dd0ba6a

Browse files
authored
Merge pull request #711 from bashly-framework/refactor/completions
Improve completions generator
2 parents 16d00c6 + ca2b3a7 commit dd0ba6a

52 files changed

Lines changed: 2100 additions & 971 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Gemfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
source 'https://rubygems.org', cooldown: 7
1+
source 'https://rubygems.org'
22

33
# gem 'debug'
44
gem 'rspec'

bashly.gemspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ Gem::Specification.new do |s|
1616
s.required_ruby_version = '>= 3.2'
1717

1818
s.add_dependency 'colsole', '~> 1.0'
19-
s.add_dependency 'completely', '~> 0.7.0'
19+
s.add_dependency 'completely', '~> 0.8.0.rc3'
2020
s.add_dependency 'gtx', '~> 0.1.1'
2121
s.add_dependency 'listen', '~> 3.9'
2222
s.add_dependency 'lp', '~> 0.2.0'

examples/colors-usage/src/lib/colors.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ white() { print_in_color "\e[37m" "$*"; }
4242

4343
bold() { print_in_color "\e[1m" "$*"; }
4444
underlined() { print_in_color "\e[4m" "$*"; }
45+
bold_underlined() { print_in_color "\e[1;4m" "$*"; }
4546

4647
red_bold() { print_in_color "\e[1;31m" "$*"; }
4748
green_bold() { print_in_color "\e[1;32m" "$*"; }

examples/completions/src/lib/send_completions.sh

Lines changed: 202 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -6,104 +6,231 @@ send_completions() {
66
echo $'# completely (https://github.com/bashly-framework/completely)'
77
echo $'# Modifying it manually is not recommended'
88
echo $''
9-
echo $'_cli_completions_filter() {'
10-
echo $' local words="$1"'
11-
echo $' local cur=${COMP_WORDS[COMP_CWORD]}'
12-
echo $' local result=()'
13-
echo $''
14-
echo $' # words the user already typed (excluding the command itself)'
15-
echo $' local used=()'
16-
echo $' if ((COMP_CWORD > 1)); then'
17-
echo $' used=("${COMP_WORDS[@]:1:$((COMP_CWORD - 1))}")'
18-
echo $' fi'
19-
echo $''
20-
echo $' if [[ "${cur:0:1}" == "-" ]]; then'
21-
echo $' # Completing an option: offer everything (including options)'
22-
echo $' echo "$words"'
23-
echo $''
24-
echo $' else'
25-
echo $' # Completing a non-option: offer only non-options,'
26-
echo $' # and don\'t re-offer ones already used earlier in the line.'
27-
echo $' for word in $words; do'
28-
echo $' [[ "${word:0:1}" == "-" ]] && continue'
29-
echo $''
30-
echo $' local seen=0'
31-
echo $' for u in "${used[@]}"; do'
32-
echo $' if [[ "$u" == "$word" ]]; then'
33-
echo $' seen=1'
34-
echo $' break'
35-
echo $' fi'
36-
echo $' done'
37-
echo $' ((!seen)) && result+=("$word")'
38-
echo $' done'
9+
echo $'_cli_completions_flag_expects_value() {'
10+
echo $' case "$1" in'
11+
echo $' --handler) return 0 ;;'
12+
echo $' --user|-u) return 0 ;;'
13+
echo $' --password|-p) return 0 ;;'
14+
echo $' esac'
3915
echo $''
40-
echo $' echo "${result[*]}"'
41-
echo $' fi'
16+
echo $' return 1'
4217
echo $'}'
4318
echo $''
4419
echo $'_cli_completions() {'
4520
echo $' local cur=${COMP_WORDS[COMP_CWORD]}'
46-
echo $' local compwords=()'
21+
echo $' local prev='
4722
echo $' if ((COMP_CWORD > 0)); then'
48-
echo $' compwords=("${COMP_WORDS[@]:1:$((COMP_CWORD - 1))}")'
23+
echo $' prev=${COMP_WORDS[$((COMP_CWORD - 1))]}'
4924
echo $' fi'
50-
echo $' local compline="${compwords[*]}"'
5125
echo $''
52-
echo $' COMPREPLY=()'
26+
echo $' local completed=()'
27+
echo $' if ((COMP_CWORD > 1)); then'
28+
echo $' completed=("${COMP_WORDS[@]:1:$((COMP_CWORD - 1))}")'
29+
echo $' fi'
5330
echo $''
54-
echo $' case "$compline" in'
55-
echo $' \'download\'*\'--handler\')'
56-
echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "$(_cli_completions_filter "curl wget")" -- "$cur")'
57-
echo $' ;;'
31+
echo $' local non_options=()'
32+
echo $' local completed_options=()'
33+
echo $' local skip_next=0'
34+
echo $' for word in "${completed[@]}"; do'
35+
echo $' if ((skip_next)); then'
36+
echo $' skip_next=0'
37+
echo $' continue'
38+
echo $' fi'
39+
echo $''
40+
echo $' if [[ "${word:0:1}" == "-" ]]; then'
41+
echo $' completed_options+=("$word")'
42+
echo $' if _cli_completions_flag_expects_value "$word"; then'
43+
echo $' skip_next=1'
44+
echo $' fi'
45+
echo $' continue'
46+
echo $' fi'
47+
echo $''
48+
echo $' non_options+=("$word")'
49+
echo $' done'
50+
echo $''
51+
echo $' local route_id='
52+
echo $' local route_word_count=-1'
53+
echo $' local route_has_positionals=0'
54+
echo $' local positional_index=0'
55+
echo $' if (( ${#non_options[@]} >= 0 )) &&'
56+
echo $' (( 0 > route_word_count ))'
57+
echo $' then'
58+
echo $' route_id=0'
59+
echo $' route_word_count=0'
60+
echo $' route_has_positionals=0'
61+
echo $' positional_index=$((${#non_options[@]} - 0))'
62+
echo $' fi'
5863
echo $''
59-
echo $' \'upload\'*\'--user\')'
60-
echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -A user -- "$cur")'
61-
echo $' ;;'
64+
echo $' if (( ${#non_options[@]} >= 1 )) &&'
65+
echo $' (( 1 > route_word_count )) &&'
66+
echo $' [[ "${non_options[0]}" == "completions" ]]'
67+
echo $' then'
68+
echo $' route_id=1'
69+
echo $' route_word_count=1'
70+
echo $' route_has_positionals=0'
71+
echo $' positional_index=$((${#non_options[@]} - 1))'
72+
echo $' fi'
6273
echo $''
63-
echo $' \'completions\'*)'
64-
echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "$(_cli_completions_filter "--help -h")" -- "$cur")'
65-
echo $' ;;'
74+
echo $' if (( ${#non_options[@]} >= 1 )) &&'
75+
echo $' (( 1 > route_word_count )) &&'
76+
echo $' [[ "${non_options[0]}" == "download" || "${non_options[0]}" == "d" ]]'
77+
echo $' then'
78+
echo $' route_id=2'
79+
echo $' route_word_count=1'
80+
echo $' route_has_positionals=1'
81+
echo $' positional_index=$((${#non_options[@]} - 1))'
82+
echo $' fi'
6683
echo $''
67-
echo $' \'d\'*\'--handler\')'
68-
echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "$(_cli_completions_filter "curl wget")" -- "$cur")'
69-
echo $' ;;'
84+
echo $' if (( ${#non_options[@]} >= 1 )) &&'
85+
echo $' (( 1 > route_word_count )) &&'
86+
echo $' [[ "${non_options[0]}" == "upload" || "${non_options[0]}" == "u" ]]'
87+
echo $' then'
88+
echo $' route_id=3'
89+
echo $' route_word_count=1'
90+
echo $' route_has_positionals=1'
91+
echo $' positional_index=$((${#non_options[@]} - 1))'
92+
echo $' fi'
7093
echo $''
71-
echo $' \'upload\'*\'-u\')'
72-
echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -A user -- "$cur")'
73-
echo $' ;;'
94+
echo $' COMPREPLY=()'
7495
echo $''
75-
echo $' \'download\'*)'
76-
echo $' compopt -o filenames 2>/dev/null'
77-
echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -A file -W "$(_cli_completions_filter "--force --handler --help -f -h")" -- "$cur")'
78-
echo $' ;;'
96+
echo $' if [[ -z "$route_id" ]] || { (( route_word_count == 0 )) && (( !route_has_positionals )) && [[ "${cur:0:1}" != "-" ]]; }; then'
97+
echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "completions download d upload u" -- "$cur")'
98+
echo $' return'
99+
echo $' fi'
79100
echo $''
80-
echo $' \'u\'*\'--user\')'
101+
echo $' case "$route_id:$prev" in'
102+
echo $' 2:--handler)'
103+
echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "curl wget" -- "$cur")'
104+
echo $' return'
105+
echo $' ;;'
106+
echo $' 3:--user|3:-u)'
81107
echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -A user -- "$cur")'
108+
echo $' return'
82109
echo $' ;;'
83-
echo $''
84-
echo $' \'upload\'*)'
85-
echo $' compopt -o filenames 2>/dev/null'
86-
echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -A directory -A user -W "$(_cli_completions_filter "--help --password --user -h -p -u CHANGELOG.md README.md")" -- "$cur")'
110+
echo $' 3:--password|3:-p)'
111+
echo $' return'
87112
echo $' ;;'
113+
echo $' esac'
88114
echo $''
89-
echo $' \'u\'*\'-u\')'
90-
echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -A user -- "$cur")'
91-
echo $' ;;'
115+
echo $' if [[ "${cur:0:1}" == "-" ]]; then'
116+
echo $' case "$route_id" in'
117+
echo $' 0)'
118+
echo $' local words=()'
119+
echo $' local option_seen=0'
120+
echo $' for completed_option in "${completed_options[@]}"; do'
121+
echo $' case "$completed_option" in'
122+
echo $' --help|-h) option_seen=1 ;;'
123+
echo $' esac'
124+
echo $' done'
125+
echo $' if ((!option_seen)); then'
126+
echo $' words+=("--help" "-h")'
127+
echo $' fi'
128+
echo $' local option_seen=0'
129+
echo $' for completed_option in "${completed_options[@]}"; do'
130+
echo $' case "$completed_option" in'
131+
echo $' --version|-v) option_seen=1 ;;'
132+
echo $' esac'
133+
echo $' done'
134+
echo $' if ((!option_seen)); then'
135+
echo $' words+=("--version" "-v")'
136+
echo $' fi'
137+
echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")'
138+
echo $' return'
139+
echo $' ;;'
140+
echo $' 1)'
141+
echo $' local words=()'
142+
echo $' local option_seen=0'
143+
echo $' for completed_option in "${completed_options[@]}"; do'
144+
echo $' case "$completed_option" in'
145+
echo $' --help|-h) option_seen=1 ;;'
146+
echo $' esac'
147+
echo $' done'
148+
echo $' if ((!option_seen)); then'
149+
echo $' words+=("--help" "-h")'
150+
echo $' fi'
151+
echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")'
152+
echo $' return'
153+
echo $' ;;'
154+
echo $' 2)'
155+
echo $' local words=()'
156+
echo $' local option_seen=0'
157+
echo $' for completed_option in "${completed_options[@]}"; do'
158+
echo $' case "$completed_option" in'
159+
echo $' --help|-h) option_seen=1 ;;'
160+
echo $' esac'
161+
echo $' done'
162+
echo $' if ((!option_seen)); then'
163+
echo $' words+=("--help" "-h")'
164+
echo $' fi'
165+
echo $' local option_seen=0'
166+
echo $' for completed_option in "${completed_options[@]}"; do'
167+
echo $' case "$completed_option" in'
168+
echo $' --force|-f) option_seen=1 ;;'
169+
echo $' esac'
170+
echo $' done'
171+
echo $' if ((!option_seen)); then'
172+
echo $' words+=("--force" "-f")'
173+
echo $' fi'
174+
echo $' local option_seen=0'
175+
echo $' for completed_option in "${completed_options[@]}"; do'
176+
echo $' case "$completed_option" in'
177+
echo $' --handler) option_seen=1 ;;'
178+
echo $' esac'
179+
echo $' done'
180+
echo $' if ((!option_seen)); then'
181+
echo $' words+=("--handler")'
182+
echo $' fi'
183+
echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")'
184+
echo $' return'
185+
echo $' ;;'
186+
echo $' 3)'
187+
echo $' local words=()'
188+
echo $' local option_seen=0'
189+
echo $' for completed_option in "${completed_options[@]}"; do'
190+
echo $' case "$completed_option" in'
191+
echo $' --help|-h) option_seen=1 ;;'
192+
echo $' esac'
193+
echo $' done'
194+
echo $' if ((!option_seen)); then'
195+
echo $' words+=("--help" "-h")'
196+
echo $' fi'
197+
echo $' local option_seen=0'
198+
echo $' for completed_option in "${completed_options[@]}"; do'
199+
echo $' case "$completed_option" in'
200+
echo $' --user|-u) option_seen=1 ;;'
201+
echo $' esac'
202+
echo $' done'
203+
echo $' if ((!option_seen)); then'
204+
echo $' words+=("--user" "-u")'
205+
echo $' fi'
206+
echo $' local option_seen=0'
207+
echo $' for completed_option in "${completed_options[@]}"; do'
208+
echo $' case "$completed_option" in'
209+
echo $' --password|-p) option_seen=1 ;;'
210+
echo $' esac'
211+
echo $' done'
212+
echo $' if ((!option_seen)); then'
213+
echo $' words+=("--password" "-p")'
214+
echo $' fi'
215+
echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")'
216+
echo $' return'
217+
echo $' ;;'
218+
echo $' esac'
219+
echo $' fi'
92220
echo $''
93-
echo $' \'d\'*)'
94-
echo $' compopt -o filenames 2>/dev/null'
95-
echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -A file -W "$(_cli_completions_filter "--force --handler --help -f -h")" -- "$cur")'
221+
echo $' case "$route_id:$positional_index" in'
222+
echo $' 2:0)'
223+
echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -A file -- "$cur")'
224+
echo $' return'
96225
echo $' ;;'
97-
echo $''
98-
echo $' \'u\'*)'
99-
echo $' compopt -o filenames 2>/dev/null'
100-
echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -A directory -A user -W "$(_cli_completions_filter "--help --password --user -h -p -u CHANGELOG.md README.md")" -- "$cur")'
226+
echo $' 2:1)'
227+
echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -A file -- "$cur")'
228+
echo $' return'
101229
echo $' ;;'
102-
echo $''
103-
echo $' *)'
104-
echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "$(_cli_completions_filter "--help --version -h -v completions d download u upload")" -- "$cur")'
230+
echo $' 3:0)'
231+
echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "README.md CHANGELOG.md" -- "$cur")'
232+
echo $' return'
105233
echo $' ;;'
106-
echo $''
107234
echo $' esac'
108235
echo $'} &&'
109236
echo $' complete -F _cli_completions cli'

examples/render-mandoc/docs/download.1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
.\" Automatically generated by Pandoc 3.9
22
.\"
3-
.TH "download" "1" "May 2026" "Version 0.1.0" "Sample application"
3+
.TH "download" "1" "July 2026" "Version 0.1.0" "Sample application"
44
.SH NAME
55
\f[B]download\f[R] \- Sample application
66
.SH SYNOPSIS

examples/render-mandoc/docs/download.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
% download(1) Version 0.1.0 | Sample application
22
% Lana Lang
3-
% May 2026
3+
% July 2026
44

55
NAME
66
==================================================

lib/bashly.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ module Bashly
66
autoloads 'bashly/refinements', %i[ComposeRefinements]
77

88
autoloads 'bashly', %i[
9-
CLI Config ConfigValidator Library LibrarySource LibrarySourceConfig
10-
MessageStrings RenderContext RenderSource Settings VERSION Watch
9+
CLI CompletionBuilder Config ConfigValidator Library LibrarySource
10+
LibrarySourceConfig MessageStrings RenderContext RenderSource Settings
11+
VERSION Watch
1112
]
1213

1314
autoloads 'bashly/concerns', %i[

0 commit comments

Comments
 (0)