Skip to content

Commit

Permalink
Create an ActionView::PathRegistry module
Browse files Browse the repository at this point in the history
This is a refactor of the `Registry` module added in rails#47347. This is an attempt to
minimize the namespace conflcits that will happen when users will have a top level `Registry` module which can cause
incorrect behavior

Replace ActionView::ViewPaths::Registry with ActionView::PathRegistry
  • Loading branch information
nickborromeo committed Feb 24, 2023
1 parent b0dd7c7 commit 92216eb
Show file tree
Hide file tree
Showing 7 changed files with 53 additions and 49 deletions.
Expand Up @@ -245,7 +245,7 @@ def spot(exc)
def build_backtrace
built_methods = {}

ActionView::ViewPaths::Registry.all_resolvers.each do |resolver|
ActionView::PathRegistry.all_resolvers.each do |resolver|
resolver.built_templates.each do |template|
built_methods[template.method_name] = template
end
Expand Down
1 change: 1 addition & 0 deletions actionview/lib/action_view.rb
Expand Up @@ -40,6 +40,7 @@ module ActionView
autoload :Helpers
autoload :LookupContext
autoload :Layouts
autoload :PathRegistry
autoload :PathSet
autoload :RecordIdentifier
autoload :Rendering
Expand Down
4 changes: 2 additions & 2 deletions actionview/lib/action_view/cache_expiry.rb
Expand Up @@ -13,7 +13,7 @@ def initialize(watcher:, &block)
rebuild_watcher

_self = self
ActionView::ViewPaths::Registry.singleton_class.set_callback(:build_file_system_resolver, :after) do
ActionView::PathRegistry.singleton_class.set_callback(:build_file_system_resolver, :after) do
_self.send(:rebuild_watcher)
end
end
Expand Down Expand Up @@ -59,7 +59,7 @@ def dirs_to_watch
end

def all_view_paths
ActionView::ViewPaths::Registry.all_file_system_resolvers.map(&:path)
ActionView::PathRegistry.all_file_system_resolvers.map(&:path)
end
end
end
Expand Down
2 changes: 1 addition & 1 deletion actionview/lib/action_view/lookup_context.rb
Expand Up @@ -71,7 +71,7 @@ def self.details_cache_key(details)
end

def self.clear
ActionView::ViewPaths::Registry.all_resolvers.each do |resolver|
ActionView::PathRegistry.all_resolvers.each do |resolver|
resolver.clear_cache
end
@view_context_class = nil
Expand Down
44 changes: 44 additions & 0 deletions actionview/lib/action_view/path_registry.rb
@@ -0,0 +1,44 @@
# frozen_string_literal: true

module ActionView # :nodoc:
module PathRegistry # :nodoc:
@view_paths_by_class = {}
@file_system_resolvers = Concurrent::Map.new

class << self
include ActiveSupport::Callbacks
define_callbacks :build_file_system_resolver
end

def self.get_view_paths(klass)
@view_paths_by_class[klass] || get_view_paths(klass.superclass)
end

def self.set_view_paths(klass, paths)
@view_paths_by_class[klass] = paths
end

def self.file_system_resolver(path)
path = File.expand_path(path)
resolver = @file_system_resolvers[path]
unless resolver
run_callbacks(:build_file_system_resolver) do
resolver = @file_system_resolvers.fetch_or_store(path) do
FileSystemResolver.new(path)
end
end
end
resolver
end

def self.all_resolvers
resolvers = [all_file_system_resolvers]
resolvers.concat @view_paths_by_class.values.map(&:to_a)
resolvers.flatten.uniq
end

def self.all_file_system_resolvers
@file_system_resolvers.values
end
end
end
2 changes: 1 addition & 1 deletion actionview/lib/action_view/path_set.rb
Expand Up @@ -67,7 +67,7 @@ def typecast(paths)
paths.map do |path|
case path
when Pathname, String
ViewPaths::Registry.file_system_resolver(path.to_s)
ActionView::PathRegistry.file_system_resolver(path.to_s)
when Resolver
path
else
Expand Down
47 changes: 3 additions & 44 deletions actionview/lib/action_view/view_paths.rb
Expand Up @@ -5,19 +5,19 @@ module ViewPaths
extend ActiveSupport::Concern

included do
ViewPaths::Registry.set_view_paths(self, ActionView::PathSet.new.freeze)
ActionView::PathRegistry.set_view_paths(self, ActionView::PathSet.new.freeze)
end

delegate :template_exists?, :any_templates?, :view_paths, :formats, :formats=,
:locale, :locale=, to: :lookup_context

module ClassMethods
def _view_paths
ViewPaths::Registry.get_view_paths(self)
ActionView::PathRegistry.get_view_paths(self)
end

def _view_paths=(paths)
ViewPaths::Registry.set_view_paths(self, paths)
ActionView::PathRegistry.set_view_paths(self, paths)
end

def _prefixes # :nodoc:
Expand Down Expand Up @@ -70,47 +70,6 @@ def local_prefixes
end
end

module Registry # :nodoc:
@view_paths_by_class = {}
@file_system_resolvers = Concurrent::Map.new

class << self
include ActiveSupport::Callbacks
define_callbacks :build_file_system_resolver
end

def self.get_view_paths(klass)
@view_paths_by_class[klass] || get_view_paths(klass.superclass)
end

def self.set_view_paths(klass, paths)
@view_paths_by_class[klass] = paths
end

def self.file_system_resolver(path)
path = File.expand_path(path)
resolver = @file_system_resolvers[path]
unless resolver
run_callbacks(:build_file_system_resolver) do
resolver = @file_system_resolvers.fetch_or_store(path) do
FileSystemResolver.new(path)
end
end
end
resolver
end

def self.all_resolvers
resolvers = [all_file_system_resolvers]
resolvers.concat @view_paths_by_class.values.map(&:to_a)
resolvers.flatten.uniq
end

def self.all_file_system_resolvers
@file_system_resolvers.values
end
end

# The prefixes used in render "foo" shortcuts.
def _prefixes # :nodoc:
self.class._prefixes
Expand Down

0 comments on commit 92216eb

Please sign in to comment.