benry-cmdapp 0.2.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES.md +6 -0
- data/README.md +1693 -852
- data/benry-cmdapp.gemspec +3 -3
- data/doc/benry-cmdapp.html +1582 -906
- data/lib/benry/cmdapp.rb +1894 -1060
- data/test/app_test.rb +882 -1078
- data/test/config_test.rb +71 -0
- data/test/context_test.rb +382 -0
- data/test/func_test.rb +302 -82
- data/test/help_test.rb +1054 -553
- data/test/metadata_test.rb +191 -0
- data/test/misc_test.rb +175 -0
- data/test/registry_test.rb +402 -0
- data/test/run_all.rb +4 -3
- data/test/scope_test.rb +1210 -0
- data/test/shared.rb +112 -49
- data/test/util_test.rb +154 -99
- metadata +17 -9
- data/test/action_test.rb +0 -1038
- data/test/index_test.rb +0 -185
data/test/app_test.rb
CHANGED
@@ -1,1365 +1,1169 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
|
-
require 'oktest'
|
4
4
|
|
5
|
-
|
6
|
-
require_relative './shared'
|
5
|
+
require_relative 'shared'
|
7
6
|
|
8
7
|
|
9
8
|
Oktest.scope do
|
10
9
|
|
11
10
|
|
11
|
+
topic Benry::CmdApp::Application do
|
12
12
|
|
13
|
-
|
13
|
+
before do
|
14
|
+
@config = Benry::CmdApp::Config.new("test app", "1.2.3", app_command: "testapp")
|
15
|
+
@app = Benry::CmdApp::Application.new(@config)
|
16
|
+
end
|
14
17
|
|
15
18
|
|
16
|
-
topic '#
|
19
|
+
topic '#main()' do
|
17
20
|
|
18
|
-
spec "[!
|
19
|
-
|
20
|
-
|
21
|
-
ok {
|
21
|
+
spec "[!65e9n] returns `0` as status code." do
|
22
|
+
ret = nil
|
23
|
+
capture_sio { ret = @app.main(["help"]) }
|
24
|
+
ok {ret} == 0
|
22
25
|
end
|
23
26
|
|
24
|
-
|
25
|
-
|
27
|
+
case_when "[!bkbb4] when error raised..." do
|
26
28
|
|
27
|
-
|
29
|
+
spec "[!k4qov] not catch error if debug mode is enabled." do
|
30
|
+
debug_mode = $DEBUG_MODE
|
31
|
+
at_end { $DEBUG_MODE = debug_mode }
|
32
|
+
pr = proc { @app.main(["--debug", "foobar"]) }
|
33
|
+
ok {pr}.raise?(Benry::CmdApp::CommandError, "foobar: Action not found.")
|
34
|
+
end
|
28
35
|
|
36
|
+
spec "[!lhlff] catches error if BaseError raised or `should_rescue?()` returns true." do
|
37
|
+
pr = proc { @app.main(["testerr1"]) }
|
38
|
+
ok {pr}.raise?(ZeroDivisionError)
|
39
|
+
#
|
40
|
+
r = recorder()
|
41
|
+
r.fake_method(@app, :should_rescue? => true)
|
42
|
+
sout, serr = capture_sio(tty: true) do
|
43
|
+
pr = proc { @app.main(["testerr1"]) }
|
44
|
+
ok {pr}.NOT.raise?(ZeroDivisionError)
|
45
|
+
end
|
46
|
+
ok {sout} == ""
|
47
|
+
ok {serr} =~ /\A\e\[31m\[ERROR\]\e\[0m divided by 0$/
|
48
|
+
end
|
29
49
|
|
30
|
-
|
50
|
+
spec "[!35x5p] prints error into stderr." do
|
51
|
+
sout, serr = capture_sio(tty: true) { @app.main(["foobar"]) }
|
52
|
+
ok {sout} == ""
|
53
|
+
ok {serr} =~ /^\e\[31m\[ERROR\]\e\[0m foobar: Action not found.\n/
|
54
|
+
end
|
31
55
|
|
56
|
+
spec "[!z39bh] prints backtrace unless error is a CommandError." do
|
57
|
+
sout, serr = capture_sio { @app.main(["testerr2"]) }
|
58
|
+
ok {sout} == ""
|
59
|
+
ok {serr} =~ /^\[ERROR\] testerr2: Looped action detected.\n/
|
60
|
+
ok {serr} =~ /^ From .*:\d+:in /
|
61
|
+
end
|
32
62
|
|
33
|
-
|
63
|
+
spec "[!dzept] returns `1` as status code." do
|
64
|
+
ret = nil
|
65
|
+
capture_sio { ret = @app.main(["help", "foo"]) }
|
66
|
+
ok {ret} == 1
|
67
|
+
end
|
34
68
|
|
35
|
-
def new_gschema(desc="", version=nil, **kwargs)
|
36
|
-
config = Benry::CmdApp::Config.new(desc, version, **kwargs)
|
37
|
-
x = Benry::CmdApp::AppOptionSchema.new(config)
|
38
|
-
return x
|
39
69
|
end
|
40
70
|
|
41
|
-
|
42
|
-
x = nil
|
43
|
-
pr = proc { x = Benry::CmdApp::AppOptionSchema.new(nil) }
|
44
|
-
ok {pr}.NOT.raise?(Exception)
|
45
|
-
ok {x}.is_a?(Benry::CmdApp::AppOptionSchema)
|
46
|
-
end
|
71
|
+
end
|
47
72
|
|
48
|
-
spec "[!tq2ol] adds '-h, --help' option if 'config.option_help' is set." do
|
49
|
-
x = new_gschema(option_help: true)
|
50
|
-
ok {x.find_long_option("help")} != nil
|
51
|
-
ok {x.find_short_option("h")} != nil
|
52
|
-
x = new_gschema(option_help: false)
|
53
|
-
ok {x.find_long_option("help")} == nil
|
54
|
-
ok {x.find_short_option("h")} == nil
|
55
|
-
end
|
56
73
|
|
57
|
-
|
58
|
-
x = new_gschema("", "0.0.0")
|
59
|
-
ok {x.find_long_option("version")} != nil
|
60
|
-
ok {x.find_short_option("V")} != nil
|
61
|
-
x = new_gschema("", nil)
|
62
|
-
ok {x.find_long_option("version")} == nil
|
63
|
-
ok {x.find_short_option("V")} == nil
|
64
|
-
end
|
74
|
+
topic '#run()' do
|
65
75
|
|
66
|
-
spec "[!
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
ok {
|
72
|
-
ok {x.find_short_option("a")} == nil
|
76
|
+
spec "[!etbbc] calls setup method at beginning of this method." do
|
77
|
+
r = recorder()
|
78
|
+
r.record_method(@app, :setup)
|
79
|
+
capture_sio { @app.run("help") }
|
80
|
+
ok {r[0].name} == :setup
|
81
|
+
ok {r[0].args} == []
|
73
82
|
end
|
74
83
|
|
75
|
-
spec "[!
|
76
|
-
|
77
|
-
ok {
|
78
|
-
ok {
|
79
|
-
|
80
|
-
ok {
|
81
|
-
ok {
|
84
|
+
spec "[!hguvb] handles global options." do
|
85
|
+
sout, serr = capture_sio { @app.run("--version") }
|
86
|
+
ok {sout} == "1.2.3\n"
|
87
|
+
ok {serr} == ""
|
88
|
+
sout, serr = capture_sio { @app.run("--help") }
|
89
|
+
ok {sout} =~ /^Usage:\n/
|
90
|
+
ok {serr} == ""
|
82
91
|
end
|
83
92
|
|
84
|
-
spec "[!
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
ok {
|
90
|
-
ok {
|
93
|
+
spec "[!pf1d2] calls teardown method at end of this method." do
|
94
|
+
r = recorder()
|
95
|
+
r.record_method(@app, :teardown)
|
96
|
+
capture_sio { @app.run("hello", "Alice") }
|
97
|
+
ok {r.length} == 1
|
98
|
+
ok {r[0].name} == :teardown
|
99
|
+
ok {r[0].args} == []
|
100
|
+
#
|
101
|
+
begin
|
102
|
+
capture_sio { @app.run("testerr1") }
|
103
|
+
rescue ZeroDivisionError
|
104
|
+
nil
|
105
|
+
end
|
106
|
+
ok {r.length} == 2
|
107
|
+
ok {r[0].name} == :teardown
|
108
|
+
ok {r[0].args} == []
|
91
109
|
end
|
92
110
|
|
93
|
-
|
94
|
-
x = new_gschema(option_color: true)
|
95
|
-
ok {x.find_long_option("color")} != nil
|
96
|
-
x = new_gschema(option_quiet: false)
|
97
|
-
ok {x.find_long_option("color")} == nil
|
98
|
-
end
|
111
|
+
end
|
99
112
|
|
100
|
-
spec "[!29wfy] adds '-D, --debug' option if 'config.option_debug' is set." do
|
101
|
-
x = new_gschema(option_debug: true)
|
102
|
-
ok {x.find_long_option("debug")} != nil
|
103
|
-
ok {x.find_short_option("D")} != nil
|
104
|
-
x = new_gschema(option_debug: false)
|
105
|
-
ok {x.find_long_option("debug")} == nil
|
106
|
-
ok {x.find_short_option("D")} == nil
|
107
|
-
end
|
108
113
|
|
109
|
-
|
110
|
-
x = new_gschema(option_trace: true)
|
111
|
-
ok {x.find_long_option("trace")} != nil
|
112
|
-
ok {x.find_short_option("T")} != nil
|
113
|
-
x = new_gschema(option_debug: false)
|
114
|
-
ok {x.find_long_option("trace")} == nil
|
115
|
-
ok {x.find_short_option("T")} == nil
|
116
|
-
end
|
114
|
+
topic '#handle_action()' do
|
117
115
|
|
118
|
-
|
116
|
+
case_when "[!3qw3p] when no arguments specified..." do
|
119
117
|
|
118
|
+
spec "[!zl9em] lists actions if default action is not set." do
|
119
|
+
sout, serr = capture_sio { @app.run() }
|
120
|
+
ok {sout} =~ /\AActions:\n/
|
121
|
+
ok {sout} =~ /^ hello +: greeting message$/
|
122
|
+
ok {serr} == ""
|
123
|
+
end
|
120
124
|
|
121
|
-
|
125
|
+
spec "[!89hqb] lists all actions including hidden ones if `-a` or `--all` specified." do
|
126
|
+
sout, serr = capture_sio { @app.run() }
|
127
|
+
ok {sout} !~ /^ debuginfo/
|
128
|
+
sout, serr = capture_sio { @app.run("-a") }
|
129
|
+
ok {sout} =~ /^ debuginfo +: hidden action$/
|
130
|
+
end
|
122
131
|
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
return Benry::CmdApp::AppOptionSchema.new(config)
|
130
|
-
end
|
132
|
+
spec "[!k4xxp] runs default action if it is set." do
|
133
|
+
@config.default_action = "hello"
|
134
|
+
sout, serr = capture_sio { @app.run() }
|
135
|
+
ok {sout} !~ /^\AActions:/
|
136
|
+
ok {sout} == "Hello, world!\n"
|
137
|
+
end
|
131
138
|
|
132
|
-
spec "[!6udxr] sorts options in order of keys specified." do
|
133
|
-
x = new_gschema()
|
134
|
-
keys1 = x.each.collect(&:key)
|
135
|
-
ok {keys1} == [:help, :version, :all, :verbose, :quiet, :debug]
|
136
|
-
x.sort_options_in_this_order(:help, :quiet, :verbose, :all, :trace, :debug, :version)
|
137
|
-
keys2 = x.each.collect(&:key)
|
138
|
-
ok {keys2} == [:help, :quiet, :verbose, :all, :debug, :version]
|
139
139
|
end
|
140
140
|
|
141
|
-
|
142
|
-
x = new_gschema()
|
143
|
-
x.sort_options_in_this_order(:quiet, :verbose, :all, :debug) # missing :help and :version
|
144
|
-
keys = x.each.collect(&:key)
|
145
|
-
ok {keys[-2]} == :help
|
146
|
-
ok {keys[-1]} == :version
|
147
|
-
ok {keys} == [:quiet, :verbose, :all, :debug, :help, :version]
|
148
|
-
end
|
141
|
+
case_when "[!xaamy] when prefix specified..." do
|
149
142
|
|
150
|
-
|
143
|
+
spec "[!7l3fh] lists actions starting with prefix." do
|
144
|
+
sout, serr = capture_sio { @app.run("git:") }
|
145
|
+
ok {sout} == <<END
|
146
|
+
Actions:
|
147
|
+
git:stage : same as `git add -p`
|
148
|
+
git:staged : same as `git diff --cached`
|
149
|
+
git:unstage : same as `git reset HEAD`
|
150
|
+
END
|
151
|
+
end
|
151
152
|
|
153
|
+
spec "[!g0k1g] lists all actions including hidden ones if `-a` or `--all` specified." do
|
154
|
+
sout, serr = capture_sio { @app.run("-a", "git:") }
|
155
|
+
ok {sout} == <<END
|
156
|
+
Actions:
|
157
|
+
git:correct : same as `git commit --amend`
|
158
|
+
git:stage : same as `git add -p`
|
159
|
+
git:staged : same as `git diff --cached`
|
160
|
+
git:unstage : same as `git reset HEAD`
|
161
|
+
END
|
162
|
+
end
|
152
163
|
|
153
|
-
|
164
|
+
end
|
154
165
|
|
166
|
+
case_when "[!vphz3] else..." do
|
155
167
|
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
when "fr" ; puts "Bonjour, #{user}!"
|
166
|
-
when "it" ; puts "Ciao, #{user}!"
|
167
|
-
else ; raise "#{lang}: unknown language."
|
168
|
+
spec "[!bq39a] runs action with arguments." do
|
169
|
+
sout, serr = capture_sio { @app.run("hello", "Alice") }
|
170
|
+
ok {sout} == "Hello, Alice!\n"
|
171
|
+
end
|
172
|
+
|
173
|
+
spec "[!5yd8x] returns 0 when action invoked successfully." do
|
174
|
+
ret = nil
|
175
|
+
capture_sio { ret = @app.run("hello", "Alice") }
|
176
|
+
ok {ret} == 0
|
168
177
|
end
|
178
|
+
|
169
179
|
end
|
170
|
-
end
|
171
180
|
|
172
|
-
before do
|
173
|
-
@config = Benry::CmdApp::Config.new("test app", "1.0.0",
|
174
|
-
app_name: "TestApp", app_command: "testapp",
|
175
|
-
default_action: nil,
|
176
|
-
option_all: true, option_debug: true)
|
177
|
-
@app = Benry::CmdApp::Application.new(@config)
|
178
181
|
end
|
179
182
|
|
180
|
-
def _run_app(*args)
|
181
|
-
sout, serr = capture_sio { @app.run(*args) }
|
182
|
-
ok {serr} == ""
|
183
|
-
return sout
|
184
|
-
end
|
185
183
|
|
184
|
+
topic '#render_help_message()' do
|
186
185
|
|
187
|
-
|
186
|
+
spec "[!2oax5] returns action help message if action name is specified." do
|
187
|
+
ret = @app.render_help_message("hello")
|
188
|
+
ok {ret} == <<"END"
|
189
|
+
\e[1mtestapp hello\e[0m --- greeting message
|
188
190
|
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
items = schema.each.to_a()
|
195
|
-
ok {items[0].key} == :help
|
196
|
-
ok {items[1].key} == :version
|
197
|
-
ok {items[2].key} == :debug
|
198
|
-
ok {schema.option_help()} == <<END
|
199
|
-
-h, --help : print help message
|
200
|
-
-V, --version : print version
|
201
|
-
-D, --debug : debug mode (set $DEBUG_MODE to true)
|
191
|
+
\e[1;34mUsage:\e[0m
|
192
|
+
$ \e[1mtestapp hello\e[0m [<options>] [<name>]
|
193
|
+
|
194
|
+
\e[1;34mOptions:\e[0m
|
195
|
+
-l, --lang=<lang> : language name (en/fr/it)
|
202
196
|
END
|
203
197
|
end
|
204
198
|
|
205
|
-
spec "[!
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
199
|
+
spec "[!d6veb] returns application help message if action name is not specified." do
|
200
|
+
ret = @app.render_help_message(nil)
|
201
|
+
ok {ret} =~ /^\e\[1;34mUsage:\e\[0m$/
|
202
|
+
ok {ret} =~ /^\e\[1;34mOptions:\e\[0m$/
|
203
|
+
ok {ret} =~ /^\e\[1;34mActions:\e\[0m$/
|
204
|
+
end
|
205
|
+
|
206
|
+
spec "[!tf2wp] includes hidden actions and options into help message if `all: true` passed." do
|
207
|
+
rexp1 = /^\e\[2m --debug : debug mode\e\[0m/
|
208
|
+
rexp2 = /^\e\[2m debuginfo : hidden action\e\[0m/
|
209
|
+
#
|
210
|
+
s = @app.render_help_message(nil, all: true)
|
211
|
+
ok {s} =~ rexp1
|
212
|
+
ok {s} =~ rexp2
|
213
|
+
#
|
214
|
+
s = @app.render_help_message(nil, all: false)
|
215
|
+
ok {s} !~ rexp1
|
216
|
+
ok {s} !~ rexp2
|
217
217
|
end
|
218
218
|
|
219
219
|
end
|
220
220
|
|
221
221
|
|
222
|
-
topic '#
|
222
|
+
topic '#setup()' do
|
223
223
|
|
224
|
-
|
225
|
-
|
224
|
+
spec "[!6hi1y] stores current application." do
|
225
|
+
at_end { Benry::CmdApp._set_current_app(nil) }
|
226
|
+
ok {Benry::CmdApp.current_app()} == nil
|
227
|
+
@app.__send__(:setup)
|
228
|
+
ok {Benry::CmdApp.current_app()} == @app
|
226
229
|
end
|
227
230
|
|
228
|
-
|
229
|
-
sout, serr = capture_sio { @app.main(["sayhello", "-l", "it", "Alice"]) }
|
230
|
-
ok {serr} == ""
|
231
|
-
ok {sout} == "Ciao, Alice!\n"
|
232
|
-
end
|
231
|
+
end
|
233
232
|
|
234
|
-
spec "[!a7d4w] prints error message with '[ERROR]' prompt." do
|
235
|
-
sout, serr = capture_sio { @app.main(["sayhello", "Alice", "Bob"]) }
|
236
|
-
ok {serr} == "\e[0;31m[ERROR]\e[0m sayhello: Too much arguments (at most 1).\n"
|
237
|
-
ok {sout} == ""
|
238
|
-
end
|
239
233
|
|
240
|
-
|
241
|
-
class MainTest1 < Benry::CmdApp::ActionScope
|
242
|
-
prefix "main1"
|
243
|
-
@action.("test")
|
244
|
-
def err1
|
245
|
-
MainTest1.class_eval do
|
246
|
-
@action.("test")
|
247
|
-
@option.(:foo, "--foo", "foo")
|
248
|
-
def err2(bar: nil) # should have keyword parameter 'foo'
|
249
|
-
end
|
250
|
-
end
|
251
|
-
end
|
252
|
-
end
|
253
|
-
lineno = __LINE__ - 5
|
254
|
-
sout, serr = capture_sio { @app.main(["main1:err1"]) }
|
255
|
-
ok {sout} == ""
|
256
|
-
serr = serr.sub(/file: \/.*?test\//, 'file: test/')
|
257
|
-
ok {serr} == <<"END"
|
258
|
-
\e[0;31m[ERROR]\e[0m def err2(): Should have keyword parameter 'foo' for '@option.(:foo)', but not.
|
259
|
-
\t\(file: test\/app_test\.rb, line: #{lineno})
|
260
|
-
END
|
261
|
-
end
|
234
|
+
topic '#teardown()' do
|
262
235
|
|
263
|
-
spec "[!
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
_err2()
|
269
|
-
end
|
270
|
-
def _err2()
|
271
|
-
MainTest2.class_eval do # == lineno2
|
272
|
-
@action.("test")
|
273
|
-
@option.(:foo, "--foo", "foo")
|
274
|
-
def err2x(bar: nil) # == lineno1
|
275
|
-
end
|
276
|
-
end
|
277
|
-
end
|
278
|
-
end
|
279
|
-
lineno1 = __LINE__ - 5
|
280
|
-
lineno2 = lineno1 - 3
|
281
|
-
## no filter
|
282
|
-
sout, serr = capture_sio { @app.main(["main2:err2"]) }
|
283
|
-
ok {sout} == ""
|
284
|
-
ok {serr} =~ /\t\(file: .*\/app_test\.rb, line: #{lineno1}\)\n/
|
285
|
-
## filter by block
|
286
|
-
sout, serr = capture_sio {
|
287
|
-
@app.main(["main2:err2"]) {|exc| exc.lineno == lineno2 }
|
288
|
-
}
|
289
|
-
ok {sout} == ""
|
290
|
-
ok {serr} =~ /\t\(file: .*\/app_test\.rb, line: #{lineno2}\)\n/
|
236
|
+
spec "[!t44mv] removes current applicatin from data store." do
|
237
|
+
at_end { Benry::CmdApp._set_current_app(nil) }
|
238
|
+
ok {Benry::CmdApp.current_app()} == nil
|
239
|
+
@app.__send__(:setup)
|
240
|
+
ok {Benry::CmdApp.current_app()} == @app
|
291
241
|
end
|
292
242
|
|
293
|
-
|
294
|
-
bkup = $DEBUG_MODE
|
295
|
-
begin
|
296
|
-
pr = proc { @app.main(["-D", "sayhello", "Alice", "Bob"]) }
|
297
|
-
ok {pr}.raise?(Benry::CmdApp::CommandError,
|
298
|
-
"sayhello: Too much arguments (at most 1).")
|
299
|
-
ensure
|
300
|
-
$DEBUG_MODE = bkup
|
301
|
-
end
|
302
|
-
end
|
243
|
+
end
|
303
244
|
|
304
|
-
spec "[!5oypr] returns 0 as exit code when no errors occurred." do
|
305
|
-
ret = nil
|
306
|
-
sout, serr = capture_sio do
|
307
|
-
ret = @app.main(["sayhello", "Alice", "-l", "it"])
|
308
|
-
end
|
309
|
-
ok {ret} == 0
|
310
|
-
ok {serr} == ""
|
311
|
-
ok {sout} == "Ciao, Alice!\n"
|
312
|
-
end
|
313
245
|
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
ok {
|
320
|
-
ok {
|
321
|
-
ok {sout} == ""
|
246
|
+
topic '#parse_global_options()' do
|
247
|
+
|
248
|
+
spec "[!9c9r8] parses global options." do
|
249
|
+
args = ["-hl", "foo"]
|
250
|
+
opts = @app.instance_eval { parse_global_options(args) }
|
251
|
+
ok {opts} == {help: true, list: true}
|
252
|
+
ok {args} == ["foo"]
|
322
253
|
end
|
323
254
|
|
324
255
|
end
|
325
256
|
|
326
257
|
|
327
|
-
topic '#
|
258
|
+
topic '#toggle_global_options()' do
|
328
259
|
|
329
|
-
|
330
|
-
|
331
|
-
@action.("test config")
|
332
|
-
def check_config()
|
333
|
-
puts "$cmdapp_config.class=#{$cmdapp_config.class.name}"
|
334
|
-
end
|
335
|
-
#
|
336
|
-
@action.("test global option parseing")
|
337
|
-
@option.(:help, "-h, --help", "print help")
|
338
|
-
def test_globalopt(help: false)
|
339
|
-
puts "help=#{help}"
|
340
|
-
end
|
341
|
-
#
|
342
|
-
@action.("test debug option")
|
343
|
-
def test_debugopt(help: false)
|
344
|
-
puts "$DEBUG_MODE=#{$DEBUG_MODE}"
|
345
|
-
end
|
346
|
-
#
|
347
|
-
@action.("arity test")
|
348
|
-
def test_arity1(xx, yy, zz=nil)
|
349
|
-
end
|
260
|
+
spec "[!xwcyl] sets `$VERBOSE_MODE` and `$QUIET_MODE` according to global options." do
|
261
|
+
at_end { $VERBOSE_MODE = nil; $QUIET_MODE = nil }
|
350
262
|
#
|
351
|
-
|
352
|
-
|
353
|
-
|
263
|
+
opts = {verbose: true}
|
264
|
+
@app.instance_eval { toggle_global_options(opts) }
|
265
|
+
ok {$VERBOSE_MODE} == true
|
266
|
+
ok {$QUIET_MODE} == false
|
354
267
|
#
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
#
|
360
|
-
@action.("loop test")
|
361
|
-
def test_loop1()
|
362
|
-
run_action_once("test-loop2")
|
363
|
-
end
|
364
|
-
@action.("loop test")
|
365
|
-
def test_loop2()
|
366
|
-
run_action_once("test-loop1")
|
367
|
-
end
|
268
|
+
opts = {quiet: true}
|
269
|
+
@app.instance_eval { toggle_global_options(opts) }
|
270
|
+
ok {$VERBOSE_MODE} == false
|
271
|
+
ok {$QUIET_MODE} == true
|
368
272
|
end
|
369
273
|
|
370
|
-
spec "[!
|
371
|
-
|
372
|
-
|
373
|
-
|
274
|
+
spec "[!sucqp] sets `$DEBUG_MODE` according to global options." do
|
275
|
+
at_end { $DEBUG_MODE = nil }
|
276
|
+
opts = {debug: true}
|
277
|
+
@app.instance_eval { toggle_global_options(opts) }
|
278
|
+
ok {$DEBUG_MODE} == true
|
374
279
|
end
|
375
280
|
|
376
|
-
spec "[!
|
377
|
-
|
378
|
-
|
379
|
-
|
281
|
+
spec "[!510eb] sets `$COLOR_MODE` according to global option." do
|
282
|
+
bkup = $COLOR_MODE
|
283
|
+
at_end { $COLOR_MODE = bkup }
|
284
|
+
$COLOR_MODE = nil
|
285
|
+
#
|
286
|
+
opts = {color: true}
|
287
|
+
@app.instance_eval { toggle_global_options(opts) }
|
288
|
+
ok {$COLOR_MODE} == true
|
289
|
+
#
|
290
|
+
opts = {color: false}
|
291
|
+
@app.instance_eval { toggle_global_options(opts) }
|
292
|
+
ok {$COLOR_MODE} == false
|
380
293
|
end
|
381
294
|
|
382
|
-
spec "[!
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
app
|
389
|
-
|
390
|
-
begin
|
391
|
-
['-v', '--verbose'].each do |x|
|
392
|
-
$QUIET_MODE, $DEBUG_MODE, $COLOR_MODE = nil, nil, nil
|
393
|
-
capture_sio { app.run(x, '-h') }
|
394
|
-
ok {[$QUIET_MODE, $DEBUG_MODE, $COLOR_MODE]} == [false, nil, nil]
|
395
|
-
end
|
396
|
-
#
|
397
|
-
['-q', '--quiet'].each do |x|
|
398
|
-
$QUIET_MODE, $DEBUG_MODE, $COLOR_MODE = nil, nil, nil
|
399
|
-
capture_sio { app.run(x, '-h') }
|
400
|
-
ok {[$QUIET_MODE, $DEBUG_MODE, $COLOR_MODE]} == [true, nil, nil]
|
401
|
-
end
|
402
|
-
#
|
403
|
-
['-D', '--debug'].each do |x|
|
404
|
-
$QUIET_MODE, $DEBUG_MODE, $COLOR_MODE = nil, nil, nil
|
405
|
-
capture_sio { app.run(x, '-h') }
|
406
|
-
ok {[$QUIET_MODE, $DEBUG_MODE, $COLOR_MODE]} == [nil, true, nil]
|
407
|
-
end
|
408
|
-
#
|
409
|
-
['--color', '--color=on'].each do |x|
|
410
|
-
$QUIET_MODE, $DEBUG_MODE, $COLOR_MODE = nil, nil, nil
|
411
|
-
capture_sio { app.run(x, '-h') }
|
412
|
-
ok {[$QUIET_MODE, $DEBUG_MODE, $COLOR_MODE]} == [nil, nil, true]
|
413
|
-
end
|
414
|
-
['--color=off'].each do |x|
|
415
|
-
$QUIET_MODE, $DEBUG_MODE, $COLOR_MODE = nil, nil, nil
|
416
|
-
capture_sio { app.run(x, '-h') }
|
417
|
-
ok {[$QUIET_MODE, $DEBUG_MODE, $COLOR_MODE]} == [nil, nil, false]
|
418
|
-
end
|
419
|
-
ensure
|
420
|
-
$QUIET_MODE, $DEBUG_MODE, $COLOR_MODE = bkup
|
421
|
-
end
|
295
|
+
spec "[!y9fow] sets `config.trace_mode` if global option specified." do
|
296
|
+
opts = {trace: true}
|
297
|
+
@app.instance_eval { toggle_global_options(opts) }
|
298
|
+
ok {@config.trace_mode} == true
|
299
|
+
#
|
300
|
+
opts = {trace: false}
|
301
|
+
@app.instance_eval { toggle_global_options(opts) }
|
302
|
+
ok {@config.trace_mode} == false
|
422
303
|
end
|
423
304
|
|
424
|
-
spec "[!
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
ok {@app.instance_variable_get('@_called_')} == nil
|
432
|
-
capture_sio { @app.run("sayhello") }
|
433
|
-
ok {@app.instance_variable_get('@_called_')} == ["sayhello"]
|
305
|
+
spec "[!dply7] sets `$DRYRUN_MODE` according to global option." do
|
306
|
+
ok {$DRYRUN_MODE} == nil
|
307
|
+
at_end { $DRYRUN_MODE = nil }
|
308
|
+
#
|
309
|
+
opts = {dryrun: true}
|
310
|
+
@app.instance_eval { toggle_global_options(opts) }
|
311
|
+
ok {$DRYRUN_MODE} == true
|
434
312
|
end
|
435
313
|
|
436
|
-
|
437
|
-
|
438
|
-
|
314
|
+
end
|
315
|
+
|
316
|
+
|
317
|
+
topic '#handle_global_options()' do
|
318
|
+
|
319
|
+
spec "[!366kv] prints help message if global option `-h, --help` specified." do
|
320
|
+
opts = {help: true}
|
321
|
+
sout, serr = capture_sio do
|
322
|
+
@app.instance_eval { handle_global_options(opts, []) }
|
439
323
|
end
|
440
|
-
ok {
|
441
|
-
|
442
|
-
ok {
|
324
|
+
ok {sout} =~ /^Usage:/
|
325
|
+
ok {sout} =~ /^Options:/
|
326
|
+
ok {sout} =~ /^Actions:/
|
443
327
|
end
|
444
328
|
|
445
|
-
spec "[!
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
@_called2 = args.dup
|
329
|
+
spec "[!7mapy] includes hidden actions into help message if `-a, --all` specified." do
|
330
|
+
rexp1 = /^ --debug : debug mode$/
|
331
|
+
rexp2 = /^ debuginfo : hidden action$/
|
332
|
+
#
|
333
|
+
opts = {help: true}
|
334
|
+
sout, serr = capture_sio do
|
335
|
+
@app.instance_eval { handle_global_options(opts, []) }
|
453
336
|
end
|
454
|
-
ok {
|
455
|
-
ok {
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
spec "[!avxos] prints candidate actions if action name ends with ':'." do
|
462
|
-
class CandidateTest1 < Benry::CmdApp::ActionScope
|
463
|
-
prefix "candi:date1"
|
464
|
-
@action.("test")
|
465
|
-
def bbb(); end
|
466
|
-
@action.("test")
|
467
|
-
def aaa(); end
|
337
|
+
ok {sout} !~ rexp1
|
338
|
+
ok {sout} !~ rexp2
|
339
|
+
#
|
340
|
+
opts = {help: true, all: true}
|
341
|
+
sout, serr = capture_sio do
|
342
|
+
@app.instance_eval { handle_global_options(opts, []) }
|
468
343
|
end
|
469
|
-
|
470
|
-
|
471
|
-
ok {serr} == ""
|
472
|
-
ok {sout} == <<"END"
|
473
|
-
Actions:
|
474
|
-
candi:date1:aaa : test
|
475
|
-
candi:date1:bbb : test
|
476
|
-
END
|
477
|
-
## with tty
|
478
|
-
sout, serr = capture_sio(tty: true) { @app.run("candi:date1:") }
|
479
|
-
ok {serr} == ""
|
480
|
-
ok {sout} == <<"END"
|
481
|
-
\e[34mActions:\e[0m
|
482
|
-
\e[1mcandi:date1:aaa \e[0m : test
|
483
|
-
\e[1mcandi:date1:bbb \e[0m : test
|
484
|
-
END
|
344
|
+
ok {sout} =~ rexp1
|
345
|
+
ok {sout} =~ rexp2
|
485
346
|
end
|
486
347
|
|
487
|
-
spec "[!
|
488
|
-
|
489
|
-
|
490
|
-
@
|
491
|
-
def bbb(); end
|
492
|
-
@action.("test a")
|
493
|
-
def aaa(); end
|
348
|
+
spec "[!dkjw8] prints version number if global option `-V, --version` specified." do
|
349
|
+
opts = {version: true}
|
350
|
+
sout, serr = capture_sio do
|
351
|
+
@app.instance_eval { handle_global_options(opts, []) }
|
494
352
|
end
|
495
|
-
|
496
|
-
@app.config.feat_candidate = false
|
497
|
-
pr = proc { @app.run("candi:date5:") }
|
498
|
-
ok {pr}.raise?(Benry::CmdApp::CommandError,
|
499
|
-
"candi:date5:: Unknown action.")
|
500
|
-
## flag is off
|
501
|
-
@app.config.feat_candidate = true
|
502
|
-
sout, serr = capture_sio(tty: false) { @app.run("candi:date5:") }
|
503
|
-
ok {serr} == ""
|
504
|
-
ok {sout} == <<"END"
|
505
|
-
Actions:
|
506
|
-
candi:date5:aaa : test a
|
507
|
-
candi:date5:bbb : test b
|
508
|
-
END
|
353
|
+
ok {sout} == "1.2.3\n"
|
509
354
|
end
|
510
355
|
|
511
|
-
spec "[!
|
512
|
-
|
513
|
-
|
514
|
-
@
|
515
|
-
@_result = ret
|
516
|
-
ret
|
356
|
+
spec "[!hj4hf] prints action and alias list if global option `-l, --list` specified." do
|
357
|
+
opts = {list: true}
|
358
|
+
sout, serr = capture_sio(tty: true) do
|
359
|
+
@app.instance_eval { handle_global_options(opts, []) }
|
517
360
|
end
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
361
|
+
ok {sout} =~ /\A\e\[1;34mActions:\e\[0m$/
|
362
|
+
if Benry::CmdApp::REGISTRY.metadata_each.any? {|md| md.alias? }
|
363
|
+
ok {sout} =~ /\n\n\e\[1;34mAliases:\e\[0m$/
|
364
|
+
else
|
365
|
+
ok {sout} !~ /Aliases:/
|
522
366
|
end
|
523
|
-
@app.config.default_help = true
|
524
|
-
capture_sio { @app.run() }
|
525
|
-
ok {@app.instance_variable_get('@_args1')} == []
|
526
|
-
ok {@app.instance_variable_get('@_result')} == nil
|
527
|
-
ok {@app.instance_variable_get('@_args2')} == nil
|
528
367
|
end
|
529
368
|
|
530
|
-
spec "[!
|
531
|
-
|
532
|
-
ok {serr} == ""
|
533
|
-
ok {sout} == "Ciao, Alice!\n"
|
534
|
-
end
|
535
|
-
|
536
|
-
spec "[!agfdi] reports error when action not found." do
|
537
|
-
pr = proc { @app.run("xxx-yyy") }
|
538
|
-
ok {pr}.raise?(Benry::CmdApp::CommandError,
|
539
|
-
"xxx-yyy: Unknown action.")
|
540
|
-
end
|
541
|
-
|
542
|
-
spec "[!v5k56] runs default action if action not specified." do
|
543
|
-
@config.default_action = "sayhello"
|
544
|
-
sout, serr = capture_sio { @app.run() }
|
545
|
-
ok {serr} == ""
|
546
|
-
ok {sout} == "Hello, world!\n"
|
547
|
-
end
|
548
|
-
|
549
|
-
spec "[!o5i3w] reports error when default action not found." do
|
550
|
-
@config.default_action = "xxx-zzz"
|
551
|
-
pr = proc { @app.run() }
|
552
|
-
ok {pr}.raise?(Benry::CmdApp::CommandError,
|
553
|
-
"xxx-zzz: Unknown default action.")
|
554
|
-
end
|
555
|
-
|
556
|
-
spec "[!7h0ku] prints help if no action but 'config.default_help' is true." do
|
557
|
-
expected, serr = capture_sio { @app.run("-h") }
|
558
|
-
ok {serr} == ""
|
559
|
-
ok {expected} =~ /^Usage:/
|
369
|
+
spec "[!tyxwo] includes hidden actions into action list if `-a, --all` specified." do
|
370
|
+
rexp = /^ debuginfo +: hidden action$/
|
560
371
|
#
|
561
|
-
|
562
|
-
sout, serr = capture_sio
|
563
|
-
|
564
|
-
|
372
|
+
opts = {list: true}
|
373
|
+
sout, serr = capture_sio do
|
374
|
+
@app.instance_eval { handle_global_options(opts, []) }
|
375
|
+
end
|
376
|
+
ok {sout} !~ rexp
|
377
|
+
#
|
378
|
+
opts = {list: true, all: true}
|
379
|
+
sout, serr = capture_sio do
|
380
|
+
@app.instance_eval { handle_global_options(opts, []) }
|
381
|
+
end
|
382
|
+
ok {sout} =~ rexp
|
565
383
|
end
|
566
384
|
|
567
|
-
spec "[!
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
|
385
|
+
spec "[!ooiaf] prints topic list if global option '-L <topic>' specified." do
|
386
|
+
Benry::CmdApp.define_alias('h0053', 'hello')
|
387
|
+
Benry::CmdApp.define_abbrev('g0053:', 'git:')
|
388
|
+
at_end {
|
389
|
+
Benry::CmdApp.undef_alias('h0053')
|
390
|
+
#Benry::CmdApp.undef_abbrev('g0053:')
|
391
|
+
Benry::CmdApp::REGISTRY.instance_eval { @abbrev_dict.delete('g0053:') }
|
392
|
+
}
|
393
|
+
#
|
394
|
+
chead = '\e\[1;34mCategories:\e\[0m'
|
395
|
+
data = [
|
396
|
+
[/\A\e\[1;34mActions:\e\[0m$/ , ["action" , "actions" ]],
|
397
|
+
[/\A\e\[1;34mAliases:\e\[0m$/ , ["alias" , "aliases" ]],
|
398
|
+
[/\A\e\[1;34mAbbreviations:\e\[0m$/ , ["abbrev" , "abbrevs" ]],
|
399
|
+
[/\A#{chead} \e\[2m\(depth=0\)\e\[0m$/, ["category" , "categories" ]],
|
400
|
+
[/\A#{chead} \e\[2m\(depth=1\)\e\[0m$/, ["category1", "categories1"]],
|
401
|
+
[/\A#{chead} \e\[2m\(depth=2\)\e\[0m$/, ["category2", "categories2"]],
|
402
|
+
[/\A#{chead} \e\[2m\(depth=3\)\e\[0m$/, ["category3", "categories3"]],
|
403
|
+
]
|
404
|
+
data.each do |rexp, topics|
|
405
|
+
topics.each do |topic|
|
406
|
+
g_opts = {topic: topic}
|
407
|
+
sout, serr = capture_sio(tty: true) do
|
408
|
+
@app.instance_eval { handle_global_options(g_opts, []) }
|
409
|
+
end
|
410
|
+
ok {sout} =~ rexp
|
411
|
+
end
|
412
|
+
end
|
572
413
|
end
|
573
414
|
|
574
|
-
spec "[!
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
sout, serr = capture_sio { @app.run("check-config") }
|
579
|
-
ok {sout} == "$cmdapp_config.class=Benry::CmdApp::Config\n"
|
580
|
-
ok {$cmdapp_config} == nil
|
581
|
-
ensure
|
582
|
-
$cmdapp_config = bkup
|
415
|
+
spec "[!ymifi] includes hidden actions into topic list if `-a, --all` specified." do
|
416
|
+
g_opts = {topic: "action", all: true}
|
417
|
+
sout, serr = capture_sio do
|
418
|
+
@app.instance_eval { handle_global_options(g_opts, []) }
|
583
419
|
end
|
420
|
+
ok {sout} =~ /\AActions:$/
|
421
|
+
ok {sout} =~ /^ debuginfo : hidden action$/
|
584
422
|
end
|
585
423
|
|
586
|
-
spec "[!
|
587
|
-
|
588
|
-
|
424
|
+
spec "[!k31ry] returns `0` if help or version or actions printed." do
|
425
|
+
keys = [:help, :version, :list]
|
426
|
+
keys.each do |key|
|
427
|
+
ret = nil
|
428
|
+
opts = {key => true}
|
429
|
+
capture_sio do
|
430
|
+
ret = @app.instance_eval { handle_global_options(opts, []) }
|
431
|
+
end
|
432
|
+
ok {ret} == 0
|
589
433
|
end
|
590
|
-
ok {@app.instance_variable_get('@_args')} == nil
|
591
|
-
sout, serr = capture_sio { @app.run("check-config") }
|
592
|
-
ok {@app.instance_variable_get('@_args')} == [nil]
|
593
434
|
end
|
594
435
|
|
595
|
-
spec "[!
|
596
|
-
|
597
|
-
|
598
|
-
|
599
|
-
|
600
|
-
pr = proc { @app.run("test-exception1") }
|
601
|
-
ok {pr}.raise?(ZeroDivisionError) do |exc|
|
602
|
-
ok {@app.instance_variable_get('@_args')} == [exc]
|
436
|
+
spec "[!9agnb] returns `nil` if do nothing." do
|
437
|
+
ret = nil
|
438
|
+
opts = {color: true, debug: true}
|
439
|
+
capture_sio do
|
440
|
+
ret = @app.instance_eval { handle_global_options(opts, []) }
|
603
441
|
end
|
442
|
+
ok {ret} == nil
|
604
443
|
end
|
605
444
|
|
606
445
|
end
|
607
446
|
|
608
447
|
|
609
|
-
topic '#
|
448
|
+
topic '#render_action_help()' do
|
610
449
|
|
611
|
-
spec "[!
|
612
|
-
|
613
|
-
|
614
|
-
|
615
|
-
TestApp (1.0.0) -- test app
|
450
|
+
spec "[!c510c] returns action help message." do
|
451
|
+
s = @app.instance_eval { render_action_help("hello") }
|
452
|
+
ok {s} == <<"END"
|
453
|
+
\e[1mtestapp hello\e[0m --- greeting message
|
616
454
|
|
617
|
-
|
618
|
-
$
|
455
|
+
\e[1;34mUsage:\e[0m
|
456
|
+
$ \e[1mtestapp hello\e[0m [<options>] [<name>]
|
619
457
|
|
620
|
-
|
621
|
-
-
|
622
|
-
-V, --version : print version
|
623
|
-
-a, --all : list all actions including private (hidden) ones
|
624
|
-
-D, --debug : debug mode (set $DEBUG_MODE to true)
|
625
|
-
|
626
|
-
Actions:
|
458
|
+
\e[1;34mOptions:\e[0m
|
459
|
+
-l, --lang=<lang> : language name (en/fr/it)
|
627
460
|
END
|
628
461
|
end
|
629
462
|
|
630
463
|
end
|
631
464
|
|
632
465
|
|
633
|
-
topic '#
|
634
|
-
|
635
|
-
spec "[!u3zdg] creates global option schema object according to config." do
|
636
|
-
config = Benry::CmdApp::Config.new("test app", "1.0.0",
|
637
|
-
option_all: true, option_quiet: true)
|
638
|
-
app = Benry::CmdApp::Application.new(config)
|
639
|
-
x = app.__send__(:do_create_global_option_schema, config)
|
640
|
-
ok {x}.is_a?(Benry::CmdApp::AppOptionSchema)
|
641
|
-
ok {x.find_long_option("all")} != nil
|
642
|
-
ok {x.find_long_option("quiet")} != nil
|
643
|
-
ok {x.find_long_option("verbose")} == nil
|
644
|
-
ok {x.find_long_option("debug")} == nil
|
645
|
-
end
|
466
|
+
topic '#render_application_help()' do
|
646
467
|
|
647
|
-
|
468
|
+
spec "[!iyxxb] returns application help message." do
|
469
|
+
actual = @app.instance_eval { render_application_help() }
|
470
|
+
expected = <<"END"
|
471
|
+
\e[1mtestapp\e[0m \e[2m(1.2.3)\e[0m --- test app
|
648
472
|
|
473
|
+
\e[1;34mUsage:\e[0m
|
474
|
+
$ \e[1mtestapp\e[0m [<options>] <action> [<arguments>...]
|
649
475
|
|
650
|
-
|
476
|
+
\e[1;34mOptions:\e[0m
|
477
|
+
-h, --help : print help message (of action if specified)
|
478
|
+
-V, --version : print version
|
479
|
+
-l, --list : list actions and aliases
|
480
|
+
-a, --all : list hidden actions/options, too
|
651
481
|
|
652
|
-
|
653
|
-
|
654
|
-
|
655
|
-
|
656
|
-
|
657
|
-
ok {x}.is_a?(Benry::CmdApp::AppHelpBuilder)
|
482
|
+
\e[1;34mActions:\e[0m
|
483
|
+
END
|
484
|
+
ok {actual}.start_with?(expected)
|
485
|
+
ok {actual} =~ /^ hello : greeting message$/
|
486
|
+
ok {actual} =~ /^ git:stage : same as `git add -p`$/
|
658
487
|
end
|
659
488
|
|
660
489
|
end
|
661
490
|
|
662
491
|
|
663
|
-
topic '#
|
664
|
-
|
665
|
-
spec "[!5br6t] parses only global options and not parse action options." do
|
666
|
-
sout, serr = capture_sio { @app.run("test-globalopt", "--help") }
|
667
|
-
ok {serr} == ""
|
668
|
-
ok {sout} == "help=true\n"
|
669
|
-
end
|
492
|
+
topic '#render_version()' do
|
670
493
|
|
671
|
-
spec "[!
|
672
|
-
|
673
|
-
ok {
|
494
|
+
spec "[!bcp2g] returns version number string." do
|
495
|
+
s = @app.instance_eval { render_version() }
|
496
|
+
ok {s} == "1.2.3\n"
|
674
497
|
end
|
675
498
|
|
676
499
|
end
|
677
500
|
|
678
501
|
|
679
|
-
topic '#
|
502
|
+
topic '#render_item_list()' do
|
680
503
|
|
681
|
-
|
682
|
-
|
683
|
-
|
684
|
-
|
685
|
-
option_debug: true,
|
686
|
-
option_color: true,
|
687
|
-
option_trace: true)
|
688
|
-
@app = Benry::CmdApp::Application.new(@config)
|
504
|
+
class FakeAppHelpBuilder < Benry::CmdApp::ApplicationHelpBuilder
|
505
|
+
def section_availables(include=true, all: false); return nil; end
|
506
|
+
def section_candidates(prefix, all: false); return nil; end
|
507
|
+
def section_categories(depth=1, all: false); return nil; end
|
689
508
|
end
|
690
509
|
|
691
|
-
|
692
|
-
|
693
|
-
|
694
|
-
|
695
|
-
|
696
|
-
|
697
|
-
|
698
|
-
|
699
|
-
|
700
|
-
|
701
|
-
$QUIET_MODE = bkup
|
510
|
+
def fake_app_help_builder(&b)
|
511
|
+
Benry::CmdApp.module_eval do
|
512
|
+
remove_const :APPLICATION_HELP_BUILDER_CLASS
|
513
|
+
const_set :APPLICATION_HELP_BUILDER_CLASS, FakeAppHelpBuilder
|
514
|
+
end
|
515
|
+
yield
|
516
|
+
ensure
|
517
|
+
Benry::CmdApp.module_eval do
|
518
|
+
remove_const :APPLICATION_HELP_BUILDER_CLASS
|
519
|
+
const_set :APPLICATION_HELP_BUILDER_CLASS, Benry::CmdApp::ApplicationHelpBuilder
|
702
520
|
end
|
703
521
|
end
|
704
522
|
|
705
|
-
|
706
|
-
|
707
|
-
|
708
|
-
|
709
|
-
|
710
|
-
|
711
|
-
|
712
|
-
ok {$QUIET_MODE} == true
|
713
|
-
end
|
714
|
-
ensure
|
715
|
-
$QUIET_MODE = bkup
|
523
|
+
case_when "[!tftl5] when prefix is not specified..." do
|
524
|
+
|
525
|
+
spec "[!36vz6] returns action list string if any actions defined." do
|
526
|
+
s = @app.instance_eval { render_item_list(nil) }
|
527
|
+
ok {s} !~ /\A\e\[1;34mUsage:\e\[0m$/
|
528
|
+
ok {s} !~ /\A\e\[1;34mOptions:\e\[0m$/
|
529
|
+
ok {s} =~ /\A\e\[1;34mActions:\e\[0m$/
|
716
530
|
end
|
717
|
-
end
|
718
531
|
|
719
|
-
|
720
|
-
|
721
|
-
|
722
|
-
|
723
|
-
|
724
|
-
sout, serr = capture_sio { @app.run(opt, "test-debugopt") }
|
725
|
-
ok {serr} == ""
|
726
|
-
ok {$COLOR_MODE} == val
|
532
|
+
spec "[!znuy4] raises CommandError if no actions defined." do
|
533
|
+
fake_app_help_builder() do
|
534
|
+
pr = proc { @app.instance_eval { render_item_list(nil) } }
|
535
|
+
ok {pr}.raise?(Benry::CmdApp::CommandError,
|
536
|
+
"No actions defined.")
|
727
537
|
end
|
728
|
-
ensure
|
729
|
-
$COLOR_MODE = bkup
|
730
538
|
end
|
539
|
+
|
731
540
|
end
|
732
541
|
|
733
|
-
|
734
|
-
|
735
|
-
|
736
|
-
|
737
|
-
|
738
|
-
|
739
|
-
|
740
|
-
|
741
|
-
|
742
|
-
|
743
|
-
|
744
|
-
|
542
|
+
case_when "[!jcq4z] when separator is specified..." do
|
543
|
+
|
544
|
+
spec "[!w1j1e] returns top prefix list if ':' specified." do
|
545
|
+
s = @app.instance_eval { render_item_list(":") }
|
546
|
+
ok {s} !~ /\A\e\[1;34mUsage:\e\[0m$/
|
547
|
+
ok {s} !~ /\A\e\[1;34mOptions:\e\[0m$/
|
548
|
+
ok {s} !~ /\A\e\[1;34mActions:\e\[0m$/
|
549
|
+
ok {s} =~ /\A\e\[1;34mCategories:\e\[0m \e\[2m\(depth=\d+\)\e\[0m$/
|
550
|
+
#
|
551
|
+
ok {s} !~ /^ hello/
|
552
|
+
#ok {s} =~ /^ foo: \(\d+\)$/
|
553
|
+
ok {s} =~ /^ git: \(\d+\)$/
|
554
|
+
ok {s} =~ /^ giit: \(\d+\)/
|
555
|
+
ok {s} !~ /^ hello/
|
556
|
+
#
|
557
|
+
ok {s} =~ /^ giit: \(\d\d\) : gitt commands$/
|
558
|
+
ok {s} !~ /^ giit:branch: \(\d+\)$/
|
559
|
+
ok {s} !~ /^ giit:commit: \(\d+\)$/
|
560
|
+
ok {s} !~ /^ giit:repo: \(\d+\)$/
|
561
|
+
ok {s} !~ /^ giit:staging: \(\d+\)$/
|
745
562
|
end
|
746
|
-
end
|
747
563
|
|
748
|
-
|
749
|
-
|
750
|
-
|
751
|
-
|
752
|
-
|
753
|
-
|
754
|
-
|
755
|
-
|
564
|
+
spec "[!bgput] returns two depth prefix list if '::' specified." do
|
565
|
+
s = @app.instance_eval { render_item_list("::") }
|
566
|
+
ok {s} !~ /\A\e\[1;34mUsage:\e\[0m$/
|
567
|
+
ok {s} !~ /\A\e\[1;34mOptions:\e\[0m$/
|
568
|
+
ok {s} !~ /\A\e\[1;34mActions:\e\[0m$/
|
569
|
+
ok {s} =~ /\A\e\[1;34mCategories:\e\[0m \e\[2m\(depth=\d+\)\e\[0m$/
|
570
|
+
#
|
571
|
+
#ok {s} =~ /^ foo: \(\d+\)$/
|
572
|
+
ok {s} =~ /^ git: \(\d+\)$/
|
573
|
+
ok {s} =~ /^ giit: \(\d\) : gitt commands$/
|
574
|
+
ok {s} !~ /^ hello/
|
575
|
+
#
|
576
|
+
ok {s} =~ /^ giit:branch: \(\d+\)$/
|
577
|
+
ok {s} =~ /^ giit:commit: \(\d+\)$/
|
578
|
+
ok {s} =~ /^ giit:repo: \(\d+\)$/
|
579
|
+
ok {s} =~ /^ giit:staging: \(\d+\)$/
|
580
|
+
end
|
581
|
+
|
582
|
+
spec "[!tiihg] raises CommandError if no actions found having prefix." do
|
583
|
+
fake_app_help_builder() do
|
584
|
+
pr = proc { @app.instance_eval { render_item_list(":") } }
|
585
|
+
ok {pr}.raise?(Benry::CmdApp::CommandError,
|
586
|
+
"Prefix of actions not found.")
|
756
587
|
end
|
757
|
-
ensure
|
758
|
-
$TRACE_MODE = bkup
|
759
588
|
end
|
589
|
+
|
760
590
|
end
|
761
591
|
|
762
|
-
|
592
|
+
case_when "[!xut9o] when prefix is specified..." do
|
763
593
|
|
594
|
+
spec "[!z4dqn] filters action list by prefix if specified." do
|
595
|
+
s = @app.instance_eval { render_item_list("git:") }
|
596
|
+
ok {s} == <<"END"
|
597
|
+
\e[1;34mActions:\e[0m
|
598
|
+
git:stage : same as `git add -p`
|
599
|
+
git:staged : same as `git diff --cached`
|
600
|
+
git:unstage : same as `git reset HEAD`
|
601
|
+
END
|
602
|
+
end
|
764
603
|
|
765
|
-
|
604
|
+
spec "[!1834c] raises CommandError if no actions found with names starting with that prefix." do
|
605
|
+
fake_app_help_builder() do
|
606
|
+
pr = proc { @app.instance_eval { render_item_list("git:") } }
|
607
|
+
ok {pr}.raise?(Benry::CmdApp::CommandError,
|
608
|
+
"No actions found with names starting with 'git:'.")
|
609
|
+
end
|
610
|
+
end
|
766
611
|
|
767
|
-
def new_app()
|
768
|
-
kws = {
|
769
|
-
app_name: "TestApp",
|
770
|
-
app_command: "testapp",
|
771
|
-
option_all: true,
|
772
|
-
option_verbose: true,
|
773
|
-
option_quiet: true,
|
774
|
-
option_color: true,
|
775
|
-
option_debug: true,
|
776
|
-
default_action: nil,
|
777
|
-
}
|
778
|
-
config = Benry::CmdApp::Config.new("test app", "1.0.0", **kws)
|
779
|
-
return Benry::CmdApp::Application.new(config)
|
780
612
|
end
|
781
613
|
|
782
|
-
|
783
|
-
expected = <<"END"
|
784
|
-
TestApp (1.0.0) -- test app
|
785
|
-
|
786
|
-
Usage:
|
787
|
-
$ testapp [<options>] [<action> [<arguments>...]]
|
614
|
+
case_else "[!xjdrm] else..." do
|
788
615
|
|
789
|
-
|
790
|
-
|
791
|
-
|
792
|
-
|
793
|
-
-v, --verbose : verbose mode
|
794
|
-
-q, --quiet : quiet mode
|
795
|
-
--color[=<on|off>] : enable/disable color
|
796
|
-
-D, --debug : debug mode (set $DEBUG_MODE to true)
|
797
|
-
|
798
|
-
Actions:
|
799
|
-
END
|
800
|
-
app = new_app()
|
801
|
-
["-h", "--help"].each do |opt|
|
802
|
-
sout, serr = capture_sio { app.run(opt) }
|
803
|
-
ok {serr} == ""
|
804
|
-
ok {sout}.start_with?(expected)
|
616
|
+
spec "[!9r4w9] raises ArgumentError." do
|
617
|
+
pr = proc { @app.instance_eval { render_item_list("git") } }
|
618
|
+
ok {pr}.raise?(ArgumentError,
|
619
|
+
"\"git\": Invalid value as a prefix.")
|
805
620
|
end
|
621
|
+
|
806
622
|
end
|
807
623
|
|
808
|
-
|
809
|
-
expected = <<"END"
|
810
|
-
testapp sayhello -- print greeting message
|
624
|
+
end
|
811
625
|
|
812
|
-
Usage:
|
813
|
-
$ testapp sayhello [<options>] [<user>]
|
814
626
|
|
815
|
-
|
816
|
-
-l, --lang=<en|fr|it> : language
|
817
|
-
END
|
818
|
-
app = new_app()
|
819
|
-
["-h", "--help"].each do |opt|
|
820
|
-
sout, serr = capture_sio { app.run(opt, "sayhello") }
|
821
|
-
ok {serr} == ""
|
822
|
-
ok {sout} == expected
|
823
|
-
end
|
824
|
-
end
|
627
|
+
topic '#render_topic_list()' do
|
825
628
|
|
826
|
-
spec "[!
|
827
|
-
|
828
|
-
|
829
|
-
|
830
|
-
|
831
|
-
|
832
|
-
|
629
|
+
spec "[!uzmml] renders topic list." do
|
630
|
+
x = @app.__send__(:render_topic_list, "action")
|
631
|
+
ok {x} =~ /\A\e\[1;34mActions:\e\[0m$/
|
632
|
+
ok {x} =~ /^ hello : greeting message$/
|
633
|
+
#
|
634
|
+
Benry::CmdApp.define_alias("chiaou", ["hello", "-l", "it"])
|
635
|
+
x = @app.__send__(:render_topic_list, "alias")
|
636
|
+
ok {x} =~ /\A\e\[1;34mAliases:\e\[0m$/
|
637
|
+
ok {x} =~ /^ chiaou : alias for 'hello -l it'$/
|
638
|
+
#
|
639
|
+
x = @app.__send__(:render_topic_list, "category")
|
640
|
+
ok {x} =~ /\A\e\[1;34mCategories:\e\[0m \e\[2m\(depth=0\)\e\[0m$/
|
641
|
+
ok {x} =~ /^ git: \(3\)$/
|
642
|
+
ok {x} =~ /^ giit: \(\d+\) +: gitt commands$/
|
643
|
+
#
|
644
|
+
Benry::CmdApp.define_abbrev("g31:", "git:")
|
645
|
+
x = @app.__send__(:render_topic_list, "abbrev")
|
646
|
+
ok {x} =~ /\A\e\[1;34mAbbreviations:\e\[0m$/
|
647
|
+
ok {x} =~ /^ g31: +=> git:$/
|
648
|
+
end
|
649
|
+
|
650
|
+
spec "[!vrzu0] topic 'category1' or 'categories2' is acceptable." do
|
651
|
+
x = @app.__send__(:render_topic_list, "category1")
|
652
|
+
ok {x} =~ /\A\e\[1;34mCategories:\e\[0m \e\[2m\(depth=1\)\e\[0m$/
|
653
|
+
ok {x} =~ /^ git: \(3\)$/
|
654
|
+
ok {x} =~ /^ giit: \(\d+\) +: gitt commands$/
|
655
|
+
ok {x} !~ /^ giit:branch:/
|
656
|
+
ok {x} !~ /^ giit:repo:/
|
657
|
+
#
|
658
|
+
x = @app.__send__(:render_topic_list, "category2")
|
659
|
+
ok {x} =~ /\A\e\[1;34mCategories:\e\[0m \e\[2m\(depth=2\)\e\[0m$/
|
660
|
+
ok {x} =~ /^ git: \(3\)$/
|
661
|
+
ok {x} =~ /^ giit: \(0\) +: gitt commands$/
|
662
|
+
ok {x} =~ /^ giit:branch: \(2\)$/
|
663
|
+
ok {x} =~ /^ giit:repo: \(7\)$/
|
664
|
+
ok {x} !~ /^ giit:repo:config:/
|
665
|
+
ok {x} !~ /^ giit:repo:remote:/
|
666
|
+
#
|
667
|
+
x = @app.__send__(:render_topic_list, "categories3")
|
668
|
+
ok {x} =~ /\A\e\[1;34mCategories:\e\[0m \e\[2m\(depth=3\)\e\[0m$/
|
669
|
+
ok {x} =~ /^ git: \(3\)$/
|
670
|
+
ok {x} =~ /^ giit: \(0\) +: gitt commands$/
|
671
|
+
ok {x} =~ /^ giit:branch: \(2\)$/
|
672
|
+
ok {x} =~ /^ giit:repo: \(2\)$/
|
673
|
+
ok {x} =~ /^ giit:repo:config: \(3\)$/
|
674
|
+
ok {x} =~ /^ giit:repo:remote: \(2\)$/
|
675
|
+
end
|
676
|
+
|
677
|
+
spec "[!xyn5g] global option '-L metadata' renders registry data in YAML format." do
|
678
|
+
config = Benry::CmdApp::Config.new("test app", "0.0.0")
|
679
|
+
app = Benry::CmdApp::Application.new(config)
|
680
|
+
sout, serr = capture_sio { app.run("-L", "metadata") }
|
681
|
+
ok {serr} == ""
|
682
|
+
require 'yaml'
|
683
|
+
ydoc = YAML.load(sout)
|
684
|
+
ok {ydoc["actions"]}.is_a?(Array)
|
685
|
+
ok {ydoc["aliases"]}.is_a?(Array)
|
686
|
+
ok {ydoc["categories"]}.is_a?(Array)
|
687
|
+
ok {ydoc["abbreviations"]}.is_a?(Array)
|
833
688
|
end
|
834
689
|
|
835
690
|
end
|
836
691
|
|
837
692
|
|
838
|
-
topic '#
|
693
|
+
topic '#handle_blank_action()' do
|
839
694
|
|
840
|
-
|
841
|
-
|
842
|
-
|
843
|
-
|
844
|
-
|
845
|
-
spec "[!xwo0v] calls callback if provided." do
|
846
|
-
called = nil
|
847
|
-
app = new_app do |args, global_opts, config|
|
848
|
-
called = [args.dup, global_opts, config]
|
849
|
-
end
|
850
|
-
ok {called} == nil
|
851
|
-
without_tty { app.run("sayhello") }
|
852
|
-
ok {called} != nil
|
853
|
-
ok {called[0]} == ["sayhello"]
|
854
|
-
ok {called[1]} == {}
|
855
|
-
ok {called[2]} == @config
|
856
|
-
end
|
857
|
-
|
858
|
-
spec "[!lljs1] calls callback only once." do
|
859
|
-
n = 0
|
860
|
-
app = new_app do |args, global_opts, config|
|
861
|
-
n += 1
|
695
|
+
spec "[!seba7] prints action list and returns `0`." do
|
696
|
+
ret = nil
|
697
|
+
sout, serr = capture_sio do
|
698
|
+
ret = @app.instance_eval { handle_blank_action() }
|
862
699
|
end
|
863
|
-
ok {
|
864
|
-
|
865
|
-
ok {
|
866
|
-
|
867
|
-
ok {n} == 1
|
868
|
-
without_tty { app.run("sayhello") }
|
869
|
-
ok {n} == 1
|
700
|
+
ok {sout} !~ /\AUsage:$/
|
701
|
+
ok {sout} !~ /\AOptions:$/
|
702
|
+
ok {sout} =~ /\AActions:$/
|
703
|
+
ok {ret} == 0
|
870
704
|
end
|
871
705
|
|
872
706
|
end
|
873
707
|
|
874
708
|
|
875
|
-
topic '#
|
709
|
+
topic '#handle_prefix()' do
|
876
710
|
|
877
|
-
spec "[!
|
878
|
-
|
879
|
-
|
880
|
-
|
711
|
+
spec "[!8w301] prints action list starting with prefix and returns `0`." do
|
712
|
+
ret = nil
|
713
|
+
sout, serr = capture_sio do
|
714
|
+
ret = @app.instance_eval { handle_prefix("git:") }
|
715
|
+
end
|
716
|
+
ok {ret} == 0
|
717
|
+
ok {sout} == <<"END"
|
718
|
+
Actions:
|
719
|
+
git:stage : same as `git add -p`
|
720
|
+
git:staged : same as `git diff --cached`
|
721
|
+
git:unstage : same as `git reset HEAD`
|
722
|
+
END
|
881
723
|
end
|
882
724
|
|
883
|
-
|
884
|
-
pr = proc { @app.__send__(:do_find_action, ["hiyo"], {}) }
|
885
|
-
ok {pr}.raise?(Benry::CmdApp::CommandError,
|
886
|
-
"hiyo: Unknown action.")
|
887
|
-
end
|
725
|
+
end
|
888
726
|
|
889
|
-
spec "[!gucj7] if no action specified, finds default action instead." do
|
890
|
-
@app.config.default_action = "sayhello"
|
891
|
-
x = @app.__send__(:do_find_action, [], {})
|
892
|
-
ok {x}.is_a?(Benry::CmdApp::ActionMetadata)
|
893
|
-
ok {x.name} == "sayhello"
|
894
|
-
end
|
895
727
|
|
896
|
-
|
897
|
-
@app.config.default_action = "hiyo"
|
898
|
-
pr = proc { @app.__send__(:do_find_action, [], {}) }
|
899
|
-
ok {pr}.raise?(Benry::CmdApp::CommandError,
|
900
|
-
"hiyo: Unknown default action.")
|
901
|
-
end
|
728
|
+
topic '#start_action()' do
|
902
729
|
|
903
|
-
spec "[!
|
904
|
-
|
905
|
-
|
906
|
-
|
907
|
-
|
730
|
+
spec "[!vbymd] runs action with args and returns `0`." do
|
731
|
+
ret = nil
|
732
|
+
sout, serr = capture_sio do
|
733
|
+
ret = @app.instance_eval { start_action("hello", ["-l", "it", "Alice"]) }
|
734
|
+
end
|
735
|
+
ok {ret} == 0
|
736
|
+
ok {sout} == "Chao, Alice!\n"
|
908
737
|
end
|
909
738
|
|
910
|
-
spec "[!
|
911
|
-
|
912
|
-
|
913
|
-
|
914
|
-
|
915
|
-
|
739
|
+
spec "[!6htva] supports abbreviation of prefix." do
|
740
|
+
Benry::CmdApp.define_abbrev("g1:", "git:")
|
741
|
+
sout, serr = capture_sio do
|
742
|
+
@app.instance_eval do
|
743
|
+
start_action("g1:stage", ["."])
|
744
|
+
start_action("g1:unstage", [])
|
745
|
+
end
|
746
|
+
end
|
747
|
+
ok {sout} == <<'END'
|
748
|
+
git add -p .
|
749
|
+
git reset HEAD
|
750
|
+
END
|
916
751
|
end
|
917
752
|
|
918
753
|
end
|
919
754
|
|
920
755
|
|
921
|
-
topic '#
|
756
|
+
topic '#new_context()' do
|
922
757
|
|
923
|
-
spec "[!
|
924
|
-
|
925
|
-
ok {
|
926
|
-
ok {
|
758
|
+
spec "[!9ddcl] creates new context object with config object." do
|
759
|
+
x = @app.instance_eval { new_context() }
|
760
|
+
ok {x}.is_a?(Benry::CmdApp::ApplicationContext)
|
761
|
+
ok {x.instance_variable_get(:@config)} == @config
|
927
762
|
end
|
928
763
|
|
929
|
-
|
930
|
-
pr = proc { @app.run("test-arity1") }
|
931
|
-
ok {pr}.raise?(Benry::CmdApp::CommandError,
|
932
|
-
"test-arity1: Argument required.")
|
933
|
-
end
|
764
|
+
end
|
934
765
|
|
935
|
-
spec "[!72jla] error if action requires N args but specified less than N args." do
|
936
|
-
pr = proc { @app.run("test-arity1", "foo") }
|
937
|
-
ok {pr}.raise?(Benry::CmdApp::CommandError,
|
938
|
-
"test-arity1: Too less arguments (at least 2).")
|
939
|
-
end
|
940
766
|
|
941
|
-
|
942
|
-
pr = proc { @app.run("test-arity1", "foo", "bar", "baz", "boo") }
|
943
|
-
ok {pr}.raise?(Benry::CmdApp::CommandError,
|
944
|
-
"test-arity1: Too much arguments (at most 3).")
|
945
|
-
end
|
767
|
+
topic '#print_str()' do
|
946
768
|
|
947
|
-
spec "[!
|
948
|
-
|
949
|
-
|
950
|
-
|
951
|
-
ok {
|
769
|
+
spec "[!yiabh] do nothing if str is nil." do
|
770
|
+
sout, serr = capture_sio do
|
771
|
+
@app.instance_eval { print_str nil }
|
772
|
+
end
|
773
|
+
ok {sout} == ""
|
774
|
+
ok {serr} == ""
|
952
775
|
end
|
953
776
|
|
954
|
-
spec "[!
|
955
|
-
|
956
|
-
|
957
|
-
|
777
|
+
spec "[!6kyv9] prints string as is if color mode is enabled." do
|
778
|
+
bkup = $COLOR_MODE; at_end { $COLOR_MODE = bkup }
|
779
|
+
$COLOR_MODE = true
|
780
|
+
sout, serr = capture_sio do
|
781
|
+
@app.instance_eval { print_str("\e[1mHello\e[0m") }
|
782
|
+
end
|
783
|
+
ok {sout} == "\e[1mHello\e[0m"
|
958
784
|
end
|
959
785
|
|
960
|
-
spec "[!
|
961
|
-
|
962
|
-
|
963
|
-
|
786
|
+
spec "[!lxhvq] deletes escape characters from string and prints it if color mode is disabled." do
|
787
|
+
bkup = $COLOR_MODE; at_end { $COLOR_MODE = bkup }
|
788
|
+
$COLOR_MODE = false
|
789
|
+
sout, serr = capture_sio do
|
790
|
+
@app.instance_eval { print_str("\e[1mHello\e[0m") }
|
791
|
+
end
|
792
|
+
ok {sout} == "Hello"
|
964
793
|
end
|
965
794
|
|
966
795
|
end
|
967
796
|
|
968
797
|
|
969
|
-
topic '#
|
798
|
+
topic '#print_error()' do
|
970
799
|
|
971
|
-
|
972
|
-
|
973
|
-
|
974
|
-
|
975
|
-
|
800
|
+
fixture(:err) {
|
801
|
+
begin
|
802
|
+
1/0
|
803
|
+
rescue ZeroDivisionError => err
|
804
|
+
end
|
805
|
+
err
|
806
|
+
}
|
976
807
|
|
977
|
-
|
978
|
-
|
808
|
+
spec "[!sdbj8] prints exception as error message." do |err|
|
809
|
+
sout, serr = capture_sio(tty: true) do
|
810
|
+
@app.instance_eval { print_error(err) }
|
811
|
+
end
|
812
|
+
ok {sout} == ""
|
813
|
+
ok {serr} == "\e[31m[ERROR]\e[0m divided by 0\n"
|
814
|
+
end
|
979
815
|
|
980
|
-
|
981
|
-
|
982
|
-
|
816
|
+
spec "[!6z0mu] prints colored error message if stderr is a tty." do |err|
|
817
|
+
sout, serr = capture_sio(tty: true) do
|
818
|
+
@app.instance_eval { print_error(err) }
|
819
|
+
end
|
820
|
+
ok {sout} == ""
|
821
|
+
ok {serr} == "\e[31m[ERROR]\e[0m divided by 0\n"
|
983
822
|
end
|
984
823
|
|
985
|
-
spec "[!
|
986
|
-
|
987
|
-
|
988
|
-
ok {pr}.raise?(Benry::CmdApp::CommandError,
|
989
|
-
"xhello: Action not found.")
|
824
|
+
spec "[!k1s3o] prints non-colored error message if stderr is not a tty." do |err|
|
825
|
+
sout, serr = capture_sio(tty: false) do
|
826
|
+
@app.instance_eval { print_error(err) }
|
990
827
|
end
|
828
|
+
ok {sout} == ""
|
829
|
+
ok {serr} == "[ERROR] divided by 0\n"
|
991
830
|
end
|
992
831
|
|
993
|
-
|
994
|
-
sout, serr = capture_sio { @app.run("-h") }
|
995
|
-
ok {serr} == ""
|
996
|
-
ok {sout}.start_with?(<<'END')
|
997
|
-
TestApp (1.0.0) -- test app
|
832
|
+
end
|
998
833
|
|
999
|
-
Usage:
|
1000
|
-
$ testapp [<options>] [<action> [<arguments>...]]
|
1001
834
|
|
1002
|
-
|
1003
|
-
-h, --help : print help message
|
1004
|
-
-V, --version : print version
|
1005
|
-
-a, --all : list all actions including private (hidden) ones
|
1006
|
-
-D, --debug : debug mode (set $DEBUG_MODE to true)
|
835
|
+
topic '#print_backtrace()' do
|
1007
836
|
|
1008
|
-
|
1009
|
-
|
1010
|
-
|
837
|
+
fixture(:err) {
|
838
|
+
begin
|
839
|
+
1/0
|
840
|
+
rescue ZeroDivisionError => err
|
841
|
+
end
|
842
|
+
err
|
843
|
+
}
|
1011
844
|
|
1012
|
-
spec "[!
|
1013
|
-
|
1014
|
-
|
1015
|
-
@action.("hidden test")
|
1016
|
-
@option.(:trace, "-T", "enable tracing", hidden: true)
|
1017
|
-
def hidden1(trace: false)
|
1018
|
-
end
|
845
|
+
spec "[!i010e] skips backtrace in `benry/cmdapp.rb`." do |err|
|
846
|
+
sout, serr = capture_sio() do
|
847
|
+
@app.instance_eval { print_backtrace(err) }
|
1019
848
|
end
|
1020
|
-
|
1021
|
-
ok {
|
1022
|
-
ok {
|
1023
|
-
ok {_run_app("-h")} !~ /^ hidden1 +: hidden test$/
|
1024
|
-
#
|
1025
|
-
ok {_run_app("-ha", "hidden1")} =~ /^ -T +: enable tracing$/
|
1026
|
-
ok {_run_app("-h", "--all", "hidden1")} =~ /^ -T +: enable tracing$/
|
1027
|
-
ok {_run_app("--help", "hidden1")} !~ /^ -T +: enable tracing$/
|
849
|
+
ok {sout} == ""
|
850
|
+
ok {serr} !~ /benry\/cmdapp\.rb/
|
851
|
+
ok {serr} =~ /app_test\.rb/
|
1028
852
|
end
|
1029
853
|
|
1030
|
-
spec "[!
|
1031
|
-
|
1032
|
-
|
1033
|
-
def app.help_message(all)
|
1034
|
-
@_all_ = all
|
1035
|
-
super
|
854
|
+
spec "[!ilaxg] skips backtrace if `#skip_backtrace?()` returns truthy value." do |err|
|
855
|
+
sout1, serr1 = capture_sio() do
|
856
|
+
@app.instance_eval { print_backtrace(err) }
|
1036
857
|
end
|
1037
|
-
|
1038
|
-
ok {app.instance_variable_get('@_all_')} != nil
|
1039
|
-
ok {app.instance_variable_get('@_all_')} == false
|
858
|
+
ok {serr1} =~ /app_test\.rb/
|
1040
859
|
#
|
1041
|
-
|
1042
|
-
|
1043
|
-
|
860
|
+
r = recorder()
|
861
|
+
r.fake_method(@app, :'skip_backtrace?' => true)
|
862
|
+
sout2, serr2 = capture_sio() do
|
863
|
+
@app.instance_eval { print_backtrace(err) }
|
864
|
+
end
|
865
|
+
ok {serr2} == ""
|
1044
866
|
end
|
1045
867
|
|
1046
|
-
spec "[!
|
1047
|
-
sout, serr = capture_sio(tty: true)
|
1048
|
-
|
1049
|
-
|
1050
|
-
|
1051
|
-
|
1052
|
-
END
|
1053
|
-
ok {sout}.include?(<<"END")
|
1054
|
-
\e[34mOptions:\e[0m
|
1055
|
-
\e[1m-h, --help \e[0m : print help message
|
1056
|
-
\e[1m-V, --version \e[0m : print version
|
1057
|
-
END
|
1058
|
-
ok {sout}.include?(<<"END")
|
1059
|
-
\e[34mActions:\e[0m
|
1060
|
-
END
|
868
|
+
spec "[!5sa5k] prints filename and line number in slant format if stdout is a tty." do |err|
|
869
|
+
sout, serr = capture_sio(tty: true) do
|
870
|
+
@app.instance_eval { print_backtrace(err) }
|
871
|
+
end
|
872
|
+
ok {sout} == ""
|
873
|
+
ok {serr} =~ /\A \e\[3mFrom test\/app_test\.rb:\d+:in `\/'\e\[0m/
|
1061
874
|
end
|
1062
875
|
|
1063
|
-
spec "[!
|
1064
|
-
|
1065
|
-
|
1066
|
-
|
1067
|
-
|
1068
|
-
|
1069
|
-
|
1070
|
-
|
1071
|
-
|
1072
|
-
|
1073
|
-
|
1074
|
-
|
1075
|
-
|
1076
|
-
|
876
|
+
spec "[!2sg9r] not to try to read file content if file not found." do |err|
|
877
|
+
newbt = [
|
878
|
+
"#{__FILE__}:#{__LINE__}:in `foo`",
|
879
|
+
"-e:#{__LINE__}:in `bar`",
|
880
|
+
"#{__FILE__}:#{__LINE__}:in `baz`",
|
881
|
+
]
|
882
|
+
n = __LINE__ - 4 # base lineno
|
883
|
+
err.set_backtrace(newbt)
|
884
|
+
sout, serr = capture_sio(tty: true) do
|
885
|
+
@app.instance_eval { print_backtrace(err) }
|
886
|
+
end
|
887
|
+
ok {sout} == ""
|
888
|
+
ok {serr} == <<"END"
|
889
|
+
\e[3mFrom test/app_test.rb:#{n+0}:in `foo`\e[0m
|
890
|
+
"\#{__FILE__}:\#{__LINE__}:in `foo`",
|
891
|
+
\e[3mFrom -e:#{n+1}:in `bar`\e[0m
|
892
|
+
\e[3mFrom test/app_test.rb:#{n+2}:in `baz`\e[0m
|
893
|
+
"\#{__FILE__}:\#{__LINE__}:in `baz`",
|
1077
894
|
END
|
1078
895
|
end
|
1079
896
|
|
1080
|
-
spec "[!
|
1081
|
-
|
1082
|
-
|
1083
|
-
bkup = $COLOR_MODE
|
1084
|
-
begin
|
1085
|
-
sout, serr = capture_sio(tty: false) { app.run("-h", "--color") }
|
1086
|
-
ok {serr} == ""
|
1087
|
-
ok {sout}.include?(<<"END")
|
1088
|
-
\e[34mUsage:\e[0m
|
1089
|
-
$ \e[1mtestapp\e[0m [<options>] [<action> [<arguments>...]]
|
1090
|
-
END
|
1091
|
-
ok {sout}.include?(<<"END")
|
1092
|
-
\e[34mOptions:\e[0m
|
1093
|
-
\e[1m-h, --help \e[0m : print help message
|
1094
|
-
\e[1m-V, --version \e[0m : print version
|
1095
|
-
END
|
1096
|
-
ok {sout}.include?(<<"END")
|
1097
|
-
\e[34mActions:\e[0m
|
1098
|
-
END
|
1099
|
-
ensure
|
1100
|
-
$COLOR_MODE = bkup
|
897
|
+
spec "[!ihizf] prints lines of each backtrace entry." do |err|
|
898
|
+
sout, serr = capture_sio(tty: true) do
|
899
|
+
@app.instance_eval { print_backtrace(err) }
|
1101
900
|
end
|
901
|
+
ok {sout} == ""
|
902
|
+
ok {serr} =~ /^ 1\/0\n/
|
1102
903
|
end
|
1103
904
|
|
1104
|
-
spec "[!
|
1105
|
-
|
1106
|
-
|
1107
|
-
bkup = $COLOR_MODE
|
1108
|
-
begin
|
1109
|
-
sout, serr = capture_sio(tty: true) { app.run("-h", "--color=off") }
|
1110
|
-
ok {serr} == ""
|
1111
|
-
ok {sout}.include?(<<"END")
|
1112
|
-
Usage:
|
1113
|
-
$ testapp [<options>] [<action> [<arguments>...]]
|
1114
|
-
END
|
1115
|
-
ok {sout}.include?(<<"END")
|
1116
|
-
Options:
|
1117
|
-
-h, --help : print help message
|
1118
|
-
-V, --version : print version
|
1119
|
-
END
|
1120
|
-
ok {sout}.include?(<<"END")
|
1121
|
-
Actions:
|
1122
|
-
END
|
1123
|
-
ensure
|
1124
|
-
$COLOR_MODE = bkup
|
905
|
+
spec "[!8wzxg] prints backtrace of exception." do |err|
|
906
|
+
sout, serr = capture_sio() do
|
907
|
+
@app.instance_eval { print_backtrace(err) }
|
1125
908
|
end
|
909
|
+
ok {sout} == ""
|
910
|
+
ok {serr} =~ /\A From test\/app_test\.rb:\d+:in `\/'\n 1\/0\n/
|
1126
911
|
end
|
1127
912
|
|
1128
913
|
end
|
1129
914
|
|
1130
915
|
|
1131
|
-
topic '#
|
916
|
+
topic '#skip_backtrace?()' do
|
1132
917
|
|
1133
|
-
spec "[!
|
1134
|
-
|
1135
|
-
|
1136
|
-
|
1137
|
-
|
918
|
+
spec "[!r2fmv] ignores backtraces if matched to 'config.backtrace_ignore_rexp'." do
|
919
|
+
@config.backtrace_ignore_rexp = /\/foobar\.rb/
|
920
|
+
bt1 = "/home/yourname/foobar.rb:123:"
|
921
|
+
bt2 = "/home/yourname/blabla.rb:123:"
|
922
|
+
_ = self
|
923
|
+
@app.instance_eval do
|
924
|
+
_.ok {skip_backtrace?(bt1)} == 14
|
925
|
+
_.ok {skip_backtrace?(bt2)} == nil
|
1138
926
|
end
|
1139
|
-
|
1140
|
-
begin
|
1141
|
-
[["-h"], []].each do |args|
|
1142
|
-
sout, serr = capture_sio { @app.run(*args) }
|
1143
|
-
ok {serr} == <<'END'
|
927
|
+
end
|
1144
928
|
|
1145
|
-
|
1146
|
-
|
1147
|
-
|
1148
|
-
|
1149
|
-
|
929
|
+
spec "[!c6f11] not ignore backtraces if 'config.backtrace_ignore_rexp' is not set." do
|
930
|
+
@config.backtrace_ignore_rexp = nil
|
931
|
+
bt1 = "/home/yourname/foobar.rb:123:"
|
932
|
+
bt2 = "/home/yourname/blabla.rb:123:"
|
933
|
+
_ = self
|
934
|
+
@app.instance_eval do
|
935
|
+
_.ok {skip_backtrace?(bt1)} == false
|
936
|
+
_.ok {skip_backtrace?(bt2)} == false
|
1150
937
|
end
|
1151
938
|
end
|
1152
939
|
|
1153
|
-
|
1154
|
-
class ValidateActionTest2 < Benry::CmdApp::ActionScope
|
1155
|
-
prefix "validate2", alias_of: :test2
|
1156
|
-
@action.("test")
|
1157
|
-
def test(); end
|
1158
|
-
end
|
1159
|
-
begin
|
1160
|
-
sout, serr = capture_sio { @app.__send__(:do_validate_actions, [], {}) }
|
1161
|
-
ok {serr} == <<'END'
|
940
|
+
end
|
1162
941
|
|
1163
|
-
** [warning] in 'ValidateActionTest2' class, `alias_of: :test2` specified but corresponding action not exist.
|
1164
|
-
END
|
1165
|
-
ensure
|
1166
|
-
ValidateActionTest2.class_eval { @__aliasof__ = nil }
|
1167
|
-
end
|
1168
|
-
end
|
1169
942
|
|
1170
|
-
|
1171
|
-
class ValidateActionTest3 < Benry::CmdApp::ActionScope
|
1172
|
-
prefix "validate3", action: :test3
|
1173
|
-
@action.("test")
|
1174
|
-
def test(); end
|
1175
|
-
end
|
1176
|
-
begin
|
1177
|
-
sout, serr = capture_sio { @app.__send__(:do_validate_actions, [], {}) }
|
1178
|
-
ok {serr} == <<'END'
|
943
|
+
topic '#read_file_as_lines()' do
|
1179
944
|
|
1180
|
-
|
1181
|
-
|
1182
|
-
|
1183
|
-
|
1184
|
-
end
|
945
|
+
spec "[!e9c74] reads file content as an array of line." do
|
946
|
+
lines = @app.instance_eval { read_file_as_lines(__FILE__) }
|
947
|
+
ok {lines}.is_a?(Array)
|
948
|
+
ok {lines[__LINE__ - 2]} == " ok {lines}.is_a?(Array)\n"
|
1185
949
|
end
|
1186
950
|
|
1187
951
|
end
|
1188
952
|
|
1189
953
|
|
1190
|
-
topic '#
|
954
|
+
topic '#should_rescue?()' do
|
1191
955
|
|
1192
|
-
spec "[!
|
1193
|
-
|
1194
|
-
|
1195
|
-
|
1196
|
-
|
1197
|
-
@action.("test2")
|
1198
|
-
def ccc(); end
|
1199
|
-
@action.("test3")
|
1200
|
-
def eee(); end
|
1201
|
-
end
|
1202
|
-
sout, serr = capture_sio do
|
1203
|
-
@app.__send__(:do_print_candidates, ["candi:date2:"], {})
|
1204
|
-
end
|
1205
|
-
ok {serr} == ""
|
1206
|
-
ok {sout} == <<"END"
|
1207
|
-
Actions:
|
1208
|
-
candi:date2 : test3
|
1209
|
-
candi:date2:ccc : test2
|
1210
|
-
candi:date2:ddd : test1
|
1211
|
-
END
|
956
|
+
spec "[!8lwyn] returns trueif exception is a BaseError." do
|
957
|
+
x = @app.__send__(:should_rescue?, Benry::CmdApp::DefinitionError.new)
|
958
|
+
ok {x} == true
|
959
|
+
x = @app.__send__(:should_rescue?, RuntimeError.new)
|
960
|
+
ok {x} == false
|
1212
961
|
end
|
1213
962
|
|
1214
|
-
|
1215
|
-
class CandidateTest3 < Benry::CmdApp::ActionScope
|
1216
|
-
prefix "candi:date3", action: :ggg
|
1217
|
-
@action.("test1")
|
1218
|
-
def hhh(); end
|
1219
|
-
@action.("test2")
|
1220
|
-
def fff(); end
|
1221
|
-
@action.("test3")
|
1222
|
-
def ggg(); end
|
1223
|
-
end
|
1224
|
-
Benry::CmdApp.action_alias("pupu", "candi:date3:fff")
|
1225
|
-
Benry::CmdApp.action_alias("popo", "candi:date3:fff")
|
1226
|
-
Benry::CmdApp.action_alias("candi:date3:xxx", "candi:date3:hhh")
|
1227
|
-
sout, serr = capture_sio do
|
1228
|
-
@app.__send__(:do_print_candidates, ["candi:date3:"], {})
|
1229
|
-
end
|
1230
|
-
ok {serr} == ""
|
1231
|
-
ok {sout} == <<"END"
|
1232
|
-
Actions:
|
1233
|
-
candi:date3 : test3
|
1234
|
-
candi:date3:fff : test2
|
1235
|
-
(alias: pupu, popo)
|
1236
|
-
candi:date3:hhh : test1
|
1237
|
-
(alias: candi:date3:xxx)
|
1238
|
-
candi:date3:xxx : alias of 'candi:date3:hhh' action
|
1239
|
-
END
|
1240
|
-
end
|
963
|
+
end
|
1241
964
|
|
1242
|
-
spec "[!i2azi] raises error when no candidate actions found." do
|
1243
|
-
pr = proc do
|
1244
|
-
@app.__send__(:do_print_candidates, ["candi:date9:"], {})
|
1245
|
-
end
|
1246
|
-
ok {pr}.raise?(Benry::CmdApp::CommandError,
|
1247
|
-
"No actions starting with 'candi:date9:'.")
|
1248
|
-
end
|
1249
|
-
|
1250
|
-
spec "[!k3lw0] private (hidden) action should not be printed as candidates." do
|
1251
|
-
class CandidateTest4 < Benry::CmdApp::ActionScope
|
1252
|
-
prefix "candi:date4"
|
1253
|
-
@action.("test1")
|
1254
|
-
def kkk(); end
|
1255
|
-
private
|
1256
|
-
@action.("test2")
|
1257
|
-
def iii(); end
|
1258
|
-
public
|
1259
|
-
@action.("test3")
|
1260
|
-
def jjj(); end
|
1261
|
-
end
|
1262
|
-
sout, serr = capture_sio do
|
1263
|
-
@app.__send__(:do_print_candidates, ["candi:date4:"], {})
|
1264
|
-
end
|
1265
|
-
ok {serr} == ""
|
1266
|
-
ok {sout} == <<"END"
|
1267
|
-
Actions:
|
1268
|
-
candi:date4:jjj : test3
|
1269
|
-
candi:date4:kkk : test1
|
1270
|
-
END
|
1271
|
-
end
|
1272
965
|
|
1273
|
-
|
1274
|
-
|
1275
|
-
|
1276
|
-
|
1277
|
-
|
1278
|
-
|
1279
|
-
|
1280
|
-
|
1281
|
-
|
1282
|
-
|
1283
|
-
|
1284
|
-
|
1285
|
-
|
1286
|
-
|
1287
|
-
|
1288
|
-
|
1289
|
-
|
1290
|
-
|
1291
|
-
|
966
|
+
end
|
967
|
+
|
968
|
+
|
969
|
+
topic Benry::CmdApp::GlobalOptionSchema do
|
970
|
+
|
971
|
+
def new_schema(config)
|
972
|
+
return Benry::CmdApp::GlobalOptionSchema.new(config)
|
973
|
+
end
|
974
|
+
|
975
|
+
|
976
|
+
topic '#initialize()' do
|
977
|
+
|
978
|
+
spec "[!ppcvp] adds options according to config object." do
|
979
|
+
config = Benry::CmdApp::Config.new("sample app", "1.2.3")
|
980
|
+
schema = new_schema(config)
|
981
|
+
ok {schema.get(:help)} != nil
|
982
|
+
ok {schema.get(:version)} != nil
|
983
|
+
ok {schema.get(:list)} != nil
|
984
|
+
ok {schema.get(:all)} != nil
|
985
|
+
ok {schema.get(:verbose)} == nil
|
986
|
+
ok {schema.get(:quiet)} == nil
|
987
|
+
ok {schema.get(:color)} == nil
|
988
|
+
ok {schema.get(:debug)} != nil
|
989
|
+
ok {schema.get(:debug)}.hidden?
|
990
|
+
ok {schema.to_s} == <<"END"
|
991
|
+
-h, --help : print help message (of action if specified)
|
992
|
+
-V, --version : print version
|
993
|
+
-l, --list : list actions and aliases
|
994
|
+
-a, --all : list hidden actions/options, too
|
995
|
+
END
|
996
|
+
ok {schema.get(:trace)} == nil
|
997
|
+
#
|
998
|
+
config.option_help = false
|
999
|
+
config.option_version = false
|
1000
|
+
config.option_list = false
|
1001
|
+
config.option_all = false
|
1002
|
+
config.option_verbose = true
|
1003
|
+
config.option_quiet = true
|
1004
|
+
config.option_color = true
|
1005
|
+
config.option_debug = true
|
1006
|
+
config.option_trace = true
|
1007
|
+
#
|
1008
|
+
schema = new_schema(config)
|
1009
|
+
ok {schema.get(:help)} == nil
|
1010
|
+
ok {schema.get(:version)} == nil
|
1011
|
+
ok {schema.get(:list)} == nil
|
1012
|
+
ok {schema.get(:all)} == nil
|
1013
|
+
ok {schema.get(:verbose)} != nil
|
1014
|
+
ok {schema.get(:quiet)} != nil
|
1015
|
+
ok {schema.get(:color)} != nil
|
1016
|
+
ok {schema.get(:trace)} != nil
|
1017
|
+
ok {schema.get(:debug)}.NOT.hidden?
|
1018
|
+
end
|
1019
|
+
|
1020
|
+
spec "[!doj0k] if config option is `:hidden`, makes option as hidden." do
|
1021
|
+
config = Benry::CmdApp::Config.new("sample app", "1.2.3")
|
1022
|
+
config.option_help = :hidden
|
1023
|
+
config.option_version = :hidden
|
1024
|
+
config.option_list = :hidden
|
1025
|
+
config.option_topic = :hidden
|
1026
|
+
config.option_all = :hidden
|
1027
|
+
config.option_verbose = :hidden
|
1028
|
+
config.option_quiet = :hidden
|
1029
|
+
config.option_color = :hidden
|
1030
|
+
config.option_debug = :hidden
|
1031
|
+
config.option_trace = :hidden
|
1032
|
+
#
|
1033
|
+
schema = new_schema(config)
|
1034
|
+
ok {schema.get(:help ).hidden?} == true
|
1035
|
+
ok {schema.get(:version).hidden?} == true
|
1036
|
+
ok {schema.get(:list ).hidden?} == true
|
1037
|
+
ok {schema.get(:topic ).hidden?} == true
|
1038
|
+
ok {schema.get(:all ).hidden?} == true
|
1039
|
+
ok {schema.get(:verbose).hidden?} == true
|
1040
|
+
ok {schema.get(:quiet ).hidden?} == true
|
1041
|
+
ok {schema.get(:color ).hidden?} == true
|
1042
|
+
ok {schema.get(:debug ).hidden?} == true
|
1043
|
+
ok {schema.get(:trace ).hidden?} == true
|
1044
|
+
#
|
1045
|
+
ok {schema.option_help()} == ""
|
1046
|
+
ok {schema.option_help(all: true)} == <<'END'
|
1047
|
+
--help : print help message (of action if specified)
|
1048
|
+
--version : print version
|
1049
|
+
--list : list actions and aliases
|
1050
|
+
-L <topic> : topic list (actions|aliases|categories|abbrevs)
|
1051
|
+
--all : list hidden actions/options, too
|
1052
|
+
--verbose : verbose mode
|
1053
|
+
--quiet : quiet mode
|
1054
|
+
--color[=<on|off>] : color mode
|
1055
|
+
--debug : debug mode
|
1056
|
+
--trace : trace mode
|
1292
1057
|
END
|
1293
1058
|
end
|
1294
1059
|
|
1295
|
-
spec "[!
|
1296
|
-
|
1297
|
-
|
1298
|
-
@action.("test1")
|
1299
|
-
def t1(); end
|
1300
|
-
@action.("test2", important: false)
|
1301
|
-
def t2(); end
|
1302
|
-
end
|
1303
|
-
Benry::CmdApp.action_alias("candi:date7", "candi:date7:t2")
|
1304
|
-
sout, serr = capture_sio(tty: true) do
|
1305
|
-
@app.__send__(:do_print_candidates, ["candi:date7:"], {})
|
1306
|
-
end
|
1307
|
-
ok {serr} == ""
|
1308
|
-
ok {sout} == <<END
|
1309
|
-
\e[34mActions:\e[0m
|
1310
|
-
\e[1m\e[2mcandi:date7\e[0m \e[0m : alias of 'candi:date7:t2' action
|
1311
|
-
\e[1mcandi:date7:t1 \e[0m : test1
|
1312
|
-
\e[1m\e[2mcandi:date7:t2\e[0m \e[0m : test2
|
1313
|
-
(alias: candi:date7)
|
1314
|
-
END
|
1060
|
+
spec "[!umjw5] add nothing if config is nil." do
|
1061
|
+
schema = new_schema(nil)
|
1062
|
+
ok {schema}.empty?
|
1315
1063
|
end
|
1316
1064
|
|
1317
1065
|
end
|
1318
1066
|
|
1319
1067
|
|
1320
|
-
topic '#
|
1321
|
-
|
1322
|
-
spec "[!pkio4] sets config object to '$cmdapp_config'." do
|
1323
|
-
$cmdapp_config = nil
|
1324
|
-
@app.__send__(:do_setup,)
|
1325
|
-
ok {$cmdapp_config} != nil
|
1326
|
-
ok {$cmdapp_config} == @app.config
|
1327
|
-
end
|
1068
|
+
topic '#reorder_options(*keys)' do
|
1328
1069
|
|
1329
|
-
spec "[!
|
1330
|
-
|
1331
|
-
|
1332
|
-
ok {
|
1333
|
-
|
1070
|
+
spec "[!2cp9s] sorts options in order of keys specified." do
|
1071
|
+
config = Benry::CmdApp::Config.new("sample app", "1.2.3", option_debug: true)
|
1072
|
+
schema = new_schema(config)
|
1073
|
+
ok {schema.to_s} == <<'END'
|
1074
|
+
-h, --help : print help message (of action if specified)
|
1075
|
+
-V, --version : print version
|
1076
|
+
-l, --list : list actions and aliases
|
1077
|
+
-a, --all : list hidden actions/options, too
|
1078
|
+
--debug : debug mode
|
1079
|
+
END
|
1080
|
+
#
|
1081
|
+
schema.reorder_options(:list, :topic, :help, :all, :debug, :version)
|
1082
|
+
ok {schema.to_s} == <<'END'
|
1083
|
+
-l, --list : list actions and aliases
|
1084
|
+
-h, --help : print help message (of action if specified)
|
1085
|
+
-a, --all : list hidden actions/options, too
|
1086
|
+
--debug : debug mode
|
1087
|
+
-V, --version : print version
|
1088
|
+
END
|
1334
1089
|
end
|
1335
1090
|
|
1336
|
-
spec "[!
|
1337
|
-
|
1338
|
-
|
1339
|
-
|
1340
|
-
|
1341
|
-
|
1342
|
-
|
1343
|
-
|
1344
|
-
|
1345
|
-
|
1091
|
+
spec "[!xe7e1] moves options which are not included in specified keys to end of option list." do
|
1092
|
+
config = Benry::CmdApp::Config.new("sample app", "1.2.3", option_debug: true)
|
1093
|
+
schema = new_schema(config)
|
1094
|
+
schema.reorder_options(:list, :help)
|
1095
|
+
ok {schema.to_s} == <<'END'
|
1096
|
+
-l, --list : list actions and aliases
|
1097
|
+
-h, --help : print help message (of action if specified)
|
1098
|
+
-V, --version : print version
|
1099
|
+
-a, --all : list hidden actions/options, too
|
1100
|
+
--debug : debug mode
|
1101
|
+
END
|
1346
1102
|
end
|
1347
1103
|
|
1348
1104
|
end
|
1349
1105
|
|
1350
1106
|
|
1351
|
-
|
1107
|
+
end
|
1352
1108
|
|
1353
|
-
spec "[!zxeo7] clears '$cmdapp_config'." do
|
1354
|
-
$cmdapp_config = "AAA"
|
1355
|
-
@app.__send__(:do_teardown, nil)
|
1356
|
-
ok {$cmdapp_config} == nil
|
1357
|
-
end
|
1358
1109
|
|
1359
|
-
|
1360
|
-
|
1361
|
-
|
1362
|
-
|
1110
|
+
topic Benry::CmdApp::MetadataRenderer do
|
1111
|
+
|
1112
|
+
|
1113
|
+
topic '#render_metadata()' do
|
1114
|
+
|
1115
|
+
before do
|
1116
|
+
reg = Benry::CmdApp::REGISTRY
|
1117
|
+
@registry = Benry::CmdApp::Registry.new
|
1118
|
+
r = @registry
|
1119
|
+
r.metadata_add(reg.metadata_get("hello"))
|
1120
|
+
r.metadata_add(Benry::CmdApp::AliasMetadata.new("hi", "hello", []))
|
1121
|
+
r.category_add("cat:", "test category")
|
1122
|
+
r.abbrev_add("c:", "cat:")
|
1123
|
+
end
|
1124
|
+
|
1125
|
+
EXPECTED = <<'END'
|
1126
|
+
actions:
|
1127
|
+
- action: hello
|
1128
|
+
desc: "greeting message"
|
1129
|
+
class: MyAction
|
1130
|
+
method: hello
|
1131
|
+
hidden: false
|
1132
|
+
paramstr: "[<name>]"
|
1133
|
+
parameters:
|
1134
|
+
- param: name
|
1135
|
+
type: opt
|
1136
|
+
- param: lang
|
1137
|
+
type: key
|
1138
|
+
options:
|
1139
|
+
- key: lang
|
1140
|
+
desc: "language name (en/fr/it)"
|
1141
|
+
optdef: "-l, --lang=<lang>"
|
1142
|
+
short: l
|
1143
|
+
long: lang
|
1144
|
+
param: "<lang>"
|
1145
|
+
paramreq: required
|
1146
|
+
hidden: false
|
1147
|
+
|
1148
|
+
aliases:
|
1149
|
+
- alias: hi
|
1150
|
+
desc: "alias for 'hello'"
|
1151
|
+
action: hello
|
1152
|
+
|
1153
|
+
categories:
|
1154
|
+
- prefix: "cat:"
|
1155
|
+
count: 0
|
1156
|
+
desc: "test category"
|
1157
|
+
|
1158
|
+
abbreviations:
|
1159
|
+
- abbrev: "c:"
|
1160
|
+
prefix: "cat:"
|
1161
|
+
END
|
1162
|
+
|
1163
|
+
spec "[!gduge] renders registry data in YAML format." do
|
1164
|
+
renderer = Benry::CmdApp::MetadataRenderer.new(@registry)
|
1165
|
+
yaml = renderer.render_metadata()
|
1166
|
+
ok {yaml} == EXPECTED
|
1363
1167
|
end
|
1364
1168
|
|
1365
1169
|
end
|