Skip to content

Commit 6939d95

Browse files
committed
Delegate properly to custom Resolver instances
Let `EmptyTemplateResolver` creating instances of either `EmptyTemplateResolver::ResolverDecorator` or `EmptyTemplateResolver::FileSystemResolver`, depending on whether the given path is an `ActionView::Resolver` instance or not. The new `EmptyTemplateResolver::ResolverDecorator` class simply delegates all method calls to its given resolver, except for `#find_templates` which it overrides to return templates that render with `EmptyTemplateHandler`.
1 parent 682a120 commit 6939d95

File tree

2 files changed

+53
-9
lines changed

2 files changed

+53
-9
lines changed

lib/rspec/rails/view_rendering.rb

Lines changed: 46 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,18 @@ def render_views?
3939
self.class.render_views? || !controller.class.respond_to?(:view_paths)
4040
end
4141

42-
# Delegates find_all to the submitted path set and then returns templates
43-
# with modified source
44-
#
4542
# @private
46-
class EmptyTemplateResolver < ::ActionView::FileSystemResolver
47-
private
43+
class EmptyTemplateResolver
44+
def self.build(path)
45+
if path.is_a?(::ActionView::Resolver)
46+
ResolverDecorator.new(path)
47+
else
48+
FileSystemResolver.new(path)
49+
end
50+
end
4851

49-
def find_templates(*args)
50-
super.map do |template|
52+
def self.nullify_template_rendering(templates)
53+
templates.map do |template|
5154
::ActionView::Template.new(
5255
"",
5356
template.identifier,
@@ -57,6 +60,40 @@ def find_templates(*args)
5760
)
5861
end
5962
end
63+
64+
# Delegates find_templates to the submitted resolver and then returns templates
65+
# with modified source
66+
#
67+
# @private
68+
class ResolverDecorator
69+
def initialize(resolver)
70+
@resolver = resolver
71+
end
72+
73+
def method_missing(name, *args, &block)
74+
@resolver.send(name, *args, &block)
75+
end
76+
77+
private
78+
79+
def find_templates(*args)
80+
templates = @resolver.find_templates(*args)
81+
EmptyTemplateResolver.nullify_template_rendering(templates)
82+
end
83+
end
84+
85+
# Delegates find_templates to the submitted path set and then returns
86+
# templates with modified source
87+
#
88+
# @private
89+
class FileSystemResolver < ::ActionView::FileSystemResolver
90+
private
91+
92+
def find_templates(*args)
93+
templates = super
94+
EmptyTemplateResolver.nullify_template_rendering(templates)
95+
end
96+
end
6097
end
6198

6299
# @private
@@ -81,13 +118,13 @@ def append_view_path(new_path)
81118
private
82119

83120
def _path_decorator(*paths)
84-
paths.map { |path| EmptyTemplateResolver.new(path) }
121+
paths.map { |path| EmptyTemplateResolver.build(path) }
85122
end
86123
end
87124

88125
# @private
89126
RESOLVER_CACHE = Hash.new do |hash, path|
90-
hash[path] = EmptyTemplateResolver.new(path)
127+
hash[path] = EmptyTemplateResolver.build(path)
91128
end
92129

93130
included do

spec/rspec/rails/view_rendering_spec.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,13 @@ def example.controller
139139
expect(controller.view_paths.map(&:to_s)).to match_paths 'app/views', 'app/legacy_views', 'app/others', 'app/more_views'
140140
end
141141

142+
it 'supports manipulating view paths with resolvers' do
143+
expect {
144+
controller.prepend_view_path ActionView::Resolver.new
145+
controller.append_view_path ActionView::Resolver.new
146+
}.to_not raise_error
147+
end
148+
142149
def match_paths(*paths)
143150
eq paths.map { |path| File.expand_path path }
144151
end

0 commit comments

Comments
 (0)