cape-cod 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -65,10 +65,11 @@ or use it like this:
65
65
 
66
66
  All the public instance methods are available as module methods.
67
67
 
68
+ ## License
69
+
70
+ Please refer to [LICENSE.md](LICENSE.md).
71
+
68
72
  ## Contributing
69
73
 
70
74
  Check the guidelines at [CONTRIBUTING.md](CONTRIBUTING.md).
71
75
 
72
- ## License
73
-
74
- Please refer to [LICENSE.md](LICENSE.md).
data/lib/cape-cod.rb CHANGED
@@ -6,6 +6,7 @@ $LOAD_PATH.unshift File.expand_path(
6
6
  module CapeCod
7
7
 
8
8
  require 'cape-cod/version'
9
+ require 'cape-cod/color'
9
10
 
10
11
  @enabled = STDOUT.tty?
11
12
 
@@ -22,21 +23,10 @@ module CapeCod
22
23
  strikethrough: 9
23
24
  }.freeze
24
25
 
25
- COLORS = {
26
- black: 0,
27
- red: 1,
28
- green: 2,
29
- yellow: 3,
30
- blue: 4,
31
- magenta: 5,
32
- cyan: 6,
33
- white: 7,
34
- }.freeze
35
-
36
26
  #
37
27
  # Define helper methods for applying the escape codes.
38
28
  #
39
- COLORS.each do |color, _|
29
+ Color::CODES.each do |color, _|
40
30
 
41
31
  #
42
32
  # Instance methods for background and foreground colors.
@@ -128,7 +118,7 @@ module CapeCod
128
118
  # Returns the ANSI escape sequence for the given +color+.
129
119
  #
130
120
  def color_code_for(color, ground)
131
- COLORS.fetch(color) + (ground == :foreground ? 30 : 40)
121
+ Color.new(color, ground).ansi_code
132
122
  end
133
123
 
134
124
  #
@@ -0,0 +1,81 @@
1
+ # encoding: utf-8
2
+
3
+ module CapeCod
4
+ class Color
5
+
6
+ #
7
+ # The ANSI color codes.
8
+ #
9
+ CODES = {
10
+ black: 0,
11
+ red: 1,
12
+ green: 2,
13
+ yellow: 3,
14
+ blue: 4,
15
+ magenta: 5,
16
+ cyan: 6,
17
+ white: 7,
18
+ }.freeze
19
+
20
+ #
21
+ # Returns the ANSI domain code for the given RGB color packed
22
+ # into an Integer.
23
+ #
24
+ def self.hex_to_ansi(hex)
25
+ (6 * ((hex >> 16 & 0xff) / 256.0)).to_i * 36 +
26
+ (6 * ((hex >> 8 & 0xff) / 256.0)).to_i * 6 +
27
+ (6 * ((hex & 0xff) / 256.0)).to_i
28
+ end
29
+
30
+ #
31
+ # Initializes a the color.
32
+ #
33
+ # +color+ may be either a single Integer representation of a RGB
34
+ # color, a Symbol with the color name (valid color names are listed
35
+ # in the COLORS hash), or three integers representing the RGB channels.
36
+ # +ground+ is either :background or :foreground.
37
+ #
38
+ def initialize(*color, ground)
39
+ unless [:foreground, :background].include? ground
40
+ raise ArgumentError, 'color must be either foreground or background.'
41
+ end
42
+
43
+ if color.empty? || color.size > 3 || color.size == 2
44
+ raise ArgumentError,
45
+ "wrong number of arguments (#{color.size + 1} for 2|4)."
46
+ elsif color.size == 3
47
+ color = [(color[0] << 16) | (color[1] << 8) | color[2]]
48
+ elsif color.first.is_a?(Integer) && color.first < 0
49
+ raise ArgumentError, 'hex code must be positive.'
50
+ elsif color.first.is_a?(Symbol) && !CODES.has_key?(color.first)
51
+ raise ArgumentError, %(invalid color name "#{color.first}".)
52
+ end
53
+
54
+ @ground = ground
55
+ @color = color.first
56
+ end
57
+
58
+ #
59
+ # Returns a string representing the ANSI escape code for this color.
60
+ #
61
+ def ansi_code
62
+ case @color
63
+ when Symbol then code_from_name
64
+ when Integer then code_from_hex
65
+ end
66
+ end
67
+
68
+ private
69
+
70
+ def code_from_name
71
+ CODES[@color].+(@ground == :foreground ? 30 : 40).to_s
72
+ end
73
+
74
+ def code_from_hex
75
+ ground_code = @ground == :foreground ? 38 : 48
76
+ color_code = self.class.hex_to_ansi(@color)
77
+
78
+ "#{ground_code};5;#{color_code}"
79
+ end
80
+ end
81
+ end
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module CapeCod
4
- VERSION = '0.1.1'
4
+ VERSION = '0.1.2'
5
5
  end
