Skip to content

Commit 0041af4

Browse files
committed
Ensure all RubyTracker RenderParsers are tested
Previously, only the PrismRenderParser or RipperRenderParser would be tested depending on if the Prism gem is available. This meant that PrismRenderParser was being tested on Ruby 3.3 and RipperRenderParser was tested on Ruby < 3.3. Additionally, if someone were to add prism to the rails/rails Gemfile because they wrote a tool that uses it then the RipperRenderParser would end up completely untested. This commit is a small refactor to enable testing both RenderParsers in all Ruby versions so that the prism gem can be added to the Gemfile.
1 parent c7551d0 commit 0041af4

File tree

5 files changed

+34
-12
lines changed

5 files changed

+34
-12
lines changed

Gemfile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ gem "json", ">= 2.0.0", "!=2.7.0"
3636
# Workaround until Ruby ships with cgi version 0.3.6 or higher.
3737
gem "cgi", ">= 0.3.6", require: false
3838

39+
gem "prism"
40+
3941
group :lint do
4042
gem "syntax_tree", "6.1.1", require: false
4143
end

Gemfile.lock

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,7 @@ GEM
370370
path_expander (1.1.1)
371371
pg (1.5.4)
372372
prettier_print (1.2.1)
373+
prism (0.19.0)
373374
propshaft (0.8.0)
374375
actionpack (>= 7.0.0)
375376
activesupport (>= 7.0.0)
@@ -618,6 +619,7 @@ DEPENDENCIES
618619
mysql2 (~> 0.5)
619620
nokogiri (>= 1.8.1, != 1.11.0)
620621
pg (~> 1.3)
622+
prism
621623
propshaft (>= 0.1.7)
622624
puma (>= 5.0.3)
623625
queue_classic (>= 4.0.0)

actionview/lib/action_view/dependency_tracker/ruby_tracker.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@ def self.supports_view_paths? # :nodoc:
1717
true
1818
end
1919

20-
def initialize(name, template, view_paths = nil)
20+
def initialize(name, template, view_paths = nil, parser_class: RenderParser::Default)
2121
@name, @template, @view_paths = name, template, view_paths
22+
@parser_class = parser_class
2223
end
2324

2425
private
@@ -29,7 +30,7 @@ def render_dependencies
2930

3031
compiled_source = template.handler.call(template, template.source)
3132

32-
RenderParser.new(@name, compiled_source).render_calls.filter_map do |render_call|
33+
@parser_class.new(@name, compiled_source).render_calls.filter_map do |render_call|
3334
next if render_call.end_with?("/_")
3435
render_call.gsub(%r|/_|, "/")
3536
end

actionview/lib/action_view/render_parser.rb

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,10 @@ def partial_to_virtual_path(render_type, partial_path)
3131
rescue LoadError
3232
require "ripper"
3333
require_relative "render_parser/ripper_render_parser"
34-
Parser = RipperRenderParser
34+
Default = RipperRenderParser
3535
else
3636
require_relative "render_parser/prism_render_parser"
37-
Parser = PrismRenderParser
38-
end
39-
40-
def self.new(name, code)
41-
Parser.new(name, code)
37+
Default = PrismRenderParser
4238
end
4339
end
4440
end

actionview/test/template/dependency_tracker_test.rb

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@
33
require "abstract_unit"
44
require "action_view/dependency_tracker"
55

6+
require "action_view/render_parser/prism_render_parser"
7+
8+
require "ripper"
9+
require "action_view/render_parser/ripper_render_parser"
10+
611
class NeckbeardTracker
712
def self.call(name, template)
813
["foo/#{name}"]
@@ -228,11 +233,9 @@ def make_tracker(name, template)
228233
end
229234
end
230235

231-
class RubyTrackerTest < Minitest::Test
232-
include SharedTrackerTests
233-
236+
module RubyTrackerTests
234237
def make_tracker(name, template)
235-
ActionView::DependencyTracker::RubyTracker.new(name, template)
238+
ActionView::DependencyTracker::RubyTracker.new(name, template, parser_class: parser_class)
236239
end
237240

238241
def test_dependencies_skip_unknown_options
@@ -262,3 +265,21 @@ def test_dependencies_skip_commented_out_renders
262265
assert_equal [], tracker.dependencies
263266
end
264267
end
268+
269+
class RipperRubyTrackerTest < Minitest::Test
270+
include SharedTrackerTests
271+
include RubyTrackerTests
272+
273+
def parser_class
274+
ActionView::RenderParser::RipperRenderParser
275+
end
276+
end
277+
278+
class PrismRubyTrackerTest < Minitest::Test
279+
include SharedTrackerTests
280+
include RubyTrackerTests
281+
282+
def parser_class
283+
ActionView::RenderParser::PrismRenderParser
284+
end
285+
end

0 commit comments

Comments
 (0)