highline 2.0.0.pre.develop.9 → 2.0.0.pre.develop.11
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.
- checksums.yaml +4 -4
- data/.rubocop.yml +59 -5
- data/.travis.yml +9 -4
- data/Changelog.md +11 -0
- data/Gemfile +12 -19
- data/Rakefile +5 -11
- data/examples/ansi_colors.rb +6 -11
- data/examples/asking_for_arrays.rb +4 -3
- data/examples/basic_usage.rb +29 -22
- data/examples/color_scheme.rb +11 -10
- data/examples/get_character.rb +6 -5
- data/examples/limit.rb +2 -1
- data/examples/menus.rb +11 -11
- data/examples/overwrite.rb +7 -6
- data/examples/page_and_wrap.rb +5 -4
- data/examples/password.rb +2 -1
- data/examples/repeat_entry.rb +7 -5
- data/examples/trapping_eof.rb +2 -1
- data/examples/using_readline.rb +2 -1
- data/highline.gemspec +25 -25
- data/lib/highline.rb +103 -111
- data/lib/highline/builtin_styles.rb +45 -41
- data/lib/highline/color_scheme.rb +32 -28
- data/lib/highline/compatibility.rb +3 -3
- data/lib/highline/custom_errors.rb +2 -1
- data/lib/highline/import.rb +8 -11
- data/lib/highline/list.rb +4 -8
- data/lib/highline/list_renderer.rb +207 -201
- data/lib/highline/menu.rb +75 -63
- data/lib/highline/menu/item.rb +2 -0
- data/lib/highline/paginator.rb +5 -6
- data/lib/highline/question.rb +38 -36
- data/lib/highline/question/answer_converter.rb +2 -2
- data/lib/highline/question_asker.rb +15 -17
- data/lib/highline/simulate.rb +11 -13
- data/lib/highline/statement.rb +12 -10
- data/lib/highline/string.rb +9 -8
- data/lib/highline/string_extensions.rb +30 -14
- data/lib/highline/style.rb +68 -45
- data/lib/highline/template_renderer.rb +5 -5
- data/lib/highline/terminal.rb +24 -31
- data/lib/highline/terminal/io_console.rb +2 -2
- data/lib/highline/terminal/ncurses.rb +4 -3
- data/lib/highline/terminal/unix_stty.rb +12 -9
- data/lib/highline/version.rb +1 -1
- data/lib/highline/wrapper.rb +12 -11
- metadata +34 -43
- data/test/acceptance/acceptance.rb +0 -62
- data/test/acceptance/acceptance_test.rb +0 -69
- data/test/acceptance/at_color_output_using_erb_templates.rb +0 -17
- data/test/acceptance/at_echo_false.rb +0 -23
- data/test/acceptance/at_readline.rb +0 -37
- data/test/io_console_compatible.rb +0 -37
- data/test/string_methods.rb +0 -35
- data/test/test_answer_converter.rb +0 -26
- data/test/test_color_scheme.rb +0 -94
- data/test/test_helper.rb +0 -22
- data/test/test_highline.rb +0 -1627
- data/test/test_import.rb +0 -55
- data/test/test_list.rb +0 -60
- data/test/test_menu.rb +0 -749
- data/test/test_paginator.rb +0 -73
- data/test/test_question_asker.rb +0 -20
- data/test/test_simulator.rb +0 -24
- data/test/test_string_extension.rb +0 -72
- data/test/test_string_highline.rb +0 -42
- data/test/test_style.rb +0 -613
- data/test/test_wrapper.rb +0 -188
@@ -1,6 +1,6 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
|
3
|
-
require
|
3
|
+
require "forwardable"
|
4
4
|
|
5
5
|
class HighLine
|
6
6
|
# Renders an erb template taking a {Question} and a {HighLine} instance
|
@@ -42,9 +42,9 @@ class HighLine
|
|
42
42
|
# is not available.
|
43
43
|
# @return [String] error message.
|
44
44
|
def method_missing(method, *args)
|
45
|
-
"Method #{method} with args #{args.inspect} "
|
46
|
-
|
47
|
-
|
45
|
+
"Method #{method} with args #{args.inspect} " \
|
46
|
+
"is not available on #{inspect}. " \
|
47
|
+
"Try #{methods(false).sort.inspect}"
|
48
48
|
end
|
49
49
|
|
50
50
|
# @return [Question, Menu] {#source} attribute.
|
@@ -59,4 +59,4 @@ class HighLine
|
|
59
59
|
HighLine.const_get(name)
|
60
60
|
end
|
61
61
|
end
|
62
|
-
end
|
62
|
+
end
|
data/lib/highline/terminal.rb
CHANGED
@@ -16,24 +16,17 @@ class HighLine
|
|
16
16
|
# input and output to.
|
17
17
|
# The specialized Terminals all decend from this HighLine::Terminal class
|
18
18
|
class Terminal
|
19
|
-
|
20
19
|
# Probe for and return a suitable Terminal instance
|
21
20
|
# @param input [IO] input stream
|
22
21
|
# @param output [IO] output stream
|
23
22
|
def self.get_terminal(input, output)
|
24
|
-
terminal = nil
|
25
|
-
|
26
23
|
# First of all, probe for io/console
|
27
24
|
begin
|
28
25
|
require "io/console"
|
29
26
|
require "highline/terminal/io_console"
|
30
27
|
terminal = HighLine::Terminal::IOConsole.new(input, output)
|
31
28
|
rescue LoadError
|
32
|
-
|
33
|
-
|
34
|
-
# Fall back to UnixStty
|
35
|
-
unless terminal
|
36
|
-
require 'highline/terminal/unix_stty'
|
29
|
+
require "highline/terminal/unix_stty"
|
37
30
|
terminal = HighLine::Terminal::UnixStty.new(input, output)
|
38
31
|
end
|
39
32
|
|
@@ -57,8 +50,7 @@ class HighLine
|
|
57
50
|
|
58
51
|
# An initialization callback.
|
59
52
|
# It is called by {.get_terminal}.
|
60
|
-
def initialize_system_extensions
|
61
|
-
end
|
53
|
+
def initialize_system_extensions; end
|
62
54
|
|
63
55
|
# @return [Array<Integer, Integer>] two value terminal
|
64
56
|
# size like [columns, lines]
|
@@ -67,8 +59,7 @@ class HighLine
|
|
67
59
|
end
|
68
60
|
|
69
61
|
# Enter Raw No Echo mode.
|
70
|
-
def raw_no_echo_mode
|
71
|
-
end
|
62
|
+
def raw_no_echo_mode; end
|
72
63
|
|
73
64
|
# Yieds a block to be executed in Raw No Echo mode and
|
74
65
|
# then restore the terminal state.
|
@@ -80,40 +71,38 @@ class HighLine
|
|
80
71
|
end
|
81
72
|
|
82
73
|
# Restore terminal to its default mode
|
83
|
-
def restore_mode
|
84
|
-
end
|
74
|
+
def restore_mode; end
|
85
75
|
|
86
76
|
# Get one character from the terminal
|
87
77
|
# @return [String] one character
|
88
|
-
def get_character
|
89
|
-
end
|
78
|
+
def get_character; end # rubocop:disable Naming/AccessorMethodName
|
90
79
|
|
91
80
|
# Get one line from the terminal and format accordling.
|
92
81
|
# Use readline if question has readline mode set.
|
93
82
|
# @param question [HighLine::Question]
|
94
83
|
# @param highline [HighLine]
|
95
84
|
# @param options [Hash]
|
96
|
-
def get_line(question, highline
|
85
|
+
def get_line(question, highline)
|
97
86
|
raw_answer =
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
87
|
+
if question.readline
|
88
|
+
get_line_with_readline(question, highline)
|
89
|
+
else
|
90
|
+
get_line_default(highline)
|
91
|
+
end
|
103
92
|
|
104
93
|
question.format_answer(raw_answer)
|
105
94
|
end
|
106
95
|
|
107
96
|
# Get one line using #readline_read
|
108
97
|
# @param (see #get_line)
|
109
|
-
def get_line_with_readline(question, highline
|
110
|
-
require "readline"
|
98
|
+
def get_line_with_readline(question, highline)
|
99
|
+
require "readline" # load only if needed
|
111
100
|
|
112
101
|
question_string = highline.render_statement(question)
|
113
102
|
|
114
103
|
raw_answer = readline_read(question_string, question)
|
115
104
|
|
116
|
-
if !raw_answer
|
105
|
+
if !raw_answer && highline.track_eof?
|
117
106
|
raise EOFError, "The input stream is exhausted."
|
118
107
|
end
|
119
108
|
|
@@ -140,7 +129,7 @@ class HighLine
|
|
140
129
|
Readline.readline(prompt, true)
|
141
130
|
end
|
142
131
|
|
143
|
-
$VERBOSE
|
132
|
+
$VERBOSE = old_verbose
|
144
133
|
|
145
134
|
raw_answer
|
146
135
|
end
|
@@ -148,8 +137,8 @@ class HighLine
|
|
148
137
|
# Get one line from terminal using default #gets method.
|
149
138
|
# @param highline (see #get_line)
|
150
139
|
def get_line_default(highline)
|
151
|
-
raise EOFError, "The input stream is exhausted." if highline.track_eof?
|
152
|
-
|
140
|
+
raise EOFError, "The input stream is exhausted." if highline.track_eof? &&
|
141
|
+
highline.input.eof?
|
153
142
|
highline.input.gets
|
154
143
|
end
|
155
144
|
|
@@ -157,12 +146,12 @@ class HighLine
|
|
157
146
|
|
158
147
|
# Running on JRuby?
|
159
148
|
def jruby?
|
160
|
-
defined?(RUBY_ENGINE) && RUBY_ENGINE ==
|
149
|
+
defined?(RUBY_ENGINE) && RUBY_ENGINE == "jruby"
|
161
150
|
end
|
162
151
|
|
163
152
|
# Running on Rubinius?
|
164
153
|
def rubinius?
|
165
|
-
defined?(RUBY_ENGINE) && RUBY_ENGINE ==
|
154
|
+
defined?(RUBY_ENGINE) && RUBY_ENGINE == "rbx"
|
166
155
|
end
|
167
156
|
|
168
157
|
# Running on Windows?
|
@@ -190,7 +179,11 @@ class HighLine
|
|
190
179
|
|
191
180
|
# Saves terminal state using shell stty command.
|
192
181
|
def save_stty
|
193
|
-
@stty_save =
|
182
|
+
@stty_save = begin
|
183
|
+
`stty -g`.chomp
|
184
|
+
rescue StandardError
|
185
|
+
nil
|
186
|
+
end
|
194
187
|
end
|
195
188
|
|
196
189
|
# Restores terminal state using shell stty command.
|
@@ -3,9 +3,10 @@
|
|
3
3
|
class HighLine
|
4
4
|
class Terminal
|
5
5
|
# NCurses HighLine::Terminal
|
6
|
-
# @note Code migrated +UNTESTED+ from the old code base to the new
|
6
|
+
# @note Code migrated +UNTESTED+ from the old code base to the new
|
7
|
+
# terminal api.
|
7
8
|
class NCurses < Terminal
|
8
|
-
require
|
9
|
+
require "ffi-ncurses"
|
9
10
|
|
10
11
|
# (see Terminal#raw_no_echo_mode)
|
11
12
|
def raw_no_echo_mode
|
@@ -34,4 +35,4 @@ class HighLine
|
|
34
35
|
end
|
35
36
|
end
|
36
37
|
end
|
37
|
-
end
|
38
|
+
end
|
@@ -5,25 +5,28 @@ class HighLine
|
|
5
5
|
# HighLine::Terminal option that uses external "stty" program
|
6
6
|
# to control terminal options.
|
7
7
|
class UnixStty < Terminal
|
8
|
-
|
9
8
|
# A Unix savvy method using stty to fetch the console columns, and rows.
|
10
9
|
# ... stty does not work in JRuby
|
11
10
|
# @return (see Terminal#terminal_size)
|
12
11
|
def terminal_size
|
13
12
|
begin
|
14
13
|
require "io/console"
|
15
|
-
winsize =
|
14
|
+
winsize = begin
|
15
|
+
IO.console.winsize.reverse
|
16
|
+
rescue NoMethodError
|
17
|
+
nil
|
18
|
+
end
|
16
19
|
return winsize if winsize
|
17
20
|
rescue LoadError
|
18
21
|
end
|
19
22
|
|
20
|
-
if /solaris/ =~ RUBY_PLATFORM
|
21
|
-
|
22
|
-
[
|
23
|
+
if /solaris/ =~ RUBY_PLATFORM &&
|
24
|
+
`stty` =~ /\brows = (\d+).*\bcolumns = (\d+)/
|
25
|
+
[Regexp.last_match(2), Regexp.last_match(1)].map(&:to_i)
|
23
26
|
elsif `stty size` =~ /^(\d+)\s(\d+)$/
|
24
|
-
[
|
27
|
+
[Regexp.last_match(2).to_i, Regexp.last_match(1).to_i]
|
25
28
|
else
|
26
|
-
[
|
29
|
+
[80, 24]
|
27
30
|
end
|
28
31
|
end
|
29
32
|
|
@@ -40,9 +43,9 @@ class HighLine
|
|
40
43
|
end
|
41
44
|
|
42
45
|
# (see Terminal#get_character)
|
43
|
-
def get_character(
|
46
|
+
def get_character(input = STDIN)
|
44
47
|
input.getc
|
45
48
|
end
|
46
49
|
end
|
47
50
|
end
|
48
|
-
end
|
51
|
+
end
|
data/lib/highline/version.rb
CHANGED
data/lib/highline/wrapper.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
|
3
|
-
|
3
|
+
require "English"
|
4
4
|
|
5
|
+
class HighLine
|
5
6
|
# A simple Wrapper module that is aware of ANSI escape codes.
|
6
7
|
# It compensates for the ANSI escape codes so it works on the
|
7
8
|
# actual (visual) line length.
|
8
9
|
module Wrapper
|
9
|
-
|
10
10
|
#
|
11
11
|
# Wrap a sequence of _lines_ at _wrap_at_ characters per line. Existing
|
12
12
|
# newlines will not be affected by this process, but additional newlines
|
@@ -18,24 +18,25 @@ class HighLine
|
|
18
18
|
return text unless wrap_at
|
19
19
|
wrap_at = Integer(wrap_at)
|
20
20
|
|
21
|
-
wrapped = [
|
21
|
+
wrapped = []
|
22
22
|
text.each_line do |line|
|
23
23
|
# take into account color escape sequences when wrapping
|
24
|
-
wrap_at
|
24
|
+
wrap_at += (line.length - actual_length(line))
|
25
25
|
while line =~ /([^\n]{#{wrap_at + 1},})/
|
26
|
-
search =
|
27
|
-
replace =
|
28
|
-
|
26
|
+
search = Regexp.last_match(1).dup
|
27
|
+
replace = Regexp.last_match(1).dup
|
28
|
+
index = replace.rindex(" ", wrap_at)
|
29
|
+
if index
|
29
30
|
replace[index, 1] = "\n"
|
30
31
|
replace.sub!(/\n[ \t]+/, "\n")
|
31
32
|
line.sub!(search, replace)
|
32
33
|
else
|
33
|
-
line[
|
34
|
+
line[$LAST_MATCH_INFO.begin(1) + wrap_at, 0] = "\n"
|
34
35
|
end
|
35
36
|
end
|
36
37
|
wrapped << line
|
37
38
|
end
|
38
|
-
|
39
|
+
wrapped.join
|
39
40
|
end
|
40
41
|
|
41
42
|
#
|
@@ -45,8 +46,8 @@ class HighLine
|
|
45
46
|
# @param string_with_escapes [String] any ANSI colored String
|
46
47
|
# @return [Integer] length based on the visual size of the String
|
47
48
|
# (without the escape codes)
|
48
|
-
def self.actual_length(
|
49
|
+
def self.actual_length(string_with_escapes)
|
49
50
|
string_with_escapes.to_s.gsub(/\e\[\d{1,2}m/, "").length
|
50
51
|
end
|
51
52
|
end
|
52
|
-
end
|
53
|
+
end
|
metadata
CHANGED
@@ -1,17 +1,45 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: highline
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.0.pre.develop.
|
4
|
+
version: 2.0.0.pre.develop.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Edward Gray II
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-09-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: minitest
|
15
43
|
requirement: !ruby/object:Gem::Requirement
|
16
44
|
requirements:
|
17
45
|
- - ">="
|
@@ -96,27 +124,6 @@ files:
|
|
96
124
|
- site/highline.css
|
97
125
|
- site/images/logo.png
|
98
126
|
- site/index.html
|
99
|
-
- test/acceptance/acceptance.rb
|
100
|
-
- test/acceptance/acceptance_test.rb
|
101
|
-
- test/acceptance/at_color_output_using_erb_templates.rb
|
102
|
-
- test/acceptance/at_echo_false.rb
|
103
|
-
- test/acceptance/at_readline.rb
|
104
|
-
- test/io_console_compatible.rb
|
105
|
-
- test/string_methods.rb
|
106
|
-
- test/test_answer_converter.rb
|
107
|
-
- test/test_color_scheme.rb
|
108
|
-
- test/test_helper.rb
|
109
|
-
- test/test_highline.rb
|
110
|
-
- test/test_import.rb
|
111
|
-
- test/test_list.rb
|
112
|
-
- test/test_menu.rb
|
113
|
-
- test/test_paginator.rb
|
114
|
-
- test/test_question_asker.rb
|
115
|
-
- test/test_simulator.rb
|
116
|
-
- test/test_string_extension.rb
|
117
|
-
- test/test_string_highline.rb
|
118
|
-
- test/test_style.rb
|
119
|
-
- test/test_wrapper.rb
|
120
127
|
homepage: https://github.com/JEG2/highline
|
121
128
|
licenses:
|
122
129
|
- Ruby
|
@@ -136,25 +143,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
136
143
|
- !ruby/object:Gem::Version
|
137
144
|
version: 1.3.1
|
138
145
|
requirements: []
|
139
|
-
rubyforge_project:
|
140
|
-
rubygems_version: 2.6.
|
146
|
+
rubyforge_project:
|
147
|
+
rubygems_version: 2.6.13
|
141
148
|
signing_key:
|
142
149
|
specification_version: 4
|
143
150
|
summary: HighLine is a high-level command-line IO library.
|
144
|
-
test_files:
|
145
|
-
- test/io_console_compatible.rb
|
146
|
-
- test/string_methods.rb
|
147
|
-
- test/test_answer_converter.rb
|
148
|
-
- test/test_color_scheme.rb
|
149
|
-
- test/test_helper.rb
|
150
|
-
- test/test_highline.rb
|
151
|
-
- test/test_import.rb
|
152
|
-
- test/test_list.rb
|
153
|
-
- test/test_menu.rb
|
154
|
-
- test/test_paginator.rb
|
155
|
-
- test/test_question_asker.rb
|
156
|
-
- test/test_simulator.rb
|
157
|
-
- test/test_string_extension.rb
|
158
|
-
- test/test_string_highline.rb
|
159
|
-
- test/test_style.rb
|
160
|
-
- test/test_wrapper.rb
|
151
|
+
test_files: []
|
@@ -1,62 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# coding: utf-8
|
3
|
-
|
4
|
-
current_dir = File.dirname(File.expand_path(__FILE__))
|
5
|
-
|
6
|
-
# All acceptance test files begins with 'at_'
|
7
|
-
acceptance_test_files = Dir["#{current_dir}/at_*"]
|
8
|
-
|
9
|
-
# Load each acceptance test file making
|
10
|
-
# all tests to be run
|
11
|
-
acceptance_test_files.each { |file| load file }
|
12
|
-
|
13
|
-
# Print a report
|
14
|
-
|
15
|
-
report = <<EOF
|
16
|
-
|
17
|
-
===
|
18
|
-
Well done!
|
19
|
-
|
20
|
-
Below you have a report with all the answers you gave.
|
21
|
-
It has also some environment information to help us debugging.
|
22
|
-
|
23
|
-
If any of the tests have not passed on your environment,
|
24
|
-
please copy/past the text bellow and send to us.
|
25
|
-
|
26
|
-
If you are familiar with GitHub you can report the failing test
|
27
|
-
as a GitHub issue at https://github.com/JEG2/highline/issues.
|
28
|
-
If possible, always check if your issue is already reported
|
29
|
-
by someone else. If so, just report that you are also affected
|
30
|
-
on the same alredy open issued.
|
31
|
-
|
32
|
-
If you are more confortable with e-mail, you could send it to
|
33
|
-
james@grayproductions.net
|
34
|
-
|
35
|
-
=== HighLine Acceptance Tests Report
|
36
|
-
Date: #{Time.now.utc}
|
37
|
-
HighLine::VERSION: #{HighLine::VERSION}
|
38
|
-
Terminal: #{$terminal.terminal.class}
|
39
|
-
RUBY_DESCRIPTION: #{RUBY_DESCRIPTION rescue 'not available'}
|
40
|
-
Readline::VERSION: #{Readline::VERSION rescue 'not availabe'}
|
41
|
-
ENV['SHELL']: #{ENV['SHELL']}
|
42
|
-
ENV['TERM']: #{ENV['TERM']}
|
43
|
-
ENV['TERM_PROGRAM']: #{ENV['TERM_PROGRAM']}
|
44
|
-
|
45
|
-
Answers:
|
46
|
-
#{HighLine::AcceptanceTest.answers_for_report}
|
47
|
-
EOF
|
48
|
-
|
49
|
-
puts report
|
50
|
-
|
51
|
-
timestamp = Time.now.strftime('%Y%m%d%H%M%S')
|
52
|
-
filename = "highlinetests-#{timestamp}.log"
|
53
|
-
|
54
|
-
File.open "#{filename}", 'w+' do |f|
|
55
|
-
f.puts report
|
56
|
-
end
|
57
|
-
|
58
|
-
puts
|
59
|
-
puts "You can also see the above information in"
|
60
|
-
puts "a timestamped file named #{filename}"
|
61
|
-
puts "at the current directory."
|
62
|
-
puts
|