visionmedia-commander 3.0.3 → 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.rdoc +7 -0
- data/Manifest +1 -0
- data/README.rdoc +73 -0
- data/Todo.rdoc +2 -0
- data/commander.gemspec +3 -3
- data/lib/commander/command.rb +4 -0
- data/lib/commander/core_ext/object.rb +1 -1
- data/lib/commander/help_formatters/terminal/help.erb +14 -4
- data/lib/commander/runner.rb +28 -6
- data/lib/commander/version.rb +1 -1
- data/spec/help_formatters/base_spec.rb +0 -7
- data/spec/runner_spec.rb +61 -13
- data/spec/spec_helper.rb +7 -0
- metadata +3 -2
data/History.rdoc
CHANGED
data/Manifest
CHANGED
data/README.rdoc
CHANGED
@@ -138,6 +138,79 @@ simplify common tasks using the following methods:
|
|
138
138
|
# 'Log' action to stdout
|
139
139
|
log "create", "path/to/file.rb"
|
140
140
|
|
141
|
+
== Commander Goodies
|
142
|
+
|
143
|
+
=== Option Defaults
|
144
|
+
|
145
|
+
The options struct passed to #when_called provides a #default method, allowing you
|
146
|
+
to set defaults in a clean manor to options which have not been set.
|
147
|
+
|
148
|
+
command :foo do |c|
|
149
|
+
c.option '--interval SECONDS', Integer, 'Interval in seconds'
|
150
|
+
c.option '--timeout SECONDS', Integer, 'Timeout in seconds'
|
151
|
+
c.when_called do |args, options|
|
152
|
+
options.default \
|
153
|
+
:interval => 2,
|
154
|
+
:timeout => 60
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
=== Command Aliasing
|
159
|
+
|
160
|
+
Aliases can be created using the #alias_command method like below:
|
161
|
+
|
162
|
+
command :'install gem' do |c|
|
163
|
+
c.when_called { puts 'foo' }
|
164
|
+
end
|
165
|
+
alias_command :'gem install', :'install gem'
|
166
|
+
|
167
|
+
Or more complicated aliases can be made, passing any arguments
|
168
|
+
as if it was invoked via the command line:
|
169
|
+
|
170
|
+
command :'install gem' do |c|
|
171
|
+
c.syntax = 'install gem <name> [options]'
|
172
|
+
c.option '--dest DIR', String, 'Destination directory'
|
173
|
+
c.when_called { |args, options| puts "installing #{args.first} to #{options.dest}" }
|
174
|
+
end
|
175
|
+
alias_command :update, :'install gem', 'rubygems', '--dest', 'some_path'
|
176
|
+
|
177
|
+
$ foo update
|
178
|
+
# => installing rubygems to some_path
|
179
|
+
|
180
|
+
=== Command Defaults
|
181
|
+
|
182
|
+
Although working with a sub-command executable framework provides many
|
183
|
+
benefits over a single command implementation, sometimes you still
|
184
|
+
want the ability to create a terse syntax for your command. With that
|
185
|
+
in mind we may use #default_command to help with this. Considering
|
186
|
+
our previous :'install gem' example:
|
187
|
+
|
188
|
+
default_command :update
|
189
|
+
|
190
|
+
$ foo
|
191
|
+
# => installing rubygems to some_path
|
192
|
+
|
193
|
+
Keeping in mind that commander searches for the longest possible match
|
194
|
+
when considering a sub-command, so if you were to pass arguments to foo
|
195
|
+
like below, expecting them to be passed to :update, this would be incorrect,
|
196
|
+
and would end up calling :'install gem', so be careful that the users do
|
197
|
+
not need to use command names within the arguments.
|
198
|
+
|
199
|
+
$ foo install gem
|
200
|
+
# => installing to
|
201
|
+
|
202
|
+
=== Additional Global Help
|
203
|
+
|
204
|
+
Arbitrary help can be added using the following #program symbol:
|
205
|
+
|
206
|
+
program :help, 'Author', 'TJ Holowaychuk <tj@vision-media.ca>'
|
207
|
+
|
208
|
+
Which will output the rest of the help doc, along with:
|
209
|
+
|
210
|
+
AUTHOR:
|
211
|
+
|
212
|
+
TJ Holowaychuk <tj@vision-media.ca>
|
213
|
+
|
141
214
|
== ASCII Tables
|
142
215
|
|
143
216
|
For feature rich ASCII tables for your terminal app check out visionmedia's terminal-table gem at
|
data/Todo.rdoc
CHANGED
@@ -6,6 +6,8 @@
|
|
6
6
|
|
7
7
|
== Minor
|
8
8
|
|
9
|
+
* Add arbitrary help blocks to sub-commands as well
|
10
|
+
* Spec for changing out formatters (mock formatter)
|
9
11
|
* Add optional default command when none is present
|
10
12
|
* Fix multi-word command template creation via `commander init`
|
11
13
|
* Consider global #color method again
|
data/commander.gemspec
CHANGED
@@ -2,17 +2,17 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{commander}
|
5
|
-
s.version = "3.0
|
5
|
+
s.version = "3.1.0"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["TJ Holowaychuk"]
|
9
|
-
s.date = %q{2009-03-
|
9
|
+
s.date = %q{2009-03-13}
|
10
10
|
s.default_executable = %q{commander}
|
11
11
|
s.description = %q{The complete solution for Ruby command-line executables}
|
12
12
|
s.email = %q{tj@vision-media.ca}
|
13
13
|
s.executables = ["commander"]
|
14
14
|
s.extra_rdoc_files = ["bin/commander", "lib/commander/command.rb", "lib/commander/core_ext/array.rb", "lib/commander/core_ext/object.rb", "lib/commander/core_ext/string.rb", "lib/commander/core_ext.rb", "lib/commander/help_formatters/base.rb", "lib/commander/help_formatters/terminal/command_help.erb", "lib/commander/help_formatters/terminal/help.erb", "lib/commander/help_formatters/terminal.rb", "lib/commander/help_formatters.rb", "lib/commander/runner.rb", "lib/commander/user_interaction.rb", "lib/commander/version.rb", "lib/commander.rb", "README.rdoc", "tasks/docs.rake", "tasks/gemspec.rake", "tasks/spec.rake"]
|
15
|
-
s.files = ["bin/commander", "commander.gemspec", "History.rdoc", "lib/commander/command.rb", "lib/commander/core_ext/array.rb", "lib/commander/core_ext/object.rb", "lib/commander/core_ext/string.rb", "lib/commander/core_ext.rb", "lib/commander/help_formatters/base.rb", "lib/commander/help_formatters/terminal/command_help.erb", "lib/commander/help_formatters/terminal/help.erb", "lib/commander/help_formatters/terminal.rb", "lib/commander/help_formatters.rb", "lib/commander/runner.rb", "lib/commander/user_interaction.rb", "lib/commander/version.rb", "lib/commander.rb", "Manifest", "Rakefile", "README.rdoc", "spec/command_spec.rb", "spec/core_ext/array_spec.rb", "spec/core_ext/object_spec.rb", "spec/core_ext/string_spec.rb", "spec/help_formatters/base_spec.rb", "spec/help_formatters/terminal_spec.rb", "spec/runner_spec.rb", "spec/spec_helper.rb", "tasks/docs.rake", "tasks/gemspec.rake", "tasks/spec.rake", "test/pbar", "test/ui", "Todo.rdoc"]
|
15
|
+
s.files = ["bin/commander", "commander.gemspec", "History.rdoc", "lib/commander/command.rb", "lib/commander/core_ext/array.rb", "lib/commander/core_ext/object.rb", "lib/commander/core_ext/string.rb", "lib/commander/core_ext.rb", "lib/commander/help_formatters/base.rb", "lib/commander/help_formatters/terminal/command_help.erb", "lib/commander/help_formatters/terminal/help.erb", "lib/commander/help_formatters/terminal.rb", "lib/commander/help_formatters.rb", "lib/commander/runner.rb", "lib/commander/user_interaction.rb", "lib/commander/version.rb", "lib/commander.rb", "Manifest", "Rakefile", "README.rdoc", "spec/command_spec.rb", "spec/core_ext/array_spec.rb", "spec/core_ext/object_spec.rb", "spec/core_ext/string_spec.rb", "spec/help_formatters/base_spec.rb", "spec/help_formatters/terminal_spec.rb", "spec/runner_spec.rb", "spec/spec_helper.rb", "tasks/docs.rake", "tasks/gemspec.rake", "tasks/spec.rake", "test/foo", "test/pbar", "test/ui", "Todo.rdoc"]
|
16
16
|
s.has_rdoc = true
|
17
17
|
s.homepage = %q{http://github.com/visionmedia/commander}
|
18
18
|
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Commander", "--main", "README.rdoc"]
|
data/lib/commander/command.rb
CHANGED
@@ -16,7 +16,7 @@ class Object
|
|
16
16
|
extend Forwardable
|
17
17
|
include Commander::UI
|
18
18
|
|
19
|
-
def_delegators :$command_runner, :add_command, :command, :program, :run!, :commands, :alias_command
|
19
|
+
def_delegators :$command_runner, :add_command, :command, :program, :run!, :commands, :alias_command, :default_command
|
20
20
|
def_delegators Commander::UI::ProgressBar, :progress
|
21
21
|
|
22
22
|
##
|
@@ -8,14 +8,24 @@
|
|
8
8
|
<%= program :description %>
|
9
9
|
|
10
10
|
<%= $terminal.color "SUB-COMMANDS", :bold %>:
|
11
|
-
<% @commands.each_pair do |name, command|
|
11
|
+
<% @commands.each_pair do |name, command| -%>
|
12
|
+
<% unless alias? name %>
|
12
13
|
<%= "%-20s %s" % [command.name, command.summary || command.description] -%>
|
13
|
-
<% end
|
14
|
+
<% end -%>
|
15
|
+
<% end -%>
|
16
|
+
<% unless @aliases.empty? %>
|
17
|
+
|
18
|
+
<%= $terminal.color "ALIASES", :bold %>:
|
19
|
+
<% @aliases.each do |alias_name, args| %>
|
20
|
+
<%= "%-20s %s %s" % [alias_name, command(alias_name).name, args.join(' ')] -%>
|
21
|
+
<% end -%>
|
22
|
+
<% end -%>
|
14
23
|
<% if program :help -%>
|
24
|
+
|
15
25
|
<% program(:help).each_pair do |title, body| %>
|
16
26
|
<%= $terminal.color title.to_s.upcase, :bold %>:
|
17
|
-
|
27
|
+
|
18
28
|
<%= body %>
|
19
|
-
<% end
|
29
|
+
<% end -%>
|
20
30
|
<% end -%>
|
21
31
|
|
data/lib/commander/runner.rb
CHANGED
@@ -26,7 +26,7 @@ module Commander
|
|
26
26
|
# supplying +args+ for mocking, or arbitrary usage.
|
27
27
|
|
28
28
|
def initialize args = ARGV
|
29
|
-
@args, @commands, @options = args, {}, {}
|
29
|
+
@args, @commands, @options, @aliases = args, {}, {}, {}
|
30
30
|
@program = program_defaults
|
31
31
|
create_default_commands
|
32
32
|
parse_global_options
|
@@ -40,7 +40,12 @@ module Commander
|
|
40
40
|
case
|
41
41
|
when options[:version] ; $terminal.say "#{program(:name)} #{program(:version)}"
|
42
42
|
when options[:help] ; command(:help).run(*@args[1..-1])
|
43
|
-
else
|
43
|
+
else
|
44
|
+
if alias? command_name_from_args
|
45
|
+
active_command.run *(@aliases[command_name_from_args.to_s] + args_without_command_name)
|
46
|
+
else
|
47
|
+
active_command.run *args_without_command_name
|
48
|
+
end
|
44
49
|
end
|
45
50
|
rescue InvalidCommandError
|
46
51
|
$terminal.say 'invalid command. Use --help for more information'
|
@@ -107,10 +112,20 @@ module Commander
|
|
107
112
|
end
|
108
113
|
|
109
114
|
##
|
110
|
-
# Alias command +name+ with +alias_name+.
|
115
|
+
# Alias command +name+ with +alias_name+. Optionallry +args+ may be passed
|
116
|
+
# as if they were being passed straight to the original command via the command-line.
|
111
117
|
|
112
|
-
def alias_command alias_name, name
|
118
|
+
def alias_command alias_name, name, *args
|
113
119
|
@commands[alias_name.to_s] = command name
|
120
|
+
@aliases[alias_name.to_s] = args
|
121
|
+
end
|
122
|
+
|
123
|
+
##
|
124
|
+
# Default command +name+ to be used when no other
|
125
|
+
# command is found in the arguments.
|
126
|
+
|
127
|
+
def default_command name
|
128
|
+
@default_command = name
|
114
129
|
end
|
115
130
|
|
116
131
|
##
|
@@ -120,6 +135,13 @@ module Commander
|
|
120
135
|
@commands[command.name] = command
|
121
136
|
end
|
122
137
|
|
138
|
+
##
|
139
|
+
# Check if command +name+ is an alias.
|
140
|
+
|
141
|
+
def alias? name
|
142
|
+
@aliases.include? name.to_s
|
143
|
+
end
|
144
|
+
|
123
145
|
##
|
124
146
|
# Check if a command +name+ exists.
|
125
147
|
|
@@ -139,7 +161,7 @@ module Commander
|
|
139
161
|
# Supports multi-word commands, using the largest possible match.
|
140
162
|
|
141
163
|
def command_name_from_args
|
142
|
-
@__command_name_from_args ||= valid_command_names_from(*@args.dup).sort.last
|
164
|
+
@__command_name_from_args ||= (valid_command_names_from(*@args.dup).sort.last || @default_command)
|
143
165
|
end
|
144
166
|
|
145
167
|
##
|
@@ -162,7 +184,7 @@ module Commander
|
|
162
184
|
|
163
185
|
def args_without_command_name
|
164
186
|
removed = []
|
165
|
-
parts = command_name_from_args.split
|
187
|
+
parts = command_name_from_args.split rescue []
|
166
188
|
@args.dup.delete_if do |arg|
|
167
189
|
removed << arg if parts.include?(arg) and not removed.include?(arg)
|
168
190
|
end
|
data/lib/commander/version.rb
CHANGED
@@ -5,13 +5,6 @@ describe Commander::HelpFormatter do
|
|
5
5
|
mock_terminal
|
6
6
|
end
|
7
7
|
|
8
|
-
def run *args
|
9
|
-
new_command_runner *args do
|
10
|
-
program :help_formatter, Commander::HelpFormatter::Base
|
11
|
-
end.run!
|
12
|
-
@output.string
|
13
|
-
end
|
14
|
-
|
15
8
|
it "should display global help using --help switch" do
|
16
9
|
run('--help').should == "Implement global help here\n"
|
17
10
|
end
|
data/spec/runner_spec.rb
CHANGED
@@ -35,46 +35,50 @@ describe Commander do
|
|
35
35
|
end
|
36
36
|
|
37
37
|
describe "#alias_command" do
|
38
|
-
it "should
|
38
|
+
it "should alias a command" do
|
39
39
|
alias_command :foo, :test
|
40
40
|
command(:foo).should == command(:test)
|
41
41
|
end
|
42
|
+
|
43
|
+
it "should pass arguments passed to the alias when called" do
|
44
|
+
new_command_runner 'install', 'gem', 'commander' do
|
45
|
+
command :install do |c|
|
46
|
+
c.option '--gem-name NAME', 'Install a gem'
|
47
|
+
c.when_called { |_, options| options.gem_name.should == 'commander' }
|
48
|
+
end
|
49
|
+
alias_command :'install gem', :install, '--gem-name'
|
50
|
+
command(:install).should_receive(:run).once
|
51
|
+
end.run!
|
52
|
+
end
|
42
53
|
end
|
43
54
|
|
44
55
|
describe "--version" do
|
45
56
|
it "should output program version" do
|
46
|
-
|
47
|
-
program :help_formatter, Commander::HelpFormatter::Base
|
48
|
-
end.run!
|
49
|
-
@output.string.should == "test 1.2.3\n"
|
57
|
+
run('--version').should == "test 1.2.3\n"
|
50
58
|
end
|
51
59
|
end
|
52
60
|
|
53
61
|
describe "--help" do
|
54
62
|
it "should not output an invalid command message" do
|
55
|
-
|
56
|
-
@output.string.should_not == "invalid command. Use --help for more information\n"
|
63
|
+
run('--help').should_not == "invalid command. Use --help for more information\n"
|
57
64
|
end
|
58
65
|
end
|
59
66
|
|
60
67
|
describe "with invalid options" do
|
61
68
|
it "should output an invalid option message" do
|
62
|
-
|
63
|
-
@output.string.should == "invalid option: --invalid-option\n"
|
69
|
+
run('test', '--invalid-option').should == "invalid option: --invalid-option\n"
|
64
70
|
end
|
65
71
|
end
|
66
72
|
|
67
73
|
describe "with invalid sub-command passed" do
|
68
74
|
it "should output an invalid command message" do
|
69
|
-
|
70
|
-
@output.string.should == "invalid command. Use --help for more information\n"
|
75
|
+
run('foo').should == "invalid command. Use --help for more information\n"
|
71
76
|
end
|
72
77
|
end
|
73
78
|
|
74
79
|
describe "with invalid sub-command passed to help" do
|
75
80
|
it "should output an invalid command message" do
|
76
|
-
|
77
|
-
@output.string.should == "invalid command. Use --help for more information\n"
|
81
|
+
run('help', 'does_not_exist').should == "invalid command. Use --help for more information\n"
|
78
82
|
end
|
79
83
|
end
|
80
84
|
|
@@ -132,6 +136,41 @@ describe Commander do
|
|
132
136
|
end
|
133
137
|
end
|
134
138
|
|
139
|
+
describe "#default_command" do
|
140
|
+
it "should allow you to default any command when one is not explicitly passed" do
|
141
|
+
new_command_runner '--trace' do
|
142
|
+
default_command :test
|
143
|
+
command(:test).should_receive(:run).once
|
144
|
+
command_runner.active_command.should == command(:test)
|
145
|
+
end.run!
|
146
|
+
end
|
147
|
+
|
148
|
+
it "should not prevent other commands from being called" do
|
149
|
+
new_command_runner 'foo', 'bar', '--trace' do
|
150
|
+
default_command :test
|
151
|
+
command(:'foo bar'){}
|
152
|
+
command(:'foo bar').should_receive(:run).once
|
153
|
+
command_runner.active_command.should == command(:'foo bar')
|
154
|
+
end.run!
|
155
|
+
end
|
156
|
+
|
157
|
+
it "should not prevent longer commands to use the same words as the default" do
|
158
|
+
new_command_runner 'foo', 'bar', 'something'
|
159
|
+
default_command :'foo bar'
|
160
|
+
command(:'foo bar'){}
|
161
|
+
command(:'foo bar something'){}
|
162
|
+
command_runner.active_command.should == command(:'foo bar something')
|
163
|
+
end
|
164
|
+
|
165
|
+
it "should allow defaulting of command aliases" do
|
166
|
+
new_command_runner '--trace' do
|
167
|
+
default_command :foobar
|
168
|
+
alias_command :foobar, :test
|
169
|
+
command(:test).should_receive(:run).once
|
170
|
+
end.run!
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
135
174
|
describe "should function correctly" do
|
136
175
|
it "when options are passed before the command name" do
|
137
176
|
new_command_runner '--trace', 'test', 'foo', 'bar' do
|
@@ -175,6 +214,15 @@ describe Commander do
|
|
175
214
|
command_runner.args_without_command_name.should == ['--trace', 'something', 'my', 'command']
|
176
215
|
end.run!
|
177
216
|
end
|
217
|
+
|
218
|
+
it "when using multi-word commands with other commands using the same words" do
|
219
|
+
new_command_runner '--trace', 'my', 'command', 'something', 'my', 'command' do
|
220
|
+
command('my command') {}
|
221
|
+
command('my command something') {}
|
222
|
+
command_runner.command_name_from_args.should == 'my command something'
|
223
|
+
command_runner.args_without_command_name.should == ['--trace', 'my', 'command']
|
224
|
+
end.run!
|
225
|
+
end
|
178
226
|
end
|
179
227
|
|
180
228
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: visionmedia-commander
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0
|
4
|
+
version: 3.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- TJ Holowaychuk
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-03-
|
12
|
+
date: 2009-03-13 00:00:00 -07:00
|
13
13
|
default_executable: commander
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -80,6 +80,7 @@ files:
|
|
80
80
|
- tasks/docs.rake
|
81
81
|
- tasks/gemspec.rake
|
82
82
|
- tasks/spec.rake
|
83
|
+
- test/foo
|
83
84
|
- test/pbar
|
84
85
|
- test/ui
|
85
86
|
- Todo.rdoc
|