paleta 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/lib/paleta/color.rb CHANGED
@@ -8,11 +8,21 @@ module Paleta
8
8
 
9
9
  def initialize(*args)
10
10
 
11
- # example: new(:hex, "336699")
12
- if args.length == 2 && args[0] == :hex && args[1].is_a?(String)
11
+ if args.length == 1 && args[0].is_a?(Color)
12
+ # TODO: refactor this, find out how to call a method name by the value of a variable
13
+ # something like args[0].instance_variables.each { |k, v| self.(k) = v }
14
+ @red = args[0].red
15
+ @green = args[0].green
16
+ @blue = args[0].blue
17
+ @hue = args[0].hue
18
+ @saturation = args[0].saturation
19
+ @lightness = args[0].lightness
20
+ @hex = args[0].hex
21
+ elsif args.length == 2 && args[0] == :hex && args[1].is_a?(String)
22
+ # example: new(:hex, "336699")
13
23
  hex_init(args[1])
14
- # example: new(235, 129, 74)
15
24
  elsif args.length == 3 && args[0].is_a?(Numeric) && args[1].is_a?(Numeric) && args[2].is_a?(Numeric)
25
+ # example: new(235, 129, 74)
16
26
  rgb_init(args[0], args[1], args[2])
17
27
  elsif args.length == 4 && [:rgb, :hsl].include?(args[0]) && args[1].is_a?(Numeric) && args[2].is_a?(Numeric) && args[3].is_a?(Numeric)
18
28
  # example: new(:hsl, 320, 96, 74)
@@ -80,9 +90,7 @@ module Paleta
80
90
  end
81
91
 
82
92
  def hex=(val)
83
- unless val.length == 6 && /^[[:xdigit:]]+$/ === val
84
- raise(ArgumentError, "Invalid Hex String")
85
- end
93
+ raise(ArgumentError, "Invalid Hex String") unless val.length == 6 && /^[[:xdigit:]]+$/ === val
86
94
  @hex = val.upcase
87
95
  @red = val[0..1].hex
88
96
  @green = val[2..3].hex
@@ -90,6 +98,12 @@ module Paleta
90
98
  update_hsl
91
99
  end
92
100
 
101
+ def lighten(percent = 5)
102
+ copy = self.class.new(self)
103
+ copy.lighten!(percent)
104
+ return copy
105
+ end
106
+
93
107
  def lighten!(percent = 5)
94
108
  @lightness += percent
95
109
  @lightness = 100 if @lightness > 100
@@ -97,6 +111,12 @@ module Paleta
97
111
  update_hex
98
112
  end
99
113
 
114
+ def darken(percent = 5)
115
+ copy = self.class.new(self)
116
+ copy.darken!(percent)
117
+ return copy
118
+ end
119
+
100
120
  def darken!(percent = 5)
101
121
  @lightness -= percent
102
122
  @lightness = 0 if @lightness < 0
@@ -104,6 +124,12 @@ module Paleta
104
124
  update_hex
105
125
  end
106
126
 
127
+ def invert
128
+ copy = self.class.new(self)
129
+ copy.invert!
130
+ return copy
131
+ end
132
+
107
133
  def invert!
108
134
  @red = 255 - @red
109
135
  @green = 255 - @green
@@ -112,6 +138,30 @@ module Paleta
112
138
  update_hex
113
139
  end
114
140
 
141
+ def desaturate
142
+ copy = self.class.new(self)
143
+ copy.desaturate!
144
+ return copy
145
+ end
146
+
147
+ def desaturate!
148
+ @saturation = 0
149
+ update_rgb
150
+ update_hex
151
+ end
152
+
153
+ def complement
154
+ copy = self.class.new(self)
155
+ copy.complement!
156
+ return copy
157
+ end
158
+
159
+ def complement!
160
+ @hue = (@hue + 180) % 360
161
+ update_rgb
162
+ update_hex
163
+ end
164
+
115
165
  def similarity(color)
116
166
  distance({ :r => @red, :g => @green, :b => @blue}, { :r => color.red, :g => color.green, :b => color.blue}) / sqrt(3 * (255 ** 2))
117
167
  end
@@ -122,22 +172,23 @@ module Paleta
122
172
  r = @red / 255.0 rescue 0.0
123
173
  g = @green / 255.0 rescue 0.0
