highline 2.0.0.pre.develop.9 → 2.0.0.pre.develop.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +59 -5
  3. data/.travis.yml +9 -4
  4. data/Changelog.md +11 -0
  5. data/Gemfile +12 -19
  6. data/Rakefile +5 -11
  7. data/examples/ansi_colors.rb +6 -11
  8. data/examples/asking_for_arrays.rb +4 -3
  9. data/examples/basic_usage.rb +29 -22
  10. data/examples/color_scheme.rb +11 -10
  11. data/examples/get_character.rb +6 -5
  12. data/examples/limit.rb +2 -1
  13. data/examples/menus.rb +11 -11
  14. data/examples/overwrite.rb +7 -6
  15. data/examples/page_and_wrap.rb +5 -4
  16. data/examples/password.rb +2 -1
  17. data/examples/repeat_entry.rb +7 -5
  18. data/examples/trapping_eof.rb +2 -1
  19. data/examples/using_readline.rb +2 -1
  20. data/highline.gemspec +25 -25
  21. data/lib/highline.rb +103 -111
  22. data/lib/highline/builtin_styles.rb +45 -41
  23. data/lib/highline/color_scheme.rb +32 -28
  24. data/lib/highline/compatibility.rb +3 -3
  25. data/lib/highline/custom_errors.rb +2 -1
  26. data/lib/highline/import.rb +8 -11
  27. data/lib/highline/list.rb +4 -8
  28. data/lib/highline/list_renderer.rb +207 -201
  29. data/lib/highline/menu.rb +75 -63
  30. data/lib/highline/menu/item.rb +2 -0
  31. data/lib/highline/paginator.rb +5 -6
  32. data/lib/highline/question.rb +38 -36
  33. data/lib/highline/question/answer_converter.rb +2 -2
  34. data/lib/highline/question_asker.rb +15 -17
  35. data/lib/highline/simulate.rb +11 -13
  36. data/lib/highline/statement.rb +12 -10
  37. data/lib/highline/string.rb +9 -8
  38. data/lib/highline/string_extensions.rb +30 -14
  39. data/lib/highline/style.rb +68 -45
  40. data/lib/highline/template_renderer.rb +5 -5
  41. data/lib/highline/terminal.rb +24 -31
  42. data/lib/highline/terminal/io_console.rb +2 -2
  43. data/lib/highline/terminal/ncurses.rb +4 -3
  44. data/lib/highline/terminal/unix_stty.rb +12 -9
  45. data/lib/highline/version.rb +1 -1
  46. data/lib/highline/wrapper.rb +12 -11
  47. metadata +34 -43
  48. data/test/acceptance/acceptance.rb +0 -62
  49. data/test/acceptance/acceptance_test.rb +0 -69
  50. data/test/acceptance/at_color_output_using_erb_templates.rb +0 -17
  51. data/test/acceptance/at_echo_false.rb +0 -23
  52. data/test/acceptance/at_readline.rb +0 -37
  53. data/test/io_console_compatible.rb +0 -37
  54. data/test/string_methods.rb +0 -35
  55. data/test/test_answer_converter.rb +0 -26
  56. data/test/test_color_scheme.rb +0 -94
  57. data/test/test_helper.rb +0 -22
  58. data/test/test_highline.rb +0 -1627
  59. data/test/test_import.rb +0 -55
  60. data/test/test_list.rb +0 -60
  61. data/test/test_menu.rb +0 -749
  62. data/test/test_paginator.rb +0 -73
  63. data/test/test_question_asker.rb +0 -20
  64. data/test/test_simulator.rb +0 -24
  65. data/test/test_string_extension.rb +0 -72
  66. data/test/test_string_highline.rb +0 -42
  67. data/test/test_style.rb +0 -613
  68. data/test/test_wrapper.rb +0 -188
data/lib/highline/menu.rb CHANGED
@@ -13,7 +13,8 @@ require "highline/menu/item"
13
13
 
14
14
  class HighLine
15
15
  #
16
- # Menu objects encapsulate all the details of a call to {HighLine#choose HighLine#choose}.
16
+ # Menu objects encapsulate all the details of a call to
17
+ # {HighLine#choose HighLine#choose}.
17
18
  # Using the accessors and {Menu#choice} and {Menu#choices}, the block passed
18
19
  # to {HighLine#choose} can detail all aspects of menu display and control.
