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.
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