Skip to content

Commit cc777d0

Browse files
committed
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
1 parent 1727c83 commit cc777d0

File tree

16 files changed

+236
-70
lines changed

16 files changed

+236
-70
lines changed

NEWS

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,11 @@ with all sufficient information, see the ChangeLog file or Redmine
6969

7070
=== Stdlib updates (outstanding ones only)
7171

72+
* ERB
73+
74+
* 2nd, 3rd and 4th arguments of ERB.new are deprecated. 2nd argument (safe_level) will be dropped in the future
75+
and some of those arguments (trim_mode, eoutvar) are changed to keyword arguments. [Feature #14256]
76+
7277
* Matrix
7378

7479
* New method:

bin/erb

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ class ERB
7575
when '-r' # require
7676
require ARGV.req_arg
7777
when '-S' # security level
78+
warn 'warning: -S option of erb command is deprecated. Please do not use this.'
7879
arg = ARGV.req_arg
7980
raise "invalid safe_level #{arg.dump}" unless arg =~ /\A[0-1]\z/
8081
safe_level = arg.to_i
@@ -112,7 +113,6 @@ class ERB
112113
-v enable verbose mode
113114
-d set $DEBUG to true
114115
-r library load a library
115-
-S safe_level set $SAFE (0..1)
116116
-E ex[:in] set default external/internal encodings
117117
-U set default encoding to UTF-8.
118118
-T trim_mode specify trim_mode (0..2, -)
@@ -127,7 +127,12 @@ EOU
127127
filename = $FILENAME
128128
exit 2 unless src
129129
trim = trim_mode_opt(trim_mode, disable_percent)
130-
erb = factory.new(src.untaint, safe_level, trim)
130+
if safe_level.nil?
131+
erb = factory.new(src.untaint, trim_mode: trim)
132+
else
133+
# [deprecated] This will be removed at Ruby 2.7.
134+
erb = factory.new(src.untaint, safe_level, trim_mode: trim)
135+
end
131136
erb.filename = filename
132137
if output
133138
if number

enc/make_encmake.rb

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,11 @@ def target_transcoders
121121
ATRANS, TRANS = target_transcoders
122122

123123
if File.exist?(depend = File.join($srcdir, "depend"))
124-
erb = ERB.new(File.read(depend), nil, '%')
124+
if RUBY_VERSION >= '2.6'
125+
erb = ERB.new(File.read(depend), trim_mode: '%')
126+
else
127+
erb = ERB.new(File.read(depend), nil, '%')
128+
end
125129
erb.filename = depend
126130
tmp = erb.result(binding)
127131
dep = "\n#### depend ####\n\n" << depend_rules(tmp).join
@@ -135,7 +139,11 @@ def target_transcoders
135139
}
136140
if MODULE_TYPE == :static
137141
filename = "encinit.c.erb"
138-
erb = ERB.new(File.read(File.join($srcdir, filename)), nil, '%-')
142+
if RUBY_VERSION >= '2.6'
143+
erb = ERB.new(File.read(File.join($srcdir, filename)), trim_mode: '%-')
144+
else
145+
erb = ERB.new(File.read(File.join($srcdir, filename)), nil, '%-')
146+
end
139147
erb.filename = "enc/#{filename}"
140148
tmp = erb.result(binding)
141149
begin

ext/etc/mkconstants.rb

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,15 @@ def each_name(pat)
6666
}
6767
end
6868

69-
ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_const_decls")
69+
erb_new = lambda do |src, safe, trim|
70+
if RUBY_VERSION >= '2.6'
71+
ERB.new(src, trim_mode: trim)
72+
else
73+
ERB.new(src, safe, trim)
74+
end
75+
end
76+
77+
erb_new.call(<<'EOS', nil, '%').def_method(Object, "gen_const_decls")
7078
% each_const {|name, default_value|
7179
#if !defined(<%=name%>)
7280
# if defined(HAVE_CONST_<%=name.upcase%>)
@@ -80,7 +88,7 @@ def each_name(pat)
8088
% }
8189
EOS
8290