124
174
  b = @blue / 255.0 rescue 0.0
125
-
175
+
126
176
  min = [r, g, b].min
127
177
  max = [r, g, b].max
128
178
  delta = max - min
129
179
 
130
- h = s = 0
180
+ h = 0
131
181
  l = (max + min) / 2.0
132
-
182
+ s = ((l == 0 || l == 1) ? 0 : (delta / (1 - (2 * l - 1).abs)))
183
+
133
184
  if delta != 0
134
- s = (l < 0.5) ? delta / (max + min) : delta / (2.0 - max - min)
135
185
  case max
136
- when r; h = (g - b) / delta
137
- when g; h = 2 + (b - r) / delta
138
- when b; h = 4 + (r - g) / delta
186
+ when r; h = ((g - b) / delta) % 6
187
+ when g; h = ((b - r) / delta) + 2
188
+ when b; h = ((r - g) / delta) + 4
139
189
  end
140
190
  end
191
+
141
192
  @hue = h * 60
142
193
  @hue += 360 if @hue < 0
143
194
  @saturation = s * 100
@@ -145,49 +196,40 @@ module Paleta
145
196
  end
146
197
 
147
198
  def update_rgb
199
+
200
+ h = @hue / 60.0 rescue 0.0
201
+ s = @saturation / 100.0 rescue 0.0
202
+ l = @lightness / 100.0 rescue 0.0
203
+
204
+ d1 = (1 - (2 * l - 1).abs) * s
205
+ d2 = d1 * (1 - (h % 2 - 1).abs)
206
+ d3 = l - (d1 / 2.0)
148
207
 
149
- h = @hue / 360.0 rescue 0
150
- s = @saturation / 100.0 rescue 0
151
- l = @lightness / 100.0 rescue 0
152
-
153
- if s == 0
154
- r = g = b = l * 255
155
- else
156
- h /= 6.0
157
- t2 = l < 0.5 ? l * (s + 1) : (l + s) - (l * s)
158
- t1 = 2 * l - t2
159
-
160
- r = h + (1.0 / 3.0)
161
- g = h
162
- b = h - (1.0 / 3.0)
163
-
164
- r = hue_calc(r, t1, t2)
165
- g = hue_calc(g, t1, t2)
166
- b = hue_calc(b, t1, t2)
167
-
168
- @red = r * 255.0
169
- @green = g * 255.0
170
- @blue = b * 255.0
208
+ case h.to_i
209
+ when 0; @red, @green, @blue = d1, d2, 0
210
+ when 1; @red, @green, @blue = d2, d1, 0
211
+ when 2; @red, @green, @blue = 0, d1, d2
212
+ when 3; @red, @green, @blue = 0, d2, d1
213
+ when 4; @red, @green, @blue = d2, 0, d1
214
+ when 5; @red, @green, @blue = d1, 0, d2
215
+ else; @red, @green, @blue = 0, 0, 0
171
216
  end
217
+
218
+ @red = 255 * (@red + d3)
219
+ @green = 255 * (@green + d3)
220
+ @blue = 255 * (@blue + d3)
172
221
  end
173
222
 
174
223
  def update_hex
175
- r = @red.to_s(16) rescue "00"
176
- g = @green.to_s(16) rescue "00"
177
- b = @blue.to_s(16) rescue "00"
178
- [r, g, b].each { |c| c = "0#{c}" if c.length < 2 }
224
+ r = @red.to_i.to_s(16) rescue "00"
225
+ g = @green.to_i.to_s(16) rescue "00"
226
+ b = @blue.to_i.to_s(16) rescue "00"
227
+ r = "0#{r}" if r.length < 2
228
+ g = "0#{g}" if g.length < 2
229
+ b = "0#{b}" if b.length < 2
179
230
  @hex = "#{r}#{g}#{b}".upcase
180
231
  end
181
232
 
182
- def hue_calc(value, t1, t2)
183
- value += 1 if value < 0
184
- value -= 1 if value > 1
185
- return (t1 + (t2 - t1) * 6 * value) if 6 * value < 1
186
- return t2 if 2 * value < 1
187
- return (t1 + (t2 - t1) * (2.0 / 3.0 - value) * 6) if 3 * value < 2
188
- return t1;
189
- end
190
-
191
233
  def range_validator(val, range)
