@@ -4,13 +4,30 @@ module ActionView
4
4
class TemplateDetails # :nodoc:
5
5
class Requested
6
6
attr_reader :locale , :handlers , :formats , :variants
7
+ attr_reader :locale_idx , :handlers_idx , :formats_idx , :variants_idx
8
+
9
+ ANY_HASH = Hash . new ( 1 ) . merge ( nil => 0 ) . freeze
7
10
8
11
def initialize ( locale :, handlers :, formats :, variants :)
9
12
@locale = locale
10
13
@handlers = handlers
11
14
@formats = formats
12
15
@variants = variants
16
+
17
+ @locale_idx = build_idx_hash ( locale )
18
+ @handlers_idx = build_idx_hash ( handlers )
19
+ @formats_idx = build_idx_hash ( formats )
20
+ if variants == :any
21
+ @variants_idx = ANY_HASH
22
+ else
23
+ @variants_idx = build_idx_hash ( variants )
24
+ end
13
25
end
26
+
27
+ private
28
+ def build_idx_hash ( arr )
29
+ [ *arr , nil ] . each_with_index . to_h . freeze
30
+ end
14
31
end
15
32
16
33
attr_reader :locale , :handler , :format , :variant
@@ -23,28 +40,19 @@ def initialize(locale, handler, format, variant)
23
40
end
24
41
25
42
def matches? ( requested )
26
- return if format && !requested . formats . include? ( format )
27
- return if locale && !requested . locale . include? ( locale )
28
- unless requested . variants == :any
29
- return if variant && !requested . variants . include? ( variant )
30
- end
31
- return if handler && !requested . handlers . include? ( handler )
32
-
33
- true
43
+ requested . formats_idx [ @format ] &&
44
+ requested . locale_idx [ @locale ] &&
45
+ requested . variants_idx [ @variant ] &&
46
+ requested . handlers_idx [ @handler ]
34
47
end
35
48
36
49
def sort_key_for ( requested )
37
- locale_match = details_match_sort_key ( locale , requested . locale )
38
- format_match = details_match_sort_key ( format , requested . formats )
39
- variant_match =
40
- if requested . variants == :any
41
- variant ? 1 : 0
42
- else
43
- details_match_sort_key ( variant , requested . variants )
44
- end
45
- handler_match = details_match_sort_key ( handler , requested . handlers )
46
-
47
- [ locale_match , format_match , variant_match , handler_match ]
50
+ [
51
+ requested . formats_idx [ @format ] ,
52
+ requested . locale_idx [ @locale ] ,
53
+ requested . variants_idx [ @variant ] ,
54
+ requested . handlers_idx [ @handler ]
55
+ ]
48
56
end
49
57
50
58
def handler_class
@@ -54,14 +62,5 @@ def handler_class
54
62
def format_or_default
55
63
format || handler_class . try ( :default_format )
56
64
end
57
-
58
- private
59
- def details_match_sort_key ( have , want )
60
- if have
61
- want . index ( have )
62
- else
63
- want . size
64
- end
65
- end
66
65
end
67
66
end
0 commit comments