Skip to content

Commit 1c02d23

Browse files
committed
Revert "Remove safe_level and further positional arguments (#7)"
This reverts commit 5133efa. While we already handled this deprecation in many libraries, we noticed that some (e.g. sprockets) relied on the format of `ERB.version` and 2b4182e broke such handling. Given that the `ERB.version` change was released at 3.1 and it's obviously new, I'll skip this removal in 3.2 and postpone this to a future version.
1 parent 7b0b4c5 commit 1c02d23

File tree

4 files changed

+92
-15
lines changed

4 files changed

+92
-15
lines changed

NEWS.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
# Change Log
22

3-
## Unreleased (to be 3.0.0)
3+
## Unreleased
44

5-
- Remove `safe_level` and further positional arguments from `ERB.new`
65
- Fix a bug that a magic comment with a wrong format could be detected
76

87
## 2.2.3

lib/erb.rb

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -808,7 +808,20 @@ class ERB
808808
# Chicken Fried Steak -- 9.95
809809
# A well messages pattie, breaded and fried.
810810
#
811-
def initialize(str, trim_mode: nil, eoutvar: '_erbout')
811+
def initialize(str, safe_level=NOT_GIVEN, legacy_trim_mode=NOT_GIVEN, legacy_eoutvar=NOT_GIVEN, trim_mode: nil, eoutvar: '_erbout')
812+
# Complex initializer for $SAFE deprecation at [Feature #14256]. Use keyword arguments to pass trim_mode or eoutvar.
813+
if safe_level != NOT_GIVEN
814+
warn 'Passing safe_level with the 2nd argument of ERB.new is deprecated. Do not use it, and specify other arguments as keyword arguments.', uplevel: 1
815+
end
816+
if legacy_trim_mode != NOT_GIVEN
817+
warn 'Passing trim_mode with the 3rd argument of ERB.new is deprecated. Use keyword argument like ERB.new(str, trim_mode: ...) instead.', uplevel: 1
818+
trim_mode = legacy_trim_mode
819+
end
820+
if legacy_eoutvar != NOT_GIVEN
821+
warn 'Passing eoutvar with the 4th argument of ERB.new is deprecated. Use keyword argument like ERB.new(str, eoutvar: ...) instead.', uplevel: 1
822+
eoutvar = legacy_eoutvar
823+
end
824+
812825
compiler = make_compiler(trim_mode)
813826
set_eoutvar(compiler, eoutvar)
814827
@src, @encoding, @frozen_string = *compiler.compile(str)

test/erb/test_erb.rb

Lines changed: 65 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,29 @@ def test_with_filename
2424
assert_match(/\Atest filename:1\b/, e.backtrace[0])
2525
end
2626

27+
# [deprecated] This will be removed later
28+
def test_without_filename_with_safe_level
29+
erb = EnvUtil.suppress_warning do
30+
ERB.new("<% raise ::TestERB::MyError %>", 1)
31+
end
32+
e = assert_raise(MyError) {
33+
erb.result
34+
}
35+
assert_match(/\A\(erb\):1\b/, e.backtrace[0])
36+
end
37+
38+
# [deprecated] This will be removed later
39+
def test_with_filename_and_safe_level
40+
erb = EnvUtil.suppress_warning do
41+
ERB.new("<% raise ::TestERB::MyError %>", 1)
42+
end
43+
erb.filename = "test filename"
44+
e = assert_raise(MyError) {
45+
erb.result
46+
}
47+
assert_match(/\Atest filename:1\b/, e.backtrace[0])
48+
end
49+
2750
def test_with_filename_lineno
2851
erb = ERB.new("<% raise ::TestERB::MyError %>")
2952
erb.filename = "test filename"
@@ -75,16 +98,25 @@ def test_version
7598
end
7699

77100
def test_core
101+
# [deprecated] Fix initializer later
102+
EnvUtil.suppress_warning do
103+
_test_core(nil)
104+
_test_core(0)
105+
_test_core(1)
106+
end
107+
end
108+
109+
def _test_core(safe)
78110
erb = @erb.new("hello")
79111
assert_equal("hello", erb.result)
80112

81-
erb = @erb.new("hello", trim_mode: 0)
113+
erb = @erb.new("hello", safe, 0)
82114
assert_equal("hello", erb.result)
83115

84-
erb = @erb.new("hello", trim_mode: 1)
116+
erb = @erb.new("hello", safe, 1)
85117
assert_equal("hello", erb.result)
86118

