commander 4.1.5 → 4.1.6
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.
- checksums.yaml +7 -0
- data/.travis.yml +2 -3
- data/History.rdoc +5 -0
- data/LICENSE +22 -0
- data/README.md +406 -0
- data/commander.gemspec +2 -1
- data/lib/commander/delegates.rb +4 -3
- data/lib/commander/runner.rb +24 -4
- data/lib/commander/user_interaction.rb +1 -1
- data/lib/commander/version.rb +1 -1
- data/spec/command_spec.rb +3 -3
- data/spec/runner_spec.rb +49 -2
- metadata +15 -23
- data/README.rdoc +0 -372
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 89c316cbb98922c1aa25063c184fe3214dc33f03
|
4
|
+
data.tar.gz: 5222385e2c3e6f4d59b4b748315b429173d95435
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 1d88c3df61b540cfa7e5bf58f83891393f331f0844a031619692a5429417471f3aacd1910fb7fdfb52bcaa8aa0ca469b050cd301b2323e3cd9220851d36bce2e
|
7
|
+
data.tar.gz: 5534ce249d8211b77c8c8112d9793e122137ec0513146bef96cf6ad1fcca4610f0bdf8a83856a1288bcca8e4f0818e537263df017263ba2709943ff0b290fd46
|
data/.travis.yml
CHANGED
data/History.rdoc
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
=== 4.1.6 / 2014-02-11
|
2
|
+
|
3
|
+
* Respect environment setting for $LESS (@ellemenno)
|
4
|
+
* Add ability to hide trace flags and globally enable tracing (#16, #17) (@jamesrwhite)
|
5
|
+
|
1
6
|
=== 4.1.5 / 2013-08-11
|
2
7
|
|
3
8
|
* Prevent deprecation warning when loaded in a Rails 4 environment (#58)
|
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2008-2013 TJ Holowaychuk <tj@vision-media.ca>
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be included
|
14
|
+
in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
19
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
20
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
21
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
22
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,406 @@
|
|
1
|
+
[<img src="https://secure.travis-ci.org/ggilder/commander.png?branch=master" alt="Build Status" />](http://travis-ci.org/ggilder/commander)
|
2
|
+
|
3
|
+
# Commander
|
4
|
+
|
5
|
+
The complete solution for Ruby command-line executables.
|
6
|
+
Commander bridges the gap between other terminal related libraries
|
7
|
+
you know and love (OptionParser, HighLine), while providing many new
|
8
|
+
features, and an elegant API.
|
9
|
+
|
10
|
+
## Features
|
11
|
+
|
12
|
+
* Easier than baking cookies
|
13
|
+
* Parses options using OptionParser
|
14
|
+
* Auto-populates struct with options ( no more `{ |v| options[:recursive] = v }` )
|
15
|
+
* Auto-generates help documentation via pluggable help formatters
|
16
|
+
* Optional default command when none is present
|
17
|
+
* Global / Command level options
|
18
|
+
* Packaged with two help formatters (Terminal, TerminalCompact)
|
19
|
+
* Imports the highline gem for interacting with the terminal
|
20
|
+
* Adds additional user interaction functionality
|
21
|
+
* Highly customizable progress bar with intuitive, simple usage
|
22
|
+
* Multi-word command name support such as `drupal module install MOD`, rather than `drupal module_install MOD`
|
23
|
+
* Sexy paging for long bodies of text
|
24
|
+
* Support for MacOS text-to-speech
|
25
|
+
* Command aliasing (very powerful, as both switches and arguments can be used)
|
26
|
+
* Growl notification support for MacOS
|
27
|
+
* Use the `commander` executable to initialize a commander driven program
|
28
|
+
|
29
|
+
## Installation
|
30
|
+
|
31
|
+
$ gem install commander
|
32
|
+
|
33
|
+
## Quick Start
|
34
|
+
|
35
|
+
To generate a quick template for a commander app, run:
|
36
|
+
|
37
|
+
$ commander init yourfile.rb
|
38
|
+
|
39
|
+
## Example
|
40
|
+
|
41
|
+
For more option examples view the `Commander::Command#option` method. Also
|
42
|
+
an important feature to note is that action may be a class to instantiate,
|
43
|
+
as well as an object, specifying a method to call, so view the RDoc for more information.
|
44
|
+
|
45
|
+
```ruby
|
46
|
+
require 'rubygems'
|
47
|
+
require 'commander/import'
|
48
|
+
|
49
|
+
# :name is optional, otherwise uses the basename of this executable
|
50
|
+
program :name, 'Foo Bar'
|
51
|
+
program :version, '1.0.0'
|
52
|
+
program :description, 'Stupid command that prints foo or bar.'
|
53
|
+
|
54
|
+
command :foo do |c|
|
55
|
+
c.syntax = 'foobar foo'
|
56
|
+
c.description = 'Displays foo'
|
57
|
+
c.action do |args, options|
|
58
|
+
say 'foo'
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
command :bar do |c|
|
63
|
+
c.syntax = 'foobar bar [options]'
|
64
|
+
c.description = 'Display bar with optional prefix and suffix'
|
65
|
+
c.option '--prefix STRING', String, 'Adds a prefix to bar'
|
66
|
+
c.option '--suffix STRING', String, 'Adds a suffix to bar'
|
67
|
+
c.action do |args, options|
|
68
|
+
options.default :prefix => '(', :suffix => ')'
|
69
|
+
say "#{options.prefix}bar#{options.suffix}"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
```
|
73
|
+
|
74
|
+
Example output:
|
75
|
+
```
|
76
|
+
$ foobar bar
|
77
|
+
# => (bar)
|
78
|
+
|
79
|
+
$ foobar bar --suffix '}' --prefix '{'
|
80
|
+
# => {bar}
|
81
|
+
```
|
82
|
+
|
83
|
+
## HighLine
|
84
|
+
|
85
|
+
As mentioned above, the highline gem is imported into the global scope. Here
|
86
|
+
are some quick examples for how to utilize highline in your commands:
|
87
|
+
|
88
|
+
```ruby
|
89
|
+
# Ask for password masked with '*' character
|
90
|
+
ask("Password: ") { |q| q.echo = "*" }
|
91
|
+
|
92
|
+
# Ask for password
|
93
|
+
ask("Password: ") { |q| q.echo = false }
|
94
|
+
|
95
|
+
# Ask if the user agrees (yes or no)
|
96
|
+
agree("Do something?")
|
97
|
+
|
98
|
+
# Asks on a single line (note the space after ':')
|
99
|
+
ask("Name: ")
|
100
|
+
|
101
|
+
# Asks with new line after "Description:"
|
102
|
+
ask("Description:")
|
103
|
+
|
104
|
+
# Calls Date#parse to parse the date string passed
|
105
|
+
ask("Birthday? ", Date)
|
106
|
+
|
107
|
+
# Ensures Integer is within the range specified
|
108
|
+
ask("Age? ", Integer) { |q| q.in = 0..105 }
|
109
|
+
|
110
|
+
# Asks for a list of strings, converts to array
|
111
|
+
ask("Fav colors?", Array)
|
112
|
+
```
|
113
|
+
|
114
|
+
## HighLine & Interaction Additions
|
115
|
+
|
116
|
+
In addition to highline's fantastic choice of methods, commander adds the
|
117
|
+
following methods to simplify common tasks:
|
118
|
+
|
119
|
+
```ruby
|
120
|
+
# Ask for password
|
121
|
+
password
|
122
|
+
|
123
|
+
# Ask for password with specific message and mask character
|
124
|
+
password "Enter your password please:", '-'
|
125
|
+
|
126
|
+
# Ask for CLASS, which may be any valid class responding to #parse. Date, Time, Array, etc
|
127
|
+
names = ask_for_array 'Names: '
|
128
|
+
bday = ask_for_date 'Birthday?: '
|
129
|
+
|
130
|
+
# Simple progress bar (Commander::UI::ProgressBar)
|
131
|
+
uris = %w[
|
132
|
+
http://vision-media.ca
|
133
|
+
http://google.com
|
134
|
+
http://yahoo.com
|
135
|
+
]
|
136
|
+
progress uris do |uri|
|
137
|
+
res = open uri
|
138
|
+
# Do something with response
|
139
|
+
end
|
140
|
+
|
141
|
+
# 'Log' action to stdout
|
142
|
+
log "create", "path/to/file.rb"
|
143
|
+
|
144
|
+
# Enable paging of output after this point
|
145
|
+
enable_paging
|
146
|
+
|
147
|
+
# Ask editor for input (EDITOR environment variable or whichever is available: TextMate, vim, vi, emacs, nano, pico)
|
148
|
+
ask_editor
|
149
|
+
|
150
|
+
# Ask editor, supplying initial text
|
151
|
+
ask_editor 'previous data to update'
|
152
|
+
|
153
|
+
# Ask editor, preferring a specific editor
|
154
|
+
ask_editor 'previous data', 'vim'
|
155
|
+
|
156
|
+
# Choose from an array of elements
|
157
|
+
choice = choose("Favorite language?", :ruby, :perl, :js)
|
158
|
+
|
159
|
+
# Alter IO for the duration of the block
|
160
|
+
io new_input, new_output do
|
161
|
+
new_input_contents = $stdin.read
|
162
|
+
puts new_input_contents # outputs to new_output stream
|
163
|
+
end
|
164
|
+
# $stdin / $stdout reset back to original streams
|
165
|
+
|
166
|
+
# Speech synthesis
|
167
|
+
speak 'What is your favorite food? '
|
168
|
+
food = ask 'favorite food?: '
|
169
|
+
speak "Wow, I like #{food} too. We have so much in common."
|
170
|
+
speak "I like #{food} as well!", "Victoria", 190
|
171
|
+
|
172
|
+
# Execute arbitrary applescript
|
173
|
+
applescript 'foo'
|
174
|
+
|
175
|
+
# Converse with speech recognition server
|
176
|
+
case converse 'What is the best food?', :cookies => 'Cookies', :unknown => 'Nothing'
|
177
|
+
when :cookies
|
178
|
+
speak 'o.m.g. you are awesome!'
|
179
|
+
else
|
180
|
+
case converse 'That is lame, shall I convince you cookies are the best?', :yes => 'Ok', :no => 'No', :maybe => 'Maybe another time'
|
181
|
+
when :yes
|
182
|
+
speak 'Well you see, cookies are just fantastic, they melt in your mouth.'
|
183
|
+
else
|
184
|
+
speak 'Ok then, bye.'
|
185
|
+
end
|
186
|
+
end
|
187
|
+
```
|
188
|
+
|
189
|
+
## Growl Notifications
|
190
|
+
|
191
|
+
Commander provides methods for displaying Growl notifications. To use these
|
192
|
+
methods you need to install http://github.com/visionmedia/growl which utilizes
|
193
|
+
the [growlnotify](http://growl.info/extras.php#growlnotify) executable. Note that
|
194
|
+
growl is auto-imported by Commander when available, no need to require.
|
195
|
+
|
196
|
+
```ruby
|
197
|
+
# Display a generic Growl notification
|
198
|
+
notify 'Something happened'
|
199
|
+
|
200
|
+
# Display an 'info' status notification
|
201
|
+
notify_info 'You have #{emails.length} new email(s)'
|
202
|
+
|
203
|
+
# Display an 'ok' status notification
|
204
|
+
notify_ok 'Gems updated'
|
205
|
+
|
206
|
+
# Display a 'warning' status notification
|
207
|
+
notify_warning '1 gem failed installation'
|
208
|
+
|
209
|
+
# Display an 'error' status notification
|
210
|
+
notify_error "Gem #{name} failed"
|
211
|
+
```
|
212
|
+
|
213
|
+
## Commander Goodies
|
214
|
+
|
215
|
+
### Option Defaults
|
216
|
+
|
217
|
+
The options struct passed to `#action` provides a `#default` method, allowing you
|
218
|
+
to set defaults in a clean manner for options which have not been set.
|
219
|
+
|
220
|
+
```ruby
|
221
|
+
command :foo do |c|
|
222
|
+
c.option '--interval SECONDS', Integer, 'Interval in seconds'
|
223
|
+
c.option '--timeout SECONDS', Integer, 'Timeout in seconds'
|
224
|
+
c.action do |args, options|
|
225
|
+
options.default \
|
226
|
+
:interval => 2,
|
227
|
+
:timeout => 60
|
228
|
+
end
|
229
|
+
end
|
230
|
+
```
|
231
|
+
|
232
|
+
### Command Aliasing
|
233
|
+
|
234
|
+
Aliases can be created using the `#alias_command` method like below:
|
235
|
+
|
236
|
+
```ruby
|
237
|
+
command :'install gem' do |c|
|
238
|
+
c.action { puts 'foo' }
|
239
|
+
end
|
240
|
+
alias_command :'gem install', :'install gem'
|
241
|
+
```
|
242
|
+
|
243
|
+
Or more complicated aliases can be made, passing any arguments
|
244
|
+
as if it was invoked via the command line:
|
245
|
+
|
246
|
+
```ruby
|
247
|
+
command :'install gem' do |c|
|
248
|
+
c.syntax = 'install gem <name> [options]'
|
249
|
+
c.option '--dest DIR', String, 'Destination directory'
|
250
|
+
c.action { |args, options| puts "installing #{args.first} to #{options.dest}" }
|
251
|
+
end
|
252
|
+
alias_command :update, :'install gem', 'rubygems', '--dest', 'some_path'
|
253
|
+
```
|
254
|
+
|
255
|
+
```
|
256
|
+
$ foo update
|
257
|
+
# => installing rubygems to some_path
|
258
|
+
```
|
259
|
+
|
260
|
+
### Command Defaults
|
261
|
+
|
262
|
+
Although working with a command executable framework provides many
|
263
|
+
benefits over a single command implementation, sometimes you still
|
264
|
+
want the ability to create a terse syntax for your command. With that
|
265
|
+
in mind we may use `#default_command` to help with this. Considering
|
266
|
+
our previous `:'install gem'` example:
|
267
|
+
|
268
|
+
```ruby
|
269
|
+
default_command :update
|
270
|
+
```
|
271
|
+
|
272
|
+
```
|
273
|
+
$ foo
|
274
|
+
# => installing rubygems to some_path
|
275
|
+
```
|
276
|
+
|
277
|
+
Keeping in mind that commander searches for the longest possible match
|
278
|
+
when considering a command, so if you were to pass arguments to foo
|
279
|
+
like below, expecting them to be passed to `:update`, this would be incorrect,
|
280
|
+
and would end up calling `:'install gem'`, so be careful that the users do
|
281
|
+
not need to use command names within the arguments.
|
282
|
+
|
283
|
+
```
|
284
|
+
$ foo install gem
|
285
|
+
# => installing to
|
286
|
+
```
|
287
|
+
|
288
|
+
### Additional Global Help
|
289
|
+
|
290
|
+
Arbitrary help can be added using the following `#program` symbol:
|
291
|
+
|
292
|
+
```ruby
|
293
|
+
program :help, 'Author', 'TJ Holowaychuk <tj@vision-media.ca>'
|
294
|
+
```
|
295
|
+
|
296
|
+
Which will output the rest of the help doc, along with:
|
297
|
+
|
298
|
+
AUTHOR:
|
299
|
+
|
300
|
+
TJ Holowaychuk <tj@vision-media.ca>
|
301
|
+
|
302
|
+
### Global Options
|
303
|
+
|
304
|
+
Although most switches will be at the command level, several are available by
|
305
|
+
default at the global level, such as `--version`, and `--help`. Using
|
306
|
+
`#global_option` you can add additional global options:
|
307
|
+
|
308
|
+
```ruby
|
309
|
+
global_option('-c', '--config FILE', 'Load config data for your commands to use') { |file| ... }
|
310
|
+
```
|
311
|
+
|
312
|
+
This method accepts the same syntax as `Commander::Command#option` so check it out for documentation.
|
313
|
+
|
314
|
+
All global options regardless of providing a block are accessable at the command level. This
|
315
|
+
means that instead of the following:
|
316
|
+
|
317
|
+
```ruby
|
318
|
+
global_option('--verbose') { $verbose = true }
|
319
|
+
...
|
320
|
+
c.action do |args, options|
|
321
|
+
say 'foo' if $verbose
|
322
|
+
...
|
323
|
+
```
|
324
|
+
|
325
|
+
You may:
|
326
|
+
|
327
|
+
```ruby
|
328
|
+
global_option '--verbose'
|
329
|
+
...
|
330
|
+
c.action do |args, options|
|
331
|
+
say 'foo' if options.verbose
|
332
|
+
...
|
333
|
+
```
|
334
|
+
|
335
|
+
### Formatters
|
336
|
+
|
337
|
+
Two core formatters are currently available, the default `Terminal` formatter
|
338
|
+
as well as `TerminalCompact`. To utilize a different formatter simply use
|
339
|
+
`:help_formatter` like below:
|
340
|
+
|
341
|
+
```ruby
|
342
|
+
program :help_formatter, Commander::HelpFormatter::TerminalCompact
|
343
|
+
```
|
344
|
+
|
345
|
+
Or utilize the help formatter aliases:
|
346
|
+
|
347
|
+
```ruby
|
348
|
+
program :help_formatter, :compact
|
349
|
+
```
|
350
|
+
|
351
|
+
This abstraction could be utilized to generate HTML documentation for your executable.
|
352
|
+
|
353
|
+
### Tracing
|
354
|
+
|
355
|
+
By default the `-t` and `--trace` global options are provided to allow users to get a backtrace to aid debugging.
|
356
|
+
|
357
|
+
You can disable these options:
|
358
|
+
|
359
|
+
```ruby
|
360
|
+
never_trace!
|
361
|
+
```
|
362
|
+
|
363
|
+
Or make it always on:
|
364
|
+
|
365
|
+
```ruby
|
366
|
+
always_trace!
|
367
|
+
```
|
368
|
+
|
369
|
+
## Tips
|
370
|
+
|
371
|
+
When adding a global or command option, OptionParser implicitly adds a small
|
372
|
+
switch even when not explicitly created, for example `-c` will be the same as
|
373
|
+
`--config` in both examples, however `-c` will only appear in the documentation
|
374
|
+
when explicitly assigning it.
|
375
|
+
|
376
|
+
```ruby
|
377
|
+
global_option '-c', '--config FILE'
|
378
|
+
global_option '--config FILE'
|
379
|
+
```
|
380
|
+
|
381
|
+
## ASCII Tables
|
382
|
+
|
383
|
+
For feature rich ASCII tables for your terminal app check out visionmedia's terminal-table gem at http://github.com/visionmedia/terminal-table
|
384
|
+
|
385
|
+
+----------+-------+----+--------+-----------------------+
|
386
|
+
| Terminal | Table | Is | Wicked | Awesome |
|
387
|
+
+----------+-------+----+--------+-----------------------+
|
388
|
+
| | | | | get it while its hot! |
|
389
|
+
+----------+-------+----+--------+-----------------------+
|
390
|
+
|
391
|
+
## Running Specifications
|
392
|
+
|
393
|
+
$ rake spec
|
394
|
+
|
395
|
+
OR
|
396
|
+
|
397
|
+
$ spec --color spec
|
398
|
+
|
399
|
+
## Contrib
|
400
|
+
|
401
|
+
Feel free to fork and request a pull, or submit a ticket
|
402
|
+
http://github.com/visionmedia/commander/issues
|
403
|
+
|
404
|
+
## License
|
405
|
+
|
406
|
+
This project is available under the MIT license. See LICENSE for details.
|
data/commander.gemspec
CHANGED
@@ -7,6 +7,7 @@ Gem::Specification.new do |s|
|
|
7
7
|
s.version = Commander::VERSION
|
8
8
|
s.authors = ["TJ Holowaychuk", "Gabriel Gilder"]
|
9
9
|
s.email = ["ggilder@tractionco.com"]
|
10
|
+
s.license = "MIT"
|
10
11
|
s.homepage = "http://visionmedia.github.com/commander"
|
11
12
|
s.summary = "The complete solution for Ruby command-line executables"
|
12
13
|
s.description = "The complete solution for Ruby command-line executables. Commander bridges the gap between other terminal related libraries you know and love (OptionParser, HighLine), while providing many new features, and an elegant API."
|
@@ -23,4 +24,4 @@ Gem::Specification.new do |s|
|
|
23
24
|
s.add_development_dependency("rspec", "~> 2")
|
24
25
|
s.add_development_dependency("rake")
|
25
26
|
s.add_development_dependency("simplecov")
|
26
|
-
end
|
27
|
+
end
|
data/lib/commander/delegates.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
|
2
2
|
module Commander
|
3
3
|
module Delegates
|
4
|
-
%w( add_command command program run! global_option
|
5
|
-
commands alias_command default_command
|
4
|
+
%w( add_command command program run! global_option
|
5
|
+
commands alias_command default_command
|
6
|
+
always_trace! never_trace! ).each do |meth|
|
6
7
|
eval <<-END, binding, __FILE__, __LINE__
|
7
8
|
def #{meth} *args, &block
|
8
9
|
::Commander::Runner.instance.#{meth} *args, &block
|
@@ -10,4 +11,4 @@ module Commander
|
|
10
11
|
END
|
11
12
|
end
|
12
13
|
end
|
13
|
-
end
|
14
|
+
end
|
data/lib/commander/runner.rb
CHANGED
@@ -48,7 +48,7 @@ module Commander
|
|
48
48
|
# Run command parsing and execution process.
|
49
49
|
|
50
50
|
def run!
|
51
|
-
trace = false
|
51
|
+
trace = @always_trace || false
|
52
52
|
require_program :version, :description
|
53
53
|
trap('INT') { abort program(:int_message) } if program(:int_message)
|
54
54
|
trap('INT') { program(:int_block).call } if program(:int_block)
|
@@ -58,7 +58,7 @@ module Commander
|
|
58
58
|
return
|
59
59
|
end
|
60
60
|
global_option('-v', '--version', 'Display version information') { say version; return }
|
61
|
-
global_option('-t', '--trace', 'Display backtrace when an error occurs') { trace = true }
|
61
|
+
global_option('-t', '--trace', 'Display backtrace when an error occurs') { trace = true } unless @never_trace
|
62
62
|
parse_global_options
|
63
63
|
remove_global_options options, @args
|
64
64
|
unless trace
|
@@ -72,7 +72,11 @@ module Commander
|
|
72
72
|
OptionParser::MissingArgument => e
|
73
73
|
abort e.to_s
|
74
74
|
rescue => e
|
75
|
-
|
75
|
+
if @never_trace
|
76
|
+
abort "error: #{e}."
|
77
|
+
else
|
78
|
+
abort "error: #{e}. Use --trace to view backtrace"
|
79
|
+
end
|
76
80
|
end
|
77
81
|
else
|
78
82
|
run_active_command
|
@@ -85,7 +89,23 @@ module Commander
|
|
85
89
|
def version
|
86
90
|
'%s %s' % [program(:name), program(:version)]
|
87
91
|
end
|
88
|
-
|
92
|
+
|
93
|
+
##
|
94
|
+
# Enable tracing on all executions (bypasses --trace)
|
95
|
+
|
96
|
+
def always_trace!
|
97
|
+
@always_trace = true
|
98
|
+
@never_trace = false
|
99
|
+
end
|
100
|
+
|
101
|
+
##
|
102
|
+
# Hide the trace option from the help menus and don't add it as a global option
|
103
|
+
|
104
|
+
def never_trace!
|
105
|
+
@never_trace = true
|
106
|
+
@always_trace = false
|
107
|
+
end
|
108
|
+
|
89
109
|
##
|
90
110
|
# Assign program information.
|
91
111
|
#
|
@@ -284,7 +284,7 @@ module Commander
|
|
284
284
|
$stdin.reopen read
|
285
285
|
write.close; read.close
|
286
286
|
Kernel.select [$stdin]
|
287
|
-
ENV['LESS'] = 'FSRX'
|
287
|
+
ENV['LESS'] = 'FSRX' unless ENV.key? 'LESS'
|
288
288
|
pager = ENV['PAGER'] || 'less'
|
289
289
|
exec pager rescue exec '/bin/sh', '-c', pager
|
290
290
|
else
|
data/lib/commander/version.rb
CHANGED
data/spec/command_spec.rb
CHANGED
@@ -50,21 +50,21 @@ describe Commander::Command do
|
|
50
50
|
end
|
51
51
|
|
52
52
|
it "calling the #call method by default when an object is called" do
|
53
|
-
object =
|
53
|
+
object = double 'Object'
|
54
54
|
object.should_receive(:call).once
|
55
55
|
@command.when_called object
|
56
56
|
@command.run 'foo'
|
57
57
|
end
|
58
58
|
|
59
59
|
it "should allow #action as an alias to #when_called" do
|
60
|
-
object =
|
60
|
+
object = double 'Object'
|
61
61
|
object.should_receive(:call).once
|
62
62
|
@command.action object
|
63
63
|
@command.run 'foo'
|
64
64
|
end
|
65
65
|
|
66
66
|
it "calling an arbitrary method when an object is called" do
|
67
|
-
object =
|
67
|
+
object = double 'Object'
|
68
68
|
object.should_receive(:foo).once
|
69
69
|
@command.when_called object, :foo
|
70
70
|
@command.run 'foo'
|
data/spec/runner_spec.rb
CHANGED
@@ -280,7 +280,7 @@ describe Commander do
|
|
280
280
|
end.run!
|
281
281
|
}.should raise_error(SystemExit, /error: cookies!. Use --trace/)
|
282
282
|
end
|
283
|
-
|
283
|
+
|
284
284
|
it "should display callstack when using this switch" do
|
285
285
|
lambda {
|
286
286
|
new_command_runner 'foo', '--trace' do
|
@@ -289,7 +289,54 @@ describe Commander do
|
|
289
289
|
}.should raise_error(RuntimeError)
|
290
290
|
end
|
291
291
|
end
|
292
|
-
|
292
|
+
|
293
|
+
describe "#always_trace!" do
|
294
|
+
it "should enable tracing globally, regardless of whether --trace was passed or not" do
|
295
|
+
lambda {
|
296
|
+
new_command_runner 'foo' do
|
297
|
+
always_trace!
|
298
|
+
command(:foo) { |c| c.when_called { raise 'cookies!' } }
|
299
|
+
end.run!
|
300
|
+
}.should raise_error(RuntimeError)
|
301
|
+
end
|
302
|
+
end
|
303
|
+
|
304
|
+
describe "#never_trace!" do
|
305
|
+
it "should disable tracing globally, regardless of whether --trace was passed or not" do
|
306
|
+
lambda {
|
307
|
+
new_command_runner 'help', '--trace' do
|
308
|
+
never_trace!
|
309
|
+
end.run!
|
310
|
+
}.should raise_error(SystemExit, /invalid option: --trace/)
|
311
|
+
end
|
312
|
+
|
313
|
+
it "should not prompt to use --trace switch on errors" do
|
314
|
+
msg = nil
|
315
|
+
begin
|
316
|
+
new_command_runner 'foo' do
|
317
|
+
never_trace!
|
318
|
+
command(:foo) { |c| c.when_called { raise 'cookies!' } }
|
319
|
+
end.run!
|
320
|
+
rescue SystemExit => e
|
321
|
+
msg = e.message
|
322
|
+
end
|
323
|
+
msg.should match(/error: cookies!/)
|
324
|
+
msg.should_not match(/--trace/)
|
325
|
+
end
|
326
|
+
end
|
327
|
+
|
328
|
+
context "conflict between #always_trace! and #never_trace!" do
|
329
|
+
it "respects the last used command" do
|
330
|
+
lambda {
|
331
|
+
new_command_runner 'foo' do
|
332
|
+
never_trace!
|
333
|
+
always_trace!
|
334
|
+
command(:foo) { |c| c.when_called { raise 'cookies!' } }
|
335
|
+
end.run!
|
336
|
+
}.should raise_error(RuntimeError)
|
337
|
+
end
|
338
|
+
end
|
339
|
+
|
293
340
|
describe "--version" do
|
294
341
|
it "should output program version" do
|
295
342
|
run('--version').should eq("test 1.2.3\n")
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: commander
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.1.
|
5
|
-
prerelease:
|
4
|
+
version: 4.1.6
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- TJ Holowaychuk
|
@@ -10,12 +9,11 @@ authors:
|
|
10
9
|
autorequire:
|
11
10
|
bindir: bin
|
12
11
|
cert_chain: []
|
13
|
-
date:
|
12
|
+
date: 2014-02-11 00:00:00.000000000 Z
|
14
13
|
dependencies:
|
15
14
|
- !ruby/object:Gem::Dependency
|
16
15
|
name: highline
|
17
16
|
requirement: !ruby/object:Gem::Requirement
|
18
|
-
none: false
|
19
17
|
requirements:
|
20
18
|
- - ~>
|
21
19
|
- !ruby/object:Gem::Version
|
@@ -23,7 +21,6 @@ dependencies:
|
|
23
21
|
type: :runtime
|
24
22
|
prerelease: false
|
25
23
|
version_requirements: !ruby/object:Gem::Requirement
|
26
|
-
none: false
|
27
24
|
requirements:
|
28
25
|
- - ~>
|
29
26
|
- !ruby/object:Gem::Version
|
@@ -31,7 +28,6 @@ dependencies:
|
|
31
28
|
- !ruby/object:Gem::Dependency
|
32
29
|
name: rspec
|
33
30
|
requirement: !ruby/object:Gem::Requirement
|
34
|
-
none: false
|
35
31
|
requirements:
|
36
32
|
- - ~>
|
37
33
|
- !ruby/object:Gem::Version
|
@@ -39,7 +35,6 @@ dependencies:
|
|
39
35
|
type: :development
|
40
36
|
prerelease: false
|
41
37
|
version_requirements: !ruby/object:Gem::Requirement
|
42
|
-
none: false
|
43
38
|
requirements:
|
44
39
|
- - ~>
|
45
40
|
- !ruby/object:Gem::Version
|
@@ -47,33 +42,29 @@ dependencies:
|
|
47
42
|
- !ruby/object:Gem::Dependency
|
48
43
|
name: rake
|
49
44
|
requirement: !ruby/object:Gem::Requirement
|
50
|
-
none: false
|
51
45
|
requirements:
|
52
|
-
- -
|
46
|
+
- - '>='
|
53
47
|
- !ruby/object:Gem::Version
|
54
48
|
version: '0'
|
55
49
|
type: :development
|
56
50
|
prerelease: false
|
57
51
|
version_requirements: !ruby/object:Gem::Requirement
|
58
|
-
none: false
|
59
52
|
requirements:
|
60
|
-
- -
|
53
|
+
- - '>='
|
61
54
|
- !ruby/object:Gem::Version
|
62
55
|
version: '0'
|
63
56
|
- !ruby/object:Gem::Dependency
|
64
57
|
name: simplecov
|
65
58
|
requirement: !ruby/object:Gem::Requirement
|
66
|
-
none: false
|
67
59
|
requirements:
|
68
|
-
- -
|
60
|
+
- - '>='
|
69
61
|
- !ruby/object:Gem::Version
|
70
62
|
version: '0'
|
71
63
|
type: :development
|
72
64
|
prerelease: false
|
73
65
|
version_requirements: !ruby/object:Gem::Requirement
|
74
|
-
none: false
|
75
66
|
requirements:
|
76
|
-
- -
|
67
|
+
- - '>='
|
77
68
|
- !ruby/object:Gem::Version
|
78
69
|
version: '0'
|
79
70
|
description: The complete solution for Ruby command-line executables. Commander bridges
|
@@ -91,8 +82,9 @@ files:
|
|
91
82
|
- DEVELOPMENT
|
92
83
|
- Gemfile
|
93
84
|
- History.rdoc
|
85
|
+
- LICENSE
|
94
86
|
- Manifest
|
95
|
-
- README.
|
87
|
+
- README.md
|
96
88
|
- Rakefile
|
97
89
|
- bin/commander
|
98
90
|
- commander.gemspec
|
@@ -124,28 +116,28 @@ files:
|
|
124
116
|
- spec/spec_helper.rb
|
125
117
|
- spec/ui_spec.rb
|
126
118
|
homepage: http://visionmedia.github.com/commander
|
127
|
-
licenses:
|
119
|
+
licenses:
|
120
|
+
- MIT
|
121
|
+
metadata: {}
|
128
122
|
post_install_message:
|
129
123
|
rdoc_options: []
|
130
124
|
require_paths:
|
131
125
|
- lib
|
132
126
|
required_ruby_version: !ruby/object:Gem::Requirement
|
133
|
-
none: false
|
134
127
|
requirements:
|
135
|
-
- -
|
128
|
+
- - '>='
|
136
129
|
- !ruby/object:Gem::Version
|
137
130
|
version: '0'
|
138
131
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
139
|
-
none: false
|
140
132
|
requirements:
|
141
|
-
- -
|
133
|
+
- - '>='
|
142
134
|
- !ruby/object:Gem::Version
|
143
135
|
version: '0'
|
144
136
|
requirements: []
|
145
137
|
rubyforge_project: commander
|
146
|
-
rubygems_version:
|
138
|
+
rubygems_version: 2.2.1
|
147
139
|
signing_key:
|
148
|
-
specification_version:
|
140
|
+
specification_version: 4
|
149
141
|
summary: The complete solution for Ruby command-line executables
|
150
142
|
test_files:
|
151
143
|
- spec/command_spec.rb
|
data/README.rdoc
DELETED
@@ -1,372 +0,0 @@
|
|
1
|
-
{<img src="https://secure.travis-ci.org/ggilder/commander.png?branch=master" alt="Build Status" />}[http://travis-ci.org/ggilder/commander]
|
2
|
-
|
3
|
-
= Commander
|
4
|
-
|
5
|
-
The complete solution for Ruby command-line executables.
|
6
|
-
Commander bridges the gap between other terminal related libraries
|
7
|
-
you know and love (OptionParser, HighLine), while providing many new
|
8
|
-
features, and an elegant API.
|
9
|
-
|
10
|
-
== Features
|
11
|
-
|
12
|
-
* Easier than baking cookies
|
13
|
-
* Parses options using OptionParser
|
14
|
-
* Auto-populates struct with options ( no more { |v| options[:recursive] = v } )
|
15
|
-
* Auto-generates help documentation via pluggable help formatters
|
16
|
-
* Optional default command when none is present
|
17
|
-
* Global / Command level options
|
18
|
-
* Packaged with two help formatters (Terminal, TerminalCompact)
|
19
|
-
* Imports the highline gem for interacting with the terminal
|
20
|
-
* Adds additional user interaction functionality
|
21
|
-
* Highly customizable progress bar with intuitive, simple usage
|
22
|
-
* Multi-word command name support such as 'drupal module install MOD', rather than 'drupal module_install MOD'
|
23
|
-
* Sexy paging for long bodies of text
|
24
|
-
* Support for MacOS text-to-speech
|
25
|
-
* Command aliasing (very powerful, as both switches and arguments can be used)
|
26
|
-
* Growl notification support for MacOS
|
27
|
-
* Use the 'commander' executable to initialize a commander driven program
|
28
|
-
|
29
|
-
== Installation
|
30
|
-
|
31
|
-
$ gem install commander
|
32
|
-
|
33
|
-
== Quick Start
|
34
|
-
|
35
|
-
To generate a quick template for a commander app, run:
|
36
|
-
|
37
|
-
$ commander init yourfile.rb
|
38
|
-
|
39
|
-
== Example
|
40
|
-
|
41
|
-
For more option examples view the Commander::Command#option method. Also
|
42
|
-
an important feature to note is that action may be a class to instantiate,
|
43
|
-
as well as an object, specifying a method to call, so view the RDoc for more information.
|
44
|
-
|
45
|
-
require 'rubygems'
|
46
|
-
require 'commander/import'
|
47
|
-
|
48
|
-
# :name is optional, otherwise uses the basename of this executable
|
49
|
-
program :name, 'Foo Bar'
|
50
|
-
program :version, '1.0.0'
|
51
|
-
program :description, 'Stupid command that prints foo or bar.'
|
52
|
-
|
53
|
-
command :foo do |c|
|
54
|
-
c.syntax = 'foobar foo'
|
55
|
-
c.description = 'Displays foo'
|
56
|
-
c.action do |args, options|
|
57
|
-
say 'foo'
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
command :bar do |c|
|
62
|
-
c.syntax = 'foobar bar [options]'
|
63
|
-
c.description = 'Display bar with optional prefix and suffix'
|
64
|
-
c.option '--prefix STRING', String, 'Adds a prefix to bar'
|
65
|
-
c.option '--suffix STRING', String, 'Adds a suffix to bar'
|
66
|
-
c.action do |args, options|
|
67
|
-
options.default :prefix => '(', :suffix => ')'
|
68
|
-
say "#{options.prefix}bar#{options.suffix}"
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
$ foobar bar
|
73
|
-
# => (bar)
|
74
|
-
|
75
|
-
$ foobar bar --suffix '}' --prefix '{'
|
76
|
-
# => {bar}
|
77
|
-
|
78
|
-
== HighLine
|
79
|
-
|
80
|
-
As mentioned above the highline gem is imported into 'global scope', below
|
81
|
-
are some quick examples for how to utilize highline in your command(s):
|
82
|
-
|
83
|
-
# Ask for password masked with '*' character
|
84
|
-
ask("Password: ") { |q| q.echo = "*" }
|
85
|
-
|
86
|
-
# Ask for password
|
87
|
-
ask("Password: ") { |q| q.echo = false }
|
88
|
-
|
89
|
-
# Ask if the user agrees (yes or no)
|
90
|
-
agree("Do something?")
|
91
|
-
|
92
|
-
# Asks on a single line (note the space after ':')
|
93
|
-
ask("Name: ")
|
94
|
-
|
95
|
-
# Asks with new line after "Description:"
|
96
|
-
ask("Description:")
|
97
|
-
|
98
|
-
# Calls Date#parse to parse the date string passed
|
99
|
-
ask("Birthday? ", Date)
|
100
|
-
|
101
|
-
# Ensures Integer is within the range specified
|
102
|
-
ask("Age? ", Integer) { |q| q.in = 0..105 }
|
103
|
-
|
104
|
-
# Asks for a list of strings, converts to array
|
105
|
-
ask("Fav colors?", Array)
|
106
|
-
|
107
|
-
== HighLine & Interaction Additions
|
108
|
-
|
109
|
-
In addition to highline's fantastic choice of methods, commander adds the
|
110
|
-
following methods to simplify common tasks:
|
111
|
-
|
112
|
-
# Ask for password
|
113
|
-
password
|
114
|
-
|
115
|
-
# Ask for password with specific message and mask character
|
116
|
-
password "Enter your password please:", '-'
|
117
|
-
|
118
|
-
# Ask for CLASS, which may be any valid class responding to #parse. Date, Time, Array, etc
|
119
|
-
names = ask_for_array 'Names: '
|
120
|
-
bday = ask_for_date 'Birthday?: '
|
121
|
-
|
122
|
-
# Simple progress bar (Commander::UI::ProgressBar)
|
123
|
-
uris = %w[
|
124
|
-
http://vision-media.ca
|
125
|
-
http://google.com
|
126
|
-
http://yahoo.com
|
127
|
-
]
|
128
|
-
progress uris do |uri|
|
129
|
-
res = open uri
|
130
|
-
# Do something with response
|
131
|
-
end
|
132
|
-
|
133
|
-
# 'Log' action to stdout
|
134
|
-
log "create", "path/to/file.rb"
|
135
|
-
|
136
|
-
# Enable paging of output after this point
|
137
|
-
enable_paging
|
138
|
-
|
139
|
-
# Ask editor for input (EDITOR environment variable or whichever is available: TextMate, vim, vi, emacs, nano, pico)
|
140
|
-
ask_editor
|
141
|
-
|
142
|
-
# Ask editor, supplying initial text
|
143
|
-
ask_editor 'previous data to update'
|
144
|
-
|
145
|
-
# Ask editor, preferring a specific editor
|
146
|
-
ask_editor 'previous data', 'vim'
|
147
|
-
|
148
|
-
# Choose from an array of elements
|
149
|
-
choice = choose("Favorite language?", :ruby, :perl, :js)
|
150
|
-
|
151
|
-
# Alter IO for the duration of the block
|
152
|
-
io new_input, new_output do
|
153
|
-
new_input_contents = $stdin.read
|
154
|
-
puts new_input_contents # outputs to new_output stream
|
155
|
-
end
|
156
|
-
# $stdin / $stdout reset back to original streams
|
157
|
-
|
158
|
-
# Speech synthesis
|
159
|
-
speak 'What is your favorite food? '
|
160
|
-
food = ask 'favorite food?: '
|
161
|
-
speak "Wow, I like #{food} too. We have so much in common."
|
162
|
-
speak "I like #{food} as well!", "Victoria", 190
|
163
|
-
|
164
|
-
# Execute arbitrary applescript
|
165
|
-
applescript 'foo'
|
166
|
-
|
167
|
-
# Converse with speech recognition server
|
168
|
-
case converse 'What is the best food?', :cookies => 'Cookies', :unknown => 'Nothing'
|
169
|
-
when :cookies
|
170
|
-
speak 'o.m.g. you are awesome!'
|
171
|
-
else
|
172
|
-
case converse 'That is lame, shall I convince you cookies are the best?', :yes => 'Ok', :no => 'No', :maybe => 'Maybe another time'
|
173
|
-
when :yes
|
174
|
-
speak 'Well you see, cookies are just fantastic, they melt in your mouth.'
|
175
|
-
else
|
176
|
-
speak 'Ok then, bye.'
|
177
|
-
end
|
178
|
-
end
|
179
|
-
|
180
|
-
== Growl Notifications
|
181
|
-
|
182
|
-
Commander provides methods for displaying Growl notifications. To use these
|
183
|
-
methods you need to install http://github.com/visionmedia/growl which utilizes
|
184
|
-
the growlnotify[http://growl.info/extras.php#growlnotify] executable. Note that
|
185
|
-
growl is auto-imported by Commander when available, no need to require.
|
186
|
-
|
187
|
-
# Display a generic Growl notification
|
188
|
-
notify 'Something happened'
|
189
|
-
|
190
|
-
# Display an 'info' status notification
|
191
|
-
notify_info 'You have #{emails.length} new email(s)'
|
192
|
-
|
193
|
-
# Display an 'ok' status notification
|
194
|
-
notify_ok 'Gems updated'
|
195
|
-
|
196
|
-
# Display a 'warning' status notification
|
197
|
-
notify_warning '1 gem failed installation'
|
198
|
-
|
199
|
-
# Display an 'error' status notification
|
200
|
-
notify_error "Gem #{name} failed"
|
201
|
-
|
202
|
-
== Commander Goodies
|
203
|
-
|
204
|
-
=== Option Defaults
|
205
|
-
|
206
|
-
The options struct passed to #action provides a #default method, allowing you
|
207
|
-
to set defaults in a clean manner for options which have not been set.
|
208
|
-
|
209
|
-
command :foo do |c|
|
210
|
-
c.option '--interval SECONDS', Integer, 'Interval in seconds'
|
211
|
-
c.option '--timeout SECONDS', Integer, 'Timeout in seconds'
|
212
|
-
c.action do |args, options|
|
213
|
-
options.default \
|
214
|
-
:interval => 2,
|
215
|
-
:timeout => 60
|
216
|
-
end
|
217
|
-
end
|
218
|
-
|
219
|
-
=== Command Aliasing
|
220
|
-
|
221
|
-
Aliases can be created using the #alias_command method like below:
|
222
|
-
|
223
|
-
command :'install gem' do |c|
|
224
|
-
c.action { puts 'foo' }
|
225
|
-
end
|
226
|
-
alias_command :'gem install', :'install gem'
|
227
|
-
|
228
|
-
Or more complicated aliases can be made, passing any arguments
|
229
|
-
as if it was invoked via the command line:
|
230
|
-
|
231
|
-
command :'install gem' do |c|
|
232
|
-
c.syntax = 'install gem <name> [options]'
|
233
|
-
c.option '--dest DIR', String, 'Destination directory'
|
234
|
-
c.action { |args, options| puts "installing #{args.first} to #{options.dest}" }
|
235
|
-
end
|
236
|
-
alias_command :update, :'install gem', 'rubygems', '--dest', 'some_path'
|
237
|
-
|
238
|
-
$ foo update
|
239
|
-
# => installing rubygems to some_path
|
240
|
-
|
241
|
-
=== Command Defaults
|
242
|
-
|
243
|
-
Although working with a command executable framework provides many
|
244
|
-
benefits over a single command implementation, sometimes you still
|
245
|
-
want the ability to create a terse syntax for your command. With that
|
246
|
-
in mind we may use #default_command to help with this. Considering
|
247
|
-
our previous :'install gem' example:
|
248
|
-
|
249
|
-
default_command :update
|
250
|
-
|
251
|
-
$ foo
|
252
|
-
# => installing rubygems to some_path
|
253
|
-
|
254
|
-
Keeping in mind that commander searches for the longest possible match
|
255
|
-
when considering a command, so if you were to pass arguments to foo
|
256
|
-
like below, expecting them to be passed to :update, this would be incorrect,
|
257
|
-
and would end up calling :'install gem', so be careful that the users do
|
258
|
-
not need to use command names within the arguments.
|
259
|
-
|
260
|
-
$ foo install gem
|
261
|
-
# => installing to
|
262
|
-
|
263
|
-
=== Additional Global Help
|
264
|
-
|
265
|
-
Arbitrary help can be added using the following #program symbol:
|
266
|
-
|
267
|
-
program :help, 'Author', 'TJ Holowaychuk <tj@vision-media.ca>'
|
268
|
-
|
269
|
-
Which will output the rest of the help doc, along with:
|
270
|
-
|
271
|
-
AUTHOR:
|
272
|
-
|
273
|
-
TJ Holowaychuk <tj@vision-media.ca>
|
274
|
-
|
275
|
-
=== Global Options
|
276
|
-
|
277
|
-
Although most switches will be at the command level, several are available
|
278
|
-
by default at the global level, such as --version, and --help. Using #global_option
|
279
|
-
you can add additional global options:
|
280
|
-
|
281
|
-
global_option('-c', '--config FILE', 'Load config data for your commands to use') { |file| ... }
|
282
|
-
|
283
|
-
This method accepts the same syntax as Commander::Command#option so check it out for documentation.
|
284
|
-
|
285
|
-
All global options regardless of providing a block are accessable at the command level. This
|
286
|
-
means that instead of the following:
|
287
|
-
|
288
|
-
global_option('--verbose') { $verbose = true }
|
289
|
-
...
|
290
|
-
c.action do |args, options|
|
291
|
-
say 'foo' if $verbose
|
292
|
-
...
|
293
|
-
|
294
|
-
You may:
|
295
|
-
|
296
|
-
global_option '--verbose'
|
297
|
-
...
|
298
|
-
c.action do |args, options|
|
299
|
-
say 'foo' if options.verbose
|
300
|
-
...
|
301
|
-
|
302
|
-
=== Formatters
|
303
|
-
|
304
|
-
Two core formatters are currently available, the default Terminal formatter as well
|
305
|
-
as TerminalCompact. To utilize a different formatter simply use :help_formatter like below:
|
306
|
-
|
307
|
-
program :help_formatter, Commander::HelpFormatter::TerminalCompact
|
308
|
-
|
309
|
-
Or utilize the help formatter aliases:
|
310
|
-
|
311
|
-
program :help_formatter, :compact
|
312
|
-
|
313
|
-
This abstraction could be utilized to generate HTML documentation for your executable.
|
314
|
-
|
315
|
-
== Tips
|
316
|
-
|
317
|
-
When adding a global or command option, OptionParser implicitly adds a small
|
318
|
-
switch even when not explicitly created, for example -c will be the same as --config
|
319
|
-
in both examples, however '-c' will only appear in the documentation when explicitly
|
320
|
-
assigning it.
|
321
|
-
|
322
|
-
global_option '-c', '--config FILE'
|
323
|
-
global_option '--config FILE'
|
324
|
-
|
325
|
-
== ASCII Tables
|
326
|
-
|
327
|
-
For feature rich ASCII tables for your terminal app check out visionmedia's terminal-table gem at
|
328
|
-
http://github.com/visionmedia/terminal-table
|
329
|
-
|
330
|
-
+----------+-------+----+--------+-----------------------+
|
331
|
-
| Terminal | Table | Is | Wicked | Awesome |
|
332
|
-
+----------+-------+----+--------+-----------------------+
|
333
|
-
| | | | | get it while its hot! |
|
334
|
-
+----------+-------+----+--------+-----------------------+
|
335
|
-
|
336
|
-
== Running Specifications
|
337
|
-
|
338
|
-
$ rake spec
|
339
|
-
|
340
|
-
OR
|
341
|
-
|
342
|
-
$ spec --color spec
|
343
|
-
|
344
|
-
== Contrib
|
345
|
-
|
346
|
-
Feel free to fork and request a pull, or submit a ticket
|
347
|
-
http://github.com/visionmedia/commander/issues
|
348
|
-
|
349
|
-
== License
|
350
|
-
|
351
|
-
(The MIT License)
|
352
|
-
|
353
|
-
Copyright (c) 2008-2009 TJ Holowaychuk <tj@vision-media.ca>
|
354
|
-
|
355
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
356
|
-
a copy of this software and associated documentation files (the
|
357
|
-
'Software'), to deal in the Software without restriction, including
|
358
|
-
without limitation the rights to use, copy, modify, merge, publish,
|
359
|
-
distribute, sublicense, and/or sell copies of the Software, and to
|
360
|
-
permit persons to whom the Software is furnished to do so, subject to
|
361
|
-
the following conditions:
|
362
|
-
|
363
|
-
The above copyright notice and this permission notice shall be
|
364
|
-
included in all copies or substantial portions of the Software.
|
365
|
-
|
366
|
-
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
367
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
368
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
369
|
-
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
370
|
-
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
371
|
-
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
372
|
-
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|