paleta 0.0.1

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.
@@ -0,0 +1,4 @@
1
+ .DS_Store
2
+ .rspec
3
+ Gemfile.lock
4
+ Guardfile
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ gem 'rspec', '~>2.7.0'
6
+ gem 'guard-rspec'
@@ -0,0 +1,6 @@
1
+ require 'paleta/version'
2
+ require 'paleta/color'
3
+ require 'paleta/palette'
4
+
5
+ module Paleta
6
+ end
@@ -0,0 +1,117 @@
1
+ module Paleta
2
+ class Color
3
+
4
+ attr_reader :red, :green, :blue, :hue, :saturation, :lightness
5
+
6
+ def initialize(red = 0, green = 0, blue = 0)
7
+ self.red = red
8
+ self.green = green
9
+ self.blue = blue
10
+ end
11
+
12
+ def red=(val)
13
+ @red = range_validator(val, 0..255)
14
+ update_hsl
15
+ end
16
+
17
+ def green=(val)
18
+ @green = range_validator(val, 0..255)
19
+ update_hsl
20
+ end
21
+
22
+ def blue=(val)
23
+ @blue = range_validator(val, 0..255)
24
+ update_hsl
25
+ end
26
+
27
+ def lightness=(val)
28
+ @lightness = range_validator(val, 0..100)
29
+ update_rgb
30
+ end
31
+
32
+ def saturation=(val)
33
+ @saturation = range_validator(val, 0..100)
34
+ update_rgb
35
+ end
36
+
37
+ def hue=(val)
38
+ @hue = range_validator(val, 0..360)
39
+ update_rgb
40
+ end
41
+
42
+ private
43
+
44
+ def update_hsl
45
+ r = @red / 255.0 rescue 0
46
+ g = @green / 255.0 rescue 0
47
+ b = @blue / 255.0 rescue 0
48
+
49
+ min = [r, g, b].min
50
+ max = [r, g, b].max
51
+ delta = max - min
52
+
53
+ @hue = 0
54
+ @saturation = 0
55
+ @lightness = (max + min) / 2.0
56
+
57
+ if delta != 0
58
+ @saturation = (@lightness < 0.5) ? delta / (max + min) : delta / (2.0 - max - min)
59
+ case max
60
+ when r; @hue = (g - b) / delta
61
+ when g; @hue = 2 + (b - r) / delta
62
+ when b; @hue = 4 + (r - g) / delta
63
+ end
64
+ end
65
+ @hue *= 60
66
+ @hue += 360 if @hue < 0
67
+ @saturation *= 100
68
+ @lightness *= 100
69
+ end
70
+
71
+ def update_rgb
72
+
73
+ h = @hue / 360.0
74
+ s = @saturation / 100.0
75
+ l = @lightness / 100.0
76
+
77
+ if s == 0
78
+ r = l * 255
79
+ g = l * 255
80
+ b = l * 255
81
+ else
82
+ th = h / 6.0
83
+ if l < 0.5
84
+ t2 = l * (s + 1)
85
+ else
86
+ t2 = (l + s) - (l * s)
87
+ end
88
+ t1 = 2 * l - t2
89
+
90
+ tr = th + (1.0 / 3.0)
91
+ tg = th
92
+ tb = th - (1.0 / 3.0)
93
+
94
+ tr = hue_calc(tr, t1, t2)
95
+ tg = hue_calc(tg, t1, t2)
96
+ tb = hue_calc(tb, t1, t2)
97
+
98
+ @red = tr * 255.0
99
+ @green = tg * 255.0
100
+ @blue = tb * 255.0
101
+ end
102
+ end
103
+
104
+ def hue_calc(value, t1, t2)
105
+ value += 1 if value < 0
106
+ value -= 1 if value > 1
107
+ return (t1 + (t2 - t1) * 6 * value) if 6 * value < 1
108
+ return t2 if 2 * value < 1
109
+ return (t1 + (t2 - t1) * (2.0 / 3.0 - value) * 6) if 3 * value < 2
110
+ return t1;
111
+ end
112
+
113
+ def range_validator(val, range)
114
+ range.include?(val) ? val : raise(ArgumentError, "Component range exceeded")
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,25 @@
1
+ module Paleta
2
+ class Palette
3
+
4
+ attr_accessor :colors
5
+
6
+ def initialize(*colors)
7
+ @colors = []
8
+ colors.each do |color|
9
+ self << color
10
+ end
11
+ end
12
+
13
+ def <<(color)
14
+ color.is_a?(Color) ? @colors << color : raise(ArgumentError, "Passed argument is not a Color")
15
+ end
16
+
17
+ def [](i)
18
+ @colors[i]
19
+ end
20
+
21
+ def include?(color)
22
+ @colors.include?(color)
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,3 @@
1
+ module Paleta
2
+ VERSION = '0.0.1'
3
+ end
@@ -0,0 +1,17 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/paleta/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ['Jordan Stephens']
6
+ gem.email = ['iam@jordanstephens.net']
7
+ gem.description = 'color palette gem'
8
+ gem.summary = 'color palette gem'
9
+ gem.homepage = 'http://jordanstephens.net'
10
+
11
+ gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
12
+ gem.files = `git ls-files`.split("\n")
13
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
14
+ gem.name = 'paleta'
15
+ gem.require_paths = ['lib']
16
+ gem.version = Paleta::VERSION
17
+ end
@@ -0,0 +1,59 @@
1
+ require 'spec_helper'
2
+
3
+ describe Paleta::Color do
4
+ it "should initialize with components in 0..255" do
5
+ color = Paleta::Color.new(94, 161, 235)
6
+ color.red.should == 94
7
+ color.green.should == 161
8
+ color.blue.should == 235
9
+ end
10
+
11
+ it "should not initialize with components not in 0..255" do
12
+ expect{ Paleta::Color.new(-74, 333, 4321) }.to raise_error
13
+ end
14
+
15
+ it "should calculate its HSL value on itialization" do
16
+ color = Paleta::Color.new(237, 172, 33)
17
+ color.hue.to_i.should == 40
18
+ color.saturation.to_i.should == 85
19
+ color.lightness.to_i.should == 52
20
+ end
21
+
22
+ it "should update its HSL value when its RGB value is updated" do
23
+ color = Paleta::Color.new(237, 172, 33)
24
+
25
+ color.red = 0
26
+ color.hue.to_i.should == 131
27
+ color.saturation.to_i.should == 100
28
+ color.lightness.to_i.should == 33
29
+
30
+ color.green = 123
31
+ color.hue.to_i.should == 136
32
+ color.saturation.to_i.should == 100
33
+ color.lightness.to_i.should == 24
34
+
35
+ color.blue = 241
36
+ color.hue.to_i.should == 209
37
+ color.saturation.to_i.should == 100
38
+ color.lightness.to_i.should == 47
39
+ end
40
+
41
+ it "should update its RGB value when its HSL value is updated" do
42
+ color = Paleta::Color.new(0, 0, 255)
43
+
44
+ color.hue = 120
45
+ color.red.to_i.should == 255
46
+ color.green.to_i.should == 85
47
+ color.blue.to_i.should == 0
48
+
49
+ color.saturation = 50
50
+ color.red.to_i.should == 191
51
+ color.green.to_i.should == 106
52
+ color.blue.to_i.should == 63
53
+
54
+ color.lightness = 80
55
+ color.red.to_i.should == 229
56
+ color.green.to_i.should == 195
57
+ color.blue.to_i.should == 178
58
+ end
59
+ end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe Paleta::Palette do
4
+
5
+ it "should initialize with a set of Colors" do
6
+ c1 = Paleta::Color.new(13, 57, 182)
7
+ c2 = Paleta::Color.new(94, 161, 235)
8
+ Paleta::Palette.new(c1, c2)
9
+ end
10
+
11
+ it "should not initialize if an object in the set is not a Color" do
12
+ c1 = Paleta::Color.new(13, 57, 182)
13
+ c2 = 13
14
+ expect{ Paleta::Palette.new(c1, c2) }.to raise_error
15
+ end
16
+
17
+ it "should add colors to an initialized palette" do
18
+ c1 = Paleta::Color.new(13, 57, 182)
19
+ c2 = Paleta::Color.new(94, 161, 235)
20
+ palette = Paleta::Palette.new(c1)
21
+ palette << c2
22
+ palette.include?(c2).should be_true
23
+ end
24
+
25
+ it "should allow array-style accessing of colors" do
26
+ c1 = Paleta::Color.new(13, 57, 182)
27
+ palette = Paleta::Palette.new(c1)
28
+ palette[0].should == c1
29
+ palette[1].should be_nil
30
+ end
31
+ end
@@ -0,0 +1,2 @@
1
+ require 'rspec'
2
+ require 'paleta'
metadata ADDED
@@ -0,0 +1,58 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: paleta
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Jordan Stephens
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-01-02 00:00:00.000000000Z
13
+ dependencies: []
14
+ description: color palette gem
15
+ email:
16
+ - iam@jordanstephens.net
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - .gitignore
22
+ - Gemfile
23
+ - lib/paleta.rb
24
+ - lib/paleta/color.rb
25
+ - lib/paleta/palette.rb
26
+ - lib/paleta/version.rb
27
+ - paleta.gemspec
28
+ - spec/models/color_spec.rb
29
+ - spec/models/palette_spec.rb
30
+ - spec/spec_helper.rb
31
+ homepage: http://jordanstephens.net
32
+ licenses: []
33
+ post_install_message:
34
+ rdoc_options: []
35
+ require_paths:
36
+ - lib
37
+ required_ruby_version: !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - ! '>='
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ required_rubygems_version: !ruby/object:Gem::Requirement
44
+ none: false
45
+ requirements:
46
+ - - ! '>='
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ requirements: []
50
+ rubyforge_project:
51
+ rubygems_version: 1.8.10
52
+ signing_key:
53
+ specification_version: 3
54
+ summary: color palette gem
55
+ test_files:
56
+ - spec/models/color_spec.rb
57
+ - spec/models/palette_spec.rb
58
+ - spec/spec_helper.rb