cape-cod 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +8 -2
- data/lib/cape-cod.rb +33 -22
- data/lib/cape-cod/version.rb +1 -1
- data/spec/cape-cod/color_spec.rb +23 -9
- data/spec/cape-cod_spec.rb +165 -48
- metadata +34 -2
data/README.md
CHANGED
@@ -53,15 +53,21 @@ You can include cape-cod in you String class:
|
|
53
53
|
|
54
54
|
puts 'This is BOLD'.bold
|
55
55
|
|
56
|
-
puts 'and this is ITALIC'.fx(:italic) # You
|
56
|
+
puts 'and this is ITALIC'.fx(:italic) # You're not using this, right?
|
57
57
|
|
58
58
|
puts 'Black n white'.fg(:black).on_white
|
59
59
|
|
60
60
|
puts 'Magenta background'.bg(:magenta)
|
61
61
|
|
62
|
+
puts 'ZOMG THERE'S RGB AS WELL' background'.bg(220, 112, 234).fg(0xa30fd4)
|
63
|
+
|
62
64
|
or use it like this:
|
63
65
|
|
64
|
-
|
66
|
+
puts CapeCod.yellow('We all live in a yellow submarine!')
|
67
|
+
|
68
|
+
puts CapeCod.fx :bold, 'BOOM!'
|
69
|
+
|
70
|
+
puts CapeCod.fg(255, 0, 255, 'Super magenta!')
|
65
71
|
|
66
72
|
All the public instance methods are available as module methods.
|
67
73
|
|
data/lib/cape-cod.rb
CHANGED
@@ -74,51 +74,50 @@ module CapeCod
|
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
77
|
-
def foreground(color) # :nodoc:
|
78
|
-
CapeCod.foreground(color, self)
|
77
|
+
def foreground(*color) # :nodoc:
|
78
|
+
CapeCod.foreground(*color, self)
|
79
79
|
end
|
80
80
|
|
81
|
-
def background(color) # :nodoc:
|
82
|
-
CapeCod.background(color, self)
|
81
|
+
def background(*color) # :nodoc:
|
82
|
+
CapeCod.background(*color, self)
|
83
83
|
end
|
84
84
|
|
85
85
|
def effect(effect) # :nodoc:
|
86
86
|
CapeCod.effect(effect, self)
|
87
87
|
end
|
88
88
|
|
89
|
-
alias_method :
|
90
|
-
alias_method :
|
91
|
-
alias_method :
|
92
|
-
alias_method :fx, :effect
|
89
|
+
alias_method :fg, :foreground
|
90
|
+
alias_method :bg, :background
|
91
|
+
alias_method :fx, :effect
|
93
92
|
|
94
93
|
class << self
|
95
94
|
|
96
95
|
attr_accessor :enabled
|
96
|
+
alias_method :enabled?, :enabled
|
97
97
|
|
98
|
-
def foreground(color, target) # :nodoc:
|
99
|
-
apply_escape_sequence(color_code_for(color, :foreground), target)
|
98
|
+
def foreground(*color, target) # :nodoc:
|
99
|
+
apply_escape_sequence(color_code_for(*color, :foreground), target)
|
100
100
|
end
|
101
101
|
|
102
|
-
def background(color, target) # :nodoc:
|
103
|
-
apply_escape_sequence(color_code_for(color, :background), target)
|
102
|
+
def background(*color, target) # :nodoc:
|
103
|
+
apply_escape_sequence(color_code_for(*color, :background), target)
|
104
104
|
end
|
105
105
|
|
106
106
|
def effect(effect, target) # :nodoc:
|
107
107
|
apply_escape_sequence(effect_code_for(effect), target)
|
108
108
|
end
|
109
109
|
|
110
|
-
alias_method :
|
111
|
-
alias_method :
|
112
|
-
alias_method :
|
113
|
-
alias_method :fx, :effect
|
110
|
+
alias_method :fg, :foreground
|
111
|
+
alias_method :bg, :background
|
112
|
+
alias_method :fx, :effect
|
114
113
|
|
115
114
|
protected
|
116
115
|
|
117
116
|
#
|
118
117
|
# Returns the ANSI escape sequence for the given +color+.
|
119
118
|
#
|
120
|
-
def color_code_for(color, ground)
|
121
|
-
Color.new(color, ground).ansi_code
|
119
|
+
def color_code_for(*color, ground)
|
120
|
+
Color.new(*color, ground).ansi_code
|
122
121
|
end
|
123
122
|
|
124
123
|
#
|
@@ -138,18 +137,30 @@ module CapeCod
|
|
138
137
|
end
|
139
138
|
|
140
139
|
#
|
141
|
-
# Prepends the given +
|
140
|
+
# Prepends the given +target+ with the ANSI escape sequence for the
|
142
141
|
# given escape +code+. In case string is not empty, also appends a
|
143
142
|
# reset sequence.
|
144
143
|
#
|
145
|
-
def apply_escape_sequence(code,
|
146
|
-
|
144
|
+
def apply_escape_sequence(code, target)
|
145
|
+
return target unless self.enabled?
|
147
146
|
|
148
|
-
|
147
|
+
string = target.to_s
|
148
|
+
|
149
|
+
escape_sequence_for(code).tap do |s|
|
149
150
|
unless string.nil? || string.empty?
|
150
151
|
s << string << escape_sequence_for(effect_code_for(:reset))
|
151
152
|
end
|
152
153
|
end
|
153
154
|
end
|
155
|
+
|
156
|
+
def ensure_windows_dependencies!
|
157
|
+
if RbConfig::CONFIG['host_os'] =~ /mswin|mingw/
|
158
|
+
require 'Win32/Console/ANSI'
|
159
|
+
end
|
160
|
+
rescue LoadError
|
161
|
+
self.enabled = false
|
162
|
+
end
|
154
163
|
end
|
164
|
+
|
165
|
+
ensure_windows_dependencies!
|
155
166
|
end
|
data/lib/cape-cod/version.rb
CHANGED
data/spec/cape-cod/color_spec.rb
CHANGED
@@ -4,19 +4,33 @@ require 'spec_helper'
|
|
4
4
|
|
5
5
|
describe CapeCod do
|
6
6
|
describe CapeCod::Color do
|
7
|
-
context '
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
7
|
+
context 'instantiated with valid args' do
|
8
|
+
context 'passed a three integer RGB representation' do
|
9
|
+
it 'produces proper color representation' do
|
10
|
+
expect(
|
11
|
+
CapeCod::Color.new(255, 255, 0, :foreground).ansi_code
|
12
|
+
).to eql '38;5;210'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'passed an RGB integer representation' do
|
17
|
+
it 'produces proper color representation' do
|
18
|
+
expect(
|
19
|
+
CapeCod::Color.new(0xffff00, :foreground).ansi_code
|
20
|
+
).to eql '38;5;210'
|
21
|
+
end
|
22
|
+
end
|
12
23
|
|
13
|
-
|
14
|
-
|
15
|
-
|
24
|
+
context 'passed a color name' do
|
25
|
+
it 'produces proper color representation' do
|
26
|
+
expect(
|
27
|
+
CapeCod::Color.new(:yellow, :foreground).ansi_code
|
28
|
+
).to eql '33'
|
29
|
+
end
|
16
30
|
end
|
17
31
|
end
|
18
32
|
|
19
|
-
context '
|
33
|
+
context 'instantiated with invalid args' do
|
20
34
|
it 'fails initialization' do
|
21
35
|
expect {
|
22
36
|
CapeCod::Color.new(:not_a_color, :foreground).ansi_code
|
data/spec/cape-cod_spec.rb
CHANGED
@@ -5,80 +5,197 @@ require 'spec_helper'
|
|
5
5
|
describe CapeCod do
|
6
6
|
it('has a version') { expect(CapeCod::VERSION).to be_a String }
|
7
7
|
|
8
|
-
context '
|
9
|
-
before
|
10
|
-
class String; include CapeCod end
|
8
|
+
context 'disabled' do
|
9
|
+
before(:all) { CapeCod.enabled = false }
|
11
10
|
|
12
|
-
|
11
|
+
context 'using singleton methods' do
|
12
|
+
it('does nothing') { expect(CapeCod.bold).to be_empty }
|
13
13
|
end
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
15
|
+
context 'using instance methods' do
|
16
|
+
before do
|
17
|
+
class StringWithCapeCodIncluded < String; include CapeCod end
|
18
|
+
end
|
19
|
+
|
20
|
+
let(:target) { StringWithCapeCodIncluded.new('some text') }
|
21
|
+
|
22
|
+
it 'does nothing' do
|
23
|
+
expect(target.red.bold.fx(:italic).bg(:cyan)).to eql target
|
24
|
+
end
|
19
25
|
end
|
20
26
|
end
|
21
27
|
|
22
|
-
context '
|
23
|
-
before(:all)
|
28
|
+
context 'enabled' do
|
29
|
+
before(:all) { CapeCod.enabled = true }
|
24
30
|
|
25
|
-
|
26
|
-
|
27
|
-
|
31
|
+
let(:target) { 'some text' }
|
32
|
+
|
33
|
+
context 'using singleton methods' do
|
34
|
+
let(:reset) { %(\e[0m) }
|
35
|
+
let(:bold) { %(\e[1m) }
|
36
|
+
let(:italic) { %(\e[3m) }
|
37
|
+
let(:red) { %(\e[31m) }
|
38
|
+
let(:on_red) { %(\e[41m) }
|
39
|
+
let(:rgb_red_fg) { %(\e[38;5;180m) }
|
40
|
+
let(:rgb_red_bg) { %(\e[48;5;180m) }
|
41
|
+
|
42
|
+
it { should respond_to :fx }
|
43
|
+
it { should respond_to :fg }
|
44
|
+
it { should respond_to :bg }
|
28
45
|
|
29
|
-
context 'when using singleton methods' do
|
30
46
|
context 'no params given' do
|
31
|
-
it 'returns the escape sequence' do
|
32
|
-
expect(CapeCod.
|
33
|
-
|
34
|
-
|
47
|
+
it 'returns the effect escape sequence' do
|
48
|
+
expect(CapeCod.bold).to eq(bold)
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'returns the foreground color escape sequence' do
|
52
|
+
expect(CapeCod.red).to eq(red)
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'returns the background color escape sequence' do
|
56
|
+
expect(CapeCod.on_red).to eq(on_red)
|
35
57
|
end
|
36
58
|
end
|
37
59
|
|
38
|
-
context '
|
39
|
-
let(:
|
60
|
+
context 'object param given' do
|
61
|
+
let(:target) { ['foo', 10, :bar] }
|
62
|
+
|
63
|
+
it 'returns a new object' do
|
64
|
+
expect(CapeCod.bold(target).object_id).to_not eql(target.object_id)
|
65
|
+
end
|
66
|
+
|
67
|
+
context 'using direct method' do
|
68
|
+
it "escapes the object with the effect's sequence" do
|
69
|
+
expect(CapeCod.bold(target)).to eq("#{bold}#{target}#{reset}")
|
70
|
+
end
|
71
|
+
|
72
|
+
it "escapes the object with the foreground color's sequence" do
|
73
|
+
expect(CapeCod.red(target)).to eq("#{red}#{target}#{reset}")
|
74
|
+
end
|
75
|
+
|
76
|
+
it "escapes the object with the background color's sequence" do
|
77
|
+
expect(CapeCod.on_red(target)).to eq("#{on_red}#{target}#{reset}")
|
78
|
+
end
|
79
|
+
end
|
40
80
|
|
41
|
-
|
81
|
+
context 'passing a symbol with color/effect name' do
|
82
|
+
it "escapes the object with the effect's sequence" do
|
83
|
+
expect(CapeCod.fx(:bold, target)).to eq("#{bold}#{target}#{reset}")
|
84
|
+
end
|
85
|
+
|
86
|
+
context 'colorization' do
|
87
|
+
context 'using color names' do
|
88
|
+
it "escapes the object with the foreground color's sequence" do
|
89
|
+
expect(CapeCod.fg(:red, target)).to(
|
90
|
+
eq("#{red}#{target}#{reset}"))
|
91
|
+
end
|
92
|
+
|
93
|
+
it "escapes the object with the background color's sequence" do
|
94
|
+
expect(CapeCod.bg(:red, target)).to(
|
95
|
+
eq("#{on_red}#{target}#{reset}"))
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
context 'using RGB' do
|
100
|
+
context 'passing three integers' do
|
101
|
+
it "escapes the object with the foreground color's sequence" do
|
102
|
+
expect(CapeCod.fg(255, 0, 0, target)).to(
|
103
|
+
eq("#{rgb_red_fg}#{target}#{reset}"))
|
104
|
+
end
|
105
|
+
|
106
|
+
it "escapes the object with the background color's sequence" do
|
107
|
+
expect(CapeCod.bg(255, 0, 0, target)).to(
|
108
|
+
eq("#{rgb_red_bg}#{target}#{reset}"))
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
context 'passing a single integer (hex representation)' do
|
113
|
+
it "escapes the object with the foreground color's sequence" do
|
114
|
+
expect(CapeCod.fg(0xff0000, target)).to(
|
115
|
+
eq("#{rgb_red_fg}#{target}#{reset}"))
|
116
|
+
end
|
117
|
+
|
118
|
+
it "escapes the object with the background color's sequence" do
|
119
|
+
expect(CapeCod.bg(0xff0000, target)).to(
|
120
|
+
eq("#{rgb_red_bg}#{target}#{reset}"))
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
42
126
|
|
43
|
-
|
44
|
-
expect(
|
45
|
-
|
127
|
+
it 'works properly with multiple calls passing the same object' do
|
128
|
+
expect(
|
129
|
+
CapeCod.red(CapeCod.italic(CapeCod.bold(CapeCod.on_red(target))))
|
130
|
+
).to eql(
|
131
|
+
''.tap do |s|
|
132
|
+
s << "#{red}#{italic}#{bold}#{on_red}"
|
133
|
+
s << "#{target}"
|
134
|
+
s << "#{reset}#{reset}#{reset}#{reset}"
|
135
|
+
end
|
136
|
+
)
|
46
137
|
end
|
47
138
|
end
|
48
139
|
end
|
49
140
|
|
50
|
-
context '
|
51
|
-
before { class String; include CapeCod end }
|
141
|
+
context 'using instance methods' do
|
142
|
+
before(:all) { class String; include CapeCod end }
|
52
143
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
let(:on_yellow) { "\e[43m#{string}\e[0m" }
|
57
|
-
let(:r_on_y) { "\e[43m\e[31mfoo bar baz\e[0m\e[0m" }
|
58
|
-
let(:r_on_y_b) { "\e[1m\e[43m\e[31mfoo bar baz\e[0m\e[0m\e[0m" }
|
144
|
+
it('provides the "fx" alias') { String.public_method_defined? :fx }
|
145
|
+
it('provides the "fg" alias') { String.public_method_defined? :fg }
|
146
|
+
it('provides the "bg" alias') { String.public_method_defined? :bg }
|
59
147
|
|
148
|
+
context 'using direct methods' do
|
149
|
+
it 'returns a new string' do
|
150
|
+
expect(target.red.object_id).to_not eql(target.object_id)
|
151
|
+
end
|
60
152
|
|
61
|
-
|
153
|
+
it 'behaves the same way as singleton methods for foreground colors' do
|
154
|
+
expect(target.red).to eql(CapeCod.red(target))
|
155
|
+
end
|
62
156
|
|
63
|
-
|
157
|
+
it 'behaves the same way as singleton methods for background colors' do
|
158
|
+
expect(target.on_red).to eql(CapeCod.on_red(target))
|
159
|
+
end
|
64
160
|
|
65
|
-
|
66
|
-
|
67
|
-
|
161
|
+
it 'behaves the same way as singleton methods for effects' do
|
162
|
+
expect(target.bold).to eql(CapeCod.bold(target))
|
163
|
+
end
|
68
164
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
165
|
+
it 'behaves the same way as singleton methods for chained calls' do
|
166
|
+
expect(
|
167
|
+
target.on_red.bold.italic.red
|
168
|
+
).to eql(
|
169
|
+
CapeCod.red(CapeCod.italic(CapeCod.bold(CapeCod.on_red(target))))
|
170
|
+
)
|
171
|
+
end
|
172
|
+
end
|
75
173
|
|
76
|
-
|
77
|
-
|
174
|
+
context 'passing a symbol with color/effect name' do
|
175
|
+
it 'returns a new string' do
|
176
|
+
expect(target.red.object_id).to_not eql(target.object_id)
|
177
|
+
end
|
78
178
|
|
79
|
-
|
80
|
-
|
179
|
+
it 'behaves the same way as singleton methods for foreground colors' do
|
180
|
+
expect(target.foreground(:red)).to eql(CapeCod.red(target))
|
181
|
+
end
|
182
|
+
|
183
|
+
it 'behaves the same way as singleton methods for background colors' do
|
184
|
+
expect(target.background(:red)).to eql(CapeCod.on_red(target))
|
185
|
+
end
|
186
|
+
|
187
|
+
it 'behaves the same way as singleton methods for effects' do
|
188
|
+
expect(target.effect(:bold)).to eql(CapeCod.bold(target))
|
189
|
+
end
|
190
|
+
|
191
|
+
it 'behaves the same way as singleton methods for chained calls' do
|
192
|
+
expect(
|
193
|
+
target.bg(:red).fx(:bold).fx(:italic).fg(:red)
|
194
|
+
).to eql(
|
195
|
+
CapeCod.red(CapeCod.italic(CapeCod.bold(CapeCod.on_red(target))))
|
196
|
+
)
|
197
|
+
end
|
198
|
+
end
|
81
199
|
end
|
82
200
|
end
|
83
|
-
end
|
84
201
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cape-cod
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-05-
|
12
|
+
date: 2013-05-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -43,6 +43,38 @@ dependencies:
|
|
43
43
|
- - ! '>='
|
44
44
|
- !ruby/object:Gem::Version
|
45
45
|
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: guard
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: guard-rspec
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
46
78
|
description: ! 'CapeCod offers you simple stupid way of colorizing and applying effects
|
47
79
|
to your
|
48
80
|
|