rainbow 1.99.0 → 1.99.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +14 -0
- data/.travis.yml +0 -1
- data/Changelog.md +59 -0
- data/Gemfile +2 -2
- data/Guardfile +1 -1
- data/README.markdown +91 -35
- data/lib/rainbow.rb +18 -19
- data/lib/rainbow/color.rb +28 -22
- data/lib/rainbow/ext/string.rb +52 -0
- data/lib/rainbow/global.rb +21 -0
- data/lib/rainbow/legacy.rb +2 -1
- data/lib/rainbow/null_presenter.rb +30 -0
- data/lib/rainbow/presenter.rb +113 -0
- data/lib/rainbow/version.rb +1 -1
- data/lib/rainbow/wrapper.rb +12 -66
- data/rainbow.gemspec +9 -9
- data/spec/integration/instance_spec.rb +35 -0
- data/spec/integration/rainbow_spec.rb +13 -6
- data/spec/integration/string_spec.rb +27 -1
- data/spec/spec_helper.rb +1 -5
- data/spec/support/presenter_shared_examples.rb +9 -0
- data/spec/unit/null_presenter_spec.rb +93 -0
- data/spec/unit/presenter_spec.rb +168 -0
- data/spec/unit/wrapper_spec.rb +11 -132
- metadata +17 -6
- data/Changelog +0 -3
- data/lib/rainbow/core.rb +0 -16
- data/lib/rainbow/string.rb +0 -50
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'rainbow/wrapper'
|
2
|
+
|
3
|
+
module Rainbow
|
4
|
+
|
5
|
+
def self.global
|
6
|
+
@global ||= Wrapper.new
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.enabled
|
10
|
+
global.enabled
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.enabled=(value)
|
14
|
+
global.enabled = value
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
def Rainbow(string)
|
20
|
+
Rainbow.global.wrap(string.to_s)
|
21
|
+
end
|
data/lib/rainbow/legacy.rb
CHANGED
@@ -2,7 +2,8 @@ module Sickill
|
|
2
2
|
module Rainbow
|
3
3
|
|
4
4
|
def self.enabled=(value)
|
5
|
-
STDERR.puts
|
5
|
+
STDERR.puts("Rainbow gem notice: Sickill::Rainbow.enabled= is " \
|
6
|
+
"deprecated, use Rainbow.enabled= instead.")
|
6
7
|
::Rainbow.enabled = value
|
7
8
|
end
|
8
9
|
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Rainbow
|
2
|
+
|
3
|
+
class NullPresenter < ::String
|
4
|
+
|
5
|
+
def color(*values); self; end
|
6
|
+
def background(*values); self; end
|
7
|
+
def reset; self; end
|
8
|
+
def bright; self; end
|
9
|
+
def italic; self; end
|
10
|
+
def underline; self; end
|
11
|
+
def blink; self; end
|
12
|
+
def inverse; self; end
|
13
|
+
def hide; self; end
|
14
|
+
|
15
|
+
def black; self; end
|
16
|
+
def red; self; end
|
17
|
+
def green; self; end
|
18
|
+
def yellow; self; end
|
19
|
+
def blue; self; end
|
20
|
+
def magenta; self; end
|
21
|
+
def cyan; self; end
|
22
|
+
def white; self; end
|
23
|
+
|
24
|
+
alias_method :foreground, :color
|
25
|
+
alias_method :fg, :color
|
26
|
+
alias_method :bg, :background
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
require 'rainbow/string_utils'
|
2
|
+
require 'rainbow/color'
|
3
|
+
|
4
|
+
module Rainbow
|
5
|
+
|
6
|
+
class Presenter < ::String
|
7
|
+
|
8
|
+
TERM_EFFECTS = {
|
9
|
+
reset: 0,
|
10
|
+
bright: 1,
|
11
|
+
italic: 3,
|
12
|
+
underline: 4,
|
13
|
+
blink: 5,
|
14
|
+
inverse: 7,
|
15
|
+
hide: 8,
|
16
|
+
}
|
17
|
+
|
18
|
+
# Sets color of this text.
|
19
|
+
def color(*values)
|
20
|
+
wrap_with_sgr(Color.build(:foreground, values).codes)
|
21
|
+
end
|
22
|
+
|
23
|
+
alias_method :foreground, :color
|
24
|
+
alias_method :fg, :color
|
25
|
+
|
26
|
+
# Sets background color of this text.
|
27
|
+
def background(*values)
|
28
|
+
wrap_with_sgr(Color.build(:background, values).codes)
|
29
|
+
end
|
30
|
+
|
31
|
+
alias_method :bg, :background
|
32
|
+
|
33
|
+
# Resets terminal to default colors/backgrounds.
|
34
|
+
#
|
35
|
+
# It shouldn't be needed to use this method because all methods
|
36
|
+
# append terminal reset code to end of string.
|
37
|
+
def reset
|
38
|
+
wrap_with_sgr(TERM_EFFECTS[:reset])
|
39
|
+
end
|
40
|
+
|
41
|
+
# Turns on bright/bold for this text.
|
42
|
+
def bright
|
43
|
+
wrap_with_sgr(TERM_EFFECTS[:bright])
|
44
|
+
end
|
45
|
+
|
46
|
+
# Turns on italic style for this text (not well supported by terminal
|
47
|
+
# emulators).
|
48
|
+
def italic
|
49
|
+
wrap_with_sgr(TERM_EFFECTS[:italic])
|
50
|
+
end
|
51
|
+
|
52
|
+
# Turns on underline decoration for this text.
|
53
|
+
def underline
|
54
|
+
wrap_with_sgr(TERM_EFFECTS[:underline])
|
55
|
+
end
|
56
|
+
|
57
|
+
# Turns on blinking attribute for this text (not well supported by terminal
|
58
|
+
# emulators).
|
59
|
+
def blink
|
60
|
+
wrap_with_sgr(TERM_EFFECTS[:blink])
|
61
|
+
end
|
62
|
+
|
63
|
+
# Inverses current foreground/background colors.
|
64
|
+
def inverse
|
65
|
+
wrap_with_sgr(TERM_EFFECTS[:inverse])
|
66
|
+
end
|
67
|
+
|
68
|
+
# Hides this text (set its color to the same as background).
|
69
|
+
def hide
|
70
|
+
wrap_with_sgr(TERM_EFFECTS[:hide])
|
71
|
+
end
|
72
|
+
|
73
|
+
def black
|
74
|
+
color(:black)
|
75
|
+
end
|
76
|
+
|
77
|
+
def red
|
78
|
+
color(:red)
|
79
|
+
end
|
80
|
+
|
81
|
+
def green
|
82
|
+
color(:green)
|
83
|
+
end
|
84
|
+
|
85
|
+
def yellow
|
86
|
+
color(:yellow)
|
87
|
+
end
|
88
|
+
|
89
|
+
def blue
|
90
|
+
color(:blue)
|
91
|
+
end
|
92
|
+
|
93
|
+
def magenta
|
94
|
+
color(:magenta)
|
95
|
+
end
|
96
|
+
|
97
|
+
def cyan
|
98
|
+
color(:cyan)
|
99
|
+
end
|
100
|
+
|
101
|
+
def white
|
102
|
+
color(:white)
|
103
|
+
end
|
104
|
+
|
105
|
+
private
|
106
|
+
|
107
|
+
def wrap_with_sgr(codes) #:nodoc:
|
108
|
+
self.class.new(StringUtils.wrap_with_sgr(self, [*codes]))
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
data/lib/rainbow/version.rb
CHANGED
data/lib/rainbow/wrapper.rb
CHANGED
@@ -1,76 +1,22 @@
|
|
1
|
-
require 'rainbow/
|
2
|
-
require 'rainbow/
|
3
|
-
require 'rainbow/color'
|
1
|
+
require 'rainbow/presenter'
|
2
|
+
require 'rainbow/null_presenter'
|
4
3
|
|
5
4
|
module Rainbow
|
6
5
|
|
7
|
-
class Wrapper
|
6
|
+
class Wrapper
|
7
|
+
attr_accessor :enabled
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
wrap_with_sgr(Color.build(:foreground, values).codes)
|
9
|
+
def initialize(enabled = true)
|
10
|
+
@enabled = enabled
|
12
11
|
end
|
13
12
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
end
|
21
|
-
|
22
|
-
# Resets terminal to default colors/backgrounds.
|
23
|
-
#
|
24
|
-
# It shouldn't be needed to use this method because all methods
|
25
|
-
# append terminal reset code to end of string.
|
26
|
-
def reset
|
27
|
-
wrap_with_sgr(TERM_EFFECTS[:reset])
|
28
|
-
end
|
29
|
-
|
30
|
-
# Turns on bright/bold for this text.
|
31
|
-
def bright
|
32
|
-
wrap_with_sgr(TERM_EFFECTS[:bright])
|
33
|
-
end
|
34
|
-
|
35
|
-
# Turns on italic style for this text (not well supported by terminal
|
36
|
-
# emulators).
|
37
|
-
def italic
|
38
|
-
wrap_with_sgr(TERM_EFFECTS[:italic])
|
39
|
-
end
|
40
|
-
|
41
|
-
# Turns on underline decoration for this text.
|
42
|
-
def underline
|
43
|
-
wrap_with_sgr(TERM_EFFECTS[:underline])
|
44
|
-
end
|
45
|
-
|
46
|
-
# Turns on blinking attribute for this text (not well supported by terminal
|
47
|
-
# emulators).
|
48
|
-
def blink
|
49
|
-
wrap_with_sgr(TERM_EFFECTS[:blink])
|
13
|
+
def wrap(string)
|
14
|
+
if enabled
|
15
|
+
Rainbow::Presenter.new(string.to_s)
|
16
|
+
else
|
17
|
+
Rainbow::NullPresenter.new(string.to_s)
|
18
|
+
end
|
50
19
|
end
|
51
|
-
|
52
|
-
# Inverses current foreground/background colors.
|
53
|
-
def inverse
|
54
|
-
wrap_with_sgr(TERM_EFFECTS[:inverse])
|
55
|
-
end
|
56
|
-
|
57
|
-
# Hides this text (set its color to the same as background).
|
58
|
-
def hide
|
59
|
-
wrap_with_sgr(TERM_EFFECTS[:hide])
|
60
|
-
end
|
61
|
-
|
62
|
-
private
|
63
|
-
|
64
|
-
def wrap_with_sgr(codes) #:nodoc:
|
65
|
-
return self unless Rainbow.enabled
|
66
|
-
|
67
|
-
self.class.new(StringUtils.wrap_with_sgr(self, [*codes]))
|
68
|
-
end
|
69
|
-
|
70
20
|
end
|
71
21
|
|
72
22
|
end
|
73
|
-
|
74
|
-
def Rainbow(string)
|
75
|
-
Rainbow::Wrapper.new(string.to_s)
|
76
|
-
end
|
data/rainbow.gemspec
CHANGED
@@ -4,14 +4,15 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'rainbow/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name
|
8
|
-
spec.version
|
9
|
-
spec.authors
|
10
|
-
spec.email
|
11
|
-
spec.description
|
12
|
-
spec.summary
|
13
|
-
spec.homepage
|
14
|
-
spec.license
|
7
|
+
spec.name = "rainbow"
|
8
|
+
spec.version = Rainbow::VERSION
|
9
|
+
spec.authors = ["Marcin Kulik"]
|
10
|
+
spec.email = ["m@ku1ik.com"]
|
11
|
+
spec.description = %q{Colorize printed text on ANSI terminals}
|
12
|
+
spec.summary = %q{Colorize printed text on ANSI terminals}
|
13
|
+
spec.homepage = "https://github.com/sickill/rainbow"
|
14
|
+
spec.license = "MIT"
|
15
|
+
spec.required_ruby_version = '>= 1.9.2'
|
15
16
|
|
16
17
|
spec.files = `git ls-files`.split($/)
|
17
18
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
@@ -21,5 +22,4 @@ Gem::Specification.new do |spec|
|
|
21
22
|
spec.add_development_dependency "bundler", "~> 1.3"
|
22
23
|
spec.add_development_dependency "rake"
|
23
24
|
spec.add_development_dependency "rspec"
|
24
|
-
spec.add_development_dependency 'mime-types', '< 2.0.0' if RUBY_VERSION < "1.9.0"
|
25
25
|
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'rainbow'
|
3
|
+
|
4
|
+
describe 'Custom Rainbow instance' do
|
5
|
+
|
6
|
+
it 'inherits enabled state from the global instance' do
|
7
|
+
Rainbow.enabled = :yep
|
8
|
+
expect(Rainbow.new.enabled).to eq(:yep)
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'tracks its own state separately from the global instance' do
|
12
|
+
Rainbow.enabled = :yep
|
13
|
+
rainbow = Rainbow.new
|
14
|
+
expect(Rainbow.new.enabled).to eq(:yep)
|
15
|
+
|
16
|
+
rainbow.enabled = :nope
|
17
|
+
expect(Rainbow.enabled).to eq(:yep)
|
18
|
+
expect(rainbow.enabled).to eq(:nope)
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'wraps string with escape codes when enabled' do
|
22
|
+
rainbow = Rainbow.new
|
23
|
+
rainbow.enabled = true
|
24
|
+
|
25
|
+
expect(rainbow.wrap('hello').green).to eq("\e[32mhello\e[0m")
|
26
|
+
end
|
27
|
+
|
28
|
+
it "doesn't wrap string with any escape code when disabled" do
|
29
|
+
rainbow = Rainbow.new
|
30
|
+
rainbow.enabled = false
|
31
|
+
|
32
|
+
expect(rainbow.wrap('hello').green).to eq('hello')
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -3,6 +3,10 @@ require 'rainbow'
|
|
3
3
|
|
4
4
|
describe 'Rainbow() wrapper' do
|
5
5
|
|
6
|
+
before do
|
7
|
+
Rainbow.enabled = true
|
8
|
+
end
|
9
|
+
|
6
10
|
it 'allows foreground coloring by color number' do
|
7
11
|
result = Rainbow('hello').foreground(5)
|
8
12
|
expect(result).to eq("\e[35mhello\e[0m")
|
@@ -13,6 +17,11 @@ describe 'Rainbow() wrapper' do
|
|
13
17
|
expect(result).to eq("\e[31mhello\e[0m")
|
14
18
|
end
|
15
19
|
|
20
|
+
it 'allows foreground coloring directly by method name' do
|
21
|
+
result = Rainbow('hello').red
|
22
|
+
expect(result).to eq("\e[31mhello\e[0m")
|
23
|
+
end
|
24
|
+
|
16
25
|
it 'allows foreground coloring by color name (color alias)' do
|
17
26
|
result = Rainbow('hello').color(:red)
|
18
27
|
expect(result).to eq("\e[31mhello\e[0m")
|
@@ -100,19 +109,17 @@ describe 'Rainbow() wrapper' do
|
|
100
109
|
inverse.
|
101
110
|
hide
|
102
111
|
|
103
|
-
expect(result).to eq(
|
112
|
+
expect(result).to eq(
|
113
|
+
"\e[31m\e[1m\e[3m\e[48;5;215m\e[4m\e[34m\e[5m\e[7m\e[8mhello\e[0m"
|
114
|
+
)
|
104
115
|
end
|
105
116
|
|
106
117
|
context "when Rainbow is disabled" do
|
118
|
+
|
107
119
|
before do
|
108
|
-
@enabled = Rainbow.enabled
|
109
120
|
Rainbow.enabled = false
|
110
121
|
end
|
111
122
|
|
112
|
-
after do
|
113
|
-
Rainbow.enabled = @enabled
|
114
|
-
end
|
115
|
-
|
116
123
|
it "allows chaining but doesn't wrap with escape codes" do
|
117
124
|
result = Rainbow('hello').
|
118
125
|
foreground(:red).
|
@@ -1,8 +1,12 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require 'rainbow/string'
|
2
|
+
require 'rainbow/ext/string'
|
3
3
|
|
4
4
|
describe 'String mixin' do
|
5
5
|
|
6
|
+
before do
|
7
|
+
Rainbow.enabled = true
|
8
|
+
end
|
9
|
+
|
6
10
|
it 'proxies foreground to Rainbow().foreground' do
|
7
11
|
expect('hello'.foreground(:red)).to eq(Rainbow('hello').foreground(:red))
|
8
12
|
end
|
@@ -47,4 +51,26 @@ describe 'String mixin' do
|
|
47
51
|
expect('hello'.reset).to eq(Rainbow('hello').reset)
|
48
52
|
end
|
49
53
|
|
54
|
+
context "when Rainbow is disabled" do
|
55
|
+
|
56
|
+
before do
|
57
|
+
Rainbow.enabled = false
|
58
|
+
end
|
59
|
+
|
60
|
+
it "allows chaining but doesn't wrap with escape codes" do
|
61
|
+
result = 'hello'.
|
62
|
+
foreground(:red).
|
63
|
+
bright.
|
64
|
+
italic.
|
65
|
+
background('#ff8040').
|
66
|
+
underline.
|
67
|
+
color(:blue).
|
68
|
+
blink.
|
69
|
+
inverse.
|
70
|
+
hide
|
71
|
+
|
72
|
+
expect(result).to eq('hello')
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
50
76
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -3,8 +3,4 @@ if ENV["CI"] && (!defined?(RUBY_ENGINE) || RUBY_ENGINE == "ruby")
|
|
3
3
|
Coveralls.wear!
|
4
4
|
end
|
5
5
|
|
6
|
-
|
7
|
-
config.before(:each) do
|
8
|
-
Rainbow.enabled = true
|
9
|
-
end
|
10
|
-
end
|
6
|
+
Dir[File.expand_path('../support/**/*.rb', __FILE__)].each { |file| require file }
|
@@ -0,0 +1,9 @@
|
|
1
|
+
shared_examples_for "presenter with shortcut color methods" do
|
2
|
+
[:black, :red, :green, :yellow, :blue, :magenta, :cyan, :white].each do |name|
|
3
|
+
describe "##{name}" do
|
4
|
+
subject { presenter.public_send(name) }
|
5
|
+
|
6
|
+
it { should eq(presenter.color(name)) }
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|