visionmedia-commander 2.5.7 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.rdoc +30 -0
- data/Manifest +6 -5
- data/README.rdoc +7 -20
- data/Todo.rdoc +24 -19
- data/bin/commander +30 -29
- data/commander.gemspec +4 -4
- data/lib/commander.rb +3 -14
- data/lib/commander/command.rb +105 -120
- data/lib/commander/core_ext.rb +0 -1
- data/lib/commander/core_ext/array.rb +9 -4
- data/lib/commander/core_ext/object.rb +37 -2
- data/lib/commander/core_ext/string.rb +2 -14
- data/lib/commander/help_formatters.rb +4 -2
- data/lib/commander/help_formatters/base.rb +3 -23
- data/lib/commander/help_formatters/terminal.rb +1 -8
- data/lib/commander/help_formatters/terminal/command_help.erb +8 -8
- data/lib/commander/help_formatters/terminal/help.erb +4 -4
- data/lib/commander/runner.rb +83 -83
- data/lib/commander/user_interaction.rb +36 -42
- data/lib/commander/version.rb +1 -1
- data/spec/command_spec.rb +128 -0
- data/spec/core_ext/array_spec.rb +20 -0
- data/spec/{import_spec.rb → core_ext/object_spec.rb} +10 -3
- data/spec/help_formatter_spec.rb +15 -15
- data/spec/runner_spec.rb +168 -0
- data/spec/spec_helper.rb +19 -4
- metadata +8 -10
- data/lib/commander/core_ext/kernel.rb +0 -12
- data/lib/commander/fileutils.rb +0 -30
- data/lib/commander/import.rb +0 -31
- data/spec/commander_spec.rb +0 -241
data/spec/spec_helper.rb
CHANGED
@@ -2,6 +2,16 @@
|
|
2
2
|
require 'commander'
|
3
3
|
require 'stringio'
|
4
4
|
|
5
|
+
# Mock terminal IO streams so we can spec against them
|
6
|
+
|
7
|
+
def mock_terminal
|
8
|
+
@input = StringIO.new
|
9
|
+
@output = StringIO.new
|
10
|
+
$terminal = HighLine.new @input, @output
|
11
|
+
end
|
12
|
+
|
13
|
+
# Create test command for usage within several specs
|
14
|
+
|
5
15
|
def create_test_command
|
6
16
|
command :test do |c|
|
7
17
|
c.syntax = "test [options] <file>"
|
@@ -14,12 +24,17 @@ def create_test_command
|
|
14
24
|
"test %s" % args.join
|
15
25
|
end
|
16
26
|
end
|
27
|
+
@command = command :test
|
17
28
|
end
|
18
29
|
|
19
|
-
|
30
|
+
# Create a new global command runner
|
31
|
+
|
32
|
+
def new_command_runner *args, &block
|
20
33
|
$command_runner = Commander::Runner.new args
|
21
|
-
program :name,
|
22
|
-
program :version,
|
23
|
-
program :description,
|
34
|
+
program :name, 'test'
|
35
|
+
program :version, '1.2.3'
|
36
|
+
program :description, 'something'
|
24
37
|
create_test_command
|
38
|
+
yield if block_given?
|
39
|
+
command_runner
|
25
40
|
end
|
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:
|
4
|
+
version: 3.0.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-12 00:00:00 -07:00
|
13
13
|
default_executable: commander
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -32,17 +32,14 @@ extra_rdoc_files:
|
|
32
32
|
- bin/commander
|
33
33
|
- lib/commander/command.rb
|
34
34
|
- lib/commander/core_ext/array.rb
|
35
|
-
- lib/commander/core_ext/kernel.rb
|
36
35
|
- lib/commander/core_ext/object.rb
|
37
36
|
- lib/commander/core_ext/string.rb
|
38
37
|
- lib/commander/core_ext.rb
|
39
|
-
- lib/commander/fileutils.rb
|
40
38
|
- lib/commander/help_formatters/base.rb
|
41
39
|
- lib/commander/help_formatters/terminal/command_help.erb
|
42
40
|
- lib/commander/help_formatters/terminal/help.erb
|
43
41
|
- lib/commander/help_formatters/terminal.rb
|
44
42
|
- lib/commander/help_formatters.rb
|
45
|
-
- lib/commander/import.rb
|
46
43
|
- lib/commander/runner.rb
|
47
44
|
- lib/commander/user_interaction.rb
|
48
45
|
- lib/commander/version.rb
|
@@ -57,17 +54,14 @@ files:
|
|
57
54
|
- History.rdoc
|
58
55
|
- lib/commander/command.rb
|
59
56
|
- lib/commander/core_ext/array.rb
|
60
|
-
- lib/commander/core_ext/kernel.rb
|
61
57
|
- lib/commander/core_ext/object.rb
|
62
58
|
- lib/commander/core_ext/string.rb
|
63
59
|
- lib/commander/core_ext.rb
|
64
|
-
- lib/commander/fileutils.rb
|
65
60
|
- lib/commander/help_formatters/base.rb
|
66
61
|
- lib/commander/help_formatters/terminal/command_help.erb
|
67
62
|
- lib/commander/help_formatters/terminal/help.erb
|
68
63
|
- lib/commander/help_formatters/terminal.rb
|
69
64
|
- lib/commander/help_formatters.rb
|
70
|
-
- lib/commander/import.rb
|
71
65
|
- lib/commander/runner.rb
|
72
66
|
- lib/commander/user_interaction.rb
|
73
67
|
- lib/commander/version.rb
|
@@ -75,14 +69,18 @@ files:
|
|
75
69
|
- Manifest
|
76
70
|
- Rakefile
|
77
71
|
- README.rdoc
|
78
|
-
- spec/
|
72
|
+
- spec/command_spec.rb
|
73
|
+
- spec/core_ext/array_spec.rb
|
74
|
+
- spec/core_ext/object_spec.rb
|
79
75
|
- spec/core_ext/string_spec.rb
|
80
76
|
- spec/help_formatter_spec.rb
|
81
|
-
- spec/
|
77
|
+
- spec/runner_spec.rb
|
82
78
|
- spec/spec_helper.rb
|
83
79
|
- tasks/docs.rake
|
84
80
|
- tasks/gemspec.rake
|
85
81
|
- tasks/spec.rake
|
82
|
+
- test/pbar
|
83
|
+
- test/ui
|
86
84
|
- Todo.rdoc
|
87
85
|
has_rdoc: true
|
88
86
|
homepage: http://github.com/visionmedia/commander
|
data/lib/commander/fileutils.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
|
2
|
-
require 'fileutils'
|
3
|
-
|
4
|
-
module VerboseFileUtils
|
5
|
-
|
6
|
-
include FileUtils
|
7
|
-
|
8
|
-
##
|
9
|
-
# Wrap _methods_ with _action_ log message.
|
10
|
-
|
11
|
-
def self.log action, *methods
|
12
|
-
methods.each do |meth|
|
13
|
-
define_method meth do |*args|
|
14
|
-
Commander::UI.log "#{action}", *args
|
15
|
-
super
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
log "remove", :rm, :rm_r, :rm_rf, :rmdir
|
21
|
-
log "create", :touch, :mkdir, :mkdir_p
|
22
|
-
log "copy", :cp, :cp_r
|
23
|
-
log "move", :mv
|
24
|
-
log "change", :cd
|
25
|
-
log "link", :ln, :ln_s
|
26
|
-
log "install", :install
|
27
|
-
|
28
|
-
end
|
29
|
-
|
30
|
-
include VerboseFileUtils
|
data/lib/commander/import.rb
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
|
2
|
-
require "forwardable"
|
3
|
-
|
4
|
-
##
|
5
|
-
# Makes the following Commander methods globally available:
|
6
|
-
#
|
7
|
-
# * Commander::Runner#add_command
|
8
|
-
# * Commander::Runner#get_command
|
9
|
-
# * Commander::Runner#command
|
10
|
-
# * Commander::Runner#commands
|
11
|
-
# * Commander::Runner#program
|
12
|
-
# * Commander::UI::ProgressBar#progress
|
13
|
-
|
14
|
-
module Kernel
|
15
|
-
extend Forwardable
|
16
|
-
def_delegators :$command_runner, :add_command, :get_command, :command, :program, :run!, :commands
|
17
|
-
def_delegators Commander::UI::ProgressBar, :progress
|
18
|
-
|
19
|
-
def command_runner #:nodoc:
|
20
|
-
$command_runner
|
21
|
-
end
|
22
|
-
|
23
|
-
alias_method :original_method_missing, :method_missing
|
24
|
-
def method_missing meth, *args, &block
|
25
|
-
if meth.to_s =~ /^ask_for_([\w]+)/
|
26
|
-
$terminal.ask args.first, eval($1.camelcase)
|
27
|
-
else
|
28
|
-
original_method_missing(meth, *args, &block)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
data/spec/commander_spec.rb
DELETED
@@ -1,241 +0,0 @@
|
|
1
|
-
|
2
|
-
describe Commander do
|
3
|
-
|
4
|
-
before :each do
|
5
|
-
@input = StringIO.new
|
6
|
-
@output = StringIO.new
|
7
|
-
$terminal = HighLine.new @input, @output
|
8
|
-
create_test_command
|
9
|
-
end
|
10
|
-
|
11
|
-
it "should allow access to all commands using #commands" do
|
12
|
-
commands.length.should eql(2) # our test command as well as help default
|
13
|
-
end
|
14
|
-
|
15
|
-
it "should set program information using #program" do
|
16
|
-
program :name, "test"
|
17
|
-
program :version, "1.2.3"
|
18
|
-
program :description, "just a test."
|
19
|
-
program(:name).should eql("test")
|
20
|
-
program(:version).should eql("1.2.3")
|
21
|
-
program(:description).should eql("just a test.")
|
22
|
-
end
|
23
|
-
|
24
|
-
it "should allow arbitrary blocks of global help documentation" do
|
25
|
-
program :help, 'Copyright', 'TJ Holowaychuk'
|
26
|
-
program(:help)['Copyright'].should eql('TJ Holowaychuk')
|
27
|
-
end
|
28
|
-
|
29
|
-
it "should raise an error when crutial program info is not set" do
|
30
|
-
new_command_runner '--help'
|
31
|
-
program :name, ''
|
32
|
-
lambda { run! }.should raise_error(Commander::Runner::CommandError)
|
33
|
-
end
|
34
|
-
|
35
|
-
it "should output program version using --version switch" do
|
36
|
-
new_command_runner '--version'
|
37
|
-
program :help_formatter, Commander::HelpFormatter::Base
|
38
|
-
command_runner.run!
|
39
|
-
@output.string.should eql("test 1.2.3\n")
|
40
|
-
end
|
41
|
-
|
42
|
-
it "should get command instances using #get_command" do
|
43
|
-
get_command(:test).name.should eql('test')
|
44
|
-
end
|
45
|
-
|
46
|
-
it "should assign options" do
|
47
|
-
get_command(:test).options.length.should eql(2)
|
48
|
-
end
|
49
|
-
|
50
|
-
it "should invoke #when_called with arguments properly" do
|
51
|
-
get_command(:test).call([1, 2]).should eql("test 12")
|
52
|
-
end
|
53
|
-
|
54
|
-
it "should output invalid option message when invalid options passed to command" do
|
55
|
-
new_command_runner 'test', '--invalid-option'
|
56
|
-
command_runner.run!
|
57
|
-
@output.string.should eql("invalid option: --invalid-option\n")
|
58
|
-
end
|
59
|
-
|
60
|
-
it "should output invalid command message when help sub-command does not exist" do
|
61
|
-
new_command_runner 'help', 'does_not_exist'
|
62
|
-
command_runner.run!
|
63
|
-
@output.string.should eql("invalid command. Use --help for more information\n")
|
64
|
-
end
|
65
|
-
|
66
|
-
it "should locate command within arbitrary arguments passed" do
|
67
|
-
new_command_runner '--help', '--arbitrary', 'test'
|
68
|
-
command_runner.command_name_from_args.should eql('test')
|
69
|
-
end
|
70
|
-
|
71
|
-
it "should resolve active command from global options passed" do
|
72
|
-
new_command_runner '--help', 'test'
|
73
|
-
command_runner.active_command.should be_instance_of(Commander::Command)
|
74
|
-
end
|
75
|
-
|
76
|
-
it "should distinguish between switches and descriptions passed to #option" do
|
77
|
-
get_command(:test).options[0][:description].should eql("trace description")
|
78
|
-
get_command(:test).options[0][:switches].should eql(["-t", "--trace"])
|
79
|
-
get_command(:test).options[1][:description].should eql("verbose description")
|
80
|
-
get_command(:test).options[1][:switches].should eql(["--verbose"])
|
81
|
-
get_command(:test).option "--test"
|
82
|
-
get_command(:test).options[2][:description].should be_nil
|
83
|
-
get_command(:test).options[2][:switches].should eql(["--test"])
|
84
|
-
end
|
85
|
-
|
86
|
-
it "should generate a symbol from switches" do
|
87
|
-
get_command(:test).sym_from_switch("--trace").should eql(:trace)
|
88
|
-
get_command(:test).sym_from_switch("--foo-bar").should eql(:foo_bar)
|
89
|
-
get_command(:test).sym_from_switch("--[no]-feature").should eql(:feature)
|
90
|
-
get_command(:test).sym_from_switch("--[no]-feature ARG").should eql(:feature)
|
91
|
-
get_command(:test).sym_from_switch("--file [ARG]").should eql(:file)
|
92
|
-
get_command(:test).sym_from_switch("--colors colors").should eql(:colors)
|
93
|
-
end
|
94
|
-
|
95
|
-
it "should resolve active command from invalid options passed" do
|
96
|
-
new_command_runner '--help', 'test', '--arbitrary'
|
97
|
-
command_runner.active_command.should be_instance_of(Commander::Command)
|
98
|
-
end
|
99
|
-
|
100
|
-
it "should raise invalid command error when the command is not found in the arguments passed"do
|
101
|
-
new_command_runner '--help'
|
102
|
-
lambda { command_runner.active_command }.should raise_error(Commander::Runner::InvalidCommandError)
|
103
|
-
end
|
104
|
-
|
105
|
-
it "should add options to previously created commands" do
|
106
|
-
get_command(:test).option("--recursive") {}
|
107
|
-
get_command(:test).options.length.should eql(3)
|
108
|
-
end
|
109
|
-
|
110
|
-
it "should call command option procs" do
|
111
|
-
recursive = false
|
112
|
-
get_command(:test).option("--recursive") { recursive = true }
|
113
|
-
get_command(:test).run ['--recursive']
|
114
|
-
recursive.should be_true
|
115
|
-
end
|
116
|
-
|
117
|
-
it "should call the #when_called proc when #run" do
|
118
|
-
result = nil
|
119
|
-
get_command(:test).when_called { |args, options| result = args.join(' ') }
|
120
|
-
get_command(:test).run ['--trace', 'just', 'some', 'args']
|
121
|
-
result.should eql("just some args")
|
122
|
-
end
|
123
|
-
|
124
|
-
it "should handle boolean options" do
|
125
|
-
opts = nil
|
126
|
-
get_command(:test).when_called { |args, options| opts = options }
|
127
|
-
get_command(:test).run ['--trace', 'foo', 'bar']
|
128
|
-
opts.trace.should be_true
|
129
|
-
end
|
130
|
-
|
131
|
-
it "should handle toggle options" do
|
132
|
-
options = nil
|
133
|
-
get_command(:test).when_called { |args, opts| options = opts }
|
134
|
-
get_command(:test).option "--[no-]toggle"
|
135
|
-
get_command(:test).run ['--no-toggle']
|
136
|
-
options.toggle.should be_false
|
137
|
-
end
|
138
|
-
|
139
|
-
it "should handle manditory arg options" do
|
140
|
-
options = nil
|
141
|
-
get_command(:test).when_called { |args, opts| options = opts }
|
142
|
-
get_command(:test).option "--manditory ARG"
|
143
|
-
get_command(:test).run ['--manditory', "foo"]
|
144
|
-
options.manditory.should eql("foo")
|
145
|
-
lambda { get_command(:test).run ['--manditory'] }.should raise_error(OptionParser::MissingArgument)
|
146
|
-
end
|
147
|
-
|
148
|
-
it "should handle optional arg options" do
|
149
|
-
options = nil
|
150
|
-
get_command(:test).when_called { |args, opts| options = opts }
|
151
|
-
get_command(:test).option "--optional [ARG]"
|
152
|
-
get_command(:test).run ['--optional', "foo"]
|
153
|
-
options.optional.should eql("foo")
|
154
|
-
get_command(:test).run ['--optional']
|
155
|
-
options.optiona.should be_nil
|
156
|
-
end
|
157
|
-
|
158
|
-
it "should handle list options" do
|
159
|
-
options = nil
|
160
|
-
get_command(:test).when_called { |args, opts| options = opts }
|
161
|
-
get_command(:test).option "--list words", Array
|
162
|
-
get_command(:test).run ['--list', "im,a,list"]
|
163
|
-
options.list.should eql(["im", "a", "list"])
|
164
|
-
end
|
165
|
-
|
166
|
-
it "should initialize and call object when a class is passed to #when_called" do
|
167
|
-
$_when_called_value = nil
|
168
|
-
class HandleWhenCalled1
|
169
|
-
def initialize(args, options) $_when_called_value = args.join('-') end
|
170
|
-
end
|
171
|
-
get_command(:test).when_called HandleWhenCalled1
|
172
|
-
get_command(:test).call(["hello", "world"])
|
173
|
-
$_when_called_value.should eql("hello-world")
|
174
|
-
end
|
175
|
-
|
176
|
-
it "should initialize and call object when a class is passed to #when_called with an arbitrary method" do
|
177
|
-
class HandleWhenCalled2
|
178
|
-
def arbitrary_method(args, options) args.join('-') end
|
179
|
-
end
|
180
|
-
get_command(:test).when_called HandleWhenCalled2, :arbitrary_method
|
181
|
-
get_command(:test).call(["hello", "world"]).should eql("hello-world")
|
182
|
-
end
|
183
|
-
|
184
|
-
it "should call object when passed to #when_called " do
|
185
|
-
class HandleWhenCalled3
|
186
|
-
def arbitrary_method(args, options) args.join('-') end
|
187
|
-
end
|
188
|
-
get_command(:test).when_called HandleWhenCalled3.new, :arbitrary_method
|
189
|
-
get_command(:test).call(["hello", "world"]).should eql("hello-world")
|
190
|
-
end
|
191
|
-
|
192
|
-
it "should populate options when passed before command name" do
|
193
|
-
options = nil
|
194
|
-
new_command_runner '--foo', 'test', 'some', 'args'
|
195
|
-
get_command(:test).option "--foo"
|
196
|
-
get_command(:test).when_called { |args, opts| options = opts }
|
197
|
-
command_runner.run!
|
198
|
-
options.foo.should be_true
|
199
|
-
end
|
200
|
-
|
201
|
-
it "should populate options when passed after command name" do
|
202
|
-
options = nil
|
203
|
-
new_command_runner 'test', '--foo', 'some', 'args'
|
204
|
-
get_command(:test).option "--foo"
|
205
|
-
get_command(:test).when_called { |args, opts| options = opts }
|
206
|
-
command_runner.run!
|
207
|
-
options.foo.should be_true
|
208
|
-
end
|
209
|
-
|
210
|
-
it "should allow multi-word strings as command names to be called correctly" do
|
211
|
-
arguments = nil
|
212
|
-
options = nil
|
213
|
-
new_command_runner 'foo', 'bar', 'something', 'i', 'like', '--i-like', 'cookies'
|
214
|
-
command 'foo bar something' do |c|
|
215
|
-
c.option '--i-like WHAT'
|
216
|
-
c.when_called { |args, opts| arguments, options = args, opts }
|
217
|
-
end
|
218
|
-
command_runner.command_name_from_args.should eql('foo bar something')
|
219
|
-
command_runner.args_without_command.should eql(['i', 'like', '--i-like', 'cookies'])
|
220
|
-
command_runner.run!
|
221
|
-
arguments.should eql(['i', 'like'])
|
222
|
-
options.i_like.should eql('cookies')
|
223
|
-
end
|
224
|
-
|
225
|
-
it "should allow multi-word strings as command names to be called correctly, with options before command name" do
|
226
|
-
arguments = nil
|
227
|
-
options = nil
|
228
|
-
new_command_runner '--something', 'foo', 'bar', 'random_arg'
|
229
|
-
command 'foo bar' do |c|
|
230
|
-
c.option '--something'
|
231
|
-
c.when_called { |args, opts| arguments, options = args, opts }
|
232
|
-
end
|
233
|
-
command_runner.command_name_from_args.should eql('foo bar')
|
234
|
-
command_runner.args_without_command.should eql(['--something', 'random_arg'])
|
235
|
-
command_runner.run!
|
236
|
-
arguments.should eql(['random_arg'])
|
237
|
-
options.something.should be_true
|
238
|
-
end
|
239
|
-
|
240
|
-
|
241
|
-
end
|