subcommander 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/subcommander.rb +30 -20
  2. metadata +3 -3
@@ -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 ARGV.empty?
20
- args = ARGV.clone
21
- @sub_cmd, @args = pop!(args)
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 "\nv " + @version if @version
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, args = pop!(args)
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: 21
4
+ hash: 19
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
8
  - 0
9
- - 1
10
- version: 1.0.1
9
+ - 2
10
+ version: 1.0.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Tom Santos