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/examples/menus.rb CHANGED
@@ -1,13 +1,14 @@
1
1
  #!/usr/bin/env ruby
2
+ # encoding: utf-8
2
3
 
3
4
  require "rubygems"
4
5
  require "highline/import"
5
6
 
6
- puts "Using: #{$terminal.terminal.class}"
7
+ puts "Using: #{HighLine.default_instance.terminal.class}"
7
8
  puts
8
9
 
9
10
  # The old way, using ask() and say()...
10
- choices = %w{ruby python perl}
11
+ choices = %w[ruby python perl]
11
12
  say("This is the old way using ask() and say()...")
12
13
  say("Please choose your favorite programming language:")
13
14
  say(choices.map { |c| " #{c}\n" }.join)
@@ -24,11 +25,10 @@ say("\nThis is the new mode (default)...")
24
25
  choose do |menu|
25
26
  menu.prompt = "Please choose your favorite programming language? "
26
27
 
27
- menu.choice :ruby do say("Good choice!") end
28
- menu.choices(:python, :perl) do say("Not from around here, are you?") end
28
+ menu.choice(:ruby) { say("Good choice!") }
29
+ menu.choices(:python, :perl) { say("Not from around here, are you?") }
29
30
 
30
31
  menu.default = :ruby
31
-
32
32
  end
33
33
 
34
34
  say("\nThis is letter indexing...")
@@ -38,8 +38,8 @@ choose do |menu|
38
38
 
39
39
  menu.prompt = "Please choose your favorite programming language? "
40
40
 
41
- menu.choice :ruby do say("Good choice!") end
42
- menu.choices(:python, :perl) do say("Not from around here, are you?") end
41
+ menu.choice(:ruby) { say("Good choice!") }
42
+ menu.choices(:python, :perl) { say("Not from around here, are you?") }
43
43
  end
44
44
 
45
45
  say("\nThis is with a different layout...")
@@ -49,8 +49,8 @@ choose do |menu|
49
49
  menu.header = "Languages"
50
50
  menu.prompt = "Favorite? "
51
51
 
52
- menu.choice :ruby do say("Good choice!") end
53
- menu.choices(:python, :perl) do say("Not from around here, are you?") end
52
+ menu.choice(:ruby) { say("Good choice!") }
53
+ menu.choices(:python, :perl) { say("Not from around here, are you?") }
54
54
  end
55
55
 
56
56
  say("\nYou can even build shells...")
@@ -60,10 +60,10 @@ loop do
60
60
 
61
61
  menu.shell = true
62
62
 
63
- menu.choice(:load, "Load a file.") do |command, details|
63
+ menu.choice(:load, "Load a file.") do |_command, details|
64
64
  say("Loading file with options: #{details}...")
65
65
  end
66
- menu.choice(:save, "Save a file.") do |command, details|
66
+ menu.choice(:save, "Save a file.") do |_command, details|
67
67
  say("Saving file with options: #{details}...")
68
68
  end
69
69
  menu.choice(:quit, "Exit program.") { exit }
@@ -1,22 +1,23 @@
1
1
  #!/usr/bin/env ruby
2
+ # encoding: utf-8
2
3
 
3
4
  # overwrite.rb
4
5
  #
5
6
  # Created by Jeremy Hinegardner on 2007-01-24
6
7
  # Copyright 2007 Jeremy Hinegardner. All rights reserved
7
8
 
8
- require 'rubygems'
9
- require 'highline/import'
9
+ require "rubygems"
10
+ require "highline/import"
10
11
 
11
- puts "Using: #{$terminal.terminal.class}"
12
+ puts "Using: #{HighLine.default_instance.terminal.class}"
12
13
  puts
13
14
 
14
15
  prompt = "here is your password:"
15
16
  ask(
16
17
  "#{prompt} <%= color('mypassword', RED, BOLD) %> (Press Any Key to blank) "
17
18
  ) do |q|
18
- q.overwrite = true
19
- q.echo = false # overwrite works best when echo is false.
20
- q.character = true # if this is set to :getc then overwrite does not work
19
+ q.overwrite = true
20
+ q.echo = false # overwrite works best when echo is false.
21
+ q.character = true # if this is set to :getc then overwrite does not work
21
22
  end
22
23
  say("<%= color('Look! blanked out!', GREEN) %>")
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # encoding: utf-8
2
3
 
3
4
  # page_and_wrap.rb
4
5
  #
