clio 0.0.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +66 -0
- data/MANIFEST +48 -169
- data/README +13 -17
- data/RELEASE +8 -0
- data/VERSION +1 -0
- data/lib/clio/buffer.rb +93 -0
- data/lib/clio/commandable.rb +71 -69
- data/lib/clio/commandline.rb +429 -230
- data/lib/clio/consoleutils.rb +0 -16
- data/lib/clio/facets/kernel.rb +13 -0
- data/lib/clio/facets/string.rb +25 -0
- data/lib/clio/layout.rb +14 -0
- data/lib/clio/layout/flow.rb +1 -0
- data/lib/clio/layout/line.rb +23 -0
- data/lib/clio/layout/list.rb +33 -0
- data/lib/clio/layout/split.rb +122 -0
- data/lib/clio/layout/stack.rb +17 -0
- data/lib/clio/layout/table.rb +46 -0
- data/lib/clio/progressbar.rb +189 -210
- data/lib/clio/string.rb +116 -109
- data/lib/clio/usage.rb +184 -0
- data/lib/clio/usage/argument.rb +84 -0
- data/lib/clio/usage/command.rb +440 -0
- data/lib/clio/usage/interface.rb +122 -0
- data/lib/clio/usage/main.rb +165 -0
- data/lib/clio/usage/option.rb +251 -0
- data/lib/clio/usage/parser.rb +191 -0
- data/lib/clio/usage/signature.rb +55 -0
- data/meta/abstract +3 -0
- data/meta/authors +1 -0
- data/meta/created +1 -0
- data/meta/homepage +1 -0
- data/meta/license +1 -0
- data/meta/repository +1 -0
- data/meta/summary +1 -0
- data/spec/commandline/autousage.rd +56 -0
- data/spec/commandline/bracket.rd +64 -0
- data/spec/commandline/completion.rd +38 -0
- data/spec/commandline/define.rd +44 -0
- data/spec/commandline/method.rd +60 -0
- data/spec/commandline/parse.rd +72 -0
- data/spec/commandline/scenario.rd +81 -0
- data/spec/commandline/subclass.rd +54 -0
- data/spec/string/unit.rd +58 -0
- data/spec/usage/define.rd +44 -0
- data/spec/usage/parse.rd +47 -0
- metadata +65 -196
- data/HISTORY +0 -11
- data/METADATA +0 -18
- data/NEWS +0 -10
- data/admin/config/reap.yaml +0 -30
- data/admin/depot/commandline.rb +0 -219
- data/admin/depot/multicommand.rb +0 -403
- data/admin/depot/test_multicommand.rb +0 -40
- data/admin/log/notes.xml +0 -28
- data/admin/log/stats.html +0 -25
- data/admin/log/syntax.log +0 -0
- data/admin/log/testunit.log +0 -16
- data/admin/pack/clio-0.0.1.gem +0 -0
- data/admin/share/reap/example.rb +0 -7
- data/admin/temps/lib/clio/about.rb.erb +0 -4
- data/lib/clio/command.rb +0 -296
- data/lib/clio/option.rb +0 -36
- data/lib/clio/runmode.rb +0 -126
- data/test/test_command.rb +0 -42
- data/test/test_commandline.rb +0 -83
- data/vendor/Console/Console.cpp +0 -1203
- data/vendor/Console/Console.rdoc +0 -690
- data/vendor/Console/Console_ANSI.rdoc +0 -302
- data/vendor/Console/HISTORY.txt +0 -7
- data/vendor/Console/INSTALL.txt +0 -18
- data/vendor/Console/Makefile +0 -162
- data/vendor/Console/README.txt +0 -26
- data/vendor/Console/doc/classes/Win32.html +0 -115
- data/vendor/Console/doc/classes/Win32/Console.html +0 -650
- data/vendor/Console/doc/classes/Win32/Console.src/M000001.html +0 -31
- data/vendor/Console/doc/classes/Win32/Console.src/M000002.html +0 -23
- data/vendor/Console/doc/classes/Win32/Console.src/M000003.html +0 -23
- data/vendor/Console/doc/classes/Win32/Console.src/M000004.html +0 -27
- data/vendor/Console/doc/classes/Win32/Console.src/M000005.html +0 -23
- data/vendor/Console/doc/classes/Win32/Console.src/M000006.html +0 -28
- data/vendor/Console/doc/classes/Win32/Console.src/M000007.html +0 -23
- data/vendor/Console/doc/classes/Win32/Console.src/M000008.html +0 -24
- data/vendor/Console/doc/classes/Win32/Console.src/M000009.html +0 -44
- data/vendor/Console/doc/classes/Win32/Console.src/M000010.html +0 -23
- data/vendor/Console/doc/classes/Win32/Console.src/M000011.html +0 -33
- data/vendor/Console/doc/classes/Win32/Console.src/M000012.html +0 -26
- data/vendor/Console/doc/classes/Win32/Console.src/M000013.html +0 -27
- data/vendor/Console/doc/classes/Win32/Console.src/M000014.html +0 -28
- data/vendor/Console/doc/classes/Win32/Console.src/M000015.html +0 -23
- data/vendor/Console/doc/classes/Win32/Console.src/M000016.html +0 -23
- data/vendor/Console/doc/classes/Win32/Console.src/M000017.html +0 -23
- data/vendor/Console/doc/classes/Win32/Console.src/M000018.html +0 -29
- data/vendor/Console/doc/classes/Win32/Console.src/M000019.html +0 -23
- data/vendor/Console/doc/classes/Win32/Console.src/M000020.html +0 -23
- data/vendor/Console/doc/classes/Win32/Console.src/M000021.html +0 -28
- data/vendor/Console/doc/classes/Win32/Console.src/M000022.html +0 -23
- data/vendor/Console/doc/classes/Win32/Console.src/M000023.html +0 -28
- data/vendor/Console/doc/classes/Win32/Console.src/M000024.html +0 -35
- data/vendor/Console/doc/classes/Win32/Console.src/M000025.html +0 -28
- data/vendor/Console/doc/classes/Win32/Console.src/M000026.html +0 -28
- data/vendor/Console/doc/classes/Win32/Console.src/M000027.html +0 -28
- data/vendor/Console/doc/classes/Win32/Console.src/M000028.html +0 -31
- data/vendor/Console/doc/classes/Win32/Console.src/M000029.html +0 -23
- data/vendor/Console/doc/classes/Win32/Console.src/M000030.html +0 -23
- data/vendor/Console/doc/classes/Win32/Console.src/M000031.html +0 -23
- data/vendor/Console/doc/classes/Win32/Console.src/M000032.html +0 -27
- data/vendor/Console/doc/classes/Win32/Console.src/M000033.html +0 -27
- data/vendor/Console/doc/classes/Win32/Console.src/M000034.html +0 -25
- data/vendor/Console/doc/classes/Win32/Console/ANSI.html +0 -103
- data/vendor/Console/doc/classes/Win32/Console/ANSI/IO.html +0 -220
- data/vendor/Console/doc/classes/Win32/Console/ANSI/IO.src/M000035.html +0 -32
- data/vendor/Console/doc/classes/Win32/Console/ANSI/IO.src/M000036.html +0 -205
- data/vendor/Console/doc/classes/Win32/Console/ANSI/IO.src/M000037.html +0 -40
- data/vendor/Console/doc/classes/Win32/Console/ANSI/IO.src/M000038.html +0 -25
- data/vendor/Console/doc/classes/Win32/Console/API.html +0 -758
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000039.html +0 -27
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000040.html +0 -27
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000041.html +0 -27
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000042.html +0 -32
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000043.html +0 -32
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000044.html +0 -28
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000045.html +0 -26
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000046.html +0 -26
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000047.html +0 -27
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000048.html +0 -30
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000049.html +0 -29
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000050.html +0 -27
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000051.html +0 -28
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000052.html +0 -30
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000053.html +0 -27
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000054.html +0 -29
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000055.html +0 -29
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000056.html +0 -28
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000057.html +0 -27
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000058.html +0 -47
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000059.html +0 -32
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000060.html +0 -47
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000061.html +0 -34
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000062.html +0 -32
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000063.html +0 -32
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000064.html +0 -35
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000065.html +0 -26
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000066.html +0 -27
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000067.html +0 -29
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000068.html +0 -27
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000069.html +0 -27
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000070.html +0 -28
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000071.html +0 -27
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000072.html +0 -26
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000073.html +0 -27
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000074.html +0 -31
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000075.html +0 -27
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000076.html +0 -32
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000077.html +0 -27
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000078.html +0 -32
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000079.html +0 -32
- data/vendor/Console/doc/classes/Win32/Console/API.src/M000080.html +0 -32
- data/vendor/Console/doc/classes/Win32/Console/Constants.html +0 -360
- data/vendor/Console/doc/created.rid +0 -1
- data/vendor/Console/doc/files/Console_ANSI_rdoc.html +0 -407
- data/vendor/Console/doc/files/Console_cpp.html +0 -104
- data/vendor/Console/doc/files/Console_rdoc.html +0 -964
- data/vendor/Console/doc/files/lib/Win32/Console/ANSI_rb.html +0 -123
- data/vendor/Console/doc/files/lib/Win32/Console_rb.html +0 -297
- data/vendor/Console/doc/fr_class_index.html +0 -32
- data/vendor/Console/doc/fr_file_index.html +0 -31
- data/vendor/Console/doc/fr_method_index.html +0 -106
- data/vendor/Console/doc/index.html +0 -24
- data/vendor/Console/doc/rdoc-style.css +0 -172
- data/vendor/Console/extconf.rb +0 -18
- data/vendor/Console/lib/Term/ansicolor.rb +0 -76
- data/vendor/Console/lib/Win32/Console.rb +0 -970
- data/vendor/Console/lib/Win32/Console/ANSI.rb +0 -305
- data/vendor/Console/test/test_cursor.rb +0 -9
- data/vendor/Console/test/test_mouse.rb +0 -6
- data/vendor/Console/test/test_readinput.rb +0 -62
- data/vendor/Console/test/test_readoutput.rb +0 -52
- data/vendor/Console/test/test_sendevent.rb +0 -17
- data/vendor/Console/test/test_title.rb +0 -14
- data/vendor/Console/test/test_write.rb +0 -36
@@ -0,0 +1,55 @@
|
|
1
|
+
module Clio
|
2
|
+
|
3
|
+
module Usage #:nodoc:
|
4
|
+
|
5
|
+
# = Command Signature
|
6
|
+
#
|
7
|
+
# Used by the Usage::Parser as the end result
|
8
|
+
# of parsing a Usage::Command.
|
9
|
+
#
|
10
|
+
class Signature
|
11
|
+
def initialize(c, a, o)
|
12
|
+
@signature = [c, a, o]
|
13
|
+
@command = c
|
14
|
+
@arguments = a
|
15
|
+
@options = o
|
16
|
+
end
|
17
|
+
|
18
|
+
attr :command
|
19
|
+
attr :arguments
|
20
|
+
attr :options
|
21
|
+
attr :signature
|
22
|
+
|
23
|
+
def to_a; @signature; end
|
24
|
+
|
25
|
+
def parameters
|
26
|
+
@arguments + [@options]
|
27
|
+
end
|
28
|
+
|
29
|
+
def inspect; "#<#{self.class}:" + @signature.inspect + ">"; end
|
30
|
+
|
31
|
+
#
|
32
|
+
def method_missing(s, *a)
|
33
|
+
s = s.to_s
|
34
|
+
case s
|
35
|
+
#when /[=]$/
|
36
|
+
# n = s.chomp('=')
|
37
|
+
# usage.option(n).type(*a)
|
38
|
+
# #parser.parse
|
39
|
+
# res = parser.options[n.to_sym]
|
40
|
+
#when /[!]$/
|
41
|
+
# n = s.chomp('!')
|
42
|
+
# res = parser.parse
|
43
|
+
when /[?]$/
|
44
|
+
options[s.chomp('?').to_sym]
|
45
|
+
else
|
46
|
+
options[s.to_sym]
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
end#class Signature
|
51
|
+
|
52
|
+
end#module Usage
|
53
|
+
|
54
|
+
end#module Clio
|
55
|
+
|
data/meta/abstract
ADDED
data/meta/authors
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
7rans <transfire@gmail.com>
|
data/meta/created
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Fri Aug 08 23:09:48 -0400 2008
|
data/meta/homepage
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
http://clio.rubyforge.org
|
data/meta/license
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
LGPLv3
|
data/meta/repository
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
git://rubyforge.org/clio.git
|
data/meta/summary
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Clio makes commandline interfaces easy.
|
@@ -0,0 +1,56 @@
|
|
1
|
+
= Method Missing "Auto" Usage
|
2
|
+
|
3
|
+
Require Commandline library.
|
4
|
+
|
5
|
+
require 'clio/commandline'
|
6
|
+
$0 = 'test'
|
7
|
+
|
8
|
+
Handles a toplevel option using method_missing.
|
9
|
+
|
10
|
+
cli = Clio::Commandline.new('--verbose')
|
11
|
+
cli.verbose?
|
12
|
+
cli.to_s.assert == 'test [--verbose]'
|
13
|
+
|
14
|
+
Handles a toplevel option with aliases using method_missing.
|
15
|
+
|
16
|
+
cli = Clio::Commandline.new('--verbose')
|
17
|
+
cli.verbose?(:v)
|
18
|
+
cli.to_s.assert == 'test [-v --verbose]'
|
19
|
+
|
20
|
+
Returns a toplevel option value"
|
21
|
+
|
22
|
+
cli = Clio::Commandline.new('--verbose')
|
23
|
+
cli.verbose?(:v).assert == true
|
24
|
+
|
25
|
+
Create new commandline object.
|
26
|
+
|
27
|
+
cmd = Clio::Commandline.new('--verbose')
|
28
|
+
cmd.usage.command('foo')
|
29
|
+
cmd.parse
|
30
|
+
|
31
|
+
== Single Character Option
|
32
|
+
|
33
|
+
Create new Commandline object.
|
34
|
+
|
35
|
+
@cmd = Clio::Commandline.new('-V')
|
36
|
+
|
37
|
+
Returns a toplevel option value.
|
38
|
+
|
39
|
+
@cmd.verbose?(:V).assert == true
|
40
|
+
|
41
|
+
== Option Literal Shorthand
|
42
|
+
|
43
|
+
An option and a subcommand parsed statically.
|
44
|
+
|
45
|
+
$0 = 'test'
|
46
|
+
@cli = Clio::Commandline.new('-V foo')
|
47
|
+
@cli.usage.opt('--verbose -V')
|
48
|
+
@cli.usage.command('foo')
|
49
|
+
@cli.parse
|
50
|
+
|
51
|
+
Parses the option correctly.
|
52
|
+
|
53
|
+
@cli.options[:verbose].assert == true
|
54
|
+
|
55
|
+
QED.
|
56
|
+
|
@@ -0,0 +1,64 @@
|
|
1
|
+
= Command Definition using Bracket Notation
|
2
|
+
|
3
|
+
Require commandline library.
|
4
|
+
|
5
|
+
require 'clio/commandline'
|
6
|
+
|
7
|
+
Since this not a real command line application,
|
8
|
+
lets fake one called 'test'.
|
9
|
+
|
10
|
+
$0 = 'test'
|
11
|
+
|
12
|
+
We can use a method to define a subcommand.
|
13
|
+
|
14
|
+
cmd = Clio::Commandline.new
|
15
|
+
cmd.usage['doc']
|
16
|
+
cmd.to_s.assert == 'test doc'
|
17
|
+
|
18
|
+
We can use a question-method to define a switch.
|
19
|
+
|
20
|
+
cmd = Clio::Commandline.new
|
21
|
+
cmd.usage['doc']
|
22
|
+
cmd.usage['--verbose']
|
23
|
+
cmd.to_s.assert == 'test [--verbose] doc'
|
24
|
+
|
25
|
+
The switch method can also take option aliases.
|
26
|
+
|
27
|
+
cmd = Clio::Commandline.new
|
28
|
+
cmd.usage['--verbose -v']
|
29
|
+
cmd.to_s.assert == 'test [-v --verbose]'
|
30
|
+
|
31
|
+
The command can take argument to process as suboptions
|
32
|
+
and arguments.
|
33
|
+
|
34
|
+
cmd = Clio::Commandline.new
|
35
|
+
cmd.usage['doc']['--output=PATH']
|
36
|
+
cmd.to_s.assert == 'test doc [--output=PATH]'
|
37
|
+
cmd.usage.doc.to_s.assert == 'doc [--output=PATH]'
|
38
|
+
|
39
|
+
An option and a subcommand parsed statically.
|
40
|
+
|
41
|
+
cmd = Clio::Commandline.new
|
42
|
+
cmd.usage['--verbose -v']
|
43
|
+
cmd.usage['doc']['--output=PATH']
|
44
|
+
cmd.usage['doc']['<file>']
|
45
|
+
cmd.to_s.assert == 'test [-v --verbose] doc [--output=PATH] <file>'
|
46
|
+
|
47
|
+
We can define help for these commands and options using
|
48
|
+
a seaprate help! call.
|
49
|
+
|
50
|
+
cmd = Clio::Commandline.new
|
51
|
+
cmd.usage['doc']['--output=PATH']
|
52
|
+
cmd.usage['--verbose -v']
|
53
|
+
|
54
|
+
#cmd.usage['doc'] = 'generate documentation'
|
55
|
+
#cmd.usage['--verbose -v'] = 'verbose mode'
|
56
|
+
|
57
|
+
cmd.usage.help!(
|
58
|
+
'doc', 'generate documentation',
|
59
|
+
'--verbose', 'verbose mode'
|
60
|
+
)
|
61
|
+
|
62
|
+
cmd.usage.options[0].name.assert == 'verbose'
|
63
|
+
|
64
|
+
QED.
|
@@ -0,0 +1,38 @@
|
|
1
|
+
= Commandline Tab Completion
|
2
|
+
|
3
|
+
Load commandline library.
|
4
|
+
|
5
|
+
require 'clio/commandline'
|
6
|
+
|
7
|
+
Create a new command line object.
|
8
|
+
|
9
|
+
$0 = 'c0'
|
10
|
+
@cli = Clio::Commandline.new
|
11
|
+
|
12
|
+
Specify usage for comamndline.
|
13
|
+
|
14
|
+
@cli.usage.option('o0')
|
15
|
+
@cli.usage.command('c1').opt('--o1=TYPE -o')
|
16
|
+
@cli.usage.command('c1 c2').option('o2')
|
17
|
+
@cli.usage.command('c1 c2').argument('a')
|
18
|
+
@cli.usage.command('c1 c2').argument('b')
|
19
|
+
@cli.usage.command('c1 c2').argument('c')
|
20
|
+
|
21
|
+
First lets make sure it parses okay.
|
22
|
+
|
23
|
+
@cli.parse('--o0 c1 --o1 atype c2 --o2 a b c')
|
24
|
+
|
25
|
+
Now let try some tab completion. First a command.
|
26
|
+
|
27
|
+
#@cli.parse('c1 -')
|
28
|
+
@cli.completion('c1').assert == ['-o --o1=TYPE', 'c2']
|
29
|
+
|
30
|
+
Now an option.
|
31
|
+
|
32
|
+
@cli.completion('c1 --o1').assert == ["TYPE"]
|
33
|
+
|
34
|
+
QED.
|
35
|
+
|
36
|
+
|
37
|
+
|
38
|
+
|
@@ -0,0 +1,44 @@
|
|
1
|
+
= Commandline Definition using Core Notation
|
2
|
+
|
3
|
+
Require commandline library.
|
4
|
+
|
5
|
+
require 'clio/commandline'
|
6
|
+
|
7
|
+
Fake that we running an executable called 'test'.
|
8
|
+
|
9
|
+
$0 = 'test'
|
10
|
+
|
11
|
+
Create a new commandline object.
|
12
|
+
|
13
|
+
@cmd = Clio::Commandline.new
|
14
|
+
|
15
|
+
We can define a subcommand using #command on #usage.
|
16
|
+
|
17
|
+
@cmd.usage.command('foo')
|
18
|
+
@cmd.to_s.assert == 'test foo'
|
19
|
+
|
20
|
+
We can define a toplevel switch using #switch.
|
21
|
+
|
22
|
+
@cmd.usage.switch('verbose')
|
23
|
+
@cmd.to_s.assert == 'test [--verbose] foo'
|
24
|
+
|
25
|
+
Switches can have aliases.
|
26
|
+
|
27
|
+
@cmd.usage.switch(:verbose, :v)
|
28
|
+
@cmd.to_s.assert == 'test [-v --verbose] foo'
|
29
|
+
|
30
|
+
There can be mulitple subcommands.
|
31
|
+
|
32
|
+
@cmd.usage.command('foo bar')
|
33
|
+
@cmd.to_s.assert == 'test [-v --verbose] foo bar'
|
34
|
+
|
35
|
+
Let's bring it all together in one example.
|
36
|
+
|
37
|
+
cmd = Clio::Commandline.new
|
38
|
+
cmd.usage.switch(:verbose, :v)
|
39
|
+
cmd.usage.switch(:force, :f)
|
40
|
+
cmd.usage.command('foo')
|
41
|
+
cmd.usage.command('bar')
|
42
|
+
cmd.to_s.assert == 'test [-v --verbose] [-f --force] [foo | bar]'
|
43
|
+
|
44
|
+
QED.
|
@@ -0,0 +1,60 @@
|
|
1
|
+
= Command Definition using Method Notation
|
2
|
+
|
3
|
+
Require commandline library.
|
4
|
+
|
5
|
+
require 'clio/commandline'
|
6
|
+
|
7
|
+
Since this not a real command line application,
|
8
|
+
lets fake one called 'test'.
|
9
|
+
|
10
|
+
$0 = 'test'
|
11
|
+
|
12
|
+
We can use a method to define a subcommand.
|
13
|
+
|
14
|
+
cmd = Clio::Commandline.new
|
15
|
+
cmd.usage.doc
|
16
|
+
cmd.to_s.assert == 'test doc'
|
17
|
+
|
18
|
+
We can use a question-method to define a switch.
|
19
|
+
|
20
|
+
cmd = Clio::Commandline.new
|
21
|
+
cmd.usage.doc
|
22
|
+
cmd.usage.verbose?
|
23
|
+
cmd.to_s.assert == 'test [--verbose] doc'
|
24
|
+
|
25
|
+
The switch method can also take option aliases.
|
26
|
+
|
27
|
+
cmd = Clio::Commandline.new
|
28
|
+
cmd.usage.verbose?(:v)
|
29
|
+
cmd.to_s.assert == 'test [-v --verbose]'
|
30
|
+
|
31
|
+
The command can take argument to process as suboptions
|
32
|
+
and arguments.
|
33
|
+
|
34
|
+
cmd = Clio::Commandline.new
|
35
|
+
cmd.usage.doc('--output=PATH')
|
36
|
+
cmd.to_s.assert == 'test doc [--output=PATH]'
|
37
|
+
cmd.usage.doc.to_s.assert == 'doc [--output=PATH]'
|
38
|
+
|
39
|
+
An option and a subcommand parsed statically.
|
40
|
+
|
41
|
+
cmd = Clio::Commandline.new
|
42
|
+
cmd.usage.doc('--output=PATH')
|
43
|
+
cmd.usage.verbose?(:v)
|
44
|
+
cmd.to_s.assert == 'test [-v --verbose] doc [--output=PATH]'
|
45
|
+
|
46
|
+
We can define help for these commands and options using
|
47
|
+
a seaprate help! call.
|
48
|
+
|
49
|
+
cmd = Clio::Commandline.new
|
50
|
+
cmd.usage.doc('--output=PATH')
|
51
|
+
cmd.usage.verbose?(:v)
|
52
|
+
|
53
|
+
cmd.usage.help!(
|
54
|
+
'doc', 'generate documentation',
|
55
|
+
'--verbose', 'verbose mode'
|
56
|
+
)
|
57
|
+
|
58
|
+
cmd.usage.options[0].name.assert == 'verbose'
|
59
|
+
|
60
|
+
QED.
|
@@ -0,0 +1,72 @@
|
|
1
|
+
= Command Parsing
|
2
|
+
|
3
|
+
Require command library.
|
4
|
+
|
5
|
+
require 'clio/commandline'
|
6
|
+
|
7
|
+
A single toplevel option.
|
8
|
+
|
9
|
+
cmd = Clio::Commandline.new
|
10
|
+
cmd.usage.option('force')
|
11
|
+
cmd.parse('--force')
|
12
|
+
cmd.options.assert == {:force=>true}
|
13
|
+
|
14
|
+
A single toplevel option with an alias.
|
15
|
+
|
16
|
+
cmd = Clio::Commandline.new
|
17
|
+
cmd.usage.option('force', 'f')
|
18
|
+
cmd.parse('-f')
|
19
|
+
cmd.options.assert == {:force=>true}
|
20
|
+
|
21
|
+
A subcommand.
|
22
|
+
|
23
|
+
cmd = Clio::Commandline.new
|
24
|
+
cmd.usage.command('foo')
|
25
|
+
cmd.parse('foo')
|
26
|
+
cmd.command.assert == 'foo'
|
27
|
+
cmd.commands.assert == ['foo']
|
28
|
+
|
29
|
+
A subcommand with an option.
|
30
|
+
|
31
|
+
cmd = Clio::Commandline.new
|
32
|
+
cmd.usage.command('foo')
|
33
|
+
cmd.usage.command('foo').option('verbose')
|
34
|
+
cmd.parse('foo --verbose')
|
35
|
+
|
36
|
+
cmd.command.assert == 'foo'
|
37
|
+
cmd.commands.assert == ['foo']
|
38
|
+
cmd.options.assert == {:verbose=>true}
|
39
|
+
|
40
|
+
cmd[0].options.assert == {}
|
41
|
+
cmd[1].options.assert == {:verbose=>true}
|
42
|
+
|
43
|
+
Multiple subcommands.
|
44
|
+
|
45
|
+
cmd = Clio::Commandline.new
|
46
|
+
cmd.usage.command('foo').command('bar').option('verbose')
|
47
|
+
cmd.parse('foo bar --verbose')
|
48
|
+
|
49
|
+
cmd.command.assert == 'foo bar'
|
50
|
+
cmd.commands.assert == ['foo','bar']
|
51
|
+
cmd.options == {:verbose=>true}
|
52
|
+
|
53
|
+
cmd[0].options.assert == {}
|
54
|
+
cmd[1].options.assert == {}
|
55
|
+
cmd[2].options.assert == {:verbose=>true}
|
56
|
+
|
57
|
+
Multiple subcommands.
|
58
|
+
|
59
|
+
cmd = Clio::Commandline.new
|
60
|
+
cmd.usage.command('foo').option('verbose')
|
61
|
+
cmd.usage.command('foo bar')
|
62
|
+
cmd.parse('foo bar --verbose')
|
63
|
+
|
64
|
+
cmd.command.assert == 'foo bar'
|
65
|
+
cmd.commands.assert == ['foo','bar']
|
66
|
+
cmd.options == {:verbose=>true}
|
67
|
+
|
68
|
+
cmd[0].options.assert == {}
|
69
|
+
cmd[1].options.assert == {}
|
70
|
+
cmd[2].options.assert == {:verbose=>true}
|
71
|
+
|
72
|
+
QED.
|
@@ -0,0 +1,81 @@
|
|
1
|
+
= Commandline Parses Correctly
|
2
|
+
|
3
|
+
Load commandline library.
|
4
|
+
|
5
|
+
require 'clio/commandline'
|
6
|
+
|
7
|
+
Create a new command line object.
|
8
|
+
|
9
|
+
$0 = 'c0'
|
10
|
+
@cli = Clio::Commandline.new('--o0 c1 --o1 c2 --o2 a b c')
|
11
|
+
|
12
|
+
Specify usage for comamndline.
|
13
|
+
|
14
|
+
@cli.usage.option('o0')
|
15
|
+
@cli.usage.command('c1').option('o1')
|
16
|
+
@cli.usage.command('c1 c2').option('o2')
|
17
|
+
@cli.usage.command('c1 c2').argument('a')
|
18
|
+
@cli.usage.command('c1 c2').argument('b')
|
19
|
+
@cli.usage.command('c1 c2').argument('c')
|
20
|
+
|
21
|
+
#@cli.usage.option('o0')
|
22
|
+
#@cliusage.argument('a0')
|
23
|
+
#@cli.usage.command('c1').option('o1')
|
24
|
+
#@cli.usage.command('c1').argument('a1')
|
25
|
+
#@cli.usage.command('c1').command('c2').option('o2')
|
26
|
+
#@cli.usage.command('c1').command('c2').argument('a2')
|
27
|
+
|
28
|
+
Usage string is correct.
|
29
|
+
|
30
|
+
@cli.to_s.assert == 'c0 [--o0] c1 [--o1] c2 [--o2] <a> <b> <c>'
|
31
|
+
|
32
|
+
Parses without error.
|
33
|
+
|
34
|
+
@cli.parse
|
35
|
+
|
36
|
+
Full signature is correct.
|
37
|
+
|
38
|
+
@cli.to_a.assert == [
|
39
|
+
["c0", [], {:o0=>true}],
|
40
|
+
["c1", [], {:o1=>true}],
|
41
|
+
["c2", ["a", "b", "c"], {:o2=>true}]
|
42
|
+
]
|
43
|
+
|
44
|
+
Options provides all options merged together.
|
45
|
+
|
46
|
+
@cli.options.assert == {:o0=>true,:o1=>true,:o2=>true}
|
47
|
+
|
48
|
+
Switches method is an alias for options.
|
49
|
+
|
50
|
+
@cli.switches.assert == {:o0=>true,:o1=>true,:o2=>true}
|
51
|
+
|
52
|
+
Arguments provides all concated together.
|
53
|
+
|
54
|
+
@cli.arguments.assert == ["a", "b", "c"]
|
55
|
+
|
56
|
+
Parameters method provides arguments and options.
|
57
|
+
|
58
|
+
@cli.parameters.assert == ["a", "b", "c", {:o0=>true,:o1=>true,:o2=>true}]
|
59
|
+
|
60
|
+
Zeroth signature is correct.
|
61
|
+
|
62
|
+
@cli[0].command.assert == 'c0'
|
63
|
+
@cli[0].options.assert == {:o0=>true}
|
64
|
+
@cli[0].arguments.assert == []
|
65
|
+
@cli[0].parameters.assert == [{:o0=>true}]
|
66
|
+
@cli[0].signature.assert == ["c0", [], {:o0=>true}]
|
67
|
+
@cli[0].to_a.assert == ["c0", [], {:o0=>true}]
|
68
|
+
|
69
|
+
First signature is correct.
|
70
|
+
|
71
|
+
@cli[1].to_a.assert == ["c1", [], {:o1=>true}]
|
72
|
+
|
73
|
+
Second signature is correct.
|
74
|
+
|
75
|
+
@cli[2].to_a.assert == ["c2", ["a", "b", "c"], {:o2=>true}]
|
76
|
+
|
77
|
+
There are no more signatures after the second.
|
78
|
+
|
79
|
+
@cli[3].assert == nil
|
80
|
+
|
81
|
+
QED.
|