192
234
  range.include?(val) ? val : raise(ArgumentError, "Component range exceeded")
193
235
  end
@@ -3,11 +3,13 @@ require 'paleta/core_ext/math'
3
3
  module Paleta
4
4
  class Palette
5
5
  include Math
6
+ include Enumerable
6
7
 
7
8
  attr_accessor :colors
8
9
 
9
- def initialize(*colors)
10
+ def initialize(*args)
10
11
  @colors = []
12
+ colors = (args.length == 1 && args[0].is_a?(Array)) ? args[0] : args
11
13
  colors.each do |color|
12
14
  self << color
13
15
  end
@@ -15,6 +17,7 @@ module Paleta
15
17
 
16
18
  def <<(color)
17
19
  color.is_a?(Color) ? @colors << color : raise(ArgumentError, "Passed argument is not a Color")
20
+ self
18
21
  end
19
22
 
20
23
  def push(color)
@@ -37,6 +40,20 @@ module Paleta
37
40
  @colors.size
38
41
  end
39
42
 
43
+ def each
44
+ @colors.each { |c| yield c }
45
+ end
46
+
47
+ def sort &blk
48
+ @colors.sort &blk
49
+ Paleta::Palette.new(@colors)
50
+ end
51
+
52
+ def sort! &blk
53
+ @colors.sort! &blk
54
+ self
55
+ end
56
+
40
57
  def include?(color)
41
58
  @colors.include?(color)
42
59
  end
@@ -81,7 +98,87 @@ module Paleta
81
98
 
82
99
  d1 + d2
83
100
  end
84
-
101
+
102
+ def self.generate(opts = {})
103
+ raise(ArgumentError, "Pass a Color using :from, generate( :from => Color )") if opts.empty?
104
+ color = opts[:from]
105
+ type = opts[:type] || :shades
106
+ size = opts[:size] || 5
107
+ case type
108
+ when :analogous; self.generate_analogous_palette_from_color(color, size)
109
+ when :monochromatic; self.generate_monochromatic_palette_from_color(color, size)
110
+ when :shades; self.generate_shades_palette_from_color(color, size)
111
+ when :random; self.generate_random_palette_from_color(color, size)
112
+ else raise(ArgumentError, "Palette type is not defined. Try :analogous, :monochromatic, :shades, or :random")
113
+ end
114
+ end
115
+
116
+ private
117
+
118
+ def self.generate_analogous_palette_from_color(color, n)
119
+ raise(ArgumentError, "Passed argument is not a Color") unless color.is_a?(Color)
120
+ palette = self.new(color)
121
+ step = 20
122
+ below = (n / 2)
123
+ above = (n % 2 == 0) ? (n / 2) - 1: (n / 2)
124
+ below.times do |i|
125
+ hue = color.hue - ((i + 1) * step)
126
+ hue += 360 if hue < 0
127
+ palette << Paleta::Color.new(:hsl, hue, color.saturation, color.lightness)
128
+ end
129
+ above.times do |i|
130
+ hue = color.hue + ((i + 1) * step)
131
+ hue -= 360 if hue > 360
132
+ palette << Paleta::Color.new(:hsl, hue, color.saturation, color.lightness)
133
+ end
134
+ palette.sort! { |a, b| a.hue <=> b.hue }
135
+ end
136
+
137
+ def self.generate_monochromatic_palette_from_color(color, n)
138
+ raise(ArgumentError, "Passed argument is not a Color") unless color.is_a?(Color)
139
+ palette = self.new(color)
140
+ step = (100 / n)
141
+ saturation = color.saturation
142
+ d = :down
143
+ until palette.size == n
144
+ saturation -= step if d == :down
145
+ saturation += step if d == :up
146
+ palette << Paleta::Color.new(:hsl, color.hue, saturation, color.lightness)
147
+ if saturation - step < 0
148
+ d = :up
149
+ saturation = color.saturation
150
+ end
151
+ end
152
+ palette.sort! { |a, b| a.saturation <=> b.saturation }
153
+ end
154
+
155
+ def self.generate_shades_palette_from_color(color, n)
156
+ raise(ArgumentError, "Passed argument is not a Color") unless color.is_a?(Color)
157
+ palette = self.new(color)
158
+ step = (100 / n)
159
+ lightness = color.lightness
160
+ d = :down
161
+ until palette.size == n
162
+ lightness -= step if d == :down
163
+ lightness += step if d == :up
164
+ palette << Paleta::Color.new(:hsl, color.hue, color.saturation, lightness)
165
+ if lightness - step < 0
166
+ d = :up
167
+ lightness = color.lightness
168
+ end
169
+ end
170
+ palette.sort! { |a, b| a.lightness <=> b.lightness }
171
+ end
172
+
173
+ def self.generate_random_palette_from_color(color = nil, n)
174
+ palette = color.is_a?(Color) ? self.new(color) : self.new
175
+ r = Random.new(Time.now.sec)
176
+ until palette.size == n
177
+ palette << Paleta::Color.new(r.rand(0..255), r.rand(0..255), r.rand(0..255))
178
+ end
179
+ palette
180
+ end
181
+
85
182
  def fit