83-
ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_const_defs")
91+
erb_new.call(<<'EOS', nil, '%').def_method(Object, "gen_const_defs")
8492
% each_const {|name, default_value|
8593
#if defined(<%=name%>)
8694
% if comment = COMMENTS[name]
@@ -91,13 +99,13 @@ def each_name(pat)
9199
% }
92100
EOS
93101

94-
header_result = ERB.new(<<'EOS', nil, '%').result(binding)
102+
header_result = erb_new.call(<<'EOS', nil, '%').result(binding)
95103
/* autogenerated file */
96104
97105
<%= gen_const_decls %>
98106
EOS
99107

100-
result = ERB.new(<<'EOS', nil, '%').result(binding)
108+
result = erb_new.call(<<'EOS', nil, '%').result(binding)
101109
/* autogenerated file */
102110
103111
#ifdef HAVE_LONG_LONG

ext/socket/mkconstants.rb

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,15 @@ def each_name(pat)
7373
}
7474
end
7575

76-
ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_const_decls")
76+
erb_new = lambda do |src, safe, trim|
77+
if RUBY_VERSION >= '2.6'
78+
ERB.new(src, trim_mode: trim)
79+
else
80+
ERB.new(src, safe, trim)
81+
end
82+
end
83+
84+
erb_new.call(<<'EOS', nil, '%').def_method(Object, "gen_const_decls")
7785
% each_const {|guard, name, default_value|
7886
#if !defined(<%=name%>)
7987
# if defined(HAVE_CONST_<%=name.upcase%>)
@@ -87,7 +95,7 @@ def each_name(pat)
8795
% }
8896
EOS
8997

90-
ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_const_defs_in_guard(name, default_value)")
98+
erb_new.call(<<'EOS', nil, '%').def_method(Object, "gen_const_defs_in_guard(name, default_value)")
9199
#if defined(<%=name%>)
92100
/* <%= COMMENTS[name] %> */
93101
rb_define_const(rb_cSocket, <%=c_str name%>, INTEGER2NUM(<%=name%>));
@@ -96,7 +104,7 @@ def each_name(pat)
96104
#endif
97105
EOS
98106

99-
ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_const_defs")
107+
erb_new.call(<<'EOS', nil, '%').def_method(Object, "gen_const_defs")
100108
% each_const {|guard, name, default_value|
101109
% if guard
102110
#if <%=guard%>
@@ -146,7 +154,7 @@ def each_names_with_len(pat, prefix_optional=nil)
146154
}
147155
end
148156

149-
ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_name_to_int_decl(funcname, pat, prefix_optional, guard=nil)")
157+
erb_new.call(<<'EOS', nil, '%').def_method(Object, "gen_name_to_int_decl(funcname, pat, prefix_optional, guard=nil)")
150158
%if guard
151159
#ifdef <%=guard%>
152160
int <%=funcname%>(const char *str, long len, int *valp);
@@ -156,7 +164,7 @@ def each_names_with_len(pat, prefix_optional=nil)
156164
%end
157165
EOS
158166

159-
ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_name_to_int_func_in_guard(funcname, pat, prefix_optional, guard=nil)")
167+
erb_new.call(<<'EOS', nil, '%').def_method(Object, "gen_name_to_int_func_in_guard(funcname, pat, prefix_optional, guard=nil)")
160168
int
161169
<%=funcname%>(const char *str, long len, int *valp)
162170
{
@@ -177,7 +185,7 @@ def each_names_with_len(pat, prefix_optional=nil)
177185
}
178186
EOS
179187

180-
ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_name_to_int_func(funcname, pat, prefix_optional, guard=nil)")
188+
erb_new.call(<<'EOS', nil, '%').def_method(Object, "gen_name_to_int_func(funcname, pat, prefix_optional, guard=nil)")
181189
%if guard
182190
#ifdef <%=guard%>
183191
<%=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)
206214
end
207215
end
208216