@@ -0,0 +1,35 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe CapeCod do
6
+ describe CapeCod::Color do
7
+ context 'when instantiated with valid args' do
8
+ it 'produces proper color representation' do
9
+ color_from_symbol = CapeCod::Color.new(:yellow, :foreground).ansi_code
10
+ color_from_hex = CapeCod::Color.new(0xffff00, :foreground).ansi_code
11
+ color_from_rgb = CapeCod::Color.new(255, 255, 0, :foreground).ansi_code
12
+
13
+ expect(color_from_symbol).to eql '33'
14
+ expect(color_from_hex).to eql '38;5;210'
15
+ expect(color_from_rgb).to eql '38;5;210'
16
+ end
17
+ end
18
+
19
+ context 'when instantiated with invalid args' do
20
+ it 'fails initialization' do
21
+ expect {
22
+ CapeCod::Color.new(:not_a_color, :foreground).ansi_code
23
+ }.to raise_error(ArgumentError)
24
+
25
+ expect {
26
+ CapeCod::Color.new(:yellow, :not_a_ground).ansi_code
27
+ }.to raise_error(ArgumentError)
28
+
29
+ expect {
30
+ CapeCod::Color.new(155, 155, :foreground).ansi_code
31
+ }.to raise_error(ArgumentError)
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,84 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe CapeCod do
6
+ it('has a version') { expect(CapeCod::VERSION).to be_a String }
7
+
8
+ context 'when disabled' do
9
+ before do
10
+ class String; include CapeCod end
11
+
12
+ CapeCod.enabled = false
13
+ end
14
+
15
+ it 'does nothing' do
16
+ expect(CapeCod.bold).to be_empty
17
+ expect(CapeCod.red('some text')).to eql('some text')
18
+ expect('some text'.red.bold.fx(:italic).bg(:cyan)).to eql('some text')
19
+ end
20
+ end
21
+
22
+ context 'when enabled' do
23
+ before(:all) do CapeCod.enabled = true end
24
+
25
+ it 'generates proper escape sequences' do
26
+ expect(CapeCod.reset).to eq("\e[0m")
27
+ end
28
+
29
+ context 'when using singleton methods' do
30
+ context 'no params given' do
31
+ it 'returns the escape sequence' do
32
+ expect(CapeCod.red).to eq("\e[31m")
33
+ expect(CapeCod.on_red).to eq("\e[41m")
34
+ expect(CapeCod.bold).to eq("\e[1m")
35
+ end
36
+ end
37
+
38
+ context 'when object param given' do
39
+ let(:obj) { ['foo', 10, :bar] }
40
+
41
+ it 'prepends the escape sequence and append a reset' do
42
+
43
+ expect(CapeCod.red(obj)).to eq("\e[31m#{obj.to_s}\e[0m")
44
+ expect(CapeCod.on_red(obj)).to eq("\e[41m#{obj.to_s}\e[0m")
45
+ expect(CapeCod.bold(obj)).to eq("\e[1m#{obj.to_s}\e[0m")
46
+ end
47
+ end
48
+ end
49
+
50
+ context 'when using instance methods' do
51
+ before { class String; include CapeCod end }
52
+
53
+ let(:string) { 'foo bar baz' }
54
+ let(:bold) { "\e[1m#{string}\e[0m" }
55
+ let(:red) { "\e[31m#{string}\e[0m" }
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" }
59
+
60
+
61
+ it 'returns a new string with the proper escape codes applied' do
62
+
63
+ expect(string.bold).to_not eql(string)
64
+
65
+ expect(string.bold).to eql(bold)
66
+ expect(string.red).to eql(red)
67
+ expect(string.on_yellow).to eql(on_yellow)
68
+
69
+ expect(string.effect(:bold)).to eql(bold)
70
+ expect(string.foreground(:red)).to eql(red)
71
+ expect(string.background(:yellow)).to eql(on_yellow)
72
+ expect(string.fx(:bold)).to eql(bold)
73
+ expect(string.fg(:red)).to eql(red)
74
+ expect(string.bg(:yellow)).to eql(on_yellow)
75
+
76
+ expect(string.red.on_yellow).to eql(r_on_y)
77
+ expect(string.fg(:red).bg(:yellow)).to eql(r_on_y)
78
+
79
+ expect(string.red.on_yellow.bold).to eql(r_on_y_b)
80
+ expect(string.fg(:red).bg(:yellow).effect(:bold)).to eql(r_on_y_b)
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,5 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rspec'
4
+
5
+ require 'cape-cod'
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.1
4
+ version: 0.1.2
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-04-29 00:00:00.000000000 Z
12
+ date: 2013-05-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -27,22 +27,6 @@ dependencies:
27
27
  - - ! '>='
