pablo 1.0.3
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.tar.gz.sig +0 -0
- data/History.txt +4 -0
- data/LICENSE.txt +22 -0
- data/Manifest.txt +26 -0
- data/README.txt +61 -0
- data/lib/pablo.rb +298 -0
- data/lib/pablo/always.rb +44 -0
- data/lib/pablo/arguments.rb +76 -0
- data/lib/pablo/color.rb +57 -0
- data/lib/pablo/command.rb +71 -0
- data/lib/pablo/errors.rb +68 -0
- data/lib/pablo/expansion.rb +58 -0
- data/lib/pablo/help.rb +191 -0
- data/lib/pablo/helpers.rb +46 -0
- data/lib/pablo/option.rb +89 -0
- data/lib/pablo/parser.rb +192 -0
- data/lib/pablo/token.rb +66 -0
- data/lib/pablo/version.rb +29 -0
- data/test/fixtures/license.txt +22 -0
- data/test/fixtures/load_yaml.yml +37 -0
- data/test/fixtures/output.yml +13 -0
- data/test/help_fixtures.rb +47 -0
- data/test/test_arguments.rb +56 -0
- data/test/test_expansion.rb +62 -0
- data/test/test_output.rb +202 -0
- data/test/test_pablo.rb +115 -0
- data/test/test_parsers.rb +470 -0
- metadata +117 -0
- metadata.gz.sig +0 -0
@@ -0,0 +1,37 @@
|
|
1
|
+
---
|
2
|
+
:program: program
|
3
|
+
:version: version
|
4
|
+
:license: license
|
5
|
+
:desc: desc
|
6
|
+
:longdesc: longdesc
|
7
|
+
:usage: usage
|
8
|
+
:expand: true
|
9
|
+
:command_consumes_all: false
|
10
|
+
:capabilities:
|
11
|
+
- capa
|
12
|
+
- bili
|
13
|
+
- ties
|
14
|
+
:parsers:
|
15
|
+
- :command:
|
16
|
+
- :foo
|
17
|
+
- :foofoo
|
18
|
+
:consume_all: false
|
19
|
+
:longdesc: longdesc
|
20
|
+
:desc: desc
|
21
|
+
:usage: usage
|
22
|
+
- :option:
|
23
|
+
- :bar
|
24
|
+
:consume:
|
25
|
+
- one
|
26
|
+
- two
|
27
|
+
- :option:
|
28
|
+
- :nobar
|
29
|
+
:negates: :bar
|
30
|
+
- :token:
|
31
|
+
- :file?
|
32
|
+
- !ruby/regexp /goo/
|
33
|
+
:consume: 1
|
34
|
+
:default: moose
|
35
|
+
- :help_command: true
|
36
|
+
:desc: desc
|
37
|
+
:nothing: nothing
|
@@ -0,0 +1,13 @@
|
|
1
|
+
---
|
2
|
+
:help: " test 0.1\n\n test [usage]\n\n Commands:\n foo \n help : Displays this message.\n bar \n\n Options:\n --bla \n --nobla\n\n Tokens:\n blubb : Nothing.\n"
|
3
|
+
:color_help: " $test 0.1$\n\n +test+ _[usage]_\n\n %Commands:%\n +foo +\n +help + : Displays this message.\n +bar +\n\n %Options:%\n +--bla +\n +--nobla+\n\n %Tokens:%\n +blubb + : Nothing.\n"
|
4
|
+
:command_help: " test 0.1\n\n help [<command>]\n\n Shows a simple help message for this program.\n If a command is given as well, a more detailed message about that\n particular command is shown (such as this one).\n"
|
5
|
+
:help_expand: "\n foobar\n\n"
|
6
|
+
:unknown: "Sorry, but I don't know 'luugu'.\nTry running 'help' without parameters to get a list of all the commands, options etc.\n"
|
7
|
+
:version: "test 0.1\n+woodle-doodle -foobar\n"
|
8
|
+
:missing_argument: "Missing argument for 'foo'.\n"
|
9
|
+
:missing_argument_2: "Missing argument 'bar' for 'foo'.\n"
|
10
|
+
:wrong_argument: "Wrong argument 'bar' for 'foo'.\n"
|
11
|
+
:wrong_argument_2: "Wrong argument 'bar' for 'foo'. Expected regular expression.\n"
|
12
|
+
:ambiguity_command: "Ambiguous argument 'foo'. Could be any of:\n * foobar\n * foogoo\n"
|
13
|
+
:colorize_text: "foo+bar+foo foo + bar + foo"
|
@@ -0,0 +1,47 @@
|
|
1
|
+
###### DON'T PANIC License 1.1 ###########
|
2
|
+
#
|
3
|
+
# Don't panic, this piece of software is
|
4
|
+
# free, i.e. you can do with it whatever
|
5
|
+
# you like, including, but not limited to:
|
6
|
+
#
|
7
|
+
# * using it
|
8
|
+
# * copying it
|
9
|
+
# * (re)distributing it
|
10
|
+
# * burning/burying/shredding it
|
11
|
+
# * eating it
|
12
|
+
# * using it to obtain world domination
|
13
|
+
# * and ignoring it
|
14
|
+
#
|
15
|
+
# Under the sole condition that you
|
16
|
+
#
|
17
|
+
# * CONSIDER buying the author a strong
|
18
|
+
# brownian motion producer, say a nice
|
19
|
+
# hot cup of tea, should you ever meet
|
20
|
+
# him in person.
|
21
|
+
#
|
22
|
+
##########################################
|
23
|
+
|
24
|
+
require 'test/unit'
|
25
|
+
require 'yaml'
|
26
|
+
|
27
|
+
class Test::Unit::TestCase
|
28
|
+
|
29
|
+
def fixtures
|
30
|
+
self.class.instance_variable_get(:@fixtures)
|
31
|
+
end
|
32
|
+
|
33
|
+
class << self
|
34
|
+
def fixture file, format = :yml
|
35
|
+
@fixtures ||= Hash.new
|
36
|
+
|
37
|
+
open(File.join(File.dirname(__FILE__), 'fixtures', file.to_s + '.' + format.to_s)) { |f|
|
38
|
+
@fixtures[file] =
|
39
|
+
case format
|
40
|
+
when :yml then YAML::load(f)
|
41
|
+
else f.read()
|
42
|
+
end
|
43
|
+
}
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
@@ -0,0 +1,56 @@
|
|
1
|
+
###### DON'T PANIC License 1.1 ###########
|
2
|
+
#
|
3
|
+
# Don't panic, this piece of software is
|
4
|
+
# free, i.e. you can do with it whatever
|
5
|
+
# you like, including, but not limited to:
|
6
|
+
#
|
7
|
+
# * using it
|
8
|
+
# * copying it
|
9
|
+
# * (re)distributing it
|
10
|
+
# * burning/burying/shredding it
|
11
|
+
# * eating it
|
12
|
+
# * using it to obtain world domination
|
13
|
+
# * and ignoring it
|
14
|
+
#
|
15
|
+
# Under the sole condition that you
|
16
|
+
#
|
17
|
+
# * CONSIDER buying the author a strong
|
18
|
+
# brownian motion producer, say a nice
|
19
|
+
# hot cup of tea, should you ever meet
|
20
|
+
# him in person.
|
21
|
+
#
|
22
|
+
##########################################
|
23
|
+
|
24
|
+
require "test/unit"
|
25
|
+
require "pablo"
|
26
|
+
|
27
|
+
class TestArguments < Test::Unit::TestCase
|
28
|
+
|
29
|
+
def test_arguments_consume
|
30
|
+
p = Pablo.new
|
31
|
+
|
32
|
+
p.command :foo do |args, pablo|
|
33
|
+
assert_equal 1, args.length
|
34
|
+
args.consume 0
|
35
|
+
assert_equal 0, args.length
|
36
|
+
end
|
37
|
+
|
38
|
+
p.parse %w{foo bar}
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_consume_all
|
42
|
+
p = Pablo.new
|
43
|
+
|
44
|
+
p.command :foo do |args, pablo|
|
45
|
+
assert !args.consumed?
|
46
|
+
assert_equal 2, args.length
|
47
|
+
args.consume_all
|
48
|
+
assert_equal 0, args.length
|
49
|
+
assert args.consumed?
|
50
|
+
end
|
51
|
+
|
52
|
+
p.parse %w{foo bar baz}
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
@@ -0,0 +1,62 @@
|
|
1
|
+
###### DON'T PANIC License 1.1 ###########
|
2
|
+
#
|
3
|
+
# Don't panic, this piece of software is
|
4
|
+
# free, i.e. you can do with it whatever
|
5
|
+
# you like, including, but not limited to:
|
6
|
+
#
|
7
|
+
# * using it
|
8
|
+
# * copying it
|
9
|
+
# * (re)distributing it
|
10
|
+
# * burning/burying/shredding it
|
11
|
+
# * eating it
|
12
|
+
# * using it to obtain world domination
|
13
|
+
# * and ignoring it
|
14
|
+
#
|
15
|
+
# Under the sole condition that you
|
16
|
+
#
|
17
|
+
# * CONSIDER buying the author a strong
|
18
|
+
# brownian motion producer, say a nice
|
19
|
+
# hot cup of tea, should you ever meet
|
20
|
+
# him in person.
|
21
|
+
#
|
22
|
+
##########################################
|
23
|
+
|
24
|
+
require "test/unit"
|
25
|
+
require "pablo"
|
26
|
+
|
27
|
+
class TestExpansion < Test::Unit::TestCase
|
28
|
+
|
29
|
+
def test_expansion
|
30
|
+
p = Pablo.new :expand => true, :command_consumes_all => false
|
31
|
+
|
32
|
+
p.option :barbar
|
33
|
+
p.option :bazbaz
|
34
|
+
p.option :bazbass
|
35
|
+
p.command :foofoo
|
36
|
+
|
37
|
+
p.parse %w{foo --bar --baz}
|
38
|
+
|
39
|
+
assert p.commands[:foofoo]
|
40
|
+
assert p.options[:barbar]
|
41
|
+
assert_nil p.options[:bazbaz]
|
42
|
+
assert_nil p.options[:bazbass]
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_ambiguity
|
46
|
+
worked = false
|
47
|
+
p = Pablo.new :expand => true
|
48
|
+
|
49
|
+
p.option :foobar
|
50
|
+
p.option :foogoo
|
51
|
+
|
52
|
+
p.ambiguity do |arg,names|
|
53
|
+
worked = true
|
54
|
+
assert_equal 'foo', arg
|
55
|
+
assert_equal ['foobar', 'foogoo'], names
|
56
|
+
end
|
57
|
+
|
58
|
+
p.parse %w{foo}
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
data/test/test_output.rb
ADDED
@@ -0,0 +1,202 @@
|
|
1
|
+
###### DON'T PANIC License 1.1 ###########
|
2
|
+
#
|
3
|
+
# Don't panic, this piece of software is
|
4
|
+
# free, i.e. you can do with it whatever
|
5
|
+
# you like, including, but not limited to:
|
6
|
+
#
|
7
|
+
# * using it
|
8
|
+
# * copying it
|
9
|
+
# * (re)distributing it
|
10
|
+
# * burning/burying/shredding it
|
11
|
+
# * eating it
|
12
|
+
# * using it to obtain world domination
|
13
|
+
# * and ignoring it
|
14
|
+
#
|
15
|
+
# Under the sole condition that you
|
16
|
+
#
|
17
|
+
# * CONSIDER buying the author a strong
|
18
|
+
# brownian motion producer, say a nice
|
19
|
+
# hot cup of tea, should you ever meet
|
20
|
+
# him in person.
|
21
|
+
#
|
22
|
+
##########################################
|
23
|
+
|
24
|
+
require "test/unit"
|
25
|
+
require "pablo"
|
26
|
+
require File.join File.dirname(__FILE__), 'help_fixtures'
|
27
|
+
|
28
|
+
class TestOutput < Test::Unit::TestCase
|
29
|
+
|
30
|
+
fixture :output
|
31
|
+
fixture :license, :txt
|
32
|
+
|
33
|
+
def setup
|
34
|
+
$stdout = $stderr = @io = StringIO.new
|
35
|
+
end
|
36
|
+
|
37
|
+
def teardown
|
38
|
+
$stdout = STDOUT
|
39
|
+
$stderr = STDERR
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_help
|
43
|
+
p = Pablo.new :program => 'test', :version => '0.1', :usage => '[usage]'
|
44
|
+
p.command :foo
|
45
|
+
p.help_command
|
46
|
+
p.command :bar
|
47
|
+
p.option :bla
|
48
|
+
p.option :nobla, :negates => :bla
|
49
|
+
p.desc("Nothing.")
|
50
|
+
p.token :blubb
|
51
|
+
|
52
|
+
p.parse ['help']
|
53
|
+
assert_equal fixtures[:output][:help], @io.string
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_command_help
|
57
|
+
p = Pablo.new :program => 'test', :version => '0.1', :usage => '[usage]'
|
58
|
+
p.command :foo
|
59
|
+
p.help_command
|
60
|
+
p.command :bar
|
61
|
+
|
62
|
+
p.parse ['help', 'help']
|
63
|
+
assert_equal fixtures[:output][:command_help], @io.string
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_unknown_help
|
67
|
+
p = Pablo.new :program => 'test', :version => '0.1', :usage => '[usage]'
|
68
|
+
p.command :foo
|
69
|
+
p.help_command
|
70
|
+
p.command :bar
|
71
|
+
|
72
|
+
p.parse ['help', 'luugu']
|
73
|
+
assert_equal fixtures[:output][:unknown], @io.string
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_version
|
77
|
+
p = Pablo.new :program => 'test', :version => '0.1', :usage => '[usage]',
|
78
|
+
:capabilities => %w{+woodle-doodle -foobar}
|
79
|
+
p.version_command
|
80
|
+
|
81
|
+
p.parse ['version']
|
82
|
+
assert_equal fixtures[:output][:version], @io.string
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_license
|
86
|
+
p = Pablo.new :license => 'test/fixtures/license.txt'
|
87
|
+
p.license_command
|
88
|
+
|
89
|
+
p.parse ['license']
|
90
|
+
assert_equal fixtures[:license], @io.string
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_colorize
|
94
|
+
p = Pablo.new :program => 'test', :version => '0.1', :usage => '[usage]'
|
95
|
+
p.colorizing do |str, type|
|
96
|
+
case type
|
97
|
+
when :em then "+#{str}+"
|
98
|
+
when :h1 then "$#{str}$"
|
99
|
+
when :h2 then "%#{str}%"
|
100
|
+
when :usage then "_#{str}_"
|
101
|
+
else str
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
p.command :foo
|
106
|
+
p.help_command
|
107
|
+
p.command :bar
|
108
|
+
p.option :bla
|
109
|
+
p.option :nobla, :negates => :bla
|
110
|
+
p.desc("Nothing.")
|
111
|
+
p.token :blubb
|
112
|
+
|
113
|
+
p.parse ['help']
|
114
|
+
assert_equal fixtures[:output][:color_help], @io.string
|
115
|
+
|
116
|
+
t = p.colorize("foo$bar$foo foo $ bar $ foo", :text)
|
117
|
+
assert_equal fixtures[:output][:colorize_text], t
|
118
|
+
end
|
119
|
+
|
120
|
+
def test_errors
|
121
|
+
p = Pablo.new
|
122
|
+
p.command :foo do
|
123
|
+
p.missing_argument
|
124
|
+
end
|
125
|
+
|
126
|
+
p.parse %w{foo}
|
127
|
+
assert_equal fixtures[:output][:missing_argument], @io.string
|
128
|
+
setup()
|
129
|
+
|
130
|
+
p = Pablo.new
|
131
|
+
p.command :foo do
|
132
|
+
p.missing_argument('bar')
|
133
|
+
end
|
134
|
+
|
135
|
+
p.parse %w{foo}
|
136
|
+
assert_equal fixtures[:output][:missing_argument_2], @io.string
|
137
|
+
setup()
|
138
|
+
|
139
|
+
p = Pablo.new
|
140
|
+
p.command :foo do
|
141
|
+
p.wrong_argument('bar')
|
142
|
+
end
|
143
|
+
|
144
|
+
p.parse %w{foo}
|
145
|
+
assert_equal fixtures[:output][:wrong_argument], @io.string
|
146
|
+
setup()
|
147
|
+
|
148
|
+
p = Pablo.new
|
149
|
+
p.command :foo do
|
150
|
+
p.wrong_argument('bar', 'regular expression')
|
151
|
+
end
|
152
|
+
|
153
|
+
p.parse %w{foo}
|
154
|
+
assert_equal fixtures[:output][:wrong_argument_2], @io.string
|
155
|
+
end
|
156
|
+
|
157
|
+
def test_help_expansion
|
158
|
+
catch :abort do
|
159
|
+
p = Pablo.new :expand => true
|
160
|
+
|
161
|
+
p.help_command
|
162
|
+
p.command :foobar
|
163
|
+
|
164
|
+
p.parse %w{help foo}
|
165
|
+
end
|
166
|
+
|
167
|
+
assert_equal fixtures[:output][:help_expand], @io.string
|
168
|
+
end
|
169
|
+
|
170
|
+
def test_help_command
|
171
|
+
[%w{help}, %w{help foo}].each do |arr|
|
172
|
+
worked = false
|
173
|
+
|
174
|
+
catch :abort do
|
175
|
+
p = Pablo.new
|
176
|
+
|
177
|
+
p.help_command do |args, pablo|
|
178
|
+
# arr.length because 'help' is already consumed
|
179
|
+
assert_equal arr.length, args.length
|
180
|
+
worked = true
|
181
|
+
throw :abort
|
182
|
+
end
|
183
|
+
|
184
|
+
p.parse arr
|
185
|
+
end
|
186
|
+
|
187
|
+
assert worked
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
def test_ambiguity_command
|
192
|
+
p = Pablo.new :expand => true
|
193
|
+
p.ambiguity_command
|
194
|
+
p.command :foobar
|
195
|
+
p.command :foogoo
|
196
|
+
|
197
|
+
p.parse %w{foo}
|
198
|
+
assert_equal fixtures[:output][:ambiguity_command], @io.string
|
199
|
+
end
|
200
|
+
|
201
|
+
end
|
202
|
+
|
data/test/test_pablo.rb
ADDED
@@ -0,0 +1,115 @@
|
|
1
|
+
###### DON'T PANIC License 1.1 ###########
|
2
|
+
#
|
3
|
+
# Don't panic, this piece of software is
|
4
|
+
# free, i.e. you can do with it whatever
|
5
|
+
# you like, including, but not limited to:
|
6
|
+
#
|
7
|
+
# * using it
|
8
|
+
# * copying it
|
9
|
+
# * (re)distributing it
|
10
|
+
# * burning/burying/shredding it
|
11
|
+
# * eating it
|
12
|
+
# * using it to obtain world domination
|
13
|
+
# * and ignoring it
|
14
|
+
#
|
15
|
+
# Under the sole condition that you
|
16
|
+
#
|
17
|
+
# * CONSIDER buying the author a strong
|
18
|
+
# brownian motion producer, say a nice
|
19
|
+
# hot cup of tea, should you ever meet
|
20
|
+
# him in person.
|
21
|
+
#
|
22
|
+
##########################################
|
23
|
+
|
24
|
+
require "test/unit"
|
25
|
+
require "pablo"
|
26
|
+
require File.join File.dirname(__FILE__), 'help_fixtures'
|
27
|
+
|
28
|
+
class TestPablo < Test::Unit::TestCase
|
29
|
+
|
30
|
+
fixture :load_yaml
|
31
|
+
|
32
|
+
def test_load_yaml
|
33
|
+
yml = fixtures[:load_yaml].to_yaml
|
34
|
+
|
35
|
+
p = Pablo.new
|
36
|
+
|
37
|
+
p.load_yaml yml
|
38
|
+
|
39
|
+
assert_equal({
|
40
|
+
:program => 'program',
|
41
|
+
:desc => 'desc',
|
42
|
+
:version => 'version',
|
43
|
+
:longdesc => 'longdesc',
|
44
|
+
:usage => 'usage',
|
45
|
+
:capabilities => %w{capa bili ties},
|
46
|
+
:command_consumes_all => false,
|
47
|
+
:expand => true,
|
48
|
+
:license => 'license'
|
49
|
+
}, p.instance_variable_get(:@opts))
|
50
|
+
|
51
|
+
reg = p.instance_variable_get(:@registered)
|
52
|
+
|
53
|
+
assert_equal 5, reg.length
|
54
|
+
|
55
|
+
assert_equal [:foo, :foofoo], reg[0].names
|
56
|
+
assert_equal 'desc', reg[0].desc
|
57
|
+
assert_equal 'longdesc', reg[0].longdesc
|
58
|
+
assert_equal 'usage', reg[0].usage
|
59
|
+
assert_equal({
|
60
|
+
:consume_all => false
|
61
|
+
}, reg[0].instance_variable_get(:@opts))
|
62
|
+
|
63
|
+
assert_equal [:bar], reg[1].names
|
64
|
+
assert_equal({
|
65
|
+
:consume => %w{one two}
|
66
|
+
}, reg[1].instance_variable_get(:@opts))
|
67
|
+
|
68
|
+
assert_equal [:nobar], reg[2].names
|
69
|
+
assert_equal({
|
70
|
+
:negates => :bar
|
71
|
+
}, reg[2].instance_variable_get(:@opts))
|
72
|
+
|
73
|
+
assert_equal [], reg[3].names
|
74
|
+
assert_equal [:file?, /goo/], reg[3].instance_variable_get(:@verify)
|
75
|
+
assert_equal({
|
76
|
+
:default => 'moose',
|
77
|
+
:consume => 1,
|
78
|
+
}, reg[3].instance_variable_get(:@opts))
|
79
|
+
|
80
|
+
assert_equal [:help], reg[4].names
|
81
|
+
assert_equal 'desc', reg[4].desc
|
82
|
+
assert_equal({
|
83
|
+
:consume_all => false,
|
84
|
+
:nothing => 'nothing'
|
85
|
+
}, reg[4].instance_variable_get(:@opts))
|
86
|
+
end
|
87
|
+
|
88
|
+
def foo args, pablo
|
89
|
+
@worked << :token
|
90
|
+
end
|
91
|
+
|
92
|
+
def bar args, pablo
|
93
|
+
@worked << :option
|
94
|
+
end
|
95
|
+
|
96
|
+
def goo args, pablo
|
97
|
+
@worked << :command
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_run_object
|
101
|
+
p = Pablo.new :run => self
|
102
|
+
|
103
|
+
@worked = []
|
104
|
+
|
105
|
+
p.token :foo
|
106
|
+
p.option :bar
|
107
|
+
p.command :goo
|
108
|
+
|
109
|
+
p.parse %w{foo --bar goo}
|
110
|
+
|
111
|
+
assert_equal [:token, :option, :command], @worked
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
115
|
+
|