From 1a0e710895f6bca8d316f013f8fcc7e7ac15a156 Mon Sep 17 00:00:00 2001 From: Hartley McGuire Date: Fri, 2 Feb 2024 14:38:18 -0500 Subject: [PATCH] Extract WildcardResolver to remove duplication Since both the ERBTracker and RubyTracker now support resolving interpolated template paths against the view_paths, the logic for this resolution can be extracted to its own class. --- .../lib/action_view/dependency_tracker.rb | 1 + .../dependency_tracker/erb_tracker.rb | 24 ++------------ .../dependency_tracker/ruby_tracker.rb | 26 ++------------- .../dependency_tracker/wildcard_resolver.rb | 32 +++++++++++++++++++ 4 files changed, 39 insertions(+), 44 deletions(-) create mode 100644 actionview/lib/action_view/dependency_tracker/wildcard_resolver.rb diff --git a/actionview/lib/action_view/dependency_tracker.rb b/actionview/lib/action_view/dependency_tracker.rb index f14ba7598491d..dd54c5f61b361 100644 --- a/actionview/lib/action_view/dependency_tracker.rb +++ b/actionview/lib/action_view/dependency_tracker.rb @@ -10,6 +10,7 @@ class DependencyTracker # :nodoc: autoload :ERBTracker autoload :RubyTracker + autoload :WildcardResolver @trackers = Concurrent::Map.new diff --git a/actionview/lib/action_view/dependency_tracker/erb_tracker.rb b/actionview/lib/action_view/dependency_tracker/erb_tracker.rb index 66dddb5470cb0..9bf87b1fa8286 100644 --- a/actionview/lib/action_view/dependency_tracker/erb_tracker.rb +++ b/actionview/lib/action_view/dependency_tracker/erb_tracker.rb @@ -74,7 +74,7 @@ def initialize(name, template, view_paths = nil) end def dependencies - render_dependencies + explicit_dependencies + WildcardResolver.new(@view_paths, render_dependencies + explicit_dependencies).resolve end attr_reader :name, :template @@ -98,9 +98,7 @@ def render_dependencies add_dependencies(dependencies, arguments, RENDER_ARGUMENTS) end - wildcards, explicits = dependencies.partition { |dependency| dependency.end_with?("/*") } - - (explicits + resolve_directories(wildcards)).uniq + dependencies end def add_dependencies(render_dependencies, arguments, pattern) @@ -153,24 +151,8 @@ def add_static_dependency(dependencies, dependency, quote_type) end end - def resolve_directories(wildcard_dependencies) - return [] unless @view_paths - return [] if wildcard_dependencies.empty? - - # Remove trailing "/*" - prefixes = wildcard_dependencies.map { |query| query[0..-3] } - - @view_paths.flat_map(&:all_template_paths).uniq.filter_map { |path| - path.to_s if prefixes.include?(path.prefix) - }.sort - end - def explicit_dependencies - dependencies = source.scan(EXPLICIT_DEPENDENCY).flatten.uniq - - wildcards, explicits = dependencies.partition { |dependency| dependency.end_with?("/*") } - - (explicits + resolve_directories(wildcards)).uniq + source.scan(EXPLICIT_DEPENDENCY).flatten.uniq end end end diff --git a/actionview/lib/action_view/dependency_tracker/ruby_tracker.rb b/actionview/lib/action_view/dependency_tracker/ruby_tracker.rb index 9bcf7840adf0b..72a547c3020d5 100644 --- a/actionview/lib/action_view/dependency_tracker/ruby_tracker.rb +++ b/actionview/lib/action_view/dependency_tracker/ruby_tracker.rb @@ -10,7 +10,7 @@ def self.call(name, template, view_paths = nil) end def dependencies - render_dependencies + explicit_dependencies + WildcardResolver.new(view_paths, render_dependencies + explicit_dependencies).resolve end def self.supports_view_paths? # :nodoc: @@ -30,33 +30,13 @@ def render_dependencies compiled_source = template.handler.call(template, template.source) - dependencies = @parser_class.new(@name, compiled_source).render_calls.filter_map do |render_call| + @parser_class.new(@name, compiled_source).render_calls.filter_map do |render_call| render_call.gsub(%r|/_|, "/") end - - wildcards, explicits = dependencies.partition { |dependency| dependency.end_with?("/*") } - - (explicits + resolve_directories(wildcards)).uniq end def explicit_dependencies - dependencies = template.source.scan(EXPLICIT_DEPENDENCY).flatten.uniq - - wildcards, explicits = dependencies.partition { |dependency| dependency.end_with?("/*") } - - (explicits + resolve_directories(wildcards)).uniq - end - - def resolve_directories(wildcard_dependencies) - return [] unless view_paths - return [] if wildcard_dependencies.empty? - - # Remove trailing "/*" - prefixes = wildcard_dependencies.map { |query| query[0..-3] } - - view_paths.flat_map(&:all_template_paths).uniq.filter_map { |path| - path.to_s if prefixes.include?(path.prefix) - }.sort + template.source.scan(EXPLICIT_DEPENDENCY).flatten.uniq end end end diff --git a/actionview/lib/action_view/dependency_tracker/wildcard_resolver.rb b/actionview/lib/action_view/dependency_tracker/wildcard_resolver.rb new file mode 100644 index 0000000000000..443f034f6c01d --- /dev/null +++ b/actionview/lib/action_view/dependency_tracker/wildcard_resolver.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +module ActionView + class DependencyTracker # :nodoc: + class WildcardResolver # :nodoc: + def initialize(view_paths, dependencies) + @view_paths = view_paths + + @wildcard_dependencies, @explicit_dependencies = + dependencies.partition { |dependency| dependency.end_with?("/*") } + end + + def resolve + return explicit_dependencies.uniq if !view_paths || wildcard_dependencies.empty? + + (explicit_dependencies + resolved_wildcard_dependencies).uniq + end + + private + attr_reader :explicit_dependencies, :wildcard_dependencies, :view_paths + + def resolved_wildcard_dependencies + # Remove trailing "/*" + prefixes = wildcard_dependencies.map { |query| query[0..-3] } + + view_paths.flat_map(&:all_template_paths).uniq.filter_map { |path| + path.to_s if prefixes.include?(path.prefix) + }.sort + end + end + end +end