visionmedia-commander 3.1.2 → 3.1.4
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 +15 -0
- data/Manifest +1 -0
- data/README.rdoc +16 -1
- data/Rakefile +8 -4
- data/Todo.rdoc +1 -1
- data/commander.gemspec +5 -5
- data/lib/commander.rb +1 -3
- data/lib/commander/blank.rb +6 -0
- data/lib/commander/command.rb +13 -5
- data/lib/commander/help_formatters/terminal/help.erb +6 -0
- data/lib/commander/runner.rb +36 -7
- data/lib/commander/user_interaction.rb +19 -19
- data/lib/commander/version.rb +1 -1
- data/spec/command_spec.rb +26 -2
- data/spec/spec_helper.rb +1 -0
- metadata +5 -3
data/History.rdoc
CHANGED
@@ -1,4 +1,19 @@
|
|
1
1
|
|
2
|
+
=== 3.1.4 / 2009-03-20
|
3
|
+
|
4
|
+
* Gemspec typo
|
5
|
+
|
6
|
+
=== 3.1.3 / 2009-03-20
|
7
|
+
|
8
|
+
* Added #remove_global_options
|
9
|
+
* Added core global option descriptions
|
10
|
+
* Added display of global options
|
11
|
+
* Removed small core switches (-v, -h) because they are implicitly set
|
12
|
+
* Fixed issue with option switchs failing when named as common methods like --send, or --password
|
13
|
+
* Fixed bug causing InvalidOption error when global options do not abort the process.
|
14
|
+
This was due to these options remaining in the arguments array, in turn being parsed
|
15
|
+
by the sub-command's option parser, issuing the error. This is fixed by #remove_global_options.
|
16
|
+
|
2
17
|
=== 3.1.2 / 2009-03-16
|
3
18
|
|
4
19
|
* Added support for global options via #global_option
|
data/Manifest
CHANGED
data/README.rdoc
CHANGED
@@ -211,6 +211,16 @@ Which will output the rest of the help doc, along with:
|
|
211
211
|
|
212
212
|
TJ Holowaychuk <tj@vision-media.ca>
|
213
213
|
|
214
|
+
=== Global Options
|
215
|
+
|
216
|
+
Although most switches will be at the sub-command level, several are available
|
217
|
+
by default at the global level, such as --version, and --help. Using #global_option
|
218
|
+
you can add additional global options:
|
219
|
+
|
220
|
+
global_option('-c', '--config FILE', 'Load config data for your commands to use') { |file| ... }
|
221
|
+
|
222
|
+
This method accepts the same syntax as Commander::Command#option so check it out for documentation.
|
223
|
+
|
214
224
|
== ASCII Tables
|
215
225
|
|
216
226
|
For feature rich ASCII tables for your terminal app check out visionmedia's terminal-table gem at
|
@@ -222,9 +232,14 @@ http://github.com/visionmedia/terminal-table
|
|
222
232
|
| | | | | get it while its hot! |
|
223
233
|
+----------+-------+----+--------+-----------------------+
|
224
234
|
|
235
|
+
== Contrib
|
236
|
+
|
237
|
+
Feel free to fork and request a pull, or submit a ticket
|
238
|
+
http://visionmedia.lighthouseapp.com/projects/27643-commander
|
239
|
+
|
225
240
|
== Known Issues
|
226
241
|
|
227
|
-
*
|
242
|
+
* None
|
228
243
|
|
229
244
|
== License
|
230
245
|
|
data/Rakefile
CHANGED
@@ -1,12 +1,16 @@
|
|
1
1
|
|
2
|
-
|
2
|
+
$:.unshift 'lib'
|
3
|
+
require 'commander'
|
4
|
+
require 'rubygems'
|
5
|
+
require 'rake'
|
6
|
+
require 'echoe'
|
3
7
|
|
4
|
-
Echoe.new
|
8
|
+
Echoe.new "commander", Commander::VERSION do |p|
|
5
9
|
p.author = "TJ Holowaychuk"
|
6
10
|
p.email = "tj@vision-media.ca"
|
7
11
|
p.summary = "The complete solution for Ruby command-line executables"
|
8
|
-
p.url = "http://github.com/
|
9
|
-
p.runtime_dependencies
|
12
|
+
p.url = "http://visionmedia.github.com/commander"
|
13
|
+
p.runtime_dependencies << "highline >=1.5.0"
|
10
14
|
end
|
11
15
|
|
12
16
|
Dir['tasks/**/*.rake'].sort.each { |lib| load lib }
|
data/Todo.rdoc
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
|
2
2
|
== Major
|
3
3
|
|
4
|
-
* Prevent global options from overriding sub-command level options
|
5
4
|
* Finish global --trace
|
6
5
|
* 1.9.x compatability
|
7
6
|
* Publish RDoc on mini page / screencasts
|
8
7
|
|
9
8
|
== Minor
|
10
9
|
|
10
|
+
* Prevent global options from overriding sub-command level options
|
11
11
|
* Add arbitrary help blocks to sub-commands as well
|
12
12
|
* Spec for changing out formatters (mock formatter)
|
13
13
|
* Add optional default command when none is present
|
data/commander.gemspec
CHANGED
@@ -2,19 +2,19 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{commander}
|
5
|
-
s.version = "3.1.
|
5
|
+
s.version = "3.1.4"
|
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-20}
|
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
|
-
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/foo", "test/pbar", "test/ui", "Todo.rdoc"]
|
14
|
+
s.extra_rdoc_files = ["bin/commander", "lib/commander/blank.rb", "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/blank.rb", "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
|
-
s.homepage = %q{http://github.com/
|
17
|
+
s.homepage = %q{http://visionmedia.github.com/commander}
|
18
18
|
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Commander", "--main", "README.rdoc"]
|
19
19
|
s.require_paths = ["lib"]
|
20
20
|
s.rubyforge_project = %q{commander}
|
data/lib/commander.rb
CHANGED
@@ -21,11 +21,9 @@
|
|
21
21
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
22
|
#++
|
23
23
|
|
24
|
-
$:.unshift File.dirname(__FILE__)
|
25
|
-
|
26
|
-
require 'rubygems'
|
27
24
|
require 'highline/import'
|
28
25
|
require 'commander/version'
|
26
|
+
require 'commander/blank'
|
29
27
|
require 'commander/user_interaction'
|
30
28
|
require 'commander/core_ext'
|
31
29
|
require 'commander/runner'
|
data/lib/commander/command.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
|
2
2
|
require 'optparse'
|
3
|
-
require 'ostruct'
|
4
3
|
|
5
4
|
module Commander
|
6
5
|
class Command
|
@@ -10,11 +9,20 @@ module Commander
|
|
10
9
|
|
11
10
|
##
|
12
11
|
# Options struct.
|
13
|
-
|
14
|
-
class Options <
|
12
|
+
|
13
|
+
class Options < BlankSlate
|
14
|
+
def method_missing meth, *args, &block
|
15
|
+
if meth.to_s =~ /=$/
|
16
|
+
metaclass = class << self; self end
|
17
|
+
metaclass.send :define_method, meth.to_s.chop do
|
18
|
+
args.first
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
15
23
|
def default defaults = {}
|
16
24
|
defaults.each do |key, value|
|
17
|
-
|
25
|
+
__send__ :"#{key}=", value if __send__(key).nil?
|
18
26
|
end
|
19
27
|
end
|
20
28
|
end
|
@@ -195,7 +203,7 @@ module Commander
|
|
195
203
|
|
196
204
|
def proxy_option_struct
|
197
205
|
@proxy_options.inject Options.new do |options, (option, value)|
|
198
|
-
options.
|
206
|
+
options.__send__ :"#{option}=", value
|
199
207
|
options
|
200
208
|
end
|
201
209
|
end
|
@@ -17,6 +17,12 @@
|
|
17
17
|
<%= $terminal.color "ALIASES", :bold %>:
|
18
18
|
<% @aliases.each do |alias_name, args| %>
|
19
19
|
<%= "%-20s %s %s" % [alias_name, command(alias_name).name, args.join(' ')] -%>
|
20
|
+
<% end %>
|
21
|
+
<% end %>
|
22
|
+
<% unless @options.empty? -%>
|
23
|
+
<%= $terminal.color "GLOBAL OPTIONS", :bold %>:
|
24
|
+
<% @options.each do |(args, proc)| %>
|
25
|
+
<%= "%-20s %s" % [args.shift, args.last.is_a?(String) ? args.last : ''] -%>
|
20
26
|
<% end -%>
|
21
27
|
<% end %>
|
22
28
|
<% if program :help -%>
|
data/lib/commander/runner.rb
CHANGED
@@ -11,7 +11,15 @@ module Commander
|
|
11
11
|
class CommandError < StandardError; end
|
12
12
|
class InvalidCommandError < CommandError; end
|
13
13
|
|
14
|
-
|
14
|
+
##
|
15
|
+
# Array of commands.
|
16
|
+
|
17
|
+
attr_reader :commands
|
18
|
+
|
19
|
+
##
|
20
|
+
# Global options.
|
21
|
+
|
22
|
+
attr_reader :options
|
15
23
|
|
16
24
|
##
|
17
25
|
# Initialize a new command runner. Optionally
|
@@ -28,9 +36,10 @@ module Commander
|
|
28
36
|
|
29
37
|
def run!
|
30
38
|
require_program :name, :version, :description
|
31
|
-
global_option('
|
32
|
-
global_option('
|
39
|
+
global_option('--help', 'Display help documentation') { command(:help).run *@args[1..-1]; return }
|
40
|
+
global_option('--version', 'Display version information') { say version; return }
|
33
41
|
parse_global_options
|
42
|
+
remove_global_options
|
34
43
|
call_active_command
|
35
44
|
rescue InvalidCommandError
|
36
45
|
say 'invalid command. Use --help for more information'
|
@@ -231,13 +240,33 @@ module Commander
|
|
231
240
|
end
|
232
241
|
end
|
233
242
|
end
|
243
|
+
|
244
|
+
##
|
245
|
+
# Removes global options from args. This prevents an invalid
|
246
|
+
# option error from ocurring when options are parsed
|
247
|
+
# again for the sub-command.
|
248
|
+
|
249
|
+
def remove_global_options
|
250
|
+
# TODO: refactor with flipflop
|
251
|
+
options.each do |(args, proc)|
|
252
|
+
switch, has_arg = args.first.split
|
253
|
+
past_switch, arg_removed = false, false
|
254
|
+
@args.delete_if do |arg|
|
255
|
+
if arg == switch
|
256
|
+
past_switch, arg_removed = true, false
|
257
|
+
true
|
258
|
+
elsif past_switch && !arg_removed && arg !~ /^-/
|
259
|
+
arg_removed = true
|
260
|
+
else
|
261
|
+
arg_removed = true
|
262
|
+
false
|
263
|
+
end
|
264
|
+
end
|
265
|
+
end
|
266
|
+
end
|
234
267
|
|
235
268
|
##
|
236
269
|
# Parse global command options.
|
237
|
-
#
|
238
|
-
# These options are used by commander itself
|
239
|
-
# as well as allowing your program to specify
|
240
|
-
# global commands such as '--verbose'.
|
241
270
|
|
242
271
|
def parse_global_options
|
243
272
|
options.inject OptionParser.new do |options, (args, proc)|
|
@@ -78,24 +78,24 @@ module Commander
|
|
78
78
|
#
|
79
79
|
# === Options:
|
80
80
|
#
|
81
|
-
#
|
82
|
-
#
|
83
|
-
#
|
84
|
-
#
|
85
|
-
#
|
86
|
-
#
|
87
|
-
#
|
81
|
+
# :title Title, defaults to "Progress"
|
82
|
+
# :width Width of :progress_bar
|
83
|
+
# :progress_str Progress string, defaults to "="
|
84
|
+
# :incomplete_str Incomplete bar string, defaults to '.'
|
85
|
+
# :format Defaults to ":title |:progress_bar| :percent_complete% complete "
|
86
|
+
# :tokens Additional tokens replaced within the format string
|
87
|
+
# :complete_message Defaults to "Process complete"
|
88
88
|
#
|
89
89
|
# === Tokens:
|
90
90
|
#
|
91
|
-
#
|
92
|
-
#
|
93
|
-
#
|
94
|
-
#
|
95
|
-
#
|
96
|
-
#
|
97
|
-
#
|
98
|
-
#
|
91
|
+
# :title
|
92
|
+
# :percent_complete
|
93
|
+
# :progress_bar
|
94
|
+
# :step
|
95
|
+
# :steps_remaining
|
96
|
+
# :total_steps
|
97
|
+
# :time_elapsed
|
98
|
+
# :time_remaining
|
99
99
|
#
|
100
100
|
|
101
101
|
def initialize total, options = {}
|
@@ -212,10 +212,10 @@ module Commander
|
|
212
212
|
#
|
213
213
|
# === Example:
|
214
214
|
#
|
215
|
-
#
|
216
|
-
#
|
217
|
-
#
|
218
|
-
#
|
215
|
+
# uris = %w( http://vision-media.ca http://google.com )
|
216
|
+
# ProgressBar.progress uris, :format => "Remaining: :time_remaining" do |uri|
|
217
|
+
# res = open uri
|
218
|
+
# end
|
219
219
|
#
|
220
220
|
# === See:
|
221
221
|
#
|
data/lib/commander/version.rb
CHANGED
data/spec/command_spec.rb
CHANGED
@@ -6,6 +6,24 @@ describe Commander::Command do
|
|
6
6
|
create_test_command
|
7
7
|
end
|
8
8
|
|
9
|
+
describe 'Options' do
|
10
|
+
before :each do
|
11
|
+
@options = Commander::Command::Options.new
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should act like an open struct" do
|
15
|
+
@options.send = 'mail'
|
16
|
+
@options.password = 'foobar'
|
17
|
+
@options.send.should == 'mail'
|
18
|
+
@options.password.should == 'foobar'
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should allow __send__ to function as always" do
|
22
|
+
@options.send = 'foo'
|
23
|
+
@options.__send__(:send).should == 'foo'
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
9
27
|
describe "#seperate_switches_from_description" do
|
10
28
|
it "should seperate switches and description returning both" do
|
11
29
|
switches, description = *@command.seperate_switches_from_description('-h', '--help', 'display help')
|
@@ -23,6 +41,12 @@ describe Commander::Command do
|
|
23
41
|
@command.option('--recursive') { |recursive| recursive.should be_true }
|
24
42
|
@command.run '--recursive'
|
25
43
|
end
|
44
|
+
|
45
|
+
it "should allow usage of common method names" do
|
46
|
+
@command.option '--password STRING'
|
47
|
+
@command.when_called { |_, options| options.password.should == 'foo' }
|
48
|
+
@command.run '--password', 'foo'
|
49
|
+
end
|
26
50
|
end
|
27
51
|
|
28
52
|
describe "#options" do
|
@@ -53,14 +77,14 @@ describe Commander::Command do
|
|
53
77
|
|
54
78
|
it "calling the #call method by default when an object is called" do
|
55
79
|
object = mock 'Object'
|
56
|
-
object.should_receive(:call).
|
80
|
+
object.should_receive(:call).once
|
57
81
|
@command.when_called object
|
58
82
|
@command.run 'foo'
|
59
83
|
end
|
60
84
|
|
61
85
|
it "calling an arbitrary method when an object is called" do
|
62
86
|
object = mock 'Object'
|
63
|
-
object.should_receive(:foo).
|
87
|
+
object.should_receive(:foo).once
|
64
88
|
@command.when_called object, :foo
|
65
89
|
@command.run 'foo'
|
66
90
|
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.1.
|
4
|
+
version: 3.1.4
|
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-20 00:00:00 -07:00
|
13
13
|
default_executable: commander
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -30,6 +30,7 @@ extensions: []
|
|
30
30
|
|
31
31
|
extra_rdoc_files:
|
32
32
|
- bin/commander
|
33
|
+
- lib/commander/blank.rb
|
33
34
|
- lib/commander/command.rb
|
34
35
|
- lib/commander/core_ext/array.rb
|
35
36
|
- lib/commander/core_ext/object.rb
|
@@ -52,6 +53,7 @@ files:
|
|
52
53
|
- bin/commander
|
53
54
|
- commander.gemspec
|
54
55
|
- History.rdoc
|
56
|
+
- lib/commander/blank.rb
|
55
57
|
- lib/commander/command.rb
|
56
58
|
- lib/commander/core_ext/array.rb
|
57
59
|
- lib/commander/core_ext/object.rb
|
@@ -85,7 +87,7 @@ files:
|
|
85
87
|
- test/ui
|
86
88
|
- Todo.rdoc
|
87
89
|
has_rdoc: true
|
88
|
-
homepage: http://github.com/
|
90
|
+
homepage: http://visionmedia.github.com/commander
|
89
91
|
post_install_message:
|
90
92
|
rdoc_options:
|
91
93
|
- --line-numbers
|