highline 1.5.1 → 1.5.2

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -2,6 +2,11 @@
2
2
 
3
3
  Below is a complete listing of changes for each revision of HighLine.
4
4
 
5
+ == 1.5.2
6
+
7
+ * Added support for using the ffi-ncurses gem which is supported in JRuby.
8
+ * Added gem build instructions.
9
+
5
10
  == 1.5.1
6
11
 
7
12
  * Fixed the long standing echo true bug.
data/INSTALL CHANGED
@@ -14,6 +14,12 @@ version, simply enter the following into your command prompt:
14
14
  You must have RubyGems[http://rubyforge.org/projects/rubygems/] installed for
15
15
  the above to work.
16
16
 
17
+ If you want to build the gem locally, make sure you have
18
+ Rake[http://rubyforge.org/projects/rake/] installed then run the following
19
+ command:
20
+
21
+ $ rake package
22
+
17
23
  == Installing Manually
18
24
 
19
25
  Download the latest version of HighLine from the
@@ -31,7 +31,7 @@ require "highline/color_scheme"
31
31
  #
32
32
  class HighLine
33
33
  # The version of the installed library.
34
- VERSION = "1.5.1".freeze
34
+ VERSION = "1.5.2".freeze
35
35
 
36
36
  # An internal HighLine error. User code does not need to trap this.
37
37
  class QuestionError < StandardError
@@ -10,7 +10,9 @@
10
10
  class HighLine
11
11
  module SystemExtensions
12
12
  module_function
13
-
13
+
14
+ JRUBY = defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
15
+
14
16
  #
15
17
  # This section builds character reading and terminal size functions
16
18
  # to suit the proper platform we're running on. Be warned: Here be
@@ -19,7 +21,7 @@ class HighLine
19
21
  begin
20
22
  # Cygwin will look like Windows, but we want to treat it like a Posix OS:
21
23
  raise LoadError, "Cygwin is a Posix OS." if RUBY_PLATFORM =~ /\bcygwin\b/i
22
-
24
+
23
25
  require "Win32API" # See if we're on Windows.
24
26
 
25
27
  CHARACTER_MODE = "Win32API" # For Debugging purposes only.
@@ -30,40 +32,40 @@ class HighLine
30
32
  #
31
33
  def get_character( input = STDIN )
32
34
  @stdin_handle ||= GetStdHandle(STD_INPUT_HANDLE)
33
-
35
+
34
36
  begin
35
- SetConsoleEcho(@stdin_handle, false)
36
- input.getbyte
37
+ SetConsoleEcho(@stdin_handle, false)
38
+ input.getbyte
37
39
  ensure
38
- SetConsoleEcho(@stdin_handle, true)
40
+ SetConsoleEcho(@stdin_handle, true)
39
41
  end
40
42
  end
41
43
 
42
44
  # A Windows savvy method to fetch the console columns, and rows.
43
45
  def terminal_size
44
46
  stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE)
45
-
47
+
46
48
  bufx, bufy, curx, cury, wattr, left, top, right, bottom, maxx, maxy =
47
- GetConsoleScreenBufferInfo(stdout_handle)
49
+ GetConsoleScreenBufferInfo(stdout_handle)
48
50
  return right - left + 1, bottom - top + 1
49
51
  end
50
52
 
51
53
  # windows savvy console echo toggler
52
54
  def SetConsoleEcho( console_handle, on )
53
55
  mode = GetConsoleMode(console_handle)
54
-
56
+
55
57
  # toggle the console echo bit
56
58
  if on
57
- mode |= ENABLE_ECHO_INPUT
59
+ mode |= ENABLE_ECHO_INPUT
58
60
  else
59
- mode &= ~ENABLE_ECHO_INPUT
61
+ mode &= ~ENABLE_ECHO_INPUT
60
62
  end
61
-
63
+
62
64
  ok = SetConsoleMode(console_handle, mode)
63
65
  end
64
-
66
+
65
67
  # win32 console APIs
66
-
68
+
67
69
  STD_INPUT_HANDLE = -10
68
70
  STD_OUTPUT_HANDLE = -11
69
71
  STD_ERROR_HANDLE = -12
@@ -81,18 +83,18 @@ class HighLine
81
83
  @@apiGetConsoleMode = nil
82
84
  @@apiSetConsoleMode = nil
83
85
  @@apiGetConsoleScreenBufferInfo = nil
84
-
86
+
85
87
  def GetStdHandle( handle_type )
86
88
  @@apiGetStdHandle ||= Win32API.new( "kernel32", "GetStdHandle",
87
- ['L'], 'L' )
88
-
89
+ ['L'], 'L' )
90
+
89
91
  @@apiGetStdHandle.call( handle_type )
