highline 1.6.13 → 1.6.14
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +6 -0
- data/lib/highline.rb +18 -58
- data/lib/highline/system_extensions.rb +98 -94
- metadata +2 -2
data/CHANGELOG
CHANGED
@@ -2,6 +2,12 @@
|
|
2
2
|
|
3
3
|
Below is a complete listing of changes for each revision of HighLine.
|
4
4
|
|
5
|
+
== 1.6.14
|
6
|
+
|
7
|
+
* Added JRuby 1.7 support (by Mina Nagy).
|
8
|
+
* Take into account color escape sequences when wrapping text (by Mark J.
|
9
|
+
Titorenko).
|
10
|
+
|
5
11
|
== 1.6.13
|
6
12
|
|
7
13
|
* Removed unneeded Shebang lines (by Scott Gonyea).
|
data/lib/highline.rb
CHANGED
@@ -28,7 +28,7 @@ require "highline/style"
|
|
28
28
|
#
|
29
29
|
class HighLine
|
30
30
|
# The version of the installed library.
|
31
|
-
VERSION = "1.6.
|
31
|
+
VERSION = "1.6.14".freeze
|
32
32
|
|
33
33
|
# An internal HighLine error. User code does not need to trap this.
|
34
34
|
class QuestionError < StandardError
|
@@ -175,23 +175,9 @@ class HighLine
|
|
175
175
|
#
|
176
176
|
def initialize( input = $stdin, output = $stdout,
|
177
177
|
wrap_at = nil, page_at = nil )
|
178
|
+
super()
|
178
179
|
@input = input
|
179
180
|
@output = output
|
180
|
-
if JRUBY
|
181
|
-
require 'java'
|
182
|
-
java_import 'java.io.OutputStreamWriter'
|
183
|
-
java_import 'java.nio.channels.Channels'
|
184
|
-
java_import 'jline.ConsoleReader'
|
185
|
-
java_import 'jline.Terminal'
|
186
|
-
|
187
|
-
@java_input = Channels.newInputStream($stdin.to_channel)
|
188
|
-
@java_output = OutputStreamWriter.new(Channels.newOutputStream($stdout.to_channel))
|
189
|
-
@java_terminal = Terminal.getTerminal
|
190
|
-
@java_console = ConsoleReader.new(@java_input, @java_output)
|
191
|
-
@java_console.setUseHistory(false)
|
192
|
-
@java_console.setBellEnabled(true)
|
193
|
-
@java_console.setUsePagination(false)
|
194
|
-
end
|
195
181
|
|
196
182
|
self.wrap_at = wrap_at
|
197
183
|
self.page_at = page_at
|
@@ -255,7 +241,9 @@ class HighLine
|
|
255
241
|
# readline() needs to handle it's own output, but readline only supports
|
256
242
|
# full line reading. Therefore if @question.echo is anything but true,
|
257
243
|
# the prompt will not be issued. And we have to account for that now.
|
258
|
-
|
244
|
+
# Also, JRuby-1.7's ConsoleReader.readLine() needs to be passed the prompt
|
245
|
+
# to handle line editing properly.
|
246
|
+
say(@question) unless ((JRUBY or @question.readline) and @question.echo == true)
|
259
247
|
begin
|
260
248
|
@answer = @question.answer_or_default(get_response)
|
261
249
|
unless @question.valid_answer?(@answer)
|
@@ -796,13 +784,7 @@ class HighLine
|
|
796
784
|
answer
|
797
785
|
else
|
798
786
|
if JRUBY
|
799
|
-
|
800
|
-
@java_terminal.disableEcho
|
801
|
-
begin
|
802
|
-
raw_answer = @java_console.readLine(nil, nil)
|
803
|
-
ensure
|
804
|
-
@java_terminal.enableEcho if enable_echo_afterwards
|
805
|
-
end
|
787
|
+
raw_answer = @java_console.readLine(@question.question, nil)
|
806
788
|
else
|
807
789
|
raise EOFError, "The input stream is exhausted." if @@track_eof and
|
808
790
|
@input.eof?
|
@@ -813,16 +795,6 @@ class HighLine
|
|
813
795
|
end
|
814
796
|
end
|
815
797
|
|
816
|
-
def get_single_character(is_stty)
|
817
|
-
if JRUBY
|
818
|
-
@java_console.readVirtualKey
|
819
|
-
elsif is_stty
|
820
|
-
@input.getbyte
|
821
|
-
else
|
822
|
-
get_character(@input)
|
823
|
-
end
|
824
|
-
end
|
825
|
-
|
826
798
|
#
|
827
799
|
# Return a line or character of input, as requested for this question.
|
828
800
|
# Character input will be returned as a single character String,
|
@@ -841,18 +813,13 @@ class HighLine
|
|
841
813
|
if @question.echo == true and @question.limit.nil?
|
842
814
|
get_line
|
843
815
|
else
|
844
|
-
|
845
|
-
enable_echo_afterwards = @java_terminal.isEchoEnabled
|
846
|
-
@java_terminal.disableEcho
|
847
|
-
elsif stty
|
848
|
-
raw_no_echo_mode
|
849
|
-
end
|
816
|
+
raw_no_echo_mode
|
850
817
|
|
851
818
|
line = ""
|
852
819
|
backspace_limit = 0
|
853
820
|
begin
|
854
821
|
|
855
|
-
while character =
|
822
|
+
while character = get_character(@input)
|
856
823
|
# honor backspace and delete
|
857
824
|
if character == 127 or character == 8
|
858
825
|
line.slice!(-1, 1)
|
@@ -885,11 +852,7 @@ class HighLine
|
|
885
852
|
break if @question.limit and line.size == @question.limit
|
886
853
|
end
|
887
854
|
ensure
|
888
|
-
|
889
|
-
@java_terminal.enableEcho if enable_echo_afterwards
|
890
|
-
elsif stty
|
891
|
-
restore_mode
|
892
|
-
end
|
855
|
+
restore_mode
|
893
856
|
end
|
894
857
|
if @question.overwrite
|
895
858
|
@output.print("\r#{HighLine.Style(:erase_line).code}")
|
@@ -901,15 +864,12 @@ class HighLine
|
|
901
864
|
@question.change_case(@question.remove_whitespace(line))
|
902
865
|
end
|
903
866
|
else
|
904
|
-
|
905
|
-
enable_echo_afterwards = @java_terminal.isEchoEnabled
|
906
|
-
@java_terminal.disableEcho
|
907
|
-
end
|
867
|
+
raw_no_echo_mode
|
908
868
|
begin
|
909
869
|
if @question.character == :getc
|
910
|
-
response =
|
870
|
+
response = @input.getbyte.chr
|
911
871
|
else
|
912
|
-
response =
|
872
|
+
response = get_character(@input).chr
|
913
873
|
if @question.overwrite
|
914
874
|
@output.print("\r#{HighLine.Style(:erase_line).code}")
|
915
875
|
@output.flush
|
@@ -925,9 +885,7 @@ class HighLine
|
|
925
885
|
end
|
926
886
|
end
|
927
887
|
ensure
|
928
|
-
|
929
|
-
@java_terminal.enableEcho if enable_echo_afterwards
|
930
|
-
end
|
888
|
+
restore_mode
|
931
889
|
end
|
932
890
|
@question.change_case(response)
|
933
891
|
end
|
@@ -971,15 +929,17 @@ class HighLine
|
|
971
929
|
def wrap( text )
|
972
930
|
wrapped = [ ]
|
973
931
|
text.each_line do |line|
|
974
|
-
|
932
|
+
# take into account color escape sequences when wrapping
|
933
|
+
wrap_at = @wrap_at + (line.length - actual_length(line))
|
934
|
+
while line =~ /([^\n]{#{wrap_at + 1},})/
|
975
935
|
search = $1.dup
|
976
936
|
replace = $1.dup
|
977
|
-
if index = replace.rindex(" ",
|
937
|
+
if index = replace.rindex(" ", wrap_at)
|
978
938
|
replace[index, 1] = "\n"
|
979
939
|
replace.sub!(/\n[ \t]+/, "\n")
|
980
940
|
line.sub!(search, replace)
|
981
941
|
else
|
982
|
-
line[$~.begin(1) +
|
942
|
+
line[$~.begin(1) + wrap_at, 0] = "\n"
|
983
943
|
end
|
984
944
|
end
|
985
945
|
wrapped << line
|
@@ -9,9 +9,41 @@ require "highline/compatibility"
|
|
9
9
|
|
10
10
|
class HighLine
|
11
11
|
module SystemExtensions
|
12
|
+
JRUBY = defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
|
13
|
+
|
14
|
+
def initialize
|
15
|
+
if JRUBY
|
16
|
+
require 'java'
|
17
|
+
if JRUBY_VERSION =~ /^1.7/
|
18
|
+
java_import 'jline.console.ConsoleReader'
|
19
|
+
|
20
|
+
@java_console = ConsoleReader.new($stdin.to_inputstream, $stdout.to_outputstream)
|
21
|
+
@java_console.set_history_enabled(false)
|
22
|
+
@java_console.set_bell_enabled(true)
|
23
|
+
@java_console.set_pagination_enabled(false)
|
24
|
+
@java_terminal = @java_console.getTerminal
|
25
|
+
elsif JRUBY_VERSION =~ /^1.6/
|
26
|
+
java_import 'java.io.OutputStreamWriter'
|
27
|
+
java_import 'java.nio.channels.Channels'
|
28
|
+
java_import 'jline.ConsoleReader'
|
29
|
+
java_import 'jline.Terminal'
|
30
|
+
|
31
|
+
@java_input = Channels.newInputStream($stdin.to_channel)
|
32
|
+
@java_output = OutputStreamWriter.new(Channels.newOutputStream($stdout.to_channel))
|
33
|
+
@java_terminal = Terminal.getTerminal
|
34
|
+
@java_console = ConsoleReader.new(@java_input, @java_output)
|
35
|
+
@java_console.setUseHistory(false)
|
36
|
+
@java_console.setBellEnabled(true)
|
37
|
+
@java_console.setUsePagination(false)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
12
42
|
module_function
|
13
43
|
|
14
|
-
|
44
|
+
def get_character( input = STDIN )
|
45
|
+
input.getbyte
|
46
|
+
end
|
15
47
|
|
16
48
|
#
|
17
49
|
# This section builds character reading and terminal size functions
|
@@ -38,6 +70,13 @@ class HighLine
|
|
38
70
|
Win32API.new("crtdll", "_getch", [ ], "L").Call
|
39
71
|
end
|
40
72
|
|
73
|
+
# We do not define a raw_no_echo_mode for Windows as _getch turns off echo
|
74
|
+
def raw_no_echo_mode
|
75
|
+
end
|
76
|
+
|
77
|
+
def restore_mode
|
78
|
+
end
|
79
|
+
|
41
80
|
# A Windows savvy method to fetch the console columns, and rows.
|
42
81
|
def terminal_size
|
43
82
|
m_GetStdHandle = Win32API.new( 'kernel32',
|
@@ -63,114 +102,79 @@ class HighLine
|
|
63
102
|
|
64
103
|
CHARACTER_MODE = "termios" # For Debugging purposes only.
|
65
104
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
# *WARNING*: This method requires the "termios" library!
|
70
|
-
#
|
71
|
-
def get_character( input = STDIN )
|
72
|
-
return input.getbyte if input.is_a? StringIO
|
73
|
-
|
74
|
-
old_settings = Termios.getattr(input)
|
75
|
-
|
76
|
-
new_settings = old_settings.dup
|
105
|
+
def raw_no_echo_mode
|
106
|
+
@state = Termios.getattr(input)
|
107
|
+
new_settings = @state.dup
|
77
108
|
new_settings.c_lflag &= ~(Termios::ECHO | Termios::ICANON)
|
78
109
|
new_settings.c_cc[Termios::VMIN] = 1
|
110
|
+
Termios.setattr(input, Termios::TCSANOW, new_settings)
|
111
|
+
end
|
79
112
|
|
80
|
-
|
81
|
-
Termios.setattr(input, Termios::TCSANOW,
|
82
|
-
input.getbyte
|
83
|
-
ensure
|
84
|
-
Termios.setattr(input, Termios::TCSANOW, old_settings)
|
85
|
-
end
|
113
|
+
def restore_mode
|
114
|
+
Termios.setattr(input, Termios::TCSANOW, @state)
|
86
115
|
end
|
87
|
-
rescue LoadError
|
88
|
-
|
89
|
-
|
90
|
-
# work correctly in JRuby manually installing the ffi-ncurses
|
91
|
-
# gem is the only way to get highline to operate correctly in
|
92
|
-
# JRuby. The ncurses library is only present on unix platforms
|
93
|
-
# so this is not a solution for using highline in JRuby on
|
94
|
-
# windows.
|
95
|
-
|
96
|
-
CHARACTER_MODE = "ncurses" # For Debugging purposes only.
|
97
|
-
|
98
|
-
#
|
99
|
-
# ncurses savvy getc().
|
100
|
-
#
|
101
|
-
def get_character( input = STDIN )
|
102
|
-
FFI::NCurses.initscr
|
103
|
-
FFI::NCurses.cbreak
|
104
|
-
begin
|
105
|
-
FFI::NCurses.curs_set 0
|
106
|
-
input.getbyte
|
107
|
-
ensure
|
108
|
-
FFI::NCurses.endwin
|
109
|
-
end
|
110
|
-
end
|
116
|
+
rescue LoadError # If our first choice fails, try using JLine
|
117
|
+
if JRUBY # if we are on JRuby. JLine is bundled with JRuby.
|
118
|
+
CHARACTER_MODE = "jline" # For Debugging purposes only.
|
111
119
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
#
|
116
|
-
# Unix savvy getc(). (Second choice.)
|
117
|
-
#
|
118
|
-
# *WARNING*: This method requires the external "stty" program!
|
119
|
-
#
|
120
|
-
def get_character( input = STDIN )
|
121
|
-
raw_no_echo_mode
|
122
|
-
|
123
|
-
begin
|
124
|
-
input.getbyte
|
125
|
-
ensure
|
126
|
-
restore_mode
|
127
|
-
end
|
120
|
+
def terminal_size
|
121
|
+
[ @java_terminal.getTerminalWidth, @java_terminal.getTerminalHeight ]
|
128
122
|
end
|
129
123
|
|
130
|
-
#
|
131
|
-
# Switched the input mode to raw and disables echo.
|
132
|
-
#
|
133
|
-
# *WARNING*: This method requires the external "stty" program!
|
134
|
-
#
|
135
124
|
def raw_no_echo_mode
|
136
|
-
@state =
|
137
|
-
|
125
|
+
@state = @java_console.getEchoCharacter
|
126
|
+
@java_console.setEchoCharacter 0
|
138
127
|
end
|
139
128
|
|
140
|
-
#
|
141
|
-
# Restores a previously saved input mode.
|
142
|
-
#
|
143
|
-
# *WARNING*: This method requires the external "stty" program!
|
144
|
-
#
|
145
129
|
def restore_mode
|
146
|
-
|
130
|
+
@java_console.setEchoCharacter @state
|
147
131
|
end
|
148
|
-
|
149
|
-
end
|
150
|
-
if CHARACTER_MODE == 'ncurses'
|
151
|
-
#
|
152
|
-
# A ncurses savvy method to fetch the console columns, and rows.
|
153
|
-
#
|
154
|
-
def terminal_size
|
155
|
-
size = [80, 40]
|
156
|
-
FFI::NCurses.initscr
|
132
|
+
else # If we are not on JRuby, try ncurses
|
157
133
|
begin
|
158
|
-
|
159
|
-
|
160
|
-
|
134
|
+
require 'ffi-ncurses'
|
135
|
+
CHARACTER_MODE = "ncurses" # For Debugging purposes only.
|
136
|
+
|
137
|
+
def raw_no_echo_mode
|
138
|
+
FFI::NCurses.initscr
|
139
|
+
FFI::NCurses.cbreak
|
140
|
+
end
|
141
|
+
|
142
|
+
def restore_mode
|
143
|
+
FFI::NCurses.endwin
|
144
|
+
end
|
145
|
+
|
146
|
+
#
|
147
|
+
# A ncurses savvy method to fetch the console columns, and rows.
|
148
|
+
#
|
149
|
+
def terminal_size
|
150
|
+
size = [80, 40]
|
151
|
+
FFI::NCurses.initscr
|
152
|
+
begin
|
153
|
+
size = FFI::NCurses.getmaxyx(stdscr).reverse
|
154
|
+
ensure
|
155
|
+
FFI::NCurses.endwin
|
156
|
+
end
|
157
|
+
size
|
158
|
+
end
|
159
|
+
rescue LoadError # Finally, if all else fails, use stty
|
160
|
+
# *WARNING*: This requires the external "stty" program!
|
161
|
+
CHARACTER_MODE = "stty" # For Debugging purposes only.
|
162
|
+
|
163
|
+
def raw_no_echo_mode
|
164
|
+
@state = `stty -g`
|
165
|
+
system "stty raw -echo -icanon isig"
|
166
|
+
end
|
167
|
+
|
168
|
+
def restore_mode
|
169
|
+
system "stty #{@state}"
|
170
|
+
end
|
161
171
|
end
|
162
|
-
size
|
163
172
|
end
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
java_terminal = @java_terminal || Terminal.getTerminal
|
170
|
-
[ java_terminal.getTerminalWidth, java_terminal.getTerminalHeight ]
|
171
|
-
end
|
172
|
-
else
|
173
|
-
# A Unix savvy method using stty that to fetch the console columns, and rows.
|
173
|
+
end
|
174
|
+
|
175
|
+
# For termios and stty
|
176
|
+
if not defined?(terminal_size)
|
177
|
+
# A Unix savvy method using stty to fetch the console columns, and rows.
|
174
178
|
# ... stty does not work in JRuby
|
175
179
|
def terminal_size
|
176
180
|
if /solaris/ =~ RUBY_PLATFORM and
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: highline
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.6.
|
4
|
+
version: 1.6.14
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-08-25 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: ! 'A high-level IO library that provides validation, type conversion,
|
15
15
|
and more for
|