chroma 0.0.1.alpha.1 → 0.0.1.alpha.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 58cd2ee5df8643fe579d9f3abbb73eb6e5abdd7e
4
- data.tar.gz: 9f7fc61bf911705268bf1ad174c68106db3e8184
3
+ metadata.gz: 83b41e45a991b08c177b51e08ad7147ff5f22d60
4
+ data.tar.gz: b55cf5c98e93305486a863a38cc1642fd695b57a
5
5
  SHA512:
6
- metadata.gz: fc91d84ce91dd630d8d8c5371d83e092e11748b44b6158a4281dde2246ced584fc8bd6e30f63f6a5acc12779cde30eb0892c88cb6825b38d05f4da20d55a95e7
7
- data.tar.gz: e61fd039b71428b30d286d4294bef7c116efad95991dce5174fa1c0ae771da9981119b231756971f0473775d2085957ca83b5347d4e3d98ddf6a9de4a81a458d
6
+ metadata.gz: c6a283052b0210c1434cc8492063bf95a7653bf28c08111e840b9a0d77d936d29c6b761498bdcc940ad62e5f579df217311cf740c12d8ca7023780795571106c
7
+ data.tar.gz: 8e61b3b0060212abcab4ba2de3d1a3d700c91ecd6dc1b8dec3f154fa954e39149f6d7ee73627b085cd4efe245162954424e68632967f7df4317185ac33ebf807
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
@@ -0,0 +1,37 @@
1
+ ### v0.0.1.alpha.2
2
+ **Bug Fixes:**
3
+ * Fixed bug with number of arguments passed to generator classes in RgbGenerator. (#1)
4
+ * Make `FromHexStringValues.from_hex8` take alpha as second parameter instead of last.
5
+ Fixes incorrect color generation from hex8. (#6)
6
+ * Ensure that string serialization rounds the alpha value where applicable. (#7)
7
+ * Fix bug where `to_s` and `inspect` would return `<unknown>` instead of using
8
+ hex if the format was `:name` and the named color could not be found. (#2)
9
+ * Fix bug where `Color` equality wasn't implemented. (#12)
10
+ * Fix bug where passing in an instance of `Hsl` or `Hsv` to `Color.new` caused
11
+ their values to get changed. (#11)
12
+ * Fix bug with `Color` equality being off due to floating point math. (#13)
13
+ * Fix bug where `Color` instances generated from hsla and hsva strings had the
14
+ wrong alpha value. (#15)
15
+
16
+ **Method Changes:**
17
+ * Add optional `hex_for_unknown` parameter to `Color::Serializers#to_name`.
18
+ If true, it allows `to_name` to default to hex string if name is not found
19
+ instead of returning `'<unknown>'`. (#2)
20
+ * Add missing conversion methods to converters (a12244f0d81c9480490cfb8a472993f54dd9fbd2)
21
+ * Add equality (`eql?` and `==`) methods to `Color` class and `ColorModes`
22
+ classes. (#12, #13)
23
+ * Add `Chroma.define_palette` for defining custom palettes. (#9)
24
+ * Add `Color#paint` method for returning itself. (#14)
25
+ * Tweak `Color` serialization method names. Switched to this naming primarily
26
+ to drop the `*_s` on the string serialization methods.
27
+ * `to_hsv` -> `hsv`
28
+ * `to_hsv_s` -> `to_hsv`
29
+ * `to_hsl` -> `hsl`
30
+ * `to_hsl_s` -> `to_hsl`
31
+ * `to_hex` -> `to_basic_hex` (made private)
32
+ * `to_hex_s` -> `to_hex`
33
+ * `to_hex8` -> `to_basic_hex8` (made private)
34
+ * `to_hex8_s` -> `to_hex8`
35
+ * `to_rgb` -> `rgb` (moved attr_reader to serializers and made public)
36
+ * `to_rgb_s` -> `to_rgb`
37
+ * Removed `to_name_s` alias
data/README.md CHANGED
@@ -30,7 +30,7 @@ And then execute:
30
30
 
31
31
  Or install it yourself as:
32
32
 
33
- $ gem install chroma
33
+ $ gem install chroma --pre
34
34
 
35
35
  ## Usage
36
36
 
@@ -20,4 +20,5 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_development_dependency 'bundler', '~> 1.7'
22
22
  spec.add_development_dependency 'rake', '~> 10.0'
23
+ spec.add_development_dependency 'rspec', '~> 3.1.0'
23
24
  end
@@ -14,6 +14,7 @@ require 'chroma/color_modes'
14
14
 
15
15
  # Palettes
16
16
  require 'chroma/harmonies'
17
+ require 'chroma/palette_builder'
17
18
 
18
19
  # RGB Generators
19
20
  require 'chroma/rgb_generator'
@@ -50,6 +51,11 @@ module Chroma
50
51
  hex_named_colors_map[hex]
51
52
  end
52
53
 
54
+ def define_palette(name, &block)
55
+ raise "Palette `#{name}' already exists" if Harmonies.method_defined? name
56
+ PaletteBuilder.build(name, &block)
57
+ end
58
+
53
59
  private
54
60
 
55
61
  def hex_named_colors_map
@@ -11,8 +11,20 @@ module Chroma
11
11
  @format = format || gen_format
12
12
  end
13
13
 
14
+ def paint
15
+ self
16
+ end
17
+
18
+ def eql?(other)
19
+ self.class == other.class && self == other
20
+ end
21
+
22
+ def ==(other)
23
+ to_hex == other.to_hex
24
+ end
25
+
14
26
  def complement
15
- hsl = to_hsl
27
+ hsl = self.hsl
16
28
  hsl.h = (hsl.h + 180) % 360
17
29
  Color.new(hsl)
18
30
  end
@@ -16,6 +16,12 @@ module Chroma
16
16
  def brightness
17
17
  (@rgb.r * 299 + @rgb.g * 587 + @rgb.b * 114) / 1000.0
18
18
  end
19
+
20
+ private
21
+
22
+ def rounded_alpha
23
+ @rounded_alpha ||= (alpha * 100).round / 100.0
24
+ end
19
25
  end
20
26
  end
21
27
  end
@@ -2,7 +2,7 @@ module Chroma
2
2
  class Color
3
3
  module Modifiers
4
4
  def lighten(amount = 10)
5
- hsl = to_hsl
5
+ hsl = self.hsl
6
6
  hsl.l = clamp01(hsl.l + amount / 100.0)
7
7
  self.class.new(hsl, @format)
8
8
  end
@@ -20,19 +20,19 @@ module Chroma
20
20
  end
21
21
 
22
22
  def darken(amount = 10)
23
- hsl = to_hsl
23
+ hsl = self.hsl
24
24
  hsl.l = clamp01(hsl.l - amount / 100.0)
25
25
  self.class.new(hsl, @format)
26
26
  end
27
27
 
28
28
  def desaturate(amount = 10)
29
- hsl = to_hsl
29
+ hsl = self.hsl
30
30
  hsl.s = clamp01(hsl.s - amount / 100.0)
31
31
  self.class.new(hsl, @format)
32
32
  end
33
33
 
34
34
  def saturate(amount = 10)
35
- hsl = to_hsl
35
+ hsl = self.hsl
36
36
  hsl.s = clamp01(hsl.s + amount / 100.0)
37
37
  self.class.new(hsl, @format)
38
38
  end
@@ -42,7 +42,7 @@ module Chroma
42
42
  end
43
43
 
44
44
  def spin(amount)
45
- hsl = to_hsl
45
+ hsl = self.hsl
46
46
  hue = (hsl.h.round + amount) % 360
47
47
  hsl.h = hue < 0 ? 360 + hue : hue
48
48
  self.class.new(hsl, @format)
@@ -2,95 +2,96 @@ module Chroma
2
2
  class Color
3
3
  module Serializers
4
4
  def to_hsv
5
- Converters::HsvConverter.convert_rgb(@rgb)
6
- end
7
-
8
- def to_hsv_s
9
- to_hs_s(:v)
5
+ to_hs(:v)
10
6
  end
11
7
 
12
8
  def to_hsl
13
- Converters::HslConverter.convert_rgb(@rgb)
14
- end
15
-
16
- def to_hsl_s
17
- to_hs_s(:l)
9
+ to_hs(:l)
18
10
  end
19
11
 
20
12
  def to_hex(allow_3 = false)
21
- r, g, b = [@rgb.r, @rgb.g, @rgb.b].map do |n|
22
- to_2char_hex(n)
23
- end
24
-
25
- if allow_3 && r[0] == r[1] && g[0] == g[1] && b[0] == b[1]
26
- return "#{r[0]}#{g[0]}#{b[0]}"
27
- end
28
-
29
- [r, g, b].flatten * ''
30
- end
31
-
32
- def to_hex_s(allow_3 = false)
33
- "##{to_hex(allow_3)}"
13
+ "##{to_basic_hex(allow_3)}"
34
14
  end
35
15
 
36
16
  def to_hex8
37
- [
38
- to_2char_hex(alpha * 255),
39
- to_2char_hex(@rgb.r),
40
- to_2char_hex(@rgb.g),
41
- to_2char_hex(@rgb.b)
42
- ].join('')
43
- end
44
-
45
- def to_hex8_s
46
- "##{to_hex8}"
17
+ "##{to_basic_hex8}"
47
18
  end
48
19
 
49
20
  def to_rgb
50
- @rgb
51
- end
52
-
53
- def to_rgb_s
54
21
  middle = @rgb.to_a[0..2].map(&:round).join(', ')
55
22
 
56
- to_alpha_s(:rgb, middle)
23
+ with_alpha(:rgb, middle)
57
24
  end
58
25
 
59
- def to_name
26
+ def to_name(hex_for_unknown = false)
60
27
  return 'transparent' if alpha.zero?
61
28
 
62
- if alpha < 1 || (name = Chroma.name_from_hex(to_hex(true))).nil?
63
- '<unknown>'
29
+ if alpha < 1 || (name = Chroma.name_from_hex(to_basic_hex(true))).nil?
30
+ if hex_for_unknown
31
+ to_hex
32
+ else
33
+ '<unknown>'
34
+ end
64
35
  else
65
36
  name
66
37
  end
67
38
  end
68
39
 
69
- alias_method :to_name_s, :to_name
70
-
71
40
  def to_s(format = @format)
72
- use_alpha = alpha < 1 && alpha >= 0 && /^hex(3|6)?/ =~ format
41
+ use_alpha = alpha < 1 && alpha >= 0 && /^hex(3|6)?$/ =~ format
73
42
 
74
- return to_rgb_s if use_alpha
43
+ return to_rgb if use_alpha
75
44
 
76
45
  case format.to_s
77
- when 'rgb' then to_rgb_s
78
- when 'hex', 'hex6' then to_hex_s
79
- when 'hex3' then to_hex_s(true)
80
- when 'hex8' then to_hex8_s
81
- when 'hsl' then to_hsl_s
82
- when 'hsv' then to_hsv_s
83
- when 'name' then to_name
84
- else to_hex_s
46
+ when 'rgb' then to_rgb
47
+ when 'hex', 'hex6' then to_hex
48
+ when 'hex3' then to_hex(true)
49
+ when 'hex8' then to_hex8
50
+ when 'hsl' then to_hsl
51
+ when 'hsv' then to_hsv
52
+ when 'name' then to_name(true)
53
+ else to_hex
85
54
  end
86
55
  end
87
56
 
88
57
  alias_method :inspect, :to_s
89
58
 
59
+ def hsv
60
+ Converters::HsvConverter.convert_rgb(@rgb)
61
+ end
62
+
63
+ def hsl
64
+ Converters::HslConverter.convert_rgb(@rgb)
65
+ end
66
+
67
+ attr_reader :rgb
68
+
90
69
  private
91
70
 
92
- def to_hs_s(third)
93
- color = send("to_hs#{third}")
71
+ def to_basic_hex(allow_3 = false)
72
+ r, g, b = [@rgb.r, @rgb.g, @rgb.b].map do |n|
73
+ to_2char_hex(n)
74
+ end
75
+
76
+ if allow_3 && r[0] == r[1] && g[0] == g[1] && b[0] == b[1]
77
+ return "#{r[0]}#{g[0]}#{b[0]}"
78
+ end
79
+
80
+ "#{[r, g, b].flatten * ''}"
81
+ end
82
+
83
+ def to_basic_hex8
84
+ [
85
+ to_2char_hex(alpha * 255),
86
+ to_2char_hex(@rgb.r),
87
+ to_2char_hex(@rgb.g),
88
+ to_2char_hex(@rgb.b)
89
+ ].join('')
90
+ end
91
+
92
+ def to_hs(third)
93
+ name = "hs#{third}"
94
+ color = send(name)
94
95
 
95
96
  h = color.h.round
96
97
  s = (color.s * 100).round
@@ -98,12 +99,12 @@ module Chroma
98
99
 
99
100
  middle = "#{h}, #{s}%, #{lv}%"
100
101
 
101
- to_alpha_s("hs#{third}", middle)
102
+ with_alpha(name, middle)
102
103
  end
103
104
 
104
- def to_alpha_s(mode, middle)
105
+ def with_alpha(mode, middle)
105
106
  if alpha < 1
106
- "#{mode}a(#{middle}, #{alpha})"
107
+ "#{mode}a(#{middle}, #{rounded_alpha})"
107
108
  else
108
109
  "#{mode}(#{middle})"
109
110
  end
@@ -34,6 +34,14 @@ module Chroma
34
34
 
35
35
  ColorModes::Hsl.new(h * 360, s, l, @input.a)
36
36
  end
37
+
38
+ def convert_hsl
39
+ @input
40
+ end
41
+
42
+ def convert_hsv
43
+ HsvConverter.convert_rgb(RgbConverter.convert_hsl(@input))
44
+ end
37
45
  end
38
46
  end
39
47
  end
@@ -28,6 +28,14 @@ module Chroma
28
28
 
29
29
  ColorModes::Hsv.new(h * 360, s, v, @input.a)
30
30
  end
31
+
32
+ def convert_hsl
33
+ HslConverter.convert_rgb(RgbConverter.convert_hsv(@input))
34
+ end
35
+
36
+ def convert_hsv
37
+ @input
38
+ end
31
39
  end
32
40
  end
33
41
  end
@@ -1,6 +1,10 @@
1
1
  module Chroma
2
2
  module Converters
3
3
  class RgbConverter < Base
4
+ def convert_rgb
5
+ @input
6
+ end
7
+
4
8
  def convert_hsl
5
9
  h, s, l = @input
6
10
 
@@ -18,7 +22,7 @@ module Chroma
18
22
  b = hue_to_rgb(p, q, h - 1/3.0) * 255
19
23
  end
20
24
 
21
- ColorModes::Rgb.new(r, g, b)
25
+ ColorModes::Rgb.new(r, g, b, bound_alpha(@input.a))
22
26
  end
23
27
 
24
28
  def convert_hsv
@@ -39,7 +43,7 @@ module Chroma
39
43
  g = [t, v, v, q, p, p][mod] * 255
40
44
  b = [p, p, t, v, v, q][mod] * 255
41
45
 
42
- ColorModes::Rgb.new(r, g, b)
46
+ ColorModes::Rgb.new(r, g, b, bound_alpha(@input.a))
43
47
  end
44
48
 
45
49
  private
@@ -21,7 +21,7 @@ module Chroma
21
21
  end
22
22
 
23
23
  def analogous(results = 6, slices = 30)
24
- hsl = @color.to_hsl
24
+ hsl = @color.hsl
25
25
  part = 360 / slices
26
26
  hsl.h = ((hsl.h - (part * results >> 1)) + 720) % 360
27
27
 
@@ -32,7 +32,7 @@ module Chroma
32
32
  end
33
33
 
34
34
  def monochromatic(results = 6)
35
- h, s, v = @color.to_hsv
35
+ h, s, v = @color.hsv
36
36
  modification = 1.0 / results
37
37
 
38
38
  results.times.map do
@@ -45,7 +45,7 @@ module Chroma
45
45
  private
46
46
 
47
47
  def hsl_map(degrees)
48
- h, s, l = @color.to_hsl
48
+ h, s, l = @color.hsl
49
49
 
50
50
  degrees.map do |deg|
51
51
  Color.new(ColorModes::Hsl.new((h + deg) % 360, s, l))
@@ -0,0 +1,58 @@
1
+ module Chroma
2
+ class PaletteBuilder
3
+ def self.build(name, &block)
4
+ new(name, &block).build
5
+ end
6
+
7
+ def initialize(name, &block)
8
+ @name = name
9
+ @block = block
10
+ end
11
+
12
+ def build
13
+ dsl = PaletteBuilderDsl.new
14
+ dsl.instance_eval(&@block)
15
+ conversions = dsl.conversions
16
+
17
+ Harmonies.send(:define_method, @name) do
18
+ conversions.map do |color_calls|
19
+ color_calls.evaluate(@color)
20
+ end.unshift(@color)
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ class PaletteBuilderDsl
27
+ attr_reader :conversions
28
+
29
+ def initialize
30
+ @conversions = []
31
+ end
32
+
33
+ def method_missing(name, *args)
34
+ ColorCalls.new(name, args).tap do |color_calls|
35
+ @conversions << color_calls
36
+ end
37
+ end
38
+
39
+ class ColorCalls
40
+ attr_reader :name, :args
41
+
42
+ def initialize(name, args)
43
+ @calls = [[name, args]]
44
+ end
45
+
46
+ def evaluate(color)
47
+ @calls.reduce(color) do |c, (name, args)|
48
+ c.send(name, *args)
49
+ end
50
+ end
51
+
52
+ def method_missing(name, *args)
53
+ @calls << [name, args]
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -19,7 +19,7 @@ module Chroma
19
19
  when ColorModes::Rgb then FromRgb
20
20
  end
21
21
 
22
- klass.new(input)
22
+ klass.new(nil, input)
23
23
  end
24
24
 
25
25
  def round(n)
@@ -21,7 +21,7 @@ module Chroma
21
21
  new(format, r, g, b)
22
22
  end
23
23
 
24
- def from_hex8(format, r, g, b, a)
24
+ def from_hex8(format, a, r, g, b)
25
25
  new(format || :hex8, r, g, b, a)
26
26
  end
27
27
  end
@@ -2,12 +2,12 @@ module Chroma
2
2
  module RgbGenerator
3
3
  class FromHsl < Base
4
4
  def initialize(format, hsl)
5
- @format = format || :hsl
5
+ @format = format
6
6
  @hsl = hsl
7
7
  end
8
8
 
9
9
  def generate
10
- [Converters::RgbConverter.convert_hsl(@hsl), @format]
10
+ FromHslValues.new(@format, *@hsl.to_a).generate
11
11
  end
12
12
  end
13
13
  end
@@ -5,12 +5,12 @@ module Chroma
5
5
  s = to_percentage(s)
6
6
  l = to_percentage(l)
7
7
 
8
- @format = format
8
+ @format = format || :hsl
9
9
  @hsl = ColorModes::Hsl.new(h, s, l, a)
10
10
  end
11
11
 
12
12
  def generate
13
- FromHsl.new(@format, @hsl).generate
13
+ [Converters::RgbConverter.convert_hsl(@hsl), @format]
14
14
  end
15
15
  end
16
16
  end
@@ -2,12 +2,12 @@ module Chroma
2
2
  module RgbGenerator
3
3
  class FromHsv < Base
4
4
  def initialize(format, hsv)
5
- @format = format || :hsv
5
+ @format = format
6
6
  @hsv = hsv
7
7
  end
8
8
 
9
9
  def generate
10
- [Converters::RgbConverter.convert_hsv(@hsv), @format]
10
+ FromHsvValues.new(@format, *@hsv.to_a).generate
11
11
  end
12
12
  end
13
13
  end
@@ -5,12 +5,12 @@ module Chroma
5
5
  s = to_percentage(s)
6
6
  v = to_percentage(v)
7
7
 
8
- @format = format
8
+ @format = format || :hsv
9
9
  @hsv = ColorModes::Hsv.new(h, s, v, a)
10
10
  end
11
11
 
12
12
  def generate
13
- FromHsv.new(@format, @hsv).generate
13
+ [Converters::RgbConverter.convert_hsv(@hsv), @format]
14
14
  end
15
15
  end
16
16
  end
@@ -28,7 +28,7 @@ module Chroma
28
28
  end
29
29
  end
30
30
 
31
- def initialize(input)
31
+ def initialize(format, input)
32
32
  @input = normalize_input(input)
33
33
  end
34
34
 
@@ -1,3 +1,3 @@
1
1
  module Chroma
2
- VERSION = '0.0.1.alpha.1'
2
+ VERSION = '0.0.1.alpha.2'
3
3
  end
@@ -0,0 +1,33 @@
1
+ describe Chroma, '.define_palette' do
2
+ def add_palette
3
+ Chroma.define_palette :foo do
4
+ spin 60
5
+ spin 180
6
+ spin(60).brighten(20)
7
+ greyscale
8
+ end
9
+ end
10
+
11
+ def remove_palette
12
+ if Chroma::Harmonies.method_defined? :foo
13
+ Chroma::Harmonies.send(:remove_method, :foo)
14
+ end
15
+ end
16
+
17
+ after(:example) { remove_palette }
18
+
19
+ let(:red) { '#ff0000'.paint }
20
+
21
+ it 'adds the new palette method' do
22
+ expect(red.palette).to_not respond_to(:foo)
23
+ add_palette
24
+ expect(red.palette).to respond_to(:foo)
25
+ end
26
+
27
+ it 'generates the correct colors' do
28
+ add_palette
29
+
30
+ expect(red.palette.foo).
31
+ to generate_palette %w(#ff0000 #ffff00 #00ffff #ffff33 #808080)
32
+ end
33
+ end
@@ -0,0 +1,55 @@
1
+ require 'spec_helper'
2
+
3
+ describe Chroma do
4
+ describe '.paint' do
5
+ context 'with named color' do
6
+ it 'creates a color' do
7
+ expect(Chroma.paint('red')).to be_a(Chroma::Color)
8
+ end
9
+ end
10
+
11
+ context 'with 6 character hexadecimal' do
12
+ it 'creates a color' do
13
+ expect(Chroma.paint('#ff0000')).to be_a(Chroma::Color)
14
+ expect(Chroma.paint('ff0000')).to be_a(Chroma::Color)
15
+ end
16
+ end
17
+
18
+ context 'with 3 character hexadecimal' do
19
+ it 'creates a color' do
20
+ expect(Chroma.paint('#f00')).to be_a(Chroma::Color)
21
+ expect(Chroma.paint('f00')).to be_a(Chroma::Color)
22
+ end
23
+ end
24
+
25
+ context 'with 8 character hexadecimal' do
26
+ let(:hex) { '#80ff0000' }
27
+
28
+ it 'creates a color' do
29
+ expect(Chroma.paint(hex)).to be_a(Chroma::Color)
30
+ expect(Chroma.paint(hex[1..-1])).to be_a(Chroma::Color)
31
+ end
32
+
33
+ it 'sets alpha' do
34
+ expect(Chroma.paint(hex).alpha).to be_within(0.1).of(0.5)
35
+ end
36
+ end
37
+
38
+ context 'with rgb' do
39
+ it 'creates a color' do
40
+ expect(Chroma.paint('rgb(255, 0, 0)')).to be_a(Chroma::Color)
41
+ expect(Chroma.paint('rgba(255, 0, 0, 0.5)')).to be_a(Chroma::Color)
42
+ end
43
+
44
+ it 'sets alpha' do
45
+ expect(Chroma.paint('rgba(255, 0, 0, 0.5)').alpha).to eq(0.5)
46
+ end
47
+ end
48
+
49
+ context 'with hsl' do
50
+ it 'creates a color' do
51
+ expect(Chroma.paint('hsl(120, 100%, 50%)')).to be_a(Chroma::Color)
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe Chroma::Color do
4
+ describe '#spin' do
5
+ it 'generates the correct color' do
6
+ expect('red'.paint.spin(60)).to eq('yellow'.paint)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,152 @@
1
+ describe Chroma::Color do
2
+ context 'with serializers' do
3
+ let(:green) { 'green'.paint }
4
+ let(:blue) { 'rgba(0, 0, 255, 0.5)'.paint }
5
+ let(:transparent) { 'rgba(0, 0, 0, 0)'.paint }
6
+
7
+ describe '#to_hsv' do
8
+ it 'returns the hsv string' do
9
+ expect(green.to_hsv).to eq('hsv(120, 100%, 50%)')
10
+ expect(blue.to_hsv).to eq('hsva(240, 100%, 100%, 0.5)')
11
+ end
12
+ end
13
+
14
+ describe '#to_hsl' do
15
+ it 'returns the hsl string' do
16
+ expect(green.to_hsl).to eq('hsl(120, 100%, 25%)')
17
+ expect(blue.to_hsl).to eq('hsla(240, 100%, 50%, 0.5)')
18
+ end
19
+ end
20
+
21
+ describe '#to_hex' do
22
+ context 'with allow_3 set to false' do
23
+ it 'returns the hex string' do
24
+ expect(green.to_hex).to eq('#008000')
25
+ expect(blue.to_hex).to eq('#0000ff')
26
+ end
27
+ end
28
+
29
+ context 'with allow_3 set to true' do
30
+ it 'returns the hex string' do
31
+ expect(green.to_hex(true)).to eq('#008000')
32
+ expect(blue.to_hex(true)).to eq('#00f')
33
+ end
34
+ end
35
+ end
36
+
37
+ describe '#to_hex8' do
38
+ it 'returns the hex8 string' do
39
+ expect(green.to_hex8).to eq('#ff008000')
40
+ expect(blue.to_hex8).to eq('#800000ff')
41
+ end
42
+ end
43
+
44
+ describe '#to_rgb' do
45
+ it 'returns the rgb string' do
46
+ expect(green.to_rgb).to eq('rgb(0, 128, 0)')
47
+ expect(blue.to_rgb).to eq('rgba(0, 0, 255, 0.5)')
48
+ end
49
+ end
50
+
51
+ describe '#to_name' do
52
+ context 'with hex_for_unknown set to false' do
53
+ context 'with known named color' do
54
+ context 'when alpha = 1' do
55
+ it 'returns the named color' do
56
+ expect(green.to_name).to eq('green')
57
+ end
58
+ end
59
+
60
+ context 'when alpha < 1' do
61
+ it 'returns "<unknown>"' do
62
+ expect(blue.to_name).to eq('<unknown>')
63
+ end
64
+ end
65
+ end
66
+
67
+ context 'when alpha = 0' do
68
+ it 'returns "transparent"' do
69
+ expect(transparent.to_name).to eq('transparent')
70
+ end
71
+ end
72
+
73
+ context 'with unknown named color' do
74
+ it 'returns "<unknown>"' do
75
+ expect('#123'.paint.to_name).to eq('<unknown>')
76
+ end
77
+ end
78
+ end
79
+
80
+ context 'with hex_for_unknown set to true' do
81
+ context 'with known named color' do
82
+ context 'when alpha = 1' do
83
+ it 'returns the named color' do
84
+ expect(green.to_name(true)).to eq('green')
85
+ end
86
+ end
87
+
88
+ context 'when alpha < 1' do
89
+ it 'returns the hex string' do
90
+ expect(blue.to_name(true)).to eq('#0000ff')
91
+ end
92
+ end
93
+ end
94
+
95
+ context 'when alpha = 0' do
96
+ it 'returns "transparent"' do
97
+ expect(transparent.to_name(true)).to eq('transparent')
98
+ end
99
+ end
100
+
101
+ context 'with unknown named color' do
102
+ it 'returns returns the hex string' do
103
+ expect('#123'.paint.to_name(true)).to eq('#112233')
104
+ end
105
+ end
106
+ end
107
+ end
108
+
109
+ describe '#to_s' do
110
+ it 'returns the appropriate string according to format' do
111
+ expect('#ff0000'.paint.to_s).to eq('#ff0000')
112
+ expect('#f00'.paint.to_s).to eq('#f00')
113
+ expect('#80ff0000'.paint.to_s).to eq('#80ff0000')
114
+ expect('hsl(120, 100%, 50%)'.paint.to_s).to eq('hsl(120, 100%, 50%)')
115
+ expect('hsla(120, 100%, 50%, 0.5)'.paint.to_s).to eq('hsla(120, 100%, 50%, 0.5)')
116
+ expect('hsv(120, 100%, 50%)'.paint.to_s).to eq('hsv(120, 100%, 50%)')
117
+ expect('hsva(120, 100%, 50%, 0.5)'.paint.to_s).to eq('hsva(120, 100%, 50%, 0.5)')
118
+ expect('red'.paint.to_s).to eq('red')
119
+ end
120
+ end
121
+
122
+ describe '#hsv' do
123
+ it 'returns an hsv instance' do
124
+ hsv = green.hsv
125
+
126
+ expect(hsv).to be_a(Chroma::ColorModes::Hsv)
127
+ expect(hsv.h).to be_within(0.01).of(120)
128
+ expect(hsv.s).to be_within(0.01).of(1)
129
+ expect(hsv.v).to be_within(0.01).of(0.5)
130
+ expect(hsv.a).to eq(1)
131
+ end
132
+ end
133
+
134
+ describe '#hsl' do
135
+ it 'returns an hsl instance' do
136
+ hsl = green.hsl
137
+
138
+ expect(hsl).to be_a(Chroma::ColorModes::Hsl)
139
+ expect(hsl.h).to be_within(0.01).of(120)
140
+ expect(hsl.s).to be_within(0.01).of(1)
141
+ expect(hsl.l).to be_within(0.01).of(0.25)
142
+ expect(hsl.a).to eq(1)
143
+ end
144
+ end
145
+
146
+ describe '#rgb' do
147
+ it 'returns the underlying @rgb iv' do
148
+ expect(green.rgb).to equal(green.instance_variable_get(:@rgb))
149
+ end
150
+ end
151
+ end
152
+ end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ describe Chroma::Color do
4
+ let(:red) { 'red'.paint }
5
+ let(:other_red) { '#f00'.paint }
6
+ let(:blue) { 'blue'.paint }
7
+
8
+ context 'with equality' do
9
+ it 'equals itself' do
10
+ expect(red).to eql(red)
11
+ expect(red).to eq(red)
12
+ end
13
+
14
+ it 'equals another instance of the same color' do
15
+ expect(red).to eql(other_red)
16
+ expect(red).to eq(other_red)
17
+ end
18
+
19
+ it 'does not equal another instance of a different color' do
20
+ expect(red).to_not eql(blue)
21
+ expect(red).to_not eq(blue)
22
+ end
23
+ end
24
+
25
+ describe '#paint' do
26
+ it 'returns itself' do
27
+ expect(red.paint).to equal(red)
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,99 @@
1
+ require 'chroma'
2
+
3
+ # This file was generated by the `rspec --init` command. Conventionally, all
4
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
5
+ # The generated `.rspec` file contains `--require spec_helper` which will cause this
6
+ # file to always be loaded, without a need to explicitly require it in any files.
7
+ #
8
+ # Given that it is always loaded, you are encouraged to keep this file as
9
+ # light-weight as possible. Requiring heavyweight dependencies from this file
10
+ # will add to the boot time of your test suite on EVERY test run, even for an
11
+ # individual file that may not need all of that loaded. Instead, consider making
12
+ # a separate helper file that requires the additional dependencies and performs
13
+ # the additional setup, and require it from the spec files that actually need it.
14
+ #
15
+ # The `.rspec` file also contains a few flags that are not defaults but that
16
+ # users commonly want.
17
+ #
18
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
19
+ RSpec.configure do |config|
20
+ # rspec-expectations config goes here. You can use an alternate
21
+ # assertion/expectation library such as wrong or the stdlib/minitest
22
+ # assertions if you prefer.
23
+ config.expect_with :rspec do |expectations|
24
+ # This option will default to `true` in RSpec 4. It makes the `description`
25
+ # and `failure_message` of custom matchers include text for helper methods
26
+ # defined using `chain`, e.g.:
27
+ # be_bigger_than(2).and_smaller_than(4).description
28
+ # # => "be bigger than 2 and smaller than 4"
29
+ # ...rather than:
30
+ # # => "be bigger than 2"
31
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
32
+ end
33
+
34
+ # rspec-mocks config goes here. You can use an alternate test double
35
+ # library (such as bogus or mocha) by changing the `mock_with` option here.
36
+ config.mock_with :rspec do |mocks|
37
+ # Prevents you from mocking or stubbing a method that does not exist on
38
+ # a real object. This is generally recommended, and will default to
39
+ # `true` in RSpec 4.
40
+ mocks.verify_partial_doubles = true
41
+ end
42
+
43
+ # The settings below are suggested to provide a good initial experience
44
+ # with RSpec, but feel free to customize to your heart's content.
45
+ =begin
46
+ # These two settings work together to allow you to limit a spec run
47
+ # to individual examples or groups you care about by tagging them with
48
+ # `:focus` metadata. When nothing is tagged with `:focus`, all examples
49
+ # get run.
50
+ config.filter_run :focus
51
+ config.run_all_when_everything_filtered = true
52
+
53
+ # Limits the available syntax to the non-monkey patched syntax that is recommended.
54
+ # For more details, see:
55
+ # - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
56
+ # - http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
57
+ # - http://myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3#new__config_option_to_disable_rspeccore_monkey_patching
58
+ config.disable_monkey_patching!
59
+
60
+ # This setting enables warnings. It's recommended, but in some cases may
61
+ # be too noisy due to issues in dependencies.
62
+ config.warnings = true
63
+
64
+ # Many RSpec users commonly either run the entire suite or an individual
65
+ # file, and it's useful to allow more verbose output when running an
66
+ # individual spec file.
67
+ if config.files_to_run.one?
68
+ # Use the documentation formatter for detailed output,
69
+ # unless a formatter has already been configured
70
+ # (e.g. via a command-line flag).
71
+ config.default_formatter = 'doc'
72
+ end
73
+
74
+ # Print the 10 slowest examples and example groups at the
75
+ # end of the spec run, to help surface which specs are running
76
+ # particularly slow.
77
+ config.profile_examples = 10
78
+
79
+ # Run specs in random order to surface order dependencies. If you find an
80
+ # order dependency and want to debug it, you can fix the order by providing
81
+ # the seed, which is printed after each run.
82
+ # --seed 1234
83
+ config.order = :random
84
+
85
+ # Seed global randomization in this process using the `--seed` CLI option.
86
+ # Setting this allows you to use `--seed` to deterministically reproduce
87
+ # test failures related to randomization by passing the same `--seed` value
88
+ # as the one that triggered the failure.
89
+ Kernel.srand config.seed
90
+ =end
91
+ end
92
+
93
+ RSpec::Matchers.define :generate_palette do |expected|
94
+ expected.map!(&:paint)
95
+
96
+ match do |actual|
97
+ actual == expected
98
+ end
99
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chroma
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1.alpha.1
4
+ version: 0.0.1.alpha.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Fairbank
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-11 00:00:00.000000000 Z
11
+ date: 2015-01-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 3.1.0
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 3.1.0
41
55
  description: Chroma is a color manipulation and palette generation gem.
42
56
  email:
43
57
  - elpapapollo@gmail.com
@@ -46,6 +60,8 @@ extensions: []
46
60
  extra_rdoc_files: []
47
61
  files:
48
62
  - ".gitignore"
63
+ - ".rspec"
64
+ - CHANGELOG.md
49
65
  - Gemfile
50
66
  - LICENSE
51
67
  - README.md
@@ -64,6 +80,7 @@ files:
64
80
  - lib/chroma/extensions/string.rb
65
81
  - lib/chroma/harmonies.rb
66
82
  - lib/chroma/helpers/bounders.rb
83
+ - lib/chroma/palette_builder.rb
67
84
  - lib/chroma/rgb_generator.rb
68
85
  - lib/chroma/rgb_generator/base.rb
69
86
  - lib/chroma/rgb_generator/from_hex_string_values.rb
@@ -76,6 +93,12 @@ files:
76
93
  - lib/chroma/rgb_generator/from_string.rb
77
94
  - lib/chroma/version.rb
78
95
  - lib/support/named_colors.yml
96
+ - spec/chroma/define_palette_spec.rb
97
+ - spec/chroma/paint_spec.rb
98
+ - spec/color/modifiers_spec.rb
99
+ - spec/color/serializers_spec.rb
100
+ - spec/color_spec.rb
101
+ - spec/spec_helper.rb
79
102
  homepage: https://github.com/jfairbank/chroma
80
103
  licenses:
81
104
  - MIT
@@ -100,4 +123,10 @@ rubygems_version: 2.4.5
100
123
  signing_key:
101
124
  specification_version: 4
102
125
  summary: Color manipulation and palette generation.
103
- test_files: []
126
+ test_files:
127
+ - spec/chroma/define_palette_spec.rb
128
+ - spec/chroma/paint_spec.rb
129
+ - spec/color/modifiers_spec.rb
130
+ - spec/color/serializers_spec.rb
131
+ - spec/color_spec.rb
132
+ - spec/spec_helper.rb