From c4032e6acff73620512b25332a9cb4a917643582 Mon Sep 17 00:00:00 2001 From: nex3 Date: Mon, 4 Dec 2006 02:47:37 +0000 Subject: [PATCH] Better tests, closer to 100% rcov. git-svn-id: svn://hamptoncatlin.com/haml/branches/1.5dev@193 7063305b-7217-0410-af8c-cdc13e5119b9 --- init.rb | 6 +-- lib/haml/template.rb | 4 +- lib/sass/engine.rb | 13 +++-- lib/sass/plugin.rb | 74 +++++++++++++++++++++++++ lib/sass/sass_helper.rb | 35 ------------ test/sass/engine_test.rb | 5 +- test/sass/mocks/fake_controller.rb | 6 --- test/sass/plugin_test.rb | 86 ++++++++++++++++-------------- 8 files changed, 132 insertions(+), 97 deletions(-) create mode 100644 lib/sass/plugin.rb delete mode 100644 lib/sass/sass_helper.rb delete mode 100644 test/sass/mocks/fake_controller.rb diff --git a/init.rb b/init.rb index 976664c4..3d4283a9 100644 --- a/init.rb +++ b/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 diff --git a/lib/haml/template.rb b/lib/haml/template.rb index fe48cce8..45870f50 100644 --- a/lib/haml/template.rb +++ b/lib/haml/template.rb @@ -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 diff --git a/lib/sass/engine.rb b/lib/sass/engine.rb index eac8eeba..2ba4bc53 100644 --- a/lib/sass/engine.rb +++ b/lib/sass/engine.rb @@ -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] diff --git a/lib/sass/plugin.rb b/lib/sass/plugin.rb new file mode 100644 index 00000000..9fc3b2e6 --- /dev/null +++ b/lib/sass/plugin.rb @@ -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 diff --git a/lib/sass/sass_helper.rb b/lib/sass/sass_helper.rb deleted file mode 100644 index 55223eb1..00000000 --- a/lib/sass/sass_helper.rb +++ /dev/null @@ -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 diff --git a/test/sass/engine_test.rb b/test/sass/engine_test.rb index f030b1f4..136d50a2 100644 --- a/test/sass/engine_test.rb +++ b/test/sass/engine_test.rb @@ -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 diff --git a/test/sass/mocks/fake_controller.rb b/test/sass/mocks/fake_controller.rb deleted file mode 100644 index 92af7827..00000000 --- a/test/sass/mocks/fake_controller.rb +++ /dev/null @@ -1,6 +0,0 @@ -require File.dirname(__FILE__) + '/../../../lib/sass' -require 'sass/sass_helper' - -class FakeController - include Sass::SassHelper -end diff --git a/test/sass/plugin_test.rb b/test/sass/plugin_test.rb index d03e68e7..d0e98e69 100644 --- a/test/sass/plugin_test.rb +++ b/test/sass/plugin_test.rb @@ -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