From e82f4195d49b730a48031738694391dbb3e41091 Mon Sep 17 00:00:00 2001 From: nobu Date: Fri, 12 Dec 2014 10:31:47 +0000 Subject: erb: lineno and location setters * lib/erb.rb (ERB#lineno): accessor for line number to eval. * lib/erb.rb (ERB#location=): setter of file name and line number. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@48785 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 6 ++++++ lib/erb.rb | 14 ++++++++++++-- test/erb/test_erb.rb | 19 +++++++++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index b672926d03..548ef3a92c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Fri Dec 12 19:31:44 2014 Nobuyoshi Nakada + + * lib/erb.rb (ERB#lineno): accessor for line number to eval. + + * lib/erb.rb (ERB#location=): setter of file name and line number. + Fri Dec 12 13:09:13 2014 Koichi Sasada * gc.c (gc_latest_gc_info): return :state field to show current diff --git a/lib/erb.rb b/lib/erb.rb index c372f56da8..5c41c37faa 100644 --- a/lib/erb.rb +++ b/lib/erb.rb @@ -799,6 +799,7 @@ class ERB set_eoutvar(compiler, eoutvar) @src, @enc = *compiler.compile(str) @filename = nil + @lineno = 0 end ## @@ -815,6 +816,15 @@ class ERB # is run attr_accessor :filename + # The optional _lineno_ argument passed to Kernel#eval when the ERB code + # is run + attr_accessor :lineno + + def location=((filename, lineno)) + @filename = filename + @lineno = lineno if lineno + end + # # Can be used to set _eoutvar_ as described in ERB::new. It's probably # easier to just use the constructor though, since calling this method @@ -844,10 +854,10 @@ class ERB if @safe_level proc { $SAFE = @safe_level - eval(@src, b, (@filename || '(erb)'), 0) + eval(@src, b, (@filename || '(erb)'), @lineno) }.call else - eval(@src, b, (@filename || '(erb)'), 0) + eval(@src, b, (@filename || '(erb)'), @lineno) end end diff --git a/test/erb/test_erb.rb b/test/erb/test_erb.rb index 65efd39191..107ad1a0da 100644 --- a/test/erb/test_erb.rb +++ b/test/erb/test_erb.rb @@ -39,6 +39,25 @@ class TestERB < Test::Unit::TestCase assert_match(/\Atest filename:1\b/, e.backtrace[0]) end + def test_with_filename_lineno + erb = ERB.new("<% raise ::TestERB::MyError %>") + erb.filename = "test filename" + erb.lineno = 100 + e = assert_raise(MyError) { + erb.result + } + assert_match(/\Atest filename:101\b/, e.backtrace[0]) + end + + def test_with_location + erb = ERB.new("<% raise ::TestERB::MyError %>") + erb.location = ["test filename", 200] + e = assert_raise(MyError) { + erb.result + } + assert_match(/\Atest filename:201\b/, e.backtrace[0]) + end + def test_html_escape assert_equal(" !"\#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~", ERB::Util.html_escape(" !\"\#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~")) -- cgit v1.2.3