summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES5
-rw-r--r--ChangeLog.txt3
-rw-r--r--lib/erubis/engine.rb35
-rw-r--r--test/test-erubis.rb72
4 files changed, 99 insertions, 16 deletions
diff --git a/CHANGES b/CHANGES
index 1f41f6c..e9ede00 100644
--- a/CHANGES
+++ b/CHANGES
@@ -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__