wdd-ruby-ext 0.4.4 → 0.5.0
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.
- data/.rvmrc +1 -1
- data/Gemfile +10 -1
- data/Gemfile.lock +22 -1
- data/VERSION +1 -1
- data/lib/wdd-ruby-ext/utils/rgb_color.rb +162 -0
- data/wdd-ruby-ext.gemspec +15 -8
- metadata +82 -23
data/.rvmrc
CHANGED
@@ -1 +1 @@
|
|
1
|
-
rvm use
|
1
|
+
rvm use ree-head@wdd
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,13 +1,34 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
wdd-ruby-ext (0.
|
4
|
+
wdd-ruby-ext (0.4.4)
|
5
|
+
eventmachine (~> 0.12.10)
|
6
|
+
nokogiri (~> 1.4.1)
|
7
|
+
wdd-ruby-ext
|
5
8
|
|
6
9
|
GEM
|
10
|
+
remote: http://rubygems.org/
|
7
11
|
specs:
|
12
|
+
eventmachine (0.12.10)
|
13
|
+
git (1.2.5)
|
14
|
+
jeweler (1.8.4)
|
15
|
+
bundler (~> 1.0)
|
16
|
+
git (>= 1.2.5)
|
17
|
+
rake
|
18
|
+
rdoc
|
19
|
+
json (1.7.5)
|
20
|
+
nokogiri (1.4.7)
|
21
|
+
rake (0.8.7)
|
22
|
+
rdoc (3.12)
|
23
|
+
json (~> 1.4)
|
24
|
+
rspec (1.3.2)
|
8
25
|
|
9
26
|
PLATFORMS
|
10
27
|
ruby
|
11
28
|
|
12
29
|
DEPENDENCIES
|
30
|
+
eventmachine (~> 0.12.10)
|
31
|
+
jeweler
|
32
|
+
nokogiri (~> 1.4.1)
|
33
|
+
rspec (~> 1.3)
|
13
34
|
wdd-ruby-ext!
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.5.0
|
@@ -0,0 +1,162 @@
|
|
1
|
+
if $0 == __FILE__
|
2
|
+
require 'rubygems'
|
3
|
+
require 'wdd-ruby-ext'
|
4
|
+
end
|
5
|
+
|
6
|
+
module WDD
|
7
|
+
module Utils
|
8
|
+
class RGBColor
|
9
|
+
attr :red, true
|
10
|
+
attr :green, true
|
11
|
+
attr :blue, true
|
12
|
+
|
13
|
+
def initialize( *args )
|
14
|
+
if args.length == 0
|
15
|
+
raise "Must supply initializer arguments"
|
16
|
+
elsif args.length ==1
|
17
|
+
raise "Single argument must be a string" if !args[0].is_a?( String )
|
18
|
+
hex_color_string = args[0]
|
19
|
+
|
20
|
+
if matches = hex_color_string.match( /#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})/ )
|
21
|
+
@red = ("%02d" % "0x#{matches[1]}").to_i
|
22
|
+
@green = ("%02d" % "0x#{matches[2]}").to_i
|
23
|
+
@blue = ("%02d" % "0x#{matches[3]}").to_i
|
24
|
+
elsif matches = hex_color_string.match( /#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})/ )
|
25
|
+
@red = ("%02d" % "0x#{matches[1]}#{matches[1]}").to_i
|
26
|
+
@green = ("%02d" % "0x#{matches[2]}#{matches[2]}").to_i
|
27
|
+
@blue = ("%02d" % "0x#{matches[3]}#{matches[3]}").to_i
|
28
|
+
else
|
29
|
+
raise "Invalid RGB hex color code #{hex_color_string}" if !matches
|
30
|
+
end
|
31
|
+
elsif args.length == 3
|
32
|
+
args.each do |arg|
|
33
|
+
arg = arg.to_i
|
34
|
+
raise "Invalid color value #{arg}" if !arg.is_a?( Fixnum ) || arg<0 || arg > 255
|
35
|
+
end
|
36
|
+
@red = args[0]
|
37
|
+
@green = args[1]
|
38
|
+
@blue = args[2]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def to_hex
|
43
|
+
("%02x" % @red) + ("%02x" % @green) + ("%02x" % @blue)
|
44
|
+
end
|
45
|
+
|
46
|
+
def to_hex!
|
47
|
+
'#' + to_hex
|
48
|
+
end
|
49
|
+
|
50
|
+
# Lightens the color by +percentage+
|
51
|
+
def lighten percentage
|
52
|
+
raise "Invalid multiplier #{multiplier}. Should be >= 0 and <= 100." if percentage < 0 || percentage > 100
|
53
|
+
multiplier = percentage.to_f / 100
|
54
|
+
new_red = (@red+(multiplier*(255-@red))).min(255).to_i
|
55
|
+
new_green = (@green+(multiplier*(255-@green))).min(255).to_i
|
56
|
+
new_blue = (@blue+(multiplier*(255-@blue))).min(255).to_i
|
57
|
+
return RGBColor.new( new_red, new_green, new_blue )
|
58
|
+
end
|
59
|
+
|
60
|
+
# Darkens the color by +percentage+
|
61
|
+
def darken percentage
|
62
|
+
raise "Invalid multiplier #{multiplier}. Should be >= 0 and <= 100." if percentage < 0 || percentage > 100
|
63
|
+
multiplier = percentage.to_f / 100
|
64
|
+
new_red = (@red-multiplier*@red).min(255).to_i
|
65
|
+
new_green = (@green-multiplier*@green).min(255).to_i
|
66
|
+
new_blue = (@blue-multiplier*@blue).min(255).to_i
|
67
|
+
return RGBColor.new( new_red, new_green, new_blue )
|
68
|
+
end
|
69
|
+
|
70
|
+
def saturation
|
71
|
+
least_val = @red.min(@green).min(@blue)
|
72
|
+
most_val = @red.max(@green).max(@blue)
|
73
|
+
saturation_level = (most_val - least_val).to_f / most_val * 100
|
74
|
+
end
|
75
|
+
|
76
|
+
def saturate percentage
|
77
|
+
min_val = 0
|
78
|
+
multiplier = percentage.to_f / 100
|
79
|
+
most_val = @red.max(@green).max(@blue)
|
80
|
+
return self.dup if most_val <= min_val
|
81
|
+
least_val = @red.min(@green).min(@blue)
|
82
|
+
red_ratio = 1.0 - @red.to_f / most_val
|
83
|
+
green_ratio = 1.0 - @green.to_f / most_val
|
84
|
+
blue_ratio = 1.0 - @blue.to_f / most_val
|
85
|
+
new_red = @red - red_ratio * (@red - min_val) * multiplier
|
86
|
+
new_green = @green - green_ratio * (@green - min_val) * multiplier
|
87
|
+
new_blue = @blue - blue_ratio * (@blue - min_val) * multiplier
|
88
|
+
# puts "@red: #{@red}"
|
89
|
+
# puts "@green: #{@green}"
|
90
|
+
# puts "@blue: #{@blue}"
|
91
|
+
# puts "new_red: #{new_red}"
|
92
|
+
# puts "new_green: #{new_green}"
|
93
|
+
# puts "new_blue: #{new_blue}"
|
94
|
+
return RGBColor.new( new_red.to_i, new_green.to_i, new_blue.to_i )
|
95
|
+
end
|
96
|
+
|
97
|
+
def desaturate percentage
|
98
|
+
multiplier = (100.0 - percentage.to_f) / 100
|
99
|
+
most_val = @red.max(@green).max(@blue)
|
100
|
+
least_val = @red.min(@green).min(@blue)
|
101
|
+
range = most_val
|
102
|
+
red_ratio = 1.0 - @red.to_f / most_val
|
103
|
+
green_ratio = 1.0 - @green.to_f / most_val
|
104
|
+
blue_ratio = 1.0 - @blue.to_f / most_val
|
105
|
+
highest_ratio = red_ratio.max(green_ratio).max(blue_ratio)
|
106
|
+
new_red = most_val - red_ratio * range * multiplier
|
107
|
+
new_green = most_val - green_ratio * range * multiplier
|
108
|
+
new_blue = most_val - blue_ratio * range * multiplier
|
109
|
+
return RGBColor.new( new_red.to_i, new_green.to_i, new_blue.to_i )
|
110
|
+
end
|
111
|
+
|
112
|
+
def self.color_cycle start, arc_step_in_degrees, iterations, desaturation=0, darken=0
|
113
|
+
angle = 0
|
114
|
+
two_thirds_PI = 2.0 * Math::PI / 3
|
115
|
+
four_thirds_PI = 4.0 * Math::PI / 3
|
116
|
+
half_PI = Math::PI / 2
|
117
|
+
colors = []
|
118
|
+
iterations.times do |i|
|
119
|
+
angle = ((start + i*arc_step_in_degrees) * Math::PI * 2) / 360
|
120
|
+
red = (Math.cos(angle) + 1) / 2 * 255
|
121
|
+
green = (Math.cos(angle + two_thirds_PI) + 1) / 2 * 255
|
122
|
+
blue = (Math.cos(angle + four_thirds_PI) +1) / 2 * 255
|
123
|
+
desat = (Math.cos(i)+1) / 2 * 60
|
124
|
+
dark = (Math.cos(i*2)+1) / 2 * 20
|
125
|
+
color = RGBColor.new(red, green, blue).saturate(desat).darken(dark).desaturate(desaturation).darken(darken)
|
126
|
+
colors << color
|
127
|
+
yield color if block_given?
|
128
|
+
end
|
129
|
+
colors
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
|
134
|
+
if $0 == __FILE__
|
135
|
+
color = RGBColor.new( "FF8800" )
|
136
|
+
puts color.to_hex
|
137
|
+
puts color.to_hex!
|
138
|
+
color = RGBColor.new( 0xAA, 0x88, 0x44 )
|
139
|
+
puts color.to_hex
|
140
|
+
puts color.to_hex!
|
141
|
+
puts color.saturation
|
142
|
+
puts
|
143
|
+
puts color.saturate( 0 ).to_hex
|
144
|
+
puts color.saturate( 50 ).to_hex
|
145
|
+
puts color.saturate( 100 ).to_hex
|
146
|
+
puts
|
147
|
+
puts color.desaturate( 0 ).to_hex
|
148
|
+
puts color.desaturate( 50 ).to_hex
|
149
|
+
puts color.desaturate( 100 ).to_hex
|
150
|
+
puts color.lighten( 0 ).to_hex
|
151
|
+
puts color.lighten( 50 ).to_hex
|
152
|
+
puts color.lighten( 100 ).to_hex
|
153
|
+
puts color.darken( 0 ).to_hex
|
154
|
+
puts color.darken( 50 ).to_hex
|
155
|
+
puts color.darken( 100 ).to_hex
|
156
|
+
color = RGBColor.new( "#888" )
|
157
|
+
puts color.to_hex
|
158
|
+
|
159
|
+
colors = RGBColor.color_cycle( 0, 20, 16) {|rgb| puts rgb.to_hex!}
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
data/wdd-ruby-ext.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{wdd-ruby-ext}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.5.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["shock"]
|
12
|
-
s.date = %q{
|
12
|
+
s.date = %q{2012-09-14}
|
13
13
|
s.description = %q{Some of these are borrowed. Some are original. This gem simply provides a single place to source control them all for incorporation into other projects.}
|
14
14
|
s.email = %q{github@wdoughty.net}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -41,6 +41,7 @@ Gem::Specification.new do |s|
|
|
41
41
|
"lib/wdd-ruby-ext/utils/helpers.rb",
|
42
42
|
"lib/wdd-ruby-ext/utils/miscellany.rb",
|
43
43
|
"lib/wdd-ruby-ext/utils/pretty_xml.rb",
|
44
|
+
"lib/wdd-ruby-ext/utils/rgb_color.rb",
|
44
45
|
"lib/wdd-ruby-ext/utils/simpledebug.rb",
|
45
46
|
"lib/wdd-ruby-ext/utils/spinner.rb",
|
46
47
|
"lib/wdd-ruby-ext/utils/test_server.rb",
|
@@ -56,12 +57,6 @@ Gem::Specification.new do |s|
|
|
56
57
|
s.require_paths = ["lib"]
|
57
58
|
s.rubygems_version = %q{1.3.7}
|
58
59
|
s.summary = %q{Handy extensions to the Ruby base classes and other utilities.}
|
59
|
-
s.test_files = [
|
60
|
-
"spec/lib/utils/fixed_point_spec.rb",
|
61
|
-
"spec/lib/utils/pretty_xml_spec.rb",
|
62
|
-
"spec/spec_helper.rb",
|
63
|
-
"spec/wdd-ruby-ext_spec.rb"
|
64
|
-
]
|
65
60
|
|
66
61
|
if s.respond_to? :specification_version then
|
67
62
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
@@ -69,17 +64,29 @@ Gem::Specification.new do |s|
|
|
69
64
|
|
70
65
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
71
66
|
s.add_runtime_dependency(%q<wdd-ruby-ext>, [">= 0"])
|
67
|
+
s.add_runtime_dependency(%q<nokogiri>, ["~> 1.4.1"])
|
68
|
+
s.add_runtime_dependency(%q<eventmachine>, ["~> 0.12.10"])
|
69
|
+
s.add_runtime_dependency(%q<jeweler>, [">= 0"])
|
70
|
+
s.add_development_dependency(%q<rspec>, ["~> 1.3"])
|
72
71
|
s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
|
73
72
|
s.add_runtime_dependency(%q<nokogiri>, ["~> 1.4.1"])
|
74
73
|
s.add_runtime_dependency(%q<eventmachine>, ["~> 0.12.10"])
|
75
74
|
else
|
76
75
|
s.add_dependency(%q<wdd-ruby-ext>, [">= 0"])
|
76
|
+
s.add_dependency(%q<nokogiri>, ["~> 1.4.1"])
|
77
|
+
s.add_dependency(%q<eventmachine>, ["~> 0.12.10"])
|
78
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
79
|
+
s.add_dependency(%q<rspec>, ["~> 1.3"])
|
77
80
|
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
78
81
|
s.add_dependency(%q<nokogiri>, ["~> 1.4.1"])
|
79
82
|
s.add_dependency(%q<eventmachine>, ["~> 0.12.10"])
|
80
83
|
end
|
81
84
|
else
|
82
85
|
s.add_dependency(%q<wdd-ruby-ext>, [">= 0"])
|
86
|
+
s.add_dependency(%q<nokogiri>, ["~> 1.4.1"])
|
87
|
+
s.add_dependency(%q<eventmachine>, ["~> 0.12.10"])
|
88
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
89
|
+
s.add_dependency(%q<rspec>, ["~> 1.3"])
|
83
90
|
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
84
91
|
s.add_dependency(%q<nokogiri>, ["~> 1.4.1"])
|
85
92
|
s.add_dependency(%q<eventmachine>, ["~> 0.12.10"])
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wdd-ruby-ext
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 11
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 5
|
9
|
+
- 0
|
10
|
+
version: 0.5.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- shock
|
@@ -15,13 +15,11 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2012-09-14 00:00:00 -05:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
22
|
prerelease: false
|
23
|
-
type: :runtime
|
24
|
-
name: wdd-ruby-ext
|
25
23
|
version_requirements: &id001 !ruby/object:Gem::Requirement
|
26
24
|
none: false
|
27
25
|
requirements:
|
@@ -31,12 +29,73 @@ dependencies:
|
|
31
29
|
segments:
|
32
30
|
- 0
|
33
31
|
version: "0"
|
32
|
+
name: wdd-ruby-ext
|
34
33
|
requirement: *id001
|
34
|
+
type: :runtime
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
36
|
prerelease: false
|
37
|
-
type: :development
|
38
|
-
name: rspec
|
39
37
|
version_requirements: &id002 !ruby/object:Gem::Requirement
|
38
|
+
none: false
|
39
|
+
requirements:
|
40
|
+
- - ~>
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
hash: 5
|
43
|
+
segments:
|
44
|
+
- 1
|
45
|
+
- 4
|
46
|
+
- 1
|
47
|
+
version: 1.4.1
|
48
|
+
name: nokogiri
|
49
|
+
requirement: *id002
|
50
|
+
type: :runtime
|
51
|
+
- !ruby/object:Gem::Dependency
|
52
|
+
prerelease: false
|
53
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
54
|
+
none: false
|
55
|
+
requirements:
|
56
|
+
- - ~>
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
hash: 59
|
59
|
+
segments:
|
60
|
+
- 0
|
61
|
+
- 12
|
62
|
+
- 10
|
63
|
+
version: 0.12.10
|
64
|
+
name: eventmachine
|
65
|
+
requirement: *id003
|
66
|
+
type: :runtime
|
67
|
+
- !ruby/object:Gem::Dependency
|
68
|
+
prerelease: false
|
69
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
70
|
+
none: false
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
hash: 3
|
75
|
+
segments:
|
76
|
+
- 0
|
77
|
+
version: "0"
|
78
|
+
name: jeweler
|
79
|
+
requirement: *id004
|
80
|
+
type: :runtime
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
prerelease: false
|
83
|
+
version_requirements: &id005 !ruby/object:Gem::Requirement
|
84
|
+
none: false
|
85
|
+
requirements:
|
86
|
+
- - ~>
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
hash: 9
|
89
|
+
segments:
|
90
|
+
- 1
|
91
|
+
- 3
|
92
|
+
version: "1.3"
|
93
|
+
name: rspec
|
94
|
+
requirement: *id005
|
95
|
+
type: :development
|
96
|
+
- !ruby/object:Gem::Dependency
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: &id006 !ruby/object:Gem::Requirement
|
40
99
|
none: false
|
41
100
|
requirements:
|
42
101
|
- - ">="
|
@@ -47,12 +106,12 @@ dependencies:
|
|
47
106
|
- 2
|
48
107
|
- 9
|
49
108
|
version: 1.2.9
|
50
|
-
|
109
|
+
name: rspec
|
110
|
+
requirement: *id006
|
111
|
+
type: :development
|
51
112
|
- !ruby/object:Gem::Dependency
|
52
113
|
prerelease: false
|
53
|
-
|
54
|
-
name: nokogiri
|
55
|
-
version_requirements: &id003 !ruby/object:Gem::Requirement
|
114
|
+
version_requirements: &id007 !ruby/object:Gem::Requirement
|
56
115
|
none: false
|
57
116
|
requirements:
|
58
117
|
- - ~>
|
@@ -63,12 +122,12 @@ dependencies:
|
|
63
122
|
- 4
|
64
123
|
- 1
|
65
124
|
version: 1.4.1
|
66
|
-
|
125
|
+
name: nokogiri
|
126
|
+
requirement: *id007
|
127
|
+
type: :runtime
|
67
128
|
- !ruby/object:Gem::Dependency
|
68
129
|
prerelease: false
|
69
|
-
|
70
|
-
name: eventmachine
|
71
|
-
version_requirements: &id004 !ruby/object:Gem::Requirement
|
130
|
+
version_requirements: &id008 !ruby/object:Gem::Requirement
|
72
131
|
none: false
|
73
132
|
requirements:
|
74
133
|
- - ~>
|
@@ -79,7 +138,9 @@ dependencies:
|
|
79
138
|
- 12
|
80
139
|
- 10
|
81
140
|
version: 0.12.10
|
82
|
-
|
141
|
+
name: eventmachine
|
142
|
+
requirement: *id008
|
143
|
+
type: :runtime
|
83
144
|
description: Some of these are borrowed. Some are original. This gem simply provides a single place to source control them all for incorporation into other projects.
|
84
145
|
email: github@wdoughty.net
|
85
146
|
executables: []
|
@@ -114,6 +175,7 @@ files:
|
|
114
175
|
- lib/wdd-ruby-ext/utils/helpers.rb
|
115
176
|
- lib/wdd-ruby-ext/utils/miscellany.rb
|
116
177
|
- lib/wdd-ruby-ext/utils/pretty_xml.rb
|
178
|
+
- lib/wdd-ruby-ext/utils/rgb_color.rb
|
117
179
|
- lib/wdd-ruby-ext/utils/simpledebug.rb
|
118
180
|
- lib/wdd-ruby-ext/utils/spinner.rb
|
119
181
|
- lib/wdd-ruby-ext/utils/test_server.rb
|
@@ -158,8 +220,5 @@ rubygems_version: 1.3.7
|
|
158
220
|
signing_key:
|
159
221
|
specification_version: 3
|
160
222
|
summary: Handy extensions to the Ruby base classes and other utilities.
|
161
|
-
test_files:
|
162
|
-
|
163
|
-
- spec/lib/utils/pretty_xml_spec.rb
|
164
|
-
- spec/spec_helper.rb
|
165
|
-
- spec/wdd-ruby-ext_spec.rb
|
223
|
+
test_files: []
|
224
|
+
|