diff --git a/Gemfile.lock b/Gemfile.lock
index acc0bc9c..c6c9c375 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1,13 +1,13 @@
GIT
remote: git://github.com/johnbintz/fakefs.git
- revision: 005ddaaeb2b2881391c31ac9846a55ce5a42c206
+ revision: 7363b6f13bfcd9f583bbf7cd1e0d65c2dc656db7
specs:
fakefs (0.3.1)
PATH
remote: .
specs:
- compass (0.11.3.rails.0.642d0b2)
+ compass (0.11.3.rails.0.9da1d44)
chunky_png (~> 1.2)
fssm (>= 0.2.7)
sass (~> 3.1)
@@ -17,12 +17,12 @@ GEM
specs:
ZenTest (4.5.0)
abstract (1.0.0)
- actionmailer (3.0.7)
- actionpack (= 3.0.7)
- mail (~> 2.2.15)
- actionpack (3.0.7)
- activemodel (= 3.0.7)
- activesupport (= 3.0.7)
+ actionmailer (3.0.9.rc3)
+ actionpack (= 3.0.9.rc3)
+ mail (~> 2.2.19)
+ actionpack (3.0.9.rc3)
+ activemodel (= 3.0.9.rc3)
+ activesupport (= 3.0.9.rc3)
builder (~> 2.1.2)
erubis (~> 2.6.6)
i18n (~> 0.5.0)
@@ -30,21 +30,21 @@ GEM
rack-mount (~> 0.6.14)
rack-test (~> 0.5.7)
tzinfo (~> 0.3.23)
- activemodel (3.0.7)
- activesupport (= 3.0.7)
+ activemodel (3.0.9.rc3)
+ activesupport (= 3.0.9.rc3)
builder (~> 2.1.2)
i18n (~> 0.5.0)
- activerecord (3.0.7)
- activemodel (= 3.0.7)
- activesupport (= 3.0.7)
- arel (~> 2.0.2)
+ activerecord (3.0.9.rc3)
+ activemodel (= 3.0.9.rc3)
+ activesupport (= 3.0.9.rc3)
+ arel (~> 2.0.10)
tzinfo (~> 0.3.23)
- activeresource (3.0.7)
- activemodel (= 3.0.7)
- activesupport (= 3.0.7)
- activesupport (3.0.7)
- addressable (2.2.5)
- arel (2.0.9)
+ activeresource (3.0.9.rc3)
+ activemodel (= 3.0.9.rc3)
+ activesupport (= 3.0.9.rc3)
+ activesupport (3.0.9.rc3)
+ addressable (2.2.6)
+ arel (2.0.10)
autotest (4.4.6)
ZenTest (>= 4.4.1)
autotest-fsevent (0.2.5)
@@ -61,7 +61,7 @@ GEM
term-ansicolor (~> 1.0.5)
diff-lcs (1.1.2)
em-dir-watcher (0.9.4)
- em-websocket (0.2.1)
+ em-websocket (0.3.0)
addressable (>= 2.1.1)
eventmachine (>= 0.12.9)
erubis (2.6.6)
@@ -71,14 +71,14 @@ GEM
gherkin (2.2.9)
json (~> 1.4.6)
term-ansicolor (~> 1.0.5)
- haml (3.1.1)
+ haml (3.1.2)
i18n (0.5.0)
json (1.4.6)
livereload (1.6)
em-dir-watcher (>= 0.1)
em-websocket (>= 0.1.2)
ruby-json (>= 1.1.2)
- mail (2.2.17)
+ mail (2.2.19)
activesupport (>= 2.3.6)
i18n (>= 0.4.0)
mime-types (~> 1.16)
@@ -86,27 +86,29 @@ GEM
mime-types (1.16)
mocha (0.9.12)
polyglot (0.3.1)
- rack (1.2.2)
+ rack (1.2.3)
rack-mount (0.6.14)
rack (>= 1.0.0)
rack-test (0.5.7)
rack (>= 1.0)
- rails (3.0.7)
- actionmailer (= 3.0.7)
- actionpack (= 3.0.7)
- activerecord (= 3.0.7)
- activeresource (= 3.0.7)
- activesupport (= 3.0.7)
+ rails (3.0.9.rc3)
+ actionmailer (= 3.0.9.rc3)
+ actionpack (= 3.0.9.rc3)
+ activerecord (= 3.0.9.rc3)
+ activeresource (= 3.0.9.rc3)
+ activesupport (= 3.0.9.rc3)
bundler (~> 1.0)
- railties (= 3.0.7)
- railties (3.0.7)
- actionpack (= 3.0.7)
- activesupport (= 3.0.7)
+ railties (= 3.0.9.rc3)
+ railties (3.0.9.rc3)
+ actionpack (= 3.0.9.rc3)
+ activesupport (= 3.0.9.rc3)
rake (>= 0.8.7)
+ rdoc (~> 3.4)
thor (~> 0.14.4)
- rake (0.8.7)
+ rake (0.9.2)
rb-fsevent (0.4.0)
rcov (0.9.9)
+ rdoc (3.6.1)
rspec (2.0.1)
rspec-core (~> 2.0.1)
rspec-expectations (~> 2.0.1)
@@ -118,16 +120,16 @@ GEM
rspec-core (~> 2.0.1)
rspec-expectations (~> 2.0.1)
ruby-json (1.1.2)
- ruby-prof (0.10.5)
+ ruby-prof (0.10.7)
rubyzip (0.9.4)
- sass (3.1.1)
+ sass (3.1.2)
sys-uname (0.8.5)
term-ansicolor (1.0.5)
thor (0.14.6)
timecop (0.3.5)
treetop (1.4.9)
polyglot (>= 0.3.1)
- tzinfo (0.3.26)
+ tzinfo (0.3.27)
PLATFORMS
ruby
diff --git a/Rakefile b/Rakefile
index e077d6f8..40e25323 100644
--- a/Rakefile
+++ b/Rakefile
@@ -29,6 +29,16 @@ To run with an alternate version of Rails, make test/rails a symlink to that ver
To run with an alternate version of Haml & Sass, make test/haml a symlink to that version.
END
+Rake::TestTask.new :units do |t|
+ t.libs << 'lib'
+ t.libs << 'test'
+ test_files = FileList['test/units/**/*_test.rb']
+ test_files.exclude('test/rails/*', 'test/haml/*')
+ t.test_files = test_files
+ t.verbose = true
+end
+
+
desc "Compile Examples into HTML and CSS"
task :examples do
linked_haml = "tests/haml"
diff --git a/doc-src/content/help/index.haml b/doc-src/content/help/index.haml
index 0c5bfe36..22e70a52 100644
--- a/doc-src/content/help/index.haml
+++ b/doc-src/content/help/index.haml
@@ -40,7 +40,7 @@ layout: site
## Manual setup using the Blueprint Framework
- When starting a project from scrath:
+ When starting a project from scratch:
compass create /path/to/project --using blueprint
diff --git a/lib/compass/app_integration/rails.rb b/lib/compass/app_integration/rails.rb
index b734d1af..a850d8d7 100644
--- a/lib/compass/app_integration/rails.rb
+++ b/lib/compass/app_integration/rails.rb
@@ -52,7 +52,7 @@ module Compass
def check_for_double_boot!
if booted?
- Compass::Util.compass_warn("Warning: Compass was booted twice. If you're using Rails 3, Compass has a Railtie now; please remove your compass intializer.")
+ Compass::Util.compass_warn("Warning: Compass was booted twice. Compass has a Railtie now; please remove your initializer.")
else
booted!
end
diff --git a/lib/compass/commands/sprite.rb b/lib/compass/commands/sprite.rb
index b93705ed..08b4afda 100644
--- a/lib/compass/commands/sprite.rb
+++ b/lib/compass/commands/sprite.rb
@@ -39,10 +39,11 @@ module Compass
def perform
relative_uri = options[:uri].gsub(/^#{Compass.configuration.images_dir}\//, '')
- sprites = Compass::SpriteImporter.new(:uri => relative_uri, :options => Compass.sass_engine_options)
- options[:output_file] ||= File.join(Compass.configuration.sass_path, "sprites", "_#{sprites.name}.#{Compass.configuration.preferred_syntax}")
+ name = Compass::SpriteImporter.sprite_name(relative_uri)
+ sprites = Compass::SpriteImporter.new
+ options[:output_file] ||= File.join(Compass.configuration.sass_path, "sprites", "_#{name}.#{Compass.configuration.preferred_syntax}")
options[:skip_overrides] ||= false
- contents = sprites.content_for_images(options[:skip_overrides])
+ contents = Compass::SpriteImporter.content_for_images(relative_uri, name, options[:skip_overrides])
if options[:output_file][-4..-1] != "scss"
contents = Sass::Engine.new(contents, Compass.sass_engine_options.merge(:syntax => :scss)).to_tree.to_sass
end
diff --git a/lib/compass/sass_extensions/functions/sprites.rb b/lib/compass/sass_extensions/functions/sprites.rb
index d746ed28..7639f4da 100644
--- a/lib/compass/sass_extensions/functions/sprites.rb
+++ b/lib/compass/sass_extensions/functions/sprites.rb
@@ -22,7 +22,7 @@ module Compass::SassExtensions::Functions::Sprites
def sprite_map(glob, kwargs = {})
kwargs.extend VariableReader
Compass::SassExtensions::Sprites::SpriteMap.from_uri(glob, self, kwargs)
- end
+ end
Sass::Script::Functions.declare :sprite_map, [:glob], :var_kwargs => true
# Returns the image and background position for use in a single shorthand property:
diff --git a/lib/compass/sass_extensions/sprites.rb b/lib/compass/sass_extensions/sprites.rb
index ab35d84e..246836a7 100644
--- a/lib/compass/sass_extensions/sprites.rb
+++ b/lib/compass/sass_extensions/sprites.rb
@@ -9,6 +9,7 @@ module Compass
end
require 'compass/sass_extensions/sprites/image'
+require 'compass/sass_extensions/sprites/layout_methods'
require 'compass/sass_extensions/sprites/sprite_methods'
require 'compass/sass_extensions/sprites/image_methods'
require 'compass/sass_extensions/sprites/sprite_map'
diff --git a/lib/compass/sass_extensions/sprites/layout_methods.rb b/lib/compass/sass_extensions/sprites/layout_methods.rb
new file mode 100644
index 00000000..d8787671
--- /dev/null
+++ b/lib/compass/sass_extensions/sprites/layout_methods.rb
@@ -0,0 +1,85 @@
+module Compass
+ module SassExtensions
+ module Sprites
+ module LayoutMethods
+ HORIZONTAL = 'horizontal'
+
+ def horizontal?
+ @kwargs.get_var('layout').value == HORIZONTAL
+ end
+
+ # Calculates the overal image dimensions
+ # collects image sizes and input parameters for each sprite
+ def compute_image_positions!
+ if horizontal?
+ calculate_height
+ calculate_horizontal_positions
+ calculate_width
+ else
+ calculate_width
+ calulate_vertical_postions
+ calculate_height
+ end
+ end
+
+ def calculate_horizontal_positions
+ @images.each_with_index do |image, index|
+ image.top = image.position.unit_str == '%' ? (@height - image.height) * (image.position.value / 100.0) : image.position.value
+ next if index == 0
+ last_image = @images[index-1]
+ image.left = last_image.left + last_image.width + [image.offset, last_image.offset].max
+ end
+ end
+
+ def calulate_vertical_postions
+ @images.each_with_index do |image, index|
+ image.left = image.position.unit_str == "%" ? (@width - image.width) * (image.position.value / 100.0) : image.position.value
+ next if index == 0
+ last_image = @images[index-1]
+ image.top = last_image.top + last_image.height + [image.spacing, last_image.spacing].max
+ end
+ end
+
+
+ def calculate_dimensions!
+ calculate_width
+ calculate_height
+ end
+
+ def calculate_height
+ @height = if horizontal?
+ height_for_horizontal_layout
+ else
+ height_for_vertical_layout
+ end
+ end
+
+ def height_for_vertical_layout
+ last = @images.last
+ last.top + last.height
+ end
+
+ def height_for_horizontal_layout
+ @height = @images.map {|image| image.height + image.spacing}.max
+ end
+
+ def calculate_width
+ @width = if horizontal?
+ width_for_horizontal_layout
+ else
+ width_for_vertical_layout
+ end
+ end
+
+ def width_for_horizontal_layout
+ @images.inject(0) { |sum, image| sum += (image.width + image.offset) }
+ end
+
+ def width_for_vertical_layout
+ @images.map { |image| image.width + image.offset }.max
+ end
+ end
+ end
+ end
+end
+
\ No newline at end of file
diff --git a/lib/compass/sass_extensions/sprites/sprite_map.rb b/lib/compass/sass_extensions/sprites/sprite_map.rb
index 546dd1d1..aa9179a1 100644
--- a/lib/compass/sass_extensions/sprites/sprite_map.rb
+++ b/lib/compass/sass_extensions/sprites/sprite_map.rb
@@ -7,16 +7,19 @@ module Compass
include SpriteMethods
include ImageMethods
+ include LayoutMethods
# Initialize a new sprite object from a relative file path
# the path is relative to the images_path confguration option
def self.from_uri(uri, context, kwargs)
- importer = ::Compass::SpriteImporter.new(:uri => uri.value, :options => {})
- sprites = importer.files.map do |sprite|
- sprite.gsub(Compass.configuration.images_path+"/", "")
+ uri = uri.value
+ name, path = Compass::SpriteImporter.path_and_name(uri)
+ files = Compass::SpriteImporter.files(uri)
+ sprites = files.map do |sprite|
+ sprite.gsub("#{Compass.configuration.images_path}/", "")
end
- new(sprites, importer.path, importer.name, context, kwargs)
+ new(sprites, path, name, context, kwargs)
end
def initialize(sprites, path, name, context, kwargs)
@@ -25,6 +28,7 @@ module Compass
@name = name
@kwargs = kwargs
@kwargs['cleanup'] ||= Sass::Script::Bool.new(true)
+ @kwargs['layout'] ||= Sass::Script::String.new('vertical')
@images = nil
@width = nil
@height = nil
diff --git a/lib/compass/sass_extensions/sprites/sprite_methods.rb b/lib/compass/sass_extensions/sprites/sprite_methods.rb
index c620e95a..7fdec149 100644
--- a/lib/compass/sass_extensions/sprites/sprite_methods.rb
+++ b/lib/compass/sass_extensions/sprites/sprite_methods.rb
@@ -14,7 +14,6 @@ module Compass
@width = 0
init_images
compute_image_positions!
- @height = @images.last.top + @images.last.height
init_engine
end
@@ -29,22 +28,10 @@ module Compass
def init_images
@images = image_names.collect do |relative_file|
image = Compass::SassExtensions::Sprites::Image.new(self, relative_file, kwargs)
- @width = [ @width, image.width + image.offset ].max
image
end
end
- # Calculates the overal image dimensions
- # collects image sizes and input parameters for each sprite
- def compute_image_positions!
- @images.each_with_index do |image, index|
- image.left = image.position.unit_str == "%" ? (@width - image.width) * (image.position.value / 100) : image.position.value
- next if index == 0
- last_image = @images[index-1]
- image.top = last_image.top + last_image.height + [image.spacing, last_image.spacing].max
- end
- end
-
# Validates that the sprite_names are valid sass
def validate!
for sprite_name in sprite_names
diff --git a/lib/compass/sprite_importer.rb b/lib/compass/sprite_importer.rb
index 3dd1bd3e..d46403d9 100644
--- a/lib/compass/sprite_importer.rb
+++ b/lib/compass/sprite_importer.rb
@@ -1,6 +1,5 @@
module Compass
class SpriteImporter < Sass::Importers::Base
- attr_accessor :uri, :options
VAILD_FILE_NAME = /\A#{Sass::SCSS::RX::IDENT}\Z/
SPRITE_IMPORTER_REGEX = %r{((.+/)?([^\*.]+))/(.+?)\.png}
VALID_EXTENSIONS = ['.png']
@@ -11,29 +10,15 @@ module Compass
glob = "*-{,s}#{hex*10}{#{VALID_EXTENSIONS.join(",")}}"
Dir.glob(File.join(path, "**", glob))
end
-
- def self.load(uri, options)
- klass = Compass::SpriteImporter.new
- klass.uri, klass.options = uri, options
- klass
- end
-
- def initialize(options ={})
- @uri, @options = '', {}
- options.each do |key, value|
- send("#{key}=", value)
- end
- end
def find(uri, options)
- @uri, @options = uri, options
if uri =~ SPRITE_IMPORTER_REGEX
- return sass_engine
+ return self.class.sass_engine(uri, self.class.sprite_name(uri), self, options)
end
+ nil
end
def find_relative(uri, base, options)
- @uri, @options = uri, options
find(File.join(base, uri), options)
end
@@ -50,45 +35,43 @@ module Compass
end
def mtime(uri, options)
- @uri, @options = uri, options
- files.sort.inject(Time.at(0)) do |max_time, file|
+ self.class.files(uri).sort.inject(Time.at(0)) do |max_time, file|
(t = File.mtime(file)) > max_time ? t : max_time
end
end
def key(uri, options={})
- @uri, @options = uri, options
- [self.class.name + ":" + File.dirname(File.expand_path(uri)), File.basename(uri)]
+ [self.class.name + ":sprite:" + File.dirname(File.expand_path(uri)), File.basename(uri)]
end
def self.path_and_name(uri)
if uri =~ SPRITE_IMPORTER_REGEX
[$1, $3]
else
- raise Compass::Error "invalid sprite path"
+ raise Compass::Error, "invalid sprite path"
end
end
# Name of this spite
- def name
- ensure_path_and_name!
- @name
+ def self.sprite_name(uri)
+ _, name = path_and_name(uri)
+ name
end
# The on-disk location of this sprite
- def path
- ensure_path_and_name!
- @path
+ def self.path(uri)
+ path, _ = path_and_name(uri)
+ path
end
- # Returns the Glob of image files for this sprite
- def files
+ # Returns the Glob of image files for the uri
+ def self.files(uri)
Dir[File.join(Compass.configuration.images_path, uri)].sort
end
# Returns an Array of image names without the file extension
- def sprite_names
- files.collect do |file|
+ def self.sprite_names(uri)
+ files(uri).collect do |file|
filename = File.basename(file, '.png')
unless VAILD_FILE_NAME =~ filename
raise Compass::Error, "Sprite file names must be legal css identifiers. Please rename #{File.basename(file)}"
@@ -97,31 +80,18 @@ module Compass
end
end
- def validate_sprites!
- files.each do |file|
- unless VALID_EXTENSIONS.include? File.extname(file)
- raise Compass::Error, "Invalid sprite extension only: #{VALID_EXTENSIONS.join(',')} images are allowed"
- end
- end
- end
-
- # Returns the sass options for this sprite
- def sass_options
- options.merge(:filename => name, :syntax => :scss, :importer => self)
+ # Returns the sass _options for this sprite
+ def self.sass_options(name, importer, options)
+ options.merge!(:filename => name, :syntax => :scss, :importer => importer)
end
# Returns a Sass::Engine for this sprite object
- def sass_engine
- validate_sprites!
- Sass::Engine.new(content_for_images, sass_options)
+ def self.sass_engine(uri, name, importer, options)
+ Sass::Engine.new(content_for_images(uri, name, options[:skip_overrides]), sass_options(name, importer, options))
end
-
- def ensure_path_and_name!
- @path, @name = self.class.path_and_name(uri)
- end
# Generates the Sass for this sprite file
- def content_for_images(skip_overrides = false)
+ def self.content_for_images(uri, name, skip_overrides = false)
<<-SCSS
@import "compass/utilities/sprites/base";
@@ -134,8 +104,9 @@ $#{name}-spacing: 0 !default;
$#{name}-repeat: no-repeat !default;
$#{name}-prefix: '' !default;
$#{name}-clean-up: true !default;
+$#{name}-layout:vertical !default;
-#{skip_overrides ? "$#{name}-sprites: sprite-map(\"#{uri}\", $cleanup: $#{name}-clean-up);" : generate_overrides }
+#{skip_overrides ? "$#{name}-sprites: sprite-map(\"#{uri}\", $layout: $#{name}-layout, $cleanup: $#{name}-clean-up);" : generate_overrides(uri, name) }
// All sprites should extend this class
// The #{name}-sprite mixin will do so for you.
@@ -167,7 +138,7 @@ $#{name}-clean-up: true !default;
// Generates a class for each sprited image.
@mixin all-#{name}-sprites($dimensions: $#{name}-sprite-dimensions, $prefix: sprite-map-name($#{name}-sprites)) {
- @include #{name}-sprites(#{sprite_names.join(" ")}, $dimensions, $prefix);
+ @include #{name}-sprites(#{sprite_names(uri).join(" ")}, $dimensions, $prefix);
}
SCSS
end
@@ -176,12 +147,13 @@ SCSS
# $#{name}-#{sprite_name}-position
# $#{name}-#{sprite_name}-spacing
# #{name}-#{sprite_name}-repeat:
- def generate_overrides
+ def self.generate_overrides(uri, name)
+ sprites = sprite_names(uri)
content = <<-TXT
// These variables control the generated sprite output
// You can override them selectively before you import this file.
TXT
- sprite_names.map do |sprite_name|
+ sprites.map do |sprite_name|
content += <<-SCSS
$#{name}-#{sprite_name}-position: $#{name}-position !default;
$#{name}-#{sprite_name}-spacing: $#{name}-spacing !default;
@@ -189,8 +161,8 @@ $#{name}-#{sprite_name}-repeat: $#{name}-repeat !default;
SCSS
end.join
- content += "\n$#{name}-sprites: sprite-map(\"#{uri}\", \n$cleanup: $#{name}-clean-up,\n"
- content += sprite_names.map do |sprite_name|
+ content += "\n$#{name}-sprites: sprite-map(\"#{uri}\", \n$layout: $#{name}-layout, \n$cleanup: $#{name}-clean-up,\n"
+ content += sprites.map do |sprite_name|
%Q{ $#{sprite_name}-position: $#{name}-#{sprite_name}-position,
$#{sprite_name}-spacing: $#{name}-#{sprite_name}-spacing,
$#{sprite_name}-repeat: $#{name}-#{sprite_name}-repeat}
diff --git a/test/integrations/sprites_test.rb b/test/integrations/sprites_test.rb
index 723dac7d..456b0063 100644
--- a/test/integrations/sprites_test.rb
+++ b/test/integrations/sprites_test.rb
@@ -603,5 +603,33 @@ class SpritesTest < Test::Unit::TestCase
}
CSS
end
+
+ it "should calculate corret sprite demsions when givin spacing via issue#253" do
+ css = render <<-SCSS
+ $squares-layout:horizontal;
+ @import "squares/*.png";
+ .foo {
+ @include sprite-background-position($squares-sprites, "twenty-by-twenty");
+ }
+ .bar {
+ @include sprite-background-position($squares-sprites, "ten-by-ten");
+ }
+ SCSS
+ assert_equal [30, 20], image_size('squares-s*.png')
+ other_css = <<-CSS
+ .squares-sprite {
+ background: url('/squares-s161c60ad78.png') no-repeat;
+ }
-end
\ No newline at end of file
+ .foo {
+ background-position: -10px 0;
+ }
+
+ .bar {
+ background-position: 0 0;
+ }
+ CSS
+ assert_correct css.gsub("\n", '').gsub(' ', ''), other_css.gsub("\n", '').gsub(' ', '')
+ end
+
+end
diff --git a/test/test_helper.rb b/test/test_helper.rb
index 33dbe6ec..a4146cc6 100644
--- a/test/test_helper.rb
+++ b/test/test_helper.rb
@@ -34,4 +34,17 @@ class Test::Unit::TestCase
include Compass::IoHelper
extend Compass::TestCaseHelper::ClassMethods
-end
\ No newline at end of file
+end
+
+module SpriteHelper
+ URI = "selectors/*.png"
+
+ def sprite_map_test(options)
+ importer = Compass::SpriteImporter.new
+ path, name = Compass::SpriteImporter.path_and_name(URI)
+ sprite_names = Compass::SpriteImporter.sprite_names(URI)
+ sass_engine = Compass::SpriteImporter.sass_engine(URI, name, importer, options)
+ Compass::SassExtensions::Sprites::SpriteMap.new(sprite_names.map{|n| "selectors/#{n}.png"}, path, name, sass_engine, options)
+ end
+
+end
\ No newline at end of file
diff --git a/test/units/sprites/image_test.rb b/test/units/sprites/image_test.rb
index aa8dff32..afcc0c7c 100644
--- a/test/units/sprites/image_test.rb
+++ b/test/units/sprites/image_test.rb
@@ -1,9 +1,9 @@
require 'test_helper'
require 'mocha'
require 'ostruct'
+
class SpritesImageTest < Test::Unit::TestCase
-
-
+ include SpriteHelper
def setup
@images_src_path = File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'sprites', 'public', 'images')
file = StringIO.new("images_path = #{@images_src_path.inspect}\n")
@@ -18,18 +18,15 @@ class SpritesImageTest < Test::Unit::TestCase
let(:sprite_path) { File.join(@images_src_path, sprite_filename) }
let(:sprite_name) { File.basename(sprite_filename, '.png') }
- def parent
- importer = Compass::SpriteImporter.new(:uri => "selectors/*.png", :options => options)
- @parent ||= Compass::SassExtensions::Sprites::SpriteMap.new(importer.sprite_names.map{|n| "selectors/#{n}.png"}, importer.path, importer.name, importer.sass_engine, importer.options)
- end
- let(:options) do
+ def options
options = {:offset => @offset}
options.stubs(:get_var).with(anything).returns(nil)
::OpenStruct.any_instance.stubs(:unitless?).returns(true)
options.stubs(:get_var).with("#{sprite_name}-repeat").returns(::OpenStruct.new(:value => @repeat))
options.stubs(:get_var).with("#{sprite_name}-spacing").returns(::OpenStruct.new(:value => @spacing))
options.stubs(:get_var).with("#{sprite_name}-position").returns(::OpenStruct.new(:value => @position))
+ options.stubs(:get_var).with("layout").returns(::OpenStruct.new(:value => 'vertical'))
options
end
@@ -38,7 +35,7 @@ class SpritesImageTest < Test::Unit::TestCase
let(:digest) { Digest::MD5.file(sprite_path).hexdigest }
- let(:image) { Compass::SassExtensions::Sprites::Image.new(parent, File.join(sprite_filename), options)}
+ let(:image) { Compass::SassExtensions::Sprites::Image.new(sprite_map_test(options), File.join(sprite_filename), options)}
test 'initialize' do
assert_equal sprite_name, image.name
diff --git a/test/units/sprites/importer_test.rb b/test/units/sprites/importer_test.rb
index 79fdc800..f9b0d79d 100644
--- a/test/units/sprites/importer_test.rb
+++ b/test/units/sprites/importer_test.rb
@@ -7,7 +7,7 @@ class ImporterTest < Test::Unit::TestCase
@images_src_path = File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'sprites', 'public', 'images')
file = StringIO.new("images_path = #{@images_src_path.inspect}\n")
Compass.add_configuration(file, "sprite_config")
- @importer = Compass::SpriteImporter.new(:uri => URI, :options => options)
+ @importer = Compass::SpriteImporter.new
end
def teardown
@@ -18,20 +18,16 @@ class ImporterTest < Test::Unit::TestCase
{:foo => 'bar'}
end
- test "load should return an instance of SpriteImporter" do
- assert Compass::SpriteImporter.load(URI, options).is_a?(Compass::SpriteImporter)
- end
-
test "name should return the sprite name" do
- assert_equal 'selectors', @importer.name
+ assert_equal 'selectors', Compass::SpriteImporter.sprite_name(URI)
end
test "path should return the sprite path" do
- assert_equal 'selectors', @importer.path
+ assert_equal 'selectors', Compass::SpriteImporter.path(URI)
end
test "should return all the sprite names" do
- assert_equal ["ten-by-ten", "ten-by-ten_active", "ten-by-ten_hover", "ten-by-ten_target"], @importer.sprite_names
+ assert_equal ["ten-by-ten", "ten-by-ten_active", "ten-by-ten_hover", "ten-by-ten_target"], Compass::SpriteImporter.sprite_names(URI)
end
test "should have correct mtime" do
@@ -47,19 +43,21 @@ class ImporterTest < Test::Unit::TestCase
end
test "sass options should contain options" do
- assert_equal 'bar', @importer.sass_options[:foo]
+ opts = Compass::SpriteImporter.sass_options('foo', @importer, options)
+ assert_equal 'bar', opts[:foo]
end
test "should fail given bad sprite extensions" do
@images_src_path = File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'sprites', 'public', 'images')
file = StringIO.new("images_path = #{@images_src_path.inspect}\n")
Compass.add_configuration(file, "sprite_config")
- importer = Compass::SpriteImporter.new(:uri => 'bad_extensions/*.jpg', :options => options)
+ importer = Compass::SpriteImporter.new
+ uri = "bad_extensions/*.jpg"
begin
- importer.sass_engine
+ Compass::SpriteImporter.sass_engine(uri, Compass::SpriteImporter.sprite_name(uri), importer, {})
assert false, "An invalid sprite file made it past validation."
rescue Compass::Error => e
- assert e.message.include?('.png')
+ assert e.message.include?("invalid sprite path")
end
end
diff --git a/test/units/sprites/sprite_map_test.rb b/test/units/sprites/sprite_map_test.rb
index 56f10885..9afa868a 100644
--- a/test/units/sprites/sprite_map_test.rb
+++ b/test/units/sprites/sprite_map_test.rb
@@ -1,6 +1,7 @@
require 'test_helper'
class SpriteMapTest < Test::Unit::TestCase
+ include SpriteHelper
def setup
Hash.send(:include, Compass::SassExtensions::Functions::Sprites::VariableReader)
@@ -11,17 +12,13 @@ class SpriteMapTest < Test::Unit::TestCase
config.images_path = @images_tmp_path
Compass.add_configuration(config)
Compass.configure_sass_plugin!
- @options = {'cleanup' => Sass::Script::Bool.new(true)}
- setup_map
- end
-
- def setup_map
- @importer = Compass::SpriteImporter.new(:uri => "selectors/*.png", :options => @options)
- @base = Compass::SassExtensions::Sprites::SpriteMap.new(@importer.sprite_names.map{|n| "selectors/#{n}.png"}, @importer.path, @importer.name, @importer.sass_engine, @importer.options)
+ @options = {'cleanup' => Sass::Script::Bool.new(true), 'layout' => Sass::Script::String.new('vertical')}
+ @base = sprite_map_test(@options)
end
def teardown
FileUtils.rm_r @images_tmp_path
+ @base = nil
end
it "should have the correct size" do
@@ -29,7 +26,7 @@ class SpriteMapTest < Test::Unit::TestCase
end
it "should have the sprite names" do
- assert_equal @importer.sprite_names, @base.sprite_names
+ assert_equal Compass::SpriteImporter.sprite_names(URI), @base.sprite_names
end
it 'should have image filenames' do
@@ -82,9 +79,41 @@ class SpriteMapTest < Test::Unit::TestCase
file_to_remove = File.join(@images_tmp_path, 'selectors', 'ten-by-ten.png')
FileUtils.rm file_to_remove
assert !File.exists?(file_to_remove), "Failed to remove sprite file"
- setup_map
+ @base = sprite_map_test(@options)
@base.generate
assert !File.exists?(file), "Sprite file did not get removed"
end
+
+ it "should have a vertical layout" do
+ assert_equal [0, 10, 20, 30], @base.images.map(&:top)
+ assert_equal [0, 0, 0, 0], @base.images.map(&:left)
+ end
+
+
+ # Horizontal tests
+ def horizontal
+ opts = @options.merge("layout" => Sass::Script::String.new('horizontal'))
+ sprite_map_test(opts)
+ end
+
+ it "should have a horizontal layout" do
+ base = horizontal
+ assert_equal 10, base.height
+ assert_equal 40, base.width
+ end
+
+ it "should layout images horizontaly" do
+ base = horizontal
+ assert_equal [0, 10, 20, 30], base.images.map(&:left)
+ assert_equal [0, 0, 0, 0], base.images.map(&:top)
+ end
+
+ it "should generate a horrizontal sprite" do
+ base = horizontal
+ base.generate
+ assert File.exists?(base.filename)
+ FileUtils.rm base.filename
+ end
+
end
\ No newline at end of file