cli 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +84 -4
- data/VERSION +1 -1
- data/cli.gemspec +3 -2
- data/examples/httpclient +26 -0
- data/examples/ls +2 -1
- data/examples/processor +2 -1
- data/examples/sinatra +11 -10
- data/lib/cli.rb +28 -17
- data/lib/cli/options.rb +4 -0
- data/spec/argument_spec.rb +62 -54
- data/spec/usage_spec.rb +72 -27
- metadata +5 -4
data/README.md
CHANGED
@@ -8,9 +8,87 @@ Command Line Interface gem allows you to quickly specify command argument parser
|
|
8
8
|
|
9
9
|
## Examples
|
10
10
|
|
11
|
+
### HTTPClient example
|
12
|
+
|
13
|
+
The following example shows basic usage of the CLI gem.
|
14
|
+
It will use HTTPClient to connect to server that address and port can be specified with `--server` and `--port` switches.
|
15
|
+
It expects at least one argument specifying the URL (that needs to start with `/`) and optional set of POST arguments.
|
16
|
+
|
17
|
+
```ruby
|
18
|
+
re 'rubygems'
|
19
|
+
require 'cli'
|
20
|
+
require 'httpclient'
|
21
|
+
|
22
|
+
options = CLI.new do
|
23
|
+
option :server, :description => 'server address', :default => 'www.google.com'
|
24
|
+
option :port, :description => 'server port', :cast => Integer, :default => 80
|
25
|
+
argument :url, :description => 'URL to GET or POST to if arguments are given'
|
26
|
+
arguments :post_arguments, :required => false
|
27
|
+
end.parse! do |options|
|
28
|
+
fail "invalid URL '#{options.url}', URL has to start with '/'" unless options.url =~ /^\//
|
29
|
+
end
|
30
|
+
|
31
|
+
c = HTTPClient.new
|
32
|
+
|
33
|
+
begin
|
34
|
+
if options.post_arguments.empty?
|
35
|
+
puts c.get_async("http://#{options.server}:#{options.port}#{options.url}").pop.content.read
|
36
|
+
else
|
37
|
+
puts c.post_async("http://#{options.server}:#{options.port}#{options.url}", options.post_arguments.join("\n")).pop.content.read
|
38
|
+
end
|
39
|
+
rescue SocketError, Errno::ECONNREFUSED => e
|
40
|
+
puts "Falied to connect: #{e}"
|
41
|
+
end
|
42
|
+
```
|
43
|
+
|
44
|
+
Example usage with default server:
|
45
|
+
|
46
|
+
examples/httpclient /index.html
|
47
|
+
|
48
|
+
The output will contain Google website.
|
49
|
+
|
50
|
+
Using different server:
|
51
|
+
|
52
|
+
examples/httpclient --server ibm.com /index.html
|
53
|
+
|
54
|
+
When run without arguments:
|
55
|
+
|
56
|
+
examples/httpclient
|
57
|
+
|
58
|
+
The following message will be printed and the program will exit (status 42):
|
59
|
+
|
60
|
+
Error: mandatory argument 'url' not given
|
61
|
+
Usage: httpclient [switches|options] [--] url [post-arguments*]
|
62
|
+
Switches:
|
63
|
+
--help (-h) - display this help message
|
64
|
+
Options:
|
65
|
+
--server [www.google.com] - server address
|
66
|
+
--port [80] - server port
|
67
|
+
Arguments:
|
68
|
+
url - URL to GET or POST to if arguments are given
|
69
|
+
post-arguments* (optional)
|
70
|
+
|
71
|
+
When used with command that does not start with `/`:
|
72
|
+
|
73
|
+
examples/httpclient test
|
74
|
+
|
75
|
+
It will print the following message and exit:
|
76
|
+
|
77
|
+
Error: invalid URL 'test', URL has to start with '/'
|
78
|
+
Usage: httpclient [switches|options] [--] url [post-arguments*]
|
79
|
+
Switches:
|
80
|
+
--help (-h) - display this help message
|
81
|
+
Options:
|
82
|
+
--server [www.google.com] - server address
|
83
|
+
--port [80] - server port
|
84
|
+
Arguments:
|
85
|
+
url - URL to GET or POST to if arguments are given
|
86
|
+
post-arguments* (optional)
|
87
|
+
|
11
88
|
### Sinatra server example
|
12
89
|
|
13
90
|
```ruby
|
91
|
+
require 'rubygems'
|
14
92
|
require 'cli'
|
15
93
|
require 'ip'
|
16
94
|
|
@@ -84,6 +162,7 @@ Example version output:
|
|
84
162
|
### Statistic data processor example
|
85
163
|
|
86
164
|
```ruby
|
165
|
+
require 'rubygems'
|
87
166
|
require 'cli'
|
88
167
|
require 'pathname'
|
89
168
|
require 'yaml'
|
@@ -106,7 +185,7 @@ p options
|
|
106
185
|
|
107
186
|
Example help message:
|
108
187
|
|
109
|
-
Usage: processor [switches|options] [--] jekyll-dir < log-data
|
188
|
+
Usage: processor [switches|options] [--] [jekyll-dir] < log-data
|
110
189
|
Generate blog posts in given Jekyll directory from input statistics
|
111
190
|
Input:
|
112
191
|
log-data - statistic data in YAML format
|
@@ -116,7 +195,7 @@ Example help message:
|
|
116
195
|
--location (-l) - location name (ex. Dublin, Singapore, Califorina)
|
117
196
|
--csv-dir (-c) [csv] - directory name where CSV file will be storred (relative to jekyll-dir)
|
118
197
|
Arguments:
|
119
|
-
jekyll-dir - directory where site source is located
|
198
|
+
jekyll-dir [/var/lib/vhs/jekyll] - directory where site source is located
|
120
199
|
|
121
200
|
With this example usage (assuming /var/lib/vhs/jekyll/csv dir exist):
|
122
201
|
|
@@ -133,7 +212,7 @@ The `options` variable will contain:
|
|
133
212
|
Output if jekyll-dir does not exist:
|
134
213
|
|
135
214
|
Error: jekyll-dir is not a directory
|
136
|
-
Usage: processor [switches|options] [--] jekyll-dir < log-data
|
215
|
+
Usage: processor [switches|options] [--] [jekyll-dir] < log-data
|
137
216
|
Generate blog posts in given Jekyll directory from input statistics
|
138
217
|
Input:
|
139
218
|
log-data - statistic data in YAML format
|
@@ -155,6 +234,7 @@ Default and mandatory arguments will have priority on matching values (see specs
|
|
155
234
|
The `options` specifier matched value will always be an array of casted elements or empty if option not specified.
|
156
235
|
|
157
236
|
```ruby
|
237
|
+
require 'rubygems'
|
158
238
|
require 'cli'
|
159
239
|
require 'pathname'
|
160
240
|
|
@@ -182,7 +262,7 @@ end
|
|
182
262
|
|
183
263
|
Example help message:
|
184
264
|
|
185
|
-
Usage: ls [switches|options] [--] directories*
|
265
|
+
Usage: ls [switches|options] [--] [directories*]
|
186
266
|
Lists content of directories
|
187
267
|
Switches:
|
188
268
|
--long (-l) - use long listing
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.1.0
|
data/cli.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "cli"
|
8
|
-
s.version = "1.
|
8
|
+
s.version = "1.1.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Jakub Pastuszek"]
|
12
|
-
s.date = "
|
12
|
+
s.date = "2012-01-02"
|
13
13
|
s.description = "Command Line Interface gem allows you to quickly specify command argument parser that will automatically generate usage, handle stdin, switches, options and arguments with default values and value casting"
|
14
14
|
s.email = "jpastuszek@gmail.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -26,6 +26,7 @@ Gem::Specification.new do |s|
|
|
26
26
|
"Rakefile",
|
27
27
|
"VERSION",
|
28
28
|
"cli.gemspec",
|
29
|
+
"examples/httpclient",
|
29
30
|
"examples/ls",
|
30
31
|
"examples/processor",
|
31
32
|
"examples/sinatra",
|
data/examples/httpclient
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
require 'rubygems'
|
3
|
+
require 'cli'
|
4
|
+
require 'httpclient'
|
5
|
+
|
6
|
+
options = CLI.new do
|
7
|
+
option :server, :description => 'server address', :default => 'www.google.com'
|
8
|
+
option :port, :description => 'server port', :cast => Integer, :default => 80
|
9
|
+
argument :url, :description => 'URL to GET or POST to if arguments are given'
|
10
|
+
arguments :post_arguments, :required => false
|
11
|
+
end.parse! do |options|
|
12
|
+
fail "invalid URL '#{options.url}', URL has to start with '/'" unless options.url =~ /^\//
|
13
|
+
end
|
14
|
+
|
15
|
+
c = HTTPClient.new
|
16
|
+
|
17
|
+
begin
|
18
|
+
if options.post_arguments.empty?
|
19
|
+
puts c.get_async("http://#{options.server}:#{options.port}#{options.url}").pop.content.read
|
20
|
+
else
|
21
|
+
puts c.post_async("http://#{options.server}:#{options.port}#{options.url}", options.post_arguments.join("\n")).pop.content.read
|
22
|
+
end
|
23
|
+
rescue SocketError, Errno::ECONNREFUSED => e
|
24
|
+
puts "Falied to connect: #{e}"
|
25
|
+
end
|
26
|
+
|
data/examples/ls
CHANGED
data/examples/processor
CHANGED
data/examples/sinatra
CHANGED
@@ -1,20 +1,21 @@
|
|
1
|
-
#!/usr/bin/ruby
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
require 'rubygems'
|
2
3
|
require 'cli'
|
3
4
|
require 'ip'
|
4
5
|
|
5
6
|
options = CLI.new do
|
6
7
|
description 'Example CLI usage for Sinatra server application'
|
7
8
|
version "1.0.0"
|
8
|
-
switch :no_bind,
|
9
|
-
switch :no_logging,
|
10
|
-
switch :debug,
|
9
|
+
switch :no_bind, :description => "Do not bind to TCP socket - useful with -s fastcgi option"
|
10
|
+
switch :no_logging, :description => "Disable logging"
|
11
|
+
switch :debug, :description => "Enable debugging"
|
11
12
|
switch :no_optimization, :description => "Disable size hinting and related optimization (loading, prescaling)"
|
12
|
-
option :bind,
|
13
|
-
option :port,
|
14
|
-
option :server,
|
15
|
-
option :limit_memory,
|
16
|
-
option :limit_map,
|
17
|
-
option :limit_disk,
|
13
|
+
option :bind, :short => :b, :default => '127.0.0.1', :cast => IP, :description => "HTTP server bind address - use 0.0.0.0 to bind to all interfaces"
|
14
|
+
option :port, :short => :p, :default => 3100, :cast => Integer, :description => "HTTP server TCP port"
|
15
|
+
option :server, :short => :s, :default => 'mongrel', :description => "Rack server handler like thin, mongrel, webrick, fastcgi etc."
|
16
|
+
option :limit_memory, :default => 128*1024**2, :cast => Integer, :description => "Image cache heap memory size limit in bytes"
|
17
|
+
option :limit_map, :default => 256*1024**2, :cast => Integer, :description => "Image cache memory mapped file size limit in bytes - used when heap memory limit is used up"
|
18
|
+
option :limit_disk, :default => 0, :cast => Integer, :description => "Image cache temporary file size limit in bytes - used when memory mapped file limit is used up"
|
18
19
|
end.parse!
|
19
20
|
|
20
21
|
p options
|
data/lib/cli.rb
CHANGED
@@ -234,15 +234,7 @@ class CLI
|
|
234
234
|
# process arguments
|
235
235
|
arguments = @arguments.dup
|
236
236
|
while argument = arguments.shift
|
237
|
-
value = if arguments.mandatory.length
|
238
|
-
if argument.has_default?
|
239
|
-
argument.default
|
240
|
-
elsif not argument.mandatory?
|
241
|
-
argument.multiple? ? [] : nil
|
242
|
-
else
|
243
|
-
raise ParsingError::MandatoryArgumentNotSpecifiedError.new(argument) if argv.empty?
|
244
|
-
end
|
245
|
-
else
|
237
|
+
value = if arguments.mandatory.length < argv.length
|
246
238
|
arg = argv.shift
|
247
239
|
|
248
240
|
if argument.multiple?
|
@@ -254,6 +246,14 @@ class CLI
|
|
254
246
|
else
|
255
247
|
arg
|
256
248
|
end
|
249
|
+
else
|
250
|
+
if argument.has_default?
|
251
|
+
argument.default
|
252
|
+
elsif not argument.mandatory?
|
253
|
+
argument.multiple? ? [] : nil
|
254
|
+
else
|
255
|
+
raise ParsingError::MandatoryArgumentNotSpecifiedError.new(argument) if argv.empty?
|
256
|
+
end
|
257
257
|
end
|
258
258
|
|
259
259
|
values.value(argument, argument.cast(value))
|
@@ -298,11 +298,21 @@ class CLI
|
|
298
298
|
out = StringIO.new
|
299
299
|
out.puts msg if msg
|
300
300
|
out.print "Usage: #{CLI.name}"
|
301
|
-
out.print ' [switches|options]' if not @switches.empty? and not @options.empty?
|
302
|
-
out.print ' [switches]' if not @switches.empty? and @options.empty?
|
303
|
-
out.print ' [options]' if @switches.empty? and not @options.empty?
|
301
|
+
out.print ' [switches|options]' if not @switches.empty? and not @options.optional.empty?
|
302
|
+
out.print ' [switches]' if not @switches.empty? and @options.optional.empty?
|
303
|
+
out.print ' [options]' if @switches.empty? and not @options.optional.empty?
|
304
|
+
@options.mandatory.each do |o|
|
305
|
+
out.print " #{o.switch} <value>"
|
306
|
+
end
|
304
307
|
out.print ' [--]' if not @arguments.empty? and (not @switches.empty? or not @options.empty?)
|
305
|
-
out.print ' '
|
308
|
+
out.print ' ' unless @arguments.empty?
|
309
|
+
out.print(@arguments.map do |a|
|
310
|
+
v = ''
|
311
|
+
v += '[' unless a.mandatory?
|
312
|
+
v += a.multiple? ? a.to_s + '*': a.to_s
|
313
|
+
v += ']' unless a.mandatory?
|
314
|
+
v
|
315
|
+
end.join(' '))
|
306
316
|
out.print " < #{@stdin}" if @stdin
|
307
317
|
|
308
318
|
out.puts
|
@@ -333,23 +343,24 @@ class CLI
|
|
333
343
|
out.print " #{o.switch}*"
|
334
344
|
end
|
335
345
|
out.print " (#{o.switch_short})" if o.has_short?
|
346
|
+
out.print ' (mandatory)' if o.mandatory?
|
336
347
|
out.print " [%s]" % o.default if o.has_default?
|
337
348
|
out.print " - #{o.description}" if o.description?
|
338
349
|
out.puts
|
339
350
|
end
|
340
351
|
end
|
341
352
|
|
342
|
-
|
343
|
-
unless described_arguments.empty?
|
353
|
+
unless @arguments.empty?
|
344
354
|
out.puts "Arguments:"
|
345
|
-
|
355
|
+
@arguments.each do |a|
|
346
356
|
unless a.multiple?
|
347
357
|
out.print " #{a}"
|
348
358
|
else
|
349
359
|
out.print " #{a}*"
|
350
360
|
end
|
361
|
+
out.print ' (optional)' if not a.mandatory? and not a.has_default?
|
351
362
|
out.print " [%s]" % (a.default.is_a?(Array) ? a.default.join(' ') : a.default) if a.has_default?
|
352
|
-
out.print " - #{a.description}"
|
363
|
+
out.print " - #{a.description}" if a.description?
|
353
364
|
out.puts
|
354
365
|
end
|
355
366
|
end
|
data/lib/cli/options.rb
CHANGED
data/spec/argument_spec.rb
CHANGED
@@ -150,62 +150,21 @@ describe CLI do
|
|
150
150
|
}.should raise_error CLI::ParserError::MultipleArgumentsSpecifierError, "only one 'arguments' specifier can be used, got: test1, test3"
|
151
151
|
end
|
152
152
|
|
153
|
-
it "should not require non mandatory argument" do
|
154
|
-
ps = CLI.new do
|
155
|
-
argument :log, :cast => Pathname
|
156
|
-
argument :test, :required => false
|
157
|
-
end.parse(['/tmp'])
|
158
|
-
ps.log.should be_a Pathname
|
159
|
-
ps.log.to_s.should == '/tmp'
|
160
|
-
ps.test.should be_nil
|
161
|
-
end
|
162
|
-
|
163
153
|
describe "with defaults" do
|
164
|
-
it "
|
165
|
-
ps = CLI.new do
|
166
|
-
argument :log, :cast => Pathname, :default => '/tmp'
|
167
|
-
argument :test
|
168
|
-
end.parse(['hello'])
|
169
|
-
ps.log.should be_a Pathname
|
170
|
-
ps.log.to_s.should == '/tmp'
|
171
|
-
ps.test.should be_a String
|
172
|
-
ps.test.should == 'hello'
|
173
|
-
|
174
|
-
ps = CLI.new do
|
175
|
-
argument :log, :cast => Pathname
|
176
|
-
argument :test, :default => 'hello'
|
177
|
-
end.parse(['/tmp'])
|
178
|
-
ps.log.should be_a Pathname
|
179
|
-
ps.log.to_s.should == '/tmp'
|
180
|
-
ps.test.should be_a String
|
181
|
-
ps.test.should == 'hello'
|
182
|
-
|
183
|
-
ps = CLI.new do
|
184
|
-
argument :log, :cast => Pathname
|
185
|
-
argument :magick, :default => 'word'
|
186
|
-
argument :test
|
187
|
-
argument :code, :cast => Integer, :default => '123'
|
188
|
-
end.parse(['/tmp', 'hello'])
|
189
|
-
ps.log.to_s.should == '/tmp'
|
190
|
-
ps.magick.should == 'word'
|
191
|
-
ps.test.should == 'hello'
|
192
|
-
ps.code.should == 123
|
193
|
-
|
154
|
+
it "should fill defaults form the beginning if more than required arguments are given" do
|
194
155
|
ps = CLI.new do
|
195
|
-
argument :
|
196
|
-
argument :
|
197
|
-
argument :
|
198
|
-
argument :
|
199
|
-
argument :
|
200
|
-
end.parse(['
|
201
|
-
ps.
|
202
|
-
ps.
|
203
|
-
ps.
|
204
|
-
ps.
|
205
|
-
ps.
|
206
|
-
end
|
156
|
+
argument :test1, :default => 'x'
|
157
|
+
argument :test2
|
158
|
+
argument :test3, :default => 'c'
|
159
|
+
argument :test4, :default => 'd'
|
160
|
+
argument :test5, :default => 'e'
|
161
|
+
end.parse(['a', 'b'])
|
162
|
+
ps.test1.should == 'a'
|
163
|
+
ps.test2.should == 'b'
|
164
|
+
ps.test3.should == 'c'
|
165
|
+
ps.test4.should == 'd'
|
166
|
+
ps.test5.should == 'e'
|
207
167
|
|
208
|
-
it "should fill defaults form the beginning if more than required arguments are given" do
|
209
168
|
ps = CLI.new do
|
210
169
|
argument :log, :cast => Pathname
|
211
170
|
argument :magick, :default => 'word'
|
@@ -272,7 +231,56 @@ describe CLI do
|
|
272
231
|
ps.code.should == 123
|
273
232
|
end
|
274
233
|
|
275
|
-
it "should
|
234
|
+
it "should fill at least one value of required multiple arguments argument" do
|
235
|
+
ps = CLI.new do
|
236
|
+
argument :test1, :default => 'x'
|
237
|
+
argument :test2, :default => 'b'
|
238
|
+
arguments :test3
|
239
|
+
argument :test4, :default => 'd'
|
240
|
+
argument :test5, :default => 'e'
|
241
|
+
end.parse(['a', 'c'])
|
242
|
+
ps.test1.should == 'a'
|
243
|
+
ps.test2.should == 'b'
|
244
|
+
ps.test3.should == ['c']
|
245
|
+
ps.test4.should == 'd'
|
246
|
+
ps.test5.should == 'e'
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
describe "not required" do
|
251
|
+
it "argument that is not required may be nil if there is not enought command arguments" do
|
252
|
+
ps = CLI.new do
|
253
|
+
argument :test1, :required => false
|
254
|
+
argument :test2, :required => false
|
255
|
+
argument :test3, :required => false
|
256
|
+
argument :test4, :required => false
|
257
|
+
argument :test5, :required => false
|
258
|
+
end.parse(['a', 'b'])
|
259
|
+
ps.test1.should == 'a'
|
260
|
+
ps.test2.should == 'b'
|
261
|
+
ps.test3.should be_nil
|
262
|
+
ps.test4.should be_nil
|
263
|
+
ps.test5.should be_nil
|
264
|
+
|
265
|
+
ps = CLI.new do
|
266
|
+
argument :log, :cast => Pathname
|
267
|
+
argument :test, :required => false
|
268
|
+
end.parse(['/tmp'])
|
269
|
+
ps.log.should be_a Pathname
|
270
|
+
ps.log.to_s.should == '/tmp'
|
271
|
+
ps.test.should be_nil
|
272
|
+
end
|
273
|
+
|
274
|
+
it "should use empty array for multiple arguments argument when not enought arguments given and it is not required" do
|
275
|
+
ps = CLI.new do
|
276
|
+
argument :test1, :required => false
|
277
|
+
argument :test2, :required => false
|
278
|
+
arguments :test3, :required => false
|
279
|
+
end.parse(['a', 'b'])
|
280
|
+
ps.test1.should == 'a'
|
281
|
+
ps.test2.should == 'b'
|
282
|
+
ps.test3.should == []
|
283
|
+
|
276
284
|
ps = CLI.new do
|
277
285
|
argument :log, :cast => Pathname
|
278
286
|
argument :magick, :default => 'word'
|
data/spec/usage_spec.rb
CHANGED
@@ -184,39 +184,79 @@ describe CLI do
|
|
184
184
|
ss.usage.should include("4")
|
185
185
|
end
|
186
186
|
|
187
|
-
|
188
|
-
|
189
|
-
|
187
|
+
describe "usage line" do
|
188
|
+
it "should suggest that arguments can be used in usage line" do
|
189
|
+
ss = CLI.new do
|
190
|
+
argument :location
|
191
|
+
end
|
192
|
+
|
193
|
+
# switches will always be there due to implicit --help switch
|
194
|
+
ss.usage.first.should == "Usage: rspec [switches] [--] location\n"
|
190
195
|
end
|
191
196
|
|
192
|
-
|
193
|
-
|
194
|
-
|
197
|
+
it "should suggest that switches can be used in usage line" do
|
198
|
+
ss = CLI.new do
|
199
|
+
switch :location, :short => :l
|
200
|
+
end
|
195
201
|
|
196
|
-
|
197
|
-
ss = CLI.new do
|
198
|
-
switch :location, :short => :l
|
202
|
+
ss.usage.first.should == "Usage: rspec [switches]\n"
|
199
203
|
end
|
200
204
|
|
201
|
-
|
202
|
-
|
205
|
+
it "should suggest that options can be used in usage line" do
|
206
|
+
ss = CLI.new do
|
207
|
+
option :location, :short => :l
|
208
|
+
end
|
203
209
|
|
204
|
-
|
205
|
-
|
206
|
-
option :location, :short => :l
|
210
|
+
# switches will always be there due to implicit --help switch
|
211
|
+
ss.usage.first.should == "Usage: rspec [switches|options]\n"
|
207
212
|
end
|
208
213
|
|
209
|
-
|
210
|
-
|
211
|
-
|
214
|
+
it "should suggest that switches or options can be used in usage line" do
|
215
|
+
ss = CLI.new do
|
216
|
+
switch :location, :short => :l
|
217
|
+
option :size, :short => :s
|
218
|
+
end
|
212
219
|
|
213
|
-
|
214
|
-
ss = CLI.new do
|
215
|
-
switch :location, :short => :l
|
216
|
-
option :size, :short => :s
|
220
|
+
ss.usage.first.should == "Usage: rspec [switches|options]\n"
|
217
221
|
end
|
218
222
|
|
219
|
-
|
223
|
+
it "should suggest that option is mandatory" do
|
224
|
+
ss = CLI.new do
|
225
|
+
option :size, :required => true
|
226
|
+
option :group, :short => :g, :required => true
|
227
|
+
end
|
228
|
+
|
229
|
+
# switches will always be there due to implicit --help switch
|
230
|
+
ss.usage.first.should == "Usage: rspec [switches] --size <value> --group <value>\n"
|
231
|
+
|
232
|
+
ss = CLI.new do
|
233
|
+
option :location, :short => :l
|
234
|
+
option :size, :required => true
|
235
|
+
option :group, :short => :g, :required => true
|
236
|
+
end
|
237
|
+
|
238
|
+
# switches will always be there due to implicit --help switch
|
239
|
+
ss.usage.first.should == "Usage: rspec [switches|options] --size <value> --group <value>\n"
|
240
|
+
|
241
|
+
ss = CLI.new do
|
242
|
+
switch :location, :short => :l
|
243
|
+
option :size, :short => :s, :required => true
|
244
|
+
end
|
245
|
+
|
246
|
+
ss.usage.first.should == "Usage: rspec [switches] --size <value>\n"
|
247
|
+
end
|
248
|
+
|
249
|
+
it "should suggest that argument is optional" do
|
250
|
+
ss = CLI.new do
|
251
|
+
argument :location
|
252
|
+
argument :size, :required => false
|
253
|
+
argument :colour, :default => 'red'
|
254
|
+
argument :group
|
255
|
+
end
|
256
|
+
|
257
|
+
# switches will always be there due to implicit --help switch
|
258
|
+
ss.usage.first.should == "Usage: rspec [switches] [--] location [size] [colour] group\n"
|
259
|
+
end
|
220
260
|
end
|
221
261
|
|
222
262
|
it "should allow describing whole script" do
|
@@ -251,7 +291,7 @@ describe CLI do
|
|
251
291
|
u.should include("log data to process")
|
252
292
|
end
|
253
293
|
|
254
|
-
it "should provide formated usage
|
294
|
+
it "should provide formated usage" do
|
255
295
|
u = CLI.new do
|
256
296
|
description 'Log file processor'
|
257
297
|
version '1.0'
|
@@ -261,7 +301,7 @@ describe CLI do
|
|
261
301
|
switch :run
|
262
302
|
option :location, :short => :r, :description => "place where server is located"
|
263
303
|
option :group, :default => 'red'
|
264
|
-
options :power_up, :short => :p
|
304
|
+
options :power_up, :short => :p, :required => true
|
265
305
|
option :speed, :short => :s, :cast => Integer
|
266
306
|
option :the_number_of_the_beast, :short => :b, :cast => Integer, :default => 666, :description => "The number of the beast"
|
267
307
|
option :size
|
@@ -269,14 +309,15 @@ describe CLI do
|
|
269
309
|
argument :log, :cast => Pathname, :description => "log file to process"
|
270
310
|
argument :magick, :default => 'word'
|
271
311
|
argument :string
|
272
|
-
argument :
|
312
|
+
argument :limit, :cast => Integer, :required => false, :description => "limit in seconds"
|
313
|
+
argument :unlock_code, :cast => Integer, :required => false
|
273
314
|
argument :code, :cast => Integer, :default => '123', :description => "secret code"
|
274
315
|
argument :illegal_prime, :cast => Integer, :description => "prime number that represents information that it is forbidden to possess or distribute"
|
275
316
|
arguments :files, :cast => Pathname, :default => ['test', '1', '2'], :description => "files to process"
|
276
317
|
end.usage
|
277
318
|
|
278
319
|
u.should == <<EOS
|
279
|
-
Usage: rspec [switches|options] [--] log magick string
|
320
|
+
Usage: rspec [switches|options] --power-up <value> [--] log [magick] string [limit] [unlock-code] [code] illegal-prime [files*] < log-data
|
280
321
|
Log file processor
|
281
322
|
Input:
|
282
323
|
log-data - YAML formatted log data
|
@@ -289,12 +330,16 @@ Switches:
|
|
289
330
|
Options:
|
290
331
|
--location (-r) - place where server is located
|
291
332
|
--group [red]
|
292
|
-
--power-up* (-p)
|
333
|
+
--power-up* (-p) (mandatory)
|
293
334
|
--speed (-s)
|
294
335
|
--the-number-of-the-beast (-b) [666] - The number of the beast
|
295
336
|
--size
|
296
337
|
Arguments:
|
297
338
|
log - log file to process
|
339
|
+
magick [word]
|
340
|
+
string
|
341
|
+
limit (optional) - limit in seconds
|
342
|
+
unlock-code (optional)
|
298
343
|
code [123] - secret code
|
299
344
|
illegal-prime - prime number that represents information that it is forbidden to possess or distribute
|
300
345
|
files* [test 1 2] - files to process
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
|
+
- 1
|
8
9
|
- 0
|
9
|
-
|
10
|
-
version: 1.0.0
|
10
|
+
version: 1.1.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Jakub Pastuszek
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2012-01-02 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
type: :development
|
@@ -142,6 +142,7 @@ files:
|
|
142
142
|
- Rakefile
|
143
143
|
- VERSION
|
144
144
|
- cli.gemspec
|
145
|
+
- examples/httpclient
|
145
146
|
- examples/ls
|
146
147
|
- examples/processor
|
147
148
|
- examples/sinatra
|