Better tests, closer to 100% rcov.

git-svn-id: svn://hamptoncatlin.com/haml/branches/1.5dev@193 7063305b-7217-0410-af8c-cdc13e5119b9
This commit is contained in:
nex3 2006-12-04 02:47:37 +00:00
parent a6ef2d2e95
commit c4032e6acf
8 changed files with 132 additions and 97 deletions

View File

@ -1,9 +1,7 @@
require 'haml'
require 'haml/template'
require 'sass'
require 'sass/sass_helper'
require 'sass/plugin'
ActionView::Base.register_template_handler('haml', Haml::Template)
ActionView::Base.class_eval do
include Sass::SassHelper
end
Sass::Plugin.update_stylesheets

View File

@ -26,12 +26,12 @@ module Haml
class << self
@@options = {}
# Gets various options for HAML. See REFERENCE for details.
# Gets various options for Haml. See REFERENCE for details.
def options
@@options
end
# Sets various options for HAML. See REFERENCE for details.
# Sets various options for Haml. See REFERENCE for details.
def options=(value)
@@options = value
end

View File

@ -3,15 +3,14 @@ require 'sass/css/parser'
module Sass
class Engine
def render_file(location)
@result = ""
File.open(location).each_line { |l| @result += l }
render(@result)
def initialize(template, options={})
@template = template
@options = options
end
def render(input)
def render
buffer, stack, last_level, first = "", [], 0, true
input.each do |line|
@template.each do |line|
line, level = [line.strip, line.scan(/[ ]*/)[0].length / 2]
unless line.empty?
if '%.#'.index line[0..0]

74
lib/sass/plugin.rb Normal file
View File

@ -0,0 +1,74 @@
require File.dirname(__FILE__) + '/../sass'
require 'sass/engine'
require 'rubygems'
require 'action_controller'
module Sass
#Rails plugin stuff. For use with ActionView.
module Plugin
class << self
@@options = {
:template_location => RAILS_ROOT + 'public/stylesheets/sass',
:css_locations => RAILS_ROOT + 'public/stylesheets',
:always_update => false,
:always_check => RAILS_ENV != "production"
}
# Gets various options for Sass.
#--
# TODO: *DOCUMENT OPTIONS*
#++
def options
@@options
end
# Sets various options for Sass.
def options=(value)
@@options.merge!(value)
end
def update_stylesheets
Dir[options[:template_location] + '/*.sass'].each do |file|
name = File.basename(file)[0...-5]
if options[:always_update] || stylesheet_needs_update?(name)
css = css_filename(name)
File.delete(css) if File.exists?(css)
engine = Engine.new(File.read(template_filename(name)), @@options.dup)
result = engine.render
File.open(css, 'w') do |file|
file.print(result)
end
end
end
end
private
def template_filename(name)
"#{@@options[:template_location]}/#{name}.sass"
end
def css_filename(name)
"#{@@options[:css_location]}/#{name}.css"
end
def stylesheet_needs_update?(name)
!File.exists?(css_filename(name)) || (File.mtime(template_filename(name)) - 2) > File.mtime(css_filename(name))
end
end
end
end
module ActionController
class Base
alias_method :sass_old_process, :process
def process(*args)
Sass::Plugin.update_stylesheets if Sass::Plugin.options[:always_update] || Sass::Plugin.options[:always_check]
sass_old_process(*args)
end
end
end

View File

@ -1,35 +0,0 @@
require File.dirname(__FILE__) + '/../sass'
require 'sass/engine'
#Rails plugin stuff. For use with action_view
module Sass
module SassHelper
@@options = {}
class << self
def options; @@options; end
def _stylesheet_location
@@options[:stylesheet_location] || (RAILS_ROOT + "/public/stylesheets/")
end
def _always_update
@@options[:always_update] || false
end
def stylesheet_needs_update?(file_location)
!File.exists?(file_location + ".css") || (File.mtime("#{file_location}.sass") - 2) > File.mtime("#{file_location}.css")
end
end
def sass_template(name)
file_location = SassHelper._stylesheet_location + "/" + name.to_s
if SassHelper._always_update || SassHelper.stylesheet_needs_update?(file_location)
output_file = File.open(file_location + ".css", "w+")
output_file << Sass::Engine.new.render_file(file_location + ".sass")
output_file.close
end
end
end
end

