sprite-factory 1.0.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/LICENSE +20 -0
- data/README.md +207 -0
- data/Rakefile +67 -0
- data/bin/sf +46 -0
- data/lib/sprite_factory.rb +51 -0
- data/lib/sprite_factory/layout.rb +89 -0
- data/lib/sprite_factory/library/chunky_png.rb +31 -0
- data/lib/sprite_factory/library/rmagick.rb +32 -0
- data/lib/sprite_factory/runner.rb +204 -0
- data/lib/sprite_factory/style.rb +58 -0
- data/sprite_factory.gemspec +24 -0
- data/test/images/custom/custom.css +4 -0
- data/test/images/custom/running.png +0 -0
- data/test/images/custom/stopped.png +0 -0
- data/test/images/empty/readme.txt +1 -0
- data/test/images/formats/alice.gif +0 -0
- data/test/images/formats/monkey.gif +0 -0
- data/test/images/formats/spies.jpg +0 -0
- data/test/images/formats/thief.png +0 -0
- data/test/images/irregular/irregular1.png +0 -0
- data/test/images/irregular/irregular2.png +0 -0
- data/test/images/irregular/irregular3.png +0 -0
- data/test/images/irregular/irregular4.png +0 -0
- data/test/images/irregular/irregular5.png +0 -0
- data/test/images/irregular/readme.txt +2 -0
- data/test/images/reference/custom.css +22 -0
- data/test/images/reference/custom.png +0 -0
- data/test/images/reference/formats.css +22 -0
- data/test/images/reference/formats.png +0 -0
- data/test/images/reference/index.html +135 -0
- data/test/images/reference/irregular.css +24 -0
- data/test/images/reference/irregular.fixed.css +24 -0
- data/test/images/reference/irregular.fixed.png +0 -0
- data/test/images/reference/irregular.horizontal.css +24 -0
- data/test/images/reference/irregular.horizontal.png +0 -0
- data/test/images/reference/irregular.padded.css +24 -0
- data/test/images/reference/irregular.padded.png +0 -0
- data/test/images/reference/irregular.png +0 -0
- data/test/images/reference/irregular.sassy.css +38 -0
- data/test/images/reference/irregular.sassy.png +0 -0
- data/test/images/reference/irregular.sassy.sass +40 -0
- data/test/images/reference/irregular.vertical.css +24 -0
- data/test/images/reference/irregular.vertical.png +0 -0
- data/test/images/reference/regular.css +24 -0
- data/test/images/reference/regular.custom.css +24 -0
- data/test/images/reference/regular.custom.png +0 -0
- data/test/images/reference/regular.fixed.css +24 -0
- data/test/images/reference/regular.fixed.png +0 -0
- data/test/images/reference/regular.horizontal.css +24 -0
- data/test/images/reference/regular.horizontal.png +0 -0
- data/test/images/reference/regular.padded.css +24 -0
- data/test/images/reference/regular.padded.png +0 -0
- data/test/images/reference/regular.png +0 -0
- data/test/images/reference/regular.sassy.css +38 -0
- data/test/images/reference/regular.sassy.png +0 -0
- data/test/images/reference/regular.sassy.sass +40 -0
- data/test/images/reference/regular.vertical.css +24 -0
- data/test/images/reference/regular.vertical.png +0 -0
- data/test/images/reference/s.gif +0 -0
- data/test/images/regular/regular1.png +0 -0
- data/test/images/regular/regular2.png +0 -0
- data/test/images/regular/regular3.png +0 -0
- data/test/images/regular/regular4.png +0 -0
- data/test/images/regular/regular5.png +0 -0
- data/test/integration_test.rb +100 -0
- data/test/layout_test.rb +228 -0
- data/test/library_test.rb +57 -0
- data/test/runner_test.rb +156 -0
- data/test/style_test.rb +64 -0
- data/test/test_case.rb +127 -0
- metadata +159 -0
data/test/style_test.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
require File.expand_path('test_case', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
module SpriteFactory
|
4
|
+
class StyleTest < SpriteFactory::TestCase
|
5
|
+
|
6
|
+
TEST_ATTRIBUTES = [
|
7
|
+
"width: 30px",
|
8
|
+
"height: 40px",
|
9
|
+
"background: url(path/to/image.png) -10px -20px no-repeat"
|
10
|
+
]
|
11
|
+
|
12
|
+
#--------------------------------------------------------------------------
|
13
|
+
|
14
|
+
def test_css
|
15
|
+
expected = "img.foo { width: 30px; height: 40px; background: url(path/to/image.png) -10px -20px no-repeat; }"
|
16
|
+
actual = Style.css("img.", "foo", TEST_ATTRIBUTES)
|
17
|
+
assert_equal(expected, actual)
|
18
|
+
end
|
19
|
+
|
20
|
+
#--------------------------------------------------------------------------
|
21
|
+
|
22
|
+
def test_sass
|
23
|
+
expected = "img.foo\n width: 30px\n height: 40px\n background: url(path/to/image.png) -10px -20px no-repeat\n"
|
24
|
+
actual = Style.sass("img.", "foo", TEST_ATTRIBUTES)
|
25
|
+
assert_equal(expected, actual)
|
26
|
+
end
|
27
|
+
|
28
|
+
#--------------------------------------------------------------------------
|
29
|
+
|
30
|
+
def test_generate
|
31
|
+
|
32
|
+
style = :css
|
33
|
+
selector = 'img.'
|
34
|
+
path = '/path/to/sprite.png'
|
35
|
+
images = [
|
36
|
+
{:filename => '/path/to/sprite1.png', :name => 'sprite1', :cssx => 1, :cssy => 10, :cssw => 100, :cssh => 1000},
|
37
|
+
{:filename => '/path/to/sprite2.png', :name => 'sprite2', :cssx => 2, :cssy => 20, :cssw => 200, :cssh => 2000},
|
38
|
+
{:filename => '/path/to/sprite3.png', :name => 'sprite3', :cssx => 3, :cssy => 30, :cssw => 300, :cssh => 3000},
|
39
|
+
{:filename => '/path/to/sprite4.png', :name => 'sprite4', :cssx => 4, :cssy => 40, :cssw => 400, :cssh => 4000},
|
40
|
+
{:filename => '/path/to/sprite5.png', :name => 'sprite5', :cssx => 5, :cssy => 50, :cssw => 500, :cssh => 5000}
|
41
|
+
]
|
42
|
+
|
43
|
+
lines = Style.generate(style, selector, path, images).split("\n")
|
44
|
+
|
45
|
+
assert_equal("width: 100px; height: 1000px; background: url(/path/to/sprite.png) -1px -10px no-repeat", images[0][:style], "pure style should have been stashed away in image[:style] for use by custom rule builders")
|
46
|
+
assert_equal("width: 200px; height: 2000px; background: url(/path/to/sprite.png) -2px -20px no-repeat", images[1][:style], "pure style should have been stashed away in image[:style] for use by custom rule builders")
|
47
|
+
assert_equal("width: 300px; height: 3000px; background: url(/path/to/sprite.png) -3px -30px no-repeat", images[2][:style], "pure style should have been stashed away in image[:style] for use by custom rule builders")
|
48
|
+
assert_equal("width: 400px; height: 4000px; background: url(/path/to/sprite.png) -4px -40px no-repeat", images[3][:style], "pure style should have been stashed away in image[:style] for use by custom rule builders")
|
49
|
+
assert_equal("width: 500px; height: 5000px; background: url(/path/to/sprite.png) -5px -50px no-repeat", images[4][:style], "pure style should have been stashed away in image[:style] for use by custom rule builders")
|
50
|
+
|
51
|
+
assert_equal("img.sprite1 { #{images[0][:style]}; }", lines[0], "appropriate rule should have been generated using the pure style stashed away in image[:style]")
|
52
|
+
assert_equal("img.sprite2 { #{images[1][:style]}; }", lines[1], "appropriate rule should have been generated using the pure style stashed away in image[:style]")
|
53
|
+
assert_equal("img.sprite3 { #{images[2][:style]}; }", lines[2], "appropriate rule should have been generated using the pure style stashed away in image[:style]")
|
54
|
+
assert_equal("img.sprite4 { #{images[3][:style]}; }", lines[3], "appropriate rule should have been generated using the pure style stashed away in image[:style]")
|
55
|
+
assert_equal("img.sprite5 { #{images[4][:style]}; }", lines[4], "appropriate rule should have been generated using the pure style stashed away in image[:style]")
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
#--------------------------------------------------------------------------
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
|
data/test/test_case.rb
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
require File.expand_path('../lib/sprite_factory', File.dirname(__FILE__))
|
2
|
+
require 'test/unit'
|
3
|
+
|
4
|
+
module SpriteFactory
|
5
|
+
class TestCase < Test::Unit::TestCase
|
6
|
+
|
7
|
+
#----------------------------------------------------------------------------
|
8
|
+
|
9
|
+
IMAGES_PATH = 'test/images'
|
10
|
+
|
11
|
+
REFERENCE_PATH = 'test/images/reference'
|
12
|
+
REGULAR_PATH = 'test/images/regular'
|
13
|
+
IRREGULAR_PATH = 'test/images/irregular'
|
14
|
+
CUSTOM_PATH = 'test/images/custom'
|
15
|
+
FORMATS_PATH = 'test/images/formats'
|
16
|
+
EMPTY_PATH = 'test/images/empty'
|
17
|
+
|
18
|
+
REGULAR = Dir[File.join(REGULAR_PATH, '*.png')].sort
|
19
|
+
IRREGULAR = Dir[File.join(IRREGULAR_PATH, '*.png')].sort
|
20
|
+
|
21
|
+
REGULAR_INFO = [
|
22
|
+
{ :filename => REGULAR[0], :width => 64, :height => 64 },
|
23
|
+
{ :filename => REGULAR[1], :width => 64, :height => 64 },
|
24
|
+
{ :filename => REGULAR[2], :width => 64, :height => 64 },
|
25
|
+
{ :filename => REGULAR[3], :width => 64, :height => 64 },
|
26
|
+
{ :filename => REGULAR[4], :width => 64, :height => 64 }
|
27
|
+
]
|
28
|
+
|
29
|
+
IRREGULAR_INFO = [
|
30
|
+
{ :filename => IRREGULAR[0], :width => 60, :height => 60 },
|
31
|
+
{ :filename => IRREGULAR[1], :width => 16, :height => 16 },
|
32
|
+
{ :filename => IRREGULAR[2], :width => 48, :height => 48 },
|
33
|
+
{ :filename => IRREGULAR[3], :width => 34, :height => 14 },
|
34
|
+
{ :filename => IRREGULAR[4], :width => 46, :height => 25 }
|
35
|
+
]
|
36
|
+
|
37
|
+
def output_path(name)
|
38
|
+
File.join(IMAGES_PATH, name)
|
39
|
+
end
|
40
|
+
|
41
|
+
def reference_path(name)
|
42
|
+
File.join(REFERENCE_PATH, name)
|
43
|
+
end
|
44
|
+
|
45
|
+
#----------------------------------------------------------------------------
|
46
|
+
|
47
|
+
def integration_test(input, options = {}, &block)
|
48
|
+
output = options[:output] || input
|
49
|
+
with_clean_output do
|
50
|
+
SpriteFactory.run!(input, options, &block)
|
51
|
+
assert_reference_image(File.basename(output) + "." + ( :png).to_s)
|
52
|
+
assert_reference_style(File.basename(output) + "." + (options[:style] || :css).to_s)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
#----------------------------------------------------------------------------
|
57
|
+
|
58
|
+
def with_clean_output
|
59
|
+
begin
|
60
|
+
clean_output
|
61
|
+
yield
|
62
|
+
ensure
|
63
|
+
clean_output
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def clean_output
|
68
|
+
Dir[File.join(IMAGES_PATH, "*.png"),
|
69
|
+
File.join(IMAGES_PATH, "*.css"),
|
70
|
+
File.join(IMAGES_PATH, "*.sass"),
|
71
|
+
File.join(IMAGES_PATH, "*.scss")].each {|f| File.delete(f)}
|
72
|
+
end
|
73
|
+
|
74
|
+
#----------------------------------------------------------------------------
|
75
|
+
|
76
|
+
def assert_runtime_error(msg = nil)
|
77
|
+
e = assert_raise RuntimeError do
|
78
|
+
yield
|
79
|
+
end
|
80
|
+
assert_match(msg, e.message) if msg
|
81
|
+
end
|
82
|
+
|
83
|
+
#----------------------------------------------------------------------------
|
84
|
+
|
85
|
+
def assert_reference_image(name)
|
86
|
+
#
|
87
|
+
# images generated with different libraries (or different versions of same library)
|
88
|
+
# might have different headers, so use rmagick to actually compare image bytes
|
89
|
+
#
|
90
|
+
actual = output_path(name)
|
91
|
+
expected = reference_path(name)
|
92
|
+
actual_image = Magick::Image.read(actual)[0]
|
93
|
+
expected_image = Magick::Image.read(expected)[0]
|
94
|
+
img, val = expected_image.compare_channel(actual_image, Magick::MeanAbsoluteErrorMetric)
|
95
|
+
assert_equal(0.0, val, "generated image does not match pregenerated reference:\n actual: #{actual}\n expected: #{expected}")
|
96
|
+
end
|
97
|
+
|
98
|
+
def assert_reference_style(name)
|
99
|
+
actual = output_path(name)
|
100
|
+
expected = reference_path(name)
|
101
|
+
diff = `cmp #{expected} #{actual}`
|
102
|
+
assert(diff.empty?, "generated styles do not match pregenerated reference:\n#{diff}")
|
103
|
+
end
|
104
|
+
|
105
|
+
#----------------------------------------------------------------------------
|
106
|
+
|
107
|
+
end # class TestCase
|
108
|
+
end # module SpriteFactory
|
109
|
+
|
110
|
+
|
111
|
+
#==============================================================================
|
112
|
+
|
113
|
+
class Class
|
114
|
+
|
115
|
+
# allow tests to call private methods without ugly #send syntax
|
116
|
+
def publicize_methods
|
117
|
+
methods = private_instance_methods
|
118
|
+
send(:public, *methods)
|
119
|
+
yield
|
120
|
+
send(:private, *methods)
|
121
|
+
end
|
122
|
+
|
123
|
+
end
|
124
|
+
|
125
|
+
#==============================================================================
|
126
|
+
|
127
|
+
|
metadata
ADDED
@@ -0,0 +1,159 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sprite-factory
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 1
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
version: 1.0.0
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Jake Gordon
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2011-04-29 00:00:00 -07:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: rmagick
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
segments:
|
29
|
+
- 0
|
30
|
+
version: "0"
|
31
|
+
type: :development
|
32
|
+
version_requirements: *id001
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: chunky_png
|
35
|
+
prerelease: false
|
36
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
37
|
+
none: false
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
segments:
|
42
|
+
- 0
|
43
|
+
version: "0"
|
44
|
+
type: :development
|
45
|
+
version_requirements: *id002
|
46
|
+
description: Combines individual images from a directory into a single sprite image file and creates an appropriate CSS stylesheet
|
47
|
+
email:
|
48
|
+
- jake@codeincomplete.com
|
49
|
+
executables:
|
50
|
+
- sf
|
51
|
+
extensions: []
|
52
|
+
|
53
|
+
extra_rdoc_files: []
|
54
|
+
|
55
|
+
files:
|
56
|
+
- LICENSE
|
57
|
+
- README.md
|
58
|
+
- Rakefile
|
59
|
+
- bin/sf
|
60
|
+
- lib/sprite_factory.rb
|
61
|
+
- lib/sprite_factory/layout.rb
|
62
|
+
- lib/sprite_factory/library/chunky_png.rb
|
63
|
+
- lib/sprite_factory/library/rmagick.rb
|
64
|
+
- lib/sprite_factory/runner.rb
|
65
|
+
- lib/sprite_factory/style.rb
|
66
|
+
- sprite_factory.gemspec
|
67
|
+
- test/images/custom/custom.css
|
68
|
+
- test/images/custom/running.png
|
69
|
+
- test/images/custom/stopped.png
|
70
|
+
- test/images/empty/readme.txt
|
71
|
+
- test/images/formats/alice.gif
|
72
|
+
- test/images/formats/monkey.gif
|
73
|
+
- test/images/formats/spies.jpg
|
74
|
+
- test/images/formats/thief.png
|
75
|
+
- test/images/irregular/irregular1.png
|
76
|
+
- test/images/irregular/irregular2.png
|
77
|
+
- test/images/irregular/irregular3.png
|
78
|
+
- test/images/irregular/irregular4.png
|
79
|
+
- test/images/irregular/irregular5.png
|
80
|
+
- test/images/irregular/readme.txt
|
81
|
+
- test/images/reference/custom.css
|
82
|
+
- test/images/reference/custom.png
|
83
|
+
- test/images/reference/formats.css
|
84
|
+
- test/images/reference/formats.png
|
85
|
+
- test/images/reference/index.html
|
86
|
+
- test/images/reference/irregular.css
|
87
|
+
- test/images/reference/irregular.fixed.css
|
88
|
+
- test/images/reference/irregular.fixed.png
|
89
|
+
- test/images/reference/irregular.horizontal.css
|
90
|
+
- test/images/reference/irregular.horizontal.png
|
91
|
+
- test/images/reference/irregular.padded.css
|
92
|
+
- test/images/reference/irregular.padded.png
|
93
|
+
- test/images/reference/irregular.png
|
94
|
+
- test/images/reference/irregular.sassy.css
|
95
|
+
- test/images/reference/irregular.sassy.png
|
96
|
+
- test/images/reference/irregular.sassy.sass
|
97
|
+
- test/images/reference/irregular.vertical.css
|
98
|
+
- test/images/reference/irregular.vertical.png
|
99
|
+
- test/images/reference/regular.css
|
100
|
+
- test/images/reference/regular.custom.css
|
101
|
+
- test/images/reference/regular.custom.png
|
102
|
+
- test/images/reference/regular.fixed.css
|
103
|
+
- test/images/reference/regular.fixed.png
|
104
|
+
- test/images/reference/regular.horizontal.css
|
105
|
+
- test/images/reference/regular.horizontal.png
|
106
|
+
- test/images/reference/regular.padded.css
|
107
|
+
- test/images/reference/regular.padded.png
|
108
|
+
- test/images/reference/regular.png
|
109
|
+
- test/images/reference/regular.sassy.css
|
110
|
+
- test/images/reference/regular.sassy.png
|
111
|
+
- test/images/reference/regular.sassy.sass
|
112
|
+
- test/images/reference/regular.vertical.css
|
113
|
+
- test/images/reference/regular.vertical.png
|
114
|
+
- test/images/reference/s.gif
|
115
|
+
- test/images/regular/regular1.png
|
116
|
+
- test/images/regular/regular2.png
|
117
|
+
- test/images/regular/regular3.png
|
118
|
+
- test/images/regular/regular4.png
|
119
|
+
- test/images/regular/regular5.png
|
120
|
+
- test/integration_test.rb
|
121
|
+
- test/layout_test.rb
|
122
|
+
- test/library_test.rb
|
123
|
+
- test/runner_test.rb
|
124
|
+
- test/style_test.rb
|
125
|
+
- test/test_case.rb
|
126
|
+
has_rdoc: true
|
127
|
+
homepage: https://github.com/jakesgordon/sprite-factory
|
128
|
+
licenses: []
|
129
|
+
|
130
|
+
post_install_message:
|
131
|
+
rdoc_options: []
|
132
|
+
|
133
|
+
require_paths:
|
134
|
+
- lib
|
135
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
136
|
+
none: false
|
137
|
+
requirements:
|
138
|
+
- - ">="
|
139
|
+
- !ruby/object:Gem::Version
|
140
|
+
segments:
|
141
|
+
- 0
|
142
|
+
version: "0"
|
143
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
144
|
+
none: false
|
145
|
+
requirements:
|
146
|
+
- - ">="
|
147
|
+
- !ruby/object:Gem::Version
|
148
|
+
segments:
|
149
|
+
- 0
|
150
|
+
version: "0"
|
151
|
+
requirements: []
|
152
|
+
|
153
|
+
rubyforge_project:
|
154
|
+
rubygems_version: 1.3.7
|
155
|
+
signing_key:
|
156
|
+
specification_version: 3
|
157
|
+
summary: Automatic CSS sprite generator
|
158
|
+
test_files: []
|
159
|
+
|