From cc777d09f44fa909a336ba14f3aa802ffe16e010 Mon Sep 17 00:00:00 2001 From: k0kubun Date: Thu, 22 Feb 2018 13:28:25 +0000 Subject: erb.rb: deprecate safe_level of ERB.new Also, as it's in the middle of the list of 4 arguments, 3rd and 4th arguments (trim_mode, eoutvar) are changed to keyword arguments. Old ways to specify arguments are deprecated and warned now. bin/erb: deprecate -S option. We'll remove all of deprecated ones at Ruby 2.7+. enc/make_encmake.rb: stopped using deprecated interface ext/etc/mkconstants.rb: ditto ext/socket/mkconstants.rb: ditto sample/ripper/ruby2html.rb: ditto spec/ruby/library/erb/defmethod/def_erb_method_spec.rb: ditto spec/ruby/library/erb/new_spec.rb: ditto test/erb/test_erb.rb: ditto test/erb/test_erb_command.rb: ditto tool/generic_erb.rb: ditto tool/ruby_vm/helpers/dumper.rb: ditto tool/transcode-tblgen.rb: ditto lib/rdoc/erbio.rb: ditto lib/rdoc/generator/darkfish.rb: ditto [Feature #14256] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62529 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- NEWS | 5 ++ bin/erb | 9 ++- enc/make_encmake.rb | 12 +++- ext/etc/mkconstants.rb | 16 +++-- ext/socket/mkconstants.rb | 30 +++++--- lib/erb.rb | 27 +++++-- lib/rdoc/erbio.rb | 6 +- lib/rdoc/generator/darkfish.rb | 6 +- sample/ripper/ruby2html.rb | 6 +- .../library/erb/defmethod/def_erb_method_spec.rb | 6 +- spec/ruby/library/erb/new_spec.rb | 69 ++++++++++++++---- test/erb/test_erb.rb | 84 +++++++++++++++------- test/erb/test_erb_command.rb | 12 ++++ tool/generic_erb.rb | 6 +- tool/ruby_vm/helpers/dumper.rb | 6 +- tool/transcode-tblgen.rb | 6 +- 16 files changed, 236 insertions(+), 70 deletions(-) diff --git a/NEWS b/NEWS index c846fcbb45..2e36f5b61c 100644 --- a/NEWS +++ b/NEWS @@ -69,6 +69,11 @@ with all sufficient information, see the ChangeLog file or Redmine === Stdlib updates (outstanding ones only) +* ERB + + * 2nd, 3rd and 4th arguments of ERB.new are deprecated. 2nd argument (safe_level) will be dropped in the future + and some of those arguments (trim_mode, eoutvar) are changed to keyword arguments. [Feature #14256] + * Matrix * New method: diff --git a/bin/erb b/bin/erb index 86f7042fae..d060caba90 100755 --- a/bin/erb +++ b/bin/erb @@ -75,6 +75,7 @@ class ERB when '-r' # require require ARGV.req_arg when '-S' # security level + warn 'warning: -S option of erb command is deprecated. Please do not use this.' arg = ARGV.req_arg raise "invalid safe_level #{arg.dump}" unless arg =~ /\A[0-1]\z/ safe_level = arg.to_i @@ -112,7 +113,6 @@ class ERB -v enable verbose mode -d set $DEBUG to true -r library load a library - -S safe_level set $SAFE (0..1) -E ex[:in] set default external/internal encodings -U set default encoding to UTF-8. -T trim_mode specify trim_mode (0..2, -) @@ -127,7 +127,12 @@ EOU filename = $FILENAME exit 2 unless src trim = trim_mode_opt(trim_mode, disable_percent) - erb = factory.new(src.untaint, safe_level, trim) + if safe_level.nil? + erb = factory.new(src.untaint, trim_mode: trim) + else + # [deprecated] This will be removed at Ruby 2.7. + erb = factory.new(src.untaint, safe_level, trim_mode: trim) + end erb.filename = filename if output if number diff --git a/enc/make_encmake.rb b/enc/make_encmake.rb index 4ab85f36e3..06979dbad7 100755 --- a/enc/make_encmake.rb +++ b/enc/make_encmake.rb @@ -121,7 +121,11 @@ ENCS, ENC_DEPS = target_encodings ATRANS, TRANS = target_transcoders if File.exist?(depend = File.join($srcdir, "depend")) - erb = ERB.new(File.read(depend), nil, '%') + if RUBY_VERSION >= '2.6' + erb = ERB.new(File.read(depend), trim_mode: '%') + else + erb = ERB.new(File.read(depend), nil, '%') + end erb.filename = depend tmp = erb.result(binding) dep = "\n#### depend ####\n\n" << depend_rules(tmp).join @@ -135,7 +139,11 @@ open(ARGV[0], 'wb') {|f| } if MODULE_TYPE == :static filename = "encinit.c.erb" - erb = ERB.new(File.read(File.join($srcdir, filename)), nil, '%-') + if RUBY_VERSION >= '2.6' + erb = ERB.new(File.read(File.join($srcdir, filename)), trim_mode: '%-') + else + erb = ERB.new(File.read(File.join($srcdir, filename)), nil, '%-') + end erb.filename = "enc/#{filename}" tmp = erb.result(binding) begin diff --git a/ext/etc/mkconstants.rb b/ext/etc/mkconstants.rb index 18f34c9875..69b472d682 100644 --- a/ext/etc/mkconstants.rb +++ b/ext/etc/mkconstants.rb @@ -66,7 +66,15 @@ def each_name(pat) } end -ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_const_decls") +erb_new = lambda do |src, safe, trim| + if RUBY_VERSION >= '2.6' + ERB.new(src, trim_mode: trim) + else + ERB.new(src, safe, trim) + end +end + +erb_new.call(<<'EOS', nil, '%').def_method(Object, "gen_const_decls") % each_const {|name, default_value| #if !defined(<%=name%>) # if defined(HAVE_CONST_<%=name.upcase%>) @@ -80,7 +88,7 @@ ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_const_decls") % } EOS -ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_const_defs") +erb_new.call(<<'EOS', nil, '%').def_method(Object, "gen_const_defs") % each_const {|name, default_value| #if defined(<%=name%>) % if comment = COMMENTS[name] @@ -91,13 +99,13 @@ ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_const_defs") % } EOS -header_result = ERB.new(<<'EOS', nil, '%').result(binding) +header_result = erb_new.call(<<'EOS', nil, '%').result(binding) /* autogenerated file */ <%= gen_const_decls %> EOS -result = ERB.new(<<'EOS', nil, '%').result(binding) +result = erb_new.call(<<'EOS', nil, '%').result(binding) /* autogenerated file */ #ifdef HAVE_LONG_LONG diff --git a/ext/socket/mkconstants.rb b/ext/socket/mkconstants.rb index 0ebf628b46..86e0453ae8 100644 --- a/ext/socket/mkconstants.rb +++ b/ext/socket/mkconstants.rb @@ -73,7 +73,15 @@ def each_name(pat) } end -ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_const_decls") +erb_new = lambda do |src, safe, trim| + if RUBY_VERSION >= '2.6' + ERB.new(src, trim_mode: trim) + else + ERB.new(src, safe, trim) + end +end + +erb_new.call(<<'EOS', nil, '%').def_method(Object, "gen_const_decls") % each_const {|guard, name, default_value| #if !defined(<%=name%>) # if defined(HAVE_CONST_<%=name.upcase%>) @@ -87,7 +95,7 @@ ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_const_decls") % } EOS -ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_const_defs_in_guard(name, default_value)") +erb_new.call(<<'EOS', nil, '%').def_method(Object, "gen_const_defs_in_guard(name, default_value)") #if defined(<%=name%>) /* <%= COMMENTS[name] %> */ rb_define_const(rb_cSocket, <%=c_str name%>, INTEGER2NUM(<%=name%>)); @@ -96,7 +104,7 @@ ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_const_defs_in_guard(name, def #endif EOS -ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_const_defs") +erb_new.call(<<'EOS', nil, '%').def_method(Object, "gen_const_defs") % each_const {|guard, name, default_value| % if guard #if <%=guard%> @@ -146,7 +154,7 @@ def each_names_with_len(pat, prefix_optional=nil) } end -ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_name_to_int_decl(funcname, pat, prefix_optional, guard=nil)") +erb_new.call(<<'EOS', nil, '%').def_method(Object, "gen_name_to_int_decl(funcname, pat, prefix_optional, guard=nil)") %if guard #ifdef <%=guard%> int <%=funcname%>(const char *str, long len, int *valp); @@ -156,7 +164,7 @@ int <%=funcname%>(const char *str, long len, int *valp); %end EOS -ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_name_to_int_func_in_guard(funcname, pat, prefix_optional, guard=nil)") +erb_new.call(<<'EOS', nil, '%').def_method(Object, "gen_name_to_int_func_in_guard(funcname, pat, prefix_optional, guard=nil)") int <%=funcname%>(const char *str, long len, int *valp) { @@ -177,7 +185,7 @@ int } EOS -ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_name_to_int_func(funcname, pat, prefix_optional, guard=nil)") +erb_new.call(<<'EOS', nil, '%').def_method(Object, "gen_name_to_int_func(funcname, pat, prefix_optional, guard=nil)") %if guard #ifdef <%=guard%> <%=gen_name_to_int_func_in_guard(funcname, pat, prefix_optional, guard)%> @@ -206,7 +214,7 @@ def reverse_each_name_with_prefix_optional(pat, prefix_pat) end end -ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_int_to_name_hash(hash_var, pat, prefix_pat)") +erb_new.call(<<'EOS', nil, '%').def_method(Object, "gen_int_to_name_hash(hash_var, pat, prefix_pat)") <%=hash_var%> = st_init_numtable(); % reverse_each_name_with_prefix_optional(pat, prefix_pat) {|n,s| #ifdef <%=n%> @@ -215,7 +223,7 @@ ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_int_to_name_hash(hash_var, pa % } EOS -ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_int_to_name_func(func_name, hash_var)") +erb_new.call(<<'EOS', nil, '%').def_method(Object, "gen_int_to_name_func(func_name, hash_var)") ID <%=func_name%>(int val) { @@ -226,7 +234,7 @@ ID } EOS -ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_int_to_name_decl(func_name, hash_var)") +erb_new.call(<<'EOS', nil, '%').def_method(Object, "gen_int_to_name_decl(func_name, hash_var)") ID <%=func_name%>(int val); EOS @@ -275,7 +283,7 @@ def_intern('rsock_intern_udp_optname', /\AUDP_/, "UDP_") def_intern('rsock_intern_scm_optname', /\ASCM_/, "SCM_") def_intern('rsock_intern_local_optname', /\ALOCAL_/, "LOCAL_") -result = ERB.new(<<'EOS', nil, '%').result(binding) +result = erb_new.call(<<'EOS', nil, '%').result(binding) /* autogenerated file */ <%= INTERN_DEFS.map {|vardef, gen_hash, decl, func| vardef }.join("\n") %> @@ -318,7 +326,7 @@ init_constants(void) EOS -header_result = ERB.new(<<'EOS', nil, '%').result(binding) +header_result = erb_new.call(<<'EOS', nil, '%').result(binding) /* autogenerated file */ <%= gen_const_decls %> <%= NAME_TO_INT_DEFS.map {|decl, func| decl }.join("\n") %> diff --git a/lib/erb.rb b/lib/erb.rb index 215a3f516f..c50d3eac48 100644 --- a/lib/erb.rb +++ b/lib/erb.rb @@ -115,7 +115,7 @@ require "cgi/util" # James Edward Gray II # }.gsub(/^ /, '') # -# message = ERB.new(template, 0, "%<>") +# message = ERB.new(template, trim_mode: "%<>") # # # Set up template data. # to = "Community Spokesman " @@ -263,7 +263,7 @@ class ERB # Returns revision information for the erb.rb module. def self.version - "erb.rb [2.1.0 #{ERB::Revision.split[1]}]" + "erb.rb [2.2.0 #{ERB::Revision.split[1]}]" end end @@ -777,11 +777,11 @@ class ERB # def build # b = binding # # create and run templates, filling member data variables - # ERB.new(<<-'END_PRODUCT'.gsub(/^\s+/, ""), 0, "", "@product").result b + # ERB.new(<<-'END_PRODUCT'.gsub(/^\s+/, ""), trim_mode: "", eoutvar: "@product").result b # <%= PRODUCT[:name] %> # <%= PRODUCT[:desc] %> # END_PRODUCT - # ERB.new(<<-'END_PRICE'.gsub(/^\s+/, ""), 0, "", "@price").result b + # ERB.new(<<-'END_PRICE'.gsub(/^\s+/, ""), trim_mode: "", eoutvar: "@price").result b # <%= PRODUCT[:name] %> -- <%= PRODUCT[:cost] %> # <%= PRODUCT[:desc] %> # END_PRICE @@ -802,7 +802,22 @@ class ERB # Chicken Fried Steak -- 9.95 # A well messages pattie, breaded and fried. # - def initialize(str, safe_level=nil, trim_mode=nil, eoutvar='_erbout') + def initialize(str, safe_level=NOT_GIVEN, legacy_trim_mode=NOT_GIVEN, legacy_eoutvar=NOT_GIVEN, trim_mode: nil, eoutvar: '_erbout') + # Complex initializer for $SAFE deprecation at Feature #14256, which should be removed at Ruby 2.7. + if safe_level != NOT_GIVEN + warn 'warning: Passing safe_level with the 2nd argument of ERB.new is deprecated. Do not use it, and specify other arguments as keyword arguments.' + else + safe_level = nil + end + if legacy_trim_mode != NOT_GIVEN + warn 'warning: Passing trim_mode with the 3rd argument of ERB.new is deprecated. Use keyword argument like ERB.new(str, trim_mode: ...) instead.' + trim_mode = legacy_trim_mode + end + if legacy_eoutvar != NOT_GIVEN + warn 'warning: Passing eoutvar with the 4th argument of ERB.new is deprecated. Use keyword argument like ERB.new(str, eoutvar: ...) instead.' + eoutvar = legacy_eoutvar + end + @safe_level = safe_level compiler = make_compiler(trim_mode) set_eoutvar(compiler, eoutvar) @@ -810,6 +825,8 @@ class ERB @filename = nil @lineno = 0 end + NOT_GIVEN = Object.new + private_constant :NOT_GIVEN ## # Creates a new compiler for ERB. See ERB::Compiler.new for details diff --git a/lib/rdoc/erbio.rb b/lib/rdoc/erbio.rb index 42ce895fb3..2ebce9519f 100644 --- a/lib/rdoc/erbio.rb +++ b/lib/rdoc/erbio.rb @@ -21,7 +21,11 @@ class RDoc::ERBIO < ERB # Defaults +eoutvar+ to 'io', otherwise is identical to ERB's initialize def initialize str, safe_level = nil, trim_mode = nil, eoutvar = 'io' - super + if RUBY_VERSION >= '2.6' + super(str, trim_mode: trim_mode, eoutvar: eoutvar) + else + super + end end ## diff --git a/lib/rdoc/generator/darkfish.rb b/lib/rdoc/generator/darkfish.rb index bf4eb1f530..a07f74e716 100644 --- a/lib/rdoc/generator/darkfish.rb +++ b/lib/rdoc/generator/darkfish.rb @@ -778,7 +778,11 @@ class RDoc::Generator::Darkfish erbout = "_erbout_#{file_var}" end - template = klass.new template, nil, '<>', erbout + if RUBY_VERSION >= '2.6' + template = klass.new template, trim_mode: '<>', eoutvar: erbout + else + template = klass.new template, nil, '<>', erbout + end @template_cache[file] = template template end diff --git a/sample/ripper/ruby2html.rb b/sample/ripper/ruby2html.rb index 8f64f5a713..1e6b3bf550 100644 --- a/sample/ripper/ruby2html.rb +++ b/sample/ripper/ruby2html.rb @@ -73,7 +73,11 @@ class ERB end def ruby2html(f, encoding, css, print_line_number) - erb = ERB.new(TEMPLATE, nil, '>') + if RUBY_VERSION >= '2.6' + erb = ERB.new(TEMPLATE, trim_mode: '>') + else + erb = ERB.new(TEMPLATE, nil, '>') + end erb.filename = __FILE__ erb.lineno = TEMPLATE_LINE erb.result(binding()) diff --git a/spec/ruby/library/erb/defmethod/def_erb_method_spec.rb b/spec/ruby/library/erb/defmethod/def_erb_method_spec.rb index e1eca2fbef..6c465936c1 100644 --- a/spec/ruby/library/erb/defmethod/def_erb_method_spec.rb +++ b/spec/ruby/library/erb/defmethod/def_erb_method_spec.rb @@ -50,7 +50,11 @@ END MY_INPUT4_FOR_ERB = input class MyClass4ForErb extend ERB::DefMethod - erb = ERB.new(MY_INPUT4_FOR_ERB, nil, '<>') + if RUBY_VERSION >= '2.6' + erb = ERB.new(MY_INPUT4_FOR_ERB, trim_mode: '<>') + else + erb = ERB.new(MY_INPUT4_FOR_ERB, nil, '<>') + end def_erb_method('render()', erb) def initialize(items) @items = items diff --git a/spec/ruby/library/erb/new_spec.rb b/spec/ruby/library/erb/new_spec.rb index f141f1c00e..156873a598 100644 --- a/spec/ruby/library/erb/new_spec.rb +++ b/spec/ruby/library/erb/new_spec.rb @@ -31,21 +31,33 @@ END it "compiles eRuby script into ruby code when trim mode is 0 or not specified" do expected = "\n" [0, '', nil].each do |trim_mode| - ERB.new(@eruby_str, nil, trim_mode).result.should == expected + if RUBY_VERSION >= '2.6' + ERB.new(@eruby_str, trim_mode: trim_mode).result.should == expected + else + ERB.new(@eruby_str, nil, trim_mode).result.should == expected + end end end it "removes '\n' when trim_mode is 1 or '>'" do expected = "\n" [1, '>'].each do |trim_mode| - ERB.new(@eruby_str, nil, trim_mode).result.should == expected + if RUBY_VERSION >= '2.6' + ERB.new(@eruby_str, trim_mode: trim_mode).result.should == expected + else + ERB.new(@eruby_str, nil, trim_mode).result.should == expected + end end end it "removes spaces at beginning of line and '\n' when trim_mode is 2 or '<>'" do expected = "\n" [2, '<>'].each do |trim_mode| - ERB.new(@eruby_str, nil, trim_mode).result.should == expected + if RUBY_VERSION >= '2.6' + ERB.new(@eruby_str, trim_mode: trim_mode).result.should == expected + else + ERB.new(@eruby_str, nil, trim_mode).result.should == expected + end end end @@ -61,7 +73,11 @@ END END - ERB.new(input, nil, '-').result.should == expected + if RUBY_VERSION >= '2.6' + ERB.new(input, trim_mode: '-').result.should == expected + else + ERB.new(input, nil, '-').result.should == expected + end end @@ -75,23 +91,39 @@ END END lambda { - ERB.new(input, nil, '-').result + if RUBY_VERSION >= '2.6' + ERB.new(input, trim_mode: '-').result + else + ERB.new(input, nil, '-').result + end }.should raise_error(SyntaxError) end it "regards lines starting with '%' as '<% ... %>' when trim_mode is '%'" do expected = "\n%%\n" - ERB.new(@eruby_str2, nil, "%").result.should == expected + if RUBY_VERSION >= '2.6' + ERB.new(@eruby_str2, trim_mode: "%").result.should == expected + else + ERB.new(@eruby_str2, nil, "%").result.should == expected + end end it "regards lines starting with '%' as '<% ... %>' and remove \"\\n\" when trim_mode is '%>'" do expected = "\n%%\n" - ERB.new(@eruby_str2, nil, '%>').result.should == expected + if RUBY_VERSION >= '2.6' + ERB.new(@eruby_str2, trim_mode: '%>').result.should == expected + else + ERB.new(@eruby_str2, nil, '%>').result.should == expected + end end it "regard lines starting with '%' as '<% ... %>' and remove \"\\n\" when trim_mode is '%<>'" do expected = "\n%%\n" - ERB.new(@eruby_str2, nil, '%<>').result.should == expected + if RUBY_VERSION >= '2.6' + ERB.new(@eruby_str2, trim_mode: '%<>').result.should == expected + else + ERB.new(@eruby_str2, nil, '%<>').result.should == expected + end end @@ -106,13 +138,22 @@ END %%% END - ERB.new(input, nil, '%-').result.should == expected + if RUBY_VERSION >= '2.6' + ERB.new(input, trim_mode: '%-').result.should == expected + else + ERB.new(input, nil, '%-').result.should == expected + end end it "changes '_erbout' variable name in the produced source" do input = @eruby_str - match_erbout = ERB.new(input, nil, nil).src - match_buf = ERB.new(input, nil, nil, 'buf').src + if RUBY_VERSION >= '2.6' + match_erbout = ERB.new(input, trim_mode: nil).src + match_buf = ERB.new(input, trim_mode: nil, eoutvar: 'buf').src + else + match_erbout = ERB.new(input, nil, nil).src + match_buf = ERB.new(input, nil, nil, 'buf').src + end match_erbout.gsub("_erbout", "buf").should == match_buf end @@ -124,7 +165,11 @@ END <%# end %> END ERB.new(input).result.should == "\n\n\n" - ERB.new(input, nil, '<>').result.should == "\n" + if RUBY_VERSION >= '2.6' + ERB.new(input, trim_mode: '<>').result.should == "\n" + else + ERB.new(input, nil, '<>').result.should == "\n" + end end it "forget local variables defined previous one" do diff --git a/test/erb/test_erb.rb b/test/erb/test_erb.rb index 045ce5129b..ffa1fef23d 100644 --- a/test/erb/test_erb.rb +++ b/test/erb/test_erb.rb @@ -24,16 +24,22 @@ class TestERB < Test::Unit::TestCase assert_match(/\Atest filename:1\b/, e.backtrace[0]) end + # [deprecated] This will be removed at Ruby 2.7 def test_without_filename_with_safe_level - erb = ERB.new("<% raise ::TestERB::MyError %>", 1) + erb = EnvUtil.suppress_warning do + ERB.new("<% raise ::TestERB::MyError %>", 1) + end e = assert_raise(MyError) { erb.result } assert_match(/\A\(erb\):1\b/, e.backtrace[0]) end + # [deprecated] This will be removed at Ruby 2.7 def test_with_filename_and_safe_level - erb = ERB.new("<% raise ::TestERB::MyError %>", 1) + erb = EnvUtil.suppress_warning do + ERB.new("<% raise ::TestERB::MyError %>", 1) + end erb.filename = "test filename" e = assert_raise(MyError) { erb.result @@ -92,9 +98,12 @@ class TestERBCore < Test::Unit::TestCase end def test_core - _test_core(nil) - _test_core(0) - _test_core(1) + # [deprecated] Fix initializer at Ruby 2.7 + EnvUtil.suppress_warning do + _test_core(nil) + _test_core(0) + _test_core(1) + end end def _test_core(safe) @@ -203,26 +212,26 @@ EOS end def test_trim_line1_with_carriage_return - erb = @erb.new("<% 3.times do %>\r\nline\r\n<% end %>\r\n", nil, '>') + erb = @erb.new("<% 3.times do %>\r\nline\r\n<% end %>\r\n", trim_mode: '>') assert_equal("line\r\n" * 3, erb.result) - erb = @erb.new("<% 3.times do %>\r\nline\r\n<% end %>\r\n", nil, '%>') + erb = @erb.new("<% 3.times do %>\r\nline\r\n<% end %>\r\n", trim_mode: '%>') assert_equal("line\r\n" * 3, erb.result) end def test_trim_line2_with_carriage_return - erb = @erb.new("<% 3.times do %>\r\nline\r\n<% end %>\r\n", nil, '<>') + erb = @erb.new("<% 3.times do %>\r\nline\r\n<% end %>\r\n", trim_mode: '<>') assert_equal("line\r\n" * 3, erb.result) - erb = @erb.new("<% 3.times do %>\r\nline\r\n<% end %>\r\n", nil, '%<>') + erb = @erb.new("<% 3.times do %>\r\nline\r\n<% end %>\r\n", trim_mode: '%<>') assert_equal("line\r\n" * 3, erb.result) end def test_explicit_trim_line_with_carriage_return - erb = @erb.new("<%- 3.times do -%>\r\nline\r\n<%- end -%>\r\n", nil, '-') + erb = @erb.new("<%- 3.times do -%>\r\nline\r\n<%- end -%>\r\n", trim_mode: '-') assert_equal("line\r\n" * 3, erb.result) - erb = @erb.new("<%- 3.times do -%>\r\nline\r\n<%- end -%>\r\n", nil, '%-') + erb = @erb.new("<%- 3.times do -%>\r\nline\r\n<%- end -%>\r\n", trim_mode: '%-') assert_equal("line\r\n" * 3, erb.result) end @@ -259,26 +268,26 @@ EOS %n = 1 <%= n%> EOS - assert_equal("1\n", ERB.new(src, nil, '%').result(binding)) + assert_equal("1\n", ERB.new(src, trim_mode: '%').result(binding)) src = < EOS ans = "\n" - assert_equal(ans, ERB.new(src, nil, '%').result(binding)) + assert_equal(ans, ERB.new(src, trim_mode: '%').result(binding)) src = "<%\n%>" # ans = "\n" ans = "" - assert_equal(ans, ERB.new(src, nil, '%').result(binding)) + assert_equal(ans, ERB.new(src, trim_mode: '%').result(binding)) src = <<%= n%> EOS - assert_equal("1\n", ERB.new(src, nil, '%').result(binding)) + assert_equal("1\n", ERB.new(src, trim_mode: '%').result(binding)) src = <<%1 %% EOS - assert_equal(ans, ERB.new(src, nil, '%').result(binding)) + assert_equal(ans, ERB.new(src, trim_mode: '%').result(binding)) end def test_def_erb_method @@ -378,7 +387,7 @@ foo %% print 'foo' EOS - assert_equal(ans, ERB.new(src, nil, '%').result) + assert_equal(ans, ERB.new(src, trim_mode: '%').result) end def test_keep_lineno @@ -389,7 +398,7 @@ Hello,\s % raise("lineno") EOS - erb = ERB.new(src, nil, '%') + erb = ERB.new(src, trim_mode: '%') e = assert_raise(RuntimeError) { erb.result } @@ -407,7 +416,7 @@ EOS %>Hello,\s World%> EOS - assert_equal(ans, ERB.new(src, nil, '>').result) + assert_equal(ans, ERB.new(src, trim_mode: '>').result) ans = < @@ -415,7 +424,7 @@ Hello,\s World%> EOS - assert_equal(ans, ERB.new(src, nil, '<>').result) + assert_equal(ans, ERB.new(src, trim_mode: '<>').result) ans = < @@ -440,13 +449,13 @@ EOS } assert_match(/\A\(erb\):5\b/, e.backtrace[0].to_s) - erb = ERB.new(src, nil, '>') + erb = ERB.new(src, trim_mode: '>') e = assert_raise(RuntimeError) { erb.result } assert_match(/\A\(erb\):5\b/, e.backtrace[0].to_s) - erb = ERB.new(src, nil, '<>') + erb = ERB.new(src, trim_mode: '<>') e = assert_raise(RuntimeError) { erb.result } @@ -460,13 +469,13 @@ EOS <% raise("lineno") %> EOS - erb = ERB.new(src, nil, '-') + erb = ERB.new(src, trim_mode: '-') e = assert_raise(RuntimeError) { erb.result } assert_match(/\A\(erb\):5\b/, e.backtrace[0].to_s) - erb = ERB.new(src, nil, '%-') + erb = ERB.new(src, trim_mode: '%-') e = assert_raise(RuntimeError) { erb.result } @@ -502,8 +511,8 @@ NotSkip NotSkip * WORLD KeepNewLine \s EOS - assert_equal(ans, ERB.new(src, nil, '-').result) - assert_equal(ans, ERB.new(src, nil, '-%').result) + assert_equal(ans, ERB.new(src, trim_mode: '-').result) + assert_equal(ans, ERB.new(src, trim_mode: '-%').result) end def test_url_encode @@ -519,7 +528,7 @@ EOS end def test_percent_after_etag - assert_equal("1%", @erb.new("<%= 1 %>%", nil, "%").result) + assert_equal("1%", @erb.new("<%= 1 %>%", trim_mode: "%").result) end def test_token_extension @@ -629,6 +638,27 @@ EOS @erb.new("<% # comment %>\n").result end end + + # These interfaces will be removed at Ruby 2.7. + def test_deprecated_interface_warnings + [nil, 0, 1, 2].each do |safe| + assert_warning(/2nd argument of ERB.new is deprecated/) do + ERB.new('', safe) + end + end + + [nil, '', '%', '%<>'].each do |trim| + assert_warning(/3rd argument of ERB.new is deprecated/) do + ERB.new('', nil, trim) + end + end + + [nil, '_erbout', '_hamlout'].each do |eoutvar| + assert_warning(/4th argument of ERB.new is deprecated/) do + ERB.new('', nil, nil, eoutvar) + end + end + end end class TestERBCoreWOStrScan < TestERBCore diff --git a/test/erb/test_erb_command.rb b/test/erb/test_erb_command.rb index 7e2b874632..ac87b07740 100644 --- a/test/erb/test_erb_command.rb +++ b/test/erb/test_erb_command.rb @@ -15,4 +15,16 @@ class TestErbCommand < Test::Unit::TestCase File.expand_path("../../../bin/erb", __FILE__)], "<%=''.encoding.to_s%>", ["UTF-8"]) end + + # These interfaces will be removed at Ruby 2.7. + def test_deprecated_option + warnings = [ + "warning: -S option of erb command is deprecated. Please do not use this.", + "warning: Passing safe_level with the 2nd argument of ERB.new is deprecated. Do not use it, and specify other arguments as keyword arguments.", + ] + assert_in_out_err(["-w", + File.expand_path("../../../bin/erb", __FILE__), + "-S", "0"], + "hoge", ["hoge"], warnings) + end end diff --git a/tool/generic_erb.rb b/tool/generic_erb.rb index c9986c7284..83c569b55b 100644 --- a/tool/generic_erb.rb +++ b/tool/generic_erb.rb @@ -34,7 +34,11 @@ unchanged = color.pass("unchanged") updated = color.fail("updated") result = templates.map do |template| - erb = ERB.new(File.read(template), nil, '%-') + if RUBY_VERSION >= '2.6' + erb = ERB.new(File.read(template), trim_mode: '%-') + else + erb = ERB.new(File.read(template), nil, '%-') + end erb.filename = template source ? erb.src : proc{erb.result(binding)}.call end diff --git a/tool/ruby_vm/helpers/dumper.rb b/tool/ruby_vm/helpers/dumper.rb index b622b898b9..ec7871dbea 100644 --- a/tool/ruby_vm/helpers/dumper.rb +++ b/tool/ruby_vm/helpers/dumper.rb @@ -32,7 +32,11 @@ class RubyVM::Dumper rescue Errno::ENOENT raise "don't know how to generate #{path}" else - erb = ERB.new src, nil, '%-' + if RUBY_VERSION >= '2.6' + erb = ERB.new(src, trim_mode: '%-') + else + erb = ERB.new(src, nil, '%-') + end erb.filename = path.realpath.to_path return erb end diff --git a/tool/transcode-tblgen.rb b/tool/transcode-tblgen.rb index f43627b781..6a896ad392 100644 --- a/tool/transcode-tblgen.rb +++ b/tool/transcode-tblgen.rb @@ -1078,7 +1078,11 @@ if __FILE__ == $0 end libs1 = $".dup - erb = ERB.new(src, nil, '%') + if RUBY_VERSION >= '2.6' + erb = ERB.new(src, trim_mode: '%') + else + erb = ERB.new(src, nil, '%') + end erb.filename = arg erb_result = erb.result(binding) libs2 = $".dup -- cgit v1.2.3