Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张重言
rails
提交
cb59c93d
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,发现更多精彩内容 >>
提交
cb59c93d
编写于
5月 31, 2008
作者:
D
David Heinemeier Hansson
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'master' of git@github.com:rails/rails
上级
f9db7695
ef21e013
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
7 addition
and
262 deletion
+7
-262
actionpack/lib/action_view/compiled_templates.rb
actionpack/lib/action_view/compiled_templates.rb
+0
-69
actionpack/test/template/compiled_templates_test.rb
actionpack/test/template/compiled_templates_test.rb
+0
-192
activerecord/lib/active_record/validations.rb
activerecord/lib/active_record/validations.rb
+1
-1
activerecord/test/cases/validations_test.rb
activerecord/test/cases/validations_test.rb
+6
-0
未找到文件。
actionpack/lib/action_view/compiled_templates.rb
已删除
100644 → 0
浏览文件 @
f9db7695
module
ActionView
# CompiledTemplates modules hold methods that have been compiled.
# Templates are compiled into these methods so that they do not need to be
# read and parsed for each request.
#
# Each template may be compiled into one or more methods. Each method accepts a given
# set of parameters which is used to implement local assigns passing.
#
# To use a compiled template module, create a new instance and include it into the class
# in which you want the template to be rendered.
class
CompiledTemplates
<
Module
attr_reader
:method_names
def
initialize
@method_names
=
Hash
.
new
do
|
hash
,
key
|
hash
[
key
]
=
"__compiled_method_
#{
(
hash
.
length
+
1
)
}
"
end
@mtimes
=
{}
end
# Return the full key for the given identifier and argument names
def
full_key
(
identifier
,
arg_names
)
[
identifier
,
arg_names
]
end
# Return the selector for this method or nil if it has not been compiled
def
selector
(
identifier
,
arg_names
)
key
=
full_key
(
identifier
,
arg_names
)
method_names
.
key?
(
key
)
?
method_names
[
key
]
:
nil
end
alias
:compiled?
:selector
# Return the time at which the method for the given identifier and argument names was compiled.
def
mtime
(
identifier
,
arg_names
)
@mtimes
[
full_key
(
identifier
,
arg_names
)]
end
# Compile the provided source code for the given argument names and with the given initial line number.
# The identifier should be unique to this source.
#
# The file_name, if provided will appear in backtraces. If not provided, the file_name defaults
# to the identifier.
#
# This method will return the selector for the compiled version of this method.
def
compile_source
(
identifier
,
arg_names
,
source
,
initial_line_number
=
0
,
file_name
=
nil
)
file_name
||=
identifier
name
=
method_names
[
full_key
(
identifier
,
arg_names
)]
arg_desc
=
arg_names
.
empty?
?
''
:
"(
#{
arg_names
*
', '
}
)"
fake_file_name
=
"
#{
file_name
}#{
arg_desc
}
"
# Include the arguments for this version (for now)
method_def
=
wrap_source
(
name
,
arg_names
,
source
)
begin
module_eval
(
method_def
,
fake_file_name
,
initial_line_number
)
@mtimes
[
full_key
(
identifier
,
arg_names
)]
=
Time
.
now
rescue
Exception
=>
e
# errors from compiled source
e
.
blame_file!
identifier
raise
end
name
end
# Wrap the provided source in a def ... end block.
def
wrap_source
(
name
,
arg_names
,
source
)
"def
#{
name
}
(
#{
arg_names
*
', '
}
)
\n
#{
source
}
\n
end"
end
end
end
actionpack/test/template/compiled_templates_test.rb
已删除
100644 → 0
浏览文件 @
f9db7695
require
'abstract_unit'
require
'action_view/helpers/date_helper'
require
'action_view/compiled_templates'
class
CompiledTemplateTests
<
Test
::
Unit
::
TestCase
def
setup
@ct
=
ActionView
::
CompiledTemplates
.
new
@v
=
Class
.
new
@v
.
send
:include
,
@ct
@a
=
'./test_compile_template_a.rhtml'
@b
=
'./test_compile_template_b.rhtml'
@s
=
'./test_compile_template_link.rhtml'
end
def
teardown
[
@a
,
@b
,
@s
].
each
do
|
f
|
FileUtils
.
rm
(
f
)
if
File
.
exist?
(
f
)
||
File
.
symlink?
(
f
)
end
end
attr_reader
:ct
,
:v
def
test_name_allocation
hi_world
=
ct
.
method_names
[
'hi world'
]
hi_sexy
=
ct
.
method_names
[
'hi sexy'
]
wish_upon_a_star
=
ct
.
method_names
[
'I love seeing decent error messages'
]
assert_equal
hi_world
,
ct
.
method_names
[
'hi world'
]
assert_equal
hi_sexy
,
ct
.
method_names
[
'hi sexy'
]
assert_equal
wish_upon_a_star
,
ct
.
method_names
[
'I love seeing decent error messages'
]
assert_equal
3
,
[
hi_world
,
hi_sexy
,
wish_upon_a_star
].
uniq
.
length
end
def
test_wrap_source
assert_equal
(
"def aliased_assignment(value)
\n
self.value = value
\n
end"
,
@ct
.
wrap_source
(
:aliased_assignment
,
[
:value
],
'self.value = value'
)
)
assert_equal
(
"def simple()
\n
nil
\n
end"
,
@ct
.
wrap_source
(
:simple
,
[],
'nil'
)
)
end
def
test_compile_source_single_method
selector
=
ct
.
compile_source
(
'doubling method'
,
[
:a
],
'a + a'
)
assert_equal
2
,
@v
.
new
.
send
(
selector
,
1
)
assert_equal
4
,
@v
.
new
.
send
(
selector
,
2
)
assert_equal
-
4
,
@v
.
new
.
send
(
selector
,
-
2
)
assert_equal
0
,
@v
.
new
.
send
(
selector
,
0
)
selector
end
def
test_compile_source_two_method
sel1
=
test_compile_source_single_method
# compile the method in the other test
sel2
=
ct
.
compile_source
(
'doubling method'
,
[
:a
,
:b
],
'a + b + a + b'
)
assert_not_equal
sel1
,
sel2
assert_equal
2
,
@v
.
new
.
send
(
sel1
,
1
)
assert_equal
4
,
@v
.
new
.
send
(
sel1
,
2
)
assert_equal
6
,
@v
.
new
.
send
(
sel2
,
1
,
2
)
assert_equal
32
,
@v
.
new
.
send
(
sel2
,
15
,
1
)
end
def
test_mtime
t1
=
Time
.
now
test_compile_source_single_method
mtime
=
ct
.
mtime
(
'doubling method'
,
[
:a
])
assert
mtime
<
Time
.
now
assert
mtime
>
t1
end
uses_mocha
'test_compile_time'
do
def
test_compile_time
t
=
Time
.
now
File
.
open
(
@a
,
"w"
){
|
f
|
f
.
puts
@a
}
File
.
open
(
@b
,
"w"
){
|
f
|
f
.
puts
@b
}
# windows doesn't support symlinks (even under cygwin)
windows
=
(
RUBY_PLATFORM
=~
/win32/
)
`ln -s
#{
@a
}
#{
@s
}
`
unless
windows
v
=
ActionView
::
Base
.
new
v
.
base_path
=
'.'
v
.
cache_template_loading
=
false
ta
=
ActionView
::
Template
.
new
(
v
,
@a
,
false
,
{})
tb
=
ActionView
::
Template
.
new
(
v
,
@b
,
false
,
{})
ts
=
ActionView
::
Template
.
new
(
v
,
@s
,
false
,
{})
@handler_class
=
ActionView
::
Template
.
handler_class_for_extension
(
:rhtml
)
@handler
=
@handler_class
.
new
(
v
)
# All templates were created at t+1
File
::
Stat
.
any_instance
.
expects
(
:mtime
).
times
(
windows
?
2
:
3
).
returns
(
t
+
1
.
second
)
# private methods template_changed_since? and compile_template?
# should report true for all since they have not been compiled
assert
@handler
.
send
(
:template_changed_since?
,
@a
,
t
)
assert
@handler
.
send
(
:template_changed_since?
,
@b
,
t
)
assert
@handler
.
send
(
:template_changed_since?
,
@s
,
t
)
unless
windows
assert
@handler
.
send
(
:compile_template?
,
ta
)
assert
@handler
.
send
(
:compile_template?
,
tb
)
assert
@handler
.
send
(
:compile_template?
,
ts
)
unless
windows
# All templates are rendered at t+2
Time
.
expects
(
:now
).
times
(
windows
?
2
:
3
).
returns
(
t
+
2
.
seconds
)
v
.
send
(
:render_template
,
ta
)
v
.
send
(
:render_template
,
tb
)
v
.
send
(
:render_template
,
ts
)
unless
windows
a_n
=
v
.
method_names
[
@a
]
b_n
=
v
.
method_names
[
@b
]
s_n
=
v
.
method_names
[
@s
]
unless
windows
# all of the files have changed since last compile
assert
@handler
.
compile_time
[
a_n
]
>
t
assert
@handler
.
compile_time
[
b_n
]
>
t
assert
@handler
.
compile_time
[
s_n
]
>
t
unless
windows
# private methods template_changed_since? and compile_template?
# should report false for all since none have changed since compile
File
::
Stat
.
any_instance
.
expects
(
:mtime
).
times
(
windows
?
6
:
12
).
returns
(
t
+
1
.
second
)
assert
!
@handler
.
send
(
:template_changed_since?
,
@a
,
@handler
.
compile_time
[
a_n
])
assert
!
@handler
.
send
(
:template_changed_since?
,
@b
,
@handler
.
compile_time
[
b_n
])
assert
!
@handler
.
send
(
:template_changed_since?
,
@s
,
@handler
.
compile_time
[
s_n
])
unless
windows
assert
!
@handler
.
send
(
:compile_template?
,
ta
)
assert
!
@handler
.
send
(
:compile_template?
,
tb
)
assert
!
@handler
.
send
(
:compile_template?
,
ts
)
unless
windows
v
.
send
(
:render_template
,
ta
)
v
.
send
(
:render_template
,
tb
)
v
.
send
(
:render_template
,
ts
)
unless
windows
# none of the files have changed since last compile
assert
@handler
.
compile_time
[
a_n
]
<
t
+
3
.
seconds
assert
@handler
.
compile_time
[
b_n
]
<
t
+
3
.
seconds
assert
@handler
.
compile_time
[
s_n
]
<
t
+
3
.
seconds
unless
windows
`rm
#{
@s
}
; ln -s
#{
@b
}
#{
@s
}
`
unless
windows
# private methods template_changed_since? and compile_template?
# should report true for symlink since it has changed since compile
# t + 3.seconds is for the symlink
File
::
Stat
.
any_instance
.
expects
(
:mtime
).
times
(
windows
?
6
:
9
).
returns
(
*
(
windows
?
[
t
+
1
.
second
,
t
+
1
.
second
]
:
[
t
+
1
.
second
,
t
+
1
.
second
,
t
+
3
.
second
])
*
3
)
assert
!
@handler
.
send
(
:template_changed_since?
,
@a
,
@handler
.
compile_time
[
a_n
])
assert
!
@handler
.
send
(
:template_changed_since?
,
@b
,
@handler
.
compile_time
[
b_n
])
assert
@handler
.
send
(
:template_changed_since?
,
@s
,
@handler
.
compile_time
[
s_n
])
unless
windows
assert
!
@handler
.
send
(
:compile_template?
,
ta
)
assert
!
@handler
.
send
(
:compile_template?
,
tb
)
assert
@handler
.
send
(
:compile_template?
,
ts
)
unless
windows
# Only the symlink template gets rendered at t+3
Time
.
stubs
(
:now
).
returns
(
t
+
3
.
seconds
)
unless
windows
v
.
send
(
:render_template
,
ta
)
v
.
send
(
:render_template
,
tb
)
v
.
send
(
:render_template
,
ts
)
unless
windows
# the symlink has changed since last compile
assert
@handler
.
compile_time
[
a_n
]
<
t
+
3
.
seconds
assert
@handler
.
compile_time
[
b_n
]
<
t
+
3
.
seconds
assert_equal
@handler
.
compile_time
[
s_n
],
t
+
3
.
seconds
unless
windows
FileUtils
.
touch
@b
# private methods template_changed_since? and compile_template?
# should report true for symlink and file at end of symlink
# since it has changed since last compile
#
# t+4 is for @b and also for the file that @s points to, which is @b
File
::
Stat
.
any_instance
.
expects
(
:mtime
).
times
(
windows
?
6
:
12
).
returns
(
*
(
windows
?
[
t
+
1
.
second
,
t
+
4
.
seconds
]
:
[
t
+
1
.
second
,
t
+
4
.
seconds
,
t
+
3
.
second
,
t
+
4
.
seconds
])
*
3
)
assert
!
@handler
.
send
(
:template_changed_since?
,
@a
,
@handler
.
compile_time
[
a_n
])
assert
@handler
.
send
(
:template_changed_since?
,
@b
,
@handler
.
compile_time
[
b_n
])
assert
@handler
.
send
(
:template_changed_since?
,
@s
,
@handler
.
compile_time
[
s_n
])
unless
windows
assert
!
@handler
.
send
(
:compile_template?
,
ta
)
assert
@handler
.
send
(
:compile_template?
,
tb
)
assert
@handler
.
send
(
:compile_template?
,
ts
)
unless
windows
Time
.
expects
(
:now
).
times
(
windows
?
1
:
2
).
returns
(
t
+
5
.
seconds
)
v
.
send
(
:render_template
,
ta
)
v
.
send
(
:render_template
,
tb
)
v
.
send
(
:render_template
,
ts
)
unless
windows
# the file at the end of the symlink has changed since last compile
# both the symlink and the file at the end of it should be recompiled
assert
@handler
.
compile_time
[
a_n
]
<
t
+
5
.
seconds
assert_equal
@handler
.
compile_time
[
b_n
],
t
+
5
.
seconds
assert_equal
@handler
.
compile_time
[
s_n
],
t
+
5
.
seconds
unless
windows
end
end
end
activerecord/lib/active_record/validations.rb
浏览文件 @
cb59c93d
...
...
@@ -692,7 +692,7 @@ def validates_format_of(*attr_names)
raise
(
ArgumentError
,
"A regular expression must be supplied as the :with option of the configuration hash"
)
unless
configuration
[
:with
].
is_a?
(
Regexp
)
validates_each
(
attr_names
,
configuration
)
do
|
record
,
attr_name
,
value
|
record
.
errors
.
add
(
attr_name
,
configuration
[
:message
])
unless
value
.
to_s
=~
configuration
[
:with
]
record
.
errors
.
add
(
attr_name
,
configuration
[
:message
]
%
value
)
unless
value
.
to_s
=~
configuration
[
:with
]
end
end
...
...
activerecord/test/cases/validations_test.rb
浏览文件 @
cb59c93d
...
...
@@ -583,6 +583,12 @@ def test_validate_format_numeric
assert_nil
t
.
errors
.
on
(
:title
)
end
def
test_validate_format_with_formatted_message
Topic
.
validates_format_of
(
:title
,
:with
=>
/^Valid Title$/
,
:message
=>
"can't be %s"
)
t
=
Topic
.
create
(
:title
=>
'Invalid title'
)
assert_equal
"can't be Invalid title"
,
t
.
errors
.
on
(
:title
)
end
def
test_validates_inclusion_of
Topic
.
validates_inclusion_of
(
:title
,
:in
=>
%w( a b c d e f g )
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录