Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张重言
rails
提交
d7e4cb87
R
rails
项目概览
张重言
/
rails
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rails
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
d7e4cb87
编写于
3月 15, 2019
作者:
A
Aaron Patterson
提交者:
GitHub
3月 15, 2019
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #35623 from jhawthorn/actionview_cache
Make Template::Resolver always cache
上级
905018fc
80c0ae7d
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
13 addition
and
98 deletion
+13
-98
actionview/lib/action_view/file_template.rb
actionview/lib/action_view/file_template.rb
+2
-2
actionview/lib/action_view/template.rb
actionview/lib/action_view/template.rb
+4
-5
actionview/lib/action_view/template/resolver.rb
actionview/lib/action_view/template/resolver.rb
+3
-37
actionview/lib/action_view/testing/resolvers.rb
actionview/lib/action_view/testing/resolvers.rb
+2
-4
actionview/test/template/digestor_test.rb
actionview/test/template/digestor_test.rb
+2
-0
actionview/test/template/lookup_context_test.rb
actionview/test/template/lookup_context_test.rb
+0
-50
未找到文件。
actionview/lib/action_view/file_template.rb
浏览文件 @
d7e4cb87
...
...
@@ -22,11 +22,11 @@ def refresh(_)
# to ensure that references to the template object can be marshalled as well. This means forgoing
# the marshalling of the compiler mutex and instantiating that again on unmarshalling.
def
marshal_dump
# :nodoc:
[
@identifier
,
@handler
,
@compiled
,
@locals
,
@virtual_path
,
@
updated_at
,
@
format
,
@variant
]
[
@identifier
,
@handler
,
@compiled
,
@locals
,
@virtual_path
,
@format
,
@variant
]
end
def
marshal_load
(
array
)
# :nodoc:
@identifier
,
@handler
,
@compiled
,
@locals
,
@virtual_path
,
@
updated_at
,
@
format
,
@variant
=
*
array
@identifier
,
@handler
,
@compiled
,
@locals
,
@virtual_path
,
@format
,
@variant
=
*
array
@compile_mutex
=
Mutex
.
new
end
end
...
...
actionview/lib/action_view/template.rb
浏览文件 @
d7e4cb87
...
...
@@ -122,10 +122,10 @@ def self.finalize_compiled_template_methods=(_)
extend
Template
::
Handlers
attr_reader
:source
,
:identifier
,
:handler
,
:original_encoding
,
:updated_at
attr_reader
:source
,
:identifier
,
:handler
,
:original_encoding
attr_reader
:variable
,
:format
,
:variant
,
:locals
,
:virtual_path
def
initialize
(
source
,
identifier
,
handler
,
format:
nil
,
variant:
nil
,
locals:
nil
,
virtual_path:
nil
,
updated_at:
Time
.
now
)
def
initialize
(
source
,
identifier
,
handler
,
format:
nil
,
variant:
nil
,
locals:
nil
,
virtual_path:
nil
)
unless
locals
ActiveSupport
::
Deprecation
.
warn
"ActionView::Template#initialize requires a locals parameter"
locals
=
[]
...
...
@@ -144,7 +144,6 @@ def initialize(source, identifier, handler, format: nil, variant: nil, locals: n
$1
.
to_sym
end
@updated_at
=
updated_at
@format
=
format
@variant
=
variant
@compile_mutex
=
Mutex
.
new
...
...
@@ -261,11 +260,11 @@ def encode!
# to ensure that references to the template object can be marshalled as well. This means forgoing
# the marshalling of the compiler mutex and instantiating that again on unmarshalling.
def
marshal_dump
# :nodoc:
[
@source
,
@identifier
,
@handler
,
@compiled
,
@locals
,
@virtual_path
,
@
updated_at
,
@
format
,
@variant
]
[
@source
,
@identifier
,
@handler
,
@compiled
,
@locals
,
@virtual_path
,
@format
,
@variant
]
end
def
marshal_load
(
array
)
# :nodoc:
@source
,
@identifier
,
@handler
,
@compiled
,
@locals
,
@virtual_path
,
@
updated_at
,
@
format
,
@variant
=
*
array
@source
,
@identifier
,
@handler
,
@compiled
,
@locals
,
@virtual_path
,
@format
,
@variant
=
*
array
@compile_mutex
=
Mutex
.
new
end
...
...
actionview/lib/action_view/template/resolver.rb
浏览文件 @
d7e4cb87
...
...
@@ -63,26 +63,11 @@ def inspect
# Cache the templates returned by the block
def
cache
(
key
,
name
,
prefix
,
partial
,
locals
)
if
Resolver
.
caching?
@data
[
key
][
name
][
prefix
][
partial
][
locals
]
||=
canonical_no_templates
(
yield
)
else
fresh_templates
=
yield
cached_templates
=
@data
[
key
][
name
][
prefix
][
partial
][
locals
]
if
templates_have_changed?
(
cached_templates
,
fresh_templates
)
@data
[
key
][
name
][
prefix
][
partial
][
locals
]
=
canonical_no_templates
(
fresh_templates
)
else
cached_templates
||
NO_TEMPLATES
end
end
@data
[
key
][
name
][
prefix
][
partial
][
locals
]
||=
canonical_no_templates
(
yield
)
end
def
cache_query
(
query
)
# :nodoc:
if
Resolver
.
caching?
@query_cache
[
query
]
||=
canonical_no_templates
(
yield
)
else
yield
end
@query_cache
[
query
]
||=
canonical_no_templates
(
yield
)
end
def
clear
...
...
@@ -112,19 +97,6 @@ def size # :nodoc:
def
canonical_no_templates
(
templates
)
templates
.
empty?
?
NO_TEMPLATES
:
templates
end
def
templates_have_changed?
(
cached_templates
,
fresh_templates
)
# if either the old or new template list is empty, we don't need to (and can't)
# compare modification times, and instead just check whether the lists are different
if
cached_templates
.
blank?
||
fresh_templates
.
blank?
return
fresh_templates
.
blank?
!=
cached_templates
.
blank?
end
cached_templates_max_updated_at
=
cached_templates
.
map
(
&
:updated_at
).
max
# if a template has changed, it will be now be newer than all the cached templates
fresh_templates
.
any?
{
|
t
|
t
.
updated_at
>
cached_templates_max_updated_at
}
end
end
cattr_accessor
:caching
,
default:
true
...
...
@@ -218,8 +190,7 @@ def query(path, details, formats, outside_app_allowed, locals)
virtual_path:
path
.
virtual
,
format:
format
,
variant:
variant
,
locals:
locals
,
updated_at:
mtime
(
template
)
locals:
locals
)
end
end
...
...
@@ -272,11 +243,6 @@ def escape_entry(entry)
entry
.
gsub
(
/[*?{}\[\]]/
,
'\\\\\\&'
)
end
# Returns the file mtime from the filesystem.
def
mtime
(
p
)
File
.
mtime
(
p
)
end
# Extract handler, formats and variant from path. If a format cannot be found neither
# from the path, or the handler, we should return the array of formats given
# to the resolver.
...
...
actionview/lib/action_view/testing/resolvers.rb
浏览文件 @
d7e4cb87
...
...
@@ -31,16 +31,14 @@ def query(path, exts, _, _, locals)
query
=
/^(
#{
Regexp
.
escape
(
path
)
}
)
#{
query
}
$/
templates
=
[]
@hash
.
each
do
|
_path
,
array
|
source
,
updated_at
=
array
@hash
.
each
do
|
_path
,
source
|
next
unless
query
.
match?
(
_path
)
handler
,
format
,
variant
=
extract_handler_and_format_and_variant
(
_path
)
templates
<<
Template
.
new
(
source
,
_path
,
handler
,
virtual_path:
path
.
virtual
,
format:
format
,
variant:
variant
,
locals:
locals
,
updated_at:
updated_at
locals:
locals
)
end
...
...
actionview/test/template/digestor_test.rb
浏览文件 @
d7e4cb87
...
...
@@ -326,12 +326,14 @@ def assert_logged(message)
def
assert_digest_difference
(
template_name
,
options
=
{})
previous_digest
=
digest
(
template_name
,
options
)
finder
.
view_paths
.
each
(
&
:clear_cache
)
finder
.
digest_cache
.
clear
yield
assert_not_equal
previous_digest
,
digest
(
template_name
,
options
),
"digest didn't change"
finder
.
digest_cache
.
clear
finder
.
view_paths
.
each
(
&
:clear_cache
)
end
def
digest
(
template_name
,
options
=
{})
...
...
actionview/test/template/lookup_context_test.rb
浏览文件 @
d7e4cb87
...
...
@@ -235,56 +235,6 @@ def teardown
end
end
class
LookupContextWithFalseCaching
<
ActiveSupport
::
TestCase
def
setup
@resolver
=
ActionView
::
FixtureResolver
.
new
(
"test/_foo.erb"
=>
[
"Foo"
,
Time
.
utc
(
2000
)])
@lookup_context
=
ActionView
::
LookupContext
.
new
(
@resolver
,
{})
end
test
"templates are always found in the resolver but timestamp is checked before being compiled"
do
ActionView
::
Resolver
.
stub
(
:caching?
,
false
)
do
template
=
@lookup_context
.
find
(
"foo"
,
%w(test)
,
true
)
assert_equal
"Foo"
,
template
.
source
# Now we are going to change the template, but it won't change the returned template
# since the timestamp is the same.
@resolver
.
data
[
"test/_foo.erb"
][
0
]
=
"Bar"
template
=
@lookup_context
.
find
(
"foo"
,
%w(test)
,
true
)
assert_equal
"Foo"
,
template
.
source
# Now update the timestamp.
@resolver
.
data
[
"test/_foo.erb"
][
1
]
=
Time
.
now
.
utc
template
=
@lookup_context
.
find
(
"foo"
,
%w(test)
,
true
)
assert_equal
"Bar"
,
template
.
source
end
end
test
"if no template was found in the second lookup, with no cache, raise error"
do
ActionView
::
Resolver
.
stub
(
:caching?
,
false
)
do
template
=
@lookup_context
.
find
(
"foo"
,
%w(test)
,
true
)
assert_equal
"Foo"
,
template
.
source
@resolver
.
data
.
clear
assert_raise
ActionView
::
MissingTemplate
do
@lookup_context
.
find
(
"foo"
,
%w(test)
,
true
)
end
end
end
test
"if no template was cached in the first lookup, retrieval should work in the second call"
do
ActionView
::
Resolver
.
stub
(
:caching?
,
false
)
do
@resolver
.
data
.
clear
assert_raise
ActionView
::
MissingTemplate
do
@lookup_context
.
find
(
"foo"
,
%w(test)
,
true
)
end
@resolver
.
data
[
"test/_foo.erb"
]
=
[
"Foo"
,
Time
.
utc
(
2000
)]
template
=
@lookup_context
.
find
(
"foo"
,
%w(test)
,
true
)
assert_equal
"Foo"
,
template
.
source
end
end
end
class
TestMissingTemplate
<
ActiveSupport
::
TestCase
def
setup
@lookup_context
=
ActionView
::
LookupContext
.
new
(
"/Path/to/views"
,
{})
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录