19
20
  #
@@ -21,16 +22,16 @@ class HighLine
21
22
  # Pass +false+ to _color_ to turn off HighLine::Menu's
22
23
  # index coloring.
23
24
  # Pass a color and the Menu's indices will be colored.
24
- def self.index_color=(color = :rgb_77bbff)
25
- @index_color = color
25
+ class << self
26
+ attr_writer :index_color
26
27
  end
27
28
 
28
29
  # Initialize it
29
30
  self.index_color = false
30
31
 
31
32
  # Returns color used for coloring Menu's indices
32
- def self.index_color
33
- @index_color
33
+ class << self
34
+ attr_reader :index_color
34
35
  end
35
36
 
36
37
  #
@@ -53,10 +54,10 @@ class HighLine
53
54
  # Initialize Question objects with ignored values, we'll
54
55
  # adjust ours as needed.
55
56
  #
56
- super("Ignored", [ ], &nil) # avoiding passing the block along
57
+ super("Ignored", [], &nil) # avoiding passing the block along
57
58
 
58
- @items = [ ]
59
- @hidden_items = [ ]
59
+ @items = []
60
+ @hidden_items = []
60
61
  @help = Hash.new("There's no help for that topic.")
61
62
 
62
63
  @index = :number
@@ -75,13 +76,13 @@ class HighLine
75
76
  @index_color = self.class.index_color
76
77
 
77
78
  # Override Questions responses, we'll set our own.
78
- @responses = { }
79
+ @responses = {}
79
80
  # Context for action code.
80
81
  @highline = nil
81
82
 
82
83
  yield self if block_given?
83
84
 
84
- init_help if @shell and not @help.empty?
85
+ init_help if @shell && !@help.empty?
85
86
  end
86
87
 
87
88
  #
@@ -179,26 +180,27 @@ class HighLine
179
180
  # cli.choose do |menu|
180
181
  # menu.shell = true
181
182
  #
182
- # menu.choice(:load, text: 'Load a file', help: "Load a file using your favourite editor.")
183
+ # menu.choice(:load, text: 'Load a file',
184
+ # help: "Load a file using your favourite editor.")
183
185
  # menu.choice(:save, help: "Save data in file.")
184
186
  # menu.choice(:quit, help: "Exit program.")
185
187
  #
186
188
  # menu.help("rules", "The rules of this system are as follows...")
187
189
  # end
188
190
 
189
- def choice( name, help = nil, text = nil, &action )
191
+ def choice(name, help = nil, text = nil, &action)
190
192
  item = Menu::Item.new(name, text: text, help: help, action: action)
191
193
  @items << item
192
194
  @help.merge!(item.item_help)
193
- update_responses # rebuild responses based on our settings
195
+ update_responses # rebuild responses based on our settings
194
196
  end
195
197
 
196
198
  #
197
- # This method helps reduce the namespaces in the original call, which would look
198
- # like this: HighLine::Menu::Item.new(...)
199
+ # This method helps reduce the namespaces in the original call,
200
+ # which would look like this: HighLine::Menu::Item.new(...)
199
201
  # With #build_item, it looks like this: menu.build_item(...)
200
- # @param *args splat args, the same args you would pass to an initialization of
201
- # HighLine::Menu::Item
202
+ # @param *args splat args, the same args you would pass to an
203
+ # initialization of HighLine::Menu::Item
202
204
  # @return [HighLine::Menu::Item] the menu item
203
205
 
204
206
  def build_item(*args)
@@ -206,8 +208,8 @@ class HighLine
206
208
  end
207
209
 
208
210
  #
209
- # Adds an item directly to the menu. If you want more configuraiton or options,
210
- # use this method
211
+ # Adds an item directly to the menu. If you want more configuration
212
+ # or options, use this method
211
213
  #
212
214
  # @param item [Menu::Item] item containing choice fields and more
213
215
  # @return [void]
@@ -223,7 +225,8 @@ class HighLine
223
225
  # warned:</b> An _action_ set here will apply to *all* provided
224
226
  # _names_. This is considered to be a feature, so you can easily
225
227
  # hand-off interface processing to a different chunk of code.
226
- # @param names [Array<#to_s>] menu item titles/headers/names to be displayed.
228
+ # @param names [Array<#to_s>] menu item titles/headers/names to be
229
+ # displayed.
227
230
  # @param action (see #choice)
