rainbow 1.1.4 → 1.99.0
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 +7 -0
- data/.gitignore +17 -0
- data/.travis.yml +11 -0
- data/Gemfile +17 -0
- data/Guardfile +9 -0
- data/README.markdown +91 -48
- data/Rakefile +6 -0
- data/lib/rainbow.rb +14 -96
- data/lib/rainbow/color.rb +109 -0
- data/lib/rainbow/core.rb +16 -0
- data/lib/rainbow/legacy.rb +14 -0
- data/lib/rainbow/string.rb +50 -0
- data/lib/rainbow/string_utils.rb +23 -0
- data/lib/rainbow/version.rb +3 -0
- data/lib/rainbow/wrapper.rb +76 -0
- data/rainbow.gemspec +25 -0
- data/spec/integration/rainbow_spec.rb +132 -0
- data/spec/integration/string_spec.rb +50 -0
- data/spec/spec_helper.rb +10 -0
- data/spec/unit/color_spec.rb +244 -0
- data/spec/unit/namespace_spec.rb +31 -0
- data/spec/unit/string_utils_spec.rb +62 -0
- data/spec/unit/wrapper_spec.rb +149 -0
- metadata +86 -20
- data/lib/ansi_color.rb +0 -71
- data/lib/ansi_rgb.rb +0 -43
- data/test/rainbow_test.rb +0 -277
data/lib/rainbow/core.rb
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
module Sickill
|
|
2
|
+
module Rainbow
|
|
3
|
+
|
|
4
|
+
def self.enabled=(value)
|
|
5
|
+
STDERR.puts "Rainbow gem notice: Sickill::Rainbow.enabled= is deprecated, use Rainbow.enabled= instead."
|
|
6
|
+
::Rainbow.enabled = value
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def self.enabled
|
|
10
|
+
::Rainbow.enabled
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
require 'rainbow'
|
|
2
|
+
|
|
3
|
+
module Rainbow
|
|
4
|
+
module String
|
|
5
|
+
module InstanceMethods
|
|
6
|
+
|
|
7
|
+
def foreground(*color)
|
|
8
|
+
Rainbow(self).foreground(*color)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
alias_method :color, :foreground
|
|
12
|
+
alias_method :colour, :foreground
|
|
13
|
+
|
|
14
|
+
def background(*color)
|
|
15
|
+
Rainbow(self).background(*color)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def reset
|
|
19
|
+
Rainbow(self).reset
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def bright
|
|
23
|
+
Rainbow(self).bright
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def italic
|
|
27
|
+
Rainbow(self).italic
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def underline
|
|
31
|
+
Rainbow(self).underline
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def blink
|
|
35
|
+
Rainbow(self).blink
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def inverse
|
|
39
|
+
Rainbow(self).inverse
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def hide
|
|
43
|
+
Rainbow(self).hide
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
::String.send(:include, Rainbow::String::InstanceMethods)
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module Rainbow
|
|
2
|
+
class StringUtils
|
|
3
|
+
|
|
4
|
+
def self.wrap_with_sgr(string, codes)
|
|
5
|
+
return string if codes.empty?
|
|
6
|
+
|
|
7
|
+
seq = "\e[" + codes.join(";") + "m"
|
|
8
|
+
match = string.match(/^(\e\[([\d;]+)m)*/)
|
|
9
|
+
|
|
10
|
+
if match
|
|
11
|
+
seq_pos = match.end(0)
|
|
12
|
+
string = string[0...seq_pos] + seq + string[seq_pos..-1]
|
|
13
|
+
else
|
|
14
|
+
string = seq + string
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
string = string + "\e[0m" unless string =~ /\e\[0m$/
|
|
18
|
+
|
|
19
|
+
string
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
require 'rainbow/core'
|
|
2
|
+
require 'rainbow/string_utils'
|
|
3
|
+
require 'rainbow/color'
|
|
4
|
+
|
|
5
|
+
module Rainbow
|
|
6
|
+
|
|
7
|
+
class Wrapper < ::String
|
|
8
|
+
|
|
9
|
+
# Sets foreground color of this text.
|
|
10
|
+
def foreground(*values)
|
|
11
|
+
wrap_with_sgr(Color.build(:foreground, values).codes)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
alias_method :color, :foreground
|
|
15
|
+
alias_method :colour, :foreground
|
|
16
|
+
|
|
17
|
+
# Sets background color of this text.
|
|
18
|
+
def background(*values)
|
|
19
|
+
wrap_with_sgr(Color.build(:background, values).codes)
|
|
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])
|
|
50
|
+
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
|
+
end
|
|
71
|
+
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def Rainbow(string)
|
|
75
|
+
Rainbow::Wrapper.new(string.to_s)
|
|
76
|
+
end
|
data/rainbow.gemspec
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
|
+
require 'rainbow/version'
|
|
5
|
+
|
|
6
|
+
Gem::Specification.new do |spec|
|
|
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
|
+
|
|
16
|
+
spec.files = `git ls-files`.split($/)
|
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
|
19
|
+
spec.require_paths = ["lib"]
|
|
20
|
+
|
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
|
22
|
+
spec.add_development_dependency "rake"
|
|
23
|
+
spec.add_development_dependency "rspec"
|
|
24
|
+
spec.add_development_dependency 'mime-types', '< 2.0.0' if RUBY_VERSION < "1.9.0"
|
|
25
|
+
end
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'rainbow'
|
|
3
|
+
|
|
4
|
+
describe 'Rainbow() wrapper' do
|
|
5
|
+
|
|
6
|
+
it 'allows foreground coloring by color number' do
|
|
7
|
+
result = Rainbow('hello').foreground(5)
|
|
8
|
+
expect(result).to eq("\e[35mhello\e[0m")
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it 'allows foreground coloring by color name' do
|
|
12
|
+
result = Rainbow('hello').foreground(:red)
|
|
13
|
+
expect(result).to eq("\e[31mhello\e[0m")
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it 'allows foreground coloring by color name (color alias)' do
|
|
17
|
+
result = Rainbow('hello').color(:red)
|
|
18
|
+
expect(result).to eq("\e[31mhello\e[0m")
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it 'allows foreground coloring by color name (colour alias)' do
|
|
22
|
+
result = Rainbow('hello').colour(:red)
|
|
23
|
+
expect(result).to eq("\e[31mhello\e[0m")
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it 'allows foreground coloring by color rgb' do
|
|
27
|
+
result = Rainbow('hello').foreground(255, 128, 64)
|
|
28
|
+
expect(result).to eq("\e[38;5;215mhello\e[0m")
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it 'allows foreground coloring by color rgb (hex string)' do
|
|
32
|
+
result = Rainbow('hello').foreground('ff8040')
|
|
33
|
+
expect(result).to eq("\e[38;5;215mhello\e[0m")
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
it 'allows background coloring by color number' do
|
|
37
|
+
result = Rainbow('hello').background(3)
|
|
38
|
+
expect(result).to eq("\e[43mhello\e[0m")
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it 'allows background coloring by color name' do
|
|
42
|
+
result = Rainbow('hello').background(:green)
|
|
43
|
+
expect(result).to eq("\e[42mhello\e[0m")
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it 'allows background coloring by color rgb' do
|
|
47
|
+
result = Rainbow('hello').background(255, 128, 64)
|
|
48
|
+
expect(result).to eq("\e[48;5;215mhello\e[0m")
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it 'allows background coloring by color rgb (hex string)' do
|
|
52
|
+
result = Rainbow('hello').background('ff8040')
|
|
53
|
+
expect(result).to eq("\e[48;5;215mhello\e[0m")
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it 'allows making text bright' do
|
|
57
|
+
result = Rainbow('hello').bright
|
|
58
|
+
expect(result).to eq("\e[1mhello\e[0m")
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it 'allows making text italic' do
|
|
62
|
+
result = Rainbow('hello').italic
|
|
63
|
+
expect(result).to eq("\e[3mhello\e[0m")
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it 'allows making text underlined' do
|
|
67
|
+
result = Rainbow('hello').underline
|
|
68
|
+
expect(result).to eq("\e[4mhello\e[0m")
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
it 'allows making text blinking' do
|
|
72
|
+
result = Rainbow('hello').blink
|
|
73
|
+
expect(result).to eq("\e[5mhello\e[0m")
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
it 'allows making text inversed' do
|
|
77
|
+
result = Rainbow('hello').inverse
|
|
78
|
+
expect(result).to eq("\e[7mhello\e[0m")
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
it 'allows making text hidden' do
|
|
82
|
+
result = Rainbow('hello').hide
|
|
83
|
+
expect(result).to eq("\e[8mhello\e[0m")
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
it 'allows resetting all the attributes' do
|
|
87
|
+
result = Rainbow('hello').reset
|
|
88
|
+
expect(result).to eq("\e[0mhello\e[0m")
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
it 'allows chaining' do
|
|
92
|
+
result = Rainbow('hello').
|
|
93
|
+
foreground(:red).
|
|
94
|
+
bright.
|
|
95
|
+
italic.
|
|
96
|
+
background('#ff8040').
|
|
97
|
+
underline.
|
|
98
|
+
color(:blue).
|
|
99
|
+
blink.
|
|
100
|
+
inverse.
|
|
101
|
+
hide
|
|
102
|
+
|
|
103
|
+
expect(result).to eq("\e[31m\e[1m\e[3m\e[48;5;215m\e[4m\e[34m\e[5m\e[7m\e[8mhello\e[0m")
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
context "when Rainbow is disabled" do
|
|
107
|
+
before do
|
|
108
|
+
@enabled = Rainbow.enabled
|
|
109
|
+
Rainbow.enabled = false
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
after do
|
|
113
|
+
Rainbow.enabled = @enabled
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
it "allows chaining but doesn't wrap with escape codes" do
|
|
117
|
+
result = Rainbow('hello').
|
|
118
|
+
foreground(:red).
|
|
119
|
+
bright.
|
|
120
|
+
italic.
|
|
121
|
+
background('#ff8040').
|
|
122
|
+
underline.
|
|
123
|
+
color(:blue).
|
|
124
|
+
blink.
|
|
125
|
+
inverse.
|
|
126
|
+
hide
|
|
127
|
+
|
|
128
|
+
expect(result).to eq('hello')
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'rainbow/string'
|
|
3
|
+
|
|
4
|
+
describe 'String mixin' do
|
|
5
|
+
|
|
6
|
+
it 'proxies foreground to Rainbow().foreground' do
|
|
7
|
+
expect('hello'.foreground(:red)).to eq(Rainbow('hello').foreground(:red))
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
it 'proxies color to Rainbow().color' do
|
|
11
|
+
expect('hello'.color(:red)).to eq(Rainbow('hello').color(:red))
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it 'proxies colour to Rainbow().colour' do
|
|
15
|
+
expect('hello'.colour(:red)).to eq(Rainbow('hello').colour(:red))
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it 'proxies background to Rainbow().background' do
|
|
19
|
+
expect('hello'.background(:red)).to eq(Rainbow('hello').background(:red))
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it 'proxies bright to Rainbow().bright' do
|
|
23
|
+
expect('hello'.bright).to eq(Rainbow('hello').bright)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it 'proxies italic to Rainbow().italic' do
|
|
27
|
+
expect('hello'.italic).to eq(Rainbow('hello').italic)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it 'proxies underline to Rainbow().underline' do
|
|
31
|
+
expect('hello'.underline).to eq(Rainbow('hello').underline)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it 'proxies blink to Rainbow().blink' do
|
|
35
|
+
expect('hello'.blink).to eq(Rainbow('hello').blink)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it 'proxies inverse to Rainbow().inverse' do
|
|
39
|
+
expect('hello'.inverse).to eq(Rainbow('hello').inverse)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it 'proxies hide to Rainbow().hide' do
|
|
43
|
+
expect('hello'.hide).to eq(Rainbow('hello').hide)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it 'proxies reset to Rainbow().reset' do
|
|
47
|
+
expect('hello'.reset).to eq(Rainbow('hello').reset)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
end
|
data/spec/spec_helper.rb
ADDED
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'rainbow/color'
|
|
3
|
+
|
|
4
|
+
module Rainbow
|
|
5
|
+
describe Color do
|
|
6
|
+
describe '.build' do
|
|
7
|
+
|
|
8
|
+
subject { described_class.build(ground, values) }
|
|
9
|
+
|
|
10
|
+
let(:ground) { :foreground }
|
|
11
|
+
|
|
12
|
+
context "when single fixnum given" do
|
|
13
|
+
let(:values) { [1] }
|
|
14
|
+
|
|
15
|
+
it { should be_a(Color) }
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
context "when single symbol given" do
|
|
19
|
+
let(:values) { [:red] }
|
|
20
|
+
|
|
21
|
+
it { should be_a(Color) }
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
context "when single string given" do
|
|
25
|
+
let(:values) { ['#dead00'] }
|
|
26
|
+
|
|
27
|
+
it { should be_a(Color) }
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
context "when 2 elements" do
|
|
31
|
+
let(:values) { [1, 2] }
|
|
32
|
+
|
|
33
|
+
it 'raises ArgumentError' do
|
|
34
|
+
expect { subject }.to raise_error(ArgumentError)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
context "when 3 elements given" do
|
|
39
|
+
let(:values) { [1, 2, 3] }
|
|
40
|
+
|
|
41
|
+
it { should be_a(Color) }
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
context "when 4 elements" do
|
|
45
|
+
let(:values) { [1, 2, 3, 4] }
|
|
46
|
+
|
|
47
|
+
it 'raises ArgumentError' do
|
|
48
|
+
expect { subject }.to raise_error(ArgumentError)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
describe Color::Indexed do
|
|
56
|
+
let(:color) { described_class.new(ground, 5) }
|
|
57
|
+
|
|
58
|
+
describe '#codes' do
|
|
59
|
+
subject { color.codes }
|
|
60
|
+
|
|
61
|
+
context "when ground is :foreground" do
|
|
62
|
+
let(:ground) { :foreground }
|
|
63
|
+
|
|
64
|
+
it { should eq([35]) }
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
context "when ground is :background" do
|
|
68
|
+
let(:ground) { :background }
|
|
69
|
+
|
|
70
|
+
it { should eq([45]) }
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
describe Color::Named do
|
|
76
|
+
let(:color) { described_class.new(ground, name) }
|
|
77
|
+
|
|
78
|
+
describe '#codes' do
|
|
79
|
+
subject { color.codes }
|
|
80
|
+
|
|
81
|
+
context "when ground is :foreground" do
|
|
82
|
+
let(:ground) { :foreground }
|
|
83
|
+
|
|
84
|
+
context "and name is :black" do
|
|
85
|
+
let(:name) { :black }
|
|
86
|
+
|
|
87
|
+
it { should eq([30]) }
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
context "and name is :red" do
|
|
91
|
+
let(:name) { :red }
|
|
92
|
+
|
|
93
|
+
it { should eq([31]) }
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
context "and name is :green" do
|
|
97
|
+
let(:name) { :green }
|
|
98
|
+
|
|
99
|
+
it { should eq([32]) }
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
context "and name is :yellow" do
|
|
103
|
+
let(:name) { :yellow }
|
|
104
|
+
|
|
105
|
+
it { should eq([33]) }
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
context "and name is :blue" do
|
|
109
|
+
let(:name) { :blue }
|
|
110
|
+
|
|
111
|
+
it { should eq([34]) }
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
context "and name is :magenta" do
|
|
115
|
+
let(:name) { :magenta }
|
|
116
|
+
|
|
117
|
+
it { should eq([35]) }
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
context "and name is :cyan" do
|
|
121
|
+
let(:name) { :cyan }
|
|
122
|
+
|
|
123
|
+
it { should eq([36]) }
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
context "and name is :white" do
|
|
127
|
+
let(:name) { :white }
|
|
128
|
+
|
|
129
|
+
it { should eq([37]) }
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
context "and name is invalid" do
|
|
133
|
+
let(:name) { :foo }
|
|
134
|
+
|
|
135
|
+
it 'raises ArgumentError' do
|
|
136
|
+
expect { subject }.to raise_error(ArgumentError)
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
context "when ground is :background" do
|
|
142
|
+
let(:ground) { :background }
|
|
143
|
+
|
|
144
|
+
context "and name is :black" do
|
|
145
|
+
let(:name) { :black }
|
|
146
|
+
|
|
147
|
+
it { should eq([40]) }
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
context "and name is :red" do
|
|
151
|
+
let(:name) { :red }
|
|
152
|
+
|
|
153
|
+
it { should eq([41]) }
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
context "and name is :green" do
|
|
157
|
+
let(:name) { :green }
|
|
158
|
+
|
|
159
|
+
it { should eq([42]) }
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
context "and name is :yellow" do
|
|
163
|
+
let(:name) { :yellow }
|
|
164
|
+
|
|
165
|
+
it { should eq([43]) }
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
context "and name is :blue" do
|
|
169
|
+
let(:name) { :blue }
|
|
170
|
+
|
|
171
|
+
it { should eq([44]) }
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
context "and name is :magenta" do
|
|
175
|
+
let(:name) { :magenta }
|
|
176
|
+
|
|
177
|
+
it { should eq([45]) }
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
context "and name is :cyan" do
|
|
181
|
+
let(:name) { :cyan }
|
|
182
|
+
|
|
183
|
+
it { should eq([46]) }
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
context "and name is :white" do
|
|
187
|
+
let(:name) { :white }
|
|
188
|
+
|
|
189
|
+
it { should eq([47]) }
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
context "and name is invalid" do
|
|
193
|
+
let(:name) { :foo }
|
|
194
|
+
|
|
195
|
+
it 'raises ArgumentError' do
|
|
196
|
+
expect { subject }.to raise_error(ArgumentError)
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
describe Color::RGB do
|
|
204
|
+
let(:color) { described_class.new(ground, r, g, b) }
|
|
205
|
+
|
|
206
|
+
describe '#codes' do
|
|
207
|
+
subject { color.codes }
|
|
208
|
+
|
|
209
|
+
let(:ground) { :foreground }
|
|
210
|
+
let(:r) { 0 }
|
|
211
|
+
let(:g) { 128 }
|
|
212
|
+
let(:b) { 255 }
|
|
213
|
+
|
|
214
|
+
context "when ground is :foreground" do
|
|
215
|
+
let(:ground) { :foreground }
|
|
216
|
+
|
|
217
|
+
it { should eq([38, 5, 39]) }
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
context "when ground is :background" do
|
|
221
|
+
let(:ground) { :background }
|
|
222
|
+
|
|
223
|
+
it { should eq([48, 5, 39]) }
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
context "when a component is lower than 0" do
|
|
227
|
+
let(:r) { -1 }
|
|
228
|
+
|
|
229
|
+
it 'raises ArgumentError' do
|
|
230
|
+
expect { subject }.to raise_error(ArgumentError)
|
|
231
|
+
end
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
context "when a component is greater than 255" do
|
|
235
|
+
let(:b) { 256 }
|
|
236
|
+
|
|
237
|
+
it 'raises ArgumentError' do
|
|
238
|
+
expect { subject }.to raise_error(ArgumentError)
|
|
239
|
+
end
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
end
|