diff options
-rw-r--r-- | CHANGES | 5 | ||||
-rw-r--r-- | ChangeLog.txt | 3 | ||||
-rw-r--r-- | lib/erubis/engine.rb | 35 | ||||
-rw-r--r-- | test/test-erubis.rb | 72 |
4 files changed, 99 insertions, 16 deletions
@@ -39,6 +39,11 @@ This is useful for 'erubis -x file.rhtml | ruby -wc'. - | + Erubis::Engine.load_file(filename) creates cache file (filename + + '.cache') automatically if cache file is not exist or cache file + is old. + + - | New option '-c context' support. It takes context string in YAML inline style or Ruby code style. diff --git a/ChangeLog.txt b/ChangeLog.txt index 2c0cfe9..321fdcd 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -2,6 +2,9 @@ .?lastupdate: $Date$ .?version: $Rev$ +: Rev.55 (2007-02-03) + .- [change] engine.rb: Erubis::Engine.load_file(filename) creates cache file automatically. + : Rev.54 (2007-02-02) .- [change] engine/eruby.rb: class Erubis::Eruby changed to include StringBufferEnhancer instead of ArrayBufferEnhancer diff --git a/lib/erubis/engine.rb b/lib/erubis/engine.rb index 20d9815..20e767b 100644 --- a/lib/erubis/engine.rb +++ b/lib/erubis/engine.rb @@ -23,11 +23,6 @@ module Erubis #include Converter #include Generator - # convert input string and set it to @src - def convert!(input) - @src = convert(input) - end - def initialize(input=nil, properties={}) #@input = input init_generator(properties) @@ -36,12 +31,34 @@ module Erubis @src = convert(input) if input end - ## load file and create engine object + + ## + ## convert input string and set it to @src + ## + def convert!(input) + @src = convert(input) + end + + + ## + ## load file, write cache file, and return engine object. + ## this method create cache file (filename + '.cache') automatically. + ## def self.load_file(filename, properties={}) - input = File.open(filename, 'rb') { |f| f.read } - input.untaint # is it ok? + cachename = filename + '.cache' properties[:filename] = filename - engine = self.new(input, properties) + if test(?f, cachename) && File.mtime(filename) <= File.mtime(cachename) + engine = self.new(nil, properties) + engine.src = File.read(cachename) + else + input = File.open(filename, 'rb') { |f| f.read } + engine = self.new(input, properties) + File.open(cachename, 'w') do |f| + f.flock(File::LOCK_EX) + f.write(engine.src) + end + end + engine.src.untaint # ok? return engine end diff --git a/test/test-erubis.rb b/test/test-erubis.rb index 0058e61..7b64079 100644 --- a/test/test-erubis.rb +++ b/test/test-erubis.rb @@ -41,20 +41,22 @@ class ErubisTest < Test::Unit::TestCase end end if @chomp - if @testopt != 'load_file' - if @klass == Erubis::TinyEruby - eruby = @klass.new(@input) - else - eruby = @klass.new(@input, @options) - end - else + if @testopt == 'load_file' filename = "tmp.#{@name}.eruby" begin File.open(filename, 'w') { |f| f.write(@input) } eruby = @klass.load_file(filename, @options) ensure + cachename = filename + '.cache' + File.unlink(cachename) if test(?f, cachename) File.unlink(filename) if test(?f, filename) end + else + if @klass == Erubis::TinyEruby + eruby = @klass.new(@input) + else + eruby = @klass.new(@input, @options) + end end assert_text_equal(@src, eruby.src) @@ -96,6 +98,62 @@ class ErubisTest < Test::Unit::TestCase end end + + def test_load_file_cache1 + @input = <<END +<ul> +<% for item in @list %> + <li><%= item %></li> +<% end %> +</ul> +END + @src = <<END +_buf = ''; _buf << '<ul> +'; for item in @list + _buf << ' <li>'; _buf << ( item ).to_s; _buf << '</li> +'; end + _buf << '</ul> +'; +_buf.to_s +END + @klass = Erubis::Eruby + filename = 'tmp.load_file_timestamp1' + cachename = filename + '.cache' + begin + File.open(filename, 'w') { |f| f.write(@input) } + assert_block() { !test(?f, cachename) } + engine = @klass.load_file(filename) + assert_block() { test(?f, cachename) } + assert_block() { File.mtime(filename) <= File.mtime(cachename) } + assert_text_equal(@src, engine.src) + # + input2 = @input.gsub(/ul>/, 'ol>') + src2 = @src.gsub(/ul>/, 'ol>') + mtime = File.mtime(filename) + File.open(filename, 'w') { |f| f.write(input2) } + t1 = Time.now() + sleep(1) + t2 = Time.now() + File.utime(t1, t1, filename) + File.utime(t2, t2, cachename) + assert_block('cache should be newer') { File.mtime(filename) < File.mtime(cachename) } + engine = @klass.load_file(filename) + assert_block('cache should be newer') { File.mtime(filename) < File.mtime(cachename) } + assert_text_equal(@src, engine.src) + # + File.utime(t2, t2, filename) + File.utime(t1, t1, cachename) + assert_block('cache should be older') { File.mtime(filename) > File.mtime(cachename) } + engine = @klass.load_file(filename) + assert_block('cache should be newer') { File.mtime(filename) <= File.mtime(cachename) } + assert_text_equal(src2, engine.src) + ensure + File.unlink(cachename) if File.file?(cachename) + File.unlink(filename) if File.file?(filename) + end + end + + end __END__ |