highline 1.2.5 → 1.2.6
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.
- data/CHANGELOG +8 -0
- data/README +1 -1
- data/examples/color_scheme.rb +32 -0
- data/examples/overwrite.rb +19 -0
- data/lib/highline.rb +43 -10
- data/lib/highline/color_scheme.rb +120 -0
- data/lib/highline/import.rb +4 -4
- data/lib/highline/question.rb +11 -3
- data/test/tc_color_scheme.rb +56 -0
- data/test/ts_all.rb +1 -0
- metadata +7 -3
data/CHANGELOG
CHANGED
@@ -2,6 +2,14 @@
|
|
2
2
|
|
3
3
|
Below is a complete listing of changes for each revision of HighLine.
|
4
4
|
|
5
|
+
== 1.2.6
|
6
|
+
|
7
|
+
Patch by Jeremy Hinegardner:
|
8
|
+
|
9
|
+
* Added ColorScheme support.
|
10
|
+
* Added HighLine::Question.overwrite mode.
|
11
|
+
* Various documentation fixes.
|
12
|
+
|
5
13
|
== 1.2.5
|
6
14
|
|
7
15
|
* Really fixed the bug I tried to fix in 1.2.4.
|
data/README
CHANGED
@@ -60,4 +60,4 @@ See the INSTALL file for instructions.
|
|
60
60
|
== Questions and/or Comments
|
61
61
|
|
62
62
|
Feel free to email {James Edward Gray II}[mailto:james@grayproductions.net] or
|
63
|
-
{
|
63
|
+
{Gregory Brown}[mailto:gregory.t.brown@gmail.com] with any questions.
|
@@ -0,0 +1,32 @@
|
|
1
|
+
#!/usr/bin/env ruby -w
|
2
|
+
|
3
|
+
# color_scheme.rb
|
4
|
+
#
|
5
|
+
# Created by Jeremy Hinegardner on 2007-01-24
|
6
|
+
# Copyright 2007 Jeremy Hinegardner. All rights reserved
|
7
|
+
|
8
|
+
require 'rubygems'
|
9
|
+
require 'highline/import'
|
10
|
+
|
11
|
+
# Create a color scheme, naming color patterns with symbol names.
|
12
|
+
ft = HighLine::ColorScheme.new do |cs|
|
13
|
+
cs[:headline] = [ :bold, :yellow, :on_black ]
|
14
|
+
cs[:horizontal_line] = [ :bold, :white, :on_blue]
|
15
|
+
cs[:even_row] = [ :green ]
|
16
|
+
cs[:odd_row] = [ :magenta ]
|
17
|
+
end
|
18
|
+
|
19
|
+
# Assign that color scheme to HighLine...
|
20
|
+
HighLine.color_scheme = ft
|
21
|
+
|
22
|
+
# ...and use it.
|
23
|
+
say("<%= color('Headline', :headline) %>")
|
24
|
+
say("<%= color('-'*20, :horizontal_line) %>")
|
25
|
+
|
26
|
+
# Setup a toggle for rows.
|
27
|
+
i = true
|
28
|
+
("A".."D").each do |row|
|
29
|
+
row_color = i ? :even_row : :odd_row
|
30
|
+
say("<%= color('#{row}', '#{row_color}') %>")
|
31
|
+
i = !i
|
32
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#!/usr/local/bin/ruby -w
|
2
|
+
|
3
|
+
# overwrite.rb
|
4
|
+
#
|
5
|
+
# Created by Jeremy Hinegardner on 2007-01-24
|
6
|
+
# Copyright 2007 Jeremy Hinegardner. All rights reserved
|
7
|
+
|
8
|
+
require 'rubygems'
|
9
|
+
require 'highline/import'
|
10
|
+
|
11
|
+
prompt = "here is your password:"
|
12
|
+
ask(
|
13
|
+
"#{prompt} <%= color('mypassword', RED, BOLD) %> (Press Any Key to blank) "
|
14
|
+
) do |q|
|
15
|
+
q.overwrite = true
|
16
|
+
q.echo = false # overwrite works best when echo is false.
|
17
|
+
q.character = true # if this is set to :getc then overwrite does not work
|
18
|
+
end
|
19
|
+
say("<%= color('Look! blanked out!', GREEN) %>")
|
data/lib/highline.rb
CHANGED
@@ -12,6 +12,7 @@
|
|
12
12
|
require "highline/system_extensions"
|
13
13
|
require "highline/question"
|
14
14
|
require "highline/menu"
|
15
|
+
require "highline/color_scheme"
|
15
16
|
require "erb"
|
16
17
|
require "optparse"
|
17
18
|
require "stringio"
|
@@ -28,7 +29,7 @@ require "abbrev"
|
|
28
29
|
#
|
29
30
|
class HighLine
|
30
31
|
# The version of the installed library.
|
31
|
-
VERSION = "1.2.
|
32
|
+
VERSION = "1.2.6".freeze
|
32
33
|
|
33
34
|
# An internal HighLine error. User code does not need to trap this.
|
34
35
|
class QuestionError < StandardError
|
@@ -48,6 +49,24 @@ class HighLine
|
|
48
49
|
@@use_color
|
49
50
|
end
|
50
51
|
|
52
|
+
# The setting used to control color schemes.
|
53
|
+
@@color_scheme = nil
|
54
|
+
|
55
|
+
# Pass ColorScheme to _setting_ to turn set a HighLine color scheme.
|
56
|
+
def self.color_scheme=( setting )
|
57
|
+
@@color_scheme = setting
|
58
|
+
end
|
59
|
+
|
60
|
+
# Returns the current color scheme.
|
61
|
+
def self.color_scheme
|
62
|
+
@@color_scheme
|
63
|
+
end
|
64
|
+
|
65
|
+
# Returns +true+ if HighLine is currently using a color scheme.
|
66
|
+
def self.using_color_scheme?
|
67
|
+
not @@color_scheme.nil?
|
68
|
+
end
|
69
|
+
|
51
70
|
#
|
52
71
|
# Embed in a String to clear all previous ANSI sequences. This *MUST* be
|
53
72
|
# done before the program exits!
|
@@ -55,6 +74,8 @@ class HighLine
|
|
55
74
|
CLEAR = "\e[0m"
|
56
75
|
# An alias for CLEAR.
|
57
76
|
RESET = CLEAR
|
77
|
+
# Erase the current line of terminal output.
|
78
|
+
ERASE_LINE = "\e[K"
|
58
79
|
# The start of an ANSI bold sequence.
|
59
80
|
BOLD = "\e[1m"
|
60
81
|
# The start of an ANSI dark sequence. (Terminal support uncommon.)
|
@@ -287,13 +308,15 @@ class HighLine
|
|
287
308
|
return string unless self.class.use_color?
|
288
309
|
|
289
310
|
colors.map! do |c|
|
290
|
-
if
|
311
|
+
if self.class.using_color_scheme? and self.class.color_scheme.include? c
|
312
|
+
self.class.color_scheme[c]
|
313
|
+
elsif c.is_a? Symbol
|
291
314
|
self.class.const_get(c.to_s.upcase)
|
292
315
|
else
|
293
316
|
c
|
294
317
|
end
|
295
318
|
end
|
296
|
-
"#{colors.join}#{string}#{CLEAR}"
|
319
|
+
"#{colors.flatten.join}#{string}#{CLEAR}"
|
297
320
|
end
|
298
321
|
|
299
322
|
#
|
@@ -584,7 +607,12 @@ class HighLine
|
|
584
607
|
(@question.limit and line.size == @question.limit)
|
585
608
|
@output.print(@question.echo) if @question.echo != false
|
586
609
|
end
|
587
|
-
|
610
|
+
if @question.overwrite
|
611
|
+
@output.print("\r#{ERASE_LINE}")
|
612
|
+
@output.flush
|
613
|
+
else
|
614
|
+
say("\n")
|
615
|
+
end
|
588
616
|
ensure
|
589
617
|
restore_mode if stty
|
590
618
|
end
|
@@ -595,14 +623,19 @@ class HighLine
|
|
595
623
|
@question.change_case(@input.getc.chr)
|
596
624
|
else
|
597
625
|
response = get_character(@input).chr
|
598
|
-
|
599
|
-
|
600
|
-
|
601
|
-
@question.echo
|
626
|
+
if @question.overwrite
|
627
|
+
@output.print("\r#{ERASE_LINE}")
|
628
|
+
@output.flush
|
602
629
|
else
|
603
|
-
|
630
|
+
echo = if @question.echo == true
|
631
|
+
response
|
632
|
+
elsif @question.echo != false
|
633
|
+
@question.echo
|
634
|
+
else
|
635
|
+
""
|
636
|
+
end
|
637
|
+
say("#{echo}\n")
|
604
638
|
end
|
605
|
-
say("#{echo}\n")
|
606
639
|
@question.change_case(response)
|
607
640
|
end
|
608
641
|
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
#!/usr/local/bin/ruby -w
|
2
|
+
|
3
|
+
# color_scheme.rb
|
4
|
+
#
|
5
|
+
# Created by Jeremy Hinegardner on 2007-01-24
|
6
|
+
# Copyright 2007. All rights reserved
|
7
|
+
#
|
8
|
+
# This is Free Software. See LICENSE and COPYING for details
|
9
|
+
|
10
|
+
require 'highline'
|
11
|
+
|
12
|
+
class HighLine
|
13
|
+
#
|
14
|
+
# ColorScheme objects encapsulate a named set of colors to be used in the
|
15
|
+
# HighLine.colors() method call. For example, by applying a ColorScheme that
|
16
|
+
# has a <tt>:warning</tt> color then the following could be used:
|
17
|
+
#
|
18
|
+
# colors("This is a warning", :warning)
|
19
|
+
#
|
20
|
+
# A ColorScheme contains named sets of HighLine color constants.
|
21
|
+
#
|
22
|
+
# Example: Instantiating a color scheme, applying it to HighLine,
|
23
|
+
# and using it:
|
24
|
+
#
|
25
|
+
# ft = HighLine::ColorScheme.new do |cs|
|
26
|
+
# cs[:headline] = [ :bold, :yellow, :on_black ]
|
27
|
+
# cs[:horizontal_line] = [ :bold, :white ]
|
28
|
+
# cs[:even_row] = [ :green ]
|
29
|
+
# cs[:odd_row] = [ :magenta ]
|
30
|
+
# end
|
31
|
+
#
|
32
|
+
# HighLine.color_scheme = ft
|
33
|
+
# say("<%= color('Headline', :headline) %>")
|
34
|
+
# say("<%= color('-'*20, :horizontal_line) %>")
|
35
|
+
# i = true
|
36
|
+
# ("A".."D").each do |row|
|
37
|
+
# if i then
|
38
|
+
# say("<%= color('#{row}', :even_row ) %>")
|
39
|
+
# else
|
40
|
+
# say("<%= color('#{row}', :odd_row) %>")
|
41
|
+
# end
|
42
|
+
# i = !i
|
43
|
+
# end
|
44
|
+
#
|
45
|
+
#
|
46
|
+
class ColorScheme
|
47
|
+
#
|
48
|
+
# Create an instance of HighLine::ColorScheme. The customization can
|
49
|
+
# happen as a passed in Hash or via the yielded block. Key's are
|
50
|
+
# converted to <tt>:symbols</tt> and values are converted to HighLine
|
51
|
+
# constants.
|
52
|
+
#
|
53
|
+
def initialize( h = nil )
|
54
|
+
@scheme = Hash.new
|
55
|
+
load_from_hash(h) unless h.nil?
|
56
|
+
yield self if block_given?
|
57
|
+
end
|
58
|
+
|
59
|
+
# Load multiple colors from key/value pairs.
|
60
|
+
def load_from_hash( h )
|
61
|
+
h.each_pair do |color_tag, constants|
|
62
|
+
self[color_tag] = constants
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# Does this color scheme include the given tag name?
|
67
|
+
def include?( color_tag )
|
68
|
+
@scheme.keys.include?(to_symbol(color_tag))
|
69
|
+
end
|
70
|
+
|
71
|
+
# Allow the scheme to be accessed like a Hash.
|
72
|
+
def []( color_tag )
|
73
|
+
@scheme[to_symbol(color_tag)]
|
74
|
+
end
|
75
|
+
|
76
|
+
# Allow the scheme to be set like a Hash.
|
77
|
+
def []=( color_tag, constants )
|
78
|
+
@scheme[to_symbol(color_tag)] = constants.map { |c| to_constant(c) }
|
79
|
+
end
|
80
|
+
|
81
|
+
private
|
82
|
+
|
83
|
+
# Return a normalized representation of a color name.
|
84
|
+
def to_symbol( t )
|
85
|
+
t.to_s.downcase
|
86
|
+
end
|
87
|
+
|
88
|
+
# Return a normalized representation of a color setting.
|
89
|
+
def to_constant( v )
|
90
|
+
v = v.to_s if v.is_a?(Symbol)
|
91
|
+
if v.is_a?(String) then
|
92
|
+
HighLine.const_get(v.upcase)
|
93
|
+
else
|
94
|
+
v
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
# A sample ColorScheme.
|
100
|
+
class SampleColorScheme < ColorScheme
|
101
|
+
#
|
102
|
+
# Builds the sample scheme with settings for <tt>:critical</tt>,
|
103
|
+
# <tt>:error</tt>, <tt>:warning</tt>, <tt>:notice</tt>, <tt>:info</tt>,
|
104
|
+
# <tt>:debug</tt>, <tt>:row_even</tt>, and <tt>:row_odd</tt> colors.
|
105
|
+
#
|
106
|
+
def initialize( h = nil )
|
107
|
+
scheme = {
|
108
|
+
:critical => [ :yellow, :on_red ],
|
109
|
+
:error => [ :bold, :red ],
|
110
|
+
:warning => [ :bold, :yellow ],
|
111
|
+
:notice => [ :bold, :magenta ],
|
112
|
+
:info => [ :bold, :cyan ],
|
113
|
+
:debug => [ :bold, :green ],
|
114
|
+
:row_even => [ :cyan ],
|
115
|
+
:row_odd => [ :magenta ]
|
116
|
+
}
|
117
|
+
super(scheme)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
data/lib/highline/import.rb
CHANGED
@@ -13,13 +13,13 @@ require "forwardable"
|
|
13
13
|
$terminal = HighLine.new
|
14
14
|
|
15
15
|
#
|
16
|
-
# <tt>require "highline/import"</tt> adds
|
16
|
+
# <tt>require "highline/import"</tt> adds shortcut methods to Kernel, making
|
17
17
|
# agree(), ask(), choose() and say() globally available. This is handy for
|
18
18
|
# quick and dirty input and output. These methods use the HighLine object in
|
19
19
|
# the global variable <tt>$terminal</tt>, which is initialized to used
|
20
20
|
# <tt>$stdin</tt> and <tt>$stdout</tt> (you are free to change this).
|
21
|
-
# Otherwise, these methods
|
22
|
-
# class for detailed
|
21
|
+
# Otherwise, these methods are identical to their HighLine counterparts, see that
|
22
|
+
# class for detailed explanations.
|
23
23
|
#
|
24
24
|
module Kernel
|
25
25
|
extend Forwardable
|
@@ -40,4 +40,4 @@ class Object
|
|
40
40
|
details.call(question) unless details.nil?
|
41
41
|
end
|
42
42
|
end
|
43
|
-
end
|
43
|
+
end
|
data/lib/highline/question.rb
CHANGED
@@ -53,6 +53,7 @@ class HighLine
|
|
53
53
|
@directory = Pathname.new(File.expand_path(File.dirname($0)))
|
54
54
|
@glob = "*"
|
55
55
|
@responses = Hash.new
|
56
|
+
@overwrite = false
|
56
57
|
|
57
58
|
# allow block to override settings
|
58
59
|
yield self if block_given?
|
@@ -71,8 +72,8 @@ class HighLine
|
|
71
72
|
# character reader *ONLY* supports STDIN on Windows and Unix.) Can also
|
72
73
|
# be set to <tt>:getc</tt> to use that method on the input stream.
|
73
74
|
#
|
74
|
-
# *WARNING*: The _echo_
|
75
|
-
#
|
75
|
+
# *WARNING*: The _echo_ and _overwrite_ attributes for a question are
|
76
|
+
# ignored when using the <tt>:getc</tt> method.
|
76
77
|
#
|
77
78
|
attr_accessor :character
|
78
79
|
#
|
@@ -193,7 +194,14 @@ class HighLine
|
|
193
194
|
# validation checks fail.
|
194
195
|
#
|
195
196
|
attr_reader :responses
|
196
|
-
|
197
|
+
#
|
198
|
+
# When set to +true+ the question is asked, but output does not progress to
|
199
|
+
# the next line. The Cursor is moved back to the beginning of the question
|
200
|
+
# line and it is cleared so that all the contents of the line disappear from
|
201
|
+
# the screen.
|
202
|
+
#
|
203
|
+
attr_accessor :overwrite
|
204
|
+
|
197
205
|
#
|
198
206
|
# Returns the provided _answer_string_ or the default answer for this
|
199
207
|
# Question if a default was set and the answer is empty.
|
@@ -0,0 +1,56 @@
|
|
1
|
+
#!/usr/local/bin/ruby -w
|
2
|
+
|
3
|
+
# tc_color_scheme.rb
|
4
|
+
#
|
5
|
+
# Created by Jeremy Hinegardner on 2007-01-24.
|
6
|
+
# Copyright 2007 Jeremy Hinegardner. All rights reserved.
|
7
|
+
#
|
8
|
+
# This is Free Software. See LICENSE and COPYING for details.
|
9
|
+
|
10
|
+
require "test/unit"
|
11
|
+
|
12
|
+
require "highline"
|
13
|
+
require "stringio"
|
14
|
+
|
15
|
+
class TestColorScheme < Test::Unit::TestCase
|
16
|
+
def setup
|
17
|
+
@input = StringIO.new
|
18
|
+
@output = StringIO.new
|
19
|
+
@terminal = HighLine.new(@input, @output)
|
20
|
+
|
21
|
+
@old_color_scheme = HighLine.color_scheme
|
22
|
+
end
|
23
|
+
|
24
|
+
def teardown
|
25
|
+
HighLine.color_scheme = @old_color_scheme
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_using_color_scheme
|
29
|
+
assert_equal(false,HighLine.using_color_scheme?)
|
30
|
+
|
31
|
+
HighLine.color_scheme = HighLine::ColorScheme.new
|
32
|
+
assert_equal(true,HighLine.using_color_scheme?)
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_scheme
|
36
|
+
HighLine.color_scheme = HighLine::SampleColorScheme.new
|
37
|
+
|
38
|
+
@terminal.say("This should be <%= color('warning yellow', :warning) %>.")
|
39
|
+
assert_equal("This should be \e[1m\e[33mwarning yellow\e[0m.\n",@output.string)
|
40
|
+
@output.rewind
|
41
|
+
|
42
|
+
@terminal.say("This should be <%= color('warning yellow', 'warning') %>.")
|
43
|
+
assert_equal("This should be \e[1m\e[33mwarning yellow\e[0m.\n",@output.string)
|
44
|
+
@output.rewind
|
45
|
+
|
46
|
+
@terminal.say("This should be <%= color('warning yellow', 'WarNing') %>.")
|
47
|
+
assert_equal("This should be \e[1m\e[33mwarning yellow\e[0m.\n",@output.string)
|
48
|
+
@output.rewind
|
49
|
+
|
50
|
+
# turn it back off, should raise an exception
|
51
|
+
HighLine.color_scheme = @old_color_scheme
|
52
|
+
assert_raises(NameError) {
|
53
|
+
@terminal.say("This should be <%= color('nothing at all', :error) %>.")
|
54
|
+
}
|
55
|
+
end
|
56
|
+
end
|
data/test/ts_all.rb
CHANGED
metadata
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.
|
2
|
+
rubygems_version: 0.9.1
|
3
3
|
specification_version: 1
|
4
4
|
name: highline
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 1.2.
|
7
|
-
date: 2007-01-
|
6
|
+
version: 1.2.6
|
7
|
+
date: 2007-01-25 00:00:00 -06:00
|
8
8
|
summary: HighLine is a high-level command-line IO library.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -32,16 +32,20 @@ files:
|
|
32
32
|
- examples/ansi_colors.rb
|
33
33
|
- examples/asking_for_arrays.rb
|
34
34
|
- examples/basic_usage.rb
|
35
|
+
- examples/color_scheme.rb
|
35
36
|
- examples/menus.rb
|
37
|
+
- examples/overwrite.rb
|
36
38
|
- examples/page_and_wrap.rb
|
37
39
|
- examples/password.rb
|
38
40
|
- examples/trapping_eof.rb
|
39
41
|
- examples/using_readline.rb
|
40
42
|
- lib/highline.rb
|
43
|
+
- lib/highline/color_scheme.rb
|
41
44
|
- lib/highline/import.rb
|
42
45
|
- lib/highline/menu.rb
|
43
46
|
- lib/highline/question.rb
|
44
47
|
- lib/highline/system_extensions.rb
|
48
|
+
- test/tc_color_scheme.rb
|
45
49
|
- test/tc_highline.rb
|
46
50
|
- test/tc_import.rb
|
47
51
|
- test/tc_menu.rb
|