subcommander 1.0.1 → 1.0.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.
- data/lib/subcommander.rb +30 -20
- metadata +3 -3
data/lib/subcommander.rb
CHANGED
@@ -2,23 +2,19 @@
|
|
2
2
|
require 'optparse'
|
3
3
|
|
4
4
|
module Subcommander
|
5
|
-
|
6
|
-
def pop! stack
|
7
|
-
[stack[0], stack[1..-1]]
|
8
|
-
end
|
9
|
-
|
5
|
+
|
10
6
|
class Subcommander
|
11
7
|
attr_accessor :desc,
|
12
8
|
:args,
|
13
9
|
:version
|
14
10
|
|
15
|
-
def initialize
|
11
|
+
def initialize args
|
16
12
|
@commands = {}
|
17
13
|
@descriptions = {}
|
18
14
|
@file_order = []
|
19
|
-
unless
|
20
|
-
args =
|
21
|
-
@sub_cmd
|
15
|
+
unless args.empty?
|
16
|
+
@args = args.clone()
|
17
|
+
@sub_cmd = @args.shift()
|
22
18
|
else
|
23
19
|
@args = []
|
24
20
|
end
|
@@ -27,7 +23,7 @@ module Subcommander
|
|
27
23
|
|
28
24
|
def subcommand cmd_name, desc, &block
|
29
25
|
name = cmd_name.to_s
|
30
|
-
sub_cmd = Subcommand.new(@args.clone, cmd_name, desc, &block)
|
26
|
+
sub_cmd = Subcommand.new(@args.clone(), cmd_name, desc, &block)
|
31
27
|
@commands[name] = sub_cmd
|
32
28
|
@file_order << name
|
33
29
|
end
|
@@ -43,22 +39,17 @@ module Subcommander
|
|
43
39
|
sub_cmd.go!
|
44
40
|
end
|
45
41
|
|
46
|
-
private
|
47
42
|
def print_usage
|
48
43
|
puts "\n#{@desc}\n\n"
|
49
44
|
puts " Subcommands:"
|
50
45
|
@file_order.each do |cmd|
|
51
46
|
puts " #{slop(cmd)} #{@commands[cmd].desc}"
|
52
47
|
end
|
53
|
-
puts
|
48
|
+
puts
|
49
|
+
puts "v " + @version if @version
|
54
50
|
exit
|
55
51
|
end
|
56
52
|
|
57
|
-
def slop cmd_name
|
58
|
-
max_len = @file_order.max { |a,b| a.length <=> b.length }.length
|
59
|
-
cmd_name + ' ' * (max_len - cmd_name.length)
|
60
|
-
end
|
61
|
-
|
62
53
|
def print_help
|
63
54
|
if @args.empty?
|
64
55
|
print_usage
|
@@ -69,12 +60,18 @@ module Subcommander
|
|
69
60
|
end
|
70
61
|
exit
|
71
62
|
end
|
72
|
-
end
|
63
|
+
end
|
64
|
+
|
65
|
+
private
|
66
|
+
def slop cmd_name
|
67
|
+
max_len = @file_order.max { |a,b| a.length <=> b.length }.length
|
68
|
+
cmd_name + ' ' * (max_len - cmd_name.length)
|
69
|
+
end
|
73
70
|
end
|
74
71
|
|
75
72
|
def subcommander
|
76
73
|
unless defined?(@@subcommander)
|
77
|
-
@@subcommander = Subcommander.new
|
74
|
+
@@subcommander = Subcommander.new(ARGV)
|
78
75
|
end
|
79
76
|
@@subcommander
|
80
77
|
end
|
@@ -99,6 +96,7 @@ module Subcommander
|
|
99
96
|
@opts.banner = ""
|
100
97
|
@arity = -1 # Don't care how many args
|
101
98
|
@props = {}
|
99
|
+
@sub_cmdr = nil
|
102
100
|
block.call(self)
|
103
101
|
end
|
104
102
|
|
@@ -112,7 +110,7 @@ module Subcommander
|
|
112
110
|
|
113
111
|
def opt *orig_args
|
114
112
|
args = orig_args.clone()
|
115
|
-
prop
|
113
|
+
prop = args.shift()
|
116
114
|
@opts.on *args do |arg|
|
117
115
|
@props[prop] = arg
|
118
116
|
end
|
@@ -123,6 +121,10 @@ module Subcommander
|
|
123
121
|
end
|
124
122
|
|
125
123
|
def go!
|
124
|
+
if @sub_cmdr
|
125
|
+
@sub_cmdr.go!
|
126
|
+
return
|
127
|
+
end
|
126
128
|
parse_args()
|
127
129
|
num_remaining = @props[:remaining_args].length
|
128
130
|
if @arity > -1 && num_remaining != @arity
|
@@ -132,6 +134,14 @@ module Subcommander
|
|
132
134
|
@block.call if @block
|
133
135
|
end
|
134
136
|
|
137
|
+
def subcommand name, desc, &block
|
138
|
+
unless @sub_cmdr
|
139
|
+
@sub_cmdr = Subcommander.new(@args.clone())
|
140
|
+
@sub_cmdr.desc = " The #{@name} subcommand has the following subcommands:"
|
141
|
+
end
|
142
|
+
@sub_cmdr.subcommand(name, desc, &block)
|
143
|
+
end
|
144
|
+
|
135
145
|
def print_help
|
136
146
|
if @help
|
137
147
|
puts
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: subcommander
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 1.0.
|
9
|
+
- 2
|
10
|
+
version: 1.0.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Tom Santos
|