28
28
  - !ruby/object:Gem::Version
29
29
  version: '0'
30
- - !ruby/object:Gem::Dependency
31
- name: pry
32
- requirement: !ruby/object:Gem::Requirement
33
- none: false
34
- requirements:
35
- - - ! '>='
36
- - !ruby/object:Gem::Version
37
- version: '0'
38
- type: :development
39
- prerelease: false
40
- version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
43
- - - ! '>='
44
- - !ruby/object:Gem::Version
45
- version: '0'
46
30
  - !ruby/object:Gem::Dependency
47
31
  name: rspec
48
32
  requirement: !ruby/object:Gem::Requirement
@@ -73,10 +57,15 @@ files:
73
57
  - README.md
74
58
  - Rakefile
75
59
  - LICENSE.md
60
+ - lib/cape-cod/color.rb
76
61
  - lib/cape-cod/version.rb
77
62
  - lib/cape-cod.rb
63
+ - spec/cape-cod/color_spec.rb
64
+ - spec/cape-cod_spec.rb
65
+ - spec/spec_helper.rb
78
66
  homepage: http://github.com/fuadsaud/cape-cod
79
- licenses: []
67
+ licenses:
68
+ - MIT
80
69
  post_install_message:
81
70
  rdoc_options: []
82
71
  require_paths:
@@ -86,7 +75,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
86
75
  requirements:
87
76
  - - ! '>='
88
77
  - !ruby/object:Gem::Version
89
- version: '0'
78
+ version: 1.9.3
90
79
  required_rubygems_version: !ruby/object:Gem::Requirement
91
80
  none: false
92
81
  requirements:
@@ -99,5 +88,8 @@ rubygems_version: 1.8.23
99
88
  signing_key:
100
89
  specification_version: 3
101
90
  summary: Make your strings look fancy with ANSI escape codes.
102
- test_files: []
91
+ test_files:
92
+ - spec/cape-cod/color_spec.rb
93
+ - spec/cape-cod_spec.rb
94
+ - spec/spec_helper.rb
103
95
  has_rdoc: false