choice 0.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/CHANGELOG +2 -0
- data/LICENSE +18 -0
- data/README +347 -0
- data/examples/ftpd.rb +78 -0
- data/lib/choice.rb +132 -0
- data/lib/choice/lazyhash.rb +67 -0
- data/lib/choice/option.rb +104 -0
- data/lib/choice/parser.rb +145 -0
- data/lib/choice/version.rb +8 -0
- data/lib/choice/writer.rb +186 -0
- data/test/test_choice.rb +119 -0
- data/test/test_lazyhash.rb +76 -0
- data/test/test_option.rb +144 -0
- data/test/test_parser.rb +182 -0
- data/test/test_writer.rb +103 -0
- metadata +60 -0
data/test/test_parser.rb
ADDED
@@ -0,0 +1,182 @@
|
|
1
|
+
$:.unshift "../lib:lib"
|
2
|
+
require 'test/unit'
|
3
|
+
require 'choice/option'
|
4
|
+
require 'choice/parser'
|
5
|
+
|
6
|
+
class TestParser < Test::Unit::TestCase
|
7
|
+
def setup
|
8
|
+
@options = {}
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_parse_options
|
12
|
+
@options['band'] = Choice::Option.new do
|
13
|
+
short '-b'
|
14
|
+
long '--band=BAND'
|
15
|
+
cast String
|
16
|
+
desc 'Your favorite band.'
|
17
|
+
end
|
18
|
+
@options['animal'] = Choice::Option.new do
|
19
|
+
short '-a'
|
20
|
+
long '--animal=ANIMAL'
|
21
|
+
cast String
|
22
|
+
desc 'Your favorite animal.'
|
23
|
+
end
|
24
|
+
band = 'Led Zeppelin'
|
25
|
+
animal = 'Reindeer'
|
26
|
+
|
27
|
+
args = ['-b', band, "--animal=#{animal}"]
|
28
|
+
|
29
|
+
choices = Choice::Parser.parse(@options, args)
|
30
|
+
|
31
|
+
assert_equal band, choices['band']
|
32
|
+
assert_equal animal, choices['animal']
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_parse_no_options
|
36
|
+
assert_equal Hash.new, Choice::Parser.parse(nil, nil)
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_parse_default
|
40
|
+
@options['soda'] = Choice::Option.new do
|
41
|
+
short '-s'
|
42
|
+
long '--soda=SODA'
|
43
|
+
default 'PibbJr'
|
44
|
+
end
|
45
|
+
|
46
|
+
args = []
|
47
|
+
|
48
|
+
choices = Choice::Parser.parse(@options, args)
|
49
|
+
|
50
|
+
assert_equal 'PibbJr', choices['soda']
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_parse_options_with_filters
|
54
|
+
@options['host'] = Choice::Option.new do
|
55
|
+
short '-h'
|
56
|
+
filter do |opt|
|
57
|
+
opt.gsub!(/[^\w]/, '')
|
58
|
+
opt = opt.sub(/k/, 'c')
|
59
|
+
end
|
60
|
+
end
|
61
|
+
host = 'de.fun.kt'
|
62
|
+
args = ['-h', host]
|
63
|
+
choices = Choice::Parser.parse(@options, args)
|
64
|
+
|
65
|
+
assert_equal 'defunct', choices['host']
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_casting
|
69
|
+
@options['port'] = Choice::Option.new do
|
70
|
+
short '-p'
|
71
|
+
cast Integer
|
72
|
+
end
|
73
|
+
|
74
|
+
port = '3000'
|
75
|
+
args = ['-p', port]
|
76
|
+
choices = Choice::Parser.parse(@options, args)
|
77
|
+
|
78
|
+
assert_equal port.to_i, choices['port']
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_text_required
|
82
|
+
@options['name'] = Choice::Option.new do
|
83
|
+
short '-n'
|
84
|
+
long '--name=NAME'
|
85
|
+
end
|
86
|
+
@options['age'] = Choice::Option.new do
|
87
|
+
short '-a'
|
88
|
+
long 'age=[AGE]'
|
89
|
+
cast Integer
|
90
|
+
end
|
91
|
+
|
92
|
+
args = ['-n', '-a', '21']
|
93
|
+
|
94
|
+
assert_raise(Choice::Parser::ArgumentRequired) do
|
95
|
+
choices = Choice::Parser.parse(@options, args)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_text_optional
|
100
|
+
@options['color'] = Choice::Option.new do
|
101
|
+
short '-c'
|
102
|
+
long '--color=[COLOR]'
|
103
|
+
end
|
104
|
+
|
105
|
+
args = ['-c']
|
106
|
+
choices = Choice::Parser.parse(@options, args)
|
107
|
+
|
108
|
+
assert choices['color']
|
109
|
+
|
110
|
+
color = 'ladyblue'
|
111
|
+
args = ['-c', color]
|
112
|
+
choices = Choice::Parser.parse(@options, args)
|
113
|
+
|
114
|
+
assert_equal color, choices['color']
|
115
|
+
end
|
116
|
+
|
117
|
+
def test_ignore_separator
|
118
|
+
options = []
|
119
|
+
options << ['keyboard', Choice::Option.new do
|
120
|
+
short '-k'
|
121
|
+
long '--keyboard=BOARD'
|
122
|
+
end]
|
123
|
+
|
124
|
+
options << ['mouse', Choice::Option.new do
|
125
|
+
short '-m'
|
126
|
+
long '--mouse=MOUSE'
|
127
|
+
end]
|
128
|
+
|
129
|
+
args = ['-m', 'onebutton']
|
130
|
+
choices = Choice::Parser.parse([options.first, '----', options.last], args)
|
131
|
+
|
132
|
+
assert choices['mouse']
|
133
|
+
assert_equal 1, choices.size
|
134
|
+
end
|
135
|
+
|
136
|
+
def test_long_as_switch
|
137
|
+
@options['chunky'] = Choice::Option.new do
|
138
|
+
short '-b'
|
139
|
+
long '--bacon'
|
140
|
+
end
|
141
|
+
|
142
|
+
args = ['--bacon']
|
143
|
+
choices = Choice::Parser.parse(@options, args)
|
144
|
+
|
145
|
+
assert choices['chunky']
|
146
|
+
end
|
147
|
+
|
148
|
+
def test_validate
|
149
|
+
@options['email'] = Choice::Option.new do
|
150
|
+
short '-e'
|
151
|
+
long '--email=EMAIL'
|
152
|
+
desc 'Your valid email addy.'
|
153
|
+
validate /^[a-z0-9_.-]+@[a-z0-9_.-]+\.[a-z]{2,4}$/i
|
154
|
+
end
|
155
|
+
|
156
|
+
email_bad = 'this will@neverwork'
|
157
|
+
email_good = 'chris@ozmm.org'
|
158
|
+
|
159
|
+
args = ['-e', email_bad]
|
160
|
+
assert_raise(Choice::Parser::ArgumentValidationFails) do
|
161
|
+
choices = Choice::Parser.parse(@options, args)
|
162
|
+
end
|
163
|
+
|
164
|
+
args = ['-e', email_good]
|
165
|
+
choices = Choice::Parser.parse(@options, args)
|
166
|
+
|
167
|
+
assert_equal email_good, choices['email']
|
168
|
+
end
|
169
|
+
|
170
|
+
def test_unknown_argument
|
171
|
+
@options['cd'] = Choice::Option.new do
|
172
|
+
short '-c'
|
173
|
+
long '--cd=CD'
|
174
|
+
desc 'A CD you like.'
|
175
|
+
end
|
176
|
+
|
177
|
+
args = ['-c', 'BestOfYanni', '--grace']
|
178
|
+
assert_raise(Choice::Parser::UnknownArgument) do
|
179
|
+
choices = Choice::Parser.parse(@options, args)
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
data/test/test_writer.rb
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
$:.unshift "../lib:lib"
|
2
|
+
require 'test/unit'
|
3
|
+
require 'choice'
|
4
|
+
|
5
|
+
class TestWriter < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def setup
|
8
|
+
Choice.reset
|
9
|
+
end
|
10
|
+
|
11
|
+
HELP_OUT = ''
|
12
|
+
def test_help
|
13
|
+
song = Choice::Option.new do
|
14
|
+
short '-s'
|
15
|
+
long '--song=SONG'
|
16
|
+
cast String
|
17
|
+
desc 'Your favorite GNR song.'
|
18
|
+
desc '(Default: MyMichelle)'
|
19
|
+
default 'MyMichelle'
|
20
|
+
end
|
21
|
+
dude = Choice::Option.new do
|
22
|
+
short '-d'
|
23
|
+
long '--dude=DUDE'
|
24
|
+
cast String
|
25
|
+
desc 'Your favorite GNR dude.'
|
26
|
+
desc '(Default: Slash)'
|
27
|
+
default 'Slash'
|
28
|
+
end
|
29
|
+
|
30
|
+
options = [[:song, song], [:dude, dude]]
|
31
|
+
args = { :banner => "Welcome to the jungle",
|
32
|
+
:header => [""],
|
33
|
+
:options => options,
|
34
|
+
:footer => ["", "Wake up."] }
|
35
|
+
|
36
|
+
help_string = <<-HELP
|
37
|
+
Welcome to the jungle
|
38
|
+
|
39
|
+
-s, --song=SONG Your favorite GNR song.
|
40
|
+
(Default: MyMichelle)
|
41
|
+
-d, --dude=DUDE Your favorite GNR dude.
|
42
|
+
(Default: Slash)
|
43
|
+
|
44
|
+
Wake up.
|
45
|
+
HELP
|
46
|
+
|
47
|
+
Choice::Writer.help(args, HELP_OUT, true)
|
48
|
+
|
49
|
+
assert_equal help_string, HELP_OUT
|
50
|
+
end
|
51
|
+
|
52
|
+
BANNER_OUT = ''
|
53
|
+
def test_banner
|
54
|
+
media = Choice::Option.new do
|
55
|
+
short '-m'
|
56
|
+
long '--media=MEDIA'
|
57
|
+
end
|
58
|
+
rom = Choice::Option.new do
|
59
|
+
short '-r'
|
60
|
+
long '--rom=ROM'
|
61
|
+
end
|
62
|
+
|
63
|
+
options = [[:media, media], [:rom, rom]]
|
64
|
+
args = { :header => [""],
|
65
|
+
:options => options }
|
66
|
+
|
67
|
+
help_string = <<-HELP
|
68
|
+
Usage: #{program} [-mr]
|
69
|
+
|
70
|
+
-m, --media=MEDIA
|
71
|
+
-r, --rom=ROM
|
72
|
+
HELP
|
73
|
+
|
74
|
+
Choice::Writer.help(args, BANNER_OUT, true)
|
75
|
+
|
76
|
+
assert_equal help_string, BANNER_OUT
|
77
|
+
end
|
78
|
+
|
79
|
+
SPILLOVER_OUT = ''
|
80
|
+
def test_desc_spillover
|
81
|
+
toolong = Choice::Option.new do
|
82
|
+
long '--thisisgonnabewaytoolongiswear=STRING'
|
83
|
+
desc 'Way too long, boy wonder.'
|
84
|
+
end
|
85
|
+
|
86
|
+
options = [[:toolong, toolong]]
|
87
|
+
|
88
|
+
help_string = <<-HELP
|
89
|
+
Usage: #{program}
|
90
|
+
--thisisgonnabewaytoolongiswear=STRING
|
91
|
+
Way too long, boy wonder.
|
92
|
+
HELP
|
93
|
+
|
94
|
+
|
95
|
+
Choice::Writer.help({:options => options}, SPILLOVER_OUT, true)
|
96
|
+
|
97
|
+
assert_equal help_string, SPILLOVER_OUT
|
98
|
+
end
|
99
|
+
|
100
|
+
def program
|
101
|
+
if (/(\/|\\)/ =~ $0) then File.basename($0) else $0 end
|
102
|
+
end
|
103
|
+
end
|
metadata
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
rubygems_version: 0.8.11
|
3
|
+
specification_version: 1
|
4
|
+
name: choice
|
5
|
+
version: !ruby/object:Gem::Version
|
6
|
+
version: 0.1.0
|
7
|
+
date: 2006-04-30 00:00:00 -07:00
|
8
|
+
summary: Choice is a command line option parser.
|
9
|
+
require_paths:
|
10
|
+
- lib
|
11
|
+
email: chris@ozmm.org
|
12
|
+
homepage: http://choice.rubyforge.org/
|
13
|
+
rubyforge_project:
|
14
|
+
description: Choice is a simple little gem for easily defining and parsing command line options with a friendly DSL.
|
15
|
+
autorequire: choice
|
16
|
+
default_executable:
|
17
|
+
bindir: bin
|
18
|
+
has_rdoc: false
|
19
|
+
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">"
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.0.0
|
24
|
+
version:
|
25
|
+
platform: ruby
|
26
|
+
signing_key:
|
27
|
+
cert_chain:
|
28
|
+
authors:
|
29
|
+
- Chris Wanstrath
|
30
|
+
files:
|
31
|
+
- README
|
32
|
+
- CHANGELOG
|
33
|
+
- LICENSE
|
34
|
+
- lib/choice
|
35
|
+
- lib/choice.rb
|
36
|
+
- lib/choice/lazyhash.rb
|
37
|
+
- lib/choice/option.rb
|
38
|
+
- lib/choice/parser.rb
|
39
|
+
- lib/choice/version.rb
|
40
|
+
- lib/choice/writer.rb
|
41
|
+
- test/test_choice.rb
|
42
|
+
- test/test_lazyhash.rb
|
43
|
+
- test/test_option.rb
|
44
|
+
- test/test_parser.rb
|
45
|
+
- test/test_writer.rb
|
46
|
+
- examples/ftpd.rb
|
47
|
+
test_files: []
|
48
|
+
|
49
|
+
rdoc_options: []
|
50
|
+
|
51
|
+
extra_rdoc_files: []
|
52
|
+
|
53
|
+
executables: []
|
54
|
+
|
55
|
+
extensions: []
|
56
|
+
|
57
|
+
requirements: []
|
58
|
+
|
59
|
+
dependencies: []
|
60
|
+
|