86
183
  # create a 3xn matrix where n = @colors.size to represent the set of colors
87
184
  reds = @colors.map { |c| c.red }
@@ -1,3 +1,3 @@
1
1
  module Paleta
2
- VERSION = '0.0.3'
2
+ VERSION = '0.0.4'
3
3
  end
data/readme.markdown CHANGED
@@ -22,16 +22,16 @@ and run
22
22
 
23
23
  ### Color
24
24
 
25
- # create a color with HSL components
25
+ # create a Color with HSL components
26
26
  color = Paleta::Color.new(:hsl, 280, 37, 68)
27
27
 
28
- # create a color with RGB components
28
+ # create a Color with RGB components
29
29
  color = Paleta::Color.new(:rgb, 94, 161, 235)
30
30
 
31
- # create a color with a HEX value
31
+ # create a Color with a HEX value
32
32
  color = Paleta::Color.new(:hex, "5EA1EB")
33
33
 
34
- # creating a color with no flag defaults to RGB components
34
+ # creating a Color with no flag defaults to RGB components
35
35
  color = Paleta::Color.new(94, 161, 235)
36
36
 
37
37
  # access component values
@@ -53,11 +53,17 @@ and run
53
53
  # darken by a percentage
54
54
  color.darken!(10)
55
55
 
56
- # invert a color
56
+ # desaturate a Color
57
+ color.desaturate!
58
+
59
+ # convert a Color into its complement
60
+ color.complement!
61
+
62
+ # invert a Color
57
63
  color.invert!
58
64
 
59
65
  # calculate similarity between Colors
60
- # Color#similarity calculates the similarity between two colors and returns a
66
+ # Color#similarity calculates the similarity between two Colors and returns a
61
67
  # value in 0..1, with 0 being identical and 1 being as dissimilar as possible
62
68
  color2 = Paleta::Color.new(237, 172, 33)
63
69
  color.similarity(color2) # => 0.5609077061558945
@@ -68,8 +74,11 @@ and run
68
74
  color1 = Paleta::Color.new(13, 57, 182)
69
75
  color2 = Paleta::Color.new(94, 161, 235)
70
76
  color3 = Paleta::Color.new(237, 182, 17)
71
- palette = Paleta::Palette.new(color1, color2, color3)
72
-
77
+ palette = Paleta::Palette.new(color1, color2)
78
+
79
+ # add Colors to a Palette
80
+ palette << color3
81
+
73
82
  # retreive a Color from a Palette
74
83
  palette[1] # => color2
75
84
 
@@ -84,16 +93,33 @@ and run
84
93
  palette.invert!
85
94
 
86
95
  # calculate similarity of two Palettes
87
- color4 = Paleta::Color.new(13, 57, 182)
88
- color5 = Paleta::Color.new(237, 172, 33)
89
- palette1 = Paleta::Palette.new(color4, color5)
96
+ color1 = Paleta::Color.new(13, 57, 182)
97
+ color2 = Paleta::Color.new(237, 172, 33)
98
+ palette1 = Paleta::Palette.new(color1, color2)
90
99
 
91
- color6 = Paleta::Color.new(13, 57, 182)
92
- color7 = Paleta::Color.new(94, 161, 235)
93
- palette2 = Paleta::Palette.new(color6, color7)
94
-
100
+ color3 = Paleta::Color.new(13, 57, 182)
101
+ color4 = Paleta::Color.new(94, 161, 235)
102
+ palette2 = Paleta::Palette.new(color3, color4)
103
+
104
+ # Palette#similarity calculates the similarity between two Palettes and returns a
105
+ # value in 0..1, with 0 being identical and 1 being as dissimilar as possible
95
106
  palette1.similarity(palette2) # => 0.0046992695975874915
