luban-cli 0.4.0 → 0.4.2
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 +21 -3
- data/lib/luban/cli/base/commands.rb +5 -19
- data/lib/luban/cli/base/core.rb +3 -2
- data/lib/luban/cli/base/dsl.rb +1 -0
- data/lib/luban/cli/core_refinements.rb +33 -0
- data/lib/luban/cli/version.rb +1 -1
- data/lib/luban/cli.rb +1 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e6a17dc64fcd6ba46e069c6625848100fa33402c
|
4
|
+
data.tar.gz: 7415b6f89e06a8aa7ca5a15f0dd8682a75f6a247
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9ccd92008a1cd6f97e489b42990c86ca9a6c83e99750787fa7dbcd97d9845f962007e2a1d906c05aaea6cdd3854bb6028b9fed25d12f9e84da40fe998b533ab4
|
7
|
+
data.tar.gz: a06c296c1ce5e5564d48d306ac3b13bf0e1f943fca349b89ba025a1cdb0098c79fcbfcd61ec17bbd9694006a71bba8e1055357b0003275d025bbc495bf3f63e4
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,15 @@
|
|
1
1
|
# Change log
|
2
2
|
|
3
|
+
## Version 0.4.1 (Nov 05, 2015)
|
4
|
+
|
5
|
+
Minor enhancements:
|
6
|
+
* After parsing, added any remaining command line arguments to opts[:__remaining__]
|
7
|
+
* This is useful to handle arguments provided after the double hyphen
|
8
|
+
* Used Ruby refinements to re-implement camelcase and snakecase handling
|
9
|
+
|
10
|
+
Bug fixes:
|
11
|
+
* Filter empty default values for help message
|
12
|
+
|
3
13
|
## Version 0.4.0 (Oct 14, 2015)
|
4
14
|
|
5
15
|
New features:
|
data/README.md
CHANGED
@@ -98,9 +98,9 @@ my_app 1.0.0
|
|
98
98
|
$ ruby my_app.rb john -p mr -s jr
|
99
99
|
Hi, Mr. John Jr.!
|
100
100
|
|
101
|
-
ruby
|
102
|
-
Options: {:version=>false, :prefix=>"mr", :suffix=>"jr", :verbose=>true, :help=>false}
|
103
|
-
Arguments: {:name=>"
|
101
|
+
$ ruby my_app.rb john -p mr -s jr -V
|
102
|
+
Options: {:version=>false, :prefix=>"mr", :suffix=>"jr", :verbose=>true, :help=>false, :__remaining__=>[]}
|
103
|
+
Arguments: {:name=>"john"}
|
104
104
|
Hi, Mr. John Jr.!
|
105
105
|
```
|
106
106
|
|
@@ -387,6 +387,24 @@ end
|
|
387
387
|
|
388
388
|
```
|
389
389
|
|
390
|
+
## Option Parsing Termination
|
391
|
+
|
392
|
+
It is a convention that a double hyphen is a signal to stop option interpretation and to read the remaining statements on the command line literally. Luban::CLI supports this convention and stores the remaining statements on the command line, if any, into the keyword argument :opts with a hash key :\__remaining\__, which is passed to the given action handler.
|
393
|
+
|
394
|
+
The following refers to the simple example shown in the section Usage, which demonstrates the parsing result with remaining statements in option parsing termination.
|
395
|
+
|
396
|
+
```ruby
|
397
|
+
$ ruby my_app.rb john -p mr -s jr -V
|
398
|
+
Options: {:version=>false, :prefix=>"mr", :suffix=>"jr", :verbose=>true, :help=>false, :__remaining__=>[]}
|
399
|
+
Arguments: {:name=>"john"}
|
400
|
+
Hi, Mr. John Jr.!
|
401
|
+
|
402
|
+
$ ruby my_app.rb john -p mr -s jr -V -- --test here
|
403
|
+
Options: {:version=>false, :prefix=>"mr", :suffix=>"jr", :verbose=>true, :help=>false, :__remaining__=>["--test", "here"]}
|
404
|
+
Arguments: {:name=>"john"}
|
405
|
+
Hi, Mr. John Jr.!
|
406
|
+
```
|
407
|
+
|
390
408
|
## Commands
|
391
409
|
|
392
410
|
Luban::CLI supports commands/subcommands. Commands can also be nested. However, all action handlers are preferred to be defined under the the application class; otherwise RuntimeError will be raised.
|
@@ -1,6 +1,8 @@
|
|
1
1
|
module Luban
|
2
2
|
module CLI
|
3
3
|
class Base
|
4
|
+
using CoreRefinements
|
5
|
+
|
4
6
|
def command(cmd, base: Command, **opts, &blk)
|
5
7
|
cmd = cmd.to_sym
|
6
8
|
@commands[cmd] = command_class(cmd, base).new(self, cmd, **opts, &blk)
|
@@ -11,9 +13,9 @@ module Luban
|
|
11
13
|
end
|
12
14
|
|
13
15
|
def use_commands(module_name, **opts, &blk)
|
14
|
-
module_class = Object.const_get(
|
16
|
+
module_class = Object.const_get(module_name.camelcase, false)
|
15
17
|
module_class.constants(false).map { |c| module_class.const_get(c, false) }.each do |c|
|
16
|
-
command(
|
18
|
+
command(c.name.snakecase, base: c, **opts, &blk) if c < Command
|
17
19
|
end
|
18
20
|
end
|
19
21
|
|
@@ -32,7 +34,7 @@ module Luban
|
|
32
34
|
protected
|
33
35
|
|
34
36
|
def command_class(cmd, base)
|
35
|
-
class_name = camelcase
|
37
|
+
class_name = cmd.camelcase
|
36
38
|
if command_class_defined?(class_name)
|
37
39
|
get_command_class(class_name)
|
38
40
|
else
|
@@ -51,22 +53,6 @@ module Luban
|
|
51
53
|
def define_command_class(class_name, base)
|
52
54
|
self.class.send(:define_class, class_name, base: base, namespace: self.class)
|
53
55
|
end
|
54
|
-
|
55
|
-
def camelcase(str)
|
56
|
-
str = str.to_s.dup
|
57
|
-
str.gsub!(/(\:|\/)(.?)/){ "::#{$2.upcase}" }
|
58
|
-
str.gsub!(/(?:_+|-+)([a-z])/){ $1.upcase }
|
59
|
-
str.gsub!(/(\A|\s)([a-z])/){ $1 + $2.upcase }
|
60
|
-
str
|
61
|
-
end
|
62
|
-
|
63
|
-
def snakecase(str)
|
64
|
-
str.gsub(/::/, ':').
|
65
|
-
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
66
|
-
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
67
|
-
tr("-", "_").
|
68
|
-
downcase
|
69
|
-
end
|
70
56
|
end
|
71
57
|
end
|
72
58
|
end
|
data/lib/luban/cli/base/core.rb
CHANGED
@@ -96,7 +96,8 @@ module Luban
|
|
96
96
|
|
97
97
|
def undef_singleton_method(method_name)
|
98
98
|
# Undefine methods that are defined in the eigenclass
|
99
|
-
|
99
|
+
singleton_class.send(:undef_method, method_name)
|
100
|
+
#(class << self; self; end).send(:undef_method, method_name)
|
100
101
|
end
|
101
102
|
|
102
103
|
def configure(&blk)
|
@@ -260,7 +261,7 @@ module Luban
|
|
260
261
|
end
|
261
262
|
|
262
263
|
def add_parser_defaults
|
263
|
-
add_section("Defaults", options.values.map(&:default_str))
|
264
|
+
add_section("Defaults", options.values.map(&:default_str).reject { |d| d.empty? })
|
264
265
|
end
|
265
266
|
|
266
267
|
def add_parser_commands
|
data/lib/luban/cli/base/dsl.rb
CHANGED
@@ -131,6 +131,7 @@ module Luban
|
|
131
131
|
else
|
132
132
|
validate_required_options
|
133
133
|
validate_required_arguments
|
134
|
+
result[:opts][:__remaining__] = argv
|
134
135
|
yield args: result[:args], opts: result[:opts]
|
135
136
|
if has_commands?
|
136
137
|
dispatch_command(cmd: result[:cmd], argv: result[:argv])
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Luban
|
2
|
+
module CLI
|
3
|
+
module CoreRefinements
|
4
|
+
refine String do
|
5
|
+
def camelcase
|
6
|
+
str = dup
|
7
|
+
str.gsub!(/(\:|\/)(.?)/){ "::#{$2.upcase}" }
|
8
|
+
str.gsub!(/(?:_+|-+)([a-z])/){ $1.upcase }
|
9
|
+
str.gsub!(/(\A|\s)([a-z])/){ $1 + $2.upcase }
|
10
|
+
str
|
11
|
+
end
|
12
|
+
|
13
|
+
def snakecase
|
14
|
+
gsub(/::/, ':').
|
15
|
+
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
16
|
+
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
17
|
+
tr("-", "_").
|
18
|
+
downcase
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
refine Symbol do
|
23
|
+
def camelcase
|
24
|
+
to_s.camelcase
|
25
|
+
end
|
26
|
+
|
27
|
+
def snakecase
|
28
|
+
to_s.snakecase
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/luban/cli/version.rb
CHANGED
data/lib/luban/cli.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.4.
|
4
|
+
version: 0.4.2
|
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-
|
11
|
+
date: 2015-11-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -63,6 +63,7 @@ files:
|
|
63
63
|
- lib/luban/cli/base/parse.rb
|
64
64
|
- lib/luban/cli/base/switch.rb
|
65
65
|
- lib/luban/cli/command.rb
|
66
|
+
- lib/luban/cli/core_refinements.rb
|
66
67
|
- lib/luban/cli/error.rb
|
67
68
|
- lib/luban/cli/version.rb
|
68
69
|
- luban-cli.gemspec
|