228
231
  # @return [void]
229
232
  # @example (see HighLine::Menu#initialize)
@@ -231,7 +234,7 @@ class HighLine
231
234
  # choice has more options available to you, like longer text or help (and
232
235
  # of course, individual actions)
233
236
  #
234
- def choices( *names, &action )
237
+ def choices(*names, &action)
235
238
  names.each { |n| choice(n, &action) }
236
239
  end
237
240
 
@@ -242,7 +245,7 @@ class HighLine
242
245
  # @param action (see #choice)
243
246
  # @return (see #choice)
244
247
 
245
- def hidden( name, help = nil, &action )
248
+ def hidden(name, help = nil, &action)
246
249
  item = Menu::Item.new(name, text: name, help: help, action: action)
247
250
  @hidden_items << item
248
251
  @help.merge!(item.item_help)
@@ -263,31 +266,36 @@ class HighLine
263
266
  # _index_suffix_ to a single space and _select_by_ to <tt>:name</tt>.
264
267
  # Because of this, you should make a habit of setting the _index_ first.
265
268
  #
266
- def index=( style )
269
+ def index=(style)
267
270
  @index = style
268
271
 
272
+ return unless @index == :none || @index.is_a?(::String)
273
+
269
274
  # Default settings.
270
- if @index == :none or @index.is_a?(::String)
271
- @index_suffix = " "
272
- @select_by = :name
273
- end
275
+ @index_suffix = " "
276
+ @select_by = :name
274
277
  end
275
278
 
276
279
  #
277
280
  # Initializes the help system by adding a <tt>:help</tt> choice, some
278
281
  # action code, and the default help listing.
279
282
  #
280
- def init_help( )
283
+ def init_help
281
284
  return if @items.include?(:help)
282
285
 
283
286
  topics = @help.keys.sort
284
- help_help = @help.include?("help") ? @help["help"] :
285
- "This command will display helpful messages about " +
286
- "functionality, like this one. To see the help for " +
287
- "a specific topic enter:\n\thelp [TOPIC]\nTry asking " +
288
- "for help on any of the following:\n\n" +
289
- "<%= list(#{topics.inspect}, :columns_across) %>"
290
- choice(:help, help_help) do |command, topic|
287
+ help_help =
288
+ if @help.include?("help")
289
+ @help["help"]
290
+ else
291
+ "This command will display helpful messages about " \
292
+ "functionality, like this one. To see the help for " \
293
+ "a specific topic enter:\n\thelp [TOPIC]\nTry asking " \
294
+ "for help on any of the following:\n\n" \
295
+ "<%= list(#{topics.inspect}, :columns_across) %>"
296
+ end
297
+
298
+ choice(:help, help_help) do |_command, topic|
291
299
  topic.strip!
292
300
  topic.downcase!
293
301
  if topic.empty?
@@ -302,11 +310,11 @@ class HighLine
302
310
  # Used to set help for arbitrary topics. Use the topic <tt>"help"</tt>
303
311
  # to override the default message. Mainly for internal use.
304
312
  #
305
- # @param topic [String] the menu item header/title/name to be associated with
306
- # a help message.
313
+ # @param topic [String] the menu item header/title/name to be associated
314
+ # with a help message.
307
315
  # @param help [String] the help message to be associated with the menu
308
316
  # item/title/name.
309
- def help( topic, help )
317
+ def help(topic, help)
310
318
  @help[topic] = help
311
319
  end
312
320
 
@@ -339,14 +347,14 @@ class HighLine
339
347
  # will default to <tt>:none</tt> and _flow_ will default to
340
348
  # <tt>:inline</tt>.
341
349
  #
342
- def layout=( new_layout )
350
+ def layout=(new_layout)
343
351
  @layout = new_layout
344
352
 
345
353
  # Default settings.
346
354
  case @layout
347
355
  when :one_line, :menu_only
348
356
  self.index = :none
349
- @flow = :inline
357
+ @flow = :inline
350
358
  end
351
359
  end
352
360
 
@@ -387,12 +395,14 @@ class HighLine
387
395
  # rules for this Menu object. If an action was provided for the
388
396
  # selection, it will be executed as described in {#choice}.
389
397
  #