209-
ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_int_to_name_hash(hash_var, pat, prefix_pat)")
217+
erb_new.call(<<'EOS', nil, '%').def_method(Object, "gen_int_to_name_hash(hash_var, pat, prefix_pat)")
210218
<%=hash_var%> = st_init_numtable();
211219
% reverse_each_name_with_prefix_optional(pat, prefix_pat) {|n,s|
212220
#ifdef <%=n%>
@@ -215,7 +223,7 @@ def reverse_each_name_with_prefix_optional(pat, prefix_pat)
215223
% }
216224
EOS
217225

218-
ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_int_to_name_func(func_name, hash_var)")
226+
erb_new.call(<<'EOS', nil, '%').def_method(Object, "gen_int_to_name_func(func_name, hash_var)")
219227
ID
220228
<%=func_name%>(int val)
221229
{
@@ -226,7 +234,7 @@ def reverse_each_name_with_prefix_optional(pat, prefix_pat)
226234
}
227235
EOS
228236

229-
ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_int_to_name_decl(func_name, hash_var)")
237+
erb_new.call(<<'EOS', nil, '%').def_method(Object, "gen_int_to_name_decl(func_name, hash_var)")
230238
ID <%=func_name%>(int val);
231239
EOS
232240

@@ -275,7 +283,7 @@ def def_intern(func_name, pat, prefix_optional=nil)
275283
def_intern('rsock_intern_scm_optname', /\ASCM_/, "SCM_")
276284
def_intern('rsock_intern_local_optname', /\ALOCAL_/, "LOCAL_")
277285

278-
result = ERB.new(<<'EOS', nil, '%').result(binding)
286+
result = erb_new.call(<<'EOS', nil, '%').result(binding)
279287
/* autogenerated file */
280288
281289
<%= INTERN_DEFS.map {|vardef, gen_hash, decl, func| vardef }.join("\n") %>
@@ -318,7 +326,7 @@ def def_intern(func_name, pat, prefix_optional=nil)
318326
319327
EOS
320328

321-
header_result = ERB.new(<<'EOS', nil, '%').result(binding)
329+
header_result = erb_new.call(<<'EOS', nil, '%').result(binding)
322330
/* autogenerated file */
323331
<%= gen_const_decls %>
324332
<%= NAME_TO_INT_DEFS.map {|decl, func| decl }.join("\n") %>

lib/erb.rb

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@
115115
# James Edward Gray II
116116
# }.gsub(/^ /, '')
117117
#
118-
# message = ERB.new(template, 0, "%<>")
118+
# message = ERB.new(template, trim_mode: "%<>")
119119
#
120120
# # Set up template data.
121121
# to = "Community Spokesman <spokesman@ruby_community.org>"
@@ -263,7 +263,7 @@ class ERB
263263

264264
# Returns revision information for the erb.rb module.
265265
def self.version
266-
"erb.rb [2.1.0 #{ERB::Revision.split[1]}]"
266+
"erb.rb [2.2.0 #{ERB::Revision.split[1]}]"
267267
end
268268
end
269269

