benry-cmdapp 0.2.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGES.md +12 -0
- data/README.md +1736 -862
- data/benry-cmdapp.gemspec +3 -3
- data/doc/benry-cmdapp.html +1620 -916
- data/doc/css/style.css +2 -2
- 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 +1219 -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/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Benry-CmdApp
|
2
2
|
|
3
|
-
($Release:
|
3
|
+
($Release: 1.1.0 $)
|
4
4
|
|
5
5
|
|
6
6
|
## What's This?
|
@@ -9,17 +9,17 @@ Benry-CmdApp is a framework to create command-line application.
|
|
9
9
|
If you want create command-line application which takes sub-commands
|
10
10
|
like `git`, `docker`, or `npm`, Benry-CmdApp is the solution.
|
11
11
|
|
12
|
-
|
12
|
+
Basic idea:
|
13
13
|
|
14
|
-
*
|
14
|
+
* Action (= sub-command) is defined as a method in Ruby.
|
15
15
|
* Commnad-line arguments are passed to action method as positional arguments.
|
16
16
|
* Command-line options are passed to action method as keyword arguments.
|
17
17
|
|
18
18
|
For example:
|
19
19
|
|
20
|
-
* `<command>
|
21
|
-
* `<command>
|
22
|
-
* `<command>
|
20
|
+
* `<command> hello` in command-line invokes action method `hello()` in Ruby.
|
21
|
+
* `<command> hello arg1 arg2` invokes `hello("arg1", "arg2")`.
|
22
|
+
* `<command> hello arg --opt=val` invokes `hello("arg", opt: "val")`.
|
23
23
|
|
24
24
|
Links:
|
25
25
|
|
@@ -36,7 +36,7 @@ Benry-CmdApp requires Ruby >= 2.3.
|
|
36
36
|
|
37
37
|
* [What's This?](#whats-this)
|
38
38
|
* [Install](#install)
|
39
|
-
* [Usage](#usage)
|
39
|
+
* [Basic Usage](#basic-usage)
|
40
40
|
* [Action](#action)
|
41
41
|
* [Method Name and Action Name](#method-name-and-action-name)
|
42
42
|
* [Parameter Name in Help Message of Action](#parameter-name-in-help-message-of-action)
|
@@ -45,34 +45,48 @@ Benry-CmdApp requires Ruby >= 2.3.
|
|
45
45
|
* [Option Value Validation](#option-value-validation)
|
46
46
|
* [Callback for Option Value](#callback-for-option-value)
|
47
47
|
* [Boolean (On/Off) Option](#boolean-onoff-option)
|
48
|
-
* [
|
48
|
+
* [Option Set](#option-set)
|
49
|
+
* [Copy Options](#copy-options)
|
50
|
+
* [Option Error and Action Error](#option-error-and-action-error)
|
51
|
+
* [Advanced Feature](#advanced-feature)
|
52
|
+
* [Category of Action](#category-of-action)
|
53
|
+
* [Nested Category](#nested-category)
|
54
|
+
* [Category Action or Alias](#category-action-or-alias)
|
49
55
|
* [Invoke Other Action](#invoke-other-action)
|
50
|
-
* [
|
56
|
+
* [Cleaning Up Block](#cleaning-up-block)
|
57
|
+
* [Alias for Action](#alias-for-action)
|
58
|
+
* [Abbreviation of Category](#abbreviation-of-category)
|
51
59
|
* [Default Action](#default-action)
|
52
|
-
* [
|
53
|
-
* [
|
54
|
-
* [
|
60
|
+
* [Action List and Category List](#action-list-and-category-list)
|
61
|
+
* [Hidden Action](#hidden-action)
|
62
|
+
* [Hidden Option](#hidden-option)
|
63
|
+
* [Important Actions or Options](#important-actions-or-options)
|
64
|
+
* [Multiple Option](#multiple-option)
|
55
65
|
* [Configuratoin and Customization](#configuratoin-and-customization)
|
56
66
|
* [Application Configuration](#application-configuration)
|
57
67
|
* [Customization of Global Options](#customization-of-global-options)
|
58
68
|
* [Customization of Global Option Behaviour](#customization-of-global-option-behaviour)
|
59
69
|
* [Custom Hook of Application](#custom-hook-of-application)
|
60
|
-
* [Customization of
|
70
|
+
* [Customization of Application Help Message](#customization-of-application-help-message)
|
61
71
|
* [Customization of Action Help Message](#customization-of-action-help-message)
|
72
|
+
* [Customization of Section Title in Help Message](#customization-of-section-title-in-help-message)
|
62
73
|
* [Q & A](#q--a)
|
63
|
-
* [Q: How to
|
64
|
-
* [Q: How to
|
65
|
-
* [Q: How to
|
66
|
-
* [Q: How to
|
67
|
-
* [Q: How to
|
68
|
-
* [Q: How to
|
69
|
-
* [Q: How to
|
70
|
-
* [Q: How to
|
71
|
-
* [Q:
|
72
|
-
* [Q: How to
|
73
|
-
* [Q:
|
74
|
-
* [Q:
|
75
|
-
* [Q: How to
|
74
|
+
* [Q: How to show all backtraces of exception?](#q-how-to-show-all-backtraces-of-exception)
|
75
|
+
* [Q: How to specify description to arguments of actions?](#q-how-to-specify-description-to-arguments-of-actions)
|
76
|
+
* [Q: How to append some tasks to an existing action?](#q-how-to-append-some-tasks-to-an-existing-action)
|
77
|
+
* [Q: How to delete an existing action/alias?](#q-how-to-delete-an-existing-actionalias)
|
78
|
+
* [Q: How to re-define an existing action?](#q-how-to-re-define-an-existing-action)
|
79
|
+
* [Q: How to show entering into or exitting from actions?](#q-how-to-show-entering-into-or-exitting-from-actions)
|
80
|
+
* [Q: How to enable/disable color mode?](#q-how-to-enabledisable-color-mode)
|
81
|
+
* [Q: How to define `-vvv` style option?](#q-how-to-define--vvv-style-option)
|
82
|
+
* [Q: How to show global option `-L <topic>` in help message?](#q-how-to-show-global-option--l-topic-in-help-message)
|
83
|
+
* [Q: How to specify detailed description of options?](#q-how-to-specify-detailed-description-of-options)
|
84
|
+
* [Q: How to list only aliases (or actions) excluding actions (or aliases) ?](#q-how-to-list-only-aliases-or-actions-excluding-actions-or-aliases-)
|
85
|
+
* [Q: How to change the order of options in help message?](#q-how-to-change-the-order-of-options-in-help-message)
|
86
|
+
* [Q: How to add metadata to actions or options?](#q-how-to-add-metadata-to-actions-or-options)
|
87
|
+
* [Q: How to remove common help option from all actions?](#q-how-to-remove-common-help-option-from-all-actions)
|
88
|
+
* [Q: Is it possible to show details of actions and aliases?](#q-is-it-possible-to-show-details-of-actions-and-aliases)
|
89
|
+
* [Q: How to make error messages I18Ned?](#q-how-to-make-error-messages-i18ned)
|
76
90
|
* [License and Copyright](#license-and-copyright)
|
77
91
|
|
78
92
|
<!-- /TOC -->
|
@@ -87,40 +101,49 @@ $ gem install benry-cmdapp
|
|
87
101
|
|
88
102
|
|
89
103
|
|
90
|
-
## Usage
|
104
|
+
## Basic Usage
|
91
105
|
|
92
106
|
|
93
107
|
### Action
|
94
108
|
|
95
|
-
|
109
|
+
How to define actions:
|
110
|
+
|
111
|
+
* (1) Inherit action class.
|
112
|
+
* (2) Define action methods with `@action.()`.
|
113
|
+
* (3) Create an application object and run it.
|
114
|
+
|
115
|
+
Note:
|
116
|
+
|
117
|
+
* Use `@action.()`, not `@action()`.
|
118
|
+
* Command-line arguments are passed to action method as positional arguments.
|
96
119
|
* An action class can have several action methods.
|
97
120
|
* It is ok to define multiple action classes.
|
98
|
-
* Command-line arguments are passed to action method as positional arguments.
|
99
121
|
|
100
122
|
File: ex01.rb
|
101
123
|
|
102
124
|
```ruby
|
103
|
-
|
125
|
+
# coding: utf-8
|
104
126
|
require 'benry/cmdapp'
|
105
127
|
|
106
|
-
## action
|
128
|
+
## (1) Inherit action class.
|
107
129
|
class MyAction < Benry::CmdApp::Action # !!!!
|
108
130
|
|
131
|
+
## (2) Define action methods with `@action.()`.
|
109
132
|
@action.("print greeting message") # !!!!
|
110
|
-
def hello(
|
111
|
-
puts "Hello, #{
|
133
|
+
def hello(name="world") # !!!!
|
134
|
+
puts "Hello, #{name}!"
|
112
135
|
end
|
113
136
|
|
114
137
|
end
|
115
138
|
|
116
|
-
##
|
117
|
-
|
118
|
-
config.default_help = true
|
119
|
-
|
120
|
-
## run application
|
121
|
-
app = Benry::CmdApp::Application.new(config)
|
122
|
-
status_code = app.main()
|
139
|
+
## (3) Create an application object and run it.
|
140
|
+
status_code = Benry::CmdApp.main("sample app", "1.0.0")
|
123
141
|
exit status_code
|
142
|
+
## or:
|
143
|
+
#config = Benry::CmdApp::Config.new("sample app", "1.0.0")
|
144
|
+
#app = Benry::CmdApp::Application.new(config)
|
145
|
+
#status_code = app.main()
|
146
|
+
#exit status_code
|
124
147
|
```
|
125
148
|
|
126
149
|
Output:
|
@@ -137,32 +160,48 @@ Help message of command:
|
|
137
160
|
|
138
161
|
```console
|
139
162
|
[bash]$ ruby ex01.rb -h # or `--help`
|
140
|
-
ex01.rb (1.0.0)
|
163
|
+
ex01.rb (1.0.0) --- sample app
|
141
164
|
|
142
165
|
Usage:
|
143
|
-
$ ex01.rb [<options>]
|
166
|
+
$ ex01.rb [<options>] <action> [<arguments>...]
|
144
167
|
|
145
168
|
Options:
|
146
|
-
-h, --help : print help message (of action if
|
169
|
+
-h, --help : print help message (of action if specified)
|
147
170
|
-V, --version : print version
|
171
|
+
-l, --list : list actions and aliases
|
172
|
+
-a, --all : list hidden actions/options, too
|
148
173
|
|
149
174
|
Actions:
|
150
175
|
hello : print greeting message
|
176
|
+
help : print help message (of action if specified)
|
151
177
|
```
|
152
178
|
|
153
179
|
Help message of action:
|
154
180
|
|
155
181
|
```console
|
156
|
-
[bash]$ ruby ex01.rb -h hello
|
157
|
-
ex01.rb hello
|
182
|
+
[bash]$ ruby ex01.rb -h hello # or: ruby ex01.rb --help hello
|
183
|
+
ex01.rb hello --- print greeting message
|
184
|
+
|
185
|
+
Usage:
|
186
|
+
$ ex01.rb hello [<name>]
|
187
|
+
```
|
188
|
+
|
189
|
+
* Benry-CmdApp adds `-h` and `--help` options to each action automatically.
|
190
|
+
Output of `ruby ex01.rb hello -h` and `ruby ex01.rb -h hello` will be the same.
|
191
|
+
|
192
|
+
```console
|
193
|
+
[bash]$ ruby ex01.rb hello -h # or: ruby ex01.rb helo --help
|
194
|
+
ex01.rb hello --- print greeting message
|
158
195
|
|
159
196
|
Usage:
|
160
|
-
$ ex01.rb hello [<
|
197
|
+
$ ex01.rb hello [<name>]
|
161
198
|
```
|
162
199
|
|
163
200
|
|
164
201
|
### Method Name and Action Name
|
165
202
|
|
203
|
+
Rules between method name and action name:
|
204
|
+
|
166
205
|
* Method name `print_` results in action name `print`.
|
167
206
|
This is useful to define actions which name is same as Ruby keyword or popular functions.
|
168
207
|
* Method name `foo_bar_baz` results in action name `foo-bar-baz`.
|
@@ -171,7 +210,7 @@ Usage:
|
|
171
210
|
File: ex02.rb
|
172
211
|
|
173
212
|
```ruby
|
174
|
-
|
213
|
+
# coding: utf-8
|
175
214
|
require 'benry/cmdapp'
|
176
215
|
|
177
216
|
class SampleAction < Benry::CmdApp::Action
|
@@ -196,26 +235,33 @@ class SampleAction < Benry::CmdApp::Action
|
|
196
235
|
|
197
236
|
end
|
198
237
|
|
199
|
-
|
200
|
-
|
201
|
-
|
238
|
+
status_code = Benry::CmdApp.main("test app")
|
239
|
+
exit status_code
|
240
|
+
## or:
|
241
|
+
#config = Benry::CmdApp::Config.new("test app")
|
242
|
+
#app = Benry::CmdApp::Application.new(config)
|
243
|
+
#status_code = app.main()
|
244
|
+
#exit status_code
|
202
245
|
```
|
203
246
|
|
204
247
|
Help message:
|
205
248
|
|
206
249
|
```console
|
207
250
|
[bash]$ ruby ex02.rb --help
|
208
|
-
ex02.rb
|
251
|
+
ex02.rb --- test app
|
209
252
|
|
210
253
|
Usage:
|
211
|
-
$ ex02.rb [<options>]
|
254
|
+
$ ex02.rb [<options>] <action> [<arguments>...]
|
212
255
|
|
213
256
|
Options:
|
214
|
-
-h, --help : print help message (of action if
|
257
|
+
-h, --help : print help message (of action if specified)
|
258
|
+
-l, --list : list actions and aliases
|
259
|
+
-a, --all : list hidden actions/options, too
|
215
260
|
|
216
261
|
Actions:
|
217
262
|
foo-bar-baz : sample #2
|
218
263
|
foo:bar:baz : sample #3
|
264
|
+
help : print help message (of action if specified)
|
219
265
|
print : sample #1
|
220
266
|
```
|
221
267
|
|
@@ -235,62 +281,85 @@ foo__bar__baz
|
|
235
281
|
|
236
282
|
### Parameter Name in Help Message of Action
|
237
283
|
|
238
|
-
In help message of action, positional parameters of action methods are printed under the name conversion rule.
|
284
|
+
In help message of an action, positional parameters of action methods are printed under the name conversion rule.
|
239
285
|
|
240
286
|
* Parameter `foo` is printed as `<foo>`.
|
241
287
|
* Parameter `foo_bar_baz` is printed as `<foo-bar-baz>`.
|
242
288
|
* Parameter `foo_or_bar_or_baz` is printed as `<foo|bar|baz>`.
|
289
|
+
* Parameter `foobar__xxx` is printed as `<foobar.xxx>`.
|
243
290
|
|
244
291
|
In addition, positional parameters are printed in different way according to its kind.
|
245
292
|
|
246
293
|
* If parameter `foo` is required (= doesn't have default value), it will be printed as `<foo>`.
|
247
294
|
* If parameter `foo` is optional (= has default value), it will be printed as `[<foo>]`.
|
248
295
|
* If parameter `foo` is variable length (= `*foo` style), it will be printed as `[<foo>...]`.
|
296
|
+
* If parameter `foo` is required or optional and `foo_` is variable length, it will be printed as `<foo>...`.
|
249
297
|
|
250
298
|
|
251
299
|
File: ex03.rb
|
252
300
|
|
253
301
|
```ruby
|
254
|
-
|
302
|
+
# coding: utf-8
|
255
303
|
require 'benry/cmdapp'
|
256
304
|
|
257
305
|
class SampleAction < Benry::CmdApp::Action
|
258
306
|
|
259
|
-
@action.("
|
260
|
-
def test1(
|
307
|
+
@action.("name conversion test")
|
308
|
+
def test1(file_name, file_or_dir, file__html) # !!!!
|
309
|
+
# ...
|
310
|
+
end
|
311
|
+
|
312
|
+
@action.("parameter kind test")
|
313
|
+
def test2(aaa, bbb, ccc=nil, ddd=nil, *eee) # !!!!
|
314
|
+
# ...
|
315
|
+
end
|
316
|
+
|
317
|
+
@action.("parameter combination test")
|
318
|
+
def test3(file, *file_) # !!!!
|
319
|
+
files = [file] + file_
|
261
320
|
# ...
|
262
321
|
end
|
263
322
|
|
264
323
|
end
|
265
324
|
|
266
|
-
|
267
|
-
|
268
|
-
exit app.main()
|
325
|
+
status_code = Benry::CmdApp.main("sample app", "1.0.0")
|
326
|
+
exit status_code
|
269
327
|
```
|
270
328
|
|
271
329
|
Help message:
|
272
330
|
|
273
331
|
```console
|
274
332
|
[bash]$ ruby ex03.rb -h test1
|
275
|
-
|
333
|
+
ex03.rb test1 --- name conversion test
|
334
|
+
|
335
|
+
Usage:
|
336
|
+
$ ex03.rb test1 <file-name> <file|dir> <file.html> # !!!!
|
337
|
+
|
338
|
+
[bash]$ ruby ex03.rb -h test2
|
339
|
+
ex03.rb test2 --- parameter kind test
|
276
340
|
|
277
341
|
Usage:
|
278
|
-
$ ex03.rb
|
342
|
+
$ ex03.rb test2 <aaa> <bbb> [<ccc> [<ddd> [<eee>...]]] # !!!!
|
343
|
+
|
344
|
+
[bash]$ ruby ex03.rb -h test3
|
345
|
+
ex03.rb test3 --- parameter combination test
|
346
|
+
|
347
|
+
Usage:
|
348
|
+
$ ex03.rb test3 <file>... # !!!!
|
279
349
|
```
|
280
350
|
|
281
351
|
|
282
352
|
### Options
|
283
353
|
|
284
354
|
* Action can take command-line options.
|
285
|
-
* Option values specified in command-line are passed to
|
355
|
+
* Option values specified in command-line are passed to action method as keyword arguments.
|
286
356
|
|
287
357
|
File: ex04.rb
|
288
358
|
|
289
359
|
```ruby
|
290
|
-
|
360
|
+
# coding: utf-8
|
291
361
|
require 'benry/cmdapp'
|
292
362
|
|
293
|
-
## action
|
294
363
|
class MyAction < Benry::CmdApp::Action
|
295
364
|
|
296
365
|
@action.("print greeting message")
|
@@ -301,20 +370,13 @@ class MyAction < Benry::CmdApp::Action
|
|
301
370
|
when "fr" ; puts "Bonjour, #{user}!"
|
302
371
|
when "it" ; puts "Ciao, #{user}!"
|
303
372
|
else
|
304
|
-
raise "#{lang}:
|
373
|
+
raise "#{lang}: Unknown language."
|
305
374
|
end
|
306
375
|
end
|
307
376
|
|
308
377
|
end
|
309
378
|
|
310
|
-
|
311
|
-
config = Benry::CmdApp::Config.new("sample app", "1.0.0")
|
312
|
-
config.default_help = true
|
313
|
-
|
314
|
-
## run application
|
315
|
-
app = Benry::CmdApp::Application.new(config)
|
316
|
-
status_code = app.main()
|
317
|
-
exit status_code
|
379
|
+
exit Benry::CmdApp.main("sample app", "1.0.0")
|
318
380
|
```
|
319
381
|
|
320
382
|
Output:
|
@@ -336,10 +398,9 @@ Ciao, world!
|
|
336
398
|
File: ex05.rb
|
337
399
|
|
338
400
|
```ruby
|
339
|
-
|
401
|
+
# coding: utf-8
|
340
402
|
require 'benry/cmdapp'
|
341
403
|
|
342
|
-
## action
|
343
404
|
class MyAction < Benry::CmdApp::Action
|
344
405
|
|
345
406
|
@action.("print greeting message")
|
@@ -353,21 +414,14 @@ class MyAction < Benry::CmdApp::Action
|
|
353
414
|
when "fr" ; puts "Bonjour, #{user}!"
|
354
415
|
when "it" ; puts "Ciao, #{user}!"
|
355
416
|
else
|
356
|
-
raise "#{lang}:
|
417
|
+
raise "#{lang}: Unknown language."
|
357
418
|
end
|
358
419
|
end
|
359
420
|
end
|
360
421
|
|
361
422
|
end
|
362
423
|
|
363
|
-
|
364
|
-
config = Benry::CmdApp::Config.new("sample app", "1.0.0")
|
365
|
-
config.default_help = true
|
366
|
-
|
367
|
-
## run application
|
368
|
-
app = Benry::CmdApp::Application.new(config)
|
369
|
-
status_code = app.main()
|
370
|
-
exit status_code
|
424
|
+
exit Benry::CmdApp.main("sample app", "1.0.0")
|
371
425
|
```
|
372
426
|
|
373
427
|
Output:
|
@@ -377,51 +431,75 @@ Output:
|
|
377
431
|
Bonjour, Alice!
|
378
432
|
Bonjour, Alice!
|
379
433
|
Bonjour, Alice!
|
380
|
-
|
434
|
+
```
|
381
435
|
|
382
436
|
Help message:
|
383
437
|
|
384
438
|
```console
|
385
439
|
[bash]$ ruby ex05.rb -h hello
|
386
|
-
ex05.rb hello
|
440
|
+
ex05.rb hello --- print greeting message
|
387
441
|
|
388
442
|
Usage:
|
389
443
|
$ ex05.rb hello [<options>] [<user>]
|
390
444
|
|
391
445
|
Options:
|
392
|
-
-l, --lang=<en|fr|it> : language
|
446
|
+
-l, --lang=<en|fr|it> : language
|
393
447
|
--repeat=<N> : repeat <N> times # !!!!
|
394
448
|
```
|
395
449
|
|
396
|
-
|
397
|
-
|
398
|
-
|
450
|
+
* If an option defined but the corresponding keyword argument is missing, error will be raised.
|
451
|
+
* If an action method accepts any keyword arguments (such as `**kwargs`), nothing will be raised.
|
452
|
+
|
453
|
+
```ruby
|
454
|
+
### ERROR: option `:repeat` is defined but keyword arg `repeat:` is missing.
|
455
|
+
@action.("greeting message")
|
456
|
+
@option.(:lang , "-l <lang>", "language")
|
457
|
+
@option.(:repeat, "-n <N>" , "repeat N times")
|
458
|
+
def hello(user="world", lang: "en")
|
459
|
+
....
|
460
|
+
end
|
461
|
+
|
462
|
+
### NO ERROR: `**kwargs` accepts any keyword arguments.
|
463
|
+
@action.("greeting message")
|
464
|
+
@option.(:lang , "-l <lang>", "language")
|
465
|
+
@option.(:repeat, "-n <N>" , "repeat N times")
|
466
|
+
def hello(user="world", lang: "en", **kwargs)
|
467
|
+
....
|
468
|
+
end
|
469
|
+
```
|
470
|
+
|
471
|
+
For usability reason, Benry-CmdApp supports `--lang=<val>` style of long option
|
472
|
+
but doesn't support `--lang <val>` style.
|
473
|
+
Benry-CmdApp regards `--lang <val>` as 'long option without argument'
|
399
474
|
and 'argument for command'.
|
400
475
|
|
401
476
|
```console
|
402
477
|
[bash]$ ruby ex05.rb hello --lang fr # ``--lang fr`` != ``--lang=fr``
|
403
|
-
[ERROR] --lang:
|
478
|
+
[ERROR] --lang: Argument required.
|
404
479
|
```
|
405
480
|
|
406
481
|
|
407
482
|
### Option Definition Format
|
408
483
|
|
409
|
-
|
410
|
-
|
411
|
-
*
|
412
|
-
*
|
413
|
-
*
|
414
|
-
*
|
415
|
-
*
|
416
|
-
*
|
417
|
-
*
|
418
|
-
*
|
419
|
-
*
|
484
|
+
There are 9 option definition formats.
|
485
|
+
|
486
|
+
* When the option takes no value:
|
487
|
+
* `-q` --- Short style.
|
488
|
+
* `--quiet` --- Long style.
|
489
|
+
* `-q, --quiet` --- Short and long style.
|
490
|
+
* When the option takes a required value:
|
491
|
+
* `-f <path>` --- Short style.
|
492
|
+
* `--file=<path>` --- Long style.
|
493
|
+
* `-f, --file=<path>` --- Short and long style.
|
494
|
+
* When the option takes an optional value:
|
495
|
+
* `-i[<N>]` --- Short style.
|
496
|
+
* `--indent[=<N>]` --- Long style.
|
497
|
+
* `-i, --indent[=<N>]` --- Short and long style.
|
420
498
|
|
421
499
|
File: ex06.rb
|
422
500
|
|
423
501
|
```ruby
|
424
|
-
|
502
|
+
# coding: utf-8
|
425
503
|
require 'benry/cmdapp'
|
426
504
|
|
427
505
|
class SampleAction < Benry::CmdApp::Action
|
@@ -455,9 +533,7 @@ class SampleAction < Benry::CmdApp::Action
|
|
455
533
|
|
456
534
|
end
|
457
535
|
|
458
|
-
|
459
|
-
app = Benry::CmdApp::Application.new(config)
|
460
|
-
exit app.main()
|
536
|
+
exit Benry::CmdApp.main("test app")
|
461
537
|
```
|
462
538
|
|
463
539
|
Output:
|
@@ -493,7 +569,7 @@ Help message:
|
|
493
569
|
|
494
570
|
```ruby
|
495
571
|
[bash]$ ruby ex06.rb -h test1
|
496
|
-
ex06.rb test1
|
572
|
+
ex06.rb test1 --- short options
|
497
573
|
|
498
574
|
Usage:
|
499
575
|
$ ex06.rb test1 [<options>]
|
@@ -504,7 +580,7 @@ Options:
|
|
504
580
|
-i[<N>] : indent width
|
505
581
|
|
506
582
|
[bash]$ ruby ex06.rb -h test2
|
507
|
-
ex06.rb test2
|
583
|
+
ex06.rb test2 --- long options
|
508
584
|
|
509
585
|
Usage:
|
510
586
|
$ ex06.rb test2 [<options>]
|
@@ -515,7 +591,7 @@ Options:
|
|
515
591
|
--indent[=<N>] : indent width
|
516
592
|
|
517
593
|
[bash]$ ruby ex06.rb -h test3
|
518
|
-
ex06.rb test3
|
594
|
+
ex06.rb test3 --- short and long options
|
519
595
|
|
520
596
|
Usage:
|
521
597
|
$ ex06.rb test3 [<options>]
|
@@ -540,10 +616,9 @@ Options:
|
|
540
616
|
File: ex07.rb
|
541
617
|
|
542
618
|
```ruby
|
543
|
-
|
619
|
+
# coding: utf-8
|
544
620
|
require 'benry/cmdapp'
|
545
621
|
|
546
|
-
## action
|
547
622
|
class MyAction < Benry::CmdApp::Action
|
548
623
|
|
549
624
|
@action.("print greeting message")
|
@@ -560,34 +635,27 @@ class MyAction < Benry::CmdApp::Action
|
|
560
635
|
when "fr" ; puts "Bonjour, #{user}!"
|
561
636
|
when "it" ; puts "Ciao, #{user}!"
|
562
637
|
else
|
563
|
-
raise "#{lang}:
|
638
|
+
raise "#{lang}: Unknown language."
|
564
639
|
end
|
565
640
|
end
|
566
641
|
end
|
567
642
|
|
568
643
|
end
|
569
644
|
|
570
|
-
|
571
|
-
config = Benry::CmdApp::Config.new("sample app", "1.0.0")
|
572
|
-
config.default_help = true
|
573
|
-
|
574
|
-
## run application
|
575
|
-
app = Benry::CmdApp::Application.new(config)
|
576
|
-
status_code = app.main()
|
577
|
-
exit status_code
|
645
|
+
exit Benry::CmdApp.main("sample app", "1.0.0")
|
578
646
|
```
|
579
647
|
|
580
648
|
Output:
|
581
649
|
|
582
650
|
```console
|
583
651
|
[bash]$ ruby ex07.rb hello -l japan
|
584
|
-
[ERROR] -l japan:
|
652
|
+
[ERROR] -l japan: Pattern unmatched.
|
585
653
|
|
586
654
|
[bash]$ ruby ex07.rb hello -l ja
|
587
|
-
[ERROR] -l ja:
|
655
|
+
[ERROR] -l ja: Expected one of en/fr/it.
|
588
656
|
|
589
657
|
[bash]$ ruby ex07.rb hello --repeat=abc
|
590
|
-
[ERROR] --repeat=abc:
|
658
|
+
[ERROR] --repeat=abc: Integer expected.
|
591
659
|
|
592
660
|
[bash]$ ruby ex07.rb hello --repeat=100
|
593
661
|
[ERROR] --repeat=100: Too large (max: 10).
|
@@ -605,10 +673,9 @@ Callback can:
|
|
605
673
|
File: ex08.rb
|
606
674
|
|
607
675
|
```ruby
|
608
|
-
|
676
|
+
# coding: utf-8
|
609
677
|
require 'benry/cmdapp'
|
610
678
|
|
611
|
-
## action
|
612
679
|
class MyAction < Benry::CmdApp::Action
|
613
680
|
|
614
681
|
@action.("print greeting message")
|
@@ -617,7 +684,7 @@ class MyAction < Benry::CmdApp::Action
|
|
617
684
|
rexp: /\A\w\w\z/) {|v| v.downcase } # !!!!
|
618
685
|
@option.(:repeat, " --repeat=<N>", "repeat <N> times",
|
619
686
|
type: Integer) {|v| # !!!!
|
620
|
-
v > 0 or raise "
|
687
|
+
v > 0 or raise "Not positive value." # !!!!
|
621
688
|
v # !!!!
|
622
689
|
} # !!!!
|
623
690
|
def hello(user="world", lang: "en", repeat: 1)
|
@@ -627,21 +694,14 @@ class MyAction < Benry::CmdApp::Action
|
|
627
694
|
when "fr" ; puts "Bonjour, #{user}!"
|
628
695
|
when "it" ; puts "Ciao, #{user}!"
|
629
696
|
else
|
630
|
-
raise "#{lang}:
|
697
|
+
raise "#{lang}: Unknown language."
|
631
698
|
end
|
632
699
|
end
|
633
700
|
end
|
634
701
|
|
635
702
|
end
|
636
703
|
|
637
|
-
|
638
|
-
config = Benry::CmdApp::Config.new("sample app", "1.0.0")
|
639
|
-
config.default_help = true
|
640
|
-
|
641
|
-
## run application
|
642
|
-
app = Benry::CmdApp::Application.new(config)
|
643
|
-
status_code = app.main()
|
644
|
-
exit status_code
|
704
|
+
exit Benry::CmdApp.main("sample app", "1.0.0")
|
645
705
|
```
|
646
706
|
|
647
707
|
Output:
|
@@ -651,13 +711,13 @@ Output:
|
|
651
711
|
Bonjour, world!
|
652
712
|
|
653
713
|
[bash]$ ruby ex08.rb hello --repeat=0
|
654
|
-
[ERROR] --repeat=0:
|
714
|
+
[ERROR] --repeat=0: Not positive value.
|
655
715
|
```
|
656
716
|
|
657
717
|
|
658
718
|
### Boolean (On/Off) Option
|
659
719
|
|
660
|
-
Benry
|
720
|
+
Benry-CmdApp doesn't support `--[no-]foobar` style option.
|
661
721
|
Instead, define boolean (on/off) option.
|
662
722
|
|
663
723
|
* Specify `type: TrueClass` to `@option.()`.
|
@@ -667,7 +727,7 @@ Instead, define boolean (on/off) option.
|
|
667
727
|
File: ex09.rb
|
668
728
|
|
669
729
|
```ruby
|
670
|
-
|
730
|
+
# coding: utf-8
|
671
731
|
require 'benry/cmdapp'
|
672
732
|
|
673
733
|
class SampleAction < Benry::CmdApp::Action
|
@@ -682,9 +742,7 @@ class SampleAction < Benry::CmdApp::Action
|
|
682
742
|
|
683
743
|
end
|
684
744
|
|
685
|
-
|
686
|
-
app = Benry::CmdApp::Application.new(config)
|
687
|
-
exit app.main()
|
745
|
+
exit Benry::CmdApp.main("sample app", "1.0.0")
|
688
746
|
```
|
689
747
|
|
690
748
|
Output:
|
@@ -720,7 +778,7 @@ If you want default value of flag to `true`, use `value:` keyword argument.
|
|
720
778
|
File: ex10.rb
|
721
779
|
|
722
780
|
```ruby
|
723
|
-
|
781
|
+
# coding: utf-8
|
724
782
|
require 'benry/cmdapp'
|
725
783
|
|
726
784
|
class SampleAction < Benry::CmdApp::Action
|
@@ -734,9 +792,7 @@ class SampleAction < Benry::CmdApp::Action
|
|
734
792
|
|
735
793
|
end
|
736
794
|
|
737
|
-
|
738
|
-
app = Benry::CmdApp::Application.new(config)
|
739
|
-
exit app.main()
|
795
|
+
exit Benry::CmdApp.main("git helper")
|
740
796
|
```
|
741
797
|
|
742
798
|
Output:
|
@@ -749,7 +805,7 @@ verbose=true
|
|
749
805
|
verbose=false
|
750
806
|
|
751
807
|
[bash]$ ruby ex10.rb flagtest2 --quiet=on # error
|
752
|
-
[ERROR] --quiet=on:
|
808
|
+
[ERROR] --quiet=on: Unexpected argument.
|
753
809
|
```
|
754
810
|
|
755
811
|
In above example, `--quiet=on` will be error because option is defined as
|
@@ -761,8 +817,8 @@ If you want to allow `--quiet=on`, specify option argument and `type: TrueClass`
|
|
761
817
|
...(snip)...
|
762
818
|
|
763
819
|
@action.("flag test")
|
764
|
-
@option.(:verbose, "-q, --quiet[=<on|off]", "quiet mode", # !!!!
|
765
|
-
type: TrueClass, value: false)
|
820
|
+
@option.(:verbose, "-q, --quiet[=<on|off>]", "quiet mode", # !!!!
|
821
|
+
type: TrueClass, value: false) # !!!!
|
766
822
|
def flagtest2(verbose: true)
|
767
823
|
puts "verbose=#{verbose.inspect}"
|
768
824
|
end
|
@@ -771,380 +827,850 @@ If you want to allow `--quiet=on`, specify option argument and `type: TrueClass`
|
|
771
827
|
```
|
772
828
|
|
773
829
|
|
774
|
-
###
|
830
|
+
### Option Set
|
775
831
|
|
776
|
-
|
777
|
-
|
832
|
+
Option set handles multiple options as a object.
|
833
|
+
Option set will help you to define same options into multiple actions.
|
778
834
|
|
779
835
|
File: ex11.rb
|
780
836
|
|
781
837
|
```ruby
|
782
|
-
|
838
|
+
# coding: utf-8
|
783
839
|
require 'benry/cmdapp'
|
784
840
|
|
785
841
|
class SampleAction < Benry::CmdApp::Action
|
786
|
-
prefix "foo:bar" # !!!!
|
787
842
|
|
788
|
-
|
789
|
-
|
790
|
-
|
843
|
+
optset1 = optionset() { # !!!!
|
844
|
+
@option.(:host , "-H, --host=<host>" , "host name")
|
845
|
+
@option.(:port , "-p, --port=<port>" , "port number", type: Integer)
|
846
|
+
}
|
847
|
+
optset2 = optionset() { # !!!!
|
848
|
+
@option.(:user , "-u, --user=<user>" , "user name")
|
849
|
+
}
|
850
|
+
|
851
|
+
@action.("connect to postgresql server")
|
852
|
+
@optionset.(optset1, optset2) # !!!!
|
853
|
+
def postgresql(host: nil, port: nil, user: nil)
|
854
|
+
puts "psql ...."
|
791
855
|
end
|
792
856
|
|
793
|
-
@action.("
|
794
|
-
|
795
|
-
|
857
|
+
@action.("connect to mysql server")
|
858
|
+
@optionset.(optset1, optset2) # !!!!
|
859
|
+
def mysql(host: nil, port: nil, user: nil)
|
860
|
+
puts "mysql ...."
|
796
861
|
end
|
797
862
|
|
798
863
|
end
|
799
864
|
|
800
|
-
|
801
|
-
app = Benry::CmdApp::Application.new(config)
|
802
|
-
exit app.main()
|
865
|
+
exit Benry::CmdApp.main("Sample App")
|
803
866
|
```
|
804
867
|
|
805
|
-
|
868
|
+
Help message:
|
806
869
|
|
807
870
|
```console
|
808
|
-
[bash]$ ruby ex11.rb
|
809
|
-
|
871
|
+
[bash]$ ruby ex11.rb -h postgresql # !!!!
|
872
|
+
ex11.rb postgresql --- connect to postgresql
|
810
873
|
|
811
|
-
|
812
|
-
|
813
|
-
```
|
874
|
+
Usage:
|
875
|
+
$ ex11.rb postgresql [<options>]
|
814
876
|
|
815
|
-
|
877
|
+
Options:
|
878
|
+
-H, --host=<host> : host name # !!!!
|
879
|
+
-p, --port=<port> : port number # !!!!
|
880
|
+
-u, --user=<user> : user name # !!!!
|
816
881
|
|
817
|
-
|
818
|
-
|
819
|
-
ex11.rb -- sample app
|
882
|
+
[bash]$ ruby ex11.rb -h mysql # !!!!
|
883
|
+
ex11.rb mysql --- connect to mysql
|
820
884
|
|
821
885
|
Usage:
|
822
|
-
$ ex11.rb [<options>]
|
886
|
+
$ ex11.rb mysql [<options>]
|
823
887
|
|
824
888
|
Options:
|
825
|
-
-
|
889
|
+
-H, --host=<host> : host name # !!!!
|
890
|
+
-p, --port=<port> : port number # !!!!
|
891
|
+
-u, --user=<user> : user name # !!!!
|
892
|
+
```
|
826
893
|
|
827
|
-
|
828
|
-
|
829
|
-
|
894
|
+
Option set object has the following methods.
|
895
|
+
|
896
|
+
* `OptionSet#select(:key1, :key2, ...)` ---
|
897
|
+
Creates new OptionSet object with copying options which are filtered by the keys specified.
|
898
|
+
* `OptionSet#exclude(:key1, :key2, ...)` ---
|
899
|
+
Creates new OptionSet object with copying options which are filtered by dropping the options that key is included in specified keys.
|
900
|
+
|
901
|
+
```ruby
|
902
|
+
@action.("connect to postgresql server")
|
903
|
+
@optionset.(optset1.select(:host, :port)) # !!!!
|
904
|
+
def postgresql(host: nil, port: nil)
|
905
|
+
....
|
906
|
+
end
|
907
|
+
|
908
|
+
@action.("connect to mysql server")
|
909
|
+
@optionset.(optset1.exclude(:port)) # !!!!
|
910
|
+
def mysql(host: nil)
|
911
|
+
....
|
912
|
+
end
|
830
913
|
```
|
831
914
|
|
832
|
-
|
915
|
+
|
916
|
+
### Copy Options
|
917
|
+
|
918
|
+
`@copy_options.()` copies options from other action.
|
833
919
|
|
834
920
|
File: ex12.rb
|
835
921
|
|
836
922
|
```ruby
|
837
|
-
|
923
|
+
# coding: utf-8
|
838
924
|
require 'benry/cmdapp'
|
839
925
|
|
840
926
|
class SampleAction < Benry::CmdApp::Action
|
841
|
-
prefix "foo:bar", action: :test3_ # !!!!
|
842
|
-
## or:
|
843
|
-
#prefix "foo:bar", action: "test3" # !!!!
|
844
927
|
|
845
|
-
@action.("
|
846
|
-
|
847
|
-
|
928
|
+
@action.("connect to postgresql")
|
929
|
+
@option.(:host , "-H, --host=<host>" , "host name")
|
930
|
+
@option.(:port , "-p, --port=<port>" , "port number", type: Integer)
|
931
|
+
@option.(:user , "-u, --user=<user>" , "user name")
|
932
|
+
def postgresql(host: nil, port: nil, user: nil)
|
933
|
+
puts "psql ...."
|
848
934
|
end
|
849
935
|
|
850
|
-
@action.("
|
851
|
-
|
852
|
-
|
936
|
+
@action.("connect to mysql")
|
937
|
+
@copy_options.("postgresql") # !!!!!
|
938
|
+
def mysql(host: nil, port: nil, user: nil)
|
939
|
+
puts "mysql ...."
|
853
940
|
end
|
854
941
|
|
855
942
|
end
|
856
943
|
|
857
|
-
|
858
|
-
app = Benry::CmdApp::Application.new(config)
|
859
|
-
exit app.main()
|
860
|
-
```
|
861
|
-
|
862
|
-
Output:
|
863
|
-
|
864
|
-
```console
|
865
|
-
[bash]$ ruby ex12.rb foo:bar:test1
|
866
|
-
test1
|
867
|
-
|
868
|
-
[bash]$ ruby ex12.rb foo:bar:test3
|
869
|
-
[ERROR] foo:bar:test2: unknown action.
|
870
|
-
|
871
|
-
[bash]$ ruby ex12.rb foo:bar
|
872
|
-
test3_
|
944
|
+
exit Benry::CmdApp.main("Sample App")
|
873
945
|
```
|
874
946
|
|
875
947
|
Help message:
|
876
948
|
|
877
949
|
```console
|
878
|
-
[bash]$ ruby ex12.rb -h
|
879
|
-
ex12.rb
|
950
|
+
[bash]$ ruby ex12.rb -h mysql # !!!!
|
951
|
+
ex12.rb mysql --- connect to mysql
|
880
952
|
|
881
953
|
Usage:
|
882
|
-
$ ex12.rb [<options>]
|
954
|
+
$ ex12.rb mysql [<options>]
|
883
955
|
|
884
956
|
Options:
|
885
|
-
-
|
886
|
-
|
887
|
-
|
888
|
-
foo:bar : test action #3
|
889
|
-
foo:bar:test1 : test action #1
|
957
|
+
-H, --host=<host> : host name
|
958
|
+
-p, --port=<port> : port number
|
959
|
+
-u, --user=<user> : user name
|
890
960
|
```
|
891
961
|
|
962
|
+
If you want to exclude some options from copying, specify `exlude:` keyword argument.
|
963
|
+
For example, `@copy_options.("hello", exclude: [:help, :lang])` copies all options of `hello` action excluding `:help` and `:lang` options.
|
892
964
|
|
893
|
-
### Invoke Other Action
|
894
965
|
|
895
|
-
|
896
|
-
|
897
|
-
|
966
|
+
### Option Error and Action Error
|
967
|
+
|
968
|
+
* `option_error()` returns (not raise) `Benry::CmdApp::OptionError` object.
|
969
|
+
* `action_error()` returns (not raise) `Benry::CmdApp::ActionError` object.
|
970
|
+
* These are available in action method.
|
898
971
|
|
899
972
|
File: ex13.rb
|
900
973
|
|
901
974
|
```ruby
|
902
|
-
|
975
|
+
# coding: utf-8
|
903
976
|
require 'benry/cmdapp'
|
904
977
|
|
905
978
|
class SampleAction < Benry::CmdApp::Action
|
906
979
|
|
907
|
-
@action.("
|
908
|
-
|
909
|
-
|
910
|
-
|
911
|
-
|
912
|
-
|
913
|
-
|
914
|
-
|
915
|
-
|
916
|
-
|
917
|
-
|
918
|
-
|
980
|
+
@action.("invoke openssl command")
|
981
|
+
@option.(:encrypt, "--encrypt", "encrypt a file")
|
982
|
+
@option.(:decrypt, "--decrypt", "decrypt a file")
|
983
|
+
def openssl(filename, encrypt: false, decrypt: false)
|
984
|
+
if encrypt == false && decrypt == false
|
985
|
+
raise option_error("Required '--encrypt' or '--decrypt' option.") # !!!!
|
986
|
+
end
|
987
|
+
opt = encrypt ? "enc" : "dec"
|
988
|
+
command = "openssl #{opt} ..."
|
989
|
+
result = system command
|
990
|
+
if result == false
|
991
|
+
raise action_error("Command failed: #{command}") # !!!!
|
992
|
+
end
|
919
993
|
end
|
920
994
|
|
921
995
|
end
|
922
996
|
|
923
|
-
|
924
|
-
app = Benry::CmdApp::Application.new(config)
|
925
|
-
exit app.main()
|
997
|
+
exit Benry::CmdApp.main("Sample App")
|
926
998
|
```
|
927
999
|
|
928
1000
|
Output:
|
929
1001
|
|
930
1002
|
```console
|
931
|
-
[bash]$ ruby ex13.rb
|
932
|
-
|
933
|
-
|
934
|
-
|
935
|
-
|
1003
|
+
[bash]$ ruby ex13.rb openssl file.txt
|
1004
|
+
[ERROR] Required '--encrypt' or '--decrypt' option. #<== option_error()
|
1005
|
+
|
1006
|
+
[bash]$ ruby ex13.rb openssl --encrypt file.txt
|
1007
|
+
enc: Use -help for summary.
|
1008
|
+
[ERROR] Command failed: openssl enc ... #<== action_error()
|
1009
|
+
From ex13.rb:17:in `openssl'
|
1010
|
+
raise action_error("Command failed: #{command}")
|
1011
|
+
From ex13.rb:25:in `<main>'
|
1012
|
+
exit app.main()
|
1013
|
+
```
|
1014
|
+
|
1015
|
+
If you want to show all stacktrace, add `--debug` global option.
|
1016
|
+
|
1017
|
+
```console
|
1018
|
+
[bash]$ ruby ex13.rb --debug openssl --encrypt file.txt
|
1019
|
+
enc: Use -help for summary.
|
1020
|
+
ex13.rb:17:in `openssl': Command failed: openssl enc ... (Benry::CmdApp::ActionError)
|
1021
|
+
from /home/yourname/cmdapp.rb:988:in `_invoke_action'
|
1022
|
+
from /home/yourname/cmdapp.rb:927:in `start_action'
|
1023
|
+
from /home/yourname/cmdapp.rb:1794:in `start_action'
|
1024
|
+
from /home/yourname/cmdapp.rb:1627:in `handle_action'
|
1025
|
+
from /home/yourname/cmdapp.rb:1599:in `run'
|
1026
|
+
from /home/yourname/cmdapp.rb:1571:in `main'
|
936
1027
|
```
|
937
1028
|
|
938
|
-
* When looped action is detected, Benry::CmdApp aborts action.
|
939
1029
|
|
940
|
-
|
1030
|
+
|
1031
|
+
## Advanced Feature
|
1032
|
+
|
1033
|
+
|
1034
|
+
### Category of Action
|
1035
|
+
|
1036
|
+
* `category "foo:bar:"` in action class adds prefix `foo:bar:` to each action name.
|
1037
|
+
* Category name should be specified as a prefix string ending with `:`. For example, `category "foo:"` is OK but `category "foo"` will be error.
|
1038
|
+
* Symbol is not allowed. For example, `category :foo` will be error.
|
1039
|
+
* Method name `def baz__test()` with `category "foo:bar:"` results in the action name `foo:bar:baz:test`.
|
1040
|
+
|
1041
|
+
File: ex21.rb
|
941
1042
|
|
942
1043
|
```ruby
|
943
|
-
|
1044
|
+
# coding: utf-8
|
944
1045
|
require 'benry/cmdapp'
|
945
1046
|
|
946
|
-
class
|
947
|
-
|
948
|
-
@action.("test #1")
|
949
|
-
def test1()
|
950
|
-
run_action_once("test2")
|
951
|
-
end
|
1047
|
+
class SampleAction < Benry::CmdApp::Action
|
1048
|
+
category "foo:bar:" # !!!!
|
952
1049
|
|
953
|
-
@action.("test #
|
954
|
-
def
|
955
|
-
|
1050
|
+
@action.("test action #1")
|
1051
|
+
def test1() # action name: 'foo:bar:test1'
|
1052
|
+
puts __method__ #=> test1
|
1053
|
+
puts methods().grep(/test1/) #=> foo__bar__test1
|
956
1054
|
end
|
957
1055
|
|
958
|
-
@action.("test #
|
959
|
-
def
|
960
|
-
|
1056
|
+
@action.("test action #2")
|
1057
|
+
def baz__test2() # action name: 'foo:bar:baz:test2'
|
1058
|
+
puts __method__ #=> baz__test2
|
1059
|
+
puts methods().grep(/test2/) #=> foo__bar__baz__test2
|
961
1060
|
end
|
962
1061
|
|
963
1062
|
end
|
964
1063
|
|
965
|
-
|
966
|
-
app = Benry::CmdApp::Application.new(config)
|
967
|
-
exit app.main()
|
1064
|
+
exit Benry::CmdApp.main("sample app")
|
968
1065
|
```
|
969
1066
|
|
970
1067
|
Output:
|
971
1068
|
|
972
1069
|
```console
|
973
|
-
[bash]$ ruby
|
974
|
-
|
1070
|
+
[bash]$ ruby ex21.rb -l
|
1071
|
+
Actions:
|
1072
|
+
foo:bar:baz:test2 : test action #2
|
1073
|
+
foo:bar:test1 : test action #1
|
1074
|
+
help : print help message (of action if specified)
|
975
1075
|
|
976
|
-
[bash]$ ruby
|
977
|
-
|
1076
|
+
[bash]$ ruby ex21.rb foo:bar:test1
|
1077
|
+
test1 # <== puts __method__
|
1078
|
+
foo__bar__test1 # <== puts methods().grep(/test1/)
|
1079
|
+
|
1080
|
+
[bash]$ ruby ex21.rb foo:bar:baz:test2
|
1081
|
+
baz__test2 # <== puts __method__
|
1082
|
+
foo__bar__baz__test2 # <== puts methods().grep(/test1/)
|
978
1083
|
```
|
979
1084
|
|
1085
|
+
(INTERNAL MECHANISM):
|
1086
|
+
As shown in the above output, Benry-CmdApp internally renames `test1()` and `baz__test2()` methods within category `foo:bar:` to `foo__bar__test1()` and `foo__bar__baz__test2()` respectively.
|
1087
|
+
`__method__` seems to keep original method name, but don't be fooled, methods are renamed indeed.
|
1088
|
+
Due to this mechanism, it is possible to define the same name methods in different categories with no confliction.
|
1089
|
+
|
1090
|
+
* `category()` can take a description text of category.
|
1091
|
+
For example, `category "foo:", "Bla bla"` registers `"Bla bla` as a description of category `foo:`.
|
1092
|
+
Description of category is displayed in list of category list.
|
1093
|
+
See [Action List and Prefix List](#action-list-and-prefix-list) section for details.
|
980
1094
|
|
981
|
-
### Action Alias
|
982
1095
|
|
983
|
-
|
1096
|
+
### Nested Category
|
984
1097
|
|
985
|
-
|
1098
|
+
`category()` can take a block which represents sub-category.
|
1099
|
+
|
1100
|
+
File: ex22.rb
|
986
1101
|
|
987
1102
|
```ruby
|
988
|
-
|
1103
|
+
# coding: utf-8
|
989
1104
|
require 'benry/cmdapp'
|
990
1105
|
|
991
|
-
class
|
992
|
-
|
1106
|
+
class GitAction < Benry::CmdApp::Action
|
1107
|
+
category "git:" # top level category
|
993
1108
|
|
994
|
-
@action.("
|
995
|
-
def
|
996
|
-
puts
|
1109
|
+
@action.("show current status in compact format")
|
1110
|
+
def status(path=".")
|
1111
|
+
puts "git status -sb #{path}"
|
997
1112
|
end
|
998
1113
|
|
999
|
-
|
1000
|
-
|
1001
|
-
Benry::CmdApp.action_alias "test", "foo:bar:test1" # !!!!
|
1114
|
+
category "commit:" do # sub level category
|
1002
1115
|
|
1003
|
-
|
1004
|
-
|
1005
|
-
|
1006
|
-
|
1116
|
+
@action.("create a new commit")
|
1117
|
+
def create(message: nil)
|
1118
|
+
puts "git commit"
|
1119
|
+
end
|
1007
1120
|
|
1008
|
-
|
1121
|
+
end
|
1009
1122
|
|
1010
|
-
|
1011
|
-
[bash]$ ruby ex15.rb test # alias name
|
1012
|
-
test1
|
1123
|
+
category "branch:" do # sub level category
|
1013
1124
|
|
1014
|
-
|
1015
|
-
|
1016
|
-
|
1125
|
+
@action.("create a new branch")
|
1126
|
+
def create(branch)
|
1127
|
+
puts "git checkout -b #{branch}"
|
1128
|
+
end
|
1017
1129
|
|
1018
|
-
|
1130
|
+
end
|
1019
1131
|
|
1020
|
-
|
1021
|
-
[bash]$ ruby ex15.rb -h
|
1022
|
-
ex15.rb -- sample app
|
1132
|
+
end
|
1023
1133
|
|
1024
|
-
|
1025
|
-
|
1134
|
+
exit Benry::CmdApp.main("sample app")
|
1135
|
+
```
|
1026
1136
|
|
1027
|
-
|
1028
|
-
-h, --help : print help message (of action if action specified)
|
1137
|
+
Output:
|
1029
1138
|
|
1139
|
+
```console
|
1140
|
+
[bash]$ ruby ex22.rb -l
|
1030
1141
|
Actions:
|
1031
|
-
|
1032
|
-
|
1142
|
+
git:branch:create : create a new branch
|
1143
|
+
git:commit:create : create a new commit
|
1144
|
+
git:status : show current status in compact format
|
1145
|
+
help : print help message (of action if specified)
|
1033
1146
|
```
|
1034
1147
|
|
1035
|
-
|
1148
|
+
Block of `category()` is nestable.
|
1036
1149
|
|
1037
|
-
File:
|
1150
|
+
File: ex23.rb
|
1038
1151
|
|
1039
1152
|
```ruby
|
1040
|
-
|
1153
|
+
# coding: utf-8
|
1041
1154
|
require 'benry/cmdapp'
|
1042
1155
|
|
1043
|
-
class
|
1156
|
+
class GitAction < Benry::CmdApp::Action
|
1157
|
+
|
1158
|
+
category "git:" do # top level category
|
1159
|
+
|
1160
|
+
@action.("show current status in compact format")
|
1161
|
+
def status(path=".")
|
1162
|
+
puts "git status -sb #{path}"
|
1163
|
+
end
|
1164
|
+
|
1165
|
+
category "commit:" do # sub level category
|
1166
|
+
|
1167
|
+
@action.("create a new commit")
|
1168
|
+
def create(message: nil)
|
1169
|
+
puts "git commit"
|
1170
|
+
end
|
1171
|
+
|
1172
|
+
end
|
1173
|
+
|
1174
|
+
category "branch:" do # sub level category
|
1175
|
+
|
1176
|
+
@action.("create a new branch")
|
1177
|
+
def create(branch)
|
1178
|
+
puts "git checkout -b #{branch}"
|
1179
|
+
end
|
1044
1180
|
|
1045
|
-
@action.("print greeting message")
|
1046
|
-
@option.(:lang, "-l, --lang=<lang>", "language", enum: ["en", "fr", "it"])
|
1047
|
-
def hello(user="world", lang: "en")
|
1048
|
-
case lang
|
1049
|
-
when "en" ; puts "Hello, #{user}!"
|
1050
|
-
when "fr" ; puts "Bonjour, #{user}!"
|
1051
|
-
when "it" ; puts "Ciao, #{user}!"
|
1052
|
-
else
|
1053
|
-
raise "#{lang}: unknown language."
|
1054
1181
|
end
|
1182
|
+
|
1055
1183
|
end
|
1056
1184
|
|
1057
1185
|
end
|
1058
1186
|
|
1059
|
-
Benry::CmdApp.
|
1060
|
-
Benry::CmdApp.action_alias("ciao" , "hello", "Bob", "-l", "it") # !!!!
|
1061
|
-
|
1062
|
-
config = Benry::CmdApp::Config.new("sample app")
|
1063
|
-
app = Benry::CmdApp::Application.new(config)
|
1064
|
-
exit app.main()
|
1187
|
+
exit Benry::CmdApp.main("sample app")
|
1065
1188
|
```
|
1066
1189
|
|
1067
1190
|
Output:
|
1068
1191
|
|
1069
1192
|
```console
|
1070
|
-
[bash]$ ruby
|
1071
|
-
|
1072
|
-
|
1073
|
-
|
1074
|
-
|
1075
|
-
|
1076
|
-
[bash]$ ruby ex16.rb bonjour Alice # !!!!
|
1077
|
-
Bonjour, Alice!
|
1078
|
-
|
1079
|
-
[bash]$ ruby ex16.rb ciao # !!!!
|
1080
|
-
Ciao, Bob!
|
1193
|
+
[bash]$ ruby ex23.rb -l
|
1194
|
+
Actions:
|
1195
|
+
git:branch:create : create a new branch
|
1196
|
+
git:commit:create : create a new commit
|
1197
|
+
git:status : show current status in compact format
|
1198
|
+
help : print help message (of action if specified)
|
1081
1199
|
```
|
1082
1200
|
|
1083
1201
|
|
1084
|
-
###
|
1202
|
+
### Category Action or Alias
|
1085
1203
|
|
1086
|
-
* `
|
1087
|
-
In this case, action `test1` will be invoked if action name not specified in command-line.
|
1088
|
-
* Default action name is shown in help message.
|
1204
|
+
* `category "foo:bar:", action: "blabla"` defines `foo:bar` action (instead of `foo:bar:blabla`) with `blabla()` method.
|
1089
1205
|
|
1090
|
-
File:
|
1206
|
+
File: ex24.rb
|
1091
1207
|
|
1092
1208
|
```ruby
|
1093
|
-
|
1209
|
+
# coding: utf-8
|
1094
1210
|
require 'benry/cmdapp'
|
1095
1211
|
|
1096
1212
|
class SampleAction < Benry::CmdApp::Action
|
1213
|
+
category "foo:bar:", action: "test3" # !!!!
|
1097
1214
|
|
1098
1215
|
@action.("test action #1")
|
1099
|
-
def test1()
|
1216
|
+
def test1() # action name: 'foo:bar:test1'
|
1217
|
+
puts __method__
|
1218
|
+
end
|
1219
|
+
|
1220
|
+
@action.("test action #3")
|
1221
|
+
def test3() # action name: 'foo:bar'
|
1100
1222
|
puts __method__
|
1101
1223
|
end
|
1102
1224
|
|
1103
1225
|
end
|
1104
1226
|
|
1105
|
-
|
1106
|
-
config.default_action = "test1" # !!!!
|
1107
|
-
app = Benry::CmdApp::Application.new(config)
|
1108
|
-
exit app.main()
|
1227
|
+
exit Benry::CmdApp.main("sample app")
|
1109
1228
|
```
|
1110
1229
|
|
1111
1230
|
Output:
|
1112
1231
|
|
1113
1232
|
```console
|
1114
|
-
[bash]$ ruby
|
1115
|
-
|
1233
|
+
[bash]$ ruby ex24.rb -l
|
1234
|
+
Actions:
|
1235
|
+
foo:bar : test action #3 # !!!! not 'foo:bar:test3'
|
1236
|
+
foo:bar:test1 : test action #1
|
1237
|
+
help : print help message (of action if specified)
|
1116
1238
|
|
1117
|
-
[bash]$ ruby
|
1239
|
+
[bash]$ ruby ex24.rb foo:bar:test1
|
1118
1240
|
test1
|
1241
|
+
|
1242
|
+
[bash]$ ruby ex24.rb foo:bar:test3 # !!!! not available because renamed
|
1243
|
+
[ERROR] foo:bar:test3: Action not found.
|
1244
|
+
|
1245
|
+
[bash]$ ruby ex24.rb foo:bar # !!!! available because renamed
|
1246
|
+
test3
|
1247
|
+
```
|
1248
|
+
|
1249
|
+
<!--
|
1250
|
+
* `category "foo:", alias_for: "blabla"` defines `foo` as an alias for `foo:blabla` action.
|
1251
|
+
See [Alias for Action](#alias-of-action) section about alias for action.
|
1252
|
+
|
1253
|
+
* Keyword arguments `action:` and `alias_for:` are exclusive.
|
1254
|
+
It is not allowed to specify both of them at the same time.
|
1255
|
+
See [Q: What is the difference between category(alias_for:) and category(action:)?](#q-what-is-the-difference-between-categoryalias_for-and-categoryaction) section for details.
|
1256
|
+
-->
|
1257
|
+
|
1258
|
+
* Action name (and also category name) should be specified as a string. Symbol is not allowed.
|
1259
|
+
|
1260
|
+
```ruby
|
1261
|
+
## Symbol is not allowed
|
1262
|
+
category :foo #=> error
|
1263
|
+
category "foo:", action: :blabla #=> error
|
1264
|
+
```
|
1265
|
+
|
1266
|
+
|
1267
|
+
### Invoke Other Action
|
1268
|
+
|
1269
|
+
* `run_action()` invokes other action.
|
1270
|
+
* `run_once()` invokes other action only once.
|
1271
|
+
This is equivarent to 'prerequisite task' feature in task runner application.
|
1272
|
+
|
1273
|
+
File: ex25.rb
|
1274
|
+
|
1275
|
+
```ruby
|
1276
|
+
# coding: utf-8
|
1277
|
+
require 'benry/cmdapp'
|
1278
|
+
|
1279
|
+
class SampleAction < Benry::CmdApp::Action
|
1280
|
+
|
1281
|
+
@action.("create build dir")
|
1282
|
+
def prepare()
|
1283
|
+
puts "rm -rf build"
|
1284
|
+
puts "mkdir build"
|
1285
|
+
end
|
1286
|
+
|
1287
|
+
@action.("build something")
|
1288
|
+
def build()
|
1289
|
+
run_once("prepare") # !!!!
|
1290
|
+
run_once("prepare") # skipped because already invoked
|
1291
|
+
puts "echo 'README' > build/README.txt"
|
1292
|
+
puts "zip -r build.zip build"
|
1293
|
+
end
|
1294
|
+
|
1295
|
+
end
|
1296
|
+
|
1297
|
+
exit Benry::CmdApp.main("sample app")
|
1298
|
+
```
|
1299
|
+
|
1300
|
+
Output:
|
1301
|
+
|
1302
|
+
```console
|
1303
|
+
[bash]$ ruby ex25.rb build
|
1304
|
+
rm -rf build # invoked only once!!!!
|
1305
|
+
mkdir build # invoked only once!!!!
|
1306
|
+
echo 'README' > build/README.txt
|
1307
|
+
zip -r build.zip build
|
1308
|
+
```
|
1309
|
+
|
1310
|
+
* Action name should be a string. Symbol is not allowed.
|
1311
|
+
|
1312
|
+
```ruby
|
1313
|
+
## Error because action name is not a string.
|
1314
|
+
run_once(:prepare)
|
1315
|
+
```
|
1316
|
+
|
1317
|
+
* When looped action is detected, Benry-CmdApp aborts action.
|
1318
|
+
|
1319
|
+
File: ex26.rb
|
1320
|
+
|
1321
|
+
```ruby
|
1322
|
+
require 'benry/cmdapp'
|
1323
|
+
|
1324
|
+
class LoopedAction < Benry::CmdApp::Action
|
1325
|
+
|
1326
|
+
@action.("test #1")
|
1327
|
+
def test1()
|
1328
|
+
run_once("test2")
|
1329
|
+
end
|
1330
|
+
|
1331
|
+
@action.("test #2")
|
1332
|
+
def test2()
|
1333
|
+
run_once("test3")
|
1334
|
+
end
|
1335
|
+
|
1336
|
+
@action.("test #3")
|
1337
|
+
def test3()
|
1338
|
+
run_once("test1") # !!!!
|
1339
|
+
end
|
1340
|
+
|
1341
|
+
end
|
1342
|
+
|
1343
|
+
exit Benry::CmdApp.main("sample app")
|
1344
|
+
```
|
1345
|
+
|
1346
|
+
Output:
|
1347
|
+
|
1348
|
+
```console
|
1349
|
+
[bash]$ ruby ex26.rb test1
|
1350
|
+
[ERROR] test1: Looped action detected.
|
1351
|
+
|
1352
|
+
[bash]$ ruby ex26.rb test3
|
1353
|
+
[ERROR] test3: Looped action detected.
|
1354
|
+
```
|
1355
|
+
|
1356
|
+
|
1357
|
+
### Cleaning Up Block
|
1358
|
+
|
1359
|
+
* `at_end { ... }` registers a clean-up block that is invoked at end of process (not at end of action).
|
1360
|
+
* This is very useful to register clean-up blocks in preparation action.
|
1361
|
+
* Registered blocks are invoked in reverse order of registration.
|
1362
|
+
For example, `at_end { puts "A" }; at_end { puts "B" }; at_end { puts "C" }` prints "C", "B", and "A" at end of process.
|
1363
|
+
|
1364
|
+
File: ex27.rb
|
1365
|
+
|
1366
|
+
```ruby
|
1367
|
+
# coding: utf-8
|
1368
|
+
require 'benry/cmdapp'
|
1369
|
+
|
1370
|
+
class SampleAction < Benry::CmdApp::Action
|
1371
|
+
|
1372
|
+
@action.("create build dir")
|
1373
|
+
def prepare()
|
1374
|
+
puts "mkdir -p build"
|
1375
|
+
## register cleaning up block in preparation task
|
1376
|
+
at_end { puts "rm -rf build" } # !!!!
|
1377
|
+
end
|
1378
|
+
|
1379
|
+
@action.("build something")
|
1380
|
+
def build()
|
1381
|
+
run_once("prepare")
|
1382
|
+
puts "echo 'README' > build/README.txt"
|
1383
|
+
puts "zip -r build.zip build"
|
1384
|
+
end
|
1385
|
+
|
1386
|
+
end
|
1387
|
+
|
1388
|
+
exit Benry::CmdApp.main("sample app")
|
1389
|
+
```
|
1390
|
+
|
1391
|
+
Output:
|
1392
|
+
|
1393
|
+
```console
|
1394
|
+
[bash]$ ruby ex27.rb build
|
1395
|
+
mkdir -p build
|
1396
|
+
echo 'README' > build/README.txt
|
1397
|
+
zip -r build.zip build
|
1398
|
+
rm -rf build # !!!! clean-up block invoked at the end of process !!!!
|
1399
|
+
```
|
1400
|
+
|
1401
|
+
|
1402
|
+
### Alias for Action
|
1403
|
+
|
1404
|
+
Alias provides alternative short name of action.
|
1405
|
+
|
1406
|
+
* `define_alias()` in action class defines an alias with taking action category into account.
|
1407
|
+
* `Benry::CmdApp.define_alias()` defines an alias, without taking category into account.
|
1408
|
+
|
1409
|
+
File: ex28.rb
|
1410
|
+
|
1411
|
+
```ruby
|
1412
|
+
# coding: utf-8
|
1413
|
+
require 'benry/cmdapp'
|
1414
|
+
|
1415
|
+
class GitAction < Benry::CmdApp::Action
|
1416
|
+
category "git:" # !!!!
|
1417
|
+
|
1418
|
+
@action.("show current status in compact mode")
|
1419
|
+
def status()
|
1420
|
+
puts "git status -sb"
|
1421
|
+
end
|
1422
|
+
|
1423
|
+
define_alias "st", "status" # !!!!
|
1424
|
+
## or:
|
1425
|
+
#Benry::CmdApp.define_alias "st", "git:status" # !!!!
|
1426
|
+
|
1427
|
+
category "staging:" do # !!!!
|
1428
|
+
|
1429
|
+
@action.("show changes in staging area")
|
1430
|
+
def show()
|
1431
|
+
puts "git diff --cached"
|
1432
|
+
end
|
1433
|
+
|
1434
|
+
define_alias "staged" , "show" # !!!!
|
1435
|
+
## or:
|
1436
|
+
#Benry::CmdApp.define_alias "staged", "git:staging:show" # !!!!
|
1437
|
+
|
1438
|
+
end
|
1439
|
+
|
1440
|
+
end
|
1441
|
+
|
1442
|
+
Benry::CmdApp.define_alias "git", "git:status" # !!!!
|
1443
|
+
|
1444
|
+
exit Benry::CmdApp.main("sample app")
|
1119
1445
|
```
|
1120
1446
|
|
1121
1447
|
Help message:
|
1122
1448
|
|
1123
1449
|
```console
|
1124
|
-
[bash]$ ruby
|
1125
|
-
|
1450
|
+
[bash]$ ruby ex28.rb -h
|
1451
|
+
ex28.rb --- sample app
|
1126
1452
|
|
1127
1453
|
Usage:
|
1128
|
-
$
|
1454
|
+
$ ex28.rb [<options>] <action> [<arguments>...]
|
1129
1455
|
|
1130
1456
|
Options:
|
1131
|
-
-h, --help : print help message (of action if
|
1457
|
+
-h, --help : print help message (of action if specified)
|
1458
|
+
-l, --list : list actions and aliases
|
1459
|
+
-a, --all : list hidden actions/options, too
|
1132
1460
|
|
1133
|
-
Actions:
|
1134
|
-
|
1461
|
+
Actions:
|
1462
|
+
git : alias for 'git:status' # !!!!
|
1463
|
+
git:staging:show : show changes in staging area
|
1464
|
+
git:status : show current status in compact mode
|
1465
|
+
help : print help message (of action if specified)
|
1466
|
+
st : alias for 'git:status' # !!!!
|
1467
|
+
staged : alias for 'git:staging:show' # !!!!
|
1468
|
+
```
|
1469
|
+
|
1470
|
+
Output:
|
1471
|
+
|
1472
|
+
```console
|
1473
|
+
[bash]$ ruby ex28.rb st # alias name
|
1474
|
+
git status -sb
|
1475
|
+
|
1476
|
+
[bash]$ ruby ex28.rb git:status # original action name
|
1477
|
+
git status -sb
|
1478
|
+
|
1479
|
+
[bash]$ ruby ex28.rb staged # alias name
|
1480
|
+
git diff --cached
|
1481
|
+
|
1482
|
+
[bash]$ ruby ex28.rb git:staging:show # original action name
|
1483
|
+
git diff --cached
|
1484
|
+
|
1485
|
+
[bash]$ ruby ex28.rb git # alias name
|
1486
|
+
git status -sb
|
1487
|
+
```
|
1488
|
+
|
1489
|
+
* Aliases are printed in the help message of action (if defined).
|
1490
|
+
|
1491
|
+
```console
|
1492
|
+
[bash]$ ruby ex28.rb git:status -h
|
1493
|
+
ex28.rb git:status --- show current status in compact mode
|
1494
|
+
|
1495
|
+
Usage:
|
1496
|
+
$ ex28.rb git:status
|
1497
|
+
|
1498
|
+
Aliases: # !!!!
|
1499
|
+
git : alias for 'git:status' # !!!!
|
1500
|
+
st : alias for 'git:status' # !!!!
|
1501
|
+
```
|
1502
|
+
|
1503
|
+
* Both alias and action names should be string. Symbol is not allowed.
|
1504
|
+
|
1505
|
+
```ruby
|
1506
|
+
## Error because alias name is a Symbol.
|
1507
|
+
Benry::CmdApp.define_alias :test, "hello"
|
1508
|
+
|
1509
|
+
## Error because action name is a Symbol.
|
1510
|
+
Benry::CmdApp.define_alias "test", :hello
|
1511
|
+
```
|
1512
|
+
|
1513
|
+
* Target action (second argument of `define_alias()`) can be an array of string
|
1514
|
+
which contains action name and options.
|
1515
|
+
|
1516
|
+
File: ex29.rb
|
1517
|
+
|
1518
|
+
```ruby
|
1519
|
+
# coding: utf-8
|
1520
|
+
require 'benry/cmdapp'
|
1521
|
+
|
1522
|
+
class MyAction < Benry::CmdApp::Action
|
1523
|
+
|
1524
|
+
@action.("print greeting message")
|
1525
|
+
@option.(:lang, "-l, --lang=<lang>", "language", enum: ["en", "fr", "it"])
|
1526
|
+
def hello(user="world", lang: "en")
|
1527
|
+
case lang
|
1528
|
+
when "en" ; puts "Hello, #{user}!"
|
1529
|
+
when "fr" ; puts "Bonjour, #{user}!"
|
1530
|
+
when "it" ; puts "Ciao, #{user}!"
|
1531
|
+
else
|
1532
|
+
raise "#{lang}: Unknown language."
|
1533
|
+
end
|
1534
|
+
end
|
1535
|
+
|
1536
|
+
end
|
1537
|
+
|
1538
|
+
Benry::CmdApp.define_alias("bonjour", ["hello", "--lang=fr"]) # !!!!
|
1539
|
+
Benry::CmdApp.define_alias("ciao" , ["hello", "-l", "it", "Bob"]) # !!!!
|
1540
|
+
|
1541
|
+
exit Benry::CmdApp.main("sample app")
|
1542
|
+
```
|
1543
|
+
|
1544
|
+
Output:
|
1545
|
+
|
1546
|
+
```console
|
1547
|
+
[bash]$ ruby ex29.rb hello
|
1548
|
+
Hello, world!
|
1549
|
+
|
1550
|
+
[bash]$ ruby ex29.rb bonjour # !!!!
|
1551
|
+
Bonjour, world!
|
1552
|
+
|
1553
|
+
[bash]$ ruby ex29.rb bonjour Alice # !!!!
|
1554
|
+
Bonjour, Alice!
|
1555
|
+
|
1556
|
+
[bash]$ ruby ex29.rb ciao # !!!!
|
1557
|
+
Ciao, Bob!
|
1558
|
+
```
|
1559
|
+
|
1560
|
+
* It is not allowed to define an alias for other alias.
|
1561
|
+
|
1562
|
+
```
|
1563
|
+
## define an alias
|
1564
|
+
Benry::CmdApp.define_alias("hello-it" , ["hello", "-l", "it"])
|
1565
|
+
|
1566
|
+
## ERROR: define an alias for other alias
|
1567
|
+
Benry::CmdApp.define_alias("ciao" , "hello-it") # !!!!
|
1568
|
+
```
|
1569
|
+
|
1570
|
+
<!--
|
1571
|
+
* `category "foo:", alias_for: "bar"` defines new alias `foo` which is an alias for `foo:bar` action.
|
1572
|
+
|
1573
|
+
File: ex30.rb
|
1574
|
+
|
1575
|
+
```ruby
|
1576
|
+
# coding: utf-8
|
1577
|
+
require 'benry/cmdapp'
|
1578
|
+
|
1579
|
+
class GitAction < Benry::CmdApp::Action
|
1580
|
+
category "git:", alias_for: "status"
|
1581
|
+
|
1582
|
+
@action.("show status in compact format")
|
1583
|
+
def status(path=".")
|
1584
|
+
system "git status -sb #{path}"
|
1585
|
+
end
|
1586
|
+
|
1587
|
+
end
|
1588
|
+
|
1589
|
+
exit Benry::CmdApp.main("sample app")
|
1590
|
+
```
|
1591
|
+
|
1592
|
+
Output:
|
1593
|
+
|
1594
|
+
```console
|
1595
|
+
[bash]$ ruby ex30.rb -l
|
1596
|
+
Actions:
|
1597
|
+
git : alias for 'git:status' # !!!!
|
1598
|
+
git:status : show status in compact format
|
1599
|
+
help : print help message (of action if specified)
|
1600
|
+
```
|
1601
|
+
-->
|
1602
|
+
|
1603
|
+
* Global option `-L alias` lists all aliases.
|
1604
|
+
This option is hidden in default, therefore not shown in help message but available in default (for debug purpose).
|
1605
|
+
|
1606
|
+
```console
|
1607
|
+
[bash]$ ruby ex30.rb -L alias
|
1608
|
+
Aliases:
|
1609
|
+
git : alias for 'git:status'
|
1135
1610
|
```
|
1136
1611
|
|
1137
1612
|
|
1138
|
-
###
|
1613
|
+
### Abbreviation of Category
|
1139
1614
|
|
1140
|
-
|
1141
|
-
|
1142
|
-
* `config.default_action` is prior than `config.default_help`.
|
1615
|
+
Abbreviation of category is a shortcut of category prefix.
|
1616
|
+
For example, when `b:` is an abbreviation of a category prefix `git:branch:`, you can invoke `git:branch:create` action by `b:create`.
|
1143
1617
|
|
1144
|
-
File:
|
1618
|
+
File: ex31.rb
|
1145
1619
|
|
1146
1620
|
```ruby
|
1147
|
-
|
1621
|
+
# coding: utf-8
|
1622
|
+
require 'benry/cmdapp'
|
1623
|
+
|
1624
|
+
class GitAction < Benry::CmdApp::Action
|
1625
|
+
|
1626
|
+
category "git:" do
|
1627
|
+
|
1628
|
+
category "branch:" do
|
1629
|
+
|
1630
|
+
@action.("create a new branch")
|
1631
|
+
def create(branch)
|
1632
|
+
puts "git checkout -b #{branch}"
|
1633
|
+
end
|
1634
|
+
|
1635
|
+
end
|
1636
|
+
|
1637
|
+
end
|
1638
|
+
|
1639
|
+
end
|
1640
|
+
|
1641
|
+
## define abbreviation 'b:' of category prefix 'git:branch:'
|
1642
|
+
Benry::CmdApp.define_abbrev("b:", "git:branch:") # !!!!
|
1643
|
+
|
1644
|
+
exit Benry::CmdApp.main("sample app")
|
1645
|
+
```
|
1646
|
+
|
1647
|
+
Output:
|
1648
|
+
|
1649
|
+
```console
|
1650
|
+
[bash]$ ruby ex31.rb b:create topic1 # invokes 'git:branch:create' !!!!
|
1651
|
+
git checkout -b topic1
|
1652
|
+
```
|
1653
|
+
|
1654
|
+
Global option `-L abbrev` lists all abbreviations.
|
1655
|
+
This option is hidden in default, therefore not shown in help message but available in default (for debug purpose).
|
1656
|
+
|
1657
|
+
```console
|
1658
|
+
[bash]$ ruby ex31.rb -L abbrev
|
1659
|
+
Abbreviations:
|
1660
|
+
b: => git:branch:
|
1661
|
+
```
|
1662
|
+
|
1663
|
+
|
1664
|
+
### Default Action
|
1665
|
+
|
1666
|
+
* `config.default_action = "test1"` defines default action.
|
1667
|
+
In this case, action `test1` will be invoked if action name not specified in command-line.
|
1668
|
+
* Default action name is shown in help message.
|
1669
|
+
|
1670
|
+
File: ex32.rb
|
1671
|
+
|
1672
|
+
```ruby
|
1673
|
+
# coding: utf-8
|
1148
1674
|
require 'benry/cmdapp'
|
1149
1675
|
|
1150
1676
|
class SampleAction < Benry::CmdApp::Action
|
@@ -1156,40 +1682,262 @@ class SampleAction < Benry::CmdApp::Action
|
|
1156
1682
|
|
1157
1683
|
end
|
1158
1684
|
|
1159
|
-
|
1160
|
-
|
1161
|
-
|
1162
|
-
|
1685
|
+
exit Benry::CmdApp.main("sample app", "1.0.0",
|
1686
|
+
default_action: "test1") # !!!!
|
1687
|
+
## or:
|
1688
|
+
#config = Benry::CmdApp::Config.new("sample app", "1.0.0")
|
1689
|
+
#config.default_action = "test1" # !!!!
|
1690
|
+
#app = Benry::CmdApp::Application.new(config)
|
1691
|
+
#exit app.main()
|
1163
1692
|
```
|
1164
1693
|
|
1165
1694
|
Output:
|
1166
1695
|
|
1167
1696
|
```console
|
1168
|
-
[bash]$ ruby
|
1169
|
-
|
1697
|
+
[bash]$ ruby ex32.rb test1
|
1698
|
+
test1
|
1699
|
+
|
1700
|
+
[bash]$ ruby ex32.rb # no action name!!!!
|
1701
|
+
test1
|
1702
|
+
```
|
1703
|
+
|
1704
|
+
Help message:
|
1705
|
+
|
1706
|
+
```console
|
1707
|
+
[bash]$ ruby ex32.rb -h
|
1708
|
+
ex32.rb --- sample app
|
1170
1709
|
|
1171
1710
|
Usage:
|
1172
|
-
$
|
1711
|
+
$ ex32.rb [<options>] <action> [<arguments>...]
|
1173
1712
|
|
1174
1713
|
Options:
|
1175
|
-
-h, --help : print help message (of action if
|
1714
|
+
-h, --help : print help message (of action if specified)
|
1715
|
+
-l, --list : list actions and aliases
|
1716
|
+
-a, --all : list hidden actions/options, too
|
1717
|
+
|
1718
|
+
Actions: (default: test1) # !!!!
|
1719
|
+
help : print help message (of action if specified)
|
1720
|
+
test1 : test action #1
|
1721
|
+
```
|
1722
|
+
|
1723
|
+
|
1724
|
+
### Action List and Category List
|
1725
|
+
|
1726
|
+
When `config.default_action` is not specified, Benry-CmdAction lists action names if action name is not specified in command-line.
|
1727
|
+
|
1728
|
+
File: ex33.rb
|
1729
|
+
|
1730
|
+
```ruby
|
1731
|
+
# coding: utf-8
|
1732
|
+
require 'benry/cmdapp'
|
1733
|
+
|
1734
|
+
class SampleAction < Benry::CmdApp::Action
|
1735
|
+
|
1736
|
+
@action.("test action #1")
|
1737
|
+
def test1()
|
1738
|
+
end
|
1739
|
+
|
1740
|
+
category "foo:" do
|
1741
|
+
|
1742
|
+
@action.("test action #2")
|
1743
|
+
def test2()
|
1744
|
+
end
|
1745
|
+
|
1746
|
+
end
|
1747
|
+
|
1748
|
+
category "bar:" do
|
1749
|
+
|
1750
|
+
@action.("test action #3")
|
1751
|
+
def test3()
|
1752
|
+
end
|
1753
|
+
|
1754
|
+
category "baz:" do
|
1755
|
+
|
1756
|
+
@action.("test action #4")
|
1757
|
+
def test4()
|
1758
|
+
end
|
1759
|
+
|
1760
|
+
end
|
1761
|
+
|
1762
|
+
end
|
1763
|
+
|
1764
|
+
end
|
1765
|
+
|
1766
|
+
exit Benry::CmdApp.main("sample app")
|
1767
|
+
```
|
1768
|
+
|
1769
|
+
Output:
|
1176
1770
|
|
1771
|
+
```console
|
1772
|
+
[bash]$ ruby ex33.rb # no action name!!!!
|
1177
1773
|
Actions:
|
1774
|
+
bar:baz:test4 : test action #4
|
1775
|
+
bar:test3 : test action #3
|
1776
|
+
foo:test2 : test action #2
|
1777
|
+
help : print help message (of action if specified)
|
1178
1778
|
test1 : test action #1
|
1179
1779
|
```
|
1180
1780
|
|
1781
|
+
Command-line option `-l, --list` also prints the same result of the above example.
|
1782
|
+
This is useful if you specify default action name wit `config.default_action`.
|
1783
|
+
|
1784
|
+
Action name list contains alias names, too.
|
1785
|
+
If you want to list only action names (or alias names), specify `-L action` or `-L alias` option.
|
1786
|
+
See [Q: How to list only aliases (or actions) excluding actions (or aliases) ?](#q-how-to-list-only-aliases-or-actions-excluding-actions-or-aliases-) for details.
|
1787
|
+
|
1788
|
+
If category prefix (such as `xxx:`) is specified instead of action name,
|
1789
|
+
Benry-CmdApp lists action names which have that category prefix.
|
1790
|
+
|
1791
|
+
Output:
|
1792
|
+
|
1793
|
+
```console
|
1794
|
+
[bash]$ ruby ex33.rb foo: # !!!!
|
1795
|
+
Actions:
|
1796
|
+
foo:test2 : test action #2
|
1797
|
+
|
1798
|
+
[bash]$ ruby ex33.rb bar: # !!!!
|
1799
|
+
Actions:
|
1800
|
+
bar:baz:test4 : test action #4
|
1801
|
+
bar:test3 : test action #3
|
1802
|
+
```
|
1803
|
+
|
1804
|
+
If `:` is specified instead of action name, Benry-CmdApp lists top-level category prefixes of action names and number of actions under the each category prefix.
|
1805
|
+
|
1806
|
+
Outuput:
|
1807
|
+
|
1808
|
+
```console
|
1809
|
+
[bash]$ ruby ex33.rb : # !!!!
|
1810
|
+
Categories: (depth=1)
|
1811
|
+
bar: (2) # !!! two actions ('bar:test3' and 'bar:baz:test4')
|
1812
|
+
foo: (1) # !!! one action ('foo:text2')
|
1813
|
+
```
|
1814
|
+
|
1815
|
+
In the above example, only top-level category prefixes are displayed.
|
1816
|
+
If you specified `::` instead of `:`, second-level category prefixes are displayed,
|
1817
|
+
for example `foo:xxx:` and `foo:yyy:`.
|
1818
|
+
Of course, `:::` displays more level category prefixes.
|
1819
|
+
|
1820
|
+
File: ex34.rb
|
1821
|
+
|
1822
|
+
```ruby
|
1823
|
+
# coding: utf-8
|
1824
|
+
require 'benry/cmdapp'
|
1825
|
+
|
1826
|
+
class GitAction < Benry::CmdApp::Action
|
1827
|
+
category "git:"
|
1828
|
+
|
1829
|
+
category "staging:" do
|
1830
|
+
@action.("..."); def add(); end
|
1831
|
+
@action.("..."); def show(); end
|
1832
|
+
@action.("..."); def delete(); end
|
1833
|
+
end
|
1834
|
+
|
1835
|
+
category "branch:" do
|
1836
|
+
@action.("..."); def list(); end
|
1837
|
+
@action.("..."); def switch(name); end
|
1838
|
+
end
|
1839
|
+
|
1840
|
+
category "repo:" do
|
1841
|
+
@action.("..."); def create(); end
|
1842
|
+
@action.("..."); def init(); end
|
1843
|
+
|
1844
|
+
category "config:" do
|
1845
|
+
@action.("..."); def add(); end
|
1846
|
+
@action.("..."); def delete(); end
|
1847
|
+
@action.("..."); def list(); end
|
1848
|
+
end
|
1849
|
+
|
1850
|
+
category "remote:" do
|
1851
|
+
@action.("..."); def list(); end
|
1852
|
+
@action.("..."); def set(); end
|
1853
|
+
end
|
1854
|
+
|
1855
|
+
end
|
1856
|
+
|
1857
|
+
end
|
1858
|
+
|
1859
|
+
exit Benry::CmdApp.main("sample app")
|
1860
|
+
```
|
1861
|
+
|
1862
|
+
Output:
|
1863
|
+
|
1864
|
+
```console
|
1865
|
+
[bash]$ ruby ex34.rb :
|
1866
|
+
Categories: (depth=1)
|
1867
|
+
git: (12)
|
1868
|
+
|
1869
|
+
[bash]$ ruby ex34.rb :: # !!!!
|
1870
|
+
Categories: (depth=2)
|
1871
|
+
git: (0)
|
1872
|
+
git:branch: (2)
|
1873
|
+
git:repo: (7)
|
1874
|
+
git:staging: (3)
|
1875
|
+
|
1876
|
+
[bash]$ ruby ex34.rb ::: # !!!!
|
1877
|
+
Categories: (depth=3)
|
1878
|
+
git: (0)
|
1879
|
+
git:branch: (2)
|
1880
|
+
git:repo: (2)
|
1881
|
+
git:repo:config: (3)
|
1882
|
+
git:repo:remote: (2)
|
1883
|
+
git:staging: (3)
|
1884
|
+
```
|
1885
|
+
|
1886
|
+
`category()` can take a description of category as second argument.
|
1887
|
+
Descriptions of category are displayed in the category prefix list.
|
1181
1888
|
|
1182
|
-
|
1889
|
+
File: ex35.rb
|
1890
|
+
|
1891
|
+
```ruby
|
1892
|
+
# coding: utf-8
|
1893
|
+
require 'benry/cmdapp'
|
1894
|
+
|
1895
|
+
class SampleAction < Benry::CmdApp::Action
|
1896
|
+
|
1897
|
+
category "foo:", "description of Foo" do
|
1898
|
+
@action.("test action #2")
|
1899
|
+
def test2()
|
1900
|
+
end
|
1901
|
+
end
|
1902
|
+
|
1903
|
+
category "bar:", "description of Bar" do
|
1904
|
+
@action.("test action #3")
|
1905
|
+
def test3()
|
1906
|
+
end
|
1907
|
+
|
1908
|
+
category "baz:", "description fo Baz" do
|
1909
|
+
@action.("test action #4")
|
1910
|
+
def test4()
|
1911
|
+
end
|
1912
|
+
end
|
1913
|
+
end
|
1914
|
+
|
1915
|
+
end
|
1916
|
+
|
1917
|
+
exit Benry::CmdApp.main("sample app")
|
1918
|
+
```
|
1919
|
+
|
1920
|
+
Output:
|
1921
|
+
|
1922
|
+
```console
|
1923
|
+
[bash]$ ruby ex35.rb : # !!!!
|
1924
|
+
Categories: (depth=1)
|
1925
|
+
bar: (2) : description of Bar # !!!!
|
1926
|
+
foo: (1) : description of Foo # !!!!
|
1927
|
+
```
|
1928
|
+
|
1929
|
+
|
1930
|
+
### Hidden Action
|
1183
1931
|
|
1184
1932
|
* If `hidden: true` keyword argument passed to `@action.()`,
|
1185
|
-
or action method is private, then Benry
|
1186
|
-
*
|
1187
|
-
*
|
1933
|
+
or action method is private, then Benry-CmdApp regards that action as hidden.
|
1934
|
+
* Hidden actions are not shown in help message nor action list by default.
|
1935
|
+
* Hidden actions are shown when `-a` or `--all` option is specified in command-line.
|
1188
1936
|
|
1189
|
-
File:
|
1937
|
+
File: ex36.rb
|
1190
1938
|
|
1191
1939
|
```ruby
|
1192
|
-
|
1940
|
+
# coding: utf-8
|
1193
1941
|
require 'benry/cmdapp'
|
1194
1942
|
|
1195
1943
|
class SampleAction < Benry::CmdApp::Action
|
@@ -1213,59 +1961,40 @@ class SampleAction < Benry::CmdApp::Action
|
|
1213
1961
|
|
1214
1962
|
end
|
1215
1963
|
|
1216
|
-
|
1217
|
-
config.option_all = true # !!!! enable '-a, --all' option !!!!
|
1218
|
-
app = Benry::CmdApp::Application.new(config)
|
1219
|
-
exit app.main()
|
1964
|
+
exit Benry::CmdApp.main("sample app")
|
1220
1965
|
```
|
1221
1966
|
|
1222
|
-
|
1967
|
+
Action list (without `-a` nor `--all`):
|
1223
1968
|
|
1224
1969
|
```console
|
1225
|
-
[bash]$ ruby
|
1226
|
-
ex20.rb -- sample app
|
1227
|
-
|
1228
|
-
Usage:
|
1229
|
-
$ ex20.rb [<options>] [<action> [<arguments>...]]
|
1230
|
-
|
1231
|
-
Options:
|
1232
|
-
-h, --help : print help message (of action if action specified)
|
1233
|
-
-a, --all : list all actions/options including private (hidden) ones
|
1234
|
-
|
1970
|
+
[bash]$ ruby ex36.rb
|
1235
1971
|
Actions:
|
1972
|
+
help : print help message (of action if specified)
|
1236
1973
|
test1 : test action #1
|
1237
1974
|
```
|
1238
1975
|
|
1239
|
-
|
1976
|
+
Action list (with `-a` or `--all`):
|
1240
1977
|
|
1241
1978
|
```console
|
1242
|
-
[bash]$ ruby
|
1243
|
-
ex20.rb -- sample app
|
1244
|
-
|
1245
|
-
Usage:
|
1246
|
-
$ ex20.rb [<options>] [<action> [<arguments>...]]
|
1247
|
-
|
1248
|
-
Options:
|
1249
|
-
-h, --help : print help message (of action if action specified)
|
1250
|
-
-a, --all : list all actions/options including private (hidden) ones
|
1251
|
-
|
1979
|
+
[bash]$ ruby ex36.rb --all # !!!!
|
1252
1980
|
Actions:
|
1981
|
+
help : print help message (of action if specified)
|
1253
1982
|
test1 : test action #1
|
1254
1983
|
test2 : test action #2 # !!!!
|
1255
1984
|
test3 : test action #3 # !!!!
|
1256
1985
|
```
|
1257
1986
|
|
1258
1987
|
|
1259
|
-
###
|
1988
|
+
### Hidden Option
|
1260
1989
|
|
1261
|
-
* Options defined with `hidden: true` keyword argument are treated as
|
1262
|
-
*
|
1263
|
-
*
|
1990
|
+
* Options defined with `hidden: true` keyword argument are treated as hidden option.
|
1991
|
+
* Hidden options are not shown in help message of action.
|
1992
|
+
* Hidden options are shown when `-a` or `--all` option is specified in command-line.
|
1264
1993
|
|
1265
|
-
File:
|
1994
|
+
File: ex37.rb
|
1266
1995
|
|
1267
1996
|
```ruby
|
1268
|
-
|
1997
|
+
# coding: utf-8
|
1269
1998
|
require 'benry/cmdapp'
|
1270
1999
|
|
1271
2000
|
class SampleAction < Benry::CmdApp::Action
|
@@ -1274,25 +2003,22 @@ class SampleAction < Benry::CmdApp::Action
|
|
1274
2003
|
@option.(:verbose, "-v", "verbose mode")
|
1275
2004
|
@option.(:debug , "-D", "debug mode", hidden: true) # !!!!
|
1276
2005
|
def test1(verbose: false, debug: false)
|
1277
|
-
puts "verbose=#{verbose}, debug=#{
|
2006
|
+
puts "verbose=#{verbose}, debug=#{debug}"
|
1278
2007
|
end
|
1279
2008
|
|
1280
2009
|
end
|
1281
2010
|
|
1282
|
-
|
1283
|
-
config.option_all = true # !!!! enable '-a, --all' option !!!!
|
1284
|
-
app = Benry::CmdApp::Application.new(config)
|
1285
|
-
exit app.main()
|
2011
|
+
exit Benry::CmdApp.main("sample app")
|
1286
2012
|
```
|
1287
2013
|
|
1288
2014
|
Help message (without `-a` nor `--all`):
|
1289
2015
|
|
1290
2016
|
```console
|
1291
|
-
[bash]$ ruby
|
1292
|
-
|
2017
|
+
[bash]$ ruby ex37.rb -h test1
|
2018
|
+
ex37.rb test1 --- test action
|
1293
2019
|
|
1294
2020
|
Usage:
|
1295
|
-
$
|
2021
|
+
$ ex37.rb test1 [<options>]
|
1296
2022
|
|
1297
2023
|
Options:
|
1298
2024
|
-v : verbose mode
|
@@ -1301,17 +2027,110 @@ Options:
|
|
1301
2027
|
Help message (with `-a` or `--all`)
|
1302
2028
|
|
1303
2029
|
```console
|
1304
|
-
[bash]$ ruby
|
1305
|
-
|
2030
|
+
[bash]$ ruby ex37.rb -h --all test1 # !!!!
|
2031
|
+
ex37.rb test1 --- test action
|
1306
2032
|
|
1307
2033
|
Usage:
|
1308
|
-
$
|
2034
|
+
$ ex37.rb test1 [<options>]
|
1309
2035
|
|
1310
2036
|
Options:
|
2037
|
+
-h, --help : print help message # !!!!
|
1311
2038
|
-v : verbose mode
|
1312
2039
|
-D : debug mode # !!!!
|
1313
2040
|
```
|
1314
2041
|
|
2042
|
+
In the above example, `-h, --help` option as well as `-D` option is shown.
|
2043
|
+
In fact, Benry-CmdApp automatically adds `-h, --help` option to each action in hidden mode.
|
2044
|
+
Therefore all actions accept `-h, --help` option.
|
2045
|
+
|
2046
|
+
For this reason, you should NOT define `-h` or `--help` options for your actions.
|
2047
|
+
|
2048
|
+
|
2049
|
+
### Important Actions or Options
|
2050
|
+
|
2051
|
+
It is possible to mark actions or options as important or not.
|
2052
|
+
|
2053
|
+
* Actions or options marked as important are emphasized in help message.
|
2054
|
+
* Actions or options marked as not important are weaken in help message.
|
2055
|
+
|
2056
|
+
File: ex38.rb
|
2057
|
+
|
2058
|
+
```ruby
|
2059
|
+
require 'benry/cmdapp'
|
2060
|
+
|
2061
|
+
class SampleAction < Benry::CmdApp::Action
|
2062
|
+
|
2063
|
+
@action.("important action", important: true) # !!!!
|
2064
|
+
def test1()
|
2065
|
+
end
|
2066
|
+
|
2067
|
+
@action.("not important action", important: false) # !!!!
|
2068
|
+
def test2()
|
2069
|
+
end
|
2070
|
+
|
2071
|
+
@action.("sample")
|
2072
|
+
@option.(:foo, "--foo", "important option", important: true)
|
2073
|
+
@option.(:bar, "--bar", "not important option", important: false)
|
2074
|
+
def test3(foo: nil, bar: nil)
|
2075
|
+
end
|
2076
|
+
|
2077
|
+
end
|
2078
|
+
|
2079
|
+
exit Benry::CmdApp.main("sample app")
|
2080
|
+
```
|
2081
|
+
|
2082
|
+
Output:
|
2083
|
+
|
2084
|
+
```console
|
2085
|
+
[bash]$ ruby ex38.rb -l
|
2086
|
+
Actions:
|
2087
|
+
help : print help message (of action if specified)
|
2088
|
+
test1 : important action # !!!! bold font !!!!
|
2089
|
+
test2 : not important action # !!!! gray color !!!!
|
2090
|
+
test3 : sample
|
2091
|
+
|
2092
|
+
[bash]$ ruby ex38.rb -h test3
|
2093
|
+
ex38.rb test3 --- sample
|
2094
|
+
|
2095
|
+
Usage:
|
2096
|
+
$ ex38.rb test3 [<options>]
|
2097
|
+
|
2098
|
+
Options:
|
2099
|
+
--foo : important option # !!!! bold font !!!!
|
2100
|
+
--bar : not important option # !!!! gray color !!!!
|
2101
|
+
```
|
2102
|
+
|
2103
|
+
|
2104
|
+
### Multiple Option
|
2105
|
+
|
2106
|
+
If you need multiple options like `-I` option of Ruby,
|
2107
|
+
pass `multiple: true` to `@option.()`.
|
2108
|
+
|
2109
|
+
File: ex39.rb
|
2110
|
+
|
2111
|
+
```ruby
|
2112
|
+
require 'benry/cmdapp'
|
2113
|
+
|
2114
|
+
class TestAction < Benry::CmdApp::Action
|
2115
|
+
|
2116
|
+
@action.("multiple option test")
|
2117
|
+
@option.(:path, "-I <path>", "path", multiple: true)
|
2118
|
+
def test_(path: [])
|
2119
|
+
puts "path=#{path.inspect}" #=> path=["/tmp", "/var/tmp"]
|
2120
|
+
end
|
2121
|
+
|
2122
|
+
end
|
2123
|
+
|
2124
|
+
exit Benry::CmdApp.main("test app")
|
2125
|
+
```
|
2126
|
+
|
2127
|
+
Output:
|
2128
|
+
|
2129
|
+
```console
|
2130
|
+
[bash]$ ruby ex39.rb test -I /tmp -I /var/tmp # !!!!
|
2131
|
+
path=["/tmp", "/var/tmp"] # !!!!
|
2132
|
+
```
|
2133
|
+
|
1315
2134
|
|
1316
2135
|
|
1317
2136
|
## Configuratoin and Customization
|
@@ -1324,67 +2143,105 @@ Options:
|
|
1324
2143
|
* `config.app_desc = "..."` sets command description which is shown in help message. (required)
|
1325
2144
|
* `config.app_version = "1.0.0"` enables `-V` and `--version` option, and prints version number if `-V` or `--version` option specified. (default: `nil`)
|
1326
2145
|
* `config.app_command = "<command>"` sets command name which is shown in help message. (default: `File.basname($0)`)
|
2146
|
+
* `config.app_name = "<string>"` sets application name which is shown in help message. (default: same as `config.app_command`)
|
2147
|
+
* `config.app_usage = "<text>" (or `["<text1>", "<text2>", ...]`) sets usage string in help message. (default: `" <action> [<arguments>...]"`)
|
1327
2148
|
* `config.app_detail = "<text>"` sets detailed description of command which is showin in help message. (default: `nil`)
|
2149
|
+
* `config.backtrace_ignore_rexp = /.../` sets regular expression to ignore backtrace when error raised. (default: `nil`)
|
2150
|
+
* `config.help_description = "<text>"` sets text of 'Description:' section in help message. (default: `nil`)
|
2151
|
+
* `config.help_postamble = {"<Title>:" => "<text>"}` sets postamble of help message, such as 'Example:' or 'Tips:'. (default: `nil`)
|
1328
2152
|
* `config.default_action = "<action>"` sets default action name. (default: `nil`)
|
1329
|
-
* `config.default_help = true` prints help message if no action names specified in command-line. (default: `false`)
|
1330
2153
|
* `config.option_help = true` enables `-h` and `--help` options. (default: `true`)
|
1331
|
-
* `config.
|
2154
|
+
* `config.option_version = true` enables `-V` and `--version` options. (default: `true` if `app_version` provided, `false` if else)
|
2155
|
+
* `config.option_list = true` enables `-l` and `--list` options. (default: `true`)
|
2156
|
+
* `config.option_topic = true` enables `-L <topic>` option. (default: `:hidden`)
|
2157
|
+
* `config.option_all = true` enables `-a` and `--all` options which shows private (hidden) actions and options into help message. (default: `true`)
|
1332
2158
|
* `config.option_verbose = true` enables `-v` and `--verbose` options which sets `$QUIET_MODE = false`. (default: `false`)
|
1333
2159
|
* `config.option_quiet = true` enables `-q` and `--quiet` options which sets `$QUIET_MODE = true`. (default: `false`)
|
1334
2160
|
* `config.option_color = true` enables `--color[=<on|off>]` option which sets `$COLOR_MODE = true/false`. This affects to help message colorized or not. (default: `false`)
|
1335
|
-
* `config.option_debug = true` enables `-D` and `--debug` options which sets `$DEBUG_MODE = true`. (default: `
|
1336
|
-
* `config.option_trace = true` enables `-T` and `--trace` options
|
1337
|
-
* `config.
|
1338
|
-
* `config.
|
1339
|
-
* `config.
|
1340
|
-
* `config.
|
1341
|
-
* `config.
|
1342
|
-
* `config.format_usage = " $ %s
|
1343
|
-
* `config.
|
2161
|
+
* `config.option_debug = true` enables `-D` and `--debug` options which sets `$DEBUG_MODE = true`. (default: `:hidden`)
|
2162
|
+
* `config.option_trace = true` enables `-T` and `--trace` options. Entering into and exitting from action are reported when trace mode is on. (default: `false`)
|
2163
|
+
* `config.option_dryrun = true` enables `-X` and `--dryrun` options which sets `$DRYRUN_MODE = true`. (default: `false`)
|
2164
|
+
* `config.format_option = " %-18s : %s"` sets format of options in help message. (default: `" %-18s : %s"`)
|
2165
|
+
* `config.format_action = " %-18s : %s"` sets format of actions in help message. (default: `" %-18s : %s"`)
|
2166
|
+
* `config.format_usage = " $ %s"` sets format of usage in help message. (default: `" $ %s"`)
|
2167
|
+
* `config.format_avvrev = " %-10s => %s"` sets format of abbreviations in output of `-L abbrev` option. (default: `" %-10s => %s"`)
|
2168
|
+
* `config.format_usage = " $ %s"` sets format of usage in help message. (default: `" $ %s"`)
|
2169
|
+
* `config.format_category = " $-18s : %s""` sets format of category prefixes in output of `-L category` option. (default: `nil` which means to use value of `config.format_action`)
|
1344
2170
|
|
1345
|
-
File:
|
2171
|
+
File: ex41.rb
|
1346
2172
|
|
1347
2173
|
```ruby
|
1348
|
-
|
2174
|
+
# coding: utf-8
|
1349
2175
|
require 'benry/cmdapp'
|
1350
2176
|
|
1351
|
-
config = Benry::CmdApp::Config.new("sample app", "1.0.0")
|
1352
|
-
|
1353
|
-
|
1354
|
-
config.class.instance_methods(false).each do |name|
|
1355
|
-
next if name =~ /=$/
|
1356
|
-
next if ! config.class.method_defined?("#{name}=")
|
1357
|
-
val = config.__send__(name)
|
1358
|
-
puts "%-25s = %s" % ["config.#{name}", val.inspect]
|
2177
|
+
config = Benry::CmdApp::Config.new("sample app", "1.0.0", app_name: "Sample App")
|
2178
|
+
config.each(sort: false) do |name, val|
|
2179
|
+
puts "config.%-20s = %s" % [name, val.inspect]
|
1359
2180
|
end
|
1360
2181
|
```
|
1361
2182
|
|
1362
2183
|
Output:
|
1363
2184
|
|
1364
2185
|
```console
|
1365
|
-
[bash]$ ruby
|
1366
|
-
config.app_desc
|
1367
|
-
config.app_version
|
1368
|
-
config.app_name
|
1369
|
-
config.app_command
|
1370
|
-
config.
|
1371
|
-
config.
|
1372
|
-
config.
|
1373
|
-
config.
|
1374
|
-
config.
|
1375
|
-
config.
|
1376
|
-
config.
|
1377
|
-
config.
|
1378
|
-
config.
|
1379
|
-
config.
|
1380
|
-
config.
|
1381
|
-
config.
|
1382
|
-
config.
|
1383
|
-
config.
|
1384
|
-
config.
|
1385
|
-
config.
|
1386
|
-
config.
|
1387
|
-
config.
|
2186
|
+
[bash]$ ruby ex41.rb
|
2187
|
+
config.app_desc = "sample app"
|
2188
|
+
config.app_version = "1.0.0"
|
2189
|
+
config.app_name = "Sample App"
|
2190
|
+
config.app_command = "ex41.rb" # == File.basename($0)
|
2191
|
+
config.app_usage = nil
|
2192
|
+
config.app_detail = nil
|
2193
|
+
config.default_action = nil
|
2194
|
+
config.help_description = nil
|
2195
|
+
config.help_postamble = nil
|
2196
|
+
config.format_option = " %-18s : %s"
|
2197
|
+
config.format_action = " %-18s : %s"
|
2198
|
+
config.format_usage = " $ %s"
|
2199
|
+
config.format_category = nil
|
2200
|
+
config.deco_command = "\e[1m%s\e[0m" # bold
|
2201
|
+
config.deco_header = "\e[1;34m%s\e[0m" # bold, blue
|
2202
|
+
config.deco_extra = "\e[2m%s\e[0m" # gray color
|
2203
|
+
config.deco_strong = "\e[1m%s\e[0m" # bold
|
2204
|
+
config.deco_weak = "\e[2m%s\e[0m" # gray color
|
2205
|
+
config.deco_hidden = "\e[2m%s\e[0m" # gray color
|
2206
|
+
config.deco_debug = "\e[2m%s\e[0m" # gray color
|
2207
|
+
config.deco_error = "\e[31m%s\e[0m" # red
|
2208
|
+
config.option_help = true
|
2209
|
+
config.option_version = true
|
2210
|
+
config.option_list = true
|
2211
|
+
config.option_topic = :hidden
|
2212
|
+
config.option_all = true
|
2213
|
+
config.option_verbose = false
|
2214
|
+
config.option_quiet = false
|
2215
|
+
config.option_color = false
|
2216
|
+
config.option_debug = :hidden
|
2217
|
+
config.option_trace = false
|
2218
|
+
config.option_dryrun = false
|
2219
|
+
config.backtrace_ignore_rexp = nil
|
2220
|
+
config.trace_mode = nil
|
2221
|
+
```
|
2222
|
+
|
2223
|
+
You may notice that the value of `config.option_debug` is `:hidden`.
|
2224
|
+
If value of `config.option_xxxx` is `:hidden`, then corresponding global option is enabled as hidden option.
|
2225
|
+
Therefore you can see `--debug` option in help message if you add `-h` and `-a` (or `--all`) option.
|
2226
|
+
|
2227
|
+
Help message:
|
2228
|
+
|
2229
|
+
```console
|
2230
|
+
$ ruby ex37.rb -h -a # !!!!
|
2231
|
+
ex37.rb --- sample app
|
2232
|
+
|
2233
|
+
Usage:
|
2234
|
+
$ ex37.rb [<options>] <action> [<arguments>...]
|
2235
|
+
|
2236
|
+
Options:
|
2237
|
+
-h, --help : print help message (of action if specified)
|
2238
|
+
-l, --list : list actions and aliases
|
2239
|
+
-a, --all : list hidden actions/options, too
|
2240
|
+
--debug : debug mode # !!!!
|
2241
|
+
|
2242
|
+
Actions:
|
2243
|
+
help : print help message (of action if specified)
|
2244
|
+
test1 : test action
|
1388
2245
|
```
|
1389
2246
|
|
1390
2247
|
|
@@ -1392,14 +2249,14 @@ config.format_appname = "\e[1m%s\e[0m"
|
|
1392
2249
|
|
1393
2250
|
To add custom global options:
|
1394
2251
|
|
1395
|
-
* (1) Create global option schema object.
|
2252
|
+
* (1) Create a global option schema object.
|
1396
2253
|
* (2) Add custom options to it.
|
1397
2254
|
* (3) Pass it to `Application.new()`.
|
1398
2255
|
|
1399
|
-
File:
|
2256
|
+
File: ex42.rb
|
1400
2257
|
|
1401
2258
|
```ruby
|
1402
|
-
|
2259
|
+
# coding: utf-8
|
1403
2260
|
require 'benry/cmdapp'
|
1404
2261
|
|
1405
2262
|
class SampleAction < Benry::CmdApp::Action
|
@@ -1413,7 +2270,7 @@ end
|
|
1413
2270
|
|
1414
2271
|
## (1) create global option shema
|
1415
2272
|
config = Benry::CmdApp::Config.new("sample app")
|
1416
|
-
schema = Benry::CmdApp::
|
2273
|
+
schema = Benry::CmdApp::GlobalOptionSchema.new(config) # !!!!
|
1417
2274
|
|
1418
2275
|
## (2) add custom options to it
|
1419
2276
|
schema.add(:logging, "--logging", "enable logging") # !!!!
|
@@ -1427,81 +2284,106 @@ exit app.main()
|
|
1427
2284
|
Help message:
|
1428
2285
|
|
1429
2286
|
```console
|
1430
|
-
[bash]$ ruby
|
1431
|
-
|
2287
|
+
[bash]$ ruby ex42.rb -h
|
2288
|
+
ex42.rb --- sample app
|
1432
2289
|
|
1433
2290
|
Usage:
|
1434
|
-
$
|
2291
|
+
$ ex42.rb [<options>] <action> [<arguments>...]
|
1435
2292
|
|
1436
2293
|
Options:
|
1437
|
-
-h, --help : print help message (of action if
|
2294
|
+
-h, --help : print help message (of action if specified)
|
2295
|
+
-l, --list : list actions and aliases
|
2296
|
+
-a, --all : list hidden actions/options, too
|
1438
2297
|
--logging : enable logging # !!!!
|
1439
2298
|
|
1440
2299
|
Actions:
|
2300
|
+
help : print help message (of action if specified)
|
1441
2301
|
test1 : test action
|
1442
2302
|
```
|
1443
2303
|
|
1444
2304
|
To customize global options entirely:
|
1445
2305
|
|
1446
|
-
* (1) Create empty `
|
2306
|
+
* (1) Create empty `GlobalOptionSchema` object.
|
1447
2307
|
* (2) Add global options as you want.
|
1448
2308
|
* (3) Create and execute Application object with it.
|
1449
2309
|
|
1450
|
-
File:
|
2310
|
+
File: ex43.rb
|
1451
2311
|
|
1452
2312
|
```ruby
|
1453
|
-
|
2313
|
+
# coding: utf-8
|
1454
2314
|
require 'benry/cmdapp'
|
1455
2315
|
|
1456
|
-
## (1) Create empty ``
|
1457
|
-
schema = Benry::CmdApp::
|
2316
|
+
## (1) Create empty ``GlobalOptionSchema`` object.
|
2317
|
+
schema = Benry::CmdApp::GlobalOptionSchema.new(nil) # !!!!
|
1458
2318
|
|
1459
2319
|
## (2) Add global options as you want.
|
1460
2320
|
schema.add(:help , "-h, --help" , "print help message")
|
1461
2321
|
schema.add(:version, "-V, --version", "print version")
|
1462
|
-
schema.add(:
|
2322
|
+
schema.add(:list , "-l, --list" , "list actions and aliases")
|
2323
|
+
schema.add(:all , "-a, --all" , "list hidden actions/options, too")
|
1463
2324
|
schema.add(:verbose, "-v, --verbose", "verbose mode")
|
1464
2325
|
schema.add(:quiet , "-q, --quiet" , "quiet mode")
|
1465
|
-
schema.add(:color , "--color[=<on|off>]", "enable/disable color", type: TrueClass)
|
2326
|
+
schema.add(:color , "--color[=<on|off>]", "enable/disable color mode", type: TrueClass)
|
1466
2327
|
schema.add(:debug , "-D, --debug" , "set $DEBUG_MODE to true")
|
1467
2328
|
schema.add(:trace , "-T, --trace" , "report enter into and exit from action")
|
1468
2329
|
|
1469
2330
|
## (3) Create and execute Application object with it.
|
1470
|
-
config = Benry::CmdApp::Config.new("sample app")
|
2331
|
+
config = Benry::CmdApp::Config.new("sample app", "1.0.0")
|
1471
2332
|
app = Benry::CmdApp::Application.new(config, schema) # !!!!
|
1472
2333
|
exit app.main()
|
1473
2334
|
```
|
1474
2335
|
|
2336
|
+
Help message:
|
2337
|
+
|
2338
|
+
```console
|
2339
|
+
[bash]$ ruby ex43.rb -h
|
2340
|
+
ex43.rb (1.0.0) --- sample app
|
2341
|
+
|
2342
|
+
Usage:
|
2343
|
+
$ ex43.rb [<options>] <action> [<arguments>...]
|
2344
|
+
|
2345
|
+
Options:
|
2346
|
+
-h, --help : print help message
|
2347
|
+
-V, --version : print version
|
2348
|
+
-l, --list : list actions and aliases
|
2349
|
+
-a, --all : list hidden actions/options, too
|
2350
|
+
-v, --verbose : verbose mode
|
2351
|
+
-q, --quiet : quiet mode
|
2352
|
+
--color[=<on|off>] : enable/disable color mode
|
2353
|
+
-D, --debug : set $DEBUG_MODE to true
|
2354
|
+
-T, --trace : report enter into and exit from action
|
2355
|
+
|
2356
|
+
Actions:
|
2357
|
+
help : print help message (of action if specified)
|
2358
|
+
```
|
2359
|
+
|
2360
|
+
|
1475
2361
|
|
1476
2362
|
### Customization of Global Option Behaviour
|
1477
2363
|
|
1478
2364
|
* (1) Define subclass of `Application` class.
|
1479
|
-
* (2) Override `#
|
2365
|
+
* (2) Override `#toggle_global_options()` method.
|
1480
2366
|
* (3) Create and execute subclass object of `Application`.
|
1481
2367
|
|
1482
|
-
File:
|
2368
|
+
File: ex44.rb
|
1483
2369
|
|
1484
2370
|
```ruby
|
1485
|
-
|
2371
|
+
# coding: utf-8
|
1486
2372
|
require 'benry/cmdapp'
|
1487
2373
|
|
1488
2374
|
## (1) Define subclass of ``Application`` class.
|
1489
2375
|
class MyApplication < Benry::CmdApp::Application
|
1490
2376
|
|
1491
|
-
## (2) Override ``#
|
1492
|
-
def
|
1493
|
-
super
|
1494
|
-
|
1495
|
-
|
1496
|
-
|
1497
|
-
|
1498
|
-
|
1499
|
-
|
1500
|
-
#
|
1501
|
-
# when :trace ; $TRACE_MODE = val
|
1502
|
-
# else ; # do nothing
|
1503
|
-
# end
|
1504
|
-
#end
|
2377
|
+
## (2) Override ``#toggle_global_options()`` method.
|
2378
|
+
def toggle_global_options(global_opts)
|
2379
|
+
status_code = super
|
2380
|
+
return status_code if status_code # `return 0` means "stop process successfully",
|
2381
|
+
# `return 1` means "stop process as failed".
|
2382
|
+
if global_opts[:logging]
|
2383
|
+
require 'logger'
|
2384
|
+
$logger = Logger.new(STDOUT)
|
2385
|
+
end
|
2386
|
+
return nil # `return nil` means "continue process".
|
1505
2387
|
end
|
1506
2388
|
|
1507
2389
|
end
|
@@ -1514,15 +2396,15 @@ exit app.main()
|
|
1514
2396
|
|
1515
2397
|
Of course, prepending custom module to Application class is also effective way.
|
1516
2398
|
|
1517
|
-
File:
|
2399
|
+
File: ex45.rb
|
1518
2400
|
|
1519
2401
|
```ruby
|
1520
|
-
|
2402
|
+
# coding: utf-8
|
1521
2403
|
require 'benry/cmdapp'
|
1522
2404
|
|
1523
2405
|
module MyApplicationMod
|
1524
2406
|
|
1525
|
-
def
|
2407
|
+
def toggle_global_options(global_opts)
|
1526
2408
|
# ....
|
1527
2409
|
end
|
1528
2410
|
|
@@ -1539,13 +2421,13 @@ exit app.main()
|
|
1539
2421
|
### Custom Hook of Application
|
1540
2422
|
|
1541
2423
|
* (1) Define subclass of Application class.
|
1542
|
-
* (2) Override
|
2424
|
+
* (2) Override `#handle_action()` method.
|
1543
2425
|
* (3) Create and execute custom application object.
|
1544
2426
|
|
1545
|
-
File:
|
2427
|
+
File: ex46.rb
|
1546
2428
|
|
1547
2429
|
```ruby
|
1548
|
-
|
2430
|
+
# coding: utf-8
|
1549
2431
|
require 'benry/cmdapp'
|
1550
2432
|
|
1551
2433
|
class SampleAction < Benry::CmdApp::Action
|
@@ -1560,78 +2442,37 @@ end
|
|
1560
2442
|
## (1) Define subclass of Application class
|
1561
2443
|
class MyApplication < Benry::CmdApp::Application # !!!!
|
1562
2444
|
|
1563
|
-
## (2) Override
|
1564
|
-
def
|
2445
|
+
## (2) Override method
|
2446
|
+
def handle_action(action, args) # !!!!
|
1565
2447
|
#p @config
|
1566
|
-
|
1567
|
-
|
1568
|
-
require 'logger'
|
1569
|
-
$logger = Logger.new(STDOUT)
|
1570
|
-
end
|
1571
|
-
## if return :SKIP, action skipped (not invoked).
|
1572
|
-
#return :SKIP
|
2448
|
+
$logger.debug("action=#{action}, args=#{args.inspect}") if $logger
|
2449
|
+
super # !!!!
|
1573
2450
|
end
|
1574
2451
|
|
1575
|
-
## or:
|
1576
|
-
#def do_handle_global_options(args, global_opts)
|
1577
|
-
# if global_opts[:logging]
|
1578
|
-
# require 'logger'
|
1579
|
-
# $logger = Logger.new(STDOUT)
|
1580
|
-
# end
|
1581
|
-
# super
|
1582
|
-
#end
|
1583
|
-
|
1584
2452
|
end
|
1585
2453
|
|
1586
2454
|
## (3) create and execute custom application object
|
1587
2455
|
config = Benry::CmdApp::Config.new("sample app")
|
1588
|
-
schema = Benry::CmdApp::
|
2456
|
+
schema = Benry::CmdApp::GlobalOptionSchema.new(config)
|
1589
2457
|
schema.add(:logging, "--logging", "enable logging")
|
1590
2458
|
app = MyApplication.new(config, schema) # !!!!
|
1591
2459
|
exit app.main()
|
1592
2460
|
```
|
1593
2461
|
|
1594
|
-
* [EXPERIMENTAL] Instead of defining subclass of Application, you can pass callback block to Application object.
|
1595
|
-
|
1596
|
-
File: ex28.rb
|
1597
|
-
|
1598
|
-
```ruby
|
1599
|
-
#!/usr/bin/env ruby
|
1600
|
-
require 'benry/cmdapp'
|
1601
|
-
|
1602
|
-
class SampleAction < Benry::CmdApp::Action
|
1603
|
-
|
1604
|
-
@action.("test action")
|
1605
|
-
def test1()
|
1606
|
-
$logger.info("logging message") if $logger
|
1607
|
-
end
|
1608
|
-
|
1609
|
-
end
|
1610
|
-
|
1611
|
-
config = Benry::CmdApp::Config.new("sample app")
|
1612
|
-
schema = Benry::CmdApp::AppOptionSchema.new(config)
|
1613
|
-
schema.add(:logging, "--logging", "enable logging")
|
1614
|
-
app = Benry::CmdApp::Application.new(config, schema) do # !!!!
|
1615
|
-
|args, global_opts, config| # !!!!
|
1616
|
-
if global_opts[:logging] # !!!!
|
1617
|
-
require 'logger' # !!!!
|
1618
|
-
$logger = Logger.new(STDOUT) # !!!!
|
1619
|
-
end # !!!!
|
1620
|
-
#:SKIP # !!!!
|
1621
|
-
end # !!!!
|
1622
|
-
exit app.main()
|
1623
|
-
```
|
1624
2462
|
|
2463
|
+
### Customization of Application Help Message
|
1625
2464
|
|
1626
|
-
|
2465
|
+
If you want to just add more text into application help message,
|
2466
|
+
set the followings:
|
1627
2467
|
|
1628
|
-
|
1629
|
-
|
2468
|
+
.* `config.app_detail = <text>` --- print text before 'Usage:' section.
|
2469
|
+
.* `config.help_description = <text>` --- print text after 'Usage:' section as 'Description:' section.
|
2470
|
+
.* `config.help_postamble = {<head> => <text>}` --- print at end of help message.
|
1630
2471
|
|
1631
|
-
File:
|
2472
|
+
File: ex47.rb
|
1632
2473
|
|
1633
2474
|
```ruby
|
1634
|
-
|
2475
|
+
# coding: utf-8
|
1635
2476
|
require 'benry/cmdapp'
|
1636
2477
|
|
1637
2478
|
class SampleAction < Benry::CmdApp::Action
|
@@ -1643,12 +2484,14 @@ class SampleAction < Benry::CmdApp::Action
|
|
1643
2484
|
|
1644
2485
|
end
|
1645
2486
|
|
1646
|
-
config = Benry::CmdApp::Config.new("sample app")
|
1647
|
-
config.app_detail = "
|
1648
|
-
config.
|
1649
|
-
|
2487
|
+
config = Benry::CmdApp::Config.new("sample app", "1.0.0")
|
2488
|
+
config.app_detail = "See https://...." # !!!!
|
2489
|
+
config.help_description = " Bla bla bla" # !!!!
|
2490
|
+
config.help_postamble = [ # !!!!
|
2491
|
+
{"Example:" => " $ <command> hello Alice\n"}, # !!!!
|
2492
|
+
"(Tips: ....)", # !!!!
|
1650
2493
|
] # !!!!
|
1651
|
-
|
2494
|
+
|
1652
2495
|
app = Benry::CmdApp::Application.new(config)
|
1653
2496
|
exit app.main()
|
1654
2497
|
```
|
@@ -1656,288 +2499,337 @@ exit app.main()
|
|
1656
2499
|
Help message:
|
1657
2500
|
|
1658
2501
|
```console
|
1659
|
-
[bash]$ ruby
|
1660
|
-
|
2502
|
+
[bash]$ ruby ex47.rb -h
|
2503
|
+
ex47.rb --- sample app
|
1661
2504
|
|
1662
|
-
|
2505
|
+
See https://.... # !!!!
|
1663
2506
|
|
1664
2507
|
Usage:
|
1665
|
-
$
|
2508
|
+
$ ex47.rb [<options>] <action> [<arguments>...]
|
2509
|
+
|
2510
|
+
Description: # !!!!
|
2511
|
+
Bla bla bla # !!!!
|
1666
2512
|
|
1667
2513
|
Options:
|
1668
|
-
-h, --help : print help message (of action if
|
2514
|
+
-h, --help : print help message (of action if specified)
|
2515
|
+
-l, --list : list actions and aliases
|
2516
|
+
-a, --all : list hidden actions/options, too
|
1669
2517
|
|
1670
2518
|
Actions:
|
1671
2519
|
hello : test action #1
|
1672
2520
|
|
1673
|
-
Example:
|
1674
|
-
$ <command> hello Alice
|
2521
|
+
Example: # !!!!
|
2522
|
+
$ <command> hello Alice # !!!!
|
1675
2523
|
|
1676
|
-
(Tips: ....)
|
2524
|
+
(Tips: ....) # !!!!
|
1677
2525
|
```
|
1678
2526
|
|
1679
2527
|
If you want to change behaviour of building command help message:
|
1680
2528
|
|
1681
|
-
* (1) Define subclass of `Benry::CmdApp::
|
2529
|
+
* (1) Define subclass of `Benry::CmdApp::ApplicationHelpBuilder` class.
|
1682
2530
|
* (2) Override methods.
|
1683
2531
|
* (3) Create an instance object of the class.
|
1684
2532
|
* (4) Pass it to Application object.
|
1685
2533
|
|
1686
|
-
File:
|
2534
|
+
File: ex48.rb
|
1687
2535
|
|
1688
2536
|
```ruby
|
1689
|
-
|
2537
|
+
# coding: utf-8
|
1690
2538
|
require 'benry/cmdapp'
|
1691
2539
|
|
1692
2540
|
class SampleAction < Benry::CmdApp::Action
|
1693
2541
|
|
1694
|
-
@action.("greeting message")
|
2542
|
+
@action.("print greeting message")
|
1695
2543
|
def hello(user="world")
|
1696
2544
|
puts "Hello, #{user}!"
|
1697
2545
|
end
|
1698
2546
|
|
1699
2547
|
end
|
1700
2548
|
|
1701
|
-
## (1) Define subclass of ``Benry::CmdApp::
|
1702
|
-
class MyAppHelpBuilder < Benry::CmdApp::
|
2549
|
+
## (1) Define subclass of ``Benry::CmdApp::ApplicationHelpBuilder`` class.
|
2550
|
+
class MyAppHelpBuilder < Benry::CmdApp::ApplicationHelpBuilder
|
1703
2551
|
|
1704
2552
|
## (2) Override methods.
|
1705
|
-
def build_help_message(all
|
1706
|
-
super
|
1707
|
-
end
|
1708
|
-
def build_preamble(all=false)
|
2553
|
+
def build_help_message(gschema, all: false)
|
1709
2554
|
super
|
1710
2555
|
end
|
1711
|
-
def
|
2556
|
+
def section_preamble()
|
1712
2557
|
super
|
1713
2558
|
end
|
1714
|
-
def
|
2559
|
+
def section_usage()
|
1715
2560
|
super
|
1716
2561
|
end
|
1717
|
-
def
|
2562
|
+
def section_options(global_opts_schema, all: false)
|
1718
2563
|
super
|
1719
2564
|
end
|
1720
|
-
def
|
2565
|
+
def section_actions(include_aliases=true, all: false)
|
1721
2566
|
super
|
1722
2567
|
end
|
1723
|
-
def
|
2568
|
+
def section_postamble()
|
1724
2569
|
super
|
1725
2570
|
end
|
2571
|
+
### optional (for `-L <topic>` option)
|
2572
|
+
#def section_candidates(prefix, all: false); super; end
|
2573
|
+
#def section_aliases(all: false); super; end
|
2574
|
+
#def section_abbrevs(all: false); super; end
|
2575
|
+
#def section_categories(depth=0, all: false); super; end
|
1726
2576
|
end
|
1727
2577
|
|
1728
2578
|
## (3) Create an instance object of the class.
|
1729
2579
|
config = Benry::CmdApp::Config.new("sample app")
|
1730
|
-
schema = Benry::CmdApp::
|
2580
|
+
schema = Benry::CmdApp::GlobalOptionSchema.new(config)
|
1731
2581
|
schema.add(:logging, "--logging", "enable logging")
|
1732
|
-
|
2582
|
+
app_help_builder = MyAppHelpBuilder.new(config) # !!!!
|
1733
2583
|
|
1734
2584
|
## (4) Pass it to Application object.
|
1735
|
-
app = Benry::CmdApp::Application.new(config, schema,
|
2585
|
+
app = Benry::CmdApp::Application.new(config, schema, app_help_builder) # !!!!
|
1736
2586
|
exit app.main()
|
1737
2587
|
```
|
1738
2588
|
|
1739
2589
|
More simple way:
|
1740
2590
|
|
1741
|
-
* (1) Create a module and override methods of `Benry::CmdApp::
|
1742
|
-
* (2) Prepend it to `Benry::CmdApp::
|
2591
|
+
* (1) Create a module and override methods of `Benry::CmdApp::ApplicationHelpBuilder` class.
|
2592
|
+
* (2) Prepend it to `Benry::CmdApp::ApplicationHelpBuilder` class.
|
1743
2593
|
* (3) Create and execute Application object.
|
1744
2594
|
|
1745
|
-
File:
|
2595
|
+
File: ex49.rb
|
1746
2596
|
|
1747
2597
|
```ruby
|
1748
|
-
|
2598
|
+
# coding: utf-8
|
1749
2599
|
require 'benry/cmdapp'
|
1750
2600
|
|
1751
2601
|
class SampleAction < Benry::CmdApp::Action
|
1752
2602
|
|
1753
|
-
@action.("greeting message")
|
2603
|
+
@action.("print greeting message")
|
1754
2604
|
def hello(user="world")
|
1755
2605
|
puts "Hello, #{user}!"
|
1756
2606
|
end
|
1757
2607
|
|
1758
2608
|
end
|
1759
2609
|
|
1760
|
-
## (1) Create a module and override methods of ``
|
2610
|
+
## (1) Create a module and override methods of ``ApplicationHelpBuilder`` class.
|
1761
2611
|
module MyHelpBuilderMod
|
1762
|
-
def build_help_message(all
|
2612
|
+
def build_help_message(gschema, all: false)
|
1763
2613
|
super
|
1764
2614
|
end
|
1765
|
-
def
|
2615
|
+
def section_preamble()
|
1766
2616
|
super
|
1767
2617
|
end
|
1768
|
-
def
|
2618
|
+
def section_usage()
|
1769
2619
|
super
|
1770
2620
|
end
|
1771
|
-
def
|
2621
|
+
def section_options(global_opts_schema, all: false)
|
1772
2622
|
super
|
1773
2623
|
end
|
1774
|
-
def
|
2624
|
+
def section_actions(include_aliases=true, all: false)
|
1775
2625
|
super
|
1776
2626
|
end
|
1777
|
-
def
|
1778
|
-
super
|
1779
|
-
end
|
1780
|
-
def heading(str)
|
2627
|
+
def section_postamble()
|
1781
2628
|
super
|
1782
2629
|
end
|
2630
|
+
### optional (for `-L <topic>` option)
|
2631
|
+
#def section_candidates(prefix, all: false); super; end
|
2632
|
+
#def section_aliases(all: false); super; end
|
2633
|
+
#def section_abbrevs(all: false); super; end
|
2634
|
+
#def section_categories(depth=0, all: false); super; end
|
1783
2635
|
end
|
1784
2636
|
|
1785
|
-
## (2) Prepend it to ``Benry::CmdApp::
|
1786
|
-
Benry::CmdApp::
|
2637
|
+
## (2) Prepend it to ``Benry::CmdApp::ApplicationHelpBuilder`` class.
|
2638
|
+
Benry::CmdApp::ApplicationHelpBuilder.prepend(MyHelpBuilderMod)
|
1787
2639
|
|
1788
|
-
## (3)
|
1789
|
-
|
1790
|
-
app = Benry::CmdApp::Application.new(config)
|
1791
|
-
exit app.main()
|
2640
|
+
## (3) Run application.
|
2641
|
+
exit Benry::CmdApp.main("sample app")
|
1792
2642
|
```
|
1793
2643
|
|
1794
2644
|
|
1795
2645
|
### Customization of Action Help Message
|
1796
2646
|
|
1797
2647
|
If you want to just add more text into action help message,
|
1798
|
-
pass
|
2648
|
+
pass the following keyword arguments to `@action.()`.
|
1799
2649
|
|
1800
|
-
|
2650
|
+
* `detail: <text>` --- printed before 'Usage:' section.
|
2651
|
+
* `description: <text>` --- printed after 'Usage:' section as 'Description:' section, like `man` command in UNIX.
|
2652
|
+
* `postamble: {<header> => <text>}` --- printed at end of help message as a dedicated section.
|
2653
|
+
|
2654
|
+
File: ex50.rb
|
1801
2655
|
|
1802
2656
|
```ruby
|
1803
|
-
|
2657
|
+
# coding: utf-8
|
1804
2658
|
require 'benry/cmdapp'
|
1805
2659
|
|
1806
2660
|
class SampleAction < Benry::CmdApp::Action
|
1807
2661
|
|
1808
2662
|
@action.("test action #1",
|
1809
|
-
detail: "
|
1810
|
-
|
2663
|
+
detail: "See https://....", # !!!!
|
2664
|
+
description: " Bla bla bla", # !!!!
|
2665
|
+
postamble: {"Example:" => " ...."}) # !!!!
|
1811
2666
|
def hello(user="world")
|
1812
2667
|
puts "Hello, #{user}!"
|
1813
2668
|
end
|
1814
2669
|
|
1815
2670
|
end
|
1816
2671
|
|
1817
|
-
|
1818
|
-
app = Benry::CmdApp::Application.new(config)
|
1819
|
-
exit app.main()
|
2672
|
+
exit Benry::CmdApp.main("sample app")
|
1820
2673
|
```
|
1821
2674
|
|
1822
2675
|
Help message:
|
1823
2676
|
|
1824
2677
|
```console
|
1825
|
-
[bash]$ ruby
|
1826
|
-
|
2678
|
+
[bash]$ ruby ex50.rb -h hello
|
2679
|
+
ex50.rb hello --- test action #1
|
1827
2680
|
|
1828
|
-
|
2681
|
+
See https://.... # !!!!
|
1829
2682
|
|
1830
2683
|
Usage:
|
1831
|
-
$
|
2684
|
+
$ ex50.rb hello [<user>]
|
1832
2685
|
|
1833
|
-
|
2686
|
+
Description: # !!!!
|
2687
|
+
Bla bla bla # !!!!
|
2688
|
+
|
2689
|
+
Example:
|
2690
|
+
.... # !!!!
|
1834
2691
|
```
|
1835
2692
|
|
1836
2693
|
If you want to change behaviour of building action help message:
|
1837
2694
|
|
1838
|
-
* (1)
|
1839
|
-
* (2)
|
1840
|
-
* (3) Create
|
2695
|
+
* (1) Define subclass of `ActionHelpBuilder` class.
|
2696
|
+
* (2) Override methods.
|
2697
|
+
* (3) Create an instance object of the class.
|
2698
|
+
* (4) Pass it to Application object.
|
1841
2699
|
|
1842
|
-
File:
|
2700
|
+
File: ex51.rb
|
1843
2701
|
|
1844
2702
|
```ruby
|
1845
|
-
#!/usr/bin/env ruby
|
1846
2703
|
require 'benry/cmdapp'
|
1847
2704
|
|
1848
2705
|
class SampleAction < Benry::CmdApp::Action
|
1849
2706
|
|
1850
|
-
@action.("greeting message")
|
2707
|
+
@action.("print greeting message")
|
1851
2708
|
def hello(user="world")
|
1852
2709
|
puts "Hello, #{user}!"
|
1853
2710
|
end
|
1854
2711
|
|
1855
2712
|
end
|
1856
2713
|
|
1857
|
-
## (1)
|
1858
|
-
|
1859
|
-
|
2714
|
+
## (1) Define subclass of ``ActionHelpBuilder`` class.
|
2715
|
+
class MyActionHelpBuilder < Benry::CmdApp::ActionHelpBuilder
|
2716
|
+
## (2) Override methods.
|
2717
|
+
def build_help_message(metadata, all: false)
|
1860
2718
|
super
|
1861
2719
|
end
|
1862
|
-
def
|
2720
|
+
def section_preamble(metadata)
|
1863
2721
|
super
|
1864
2722
|
end
|
1865
|
-
def
|
2723
|
+
def section_usage(metadata, all: false)
|
1866
2724
|
super
|
1867
2725
|
end
|
1868
|
-
def
|
2726
|
+
def section_description(metadata)
|
1869
2727
|
super
|
1870
2728
|
end
|
1871
|
-
def
|
2729
|
+
def section_options(metadata, all: false)
|
1872
2730
|
super
|
1873
2731
|
end
|
1874
|
-
def
|
2732
|
+
def section_postamble(metadata)
|
1875
2733
|
super
|
1876
2734
|
end
|
1877
2735
|
end
|
1878
2736
|
|
1879
|
-
## (
|
1880
|
-
Benry::CmdApp::ActionHelpBuilder.prepend(MyActionHelpBuilderMod) # !!!!
|
1881
|
-
|
1882
|
-
## (3) Create and execute Application object.
|
2737
|
+
## (3) Create an instance object of the class.
|
1883
2738
|
config = Benry::CmdApp::Config.new("sample app")
|
1884
|
-
|
2739
|
+
action_help_builder = MyActionHelpBuilder.new(config)
|
2740
|
+
|
2741
|
+
## (4) Pass it to Application object.
|
2742
|
+
schema = Benry::CmdApp::GlobalOptionSchema.new(config)
|
2743
|
+
app = Benry::CmdApp::Application.new(config, schema, nil, action_help_builder)
|
1885
2744
|
exit app.main()
|
1886
2745
|
```
|
1887
2746
|
|
1888
2747
|
Another way:
|
1889
2748
|
|
1890
|
-
* (1)
|
1891
|
-
* (2)
|
1892
|
-
* (3)
|
2749
|
+
* (1) Create a module and override methods of `Benry::CmdApp::ActionHelpBuilder` class.
|
2750
|
+
* (2) Prepend it to `Benry::CmdApp::ActionHelpBuilder` class.
|
2751
|
+
* (3) Run application.
|
1893
2752
|
|
1894
|
-
File:
|
2753
|
+
File: ex52.rb
|
1895
2754
|
|
1896
2755
|
```ruby
|
1897
|
-
|
2756
|
+
# coding: utf-8
|
1898
2757
|
require 'benry/cmdapp'
|
1899
2758
|
|
1900
2759
|
class SampleAction < Benry::CmdApp::Action
|
1901
2760
|
|
1902
|
-
@action.("greeting message")
|
2761
|
+
@action.("print greeting message")
|
1903
2762
|
def hello(user="world")
|
1904
2763
|
puts "Hello, #{user}!"
|
1905
2764
|
end
|
1906
2765
|
|
1907
2766
|
end
|
1908
2767
|
|
1909
|
-
## (1)
|
1910
|
-
|
1911
|
-
def build_help_message(
|
2768
|
+
## (1) Create a module and override methods of ``ActionHelpBuilder`` class.
|
2769
|
+
module MyActionHelpBuilderMod
|
2770
|
+
def build_help_message(metadata, all: false)
|
1912
2771
|
super
|
1913
2772
|
end
|
1914
|
-
def
|
2773
|
+
def section_preamble(metadata)
|
1915
2774
|
super
|
1916
2775
|
end
|
1917
|
-
def
|
2776
|
+
def section_usage(metadata, all: false)
|
1918
2777
|
super
|
1919
2778
|
end
|
1920
|
-
def
|
2779
|
+
def section_description(metadata)
|
1921
2780
|
super
|
1922
2781
|
end
|
1923
|
-
def
|
2782
|
+
def section_options(metadata, all: false)
|
1924
2783
|
super
|
1925
2784
|
end
|
1926
|
-
def
|
2785
|
+
def section_postamble(metadata)
|
1927
2786
|
super
|
1928
2787
|
end
|
1929
2788
|
end
|
1930
2789
|
|
1931
|
-
## (2)
|
1932
|
-
Benry::CmdApp.
|
1933
|
-
remove_const :ACTION_HELP_BUILDER_CLASS
|
1934
|
-
const_set :ACTION_HELP_BUILDER_CLASS, MyActionHelpBuilder
|
1935
|
-
end
|
2790
|
+
## (2) Prepend it to ``Benry::CmdApp::ActionHelpBuilder`` class.
|
2791
|
+
Benry::CmdApp::ActionHelpBuilder.prepend(MyActionHelpBuilderMod) # !!!!
|
1936
2792
|
|
1937
|
-
## (3)
|
1938
|
-
|
1939
|
-
|
1940
|
-
|
2793
|
+
## (3) Run application.
|
2794
|
+
exit Benry::CmdApp::main("sample app")
|
2795
|
+
```
|
2796
|
+
|
2797
|
+
|
2798
|
+
### Customization of Section Title in Help Message
|
2799
|
+
|
2800
|
+
If you want to change section titles such as 'Options:' or 'Actions:'
|
2801
|
+
in the help message, override the constants representing section titles.
|
2802
|
+
|
2803
|
+
The following constants are defined in `BaseHelperBuilder` class.
|
2804
|
+
|
2805
|
+
```ruby
|
2806
|
+
module Benry::CmdApp
|
2807
|
+
class BaseHelpBuilder
|
2808
|
+
HEADER_USAGE = "Usage:"
|
2809
|
+
HEADER_DESCRIPTION = "Description:"
|
2810
|
+
HEADER_OPTIONS = "Options:"
|
2811
|
+
HEADER_ACTIONS = "Actions:"
|
2812
|
+
HEADER_ALIASES = "Aliases:"
|
2813
|
+
HEADER_ABBREVS = "Abbreviations:"
|
2814
|
+
HEADER_CATEGORIES = "Categories:"
|
2815
|
+
```
|
2816
|
+
|
2817
|
+
You can override them in `ApplicationHelpBuilder` or `ActionHelpBuilder`
|
2818
|
+
classes which are subclass of `BaseHandlerBuilder` class.
|
2819
|
+
|
2820
|
+
```ruby
|
2821
|
+
## for example
|
2822
|
+
Benry::CmdApp::ApplicationHelpBuilder::HEADER_ACTIONS = "ACTIONS:"
|
2823
|
+
Benry::CmdApp::ActionHelpBuilder::HEADER_OPTIONS = "OPTIONS:"
|
2824
|
+
```
|
2825
|
+
|
2826
|
+
If you want to change just decoration of section titles,
|
2827
|
+
set `config.deco_header`.
|
2828
|
+
|
2829
|
+
```ruby
|
2830
|
+
config = Benry::CmdApp::Config.new("Test App", "1.0.0")
|
2831
|
+
config.deco_header = "\e[1;34m%s\e[0m" # bold, blue
|
2832
|
+
#config.deco_header = "\e[1;4m%s\e[0m" # bold, underline
|
1941
2833
|
```
|
1942
2834
|
|
1943
2835
|
|
@@ -1945,11 +2837,25 @@ exit app.main()
|
|
1945
2837
|
## Q & A
|
1946
2838
|
|
1947
2839
|
|
1948
|
-
### Q: How to
|
2840
|
+
### Q: How to show all backtraces of exception?
|
2841
|
+
|
2842
|
+
A: Add `--deubg` option.
|
2843
|
+
Benry-CmdApp catches exceptions and handles their backtrace
|
2844
|
+
automatically in default, but doesn't catch them when `--debug`
|
2845
|
+
option is specified.
|
2846
|
+
|
2847
|
+
|
2848
|
+
### Q: How to specify description to arguments of actions?
|
2849
|
+
|
2850
|
+
A: Can't. It is possible to specify description to actions or options,
|
2851
|
+
but not possible to arguments of actions.
|
2852
|
+
|
2853
|
+
|
2854
|
+
### Q: How to append some tasks to an existing action?
|
1949
2855
|
|
1950
2856
|
A: (a) Use method alias, or (b) use prepend.
|
1951
2857
|
|
1952
|
-
File:
|
2858
|
+
File: ex61.rb
|
1953
2859
|
|
1954
2860
|
```ruby
|
1955
2861
|
require 'benry/cmdapp'
|
@@ -1970,7 +2876,7 @@ end
|
|
1970
2876
|
|
1971
2877
|
## (a) use method alias
|
1972
2878
|
class SampleAction # open existing class
|
1973
|
-
alias __old_hello hello # alias
|
2879
|
+
alias __old_hello hello # alias for existing method
|
1974
2880
|
def hello(user="world") # override existing method
|
1975
2881
|
puts "---- >8 ---- >8 ----"
|
1976
2882
|
__old_hello(user) # call original method
|
@@ -1988,31 +2894,34 @@ module SampleMod # define new module
|
|
1988
2894
|
end
|
1989
2895
|
SampleAction.prepend(SampleMod) # prepend it to existing class
|
1990
2896
|
|
1991
|
-
|
1992
|
-
app = Benry::CmdApp::Application.new(config)
|
1993
|
-
exit app.main()
|
2897
|
+
exit Benry::CmdApp.main("sample app")
|
1994
2898
|
```
|
1995
2899
|
|
1996
2900
|
Output:
|
1997
2901
|
|
1998
2902
|
```console
|
1999
|
-
[bash]$ ruby
|
2903
|
+
[bash]$ ruby ex61.rb hello
|
2000
2904
|
---- >8 ---- >8 ----
|
2001
2905
|
Hello, world!
|
2002
2906
|
---- 8< ---- 8< ----
|
2003
2907
|
|
2004
|
-
[bash]$ ruby
|
2908
|
+
[bash]$ ruby ex61.rb hi Alice
|
2005
2909
|
~~~~ >8 ~~~~ >8 ~~~~
|
2006
2910
|
Hi, Alice!
|
2007
2911
|
~~~~ 8< ~~~~ 8< ~~~~
|
2008
2912
|
```
|
2009
2913
|
|
2010
2914
|
|
2011
|
-
### Q: How to
|
2915
|
+
### Q: How to delete an existing action/alias?
|
2012
2916
|
|
2013
|
-
A:
|
2917
|
+
A: Call `Benry::CmdApp.undef_action("<action>")` or `Benry::CmdApp.undef_alias("<alias>")`.
|
2014
2918
|
|
2015
|
-
|
2919
|
+
|
2920
|
+
### Q: How to re-define an existing action?
|
2921
|
+
|
2922
|
+
A: First remove the existing action, then re-define the action.
|
2923
|
+
|
2924
|
+
File: ex62.rb
|
2016
2925
|
|
2017
2926
|
```ruby
|
2018
2927
|
require 'benry/cmdapp'
|
@@ -2026,7 +2935,7 @@ class SampleAction < Benry::CmdApp::Action
|
|
2026
2935
|
|
2027
2936
|
end
|
2028
2937
|
|
2029
|
-
Benry::CmdApp.
|
2938
|
+
Benry::CmdApp.undef_action("hello") # !!!!
|
2030
2939
|
|
2031
2940
|
class OtherAction < Benry::CmdApp::Action
|
2032
2941
|
|
@@ -2037,38 +2946,34 @@ class OtherAction < Benry::CmdApp::Action
|
|
2037
2946
|
|
2038
2947
|
end
|
2039
2948
|
|
2040
|
-
|
2041
|
-
app = Benry::CmdApp::Application.new(config)
|
2042
|
-
exit app.main()
|
2949
|
+
exit Benry::CmdApp.main("sample app")
|
2043
2950
|
```
|
2044
2951
|
|
2045
2952
|
Help message:
|
2046
2953
|
|
2047
2954
|
```console
|
2048
|
-
[bash]$ ruby
|
2049
|
-
|
2955
|
+
[bash]$ ruby ex62.rb -h
|
2956
|
+
ex62.rb --- sample app
|
2050
2957
|
|
2051
2958
|
Usage:
|
2052
|
-
$
|
2959
|
+
$ ex62.rb [<options>] <action> [<arguments>...]
|
2053
2960
|
|
2054
2961
|
Options:
|
2055
|
-
-h, --help : print help message (of action if
|
2962
|
+
-h, --help : print help message (of action if specified)
|
2963
|
+
-l, --list : list actions and aliases
|
2964
|
+
-a, --all : list hidden actions/options, too
|
2056
2965
|
|
2057
2966
|
Actions:
|
2058
2967
|
hello : other action # !!!!
|
2968
|
+
help : print help message (of action if specified)
|
2059
2969
|
```
|
2060
2970
|
|
2061
2971
|
|
2062
|
-
### Q: How to
|
2063
|
-
|
2064
|
-
A: Call `Benry::CmdApp.delete_action("<action>")` or `Benry::CmdApp.delete_alias("<alias>")`.
|
2065
|
-
|
2066
|
-
|
2067
|
-
### Q: How to Show Entering Into or Exitting From Action?
|
2972
|
+
### Q: How to show entering into or exitting from actions?
|
2068
2973
|
|
2069
2974
|
A: Set `config.option_trace = true` and pass `-T` (or `--trace`) option.
|
2070
2975
|
|
2071
|
-
File:
|
2976
|
+
File: ex63.rb
|
2072
2977
|
|
2073
2978
|
```ruby
|
2074
2979
|
require 'benry/cmdapp'
|
@@ -2082,120 +2987,123 @@ class SampleAction < Benry::CmdApp::Action
|
|
2082
2987
|
|
2083
2988
|
@action.("build")
|
2084
2989
|
def build()
|
2085
|
-
|
2990
|
+
run_once("prepare")
|
2086
2991
|
puts "... build something ..."
|
2087
2992
|
end
|
2088
2993
|
|
2089
2994
|
end
|
2090
2995
|
|
2091
|
-
|
2092
|
-
|
2093
|
-
app = Benry::CmdApp::Application.new(config)
|
2094
|
-
exit app.main()
|
2996
|
+
exit Benry::CmdApp.main("sample app", "1.0.0",
|
2997
|
+
option_trace: true) # !!!! (or `:hidden`)
|
2095
2998
|
```
|
2096
2999
|
|
2097
3000
|
Output:
|
2098
3001
|
|
2099
3002
|
```console
|
2100
|
-
[bash]$ ruby
|
2101
|
-
|
2102
|
-
|
3003
|
+
[bash]$ ruby ex63.rb --trace build # !!!!
|
3004
|
+
### enter: build
|
3005
|
+
### enter: prepare
|
2103
3006
|
... prepare something ...
|
2104
|
-
|
3007
|
+
### exit: prepare
|
2105
3008
|
... build something ...
|
2106
|
-
|
3009
|
+
### exit: build
|
2107
3010
|
```
|
2108
3011
|
|
2109
3012
|
|
2110
|
-
### Q: How to
|
3013
|
+
### Q: How to enable/disable color mode?
|
2111
3014
|
|
2112
3015
|
A: Set `config.option_color = true` and pass `--color=on` or `--color=off` option.
|
2113
3016
|
|
2114
|
-
File:
|
3017
|
+
File: ex64.rb
|
2115
3018
|
|
2116
3019
|
```ruby
|
2117
3020
|
require 'benry/cmdapp'
|
2118
3021
|
|
2119
3022
|
class SampleAction < Benry::CmdApp::Action
|
2120
3023
|
|
2121
|
-
@action.("greeting message")
|
3024
|
+
@action.("print greeting message")
|
2122
3025
|
def hello(user="world")
|
2123
3026
|
puts "Hello, #{user}!"
|
2124
3027
|
end
|
2125
3028
|
|
2126
3029
|
end
|
2127
3030
|
|
2128
|
-
|
2129
|
-
|
2130
|
-
app = Benry::CmdApp::Application.new(config)
|
2131
|
-
exit app.main()
|
3031
|
+
exit Benry::CmdApp.main("sample app",
|
3032
|
+
option_color: true) # !!!!
|
2132
3033
|
```
|
2133
3034
|
|
2134
3035
|
Help message:
|
2135
3036
|
|
2136
3037
|
```console
|
2137
|
-
[bash]$ ruby
|
2138
|
-
|
3038
|
+
[bash]$ ruby ex64.rb -h
|
3039
|
+
ex64.rb --- sample app
|
2139
3040
|
|
2140
3041
|
Usage:
|
2141
|
-
$
|
3042
|
+
$ ex64.rb [<options>] <action> [<arguments>...]
|
2142
3043
|
|
2143
3044
|
Options:
|
2144
|
-
-h, --help : print help message (of action if
|
3045
|
+
-h, --help : print help message (of action if specified)
|
3046
|
+
-l, --list : list actions and aliases
|
3047
|
+
-a, --all : list hidden actions/options, too
|
2145
3048
|
--color[=<on|off>] : enable/disable color # !!!!
|
2146
3049
|
|
2147
3050
|
Actions:
|
2148
|
-
hello : greeting message
|
3051
|
+
hello : print greeting message
|
2149
3052
|
|
2150
|
-
[bash]$ ruby
|
3053
|
+
[bash]$ ruby ex64.rb -h --color=off # !!!!
|
2151
3054
|
|
2152
|
-
[bash]$ ruby
|
3055
|
+
[bash]$ ruby ex64.rb -h --color=on # !!!!
|
3056
|
+
[bash]$ ruby ex64.rb -h --color # !!!!
|
2153
3057
|
```
|
2154
3058
|
|
2155
3059
|
|
2156
|
-
### Q: How to
|
3060
|
+
### Q: How to define `-vvv` style option?
|
2157
3061
|
|
2158
3062
|
A: Provide block parameter on `@option.()`.
|
2159
3063
|
|
2160
|
-
File:
|
3064
|
+
File: ex65.rb
|
2161
3065
|
|
2162
3066
|
```ruby
|
2163
3067
|
require 'benry/cmdapp'
|
2164
3068
|
|
2165
3069
|
class TestAction < Benry::CmdApp::Action
|
2166
3070
|
|
2167
|
-
@action.("
|
2168
|
-
@option.(:
|
2169
|
-
|
2170
|
-
|
2171
|
-
|
2172
|
-
|
2173
|
-
|
2174
|
-
} # !!!!
|
2175
|
-
def test(path: [])
|
2176
|
-
puts "path=#{path.inspect}" #=> path=["/tmp", "/var/tmp"]
|
3071
|
+
@action.("set verbose level")
|
3072
|
+
@option.(:verbose, "-v", "verbose level") {|opts, key, val| # !!!!
|
3073
|
+
opts[key] ||= 0 # !!!!
|
3074
|
+
opts[key] += 1 # !!!!
|
3075
|
+
} # !!!!
|
3076
|
+
def test_(verbose: 0)
|
3077
|
+
puts "verbose=#{verbose}"
|
2177
3078
|
end
|
2178
3079
|
|
2179
3080
|
end
|
2180
3081
|
|
2181
|
-
|
2182
|
-
app = Benry::CmdApp::Application.new(config)
|
2183
|
-
exit app.main()
|
3082
|
+
exit Benry::CmdApp.main("test app")
|
2184
3083
|
```
|
2185
3084
|
|
2186
3085
|
Output:
|
2187
3086
|
|
2188
3087
|
```console
|
2189
|
-
[bash]$ ruby
|
2190
|
-
|
3088
|
+
[bash]$ ruby ex65.rb test -v # !!!!
|
3089
|
+
verbose=1
|
3090
|
+
[bash]$ ruby ex65.rb test -vv # !!!!
|
3091
|
+
verbose=2
|
3092
|
+
[bash]$ ruby ex65.rb test -vvv # !!!!
|
3093
|
+
verbose=3
|
2191
3094
|
```
|
2192
3095
|
|
2193
3096
|
|
2194
|
-
### Q: How to
|
3097
|
+
### Q: How to show global option `-L <topic>` in help message?
|
3098
|
+
|
3099
|
+
A: Set `config.option_topic = true` (default: `:hidden`).
|
3100
|
+
|
3101
|
+
|
3102
|
+
### Q: How to specify detailed description of options?
|
2195
3103
|
|
2196
3104
|
A: Add `detail:` keyword argument to `@option.()`.
|
2197
3105
|
|
2198
|
-
File:
|
3106
|
+
File: ex66.rb
|
2199
3107
|
|
2200
3108
|
```ruby
|
2201
3109
|
require 'benry/cmdapp'
|
@@ -2204,99 +3112,48 @@ class TestAction < Benry::CmdApp::Action
|
|
2204
3112
|
|
2205
3113
|
@action.("detailed description test")
|
2206
3114
|
@option.(:mode, "-m <mode>", "output mode", detail: <<"END")
|
2207
|
-
|
2208
|
-
|
2209
|
-
|
3115
|
+
v, verbose: print many output
|
3116
|
+
q, quiet: print litte output
|
3117
|
+
c, compact: print summary output
|
2210
3118
|
END
|
2211
|
-
def
|
3119
|
+
def test_(mode: nil)
|
2212
3120
|
puts "mode=#{mode.inspect}"
|
2213
3121
|
end
|
2214
3122
|
|
2215
3123
|
end
|
2216
3124
|
|
2217
|
-
|
2218
|
-
app = Benry::CmdApp::Application.new(config)
|
2219
|
-
exit app.main()
|
3125
|
+
exit Benry::CmdApp.main("test app")
|
2220
3126
|
```
|
2221
3127
|
|
2222
3128
|
Help message:
|
2223
3129
|
|
2224
3130
|
```console
|
2225
|
-
[bash]$ ruby
|
2226
|
-
|
3131
|
+
[bash]$ ruby ex66.rb -h test
|
3132
|
+
ex66.rb test --- detailed description test
|
2227
3133
|
|
2228
3134
|
Usage:
|
2229
|
-
$
|
3135
|
+
$ ex66.rb test [<options>]
|
2230
3136
|
|
2231
3137
|
Options:
|
2232
3138
|
-m <mode> : output mode
|
2233
|
-
|
2234
|
-
|
2235
|
-
|
2236
|
-
```
|
2237
|
-
|
2238
|
-
|
2239
|
-
### Q: How to Copy All Options from Other Action?
|
2240
|
-
|
2241
|
-
A: Use `@copy_options.()`.
|
2242
|
-
|
2243
|
-
File: ex47.rb
|
2244
|
-
|
2245
|
-
```ruby
|
2246
|
-
require 'benry/cmdapp'
|
2247
|
-
|
2248
|
-
class SampleAction < Benry::CmdApp::Action
|
2249
|
-
|
2250
|
-
@action.("test action #1")
|
2251
|
-
@option.(:verbose, "-v, --verbose", "verbose mode")
|
2252
|
-
@option.(:file, "-f, --file=<file>", "filename")
|
2253
|
-
@option.(:indent, "-i, --indent[=<N>]", "indent")
|
2254
|
-
def test1(verbose: false, file: nil, indent: nil)
|
2255
|
-
puts "verbose=#{verbose}, file=#{file}, indent=#{indent}"
|
2256
|
-
end
|
2257
|
-
|
2258
|
-
@action.("test action #2")
|
2259
|
-
@copy_options.("test1") # !!!! copy options from test1 !!!!
|
2260
|
-
@option.(:debug, "-D, --debug", "debug mode")
|
2261
|
-
def test2(verbose: false, file: nil, indent: nil, debug: false)
|
2262
|
-
puts "verbose=#{verbose}, file=#{file}, indent=#{indent}, debug=#{debug}"
|
2263
|
-
end
|
2264
|
-
|
2265
|
-
end
|
2266
|
-
|
2267
|
-
config = Benry::CmdApp::Config.new("sample app")
|
2268
|
-
app = Benry::CmdApp::Application.new(config)
|
2269
|
-
exit app.main()
|
2270
|
-
```
|
2271
|
-
|
2272
|
-
Help message of `test2` action:
|
2273
|
-
|
2274
|
-
```console
|
2275
|
-
[bash]$ ruby ex47.rb -h test2
|
2276
|
-
ex47.rb test2 -- test action #2
|
2277
|
-
|
2278
|
-
Usage:
|
2279
|
-
$ ex47.rb test2 [<options>]
|
2280
|
-
|
2281
|
-
Options:
|
2282
|
-
-v, --verbose : verbose mode # copied!!
|
2283
|
-
-f, --file=<file> : filename # copied!!
|
2284
|
-
-i, --indent[=<N>] : indent # copied!!
|
2285
|
-
-D, --debug : debug mode
|
3139
|
+
v, verbose: print many output
|
3140
|
+
q, quiet: print litte output
|
3141
|
+
c, compact: print summary output
|
2286
3142
|
```
|
2287
3143
|
|
2288
3144
|
|
2289
|
-
|
3145
|
+
<!--
|
3146
|
+
### Q: What is the difference between `category(alias_for:)` and `category(action:)`?
|
2290
3147
|
|
2291
3148
|
A: The former defines an alias, and the latter doesn't.
|
2292
3149
|
|
2293
|
-
File:
|
3150
|
+
File: ex67.rb
|
2294
3151
|
|
2295
3152
|
```ruby
|
2296
3153
|
require 'benry/cmdapp'
|
2297
3154
|
|
2298
3155
|
class AaaAction < Benry::CmdApp::Action
|
2299
|
-
|
3156
|
+
category "aaa:", alias_for: "print"
|
2300
3157
|
|
2301
3158
|
@action.("test #1")
|
2302
3159
|
def print_()
|
@@ -2306,7 +3163,7 @@ class AaaAction < Benry::CmdApp::Action
|
|
2306
3163
|
end
|
2307
3164
|
|
2308
3165
|
class BbbAction < Benry::CmdApp::Action
|
2309
|
-
|
3166
|
+
category "bbb:", action: "print"
|
2310
3167
|
|
2311
3168
|
@action.("test #2")
|
2312
3169
|
def print_()
|
@@ -2315,156 +3172,173 @@ class BbbAction < Benry::CmdApp::Action
|
|
2315
3172
|
|
2316
3173
|
end
|
2317
3174
|
|
2318
|
-
|
2319
|
-
app = Benry::CmdApp::Application.new(config)
|
2320
|
-
exit app.main()
|
3175
|
+
exit Benry::CmdApp.main("sample app")
|
2321
3176
|
```
|
2322
3177
|
|
2323
3178
|
Help message:
|
2324
3179
|
|
2325
3180
|
```console
|
2326
|
-
[bash]$ ruby
|
2327
|
-
|
3181
|
+
[bash]$ ruby ex67.rb -h
|
3182
|
+
ex67.rb --- sample app
|
2328
3183
|
|
2329
3184
|
Usage:
|
2330
|
-
$
|
3185
|
+
$ ex67.rb [<options>] <action> [<arguments>...]
|
2331
3186
|
|
2332
3187
|
Options:
|
2333
|
-
-h, --help : print help message (of action if
|
3188
|
+
-h, --help : print help message (of action if specified)
|
3189
|
+
-l, --list : list actions and aliases
|
3190
|
+
-L <topic> : topic list (actions|aliases|categories|abbrevs)
|
3191
|
+
-a, --all : list hidden actions/options, too
|
2334
3192
|
|
2335
3193
|
Actions:
|
2336
|
-
aaa : alias
|
3194
|
+
aaa : alias for 'aaa:print' action # !!!!
|
2337
3195
|
aaa:print : test #1
|
2338
3196
|
bbb : test #2 # !!!!
|
3197
|
+
help : print help message (of action if specified)
|
2339
3198
|
```
|
2340
3199
|
|
2341
|
-
In the above example, alias `aaa` is defined due to `
|
2342
|
-
and action `bbb` is not an alias due to `
|
3200
|
+
In the above example, alias `aaa` is defined due to `category(alias_for:)`,
|
3201
|
+
and action `bbb` is not an alias due to `category(action:)`.
|
3202
|
+
-->
|
2343
3203
|
|
2344
3204
|
|
2345
|
-
### Q: How to
|
3205
|
+
### Q: How to list only aliases (or actions) excluding actions (or aliases) ?
|
2346
3206
|
|
2347
|
-
A:
|
3207
|
+
A: Specify global option `-L alias` or `-L action`.
|
3208
|
+
|
3209
|
+
```console
|
3210
|
+
[bash]$ ruby gitexample.rb -l
|
3211
|
+
Actions:
|
3212
|
+
git : alias for 'git:status'
|
3213
|
+
git:stage : put changes of files into staging area
|
3214
|
+
git:staged : show changes in staging area
|
3215
|
+
git:status : show status in compact format
|
3216
|
+
git:unstage : remove changes from staging area
|
3217
|
+
stage : alias for 'git:stage'
|
3218
|
+
staged : alias for 'git:staged'
|
3219
|
+
unstage : alias for 'git:unstage'
|
3220
|
+
|
3221
|
+
### list only aliases (ordered by action name automatically)
|
3222
|
+
[bash]$ ruby gitexample.rb -L alias # !!!!
|
3223
|
+
Aliases:
|
3224
|
+
stage : alias for 'git:stage'
|
3225
|
+
staged : alias for 'git:staged'
|
3226
|
+
git : alias for 'git:status'
|
3227
|
+
unstage : alias for 'git:unstage'
|
3228
|
+
|
3229
|
+
### list only actions
|
3230
|
+
[bash]$ ruby gitexample.rb -L action # !!!!
|
3231
|
+
Actions:
|
3232
|
+
git:stage : put changes of files into staging area
|
3233
|
+
git:staged : show changes in staging area
|
3234
|
+
git:status : show status in compact format
|
3235
|
+
git:unstage : remove changes from staging area
|
3236
|
+
```
|
3237
|
+
|
3238
|
+
Notice that `-L alias` sorts aliases by action names.
|
3239
|
+
This is the intended behaviour.
|
2348
3240
|
|
2349
|
-
|
3241
|
+
|
3242
|
+
### Q: How to change the order of options in help message?
|
3243
|
+
|
3244
|
+
A: Call `GlobalOptionSchema#reorder_options()`.
|
3245
|
+
|
3246
|
+
File: ex68.rb
|
2350
3247
|
|
2351
3248
|
```ruby
|
2352
3249
|
require 'benry/cmdapp'
|
2353
3250
|
|
2354
3251
|
config = Benry::CmdApp::Config.new("sample app", "1.0.0",
|
2355
|
-
|
3252
|
+
option_verbose: true,
|
2356
3253
|
option_quiet: true,
|
2357
3254
|
option_color: true,
|
2358
3255
|
)
|
2359
|
-
schema = Benry::CmdApp::
|
2360
|
-
keys = [:
|
2361
|
-
schema.
|
3256
|
+
schema = Benry::CmdApp::GlobalOptionSchema.new(config)
|
3257
|
+
keys = [:verbose, :quiet, :color, :help, :version, :all, :target, :list] # !!!!
|
3258
|
+
schema.reorder_options(*keys) # !!!!
|
2362
3259
|
app = Benry::CmdApp::Application.new(config, schema)
|
2363
3260
|
## or:
|
2364
3261
|
#app = Benry::CmdApp::Application.new(config)
|
2365
|
-
#app.schema.
|
3262
|
+
#app.schema.reorder_options(*keys) # !!!!
|
2366
3263
|
exit app.main()
|
2367
3264
|
```
|
2368
3265
|
|
2369
3266
|
Help message:
|
2370
3267
|
|
2371
3268
|
```console
|
2372
|
-
[bash]$ ruby
|
2373
|
-
|
3269
|
+
[bash]$ ruby ex68.rb -h
|
3270
|
+
ex68.rb (1.0.0) --- sample app
|
2374
3271
|
|
2375
3272
|
Usage:
|
2376
|
-
$
|
3273
|
+
$ ex68.rb [<options>] <action> [<arguments>...]
|
2377
3274
|
|
2378
3275
|
Options:
|
2379
|
-
-
|
3276
|
+
-v, --verbose : verbose mode
|
2380
3277
|
-q, --quiet : quiet mode
|
2381
|
-
--color[=<on|off>] :
|
2382
|
-
-h, --help : print help message (of action if
|
3278
|
+
--color[=<on|off>] : color mode
|
3279
|
+
-h, --help : print help message (of action if specified)
|
2383
3280
|
-V, --version : print version
|
3281
|
+
-a, --all : list hidden actions/options, too
|
3282
|
+
-L <topic> : topic list (actions|aliases|categories|abbrevs)
|
3283
|
+
-l, --list : list actions and aliases
|
2384
3284
|
|
2385
3285
|
Actions:
|
2386
|
-
|
3286
|
+
help : print help message (of action if specified)
|
2387
3287
|
```
|
2388
3288
|
|
2389
3289
|
|
2390
|
-
### Q:
|
3290
|
+
### Q: How to add metadata to actions or options?
|
2391
3291
|
|
2392
|
-
A:
|
3292
|
+
A: Pass `tag:` keyword argument to `@action.()` or `@option.()`.
|
2393
3293
|
|
2394
|
-
|
3294
|
+
* `tag:` keyword argument accept any type of value such as symbol, string, array, and so on.
|
3295
|
+
* Currenty, Benry-CmdApp doesn't provide the good way to use it effectively.
|
3296
|
+
This feature may be used by command-line application or framework based on Benry-CmdApp.
|
3297
|
+
|
3298
|
+
File: ex69.rb
|
2395
3299
|
|
2396
3300
|
```ruby
|
2397
3301
|
require 'benry/cmdapp'
|
2398
3302
|
|
2399
3303
|
class SampleAction < Benry::CmdApp::Action
|
2400
3304
|
|
2401
|
-
@action.("
|
2402
|
-
|
2403
|
-
|
2404
|
-
|
2405
|
-
|
2406
|
-
|
3305
|
+
@action.("print greeting message", tag: :important) # !!!!
|
3306
|
+
@option.(:repeat, "-r <N>", "repeat N times", tag: :important) # !!!!
|
3307
|
+
def hello(user="world", repeat: nil)
|
3308
|
+
(repeat || 1).times do
|
3309
|
+
puts "Hello, #{user}!"
|
3310
|
+
end
|
2407
3311
|
end
|
2408
3312
|
|
2409
3313
|
end
|
2410
3314
|
|
2411
|
-
|
2412
|
-
app = Benry::CmdApp::Application.new(config)
|
2413
|
-
exit app.main()
|
2414
|
-
```
|
2415
|
-
|
2416
|
-
Help message:
|
2417
|
-
|
2418
|
-
```console
|
2419
|
-
[bash]$ ruby ex50.rb -h
|
2420
|
-
ex50.rb -- sample app
|
2421
|
-
|
2422
|
-
Usage:
|
2423
|
-
$ ex50.rb [<options>] [<action> [<arguments>...]]
|
2424
|
-
|
2425
|
-
Options:
|
2426
|
-
-h, --help : print help message (of action if action specified)
|
2427
|
-
|
2428
|
-
Actions:
|
2429
|
-
test1 : empasized # !!!! printed with underline !!!!
|
2430
|
-
test2 : weaken # !!!! printed in gray color !!!!
|
3315
|
+
exit Benry::CmdApp.main("sample app")
|
2431
3316
|
```
|
2432
3317
|
|
2433
3318
|
|
2434
|
-
### Q:
|
2435
|
-
|
2436
|
-
A: Yes. Pass `tag:` keyword argument to `@action.()` or `@option.()`.
|
3319
|
+
### Q: How to remove common help option from all actions?
|
2437
3320
|
|
2438
|
-
|
2439
|
-
* Currenty, Benry::CmdApp doesn't provide the good way to use it effectively.
|
2440
|
-
This feature may be used by command-line application or framework based on Benry::CmdApp.
|
3321
|
+
A: Clears `Benry::CmdApp::ACTION_SHARED_OPTIONS` which is an array of option item.
|
2441
3322
|
|
2442
|
-
File:
|
3323
|
+
File: ex70.rb
|
2443
3324
|
|
2444
3325
|
```ruby
|
2445
3326
|
require 'benry/cmdapp'
|
2446
3327
|
|
2447
|
-
|
3328
|
+
arr = Benry::CmdApp::ACTION_SHARED_OPTIONS
|
3329
|
+
arr.clear()
|
3330
|
+
```
|
2448
3331
|
|
2449
|
-
@action.("print greeting message", tag: :important) # !!!!
|
2450
|
-
@option.(:repeat, "-r <N>", "repeat N times", tag: :important) # !!!!
|
2451
|
-
def hello(user="world", repeat: nil)
|
2452
|
-
(repeat || 1).times do
|
2453
|
-
puts "Hello, #{user}!"
|
2454
|
-
end
|
2455
|
-
end
|
2456
3332
|
|
2457
|
-
|
3333
|
+
### Q: Is it possible to show details of actions and aliases?
|
2458
3334
|
|
2459
|
-
|
2460
|
-
|
2461
|
-
exit app.main()
|
2462
|
-
```
|
3335
|
+
A: Try global option `-L metadata`.
|
3336
|
+
It prints detailed data of actions and aliases in YAML format.
|
2463
3337
|
|
2464
3338
|
|
2465
|
-
### Q: How to
|
3339
|
+
### Q: How to make error messages I18Ned?
|
2466
3340
|
|
2467
|
-
A: Currently not supported. May be supported in
|
3341
|
+
A: Currently not supported. May be supported in a future release.
|
2468
3342
|
|
2469
3343
|
|
2470
3344
|
|