90
92
  end
91
-
93
+
92
94
  def GetConsoleMode( console_handle )
93
95
  @@apiGetConsoleMode ||= Win32API.new( "kernel32", "GetConsoleMode",
94
- ['L', 'P'], 'I' )
95
-
96
+ ['L', 'P'], 'I' )
97
+
96
98
  mode = ' ' * 4
97
99
  @@apiGetConsoleMode.call(console_handle, mode)
98
100
  mode.unpack('L')[0]
@@ -100,25 +102,25 @@ class HighLine
100
102
 
101
103
  def SetConsoleMode( console_handle, mode )
102
104
  @@apiSetConsoleMode ||= Win32API.new( "kernel32", "SetConsoleMode",
103
- ['L', 'L'], 'I' )
105
+ ['L', 'L'], 'I' )
104
106
 
105
107
  @@apiSetConsoleMode.call(console_handle, mode) != 0
106
108
  end
107
109
 
108
110
  def GetConsoleScreenBufferInfo( console_handle )
109
111
  @@apiGetConsoleScreenBufferInfo ||=
110
- Win32API.new( "kernel32", "GetConsoleScreenBufferInfo",
111
- ['L', 'P'], 'L' )
112
+ Win32API.new( "kernel32", "GetConsoleScreenBufferInfo",
113
+ ['L', 'P'], 'L' )
112
114
 
113
115
  format = 'SSSSSssssSS'
114
116
  buf = ([0] * format.size).pack(format)
115
117
  @@apiGetConsoleScreenBufferInfo.call(console_handle, buf)
116
118
  buf.unpack(format)
117
119
  end
118
-
120
+
119
121
  rescue LoadError # If we're not on Windows try...
120
122
  begin
121
- require "termios" # Unix, first choice.
123
+ require "termios" # Unix, first choice termios.
122
124
 
123
125
  CHARACTER_MODE = "termios" # For Debugging purposes only.
124
126
 
@@ -141,51 +143,96 @@ class HighLine
141
143
  Termios.setattr(input, Termios::TCSANOW, old_settings)
142
144
  end
143
145
  end
144
- rescue LoadError # If our first choice fails, default.
145
- CHARACTER_MODE = "stty" # For Debugging purposes only.
146
+ rescue LoadError # If our first choice fails, try using ffi-ncurses.
147
+ begin
148
+ require 'ffi-ncurses' # The ffi gem is builtin to JRUBY and because stty does not
149
+ # work correctly in JRuby manually installing the ffi-ncurses
150
+ # gem is the only way to get highline to operate correctly in
151
+ # JRuby. The ncurses library is only present on unix platforms
152
+ # so this is not a solution for using highline in JRuby on
153
+ # windows.
154
+
155
+ CHARACTER_MODE = "ncurses" # For Debugging purposes only.
156
+
157
+ #
158
+ # ncurses savvy getc(). (JRuby choice.)
159
+ #
160
+ def get_character( input = STDIN )
161
+ FFI::NCurses.initscr
162
+ FFI::NCurses.cbreak
163
+ begin
164
+ FFI::NCurses.curs_set 0
165
+ input.getc
166
+ ensure
167
+ FFI::NCurses.endwin
168
+ end
169
+ end
146
170
 
147
- #
148
- # Unix savvy getc(). (Second choice.)
149
- #
150
- # *WARNING*: This method requires the external "stty" program!
151
- #
152
- def get_character( input = STDIN )
153
- raw_no_echo_mode
171
+ rescue LoadError # If the ffi-ncurses choice fails, try using stty
172
+ if JRUBY
173
+ STDERR.puts "\n*** Using highline effectively in JRuby requires manually installing the ffi-ncurses gem.\n*** jruby -S gem install ffi-ncurses"
174
+ end
175
+ CHARACTER_MODE = "stty" # For Debugging purposes only.
176
+
177
+ #
178
+ # Unix savvy getc(). (Second choice.)
179
+ #
180
+ # *WARNING*: This method requires the external "stty" program!
181
+ #
182
+ def get_character( input = STDIN )
183
+ raw_no_echo_mode
184
+
185
+ begin
186
+ input.getbyte
187
+ ensure
188
+ restore_mode
189
+ end
190
+ end
154
191
 