@@ -777,11 +777,11 @@ class ERB
777777
# def build
778778
# b = binding
779779
# # create and run templates, filling member data variables
780-
# ERB.new(<<-'END_PRODUCT'.gsub(/^\s+/, ""), 0, "", "@product").result b
780+
# ERB.new(<<-'END_PRODUCT'.gsub(/^\s+/, ""), trim_mode: "", eoutvar: "@product").result b
781781
# <%= PRODUCT[:name] %>
782782
# <%= PRODUCT[:desc] %>
783783
# END_PRODUCT
784-
# ERB.new(<<-'END_PRICE'.gsub(/^\s+/, ""), 0, "", "@price").result b
784+
# ERB.new(<<-'END_PRICE'.gsub(/^\s+/, ""), trim_mode: "", eoutvar: "@price").result b
785785
# <%= PRODUCT[:name] %> -- <%= PRODUCT[:cost] %>
786786
# <%= PRODUCT[:desc] %>
787787
# END_PRICE
@@ -802,14 +802,31 @@ class ERB
802802
# Chicken Fried Steak -- 9.95
803803
# A well messages pattie, breaded and fried.
804804
#
805-
def initialize(str, safe_level=nil, trim_mode=nil, eoutvar='_erbout')
805+
def initialize(str, safe_level=NOT_GIVEN, legacy_trim_mode=NOT_GIVEN, legacy_eoutvar=NOT_GIVEN, trim_mode: nil, eoutvar: '_erbout')
806+
# Complex initializer for $SAFE deprecation at Feature #14256, which should be removed at Ruby 2.7.
807+
if safe_level != NOT_GIVEN
808+
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.'
809+
else
810+
safe_level = nil
811+
end
812+
if legacy_trim_mode != NOT_GIVEN
813+
warn 'warning: Passing trim_mode with the 3rd argument of ERB.new is deprecated. Use keyword argument like ERB.new(str, trim_mode: ...) instead.'
814+
trim_mode = legacy_trim_mode
815+
end
816+
if legacy_eoutvar != NOT_GIVEN
817+
warn 'warning: Passing eoutvar with the 4th argument of ERB.new is deprecated. Use keyword argument like ERB.new(str, eoutvar: ...) instead.'
818+
eoutvar = legacy_eoutvar
819+
end
820+
806821
@safe_level = safe_level
807822
compiler = make_compiler(trim_mode)
808823
set_eoutvar(compiler, eoutvar)
809824
@src, @encoding, @frozen_string = *compiler.compile(str)
810825
@filename = nil
811826
@lineno = 0
812827
end
828+
NOT_GIVEN = Object.new
829+
private_constant :NOT_GIVEN
813830

814831
##
815832
# Creates a new compiler for ERB. See ERB::Compiler.new for details

lib/rdoc/erbio.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,11 @@ class RDoc::ERBIO < ERB
2121
# Defaults +eoutvar+ to 'io', otherwise is identical to ERB's initialize
2222

2323
def initialize str, safe_level = nil, trim_mode = nil, eoutvar = 'io'
24-
super
24+
if RUBY_VERSION >= '2.6'
25+
super(str, trim_mode: trim_mode, eoutvar: eoutvar)
26+
else
27+
super
28+
end
2529
end
2630

2731
##

lib/rdoc/generator/darkfish.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -778,7 +778,11 @@ def template_for file, page = true, klass = ERB
778778
erbout = "_erbout_#{file_var}"
779779
end
780780

781-
template = klass.new template, nil, '<>', erbout
781+
if RUBY_VERSION >= '2.6'
782+
template = klass.new template, trim_mode: '<>', eoutvar: erbout
783+
else
784+
template = klass.new template, nil, '<>', erbout
785+
end
782786
@template_cache[file] = template
783787
template
784788
end

sample/ripper/ruby2html.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,11 @@ def result(b)
7373
end
7474

7575
def ruby2html(f, encoding, css, print_line_number)
76-
erb = ERB.new(TEMPLATE, nil, '>')
76+
if RUBY_VERSION >= '2.6'
77+
erb = ERB.new(TEMPLATE, trim_mode: '>')
78+
else
79+
erb = ERB.new(TEMPLATE, nil, '>')
80+
end
7781
erb.filename = __FILE__
7882
erb.lineno = TEMPLATE_LINE
7983
erb.result(binding())

spec/ruby/library/erb/defmethod/def_erb_method_spec.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,11 @@ def initialize(items)
5050
MY_INPUT4_FOR_ERB = input
5151
class MyClass4ForErb
5252
extend ERB::DefMethod
53-
erb = ERB.new(MY_INPUT4_FOR_ERB, nil, '<>')
53+
if RUBY_VERSION >= '2.6'
54+
erb = ERB.new(MY_INPUT4_FOR_ERB, trim_mode: '<>')
55+
else
56+
erb = ERB.new(MY_INPUT4_FOR_ERB, nil, '<>')
57+
end
5458
def_erb_method('render()', erb)
5559
def initialize(items)
5660
@items = items

0 commit comments

Comments
 (0)