visionmedia-commander 2.5.7 → 3.0.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 +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
|