Skip to content

Commit 2e631ff

Browse files
committed
- Add Settings.enable_completions
1 parent 6769570 commit 2e631ff

9 files changed

Lines changed: 101 additions & 117 deletions

File tree

‎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" "July 2026" "Version 0.1.0" "Sample application"
3+
.TH "download" "1" "August 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-
% July 2026
3+
% August 2026
44

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

‎lib/bashly/libraries/settings/settings.yml‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ env: development
158158
# - never # do not render this feature
159159
enable_header_comment: always
160160
enable_bash3_bouncer: always
161+
enable_completions: never
161162
enable_view_markers: development
162163
enable_inspect_args: development
163164
enable_deps_array: always

‎lib/bashly/settings.rb‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ class << self
1010
:conjoined_flag_args,
1111
:config_path,
1212
:enable_bash3_bouncer,
13+
:enable_completions,
1314
:enable_deps_array,
1415
:enable_env_var_names_array,
1516
:enable_header_comment,
@@ -68,6 +69,10 @@ def enable_bash3_bouncer
6869
@enable_bash3_bouncer ||= get :enable_bash3_bouncer
6970
end
7071

72+
def enable_completions
73+
@enable_completions ||= get :enable_completions
74+
end
75+
7176
def enable_deps_array
7277
@enable_deps_array ||= get :enable_deps_array
7378
end

‎lib/bashly/views/command/master_script.gtx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
= render :user_lib if user_lib.any?
99
= render :command_functions
1010
= render :parse_requirements
11-
= render :completions
11+
= render :completions if Settings.enabled? :completions
1212
= render :user_hooks
1313
= render :initialize
1414
= render :run

‎lib/bashly/views/command/start.gtx‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
= view_marker
22

33
> command_line_args=("$@")
4+
if Settings.enabled? :completions
45
> if [[ "${command_line_args[0]:-}" == "__complete" ]]; then
56
> completion_run "${command_line_args[@]:1}"
67
> else
78
> {{ Settings.function_name :initialize }}
89
> {{ Settings.function_name :run }} "${command_line_args[@]}"
910
> fi
11+
else
12+
> {{ Settings.function_name :initialize }}
13+
> {{ Settings.function_name :run }} "${command_line_args[@]}"
14+
end

‎spec/bashly/integration/runtime_completions_spec.rb‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
require 'open3'
2-
31
describe 'runtime completions', :slow do
42
workspaces = Dir['spec/fixtures/completions/*'].select { |path| File.directory? path }
53

@@ -9,11 +7,16 @@
97
cli = File.expand_path 'spec/tmp/cli'
108

119
before(:context) do
10+
Settings.enable_completions = 'always'
1211
reset_tmp_dir
1312
FileUtils.cp_r Dir["#{workspace}/*"], 'spec/tmp'
1413
Commands::Generate.new.execute %w[generate --quiet]
1514
end
1615

16+
after(:context) do
17+
Settings.enable_completions = 'never'
18+
end
19+
1720
examples.each do |name, example|
1821
describe name do
1922
it 'works' do

‎spec/bashly/script/wrapper_spec.rb‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
lines = subject.code.split "\n"
1212
expect(lines[0..13].join("\n")).to match_approval('script/wrapper/code')
1313
.except(/\d+\.\d+\.\d+(\.rc\d)?/)
14-
expect(lines[-2]).to eq ' run "${command_line_args[@]}"'
14+
expect(lines[-3]).to eq ' run "${command_line_args[@]}"'
1515
end
1616
end
1717

‎spec/fixtures/workspaces/lib-upgrade/src/lib/send_completions.sh‎

