Support :any variants for FixtureResolver

This commit is contained in:
Fumiaki MATSUSHIMA 2019-06-29 23:38:05 +09:00
parent 89afd816bd
commit 92af4aba25
2 changed files with 47 additions and 13 deletions

View File

@ -7,10 +7,15 @@ module ActionView #:nodoc:
# file system. This is used internally by Rails' own test suite, and is
# useful for testing extensions that have no way of knowing what the file
# system will look like at runtime.
class FixtureResolver < PathResolver
class FixtureResolver < OptimizedFileSystemResolver
def initialize(hash = {}, pattern = nil)
super(pattern)
super("")
if pattern
ActiveSupport::Deprecation.warn "Specifying a custom path for #{self.class} is deprecated. Implement a custom Resolver subclass instead."
@pattern = pattern
end
@hash = hash
@path = ""
end
def data
@ -23,25 +28,32 @@ module ActionView #:nodoc:
private
def query(path, exts, _, locals, cache:)
query = +""
EXTENSIONS.each do |ext, prefix|
query << "(" << exts[ext].map { |e| e && Regexp.escape("#{prefix}#{e}") }.join("|") << "|)"
end
query = /^(#{Regexp.escape(path)})#{query}$/
regex = build_regex(path, exts)
templates = []
@hash.each do |_path, source|
next unless query.match?(_path)
@hash.select do |_path, _|
("/" + _path).match?(regex)
end.map do |_path, source|
handler, format, variant = extract_handler_and_format_and_variant(_path)
templates << Template.new(source, _path, handler,
Template.new(source, _path, handler,
virtual_path: path.virtual,
format: format,
variant: variant,
locals: locals
)
end.sort_by do |t|
match = ("/" + t.identifier).match(regex)
EXTENSIONS.keys.reverse.map do |ext|
if ext == :variants && exts[ext] == :any
match[ext].nil? ? 0 : 1
elsif match[ext].nil?
exts[ext].length
else
found = match[ext].to_sym
exts[ext].index(found)
end
end
end
templates.sort_by { |t| -t.identifier.match(/^#{query}$/).captures.reject(&:blank?).size }
end
end

View File

@ -27,4 +27,26 @@ class FixtureResolverTest < ActiveSupport::TestCase
assert_equal :html, templates.first.format
assert_equal "variant", templates.first.variant
end
def test_should_match_locales
resolver = ActionView::FixtureResolver.new("arbitrary/path.erb" => "this text", "arbitrary/path.fr.erb" => "ce texte")
en = resolver.find_all("path", "arbitrary", false, locale: [:en], formats: [:html], variants: [], handlers: [:erb])
fr = resolver.find_all("path", "arbitrary", false, locale: [:fr], formats: [:html], variants: [], handlers: [:erb])
assert_equal 1, en.size
assert_equal 2, fr.size
assert_equal "this text", en[0].source
assert_equal "ce texte", fr[0].source
assert_equal "this text", fr[1].source
end
def test_should_return_all_variants_for_any
resolver = ActionView::FixtureResolver.new("arbitrary/path.html.erb" => "this html", "arbitrary/path.html+varient.erb" => "this text")
templates = resolver.find_all("path", "arbitrary", false, locale: [], formats: [:html], variants: [], handlers: [:erb])
assert_equal 1, templates.size, "expected one template"
assert_equal "this html", templates.first.source
templates = resolver.find_all("path", "arbitrary", false, locale: [], formats: [:html], variants: :any, handlers: [:erb])
assert_equal 2, templates.size, "expected all templates"
end
end