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:
parent
a6ef2d2e95
commit
c4032e6acf
6
init.rb
6
init.rb
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
||||
|
|
|
@ -1,6 +0,0 @@
|
|||
require File.dirname(__FILE__) + '/../../../lib/sass'
|
||||
require 'sass/sass_helper'
|
||||
|
||||
class FakeController
|
||||
include Sass::SassHelper
|
||||
end
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue