ruby-changes:6046
From: shyouhei <ko1@a...>
Date: Tue, 24 Jun 2008 16:17:16 +0900 (JST)
Subject: [ruby-changes:6046] Ruby:r17555 (ruby_1_8_6): merge revision(s) 16763:
shyouhei 2008-06-24 16:16:52 +0900 (Tue, 24 Jun 2008) New Revision: 17555 Added files: branches/ruby_1_8_6/test/erb/hello.erb Modified files: branches/ruby_1_8_6/ChangeLog branches/ruby_1_8_6/lib/erb.rb branches/ruby_1_8_6/test/erb/test_erb.rb branches/ruby_1_8_6/version.h Log: merge revision(s) 16763: * lib/erb.rb (ERB::Compiler::TrimScanner#explicit_trim_line): Fix without strscan problems. [ruby_core:17028]. * test/erb/test_erb.rb (TestERBCoreWOStrScan): Add test class for without strscan. http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_6/lib/erb.rb?r1=17555&r2=17554&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_6/ChangeLog?r1=17555&r2=17554&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_6/version.h?r1=17555&r2=17554&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_6/test/erb/test_erb.rb?r1=17555&r2=17554&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8_6/test/erb/hello.erb Index: ruby_1_8_6/ChangeLog =================================================================== --- ruby_1_8_6/ChangeLog (revision 17554) +++ ruby_1_8_6/ChangeLog (revision 17555) @@ -1,3 +1,11 @@ +Tue Jun 24 15:38:52 2008 Masatoshi SEKI <m_seki@m...> + + * lib/erb.rb (ERB::Compiler::TrimScanner#explicit_trim_line): Fix + without strscan problems. [ruby_core:17028]. + + * test/erb/test_erb.rb (TestERBCoreWOStrScan): Add test class for + without strscan. + Sun Jun 22 00:09:20 2008 Akinori MUSHA <knu@i...> * lib/delegate.rb (DelegateClass, Delegator#respond_to?): Index: ruby_1_8_6/version.h =================================================================== --- ruby_1_8_6/version.h (revision 17554) +++ ruby_1_8_6/version.h (revision 17555) @@ -1,15 +1,15 @@ #define RUBY_VERSION "1.8.6" -#define RUBY_RELEASE_DATE "2008-06-22" +#define RUBY_RELEASE_DATE "2008-06-24" #define RUBY_VERSION_CODE 186 -#define RUBY_RELEASE_CODE 20080622 -#define RUBY_PATCHLEVEL 231 +#define RUBY_RELEASE_CODE 20080624 +#define RUBY_PATCHLEVEL 232 #define RUBY_VERSION_MAJOR 1 #define RUBY_VERSION_MINOR 8 #define RUBY_VERSION_TEENY 6 #define RUBY_RELEASE_YEAR 2008 #define RUBY_RELEASE_MONTH 6 -#define RUBY_RELEASE_DAY 22 +#define RUBY_RELEASE_DAY 24 #ifdef RUBY_EXTERN RUBY_EXTERN const char ruby_version[]; Index: ruby_1_8_6/lib/erb.rb =================================================================== --- ruby_1_8_6/lib/erb.rb (revision 17554) +++ ruby_1_8_6/lib/erb.rb (revision 17555) @@ -365,21 +365,22 @@ end end - ExplicitTrimRegexp = /(^[ \t]*<%-)|(-%>\n?\z)|(<%-)|(-%>)|(<%%)|(%%>)|(<%=)|(<%#)|(<%)|(%>)|(\n)/ def explicit_trim_line(line) - line.split(ExplicitTrimRegexp).each do |token| - next if token.empty? - if @stag.nil? && /[ \t]*<%-/ =~ token - yield('<%') - elsif @stag && /-%>\n/ =~ token - yield('%>') - yield(:cr) - elsif @stag && token == '-%>' - yield('%>') - else - yield(token) - end - end + line.scan(/(.*?)(^[ \t]*<%\-|<%\-|<%%|%%>|<%=|<%#|<%|-%>\n|-%>|%>|\z)/m) do |tokens| + tokens.each do |token| + next if token.empty? + if @stag.nil? && /[ \t]*<%-/ =~ token + yield('<%') + elsif @stag && token == "-%>\n" + yield('%>') + yield(:cr) + elsif @stag && token == '-%>' + yield('%>') + else + yield(token) + end + end + end end ERB_STAG = %w(<%= <%# <%) Index: ruby_1_8_6/test/erb/test_erb.rb =================================================================== --- ruby_1_8_6/test/erb/test_erb.rb (revision 17554) +++ ruby_1_8_6/test/erb/test_erb.rb (revision 17555) @@ -38,3 +38,387 @@ assert_equal("test filename:1", e.backtrace[0]) end end + +class TestERBCore < Test::Unit::TestCase + def setup + @erb = ERB + end + + def test_core + _test_core(nil) + _test_core(0) + _test_core(1) + _test_core(2) + _test_core(3) + end + + def _test_core(safe) + erb = @erb.new("hello") + assert_equal("hello", erb.result) + + erb = @erb.new("hello", safe, 0) + assert_equal("hello", erb.result) + + erb = @erb.new("hello", safe, 1) + assert_equal("hello", erb.result) + + erb = @erb.new("hello", safe, 2) + assert_equal("hello", erb.result) + + src = <<EOS +%% hi += hello +<% 3.times do |n| %> +% n=0 +* <%= n %> +<% end %> +EOS + + ans = <<EOS +%% hi += hello + +% n=0 +* 0 + +% n=0 +* 1 + +% n=0 +* 2 + +EOS + erb = @erb.new(src) + assert_equal(ans, erb.result) + erb = @erb.new(src, safe, 0) + assert_equal(ans, erb.result) + erb = @erb.new(src, safe, '') + assert_equal(ans, erb.result) + + ans = <<EOS +%% hi += hello +% n=0 +* 0% n=0 +* 1% n=0 +* 2 +EOS + erb = @erb.new(src, safe, 1) + assert_equal(ans.chomp, erb.result) + erb = @erb.new(src, safe, '>') + assert_equal(ans.chomp, erb.result) + + ans = <<EOS +%% hi += hello +% n=0 +* 0 +% n=0 +* 1 +% n=0 +* 2 +EOS + + erb = @erb.new(src, safe, 2) + assert_equal(ans, erb.result) + erb = @erb.new(src, safe, '<>') + assert_equal(ans, erb.result) + + ans = <<EOS +% hi += hello + +* 0 + +* 0 + +* 0 + +EOS + erb = @erb.new(src, safe, '%') + assert_equal(ans, erb.result) + + ans = <<EOS +% hi += hello +* 0* 0* 0 +EOS + erb = @erb.new(src, safe, '%>') + assert_equal(ans.chomp, erb.result) + + ans = <<EOS +% hi += hello +* 0 +* 0 +* 0 +EOS + erb = @erb.new(src, safe, '%<>') + assert_equal(ans, erb.result) + end + + def test_safe_04 + erb = @erb.new('<%=$SAFE%>', 4) + assert_equal('4', erb.result(TOPLEVEL_BINDING.taint)) + end + + class Foo; end + + def test_def_class + erb = @erb.new('hello') + cls = erb.def_class + assert_equal(Object, cls.superclass) + assert(cls.new.respond_to?('result')) + cls = erb.def_class(Foo) + assert_equal(Foo, cls.superclass) + assert(cls.new.respond_to?('result')) + cls = erb.def_class(Object, 'erb') + assert_equal(Object, cls.superclass) + assert(cls.new.respond_to?('erb')) + end + + def test_percent + src = <<EOS +%n = 1 +<%= n%> +EOS + assert_equal("1\n", ERB.new(src, nil, '%').result) + + src = <<EOS +<% +%> +EOS + ans = "\n" + assert_equal(ans, ERB.new(src, nil, '%').result) + + src = "<%\n%>" + # ans = "\n" + ans = "" + assert_equal(ans, ERB.new(src, nil, '%').result) + + src = <<EOS +<% +n = 1 +%><%= n%> +EOS + assert_equal("1\n", ERB.new(src, nil, '%').result) + + src = <<EOS +%n = 1 +%% <% n = 2 +n.times do |i|%> +%% %%><%%<%= i%><% +end%> +EOS + ans = <<EOS +% +% %%><%0 +% %%><%1 +EOS + assert_equal(ans, ERB.new(src, nil, '%').result) + end + + def test_def_method + klass = Class.new + klass.module_eval do + extend ERB::DefMethod + fname = File.join(File.dirname(File.expand_path(__FILE__)), 'hello.erb') + def_erb_method('hello', fname) + end + assert(klass.new.respond_to?('hello')) + + assert(! klass.new.respond_to?('hello_world')) + erb = @erb.new('hello, world') + klass.module_eval do + def_erb_method('hello_world', erb) + end + assert(klass.new.respond_to?('hello_world')) + end + + def test_escape + src = <<EOS +1.<%% : <%="<%%"%> +2.%%> : <%="%%>"%> +3. +% x = "foo" +<%=x%> +4. +%% print "foo" +5. +%% <%="foo"%> +6.<%=" +% print 'foo' +"%> +7.<%=" +%% print 'foo' +"%> +EOS + ans = <<EOS +1.<% : <%% +2.%%> : %> +3. +foo +4. +% print "foo" +5. +% foo +6. +% print 'foo' + +7. +%% print 'foo' + +EOS + assert_equal(ans, ERB.new(src, nil, '%').result) + end + + def test_keep_lineno + src = <<EOS +Hello, +% x = "World" +<%= x%> +% raise("lineno") +EOS + + erb = ERB.new(src, nil, '%') + begin + erb.result + assert(false) + rescue + assert_equal("(erb):4", $@[0].to_s) + end + + src = <<EOS +%> +Hello, +<% x = "World%%> +"%> +<%= x%> +EOS + + ans = <<EOS +%>Hello, +World%> +EOS + assert_equal(ans, ERB.new(src, nil, '>').result) + + ans = <<EOS +%> +Hello, + +World%> +EOS + assert_equal(ans, ERB.new(src, nil, '<>').result) + + ans = <<EOS +%> +Hello, + +World%> + +EOS + assert_equal(ans, ERB.new(src).result) + + src = <<EOS +Hello, +<% x = "World%%> +"%> +<%= x%> +<% raise("lineno") %> +EOS + + erb = ERB.new(src) + begin + erb.result + assert(false) + rescue + assert_equal("(erb):5", $@[0].to_s) + end + + erb = ERB.new(src, nil, '>') + begin + erb.result + assert(false) + rescue + assert_equal("(erb):5", $@[0].to_s) + end + + erb = ERB.new(src, nil, '<>') + begin + erb.result + assert(false) + rescue + assert_equal("(erb):5", $@[0].to_s) + end + +# src = <<EOS +# % y = 'Hello' +# <%- x = "World%%> +# "-%> +# <%= x %><%- x = nil -%> +# <% raise("lineno") %> +# EOS + +# erb = ERB.new(src, nil, '-') +# begin +# erb.result +# assert(false) +# rescue +# assert_equal("(erb):5", $@[0].to_s) +# end + +# erb = ERB.new(src, nil, '%-') +# begin +# erb.result +# assert(false) +# rescue +# assert_equal("(erb):5", $@[0].to_s) +# end + end + + def test_explicit + src = <<EOS +<% x = %w(hello world) -%> +NotSkip <%- y = x -%> NotSkip +<% x.each do |w| -%> + <%- up = w.upcase -%> + * <%= up %> +<% end -%> + <%- z = nil -%> NotSkip <%- z = x %> + <%- z.each do |w| -%> + <%- down = w.downcase -%> + * <%= down %> + <%- up = w.upcase -%> + * <%= up %> + <%- end -%> +KeepNewLine <%- z = nil -%> +EOS + + ans = <<EOS +NotSkip NotSkip + * HELLO + * WORLD + NotSkip + * hello + * HELLO + * world + * WORLD +KeepNewLine +EOS + assert_equal(ans, ERB.new(src, nil, '-').result) + assert_equal(ans, ERB.new(src, nil, '-%').result) + end +end + +class TestERBCoreWOStrScan < TestERBCore + def setup + @save_map = ERB::Compiler::Scanner.instance_variable_get('@scanner_map') + map = {[nil, false]=>ERB::Compiler::SimpleScanner} + ERB::Compiler::Scanner.instance_variable_set('@scanner_map', map) + super + end + + def teardown + ERB::Compiler::Scanner.instance_variable_set('@scanner_map', @save_map) + end +end Index: ruby_1_8_6/test/erb/hello.erb =================================================================== --- ruby_1_8_6/test/erb/hello.erb (revision 0) +++ ruby_1_8_6/test/erb/hello.erb (revision 17555) @@ -0,0 +1,4 @@ += hello +<% 3.times do |n| %> +* <%= n %> +<% end %> Property changes on: ruby_1_8_6/test/erb/hello.erb ___________________________________________________________________ Name: svn:eol-style + LF Name: svn:keywords + Author Id Revision -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/