Lines changed: 81 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -6,49 +6,62 @@ 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_route_flag_expects_value() {'
9+
echo $'_cli_completions_node_flag_state() {'
1010
echo $' case "$1:$2" in'
11-
echo $' 2:--user|2:-u) return 0 ;;'
12-
echo $' 2:--password|2:-p) return 0 ;;'
11+
echo $' 0:--help|0:-h) return 0 ;;'
12+
echo $' 0:--version|0:-v) return 0 ;;'
13+
echo $' 1:--help|1:-h) return 0 ;;'
14+
echo $' 1:--force|1:-f) return 0 ;;'
15+
echo $' 2:--user|2:-u) return 2 ;;'
16+
echo $' 2:--password|2:-p) return 2 ;;'
17+
echo $' 2:--help|2:-h) return 0 ;;'
1318
echo $' esac'
1419
echo $''
1520
echo $' return 1'
1621
echo $'}'
1722
echo $''
18-
echo $'_cli_completions_resolve_route() {'
19-
echo $' route_id='
20-
echo $' route_word_count=-1'
21-
echo $' route_has_positionals=0'
22-
echo $' positional_index=0'
23-
echo $' if (( ${#non_options[@]} >= 0 )) &&'
24-
echo $' (( 0 > route_word_count ))'
25-
echo $' then'
26-
echo $' route_id=0'
27-
echo $' route_word_count=0'
28-
echo $' route_has_positionals=0'
29-
echo $' positional_index=$((${#non_options[@]} - 0))'
30-
echo $' fi'
23+
echo $'_cli_completions_option_seen() {'
24+
echo $' local completed_option option_name'
25+
echo $' for completed_option in "${completed_options[@]}"; do'
26+
echo $' for option_name in "$@"; do'
27+
echo $' [[ "$completed_option" == "$option_name" ]] && return 0'
28+
echo $' done'
29+
echo $' done'
3130
echo $''
32-
echo $' if (( ${#non_options[@]} >= 1 )) &&'
33-
echo $' (( 1 > route_word_count )) &&'
34-
echo $' [[ "${non_options[0]}" == "download" || "${non_options[0]}" == "d" ]]'
35-
echo $' then'
36-
echo $' route_id=1'
37-
echo $' route_word_count=1'
38-
echo $' route_has_positionals=1'
39-
echo $' positional_index=$((${#non_options[@]} - 1))'
40-
echo $' fi'
31+
echo $' return 1'
32+
echo $'}'
4133
echo $''
42-
echo $' if (( ${#non_options[@]} >= 1 )) &&'
43-
echo $' (( 1 > route_word_count )) &&'
44-
echo $' [[ "${non_options[0]}" == "upload" || "${non_options[0]}" == "u" ]]'
45-
echo $' then'
46-
echo $' route_id=2'
47-
echo $' route_word_count=1'
48-
echo $' route_has_positionals=1'
49-
echo $' positional_index=$((${#non_options[@]} - 1))'
50-
echo $' fi'
34+
echo $'_cli_completions_resolve_node() {'
35+
echo $' node_id=0'
36+
echo $' node_word_count=0'
37+
echo $' positional_index=0'
38+
echo $''
39+
echo $' local word'
40+
echo $' for word in "${non_options[@]}"; do'
41+
echo $' case "$node_id:$word" in'
42+
echo $' 0:download)'
43+
echo $' node_id=1'
44+
echo $' node_word_count=1'
45+
echo $' ;;'
46+
echo $' 0:d)'
47+
echo $' node_id=1'
48+
echo $' node_word_count=1'
49+
echo $' ;;'
50+
echo $' 0:upload)'
51+
echo $' node_id=2'
52+
echo $' node_word_count=1'
53+
echo $' ;;'
54+
echo $' 0:u)'
55+
echo $' node_id=2'
56+
echo $' node_word_count=1'
57+
echo $' ;;'
58+
echo $' *)'
59+
echo $' break'
60+
echo $' ;;'
61+
echo $' esac'
62+
echo $' done'
5163
echo $''
64+
echo $' positional_index=$((${#non_options[@]} - node_word_count))'
5265
echo $'}'
5366
echo $''
5467
echo $'_cli_completions() {'
@@ -65,11 +78,12 @@ send_completions() {
6578
echo $''
6679
echo $' local non_options=()'
6780
echo $' local completed_options=()'
68-
echo $' local route_id='
69-
echo $' local route_word_count=-1'
70-
echo $' local route_has_positionals=0'
81+
echo $' local node_id='
82+
echo $' local node_word_count=-1'
7183
echo $' local positional_index=0'
72-
echo $' _cli_completions_resolve_route'
84+
echo $' local invalid_completion=0'
85+
echo $' local flag_state=0'
86+
echo $' _cli_completions_resolve_node'
7387
echo $''
7488
echo $' local skip_next=0'
7589
echo $' for word in "${completed[@]}"; do'
@@ -79,25 +93,28 @@ send_completions() {
7993
echo $' fi'
8094
echo $''
8195
echo $' if [[ "${word:0:1}" == "-" ]]; then'
96+
echo $' _cli_completions_node_flag_state "$node_id" "$word"'
97+
echo $' flag_state=$?'
98+
echo $' if (( flag_state == 1 )); then'
99+
echo $' invalid_completion=1'
100+
echo $' break'
101+
echo $' fi'
102+
echo $''
82103
echo $' completed_options+=("$word")'
83-
echo $' if _cli_completions_route_flag_expects_value "$route_id" "$word"; then'
104+
echo $' if (( flag_state == 2 )); then'
84105
echo $' skip_next=1'
85106
echo $' fi'
86107
echo $' continue'
87108
echo $' fi'
88109
echo $''
89110
echo $' non_options+=("$word")'
90-
echo $' _cli_completions_resolve_route'
111+
echo $' _cli_completions_resolve_node'
91112
echo $' done'
92113
echo $''
93114
echo $' COMPREPLY=()'
115+
echo $' (( invalid_completion )) && return'
94116
echo $''
95-
echo $' if [[ -z "$route_id" ]] || { (( route_word_count == 0 )) && (( !route_has_positionals )) && [[ "${cur:0:1}" != "-" ]]; }; then'
96-
echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "download d upload u" -- "$cur")'
97-
echo $' return'
98-
echo $' fi'
99-
echo $''
100-
echo $' case "$route_id:$prev" in'
117+
echo $' case "$node_id:$prev" in'
101118
echo $' 2:--user|2:-u)'
102119
echo $' return'
103120
echo $' ;;'
@@ -106,90 +123,43 @@ send_completions() {
106123
echo $' ;;'
107124
echo $' esac'
108125
echo $''
126+
echo $' if [[ "${cur:0:1}" != "-" ]] && (( positional_index == 0 )); then'
127+
echo $' case "$node_id" in'
128+
echo $' 0)'
129+
echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "download d upload u" -- "$cur")'
130+
echo $' return'
131+
echo $' ;;'
132+
echo $' esac'
133+
echo $' fi'
134+
echo $''
109135
echo $' if [[ "${cur:0:1}" == "-" ]]; then'
110-
echo $' case "$route_id" in'
136+
echo $' case "$node_id" in'
111137
echo $' 0)'
112138
echo $' local words=()'
113-
echo $' local option_seen=0'
114-
echo $' for completed_option in "${completed_options[@]}"; do'
115-
echo $' case "$completed_option" in'
116-
echo $' --help|-h) option_seen=1 ;;'
117-
echo $' esac'
118-
echo $' done'
119-
echo $' if ((!option_seen)); then'
120-
echo $' words+=("--help" "-h")'
121-
echo $' fi'
122-
echo $' local option_seen=0'
123-
echo $' for completed_option in "${completed_options[@]}"; do'
124-
echo $' case "$completed_option" in'
125-
echo $' --version|-v) option_seen=1 ;;'
126-
echo $' esac'
127-
echo $' done'
128-
echo $' if ((!option_seen)); then'
129-
echo $' words+=("--version" "-v")'
130-
echo $' fi'
139+
echo $' _cli_completions_option_seen "--help" "-h" || words+=("--help" "-h")'
140+
echo $' _cli_completions_option_seen "--version" "-v" || words+=("--version" "-v")'
131141
echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")'
132142
echo $' return'
133143
echo $' ;;'
134144
echo $' 1)'
135145
echo $' local words=()'
136-
echo $' local option_seen=0'
137-
echo $' for completed_option in "${completed_options[@]}"; do'
138-
echo $' case "$completed_option" in'
139-
echo $' --help|-h) option_seen=1 ;;'
140-
echo $' esac'
141-
echo $' done'
142-
echo $' if ((!option_seen)); then'
143-
echo $' words+=("--help" "-h")'
144-
echo $' fi'
145-
echo $' local option_seen=0'
146-
echo $' for completed_option in "${completed_options[@]}"; do'
147-
echo $' case "$completed_option" in'
148-
echo $' --force|-f) option_seen=1 ;;'
149-
echo $' esac'
150-
echo $' done'
151-
echo $' if ((!option_seen)); then'
152-
echo $' words+=("--force" "-f")'
153-
echo $' fi'
146+
echo $' _cli_completions_option_seen "--help" "-h" || words+=("--help" "-h")'
147+
echo $' _cli_completions_option_seen "--force" "-f" || words+=("--force" "-f")'
154148
echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")'
155149
echo $' return'
156150
echo $' ;;'
157151
echo $' 2)'
158152
echo $' local words=()'
159-
echo $' local option_seen=0'
160-
echo $' for completed_option in "${completed_options[@]}"; do'
161-
echo $' case "$completed_option" in'
162-
echo $' --help|-h) option_seen=1 ;;'
163-
echo $' esac'
164-
echo $' done'
165-
echo $' if ((!option_seen)); then'
166-
echo $' words+=("--help" "-h")'
167-
echo $' fi'
168-
echo $' local option_seen=0'
169-
echo $' for completed_option in "${completed_options[@]}"; do'
170-
echo $' case "$completed_option" in'
171-
echo $' --user|-u) option_seen=1 ;;'
172-
echo $' esac'
173-
echo $' done'
174-
echo $' if ((!option_seen)); then'
175-
echo $' words+=("--user" "-u")'
176-
echo $' fi'
177-
echo $' local option_seen=0'
178-
echo $' for completed_option in "${completed_options[@]}"; do'
179-
echo $' case "$completed_option" in'
180-
echo $' --password|-p) option_seen=1 ;;'
181-
echo $' esac'
182-
echo $' done'
183-
echo $' if ((!option_seen)); then'
184-
echo $' words+=("--password" "-p")'
185-
echo $' fi'
153+
echo $' _cli_completions_option_seen "--help" "-h" || words+=("--help" "-h")'
154+
echo $' _cli_completions_option_seen "--user" "-u" || words+=("--user" "-u")'
155+
echo $' _cli_completions_option_seen "--password" "-p" || words+=("--password" "-p")'
186156
echo $' while read -r; do COMPREPLY+=("$REPLY"); done < <(compgen -W "${words[*]}" -- "$cur")'
187157
echo $' return'
188158
echo $' ;;'
189159
echo $' esac'
190160
echo $' fi'
191161
echo $''
192-
echo $' case "$route_id:$positional_index" in'
162+
echo $' case "$node_id:$positional_index" in'
193163
echo $' 1:0)'
194164
echo $' return'
195165
echo $' ;;'

0 commit comments

Comments
 (0)