[Examples] Refactor the module and file loading for Sass Extensions and application integration. Fixed broken unit tests.
This commit is contained in:
parent
f1832d07ab
commit
2b3b781c33
@ -1,21 +1,7 @@
|
|||||||
require File.join(File.dirname(__FILE__), 'compass', 'dependencies')
|
module Compass
|
||||||
|
|
||||||
def assert_sass_version(obj)
|
|
||||||
unless obj.respond_to?(:version) && obj.version[:major] == 2 && obj.version[:minor] >= 1
|
|
||||||
raise LoadError.new("Compass requires Haml version 2.1 or greater.")
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
begin
|
['dependencies', 'sass_extensions', 'core_ext', 'version'].each do |file|
|
||||||
assert_sass_version(Sass)
|
|
||||||
rescue LoadError
|
|
||||||
require 'haml'
|
|
||||||
assert_sass_version(Haml)
|
|
||||||
end
|
|
||||||
|
|
||||||
require File.join(File.dirname(__FILE__), 'sass_extensions')
|
|
||||||
|
|
||||||
['core_ext', 'version'].each do |file|
|
|
||||||
require File.join(File.dirname(__FILE__), 'compass', file)
|
require File.join(File.dirname(__FILE__), 'compass', file)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -32,7 +18,6 @@ end
|
|||||||
|
|
||||||
require File.join(File.dirname(__FILE__), 'compass', 'configuration')
|
require File.join(File.dirname(__FILE__), 'compass', 'configuration')
|
||||||
require File.join(File.dirname(__FILE__), 'compass', 'frameworks')
|
require File.join(File.dirname(__FILE__), 'compass', 'frameworks')
|
||||||
|
require File.join(File.dirname(__FILE__), 'compass', 'app_integration')
|
||||||
|
|
||||||
# make sure we're running inside Merb
|
|
||||||
require File.join(File.dirname(__FILE__), 'compass', 'merb') if defined?(Merb::Plugins)
|
|
||||||
|
|
||||||
|
3
lib/compass/app_integration.rb
Normal file
3
lib/compass/app_integration.rb
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
|
||||||
|
# If we're running inside Merb
|
||||||
|
require File.join(File.dirname(__FILE__), 'app_integration', 'merb') if defined?(Merb::Plugins)
|
5
lib/compass/sass_extensions.rb
Normal file
5
lib/compass/sass_extensions.rb
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
module Compass::SassExtensions
|
||||||
|
end
|
||||||
|
|
||||||
|
require File.join(File.dirname(__FILE__), 'sass_extensions', 'functions')
|
||||||
|
require File.join(File.dirname(__FILE__), 'sass_extensions', 'monkey_patches')
|
17
lib/compass/sass_extensions/functions.rb
Normal file
17
lib/compass/sass_extensions/functions.rb
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
module Compass::SassExtensions::Functions
|
||||||
|
end
|
||||||
|
|
||||||
|
['nest', 'enumerate', 'image_url'].each do |func|
|
||||||
|
require File.join(File.dirname(__FILE__), 'functions', func)
|
||||||
|
end
|
||||||
|
|
||||||
|
module Sass::Script::Functions
|
||||||
|
include Compass::SassExtensions::Functions::Nest
|
||||||
|
include Compass::SassExtensions::Functions::Enumerate
|
||||||
|
include Compass::SassExtensions::Functions::ImageUrl
|
||||||
|
end
|
||||||
|
|
||||||
|
# Wierd that this has to be re-included to pick up sub-modules. Ruby bug?
|
||||||
|
class Sass::Script::Functions::EvaluationContext
|
||||||
|
include Sass::Script::Functions
|
||||||
|
end
|
6
lib/compass/sass_extensions/functions/enumerate.rb
Normal file
6
lib/compass/sass_extensions/functions/enumerate.rb
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
module Compass::SassExtensions::Functions::Enumerate
|
||||||
|
def enumerate(prefix, from, through)
|
||||||
|
selectors = (from.value..through.value).map{|i| "#{prefix.value}-#{i}"}.join(", ")
|
||||||
|
Sass::Script::String.new(selectors)
|
||||||
|
end
|
||||||
|
end
|
43
lib/compass/sass_extensions/functions/image_url.rb
Normal file
43
lib/compass/sass_extensions/functions/image_url.rb
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
module Compass::SassExtensions::Functions::ImageUrl
|
||||||
|
def image_url(path)
|
||||||
|
path = path.value # get to the string value of the literal.
|
||||||
|
if absolute_path?(path)
|
||||||
|
return Sass::Script::String.new("url(#{path})")
|
||||||
|
end
|
||||||
|
http_images_path = if Compass.configuration.http_images_path == :relative
|
||||||
|
compute_relative_path
|
||||||
|
else
|
||||||
|
Compass.configuration.http_images_path
|
||||||
|
end
|
||||||
|
|
||||||
|
real_path = if Compass.configuration.images_dir
|
||||||
|
File.join(Compass.configuration.project_path, Compass.configuration.images_dir, path)
|
||||||
|
end
|
||||||
|
|
||||||
|
if http_images_path
|
||||||
|
http_images_path = "#{http_images_path}/" unless http_images_path[-1..-1] == "/"
|
||||||
|
path = "#{http_images_path}#{path}"
|
||||||
|
end
|
||||||
|
|
||||||
|
if real_path && File.exists?(real_path)
|
||||||
|
path += "?#{File.mtime(real_path).strftime("%s")}"
|
||||||
|
elsif real_path
|
||||||
|
$stderr.puts "WARNING: '#{File.basename(path)}' was not found in #{File.dirname(real_path)}"
|
||||||
|
end
|
||||||
|
|
||||||
|
Sass::Script::String.new("url(#{path})")
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def absolute_path?(path)
|
||||||
|
path[0..0] == "/" || path[0..3] == "http"
|
||||||
|
end
|
||||||
|
|
||||||
|
def compute_relative_path
|
||||||
|
if (target_css_file = options[:css_filename])
|
||||||
|
images_path = File.join(Compass.configuration.project_path, Compass.configuration.images_dir)
|
||||||
|
Pathname.new(images_path).relative_path_from(Pathname.new(File.dirname(target_css_file))).to_s
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
12
lib/compass/sass_extensions/functions/nest.rb
Normal file
12
lib/compass/sass_extensions/functions/nest.rb
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
module Compass::SassExtensions::Functions::Nest
|
||||||
|
COMMA_SEPARATOR = /\s*,\s*/
|
||||||
|
|
||||||
|
def nest(*arguments)
|
||||||
|
nested = arguments.map{|a| a.value}.inject do |memo,arg|
|
||||||
|
ancestors = memo.split(COMMA_SEPARATOR)
|
||||||
|
descendants = arg.split(COMMA_SEPARATOR)
|
||||||
|
ancestors.map{|a| descendants.map{|d| "#{a} #{d}"}.join(", ")}.join(", ")
|
||||||
|
end
|
||||||
|
Sass::Script::String.new(nested)
|
||||||
|
end
|
||||||
|
end
|
3
lib/compass/sass_extensions/monkey_patches.rb
Normal file
3
lib/compass/sass_extensions/monkey_patches.rb
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
['stylesheet_updating'].each do |patch|
|
||||||
|
require File.join(File.dirname(__FILE__), 'monkey_patches', patch)
|
||||||
|
end
|
@ -0,0 +1,23 @@
|
|||||||
|
require 'sass/plugin'
|
||||||
|
|
||||||
|
# XXX: We can remove this monkeypatch once Sass 2.2 is released.
|
||||||
|
module Sass::Plugin
|
||||||
|
class << self
|
||||||
|
unless method_defined?(:exact_stylesheet_needs_update?)
|
||||||
|
def stylesheet_needs_update?(name, template_path, css_path)
|
||||||
|
css_file = css_filename(name, css_path)
|
||||||
|
template_file = template_filename(name, template_path)
|
||||||
|
exact_stylesheet_needs_update?(css_file, template_file)
|
||||||
|
end
|
||||||
|
def exact_stylesheet_needs_update?(css_file, template_file)
|
||||||
|
if !File.exists?(css_file)
|
||||||
|
return true
|
||||||
|
else
|
||||||
|
css_mtime = File.mtime(css_file)
|
||||||
|
File.mtime(template_file) > css_mtime ||
|
||||||
|
dependencies(template_file).any?(&dependency_updated?(css_mtime))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -1,83 +0,0 @@
|
|||||||
require 'sass/plugin'
|
|
||||||
|
|
||||||
module Sass::Script::Functions
|
|
||||||
COMMA_SEPARATOR = /\s*,\s*/
|
|
||||||
|
|
||||||
def nest(*arguments)
|
|
||||||
nested = arguments.map{|a| a.value}.inject do |memo,arg|
|
|
||||||
ancestors = memo.split(COMMA_SEPARATOR)
|
|
||||||
descendants = arg.split(COMMA_SEPARATOR)
|
|
||||||
ancestors.map{|a| descendants.map{|d| "#{a} #{d}"}.join(", ")}.join(", ")
|
|
||||||
end
|
|
||||||
Sass::Script::String.new(nested)
|
|
||||||
end
|
|
||||||
|
|
||||||
def enumerate(prefix, from, through)
|
|
||||||
selectors = (from.value..through.value).map{|i| "#{prefix.value}-#{i}"}.join(", ")
|
|
||||||
Sass::Script::String.new(selectors)
|
|
||||||
end
|
|
||||||
|
|
||||||
def image_url(path)
|
|
||||||
path = path.value # get to the string value of the literal.
|
|
||||||
if absolute_path?(path)
|
|
||||||
return Sass::Script::String.new("url(#{path})")
|
|
||||||
end
|
|
||||||
http_images_path = if Compass.configuration.http_images_path == :relative
|
|
||||||
compute_relative_path
|
|
||||||
else
|
|
||||||
Compass.configuration.http_images_path
|
|
||||||
end
|
|
||||||
|
|
||||||
real_path = if Compass.configuration.images_dir
|
|
||||||
File.join(Compass.configuration.project_path, Compass.configuration.images_dir, path)
|
|
||||||
end
|
|
||||||
|
|
||||||
if http_images_path
|
|
||||||
http_images_path = "#{http_images_path}/" unless http_images_path[-1..-1] == "/"
|
|
||||||
path = "#{http_images_path}#{path}"
|
|
||||||
end
|
|
||||||
|
|
||||||
if real_path && File.exists?(real_path)
|
|
||||||
path += "?#{File.mtime(real_path).strftime("%s")}"
|
|
||||||
elsif real_path
|
|
||||||
$stderr.puts "WARNING: '#{File.basename(path)}' was not found in #{File.dirname(real_path)}"
|
|
||||||
end
|
|
||||||
|
|
||||||
Sass::Script::String.new("url(#{path})")
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def absolute_path?(path)
|
|
||||||
path[0..0] == "/" || path[0..3] == "http"
|
|
||||||
end
|
|
||||||
|
|
||||||
def compute_relative_path
|
|
||||||
if (target_css_file = options[:css_filename])
|
|
||||||
images_path = File.join(Compass.configuration.project_path, Compass.configuration.images_dir)
|
|
||||||
Pathname.new(images_path).relative_path_from(Pathname.new(File.dirname(target_css_file))).to_s
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# XXX: We can remove this check and monkeypatch once Sass 2.2 is released.
|
|
||||||
module Sass::Plugin
|
|
||||||
class << self
|
|
||||||
unless method_defined?(:exact_stylesheet_needs_update?)
|
|
||||||
def stylesheet_needs_update?(name, template_path, css_path)
|
|
||||||
css_file = css_filename(name, css_path)
|
|
||||||
template_file = template_filename(name, template_path)
|
|
||||||
exact_stylesheet_needs_update?(css_file, template_file)
|
|
||||||
end
|
|
||||||
def exact_stylesheet_needs_update?(css_file, template_file)
|
|
||||||
if !File.exists?(css_file)
|
|
||||||
return true
|
|
||||||
else
|
|
||||||
css_mtime = File.mtime(css_file)
|
|
||||||
File.mtime(template_file) > css_mtime ||
|
|
||||||
dependencies(template_file).any?(&dependency_updated?(css_mtime))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
@ -70,7 +70,7 @@ FRAMEWORKS
|
|||||||
within_tmp_directory do
|
within_tmp_directory do
|
||||||
generate_rails_app("compass_rails")
|
generate_rails_app("compass_rails")
|
||||||
Dir.chdir "compass_rails" do
|
Dir.chdir "compass_rails" do
|
||||||
compass("--rails", ".") do |responder|
|
compass("--rails", '--trace', ".") do |responder|
|
||||||
responder.respond_to "Is this OK? (Y/n) ", :with => "Y"
|
responder.respond_to "Is this OK? (Y/n) ", :with => "Y"
|
||||||
responder.respond_to "Emit compiled stylesheets to public/stylesheets/compiled/? (Y/n) ", :with => "Y"
|
responder.respond_to "Emit compiled stylesheets to public/stylesheets/compiled/? (Y/n) ", :with => "Y"
|
||||||
end
|
end
|
||||||
|
@ -18,9 +18,10 @@ class CompassTest < Test::Unit::TestCase
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_blueprint_generates_no_files
|
def test_empty_project
|
||||||
|
# With no sass files, we should have no css files.
|
||||||
within_project(:empty) do |proj|
|
within_project(:empty) do |proj|
|
||||||
return unless File.exists?(proj.css_path)
|
return unless proj.css_path && File.exists?(proj.css_path)
|
||||||
Dir.new(proj.css_path).each do |f|
|
Dir.new(proj.css_path).each do |f|
|
||||||
fail "This file should not have been generated: #{f}" unless f == "." || f == ".."
|
fail "This file should not have been generated: #{f}" unless f == "." || f == ".."
|
||||||
end
|
end
|
||||||
@ -80,11 +81,13 @@ private
|
|||||||
|
|
||||||
def within_project(project_name)
|
def within_project(project_name)
|
||||||
@current_project = project_name
|
@current_project = project_name
|
||||||
Compass.configuration.parse(configuration_file(project_name))
|
Compass.configuration.parse(configuration_file(project_name)) if File.exists?(configuration_file(project_name))
|
||||||
Compass.configuration.project_path = project_path(project_name)
|
Compass.configuration.project_path = project_path(project_name)
|
||||||
args = Compass.configuration.to_compiler_arguments(:logger => Compass::NullLogger.new)
|
args = Compass.configuration.to_compiler_arguments(:logger => Compass::NullLogger.new)
|
||||||
compiler = Compass::Compiler.new *args
|
if Compass.configuration.sass_path && File.exists?(Compass.configuration.sass_path)
|
||||||
compiler.run
|
compiler = Compass::Compiler.new *args
|
||||||
|
compiler.run
|
||||||
|
end
|
||||||
yield Compass.configuration
|
yield Compass.configuration
|
||||||
rescue
|
rescue
|
||||||
save_output(project_name)
|
save_output(project_name)
|
||||||
|
BIN
test/fixtures/stylesheets/blueprint/images/grid.png
vendored
Normal file
BIN
test/fixtures/stylesheets/blueprint/images/grid.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 199 B |
@ -1,5 +1,4 @@
|
|||||||
require File.dirname(__FILE__)+'/test_helper'
|
require File.dirname(__FILE__)+'/test_helper'
|
||||||
require 'compass'
|
|
||||||
|
|
||||||
class SassExtensionsTest < Test::Unit::TestCase
|
class SassExtensionsTest < Test::Unit::TestCase
|
||||||
def test_simple
|
def test_simple
|
||||||
|
13
test/test_case_helper.rb
Normal file
13
test/test_case_helper.rb
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
module Compass
|
||||||
|
module TestCaseHelper
|
||||||
|
def absolutize(path)
|
||||||
|
if path.blank?
|
||||||
|
File.dirname(__FILE__)
|
||||||
|
elsif path[0] == ?/
|
||||||
|
"#{File.dirname(__FILE__)}#{path}"
|
||||||
|
else
|
||||||
|
"#{File.dirname(__FILE__)}/#{path}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -1,15 +1,4 @@
|
|||||||
# allows testing with edge Rails by creating a test/rails symlink
|
|
||||||
RAILS_ROOT = linked_rails = File.dirname(__FILE__) + '/rails'
|
|
||||||
RAILS_ENV = 'test'
|
|
||||||
|
|
||||||
need_gems = false
|
need_gems = false
|
||||||
if File.exists?(linked_rails) && !$:.include?(linked_rails + '/activesupport/lib')
|
|
||||||
puts "[ using linked Rails ]"
|
|
||||||
$:.unshift linked_rails + '/activesupport/lib'
|
|
||||||
$:.unshift linked_rails + '/actionpack/lib'
|
|
||||||
else
|
|
||||||
need_gems = true
|
|
||||||
end
|
|
||||||
|
|
||||||
# allows testing with edge Haml by creating a test/haml symlink
|
# allows testing with edge Haml by creating a test/haml symlink
|
||||||
linked_haml = File.dirname(__FILE__) + '/haml'
|
linked_haml = File.dirname(__FILE__) + '/haml'
|
||||||
@ -24,22 +13,8 @@ end
|
|||||||
|
|
||||||
require 'rubygems' if need_gems
|
require 'rubygems' if need_gems
|
||||||
|
|
||||||
require 'action_controller'
|
require 'compass'
|
||||||
require 'action_view'
|
|
||||||
|
|
||||||
|
|
||||||
require 'test/unit'
|
require 'test/unit'
|
||||||
|
|
||||||
module Compass
|
require File.join(File.dirname(__FILE__), 'test_case_helper')
|
||||||
module TestCaseHelper
|
|
||||||
def absolutize(path)
|
|
||||||
if path.blank?
|
|
||||||
File.dirname(__FILE__)
|
|
||||||
elsif path[0] == ?/
|
|
||||||
"#{File.dirname(__FILE__)}#{path}"
|
|
||||||
else
|
|
||||||
"#{File.dirname(__FILE__)}/#{path}"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
Loading…
Reference in New Issue
Block a user