390
- # @param highline_context [HighLine] a HighLine instance to be used as context.
391
- # @param selection [String, Integer] index or title of the selected menu item.
398
+ # @param highline_context [HighLine] a HighLine instance to be used
399
+ # as context.
400
+ # @param selection [String, Integer] index or title of the selected
401
+ # menu item.
392
402
  # @param details additional parameter to be passed when in shell mode.
393
403
  # @return [nil, Object] if @nil_on_handled is set it returns +nil+,
394
404
  # else it returns the action return value.
395
- def select( highline_context, selection, details = nil )
405
+ def select(highline_context, selection, details = nil)
396
406
  # add in any hidden menu commands
397
407
  items = all_items
398
408
 
@@ -423,18 +433,20 @@ class HighLine
423
433
  def get_item_by_letter(items, selection)
424
434
  item = items.find { |i| i.name == selection }
425
435
  return item if item
426
- l_index = "`" # character before the letter "a"
427
- index = items.map { "#{l_index.succ!}" }.index(selection)
436
+
437
+ # 97 is the "a" letter at ascii table
438
+ # Ex: For "a" it will return 0, and for "c" it will return 2
439
+ index = selection.ord - 97
428
440
  items[index]
429
441
  end
430
442
 
431
443
  def value_for_selected_item(item, details)
432
444
  if item.action
433
- if @shell
434
- result = item.action.call(item.name, details)
435
- else
436
- result = item.action.call(item.name)
437
- end
445
+ result = if @shell
446
+ item.action.call(item.name, details)
447
+ else
448
+ item.action.call(item.name)
449
+ end
438
450
  @nil_on_handled ? nil : result
439
451
  else
440
452
  item.name
@@ -451,7 +463,7 @@ class HighLine
451
463
  elsif selections.is_a?(Hash)
452
464
  value_for_hash_selections(items, selections, details)
453
465
  else
454
- fail ArgumentError, 'selections must be either Array or Hash'
466
+ raise ArgumentError, "selections must be either Array or Hash"
455
467
  end
456
468
  end
457
469
 
@@ -512,23 +524,23 @@ class HighLine
512
524
  # Allows Menu to behave as a String, just like Question. Returns the
513
525
  # _layout_ to be rendered, which is used by HighLine.say().
514
526
  #
515
- def to_s( )
527
+ def to_s
516
528
  case @layout
517
529
  when :list
518
530
  %(<%= header ? "#{header}:\n" : '' %>) +
519
- parse_list +
520
- show_default_if_any +
521
- "<%= prompt %>"
531
+ parse_list +
532
+ show_default_if_any +
533
+ "<%= prompt %>"
522
534
  when :one_line
523
535
  %(<%= header ? "#{header}: " : '' %>) +
524
- "<%= prompt %>" +
525
- "(" + parse_list + ")" +
526
- show_default_if_any +
527
- "<%= prompt[/\s*$/] %>"
536
+ "<%= prompt %>" \
537
+ "(" + parse_list + ")" +
538
+ show_default_if_any +
539
+ "<%= prompt[/\s*$/] %>"
528
540
  when :menu_only
529
541
  parse_list +
530
- show_default_if_any +
531
- "<%= prompt %>"
542
+ show_default_if_any +
543
+ "<%= prompt %>"
532
544
  else
533
545
  @layout
534
546
  end
@@ -536,11 +548,11 @@ class HighLine
536
548
 
537
549
  def parse_list
538
550
  "<%= list( menu, #{@flow.inspect},
539
- #{@list_option.inspect} ) %>"
551
+ #{@list_option.inspect} ) %>"
540
552
  end
541
553
 
542
554
  def show_default_if_any
543
- return default.to_s.empty? ? "" : "(#{default}) "
555
+ default.to_s.empty? ? "" : "(#{default}) "
544
556
  end
545
557
 
546
558
  #
@@ -1,3 +1,5 @@
1
+ # encoding: utf-8
2
+
1
3
  class HighLine
2
4
  class Menu < Question
3
5
  # Represents an Item of a HighLine::Menu.
@@ -3,7 +3,6 @@
3
3
  class HighLine
4
4
  # Take the task of paginating some piece of text given a HighLine context
5
5
  class Paginator
6
-
7
6
  # @return [HighLine] HighLine context
8
7
  attr_reader :highline
9
8
 
@@ -36,18 +35,18 @@ class HighLine
36
35
  # Return last line if user wants to abort paging
37
36
  return "...\n#{lines.last}" unless continue_paging?
