highline 1.0.1 → 1.0.2
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 +8 -0
- data/README +1 -1
- data/Rakefile +42 -41
- data/TODO +1 -1
- data/examples/ansi_colors.rb +15 -9
- data/examples/asking_for_arrays.rb +1 -1
- data/examples/basic_usage.rb +50 -50
- data/examples/menus.rb +28 -28
- data/examples/trapping_eof.rb +22 -0
- data/examples/using_readline.rb +5 -5
- data/lib/highline.rb +596 -569
- data/lib/highline/import.rb +2 -2
- data/lib/highline/menu.rb +356 -358
- data/lib/highline/question.rb +406 -409
- data/test/tc_highline.rb +739 -727
- data/test/tc_import.rb +12 -12
- data/test/tc_menu.rb +343 -343
- metadata +49 -45
data/test/tc_import.rb
CHANGED
@@ -11,16 +11,16 @@ require "highline/import"
|
|
11
11
|
require "stringio"
|
12
12
|
|
13
13
|
class TestImport < Test::Unit::TestCase
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
14
|
+
def test_import
|
15
|
+
assert_respond_to(self, :agree)
|
16
|
+
assert_respond_to(self, :ask)
|
17
|
+
assert_respond_to(self, :choose)
|
18
|
+
assert_respond_to(self, :say)
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_redirection
|
22
|
+
$terminal = HighLine.new(nil, (output = StringIO.new))
|
23
|
+
say("Testing...")
|
24
|
+
assert_equal("Testing...\n", output.string)
|
25
|
+
end
|
26
26
|
end
|
data/test/tc_menu.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
# tc_menu.rb
|
4
4
|
#
|
5
5
|
# Created by Gregory Thomas Brown on 2005-05-10.
|
6
|
-
# Copyright 2005
|
6
|
+
# Copyright 2005. All rights reserved.
|
7
7
|
|
8
8
|
require "test/unit"
|
9
9
|
|
@@ -11,346 +11,346 @@ require "highline"
|
|
11
11
|
require "stringio"
|
12
12
|
|
13
13
|
class TestMenu < Test::Unit::TestCase
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
14
|
+
def setup
|
15
|
+
@input = StringIO.new
|
16
|
+
@output = StringIO.new
|
17
|
+
@terminal = HighLine.new(@input, @output)
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_choices
|
21
|
+
@input << "2\n"
|
22
|
+
@input.rewind
|
23
|
+
|
24
|
+
output = @terminal.choose do |menu|
|
25
|
+
menu.choices("Sample1", "Sample2", "Sample3")
|
26
|
+
end
|
27
|
+
assert_equal("Sample2", output)
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_flow
|
31
|
+
@input << "Sample1\n"
|
32
|
+
@input.rewind
|
33
|
+
|
34
|
+
@terminal.choose do |menu|
|
35
|
+
# Default: menu.flow = :rows
|
36
|
+
|
37
|
+
menu.choice "Sample1"
|
38
|
+
menu.choice "Sample2"
|
39
|
+
menu.choice "Sample3"
|
40
|
+
end
|
41
|
+
assert_equal("1. Sample1\n2. Sample2\n3. Sample3\n? ", @output.string)
|
42
|
+
|
43
|
+
@output.truncate(@output.rewind)
|
44
|
+
@input.rewind
|
45
|
+
|
46
|
+
@terminal.choose do |menu|
|
47
|
+
menu.flow = :columns_across
|
48
|
+
|
49
|
+
menu.choice "Sample1"
|
50
|
+
menu.choice "Sample2"
|
51
|
+
menu.choice "Sample3"
|
52
|
+
end
|
53
|
+
assert_equal("1. Sample1 2. Sample2 3. Sample3\n? ", @output.string)
|
54
|
+
|
55
|
+
@output.truncate(@output.rewind)
|
56
|
+
@input.rewind
|
57
|
+
|
58
|
+
@terminal.choose do |menu|
|
59
|
+
menu.flow = :inline
|
60
|
+
menu.index = :none
|
61
|
+
|
62
|
+
menu.choice "Sample1"
|
63
|
+
menu.choice "Sample2"
|
64
|
+
menu.choice "Sample3"
|
65
|
+
end
|
66
|
+
assert_equal("Sample1, Sample2 or Sample3? ", @output.string)
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_help
|
70
|
+
@input << "help\nhelp load\nhelp rules\nhelp missing\n"
|
71
|
+
@input.rewind
|
72
|
+
|
73
|
+
4.times do
|
74
|
+
@terminal.choose do |menu|
|
75
|
+
menu.shell = true
|
76
|
+
|
77
|
+
menu.choice(:load, "Load a file.")
|
78
|
+
menu.choice(:save, "Save data in file.")
|
79
|
+
menu.choice(:quit, "Exit program.")
|
80
|
+
|
81
|
+
menu.help("rules", "The rules of this system are as follows...")
|
82
|
+
end
|
83
|
+
end
|
84
|
+
assert_equal( "1. load\n2. save\n3. quit\n4. help\n? " +
|
85
|
+
"This command will display helpful messages about " +
|
86
|
+
"functionality, like this one. To see the help for a " +
|
87
|
+
"specific topic enter:\n" +
|
88
|
+
"\thelp [TOPIC]\n" +
|
89
|
+
"Try asking for help on any of the following:\n" +
|
90
|
+
"\nload quit rules save \n" +
|
91
|
+
"1. load\n2. save\n3. quit\n4. help\n? " +
|
92
|
+
"= load\n\n" +
|
93
|
+
"Load a file.\n" +
|
94
|
+
"1. load\n2. save\n3. quit\n4. help\n? " +
|
95
|
+
"= rules\n\n" +
|
96
|
+
"The rules of this system are as follows...\n" +
|
97
|
+
"1. load\n2. save\n3. quit\n4. help\n? " +
|
98
|
+
"= missing\n\n" +
|
99
|
+
"There's no help for that topic.\n", @output.string )
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_index
|
103
|
+
@input << "Sample1\n"
|
104
|
+
@input.rewind
|
105
|
+
|
106
|
+
@terminal.choose do |menu|
|
107
|
+
# Default: menu.index = :number
|
108
|
+
|
109
|
+
menu.choice "Sample1"
|
110
|
+
menu.choice "Sample2"
|
111
|
+
menu.choice "Sample3"
|
112
|
+
end
|
113
|
+
assert_equal("1. Sample1\n2. Sample2\n3. Sample3\n? ", @output.string)
|
114
|
+
|
115
|
+
@output.truncate(@output.rewind)
|
116
|
+
@input.rewind
|
117
|
+
|
118
|
+
@terminal.choose do |menu|
|
119
|
+
menu.index = :letter
|
120
|
+
menu.index_suffix = ") "
|
121
|
+
|
122
|
+
menu.choice "Sample1"
|
123
|
+
menu.choice "Sample2"
|
124
|
+
menu.choice "Sample3"
|
125
|
+
end
|
126
|
+
assert_equal("a) Sample1\nb) Sample2\nc) Sample3\n? ", @output.string)
|
127
|
+
|
128
|
+
@output.truncate(@output.rewind)
|
129
|
+
@input.rewind
|
130
|
+
|
131
|
+
@terminal.choose do |menu|
|
132
|
+
menu.index = :none
|
133
|
+
|
134
|
+
menu.choice "Sample1"
|
135
|
+
menu.choice "Sample2"
|
136
|
+
menu.choice "Sample3"
|
137
|
+
end
|
138
|
+
assert_equal("Sample1\nSample2\nSample3\n? ", @output.string)
|
139
|
+
|
140
|
+
@output.truncate(@output.rewind)
|
141
|
+
@input.rewind
|
142
|
+
|
143
|
+
@terminal.choose do |menu|
|
144
|
+
menu.index = "*"
|
145
|
+
|
146
|
+
menu.choice "Sample1"
|
147
|
+
menu.choice "Sample2"
|
148
|
+
menu.choice "Sample3"
|
149
|
+
end
|
150
|
+
assert_equal("* Sample1\n* Sample2\n* Sample3\n? ", @output.string)
|
151
|
+
end
|
152
|
+
|
153
|
+
def test_layouts
|
154
|
+
@input << "save\n"
|
155
|
+
@input.rewind
|
156
|
+
|
157
|
+
@terminal.choose(:load, :save, :quit) # Default: layout = :list
|
158
|
+
assert_equal("1. load\n2. save\n3. quit\n? ", @output.string)
|
159
|
+
|
160
|
+
@input.rewind
|
161
|
+
@output.truncate(@output.rewind)
|
162
|
+
|
163
|
+
@terminal.choose(:load, :save, :quit) do |menu|
|
164
|
+
menu.header = "File Menu"
|
165
|
+
end
|
166
|
+
assert_equal( "File Menu:\n" +
|
167
|
+
"1. load\n2. save\n3. quit\n? ", @output.string )
|
168
|
+
|
169
|
+
@input.rewind
|
170
|
+
@output.truncate(@output.rewind)
|
171
|
+
|
172
|
+
@terminal.choose(:load, :save, :quit) do |menu|
|
173
|
+
menu.layout = :one_line
|
174
|
+
menu.header = "File Menu"
|
175
|
+
menu.prompt = "Operation? "
|
176
|
+
end
|
177
|
+
assert_equal( "File Menu: Operation? " +
|
178
|
+
"(load, save or quit) ", @output.string )
|
179
|
+
|
180
|
+
@input.rewind
|
181
|
+
@output.truncate(@output.rewind)
|
182
|
+
|
183
|
+
@terminal.choose(:load, :save, :quit) do |menu|
|
184
|
+
menu.layout = :menu_only
|
185
|
+
end
|
186
|
+
assert_equal("load, save or quit? ", @output.string)
|
187
|
+
|
188
|
+
@input.rewind
|
189
|
+
@output.truncate(@output.rewind)
|
190
|
+
|
191
|
+
@terminal.choose(:load, :save, :quit) do |menu|
|
192
|
+
menu.layout = '<%= list(@menu) %>File Menu: '
|
193
|
+
end
|
194
|
+
assert_equal("1. load\n2. save\n3. quit\nFile Menu: ", @output.string)
|
195
|
+
end
|
196
|
+
|
197
|
+
def test_list_option
|
198
|
+
@input << "l\n"
|
199
|
+
@input.rewind
|
200
|
+
|
201
|
+
@terminal.choose(:load, :save, :quit) do |menu|
|
202
|
+
menu.layout = :menu_only
|
203
|
+
menu.list_option = ", or "
|
204
|
+
end
|
205
|
+
assert_equal("load, save, or quit? ", @output.string)
|
206
|
+
end
|
207
|
+
|
208
|
+
def test_nil_on_handled
|
209
|
+
@input << "3\n3\n2\n"
|
210
|
+
@input.rewind
|
211
|
+
|
212
|
+
# Shows that by default proc results are returned.
|
213
|
+
output = @terminal.choose do |menu|
|
214
|
+
menu.choice "Sample1" do "output1" end
|
215
|
+
menu.choice "Sample2" do "output2" end
|
216
|
+
menu.choice "Sample3" do "output3" end
|
217
|
+
end
|
218
|
+
assert_equal("output3", output)
|
219
|
+
|
220
|
+
#
|
221
|
+
# Shows that they can be replaced with +nil+ by setting
|
222
|
+
# _nil_on_handled to +true+.
|
223
|
+
#
|
224
|
+
output = @terminal.choose do |menu|
|
225
|
+
menu.nil_on_handled = true
|
226
|
+
menu.choice "Sample1" do "output1" end
|
227
|
+
menu.choice "Sample2" do "output2" end
|
228
|
+
menu.choice "Sample3" do "output3" end
|
229
|
+
end
|
230
|
+
assert_equal(nil, output)
|
231
|
+
|
232
|
+
# Shows that a menu item without a proc will be returned no matter what.
|
233
|
+
output = @terminal.choose do |menu|
|
234
|
+
menu.choice "Sample1"
|
235
|
+
menu.choice "Sample2"
|
236
|
+
menu.choice "Sample3"
|
237
|
+
end
|
238
|
+
assert_equal("Sample2", output)
|
239
|
+
end
|
240
|
+
|
241
|
+
def test_passed_command
|
242
|
+
@input << "q\n"
|
243
|
+
@input.rewind
|
244
|
+
|
245
|
+
selected = nil
|
246
|
+
@terminal.choose do |menu|
|
247
|
+
menu.choices(:load, :save, :quit) { |command| selected = command }
|
248
|
+
end
|
249
|
+
assert_equal(:quit, selected)
|
250
|
+
end
|
251
|
+
|
252
|
+
def test_question_options
|
253
|
+
@input << "save\n"
|
254
|
+
@input.rewind
|
255
|
+
|
256
|
+
answer = @terminal.choose(:Load, :Save, :Quit) do |menu|
|
257
|
+
menu.case = :capitalize
|
258
|
+
end
|
259
|
+
assert_equal(:Save, answer)
|
260
|
+
|
261
|
+
@input.rewind
|
262
|
+
|
263
|
+
answer = @terminal.choose(:Load, :Save, :Quit) do |menu|
|
264
|
+
menu.case = :capitalize
|
265
|
+
menu.character = :getc
|
266
|
+
end
|
267
|
+
assert_equal(:Save, answer)
|
268
|
+
assert_equal(?a, @input.getc)
|
269
|
+
end
|
270
|
+
|
271
|
+
def test_select_by
|
272
|
+
@input << "Sample1\n2\n"
|
273
|
+
@input.rewind
|
274
|
+
|
275
|
+
selected = @terminal.choose do |menu|
|
276
|
+
menu.choice "Sample1"
|
277
|
+
menu.choice "Sample2"
|
278
|
+
menu.choice "Sample3"
|
279
|
+
end
|
280
|
+
assert_equal("Sample1", selected)
|
281
|
+
|
282
|
+
@input.rewind
|
283
|
+
|
284
|
+
selected = @terminal.choose do |menu|
|
285
|
+
menu.select_by = :index
|
286
|
+
|
287
|
+
menu.choice "Sample1"
|
288
|
+
menu.choice "Sample2"
|
289
|
+
menu.choice "Sample3"
|
290
|
+
end
|
291
|
+
assert_equal("Sample2", selected)
|
292
|
+
|
293
|
+
@input.rewind
|
294
|
+
|
295
|
+
selected = @terminal.choose do |menu|
|
296
|
+
menu.select_by = :name
|
297
|
+
|
298
|
+
menu.choice "Sample1"
|
299
|
+
menu.choice "Sample2"
|
300
|
+
menu.choice "Sample3"
|
301
|
+
end
|
302
|
+
assert_equal("Sample1", selected)
|
303
|
+
end
|
304
|
+
|
305
|
+
def test_select_by_letter
|
306
|
+
@input << "b\n"
|
307
|
+
@input.rewind
|
308
|
+
|
309
|
+
selected = @terminal.choose do |menu|
|
310
|
+
menu.index = :letter
|
311
|
+
menu.choice :save
|
312
|
+
menu.choice :load
|
313
|
+
menu.choice :quit
|
314
|
+
end
|
315
|
+
assert_equal(:load, selected)
|
316
|
+
end
|
317
|
+
|
318
|
+
def test_shell
|
319
|
+
@input << "save --some-option my_file.txt\n"
|
320
|
+
@input.rewind
|
321
|
+
|
322
|
+
selected = nil
|
323
|
+
options = nil
|
324
|
+
answer = @terminal.choose do |menu|
|
325
|
+
menu.choices(:load, :quit)
|
326
|
+
menu.choice(:save) do |command, details|
|
327
|
+
selected = command
|
328
|
+
options = details
|
329
|
+
|
330
|
+
"Saved!"
|
331
|
+
end
|
332
|
+
menu.shell = true
|
333
|
+
end
|
334
|
+
assert_equal("Saved!", answer)
|
335
|
+
assert_equal(:save, selected)
|
336
|
+
assert_equal("--some-option my_file.txt", options)
|
337
|
+
end
|
338
|
+
|
339
|
+
def test_simple_menu_shortcut
|
340
|
+
@input << "3\n"
|
341
|
+
@input.rewind
|
342
|
+
|
343
|
+
selected = @terminal.choose(:save, :load, :quit)
|
344
|
+
assert_equal(:quit, selected)
|
345
|
+
end
|
346
|
+
|
347
|
+
def test_symbols
|
348
|
+
@input << "3\n"
|
349
|
+
@input.rewind
|
350
|
+
|
351
|
+
selected = @terminal.choose do |menu|
|
352
|
+
menu.choices(:save, :load, :quit)
|
353
|
+
end
|
354
|
+
assert_equal(:quit, selected)
|
355
|
+
end
|
356
356
|
end
|