[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]