38
37
  end
39
- return lines.join
38
+ lines.join
40
39
  end
41
40
 
42
41
  #
43
- # Ask user if they wish to continue paging output. Allows them to type "q" to
44
- # cancel the paging process.
42
+ # Ask user if they wish to continue paging output. Allows them to
43
+ # type "q" to cancel the paging process.
45
44
  #
46
45
  def continue_paging?
47
46
  command = highline.new_scope.ask(
48
47
  "-- press enter/return to continue or q to stop -- "
49
48
  ) { |q| q.character = true }
50
- command !~ /\A[qQ]\Z/ # Only continue paging if Q was not hit.
49
+ command !~ /\A[qQ]\Z/ # Only continue paging if Q was not hit.
51
50
  end
52
51
  end
53
- end
52
+ end
@@ -8,6 +8,7 @@
8
8
  #
9
9
  # This is Free Software. See LICENSE and COPYING for details.
10
10
 
11
+ require "English"
11
12
  require "optparse"
12
13
  require "date"
13
14
  require "pathname"
@@ -59,11 +60,11 @@ class HighLine
59
60
  @case = nil
60
61
  @in = nil
61
62
  @first_answer = nil
62
- @directory = Pathname.new(File.expand_path(File.dirname($0)))
63
63
  @glob = "*"
64
- @user_responses = Hash.new
65
- @internal_responses = default_responses_hash
66
64
  @overwrite = false
65
+ @user_responses = {}
66
+ @internal_responses = default_responses_hash
67
+ @directory = Pathname.new(File.expand_path(File.dirname($PROGRAM_NAME)))
67
68
 
68
69
  # allow block to override settings
69
70
  yield self if block_given?
@@ -148,11 +149,11 @@ class HighLine
148
149
  #
149
150
  # Asks a yes or no confirmation question, to ensure a user knows what
150
151
  # they have just agreed to. The confirm attribute can be set to :
151
- # +true+ : In this case the question will be, "Are you sure?".
152
- # Proc : The Proc is yielded the answer given. The Proc must
153
- # output a string which is then used as the confirm
154
- # question.
155
- # String : The String must use ERB syntax. The String is
152
+ # +true+ : In this case the question will be, "Are you sure?".
153
+ # Proc : The Proc is yielded the answer given. The Proc must
154
+ # output a string which is then used as the confirm
155
+ # question.
156
+ # String : The String must use ERB syntax. The String is
156
157
  # evaluated with access to question and answer and
157
158
  # is then used as the confirm question.
158
159
  # When set to +false+ or +nil+ (the default), answers are not confirmed.
@@ -261,8 +262,8 @@ class HighLine
261
262
 
262
263
  def default_responses_hash
263
264
  {
264
- :ask_on_error => "? ",
265
- :mismatch => "Your entries didn't match."
265
+ ask_on_error: "? ",
266
+ mismatch: "Your entries didn't match."
266
267
  }
267
268
  end
268
269
 
@@ -270,15 +271,15 @@ class HighLine
270
271
  # @param message_source (see #build_responses)
271
272
  # @return [Hash] responses hash
272
273
  def build_responses_new_hash(message_source)
273
- { :ambiguous_completion => "Ambiguous choice. Please choose one of " +
274
- choice_error_str(message_source) + '.',
275
- :invalid_type => "You must enter a valid #{message_source}.",
276
- :no_completion => "You must choose one of " +
277
- choice_error_str(message_source) + '.',
278
- :not_in_range => "Your answer isn't within the expected range " +
279
- "(#{expected_range}).",
280
- :not_valid => "Your answer isn't valid (must match " +
281
- "#{validate.inspect})." }
274
+ { ambiguous_completion: "Ambiguous choice. Please choose one of " +
275
+ choice_error_str(message_source) + ".",
276
+ invalid_type: "You must enter a valid #{message_source}.",
277
+ no_completion: "You must choose one of " +
278
+ choice_error_str(message_source) + ".",
279
+ not_in_range: "Your answer isn't within the expected range " \
280
+ "(#{expected_range}).",
281
+ not_valid: "Your answer isn't valid (must match " \
282
+ "#{validate.inspect})." }
282
283
  end
283
284
 
284
285
  # This is the actual responses hash that gets used in determining output
@@ -369,7 +370,7 @@ class HighLine
369
370
 
