visionmedia-commander 3.0.3 → 3.1.0
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/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
|