View File

@ -5,9 +5,6 @@ require File.dirname(__FILE__) + '/../../lib/sass'
require 'sass/engine'
class SassEngineTest < Test::Unit::TestCase
def setup
@engine = Sass::Engine.new
end
def test_basic_render
renders_correctly "basic"
@ -16,7 +13,7 @@ class SassEngineTest < Test::Unit::TestCase
def renders_correctly(name)
sass_file = load_file(name, "sass")
css_file = load_file(name, "css")
css_result = @engine.render(sass_file)
css_result = Sass::Engine.new(sass_file).render
#puts css_result.collect { |a| a.inspect }.join("\n ")
assert_equal css_file.strip, css_result.strip
end

View File

@ -1,6 +0,0 @@
require File.dirname(__FILE__) + '/../../../lib/sass'
require 'sass/sass_helper'
class FakeController
include Sass::SassHelper
end

View File

@ -2,66 +2,74 @@
require 'test/unit'
require File.dirname(__FILE__) + '/../../lib/sass'
require 'sass/engine'
require 'sass/sass_helper'
require File.dirname(__FILE__) + '/mocks/fake_controller'
RAILS_ROOT = ''
RAILS_ENV = 'testing'
require 'sass/plugin'
class SassPluginTest < Test::Unit::TestCase
@@templates = %w{ complex }
def setup
Sass::SassHelper.options[:stylesheet_location] = File.dirname(__FILE__) + '/templates'
Sass::SassHelper.options[:always_update] = true
@controller = FakeController.new
Sass::Plugin.options[:template_location] = File.dirname(__FILE__) + '/templates'
Sass::Plugin.options[:css_location] = File.dirname(__FILE__) + '/tmp'
Sass::Plugin.options = {:always_update => true}
Sass::Plugin.update_stylesheets
end
def teardown
File.delete(*Dir[File.dirname(__FILE__) + '/templates/*.css'])
File.delete(*Dir[tempfile_loc('*')])
end
def test_basic_render
do_file_render :basic
def test_templates_should_render_correctly
@@templates.each { |name| assert_renders_correctly(name) }
end
def test_complex_render
do_file_render :complex
end
def test_no_update
base_file_location = base_file_location(:basic)
assert Sass::SassHelper.stylesheet_needs_update?(base_file_location)
do_file_render :basic
assert !Sass::SassHelper.stylesheet_needs_update?(base_file_location)
File.delete(tempfile_loc('basic'))
assert Sass::Plugin.stylesheet_needs_update?('basic')
Sass::Plugin.update_stylesheets
assert !Sass::Plugin.stylesheet_needs_update?('basic')
end
def assert(*args)
end
def test_controller_process
File.delete(tempfile_loc('basic'))
assert Sass::Plugin.stylesheet_needs_update?('basic')
ActionController::Base.new.process
assert !Sass::Plugin.stylesheet_needs_update?('basic')
end
private
def assert_renders_correctly(name)
do_file_render(name)
tempfile = File.open('/templates/#{name}.css')
result = File.open('/results/#{name}.css')
tempfile.read.split("\n").zip(result.read.split("\n")).each_with_index do |pair, line|
File.read(tempfile_loc(name)).split("\n").zip(File.read(result_loc(name)).split("\n")).each_with_index do |pair, line|
message = "template: #{name}\nline: #{line}"
assert_equal(pair.first, pair.last, message)
end
tempfile.close
result.close
kill_tempfile(name)
end
def do_file_render(name)
@controller.instance_eval do
sass_template(name)
end
end
def base_file_location(name)
File.dirname(__FILE__) + "/templates/#{name}"
def tempfile_loc(name)
File.dirname(__FILE__) + "/tmp/#{name}.css"
end
def kill_tempfile(name)
File.delete(File.dirname(__FILE__) + '/templates/#{name}.css')
def result_loc(name)
File.dirname(__FILE__) + "/results/#{name}.css"
end
end
module Sass::Plugin
class << self
public :stylesheet_needs_update?
end
end
class ActionController::Base
def sass_old_process(*args); end
end