clio 0.0.1 → 0.2.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/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.
|