370
371
  # Returns an English explanation of the current range settings.
371
372
  def expected_range
372
- expected = [ ]
373
+ expected = []
373
374
 
374
375
  expected << "above #{above}" if above
375
376
  expected << "below #{below}" if below
@@ -392,7 +393,7 @@ class HighLine
392
393
 
393
394
  # Returns true if _first_answer_ is set.
394
395
  def first_answer?
395
- !!@first_answer
396
+ true if @first_answer
396
397
  end
397
398
 
398
399
  #
@@ -402,9 +403,9 @@ class HighLine
402
403
  # are not checked.
403
404
  #
404
405
  def in_range?
405
- (!above or answer > above) and
406
- (!below or answer < below) and
407
- (!@in or @in.include?(answer))
406
+ (!above || answer > above) &&
407
+ (!below || answer < below) &&
408
+ (!@in || @in.include?(answer))
408
409
  end
409
410
 
410
411
  #
@@ -468,7 +469,7 @@ class HighLine
468
469
  File.basename(file)
469
470
  end
470
471
  else
471
- [ ]
472
+ []
472
473
  end
473
474
  end
474
475
 
@@ -485,9 +486,9 @@ class HighLine
485
486
  # and case handling.
486
487
  #
487
488
  def valid_answer?
488
- !validate or
489
- (validate.is_a?(Regexp) and answer =~ validate) or
490
- (validate.is_a?(Proc) and validate[answer])
489
+ !validate ||
490
+ (validate.is_a?(Regexp) && answer =~ validate) ||
491
+ (validate.is_a?(Proc) && validate[answer])
491
492
  end
492
493
 
493
494
  #
@@ -534,11 +535,11 @@ class HighLine
534
535
  if confirm == true
535
536
  "Are you sure? "
536
537
  elsif confirm.is_a?(Proc)
537
- confirm.call(self.answer)
538
+ confirm.call(answer)
538
539
  else
539
540
  # evaluate ERb under initial scope, so it will have
540
541
  # access to question and answer
541
- template = ERB.new(confirm, nil, "%")
542
+ template = ERB.new(confirm, nil, "%")
542
543
  template_renderer = TemplateRenderer.new(template, self, highline)
543
544
  template_renderer.render
544
545
  end
@@ -547,7 +548,8 @@ class HighLine
547
548
  # Provides the String to be asked when at an error situation.
548
549
  # It may be just the question itself (repeat on error).
549
550
  # @return [self] if :ask_on_error on responses Hash is set to :question
550
- # @return [String] if :ask_on_error on responses Hash is set to something else
551
+ # @return [String] if :ask_on_error on responses Hash is set to
552
+ # something else
551
553
  def ask_on_error_msg
552
554
  if final_responses[:ask_on_error] == :question
553
555
  self
@@ -564,7 +566,7 @@ class HighLine
564
566
  # @param highline [HighLine] context
565
567
  # @return [void]
566
568
  def show_question(highline)
567
- highline.say(self) unless (readline && (echo == true && !limit))
569
+ highline.say(self) unless readline && (echo == true && !limit)
568
570
  end
569
571
 
570
572
  # Returns an echo string that is adequate for this Question settings.
@@ -577,7 +579,7 @@ class HighLine
577
579
  if echo == true
578
580
  response
579
581
  # any truethy value, probably a String
580
- elsif !!echo
582
+ elsif echo
581
583
  echo
582
584
  # any falsy value, false or nil
583
585
  else
@@ -594,11 +596,11 @@ class HighLine
594
596
  #
595
597
  def append_default
596
598
  if template =~ /([\t ]+)\Z/
597
- template << "|#{default}|#{$1}"
599
+ template << "|#{default}|#{Regexp.last_match(1)}"
598
600
  elsif template == ""
599
601
  template << "|#{default}| "
600
602
  elsif template[-1, 1] == "\n"
601
- template[-2, 0] = " |#{default}|"
603
+ template[-2, 0] = " |#{default}|"
602
604
  else
603
605
  template << " |#{default}|"
604
606
  end
@@ -606,7 +608,7 @@ class HighLine
606
608
 
607
609
  def choice_error_str(message_source)
608
610
  if message_source.is_a? Array
609
- '[' + message_source.join(', ') + ']'
611
+ "[" + message_source.join(", ") + "]"
610
612
  else
611
613
  message_source.inspect
612
614
  end