96
107
 
108
+ # generate random Palette
109
+ palette = Paleta::Palette.generate(:type => :random, :size = 5)
110
+
111
+ # generate a Palette of shades from a Color
112
+ color = Paleta::Color.new(:hex, "ff0000")
113
+ palette = Paleta::Palette.generate(:type => :shades, :from => color, :size => 5)
114
+
115
+ # generate a Palette of Colors analogous to the seed Color
116
+ color = Paleta::Color.new(:hex, "0066cc")
117
+ palette = Paleta::Palette.generate(:type => :analogous, :from => color, :size => 5)
118
+
119
+ # generate a Palette of Colors monochromatic to the seed Color
120
+ color = Paleta::Color.new(:hex, "336699")
121
+ palette = Paleta::Palette.generate(:type => :monochromatic, :from => color, :size => 5)
122
+
97
123
  See the [documentation](http://rubydoc.info/gems/paleta/ "Documentation").
98
124
 
99
125
 
@@ -16,10 +16,14 @@ describe Paleta::Color do
16
16
  end
17
17
 
18
18
  it "should initialize with the :hsl flag, hue in 0..360, and saturation and lightness in 0..100" do
19
- color = Paleta::Color.new(:hsl, 280, 37, 68)
20
- color.hue.should == 280
21
- color.saturation.should == 37
22
- color.lightness.should == 68
19
+ color = Paleta::Color.new(:hsl, 0, 0, 100)
20
+ color.hue.should == 0
21
+ color.saturation.should == 0
22
+ color.lightness.should == 100
23
+ color.red.should == 255
24
+ color.green.should == 255
25
+ color.blue.should == 255
26
+ color.hex.should == "FFFFFF"
23
27
  end
24
28
 
25
29
  it "should initialize with the :rgb flag with RGB components in 0..255" do
@@ -29,8 +33,28 @@ describe Paleta::Color do
29
33
  color.blue.should == 235
30
34
  end
31
35
 
32
- it "should not initialize with components not in 0..255" do
33
- expect{ Paleta::Color.new(-74, 333, 4321) }.to raise_error
36
+ it "should raise an error on an invalid format flag" do
37
+ expect{ Paleta::Color.new(:something, 50, 50, 50) }.to raise_error(ArgumentError)
38
+ end
39
+
40
+ it "should raise an error on an invalid hex string" do
41
+ expect{ Paleta::Color.new(:hex, "xkfjs") }.to raise_error(ArgumentError)
42
+ end
43
+
44
+ it "should raise an error on RGB components not in 0..255" do
45
+ expect{ Paleta::Color.new(-74, 333, 4321) }.to raise_error(ArgumentError)
46
+ end
47
+
48
+ it "should raise an error on hue not in 0..360" do
49
+ expect{ Paleta::Color.new(:hsl, 400, 50, 50) }.to raise_error(ArgumentError)
50
+ end
51
+
52
+ it "should raise an error on saturation not in 0..100" do
53
+ expect{ Paleta::Color.new(:hsl, 200, 150, 50) }.to raise_error(ArgumentError)
54
+ end
55
+
56
+ it "should raise an error on lightness not in 0..100" do
57
+ expect{ Paleta::Color.new(:hsl, 200, 50, 150) }.to raise_error(ArgumentError)
34
58
  end
35
59
 
36
60
  it "should calculate its HSL value on itialization" do
@@ -50,9 +74,9 @@ describe Paleta::Color do
50
74
 
51
75
  color.green = 123
52
76
  color.hue.to_i.should == 136
53
- color.saturation.to_i.should == 100
77
+ color.saturation.to_i.should == 99
54
78
  color.lightness.to_i.should == 24
55
-
79
+
56
80
  color.blue = 241
57
81
  color.hue.to_i.should == 209
58
82
  color.saturation.to_i.should == 100
@@ -61,24 +85,23 @@ describe Paleta::Color do
61
85
 
62
86
  it "should update its RGB value when its HSL value is updated" do
63
87
  color = Paleta::Color.new(0, 0, 255)
64
-
65
88
  color.hue = 120
66
- color.red.to_i.should == 255
67
- color.green.to_i.should == 85
89
+ color.red.to_i.should == 0
90
+ color.green.to_i.should == 255
68
91
  color.blue.to_i.should == 0
69
92
 
70
93
  color.saturation = 50
71
- color.red.to_i.should == 191
72
- color.green.to_i.should == 106
94
+ color.red.to_i.should == 63
95
+ color.green.to_i.should == 191
73
96
  color.blue.to_i.should == 63
74
-
97
+
75
98
  color.lightness = 80
76
- color.red.to_i.should == 229
77
- color.green.to_i.should == 195
99
+ color.red.to_i.should == 178
100
+ color.green.to_i.should == 229
78
101
  color.blue.to_i.should == 178
79
102
  end
80
103
 
81
- it "should lighten by a percentage, " do
104
+ it "should lighten itself by a percentage" do
82
105
  color = Paleta::Color.new(94, 161, 235)
83
106
  lightness = color.lightness
84
107
  color.lighten!
@@ -88,6 +111,14 @@ describe Paleta::Color do
88
111
  color.lightness.should == lightness + 20
89
112
  end
90
113
 
114
+ it "should return a copy of itself, lightened by a percentage" do
115
+ color = Paleta::Color.new(94, 161, 235)
116
+ lightness = color.lightness
117
+ copy = color.lighten(20)
118
+ copy.lightness.should == lightness + 20
119
+ color.lightness.should == lightness
120
+ end
121
+
91
122
  it "should quietly maintain a maximum of 100 when lightening" do
92
123
  color = Paleta::Color.new(94, 161, 235)
93
124
  color.lighten!(300)
@@ -104,6 +135,14 @@ describe Paleta::Color do
104
135
  color.lightness.should == lightness - 20
105
136
  end
106
137
 
138
+ it "should return a copy of itself, darkened by a percentage" do
139
+ color = Paleta::Color.new(94, 161, 235)
140
+ lightness = color.lightness
141
+ copy = color.darken(20)
142
+ copy.lightness.should == lightness - 20
143
+ color.lightness.should == lightness
144
+ end
145
+
107
146
  it "should quietly maintain a minimum of 0 when darkening" do
108
147
  color = Paleta::Color.new(94, 161, 235)
109
148
  color.darken!(300)
@@ -118,6 +157,51 @@ describe Paleta::Color do
118
157
  color.blue.should == 20
119
158
  end
120
159
 
160
+ it "should return an inverted copy of itself" do
161
+ color = Paleta::Color.new(94, 161, 235)
162
+ copy = color.invert
163
+ copy.red.should == 161
164
+ copy.green.should == 94
165
+ copy.blue.should == 20
166
+ color.red.should == 94
167
+ color.green.should == 161
168
+ color.blue.should == 235
169
+ end
170
+
171
+ it "should desaturate" do
172
+ color = Paleta::Color.new(94, 161, 235)
173
+ color.desaturate!
174
+ color.saturation.should == 0
175
+ color.red.to_i.should == 164
176
+ color.green.to_i.should == 164
177
+ color.blue.to_i.should == 164
178
+ end
179
+
180
+ it "should return a desaturated copy of itself" do
181
+ color = Paleta::Color.new(94, 161, 235)
182
+ copy = color.desaturate
183
+ copy.saturation.should == 0
184
+ copy.red.to_i.should == 164
185
+ copy.green.to_i.should == 164
186
+ copy.blue.to_i.should == 164
187
+ color.saturation.to_i.should == 77
188
+ color.red.should == 94
189
+ color.green.should == 161
190
+ color.blue.should == 235
191
+ end
192
+
193
+ it "should become its complement" do
194
+ color = Paleta::Color.new(:hsl, 90, 50, 50)
195
+ color.complement!
196
+ color.hue.should == 270
197
+ end
198
+
199
+ it "should return its complement Color" do
200
+ color = Paleta::Color.new(:hsl, 90, 50, 50)
201
+ complement = color.complement
202
+ complement.hue.should == 270
203
+ end
204
+
121
205
  it "should calculate its similarity to another Color" do
122
206
  color1 = Paleta::Color.new(94, 161, 235)
123
207
  color2 = Paleta::Color.new(237, 172, 33)
@@ -138,7 +222,7 @@ describe Paleta::Color do
138
222
  end
139
223
 
140
224
  it "should update its HSB and RGB components when its HEX value is updated" do
141
- color = Paleta::Color.new
225
+ color = Paleta::Color.new(100, 100, 100)
142
226
  color.hex = "ffffff"
143
227
  color.red.should == 255
144
228
  color.green.should == 255
@@ -11,14 +11,15 @@ describe Paleta::Palette do
11
11
  it "should not initialize if an object in the set is not a Color" do
12
12
  c1 = Paleta::Color.new(13, 57, 182)
13
13
  c2 = 13
14
- expect{ Paleta::Palette.new(c1, c2) }.to raise_error
14
+ expect{ Paleta::Palette.new(c1, c2) }.to raise_error(ArgumentError)
15
15
  end
16
16
 
17
17
  it "should add Colors" do
18
18
  c1 = Paleta::Color.new(13, 57, 182)
19
19
  c2 = Paleta::Color.new(94, 161, 235)
20
+ c3 = Paleta::Color.new(0, 0, 0)
20
21
  palette = Paleta::Palette.new(c1)
21
- palette << c2
22
+ palette << c2 << c3
22
23
  palette.include?(c2).should be_true
23
24
  end
24
25
 
@@ -92,6 +93,7 @@ describe Paleta::Palette do
92
93
  end
93
94
 
94
95
  it "should calculate a multiple regression over each Color in the Palette in RGB space" do
96
+ Paleta::Palette.send(:public, :fit)
95
97
  c1 = Paleta::Color.new(13, 57, 182)
96
98
  c2 = Paleta::Color.new(94, 161, 235)
97
99
  c3 = Paleta::Color.new(237, 172, 33)
@@ -132,4 +134,53 @@ describe Paleta::Palette do
132
134
  p6 = Paleta::Palette.new(c9, c10)
133
135
  p5.similarity(p6).round(5).should == 0.0047
134
136
  end
137
+
138
+ it "should generate a new Palette of shades of a single Color" do
139
+ color = Paleta::Color.new(:hex, "ff0000")
140
+ palette = Paleta::Palette.generate(:from => color, :size => 5)
141
+ palette.each do |p|
142
+ p.hue.should == color.hue
143
+ p.saturation.should == color.saturation
144
+ end
145
+
146
+ palette[0].lightness.should == 10
147
+ palette[1].lightness.should == 30
148
+ palette[2].lightness.should == 50
149
+ palette[3].lightness.should == 70
150
+ palette[4].lightness.should == 90
151
+ end
152
+
153
+ it "should generate a new Palette of Colors analogous to the seed Color" do
154
+ color = Paleta::Color.new(:hex, "0066cc")
155
+ palette = Paleta::Palette.generate(:type => :analogous, :from => color, :size => 5)
156
+ palette.each do |p|
157
+ p.lightness.should == color.lightness
158
+ p.saturation.should == color.saturation
159
+ end
160
+ palette[0].hue.should == 170
161
+ palette[1].hue.should == 190
162
+ palette[2].hue.should == 210
163
+ palette[3].hue.should == 230
164
+ palette[4].hue.should == 250
165
+ end
166
+
167
+ it "should generate a new Palette of Colors monochromatic to the seed Color" do
168
+ color = Paleta::Color.new(:hex, "0066cc")
169
+ palette = Paleta::Palette.generate(:type => :monochromatic, :from => color, :size => 5)
170
+ palette.each do |p|
171
+ p.hue.should == color.hue
172
+ p.lightness.should == color.lightness
173
+ end
174
+ palette[0].saturation.should == 20
175
+ palette[1].saturation.should == 40
176
+ palette[2].saturation.should == 60
177
+ palette[3].saturation.should == 80
178
+ palette[4].saturation.should == 100
179
+
180
+ end
181
+
182
+ it "should generate a new Palette of random Colors" do
183
+ palette = Paleta::Palette.generate(:type => :random, :size => 5)
184
+ palette.size.should == 5
185
+ end
135
186
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: paleta
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
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: 2012-01-07 00:00:00.000000000Z
12
+ date: 2012-01-11 00:00:00.000000000Z
13
13
  dependencies: []
14
14
  description: A gem for working with color palettes
15
15
  email: