luban-cli 0.3.0 → 0.3.1
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/CHANGELOG.md +10 -0
- data/README.md +438 -5
- data/lib/luban/cli/base/argument.rb +4 -2
- data/lib/luban/cli/base/core.rb +5 -3
- data/lib/luban/cli/base/dsl.rb +4 -4
- data/lib/luban/cli/command.rb +4 -0
- data/lib/luban/cli/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2cef4bc2d5883cf60fc715d577ce581b4b99a37d
|
4
|
+
data.tar.gz: f9621b3ad7ef039ff84595cc6dc5950059519019
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1e7ccbaef417438934e5d2a49d587c138d7c230122d0b96241935e3cc211b38e3a755f9c7302268229ccc110ae1d9712b5d08ec7b4e271eb616947020488808a
|
7
|
+
data.tar.gz: cebee1212f04f353fefb7457e0fcd65abd89cf8d4c008139684e497862ba26309fdfbea473c060773ce1865451d6767b33f71c09cf083565efbe4ce0409b70d5
|
data/CHANGELOG.md
CHANGED
@@ -39,3 +39,13 @@ Bug fixes:
|
|
39
39
|
* Apply the correct method creator when defining action method
|
40
40
|
* Dispatch command under the right class context
|
41
41
|
* Show correct command chain between program name and synopsis when composing parser banner
|
42
|
+
|
43
|
+
## Version 0.3.1 (Apr 15, 2015)
|
44
|
+
|
45
|
+
Minor enhancements:
|
46
|
+
* Simplify keyword arguments for dispatch_command and action handler
|
47
|
+
* Include command chain as part of action method name for commands
|
48
|
+
* Enrich README with more documentation
|
49
|
+
|
50
|
+
Bug fixes:
|
51
|
+
* Handle validation for multiple values correctly
|
data/README.md
CHANGED
@@ -6,21 +6,454 @@ Luban::CLI requires Ruby 2.1 or later.
|
|
6
6
|
|
7
7
|
## Installation
|
8
8
|
|
9
|
-
Add this line to your application
|
9
|
+
Add this line to your application Gemfile:
|
10
10
|
|
11
|
-
|
11
|
+
```ruby
|
12
|
+
gem "luban-cli"
|
13
|
+
```
|
12
14
|
|
13
15
|
And then execute:
|
14
16
|
|
15
|
-
|
17
|
+
```
|
18
|
+
$ bundle
|
19
|
+
```
|
16
20
|
|
17
21
|
Or install it yourself as:
|
18
22
|
|
19
|
-
|
23
|
+
```
|
24
|
+
$ gem install luban-cli
|
25
|
+
```
|
20
26
|
|
21
27
|
## Usage
|
22
28
|
|
23
|
-
|
29
|
+
### Simple Example
|
30
|
+
|
31
|
+
```ruby
|
32
|
+
require 'luban/cli'
|
33
|
+
|
34
|
+
class MyApp < Luban::CLI::Application
|
35
|
+
configure do
|
36
|
+
# program "my_app"
|
37
|
+
version "1.0.0"
|
38
|
+
long_desc "Demo app for Luban::CLI"
|
39
|
+
option :prefix, "Prefix to a name, e.g., Mr, Ms, etc.", short: :p
|
40
|
+
option :suffix, "Suffix to a name, e.g., Jr, Sr, etc.", short: :s
|
41
|
+
switch :verbose, "Run in verbose mode", short: :V
|
42
|
+
argument :name, "Name to say hi"
|
43
|
+
action :say_hi
|
44
|
+
end
|
45
|
+
|
46
|
+
def say_hi(cmd:, argv:, args:, opts:)
|
47
|
+
name = compose_name(opts[:prefix], opts[:suffix], args[:name])
|
48
|
+
if opts[:verbose]
|
49
|
+
say_hi_verbosely(name, opts, args)
|
50
|
+
else
|
51
|
+
say_hi_concisely(name)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
protected
|
56
|
+
|
57
|
+
def say_hi_verbosely(name, opts, args)
|
58
|
+
puts "Options: #{opts.inspect}"
|
59
|
+
puts "Arguments: #{args.inspect}"
|
60
|
+
say_hi_concisely(name)
|
61
|
+
end
|
62
|
+
|
63
|
+
def say_hi_concisely(name)
|
64
|
+
puts "Hi, #{name}!"
|
65
|
+
end
|
66
|
+
|
67
|
+
def compose_name(prefix, suffix, name)
|
68
|
+
name = name.capitalize
|
69
|
+
name = "#{prefix.capitalize}. #{name}" unless prefix.nil?
|
70
|
+
name = "#{name} #{suffix.capitalize}." unless suffix.nil?
|
71
|
+
name
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
MyApp.new.run
|
76
|
+
```
|
77
|
+
|
78
|
+
```
|
79
|
+
$ ruby my_app.rb -h
|
80
|
+
Usage: my_app [options] NAME
|
81
|
+
|
82
|
+
Options:
|
83
|
+
-v, --version Show hi version.
|
84
|
+
-p, --prefix PREFIX Prefix to a name, e.g., Mr, Ms, etc.
|
85
|
+
-s, --suffix SUFFIX Suffix to a name, e.g., Jr, Sr, etc.
|
86
|
+
-V, --verbose Run in verbose mode
|
87
|
+
-h, --help Show this help message.
|
88
|
+
|
89
|
+
Arguments:
|
90
|
+
NAME Name to say hi
|
91
|
+
|
92
|
+
Description:
|
93
|
+
Demo app for Luban::CLI
|
94
|
+
|
95
|
+
$ ruby my_app.rb -v
|
96
|
+
my_app 1.0.0
|
97
|
+
|
98
|
+
$ ruby my_app.rb john -p mr -s jr
|
99
|
+
Hi, Mr. John Jr.!
|
100
|
+
|
101
|
+
ruby examples/hi.rb john -p mr -s jr -V
|
102
|
+
Options: {:version=>false, :prefix=>"mr", :suffix=>"jr", :verbose=>true, :help=>false}
|
103
|
+
Arguments: {:name=>"chi"}
|
104
|
+
Hi, Mr. John Jr.!
|
105
|
+
```
|
106
|
+
|
107
|
+
Please refer to [examples](examples) for more sample usage.
|
108
|
+
|
109
|
+
## DSL
|
110
|
+
|
111
|
+
The following is an overview of the Luban::CLI DSL.
|
112
|
+
|
113
|
+
### program
|
114
|
+
|
115
|
+
The name of the application. Default: $0.
|
116
|
+
|
117
|
+
### desc
|
118
|
+
|
119
|
+
A short description of what the application does.
|
120
|
+
|
121
|
+
### long_desc
|
122
|
+
|
123
|
+
A long description of what the application does.
|
124
|
+
|
125
|
+
### argument
|
126
|
+
|
127
|
+
An arguement is a positioned parameter passed from command-line. To declare an argument:
|
128
|
+
|
129
|
+
```ruby
|
130
|
+
argument :name, 'description', **modifiers, &blk
|
131
|
+
```
|
132
|
+
|
133
|
+
The modifiers below can be used:
|
134
|
+
|
135
|
+
* :default - Default value for the argument.
|
136
|
+
* :required - Flag to indicate if the argument is mandatory or not. Default: true.
|
137
|
+
* :multiple - Flag to indicate argument is a list of values or a single value. Default: false.
|
138
|
+
* :type - Value type for the argument. Default: :string.
|
139
|
+
* :match - A regex for argument value matching.
|
140
|
+
* :within - A range or a list of values the argument value to be within.
|
141
|
+
* :assure - A code block for argument value validation.
|
142
|
+
|
143
|
+
If required argument is not provided, Luban::CLI::Base::MissingRequiredArguments will be raised.
|
144
|
+
|
145
|
+
If validation failed, Luban::CLI::Argument::InvalidArgumentValue will be raised.
|
146
|
+
|
147
|
+
Note: An argument with multiple values needs to be positioned at the last argument. Furthermore, you cannot specify more than one arguements with multiple values.
|
148
|
+
|
149
|
+
Here is an example how to use argument:
|
150
|
+
|
151
|
+
```ruby
|
152
|
+
class MyApp < Luban::CLI::Application
|
153
|
+
configure do
|
154
|
+
argument :name, 'Name for an employee'
|
155
|
+
argument :gender, 'Gender for an employee',
|
156
|
+
type: :symbol, within: [:male, :femal]
|
157
|
+
argument :age, 'Age for an employee',
|
158
|
+
type: :integer, assure: ->(age) { age < 60 }
|
159
|
+
argument :level, 'Level for an employee',
|
160
|
+
type: :integer, within: 1..4
|
161
|
+
argument :email, 'Email for an employee',
|
162
|
+
match: /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z/i,
|
163
|
+
multiple: true, required: false
|
164
|
+
action do |**params|
|
165
|
+
puts params.inspect
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
MyApp.new.run
|
171
|
+
```
|
172
|
+
|
173
|
+
```
|
174
|
+
$ ruby my_app.rb
|
175
|
+
Missing required argument(s): NAME, GENDER, LEVEL (Luban::CLI::Base::MissingRequiredArguments)
|
176
|
+
... ...
|
177
|
+
|
178
|
+
$ ruby my_app.rb john male 90
|
179
|
+
Invalid value of argument AGE: 90 (Luban::CLI::Argument::InvalidArgumentValue)
|
180
|
+
... ...
|
181
|
+
|
182
|
+
$ ruby my_app.rb john male 30 2
|
183
|
+
{:cmd=>nil, :argv=>[], :args=>{:name=>"john", :gender=>:male, :age=>30, :level=>2, :email=>nil}, :opts=>{:help=>false}}
|
184
|
+
|
185
|
+
$ ruby my_app.rb john male 30 2 john@company.com
|
186
|
+
{:cmd=>nil, :argv=>[], :args=>{:name=>"john", :gender=>:male, :age=>30, :level=>2, :email=>["john@company.com"]}, :opts=>{:help=>false}}
|
187
|
+
|
188
|
+
$ ruby my_app.rb john male 30 2 john@company.com john@personal.com
|
189
|
+
{:cmd=>nil, :argv=>[], :args=>{:name=>"john", :gender=>:male, :age=>30, :level=>2, :email=>["john@company.com", "john@personal.com"]}, :opts=>{:help=>false}}
|
190
|
+
```
|
191
|
+
|
192
|
+
### option
|
193
|
+
|
194
|
+
An option usually takes an argument, e.g. --require LIBRARIES. To declare an option:
|
195
|
+
|
196
|
+
```ruby
|
197
|
+
option :name, 'description', **modifiers, &blk
|
198
|
+
```
|
199
|
+
|
200
|
+
The extra modifiers below can be used along with all modifiers applicable to arguments:
|
201
|
+
|
202
|
+
* :long - Long style argument name.
|
203
|
+
* :short - Short style argument alias.
|
204
|
+
|
205
|
+
Note: modifier :required is turned off by default. Therefore, all options are not mandatory unless they are declared explicitly.
|
206
|
+
|
207
|
+
Here is an example how to use option:
|
208
|
+
|
209
|
+
```ruby
|
210
|
+
class MyApp < Luban::CLI::Application
|
211
|
+
configure do
|
212
|
+
option :libraries, 'Require the LIBRARIES before executing your script',
|
213
|
+
long: :require, short: :r, multiple: true
|
214
|
+
action do |**params|
|
215
|
+
puts params.inspect
|
216
|
+
end
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
MyApp.new.run
|
221
|
+
```
|
222
|
+
|
223
|
+
```
|
224
|
+
$ ruby my_app.rb --require bundler
|
225
|
+
{:cmd=>nil, :argv=>[], :args=>{}, :opts=>{:libraries=>["bundler"], :help=>false}}
|
226
|
+
|
227
|
+
$ ruby my_app.rb -r bundler,rails
|
228
|
+
{:cmd=>nil, :argv=>[], :args=>{}, :opts=>{:libraries=>["bundler", "rails"], :help=>false}}
|
229
|
+
```
|
230
|
+
|
231
|
+
Occassionally an option might take an optional argument, e.g. --inplace [EXTENSION]. This kind of option is called nullable option. The nullable option is set to true if the optional argument is not provided; otherwise, the value of the option is set to the value of the argument. To declare a nullable option, you can explicitly turn off nullable modifier which is off by default.
|
232
|
+
|
233
|
+
Here is an example how to use nullable option:
|
234
|
+
|
235
|
+
```ruby
|
236
|
+
class MyApp < Luban::CLI::Application
|
237
|
+
configure do
|
238
|
+
option :inplace, 'Edit in place (make backup if EXTENSION supplied)',
|
239
|
+
nullable: true # Turn the option into nullable
|
240
|
+
action do |**params|
|
241
|
+
puts params.inspect
|
242
|
+
end
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
MyApp.new.run
|
247
|
+
```
|
248
|
+
|
249
|
+
```
|
250
|
+
$ ruby my_app.rb
|
251
|
+
{:cmd=>nil, :argv=>[], :args=>{}, :opts=>{:inplace=>nil, :help=>false}}
|
252
|
+
|
253
|
+
$ ruby my_app.rb --inplace
|
254
|
+
{:cmd=>nil, :argv=>[], :args=>{}, :opts=>{:inplace=>true, :help=>false}}
|
255
|
+
|
256
|
+
$ ruby my_app.rb --inplace .bak
|
257
|
+
{:cmd=>nil, :argv=>[], :args=>{}, :opts=>{:inplace=>".bak", :help=>false}}
|
258
|
+
```
|
259
|
+
|
260
|
+
### switch
|
261
|
+
|
262
|
+
A switch is a special option that doesn't take any arguments, e.g., --verbose, --help, etc. To declare a switch:
|
263
|
+
|
264
|
+
```ruby
|
265
|
+
switch :name, 'description', **modifiers, &blk
|
266
|
+
```
|
267
|
+
|
268
|
+
All modifiers applied to an option can be used for a switch except the following:
|
269
|
+
|
270
|
+
* :type - Type for switch is set to :bool (true/false) and it cannot be changed.
|
271
|
+
* :multiple - Set to false to ensure to handle a single value and it cannot be changed.
|
272
|
+
|
273
|
+
Negatable switch is also supported, e.g., --local, --no-local. To declare a negatable switch, you can explicitly turn on negatable modifier which is off by default.
|
274
|
+
|
275
|
+
Here is an example how to use negatable option:
|
276
|
+
|
277
|
+
```ruby
|
278
|
+
class MyApp < Luban::CLI::Application
|
279
|
+
configure do
|
280
|
+
switch :local, 'Check repository locally',
|
281
|
+
negatable: true # Turn the switch into negatable: --local or --no-local
|
282
|
+
action do |**params|
|
283
|
+
puts params.inspect
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
287
|
+
MyApp.new.run
|
288
|
+
```
|
289
|
+
|
290
|
+
### help
|
291
|
+
|
292
|
+
Add a switch for help message display. The modifiers below can be used:
|
293
|
+
|
294
|
+
* :short - Short style switch for help display. Default: :h
|
295
|
+
* :desc - Set a switch description for help display. Default: "Show this help message."
|
296
|
+
|
297
|
+
DSL alias #auto_help is provided which applies default values for the above options.
|
298
|
+
|
299
|
+
The switch of help display is turned on by default unless explicitly turning off when creating an application or a command.
|
300
|
+
|
301
|
+
```ruby
|
302
|
+
class MyApp < Luban::CLI::Application
|
303
|
+
... ...
|
304
|
+
end
|
305
|
+
|
306
|
+
MyApp.new(auto_help: false)
|
307
|
+
```
|
308
|
+
|
309
|
+
### version
|
310
|
+
|
311
|
+
Specify or retrieve the version of the application.
|
312
|
+
|
313
|
+
If calling without any parameters, version previously set is returned.
|
314
|
+
|
315
|
+
If calling with a version, a switch for version display is added to the application. The modifiers below can be used:
|
316
|
+
|
317
|
+
* :short - Set a short style switch for version display. Default: :v
|
318
|
+
* :desc - Set a switch description for version disiplay. Default: "Show #{program_name} version."
|
319
|
+
|
320
|
+
### action
|
321
|
+
|
322
|
+
Specify handler for the CLI application or command.
|
323
|
+
|
324
|
+
It accepts a code block or an instance method name from the application as the action handler. If a code block is given, the code block is executed in the binding of the application. If both a code block and an instance method name are provided, the instance method name is used and the code block is ignored.
|
325
|
+
|
326
|
+
The handler accepts the following keyword arguments:
|
327
|
+
|
328
|
+
* :args - arguments parsed from the command-line
|
329
|
+
* :opts - options parsed from the command-line
|
330
|
+
|
331
|
+
|
332
|
+
### action!
|
333
|
+
|
334
|
+
Same as action, but removes command-line arguments destructively.
|
335
|
+
|
336
|
+
### configure
|
337
|
+
|
338
|
+
This is used to configure CLI application during definition.
|
339
|
+
|
340
|
+
Here is an example for how to configure CLI application:
|
341
|
+
|
342
|
+
```ruby
|
343
|
+
|
344
|
+
class MyApp < Luban::CLI::Application
|
345
|
+
configure do
|
346
|
+
program "my_app"
|
347
|
+
version "1.0.0"
|
348
|
+
long_desc "Demo app for Luban::CLI"
|
349
|
+
option :opt1, "Description for opt1", short: :o
|
350
|
+
switch :swt1, "Description for swt1", short: :s
|
351
|
+
argument :arg1, "Description to arg1"
|
352
|
+
action :do_something
|
353
|
+
end
|
354
|
+
|
355
|
+
def do_something(args:, opts:)
|
356
|
+
... ...
|
357
|
+
end
|
358
|
+
end
|
359
|
+
|
360
|
+
MyApp.new.run
|
361
|
+
|
362
|
+
```
|
363
|
+
|
364
|
+
However, it can be overriden if a configuration block is provided during application instance creation:
|
365
|
+
|
366
|
+
```ruby
|
367
|
+
MyApp.new.run do
|
368
|
+
program "my_app"
|
369
|
+
version "1.0.0"
|
370
|
+
long_desc "Demo app for Luban::CLI"
|
371
|
+
option :opt2, "Description for opt2", short: :p
|
372
|
+
switch :swt2, "Description for swt2", short: :w
|
373
|
+
action :do_something_else
|
374
|
+
end
|
375
|
+
|
376
|
+
```
|
377
|
+
|
378
|
+
## Commands
|
379
|
+
|
380
|
+
Luban::CLI supports commands/subcommands. Commands can also be nested. However, all action handlers should be defined under the the application class, otherwise NoMethodError will be raised.
|
381
|
+
|
382
|
+
```ruby
|
383
|
+
class MyApp < Luban::CLI::Application
|
384
|
+
configure do
|
385
|
+
version '1.0.0'
|
386
|
+
desc 'Short description for the application'
|
387
|
+
long_desc 'Long description for the application'
|
388
|
+
end
|
389
|
+
|
390
|
+
# Define a help command to list all commands or help for one command.
|
391
|
+
auto_help_command
|
392
|
+
|
393
|
+
command :cmd1 do
|
394
|
+
desc 'Description for command 1'
|
395
|
+
|
396
|
+
command :task1 do
|
397
|
+
desc 'Description for task 1'
|
398
|
+
argument :arg1, 'Description for arg1', type: :string
|
399
|
+
action :exec_command1_task1
|
400
|
+
end
|
401
|
+
|
402
|
+
command :task2 do
|
403
|
+
desc 'Description for task 2'
|
404
|
+
option :opt1, 'Description for opt1', type: :integer
|
405
|
+
action :exec_command1_task2
|
406
|
+
end
|
407
|
+
end
|
408
|
+
|
409
|
+
command :cmd2 do
|
410
|
+
desc 'Description for command 1'
|
411
|
+
switch :swt1, 'Description for swt1'
|
412
|
+
action :exec_command2
|
413
|
+
end
|
414
|
+
|
415
|
+
def exec_command1_task1(args:, opts:); puts 'In command 1/task 1'; end
|
416
|
+
def exec_command1_task2(args:, opts:); puts 'In command 1/task 2'; end
|
417
|
+
def exec_command2(args:, opts:); puts 'In command 2'; end
|
418
|
+
end
|
419
|
+
|
420
|
+
MyApp.new.run
|
421
|
+
```
|
422
|
+
|
423
|
+
### Command method/handler
|
424
|
+
|
425
|
+
By default, a new method will be defined for each command under the application class. Usually you don't need to call this method directly. Luban::CLI dispatches the specified command to the corresponding command method/handler properly.
|
426
|
+
|
427
|
+
The command method name is composed of the following, concatenating with an underscore:
|
428
|
+
|
429
|
+
* prefix - Default prefix is "__command_".
|
430
|
+
* command chain
|
431
|
+
* For regular command, it is the command name itself
|
432
|
+
* For nested commands, it is the commands from the top to the bottom one
|
433
|
+
|
434
|
+
In the example above, there are following command methods defined in MyApp:
|
435
|
+
|
436
|
+
* __command_cmd1_task1
|
437
|
+
* __command_cmd1_task2
|
438
|
+
* __command_cmd2
|
439
|
+
|
440
|
+
You can also change the prefix to your preferred one by setting the modifier :prefix when defining a command:
|
441
|
+
|
442
|
+
```ruby
|
443
|
+
command :cmd1, prefix: '__my_prefix_' do
|
444
|
+
... ...
|
445
|
+
end
|
446
|
+
```
|
447
|
+
|
448
|
+
### auto_help_command / help_command
|
449
|
+
|
450
|
+
DSL method #auto_help_command is used to define a command to list all commands or help for one command. Under rare circumstances that you need to customize the help command (i.e., use a different command name like :manual), you can use DSL method #help_command which accepts the same parameters that for #command.
|
451
|
+
|
452
|
+
## Applications
|
453
|
+
|
454
|
+
Luban::CLI provides a base class for cli application, Luban::CLI::Application. You can define your own cli application by inheriting it as examples shown in the previous sections.
|
455
|
+
|
456
|
+
In addition to command-line argument parsing capabilities, Luban::CLI::Application also supports a rc file. For example, if an application called "my_app.rb", it looks up rc file ".my_apprc" under user home when the application starts up. The rc file uses YML format. If rc file is found, the content will be loaded into the instance variable :rc; if rc file is not found, the instance variable :rc will be initialized as an empty hash.
|
24
457
|
|
25
458
|
## Contributing
|
26
459
|
|
@@ -49,7 +49,9 @@ module Luban
|
|
49
49
|
end
|
50
50
|
|
51
51
|
def valid?(value = @value)
|
52
|
-
|
52
|
+
(multiple? ? value : [value]).all? do |v|
|
53
|
+
!missing?(v) and match?(v) and within?(v) and assured?(v)
|
54
|
+
end
|
53
55
|
end
|
54
56
|
|
55
57
|
def missing?(value = @value)
|
@@ -113,7 +115,7 @@ module Luban
|
|
113
115
|
unless err_msg.nil?
|
114
116
|
raise ArgumentError, "Default value for #{kind} #{display_name} #{err_msg}"
|
115
117
|
end
|
116
|
-
unless
|
118
|
+
unless valid?(default)
|
117
119
|
raise ArgumentError, "Invalid default value for #{kind} #{display_name}: #{default.inspect}"
|
118
120
|
end
|
119
121
|
end
|
data/lib/luban/cli/base/core.rb
CHANGED
@@ -21,7 +21,6 @@ module Luban
|
|
21
21
|
|
22
22
|
attr_reader :app
|
23
23
|
attr_reader :prefix
|
24
|
-
attr_reader :action_method
|
25
24
|
attr_reader :program_name
|
26
25
|
attr_reader :options
|
27
26
|
attr_reader :arguments
|
@@ -39,7 +38,6 @@ module Luban
|
|
39
38
|
@app = app
|
40
39
|
@action_name = action_name
|
41
40
|
@prefix = prefix
|
42
|
-
@action_method = "#{@prefix}#{@action_name}"
|
43
41
|
@action_defined = false
|
44
42
|
|
45
43
|
@program_name = default_program_name
|
@@ -62,6 +60,10 @@ module Luban
|
|
62
60
|
|
63
61
|
def default_prefix; ''; end
|
64
62
|
|
63
|
+
def action_method
|
64
|
+
@action_method ||= "#{@prefix}#{@action_name}"
|
65
|
+
end
|
66
|
+
|
65
67
|
def parser
|
66
68
|
@parser ||= create_parser
|
67
69
|
end
|
@@ -90,7 +92,7 @@ module Luban
|
|
90
92
|
end
|
91
93
|
end
|
92
94
|
|
93
|
-
def dispatch_command(context, cmd:, argv
|
95
|
+
def dispatch_command(context, cmd:, argv:)
|
94
96
|
validate_command(cmd)
|
95
97
|
context.send(commands[cmd].action_method, argv)
|
96
98
|
end
|
data/lib/luban/cli/base/dsl.rb
CHANGED
@@ -103,8 +103,8 @@ module Luban
|
|
103
103
|
_base = self
|
104
104
|
parse_method = preserve_argv ? :parse : :parse!
|
105
105
|
define_action_method do |argv = _base.default_argv|
|
106
|
-
_base.send(:process, self, parse_method, argv) do |
|
107
|
-
instance_exec(**
|
106
|
+
_base.send(:process, self, parse_method, argv) do |params|
|
107
|
+
instance_exec(**params, &handler)
|
108
108
|
end
|
109
109
|
end
|
110
110
|
@action_defined = true
|
@@ -126,11 +126,11 @@ module Luban
|
|
126
126
|
show_version
|
127
127
|
else
|
128
128
|
if has_commands?
|
129
|
-
dispatch_command(context,
|
129
|
+
dispatch_command(context, cmd: result[:cmd], argv: result[:argv])
|
130
130
|
else
|
131
131
|
validate_required_options
|
132
132
|
validate_required_arguments
|
133
|
-
yield result
|
133
|
+
yield args: result[:args], opts: result[:opts]
|
134
134
|
end
|
135
135
|
end
|
136
136
|
rescue OptionParser::ParseError, Error => e
|
data/lib/luban/cli/command.rb
CHANGED
data/lib/luban/cli/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: luban-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rubyist Chi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-04-
|
11
|
+
date: 2015-04-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|