@@ -8,10 +9,10 @@
8
9
  require "rubygems"
9
10
  require "highline/import"
10
11
 
11
- $terminal.wrap_at = 80
12
- $terminal.page_at = 22
12
+ HighLine.default_instance.wrap_at = 80
13
+ HighLine.default_instance.page_at = 22
13
14
 
14
- say(<<END)
15
+ say(<<CONSTITUTION)
15
16
  THE UNITED STATES CONSTITUTION
16
17
 
17
18
  We the People of the United States, in Order to form a more perfect Union, establish Justice, insure domestic Tranquility, provide for the common defence, promote the general Welfare, and secure the Blessings of Liberty to ourselves and our Posterity, do ordain and establish this Constitution for the United States of America.
@@ -319,4 +320,4 @@ James Wilson.
319
320
  Gouv Morris
320
321
 
321
322
  Attest William Jackson Secretary
322
- END
323
+ CONSTITUTION
data/examples/password.rb CHANGED
@@ -1,9 +1,10 @@
1
1
  #!/usr/bin/env ruby
2
+ # encoding: utf-8
2
3
 
3
4
  require "rubygems"
4
5
  require "highline/import"
5
6
 
6
- puts "Using: #{$terminal.terminal.class}"
7
+ puts "Using: #{HighLine.default_instance.terminal.class}"
7
8
  puts
8
9
 
9
10
  pass = ask("Enter your password: ") { |q| q.echo = false }
@@ -1,12 +1,14 @@
1
1
  #!/usr/bin/env ruby
2
+ # encoding: utf-8
2
3
 
3
4
  require "rubygems"
4
5
  require "highline/import"
5
6
 
6
- puts "Using: #{$terminal.terminal.class}"
7
+ puts "Using: #{HighLine.default_instance.terminal.class}"
7
8
  puts
8
9
 
9
- tounge_twister = ask("... try saying that three times fast") do |q|
10
+ # tounge_twister
11
+ ask("... try saying that three times fast") do |q|
10
12
  q.gather = 3
11
13
  q.verify_match = true
12
14
  q.responses[:mismatch] = "Nope, those don't match. Try again."
@@ -15,10 +17,10 @@ end
15
17
  puts "Ok, you did it."
16
18
 
17
19
  pass = ask("<%= key %>: ") do |q|
18
- q.echo = '*'
20
+ q.echo = "*"
19
21
  q.verify_match = true
20
- q.gather = {"Enter a password" => '',
21
- "Please type it again for verification" => ''}
22
+ q.gather = { "Enter a password" => "",
23
+ "Please type it again for verification" => "" }
22
24
  end
23
25
 
24
26
  puts "Your password is now #{pass}!"
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # encoding: utf-8
2
3
 
3
4
  # trapping_eof.rb
4
5
  #
@@ -13,7 +14,7 @@ loop do
13
14
  name = ask("What's your name?")
14
15
  break if name == "exit"
15
16
  puts "Hello, #{name}!"
16
- rescue EOFError # HighLine throws this if @input.eof?
17
+ rescue EOFError # HighLine throws this if @input.eof?
17
18
  break
18
19
  end
19
20
  end
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # encoding: utf-8
2
3
 
3
4
  # using_readline.rb
4
5
  #
@@ -9,7 +10,7 @@ require "rubygems"
9
10
  require "highline/import"
10
11
 
11
12
  loop do
12
- cmd = ask("Enter command: ", %w{save sample load reset quit}) do |q|
13
+ cmd = ask("Enter command: ", %w[save sample load reset quit]) do |q|
13
14
  q.readline = true
14
15
  end
15
16
  say("Executing \"#{cmd}\"...")
data/highline.gemspec CHANGED
@@ -1,35 +1,35 @@
1
1
  # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
3
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'highline/version'
5
-
6
- GEM_VERSION = HighLine::VERSION
7
2
 