87-
erb = @erb.new("hello", trim_mode: 2)
119+
erb = @erb.new("hello", safe, 2)
88120
assert_equal("hello", erb.result)
89121

90122
src = <<EOS
@@ -112,9 +144,9 @@ def test_core
112144
EOS
113145
erb = @erb.new(src)
114146
assert_equal(ans, erb.result)
115-
erb = @erb.new(src, trim_mode: 0)
147+
erb = @erb.new(src, safe, 0)
116148
assert_equal(ans, erb.result)
117-
erb = EnvUtil.suppress_warning { @erb.new(src, trim_mode: '') }
149+
erb = @erb.new(src, safe, '')
118150
assert_equal(ans, erb.result)
119151

120152
ans = <<EOS
@@ -125,9 +157,9 @@ def test_core
125157
* 1% n=0
126158
* 2
127159
EOS
128-
erb = @erb.new(src, trim_mode: 1)
160+
erb = @erb.new(src, safe, 1)
129161
assert_equal(ans.chomp, erb.result)
130-
erb = @erb.new(src, trim_mode: '>')
162+
erb = @erb.new(src, safe, '>')
131163
assert_equal(ans.chomp, erb.result)
132164

133165
ans = <<EOS
@@ -141,9 +173,9 @@ def test_core
141173
* 2
142174
EOS
143175

144-
erb = @erb.new(src, trim_mode: 2)
176+
erb = @erb.new(src, safe, 2)
145177
assert_equal(ans, erb.result)
146-
erb = @erb.new(src, trim_mode: '<>')
178+
erb = @erb.new(src, safe, '<>')
147179
assert_equal(ans, erb.result)
148180

149181
ans = <<EOS
@@ -157,15 +189,15 @@ def test_core
157189
* 0
158190
159191
EOS
160-
erb = @erb.new(src, trim_mode: '%')
192+
erb = @erb.new(src, safe, '%')
161193
assert_equal(ans, erb.result)
162194

163195
ans = <<EOS
164196
% hi
165197
= hello
166198
* 0* 0* 0
167199
EOS
168-
erb = @erb.new(src, trim_mode: '%>')
200+
erb = @erb.new(src, safe, '%>')
169201
assert_equal(ans.chomp, erb.result)
170202

171203
ans = <<EOS
@@ -175,7 +207,7 @@ def test_core
175207
* 0
176208
* 0
177209
EOS
178-
erb = @erb.new(src, trim_mode: '%<>')
210+
erb = @erb.new(src, safe, '%<>')
179211
assert_equal(ans, erb.result)
180212
end
181213

@@ -629,6 +661,27 @@ def test_half_working_comment_backward_compatibility
629661
end
630662
end
631663

664+
# [deprecated] These interfaces will be removed later
665+
def test_deprecated_interface_warnings
666+
[nil, 0, 1, 2].each do |safe|
667+
assert_warn(/2nd argument of ERB.new is deprecated/) do
668+
ERB.new('', safe)
669+
end
670+
end
671+
672+
[nil, '', '%', '%<>'].each do |trim|
673+
assert_warn(/3rd argument of ERB.new is deprecated/) do
674+
ERB.new('', nil, trim)
675+
end
676+
end
677+
678+
[nil, '_erbout', '_hamlout'].each do |eoutvar|
679+
assert_warn(/4th argument of ERB.new is deprecated/) do
680+
ERB.new('', nil, nil, eoutvar)
681+
end
682+
end
683+
end
684+
632685
def test_prohibited_marshal_dump
633686
erb = ERB.new("")
634687
assert_raise(TypeError) {Marshal.dump(erb)}

test/erb/test_erb_command.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,16 @@ def test_template_file_encoding
1515
File.expand_path("../../libexec/erb", __dir__)],
1616
"<%=''.encoding.to_s%>", ["UTF-8"])
1717
end
18+
19+
# These interfaces will be removed at Ruby 2.7.
20+
def test_deprecated_option
21+
warnings = [
22+
"warning: -S option of erb command is deprecated. Please do not use this.",
23+
/\n.+\/libexec\/erb:\d+: warning: Passing safe_level with the 2nd argument of ERB\.new is deprecated\. Do not use it, and specify other arguments as keyword arguments\.\n/,
24+
]
25+
assert_in_out_err(["-I#{File.expand_path('../../lib', __dir__)}", "-w",
26+
File.expand_path("../../libexec/erb", __dir__),
27+
"-S", "0"],
28+
"hoge", ["hoge"], warnings)
29+
end
1830
end

0 commit comments

Comments
 (0)