155
- begin
156
- input.getbyte
157
- ensure
158
- restore_mode
192
+ #
193
+ # Switched the input mode to raw and disables echo.
194
+ #
195
+ # *WARNING*: This method requires the external "stty" program!
196
+ #
197
+ def raw_no_echo_mode
198
+ @state = `stty -g`
199
+ system "stty raw -echo cbreak isig"
200
+ end
201
+
202
+ #
203
+ # Restores a previously saved input mode.
204
+ #
205
+ # *WARNING*: This method requires the external "stty" program!
206
+ #
207
+ def restore_mode
208
+ system "stty #{@state}"
159
209
  end
160
210
  end
161
-
211
+ end
212
+ if CHARACTER_MODE == 'ncurses'
162
213
  #
163
- # Switched the input mode to raw and disables echo.
164
- #
165
- # *WARNING*: This method requires the external "stty" program!
166
- #
167
- def raw_no_echo_mode
168
- @state = `stty -g`
169
- system "stty raw -echo cbreak isig"
170
- end
171
-
214
+ # A ncurses savvy method to fetch the console columns, and rows.
172
215
  #
173
- # Restores a previously saved input mode.
174
- #
175
- # *WARNING*: This method requires the external "stty" program!
176
- #
177
- def restore_mode
178
- system "stty #{@state}"
216
+ def terminal_size
217
+ size = [80, 40]
218
+ FFI::NCurses.initscr
219
+ begin
220
+ size = FFI::NCurses.getmaxyx(stdscr).reverse
221
+ ensure
222
+ FFI::NCurses.endwin
223
+ end
224
+ size
179
225
  end
180
- end
181
-
182
- # A Unix savvy method to fetch the console columns, and rows.
183
- def terminal_size
184
- if /solaris/ =~ RUBY_PLATFORM and
185
- `stty` =~ /\brows = (\d+).*\bcolumns = (\d+)/
186
- [$2, $1].map { |c| x.to_i }
187
- else
188
- `stty size`.split.map { |x| x.to_i }.reverse
226
+ else
227
+ # A Unix savvy method using stty that to fetch the console columns, and rows.
228
+ # ... stty does not work in JRuby
229
+ def terminal_size
230
+ if /solaris/ =~ RUBY_PLATFORM and
231
+ `stty` =~ /\brows = (\d+).*\bcolumns = (\d+)/
232
+ [$2, $1].map { |c| x.to_i }
233
+ else
234
+ `stty size`.split.map { |x| x.to_i }.reverse
235
+ end
189
236
  end
190
237
  end
191
238
  end
@@ -412,7 +412,7 @@ class TestHighLine < Test::Unit::TestCase
412
412
  end
413
413
 
414
414
  def test_mode
415
- assert(%w[Win32API termios stty].include?(HighLine::CHARACTER_MODE))
415
+ assert(%w[Win32API termios ncurses stty].include?(HighLine::CHARACTER_MODE))
416
416
  end
417
417
 
418
418
  class NameClass
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.5.1
4
+ version: 1.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Edward Gray II
@@ -9,11 +9,16 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-05-07 00:00:00 -04:00
12
+ date: 2010-01-30 00:00:00 -06:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
16
- description: A high-level IO library that provides validation, type conversion, and more for command-line interfaces. HighLine also includes a complete menu system that can crank out anything from simple list selection to complete shells with just minutes of work.
16
+ description: |
17
+ A high-level IO library that provides validation, type conversion, and more for
18
+ command-line interfaces. HighLine also includes a complete menu system that can
19
+ crank out anything from simple list selection to complete shells with just
20
+ minutes of work.
21
+
17
22
  email: james@grayproductions.net
18
23
  executables: []
19
24
 
@@ -58,6 +63,8 @@ files:
58
63
  - LICENSE
59
64
  has_rdoc: true
60
65
  homepage: http://highline.rubyforge.org
66
+ licenses: []
67
+
61
68
  post_install_message:
62
69
  rdoc_options:
63
70
  - --title
@@ -81,9 +88,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
81
88
  requirements: []
82
89
 
83
90
  rubyforge_project: highline
84
- rubygems_version: 1.3.1
91
+ rubygems_version: 1.3.5
85
92
  signing_key:
86
- specification_version: 2
93
+ specification_version: 3
87
94
  summary: HighLine is a high-level command-line IO library.
88
95
  test_files:
89
96
  - test/ts_all.rb