8
- SPEC = Gem::Specification.new do |spec|
9
- spec.name = "highline"
10
- spec.version = GEM_VERSION
11
- spec.platform = Gem::Platform::RUBY
12
- spec.summary = "HighLine is a high-level command-line IO library."
13
- spec.files = `git ls-files`.split("\n")
14
-
15
- spec.test_files = `git ls-files -- test/*.rb`.split("\n")
16
- spec.has_rdoc = 'yard'
17
- spec.extra_rdoc_files = %w[README.md TODO Changelog.md LICENSE]
3
+ lib = File.expand_path("../lib", __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require "highline/version"
18
6
 
19
- spec.require_path = 'lib'
7
+ Gem::Specification.new do |spec|
8
+ spec.name = "highline"
9
+ spec.version = HighLine::VERSION
10
+ spec.author = "James Edward Gray II"
11
+ spec.email = "james@graysoftinc.com"
20
12
 
21
- spec.author = "James Edward Gray II"
22
- spec.email = "james@graysoftinc.com"
23
- spec.rubyforge_project = "highline"
24
- spec.homepage = "https://github.com/JEG2/highline"
25
- spec.license = "Ruby"
26
- spec.description = <<END_DESC
13
+ spec.summary = "HighLine is a high-level command-line IO library."
14
+ spec.description = <<DESCRIPTION
27
15
  A high-level IO library that provides validation, type conversion, and more for
28
16
  command-line interfaces. HighLine also includes a complete menu system that can
29
17
  crank out anything from simple list selection to complete shells with just
30
18
  minutes of work.
31
- END_DESC
19
+ DESCRIPTION
20
+ spec.homepage = "https://github.com/JEG2/highline"
21
+ spec.license = "Ruby"
22
+
23
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
24
+ f.match(%r{^(test|spec|features)/})
25
+ end
26
+ spec.require_paths = ["lib"]
27
+
28
+ spec.extra_rdoc_files = %w[README.md TODO Changelog.md LICENSE]
29
+
30
+ spec.required_ruby_version = ">= 1.9.3"
32
31
 
33
- spec.add_development_dependency "code_statistics"
34
- spec.required_ruby_version = '>= 1.9.3'
32
+ spec.add_development_dependency "bundler"
33
+ spec.add_development_dependency "rake"
34
+ spec.add_development_dependency "minitest"
35
35
  end
data/lib/highline.rb CHANGED
@@ -10,6 +10,7 @@
10
10
  #
11
11
  # This is Free Software. See LICENSE and COPYING for details.
12
12
 
13
+ require "English"
13
14
  require "erb"
14
15
  require "optparse"
15
16
  require "stringio"
@@ -29,90 +30,64 @@ require "highline/builtin_styles"
29
30
  #
30
31
  # A HighLine object is a "high-level line oriented" shell over an input and an
31
32
  # output stream. HighLine simplifies common console interaction, effectively
32
- # replacing {Kernel#puts} and {Kernel#gets}. User code can simply specify the question to ask
33
- # and any details about user interaction, then leave the rest of the work to
34
- # HighLine. When {HighLine#ask} returns, you'll have the answer you requested,
35
- # even if HighLine had to ask many times, validate results, perform range
36
- # checking, convert types, etc.
33
+ # replacing {Kernel#puts} and {Kernel#gets}. User code can simply specify the
34
+ # question to ask and any details about user interaction, then leave the rest
35
+ # of the work to HighLine. When {HighLine#ask} returns, you'll have the answer
36
+ # you requested, even if HighLine had to ask many times, validate results,
37
+ # perform range checking, convert types, etc.
37
38
  #
38
39
  # @example Basic usage
39
40
  # cli = HighLine.new
40
41
  # answer = cli.ask "What do you think?"
41
42
  # puts "You have answered: #{answer}"
42
-
43
+ #
43
44
  class HighLine
44
45
  include BuiltinStyles
45
46
  include CustomErrors
46
47
 
47
- # Set it to false to disable ANSI coloring
48
- attr_writer :use_color
49
-
50
- # Returns true if HighLine instance is currently using color escapes.
51
- def use_color?
52
- @use_color
53
- end
48
+ extend SingleForwardable
49
+ def_single_delegators :@default_instance, :agree, :ask, :choose, :say,
50
+ :use_color=, :use_color?, :reset_use_color,
51
+ :track_eof=, :track_eof?,
52
+ :color, :uncolor, :color_code
54
53
 
55
- # Resets the use of color.
56
- def reset_use_color
57
- @use_color = true
58
- end
54
+ class << self
55
+ attr_accessor :default_instance
59
56
 
60
- # For checking if the current version of HighLine supports RGB colors
61
- # Usage: HighLine.supports_rgb_color? rescue false # rescue for compatibility with older versions
62
- # Note: color usage also depends on HighLine.use_color being set
63
- def self.supports_rgb_color?
64
- true
65
- end
57
+ # Pass ColorScheme to set a HighLine color scheme.
58
+ attr_accessor :color_scheme
66
59
 
67
- # The setting used to disable EOF tracking.
68
- @track_eof = true
60
+ # Returns +true+ if HighLine is currently using a color scheme.
61
+ def using_color_scheme?
62
+ true if @color_scheme
63
+ end
69
64
 
70
- # Pass +false+ to _setting_ to turn off HighLine's EOF tracking.
71
- def self.track_eof=( setting )
72
- @track_eof = setting
73
- end
65
+ # Reset color scheme to default (+nil+)
66
+ def reset_color_scheme
67
+ self.color_scheme = nil
68
+ end
74
69
 
75
- # Returns true if HighLine is currently tracking EOF for input.
76
- def self.track_eof?
77
- @track_eof
78
- end
70
+ # Reset HighLine to default.
71
+ # Clears Style index and resets color_scheme and use_color settings.
72
+ def reset
73
+ Style.clear_index
74
+ reset_color_scheme
75
+ reset_use_color
76
+ end
79
77
 
80
- # (see HighLine.track_eof?)
81
- def track_eof?
82
- self.class.track_eof?
78
+ # For checking if the current version of HighLine supports RGB colors
79
+ # Usage: HighLine.supports_rgb_color? rescue false
80
+ # using rescue for compatibility with older versions
81
+ # Note: color usage also depends on HighLine.use_color being set
82
+ # TODO: Discuss removing this method
83
+ def supports_rgb_color?
84
+ true
85
+ end
83
86
  end
84
87
 
85
88
  # The setting used to control color schemes.
86
89
  @color_scheme = nil
87
90
 
88
- # Pass ColorScheme to _setting_ to set a HighLine color scheme.
89
- def self.color_scheme=( setting )
90
- @color_scheme = setting
91
- end
92
-
93
- # Returns the current color scheme.
94
- def self.color_scheme
95
- @color_scheme
96
- end
97
-
98
- # Returns +true+ if HighLine is currently using a color scheme.
99
- def self.using_color_scheme?
100
- !!@color_scheme
101
- end
102
-
103
- # Reset HighLine to default.
104
- # Clears Style index and resets color_scheme and use_color settings.
105
- def self.reset
106
- Style.clear_index
107
- reset_color_scheme
108
- reset_use_color
109
- end
110
-
111
- # Reset color scheme to default (+nil+)
112
- def self.reset_color_scheme
113
- self.color_scheme = nil
114
- end
115
-
116
91
  #
117
92
  # Create an instance of HighLine connected to the given _input_
118
93
  # and _output_ streams.
@@ -124,8 +99,9 @@ class HighLine
124
99
  # @param page_at [Integer] page size and paginating.
125
100
  # @param indent_size [Integer] indentation size in spaces.
126
101
  # @param indent_level [Integer] how deep is indentated.
127
- def initialize( input = $stdin, output = $stdout,
128
- wrap_at = nil, page_at = nil, indent_size=3, indent_level=0 )
102
+ def initialize(input = $stdin, output = $stdout,
103
+ wrap_at = nil, page_at = nil,
104
+ indent_size = 3, indent_level = 0)
129
105
  @input = input
130
106
  @output = output
131
107
 
@@ -140,10 +116,32 @@ class HighLine
140
116
  @prompt = nil
141
117
  @key = nil
142
118
  @use_color = true
119
+ @track_eof = true # The setting used to disable EOF tracking.
143
120
 
144
121
  @terminal = HighLine::Terminal.get_terminal(input, output)
145
122
  end
146
123
 
124
+ # Set it to false to disable ANSI coloring
125
+ attr_accessor :use_color
126
+
127
+ # Returns truethy if HighLine instance is currently using color escapes.
128
+ def use_color?
129
+ use_color
130
+ end
131
+
132
+ # Resets the use of color.
133
+ def reset_use_color
134
+ @use_color = true
135
+ end
136
+
137
+ # Pass +false+ to turn off HighLine's EOF tracking.
138
+ attr_accessor :track_eof
139
+
140
+ # Returns true if HighLine is currently tracking EOF for input.
141
+ def track_eof?
142
+ true if track_eof
143
+ end
144
+
147
145
  # @return [Integer] The current column setting for wrapping output.
148
146
  attr_reader :wrap_at
149
147
 
@@ -187,11 +185,13 @@ class HighLine
187
185
  #
188
186
  # Raises EOFError if input is exhausted.
189
187
  #
190
- # @param yes_or_no_question [String] a question that accepts yes and no as answers
191
- # @param character [Boolean, :getc] character mode to be passed to Question#character
188
+ # @param yes_or_no_question [String] a question that accepts yes and no as
189
+ # answers
190
+ # @param character [Boolean, :getc] character mode to be passed to
191
+ # Question#character
192
192
  # @see Question#character
193
- def agree( yes_or_no_question, character = nil )
194
- ask(yes_or_no_question, lambda { |yn| yn.downcase[0] == ?y}) do |q|
193
+ def agree(yes_or_no_question, character = nil)
194
+ ask(yes_or_no_question, ->(yn) { yn.downcase[0] == "y" }) do |q|
195
195
  q.validate = /\A(?:y(?:es)?|no?)\Z/i
196
196
  q.responses[:not_valid] = 'Please enter "yes" or "no".'
197
197
  q.responses[:ask_on_error] = :question
@@ -241,7 +241,7 @@ class HighLine
241
241
  # @param items [Array<String>]
242
242
  # @param details [Proc] to be passed to Menu.new
243
243
  # @return [String] answer
244
- def choose( *items, &details )
244
+ def choose(*items, &details)
245
245
  menu = Menu.new(&details)
246
246
  menu.choices(*items) unless items.empty?
247
247
 
@@ -273,7 +273,7 @@ class HighLine
273
273
  # @return [lambda] lambda to be used in autocompletion operations
274
274
 
275
275
  def shell_style_lambda(menu)
276
- lambda do |command| # shell-style selection
276
+ lambda do |command| # shell-style selection
277
277
  first_word = command.to_s.split.first || ""
278
278
 
279
279
  options = menu.options
@@ -294,23 +294,20 @@ class HighLine
294
294
  # (:blue for BLUE, for example). A CLEAR will automatically be embedded to
295
295
  # the end of the returned String.
296
296
  #
297
- # This method returns the original _string_ unchanged if HighLine::use_color?
297
+ # This method returns the original _string_ unchanged if use_color?
298
298
  # is +false+.
299
299
  #
300
300
  # @param string [String] string to be colored
301
301
  # @param colors [Array<Symbol>] array of colors like [:red, :blue]
302
302
  # @return [String] (ANSI escaped) colored string
303
303
  # @example
304
- # HighLine.color("Sustainable", :green, :bold)
304
+ # cli = HighLine.new
305
+ # cli.color("Sustainable", :green, :bold)
305
306
  # # => "\e[32m\e[1mSustainable\e[0m"
306
- def self.color( string, *colors )
307
- return string unless self.use_color?
308
- Style(*colors).color(string)
309
- end
310
-
311
- # (see .color)
312
- # This method is a clone of the HighLine.color class method.
313
- # But it checks for use_color? per instance
307
+ #
308
+ # # As class method (delegating to HighLine.default_instance)
309
+ # HighLine.color("Sustainable", :green, :bold)
310
+ #
314
311
  def color(string, *colors)
315
312
  return string unless use_color?
316
313
  HighLine.Style(*colors).color(string)
@@ -327,29 +324,19 @@ class HighLine
327
324
  # s.code # => "\e[31m\e[34m"
328
325
  #
329
326
  # HighLine.color_code(:red, :blue) # => "\e[31m\e[34m"
330
-
331
- def self.color_code(*colors)
332
- Style(*colors).code
333
- end
334
-
335
- # (see HighLine.color_code)
336
- # Convenience instance method. It delegates to the class method.
327
+ #
328
+ # cli = HighLine.new
329
+ # cli.color_code(:red, :blue) # => "\e[31m\e[34m"
330
+ #
337
331
  def color_code(*colors)
338
- self.class.color_code(*colors)
332
+ HighLine.Style(*colors).code
339
333
  end
340
334
 
341
335
  # Remove color codes from a string.
342
336
  # @param string [String] to be decolorized
343
337
  # @return [String] without the ANSI escape sequence (colors)
344
- def self.uncolor(string)
345
- Style.uncolor(string)
346
- end
347
-
348
- # (see .uncolor)
349
- # Convenience instance method. It delegates to the class method.
350
-
351
338
  def uncolor(string)
352
- self.class.uncolor(string)
339
+ Style.uncolor(string)
353
340
  end
354
341
 
355
342
  # Renders a list of itens using a {ListRenderer}
@@ -377,7 +364,7 @@ class HighLine
377
364
  statement = render_statement(statement)
378
365
  return if statement.empty?
379
366
 
380
- statement = (indentation+statement)
367
+ statement = (indentation + statement)
381
368
 
382
369
  # Don't add a newline if statement ends with whitespace, OR
383
370
  # if statement ends with whitespace before a color escape code.
@@ -402,7 +389,7 @@ class HighLine
402
389
  # set to <tt>:auto</tt>, HighLine will attempt to determine the columns
403
390
  # available for the <tt>@output</tt> or use a sensible default.
404
391
  #
405
- def wrap_at=( setting )
392
+ def wrap_at=(setting)
406
393
  @wrap_at = setting == :auto ? output_cols : setting
407
394
  end
408
395
 
@@ -412,7 +399,7 @@ class HighLine
412
399
  # set to <tt>:auto</tt>, HighLine will attempt to determine the rows available
413
400
  # for the <tt>@output</tt> or use a sensible default.
414
401
  #
415
- def page_at=( setting )
402
+ def page_at=(setting)
416
403
  @page_at = setting == :auto ? output_rows - 2 : setting
417
404
  end
418
405
 
@@ -420,7 +407,7 @@ class HighLine
420
407
  # Outputs indentation with current settings
421
408
  #
422
409
  def indentation
423
- ' '*@indent_size*@indent_level
410
+ " " * @indent_size * @indent_level
424
411
  end
425
412
 
426
413
  #
@@ -431,7 +418,7 @@ class HighLine
431
418
  # @param multiline [Boolean]
432
419
  # @return [void]
433
420
  # @see #multi_indent
434
- def indent(increase=1, statement=nil, multiline=nil)
421
+ def indent(increase = 1, statement = nil, multiline = nil)
435
422
  @indent_level += increase
436
423
  multi = @multi_indent
437
424
  @multi_indent ||= multiline
@@ -461,7 +448,7 @@ class HighLine
461
448
  def output_cols
462
449
  return 80 unless @output.tty?
463
450
  terminal.terminal_size.first
464
- rescue
451
+ rescue NoMethodError
465
452
  return 80
466
453
  end
467
454
 
@@ -472,7 +459,7 @@ class HighLine
472
459
  def output_rows
473
460
  return 24 unless @output.tty?
474
461
  terminal.terminal_size.last
475
- rescue
462
+ rescue NoMethodError
476
463
  return 24
477
464
  end
478
465
 
@@ -486,7 +473,8 @@ class HighLine
486
473
  # Creates a new HighLine instance with the same options
487
474
  #
488
475
  def new_scope
489
- self.class.new(@input, @output, @wrap_at, @page_at, @indent_size, @indent_level)
476
+ self.class.new(@input, @output, @wrap_at,
477
+ @page_at, @indent_size, @indent_level)
490
478
  end
491
479
 
492
480
  private
@@ -523,7 +511,7 @@ class HighLine
523
511
  # @param question [Question]
524
512
  # @return [String] response
525
513
  def get_response_line_mode(question)
526
- if question.echo == true and !question.limit
514
+ if question.echo == true && !question.limit
527
515
  get_line(question)
528
516
  else
529
517
  get_line_raw_no_echo_mode(question)
@@ -547,13 +535,15 @@ class HighLine
547
535
  line = ""
548
536
 
549
537
  terminal.raw_no_echo_mode_exec do
550
- while character = terminal.get_character
538
+ loop do
539
+ character = terminal.get_character
540
+ break unless character
551
541
  break if ["\n", "\r"].include? character
552
542
 
553
543
  # honor backspace and delete
554
544
  if character == "\b"
555
545
  chopped = line.chop!
556
- output_erase_char if chopped and question.echo
546
+ output_erase_char if chopped && question.echo
557
547
  else
558
548
  line << character
559
549
  say_last_char_or_echo_char(line, question)
@@ -581,11 +571,11 @@ class HighLine
581
571
 
582
572
  def say_last_char_or_echo_char(line, question)
583
573
  @output.print(line[-1]) if question.echo == true
584
- @output.print(question.echo) if question.echo and question.echo != true
574
+ @output.print(question.echo) if question.echo && question.echo != true
585
575
  end
586
576
 
587
577
  def line_overflow_for_question?(line, question)
588
- question.limit and line.size == question.limit
578
+ question.limit && line.size == question.limit
589
579
  end
590
580
 
591
581
  def output_erase_char
@@ -631,4 +621,6 @@ class HighLine
631
621
  end
632
622
  end
633
623
 
624
+ HighLine.default_instance = HighLine.new
625
+
634
626
  require "highline/string"