Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张重言
rails
提交
0ec23eff
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,体验更适合开发者的 AI 搜索 >>
未验证
提交
0ec23eff
编写于
4月 02, 2018
作者:
K
Kasper Timm Hansen
提交者:
GitHub
4月 02, 2018
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #32065 from sikachu/move-SourceAnnotationExtractor-under-rails-namespec
Move SourceAnnotationExtractor under Rails module
上级
09b2348f
f2ebfcb0
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
137 addition
and
130 deletion
+137
-130
Gemfile.lock
Gemfile.lock
+5
-7
railties/lib/rails/application/configuration.rb
railties/lib/rails/application/configuration.rb
+1
-1
railties/lib/rails/source_annotation_extractor.rb
railties/lib/rails/source_annotation_extractor.rb
+126
-117
railties/lib/rails/tasks/annotations.rake
railties/lib/rails/tasks/annotations.rake
+3
-3
railties/test/application/configuration_test.rb
railties/test/application/configuration_test.rb
+1
-1
railties/test/application/rake/notes_test.rb
railties/test/application/rake/notes_test.rb
+1
-1
未找到文件。
Gemfile.lock
浏览文件 @
0ec23eff
...
...
@@ -156,9 +156,7 @@ GEM
childprocess
faraday
selenium-webdriver
bootsnap (1.1.2)
msgpack (~> 1.0)
bootsnap (1.1.2-java)
bootsnap (1.2.1)
msgpack (~> 1.0)
builder (3.2.3)
bunny (2.6.6)
...
...
@@ -311,10 +309,10 @@ GEM
mocha (1.3.0)
metaclass (~> 0.0.1)
mono_logger (1.1.0)
msgpack (1.
1.0
)
msgpack (1.
1.0
-java)
msgpack (1.
1.0
-x64-mingw32)
msgpack (1.
1.0
-x86-mingw32)
msgpack (1.
2.4
)
msgpack (1.
2.4
-java)
msgpack (1.
2.4
-x64-mingw32)
msgpack (1.
2.4
-x86-mingw32)
multi_json (1.12.2)
multipart-post (2.0.0)
mustache (1.0.5)
...
...
railties/lib/rails/application/configuration.rb
浏览文件 @
0ec23eff
...
...
@@ -253,7 +253,7 @@ def session_store? #:nodoc:
end
def
annotations
SourceAnnotationExtractor
::
Annotation
Rails
::
SourceAnnotationExtractor
::
Annotation
end
def
content_security_policy
(
&
block
)
...
...
railties/lib/rails/source_annotation_extractor.rb
浏览文件 @
0ec23eff
# frozen_string_literal: true
# Implements the logic behind the rake tasks for annotations like
#
# rails notes
# rails notes:optimize
#
# and friends. See <tt>rails -T notes</tt> and <tt>railties/lib/rails/tasks/annotations.rake</tt>.
#
# Annotation objects are triplets <tt>:line</tt>, <tt>:tag</tt>, <tt>:text</tt> that
# represent the line where the annotation lives, its tag, and its text. Note
# the filename is not stored.
#
# Annotations are looked for in comments and modulus whitespace they have to
# start with the tag optionally followed by a colon. Everything up to the end
# of the line (or closing ERB comment tag) is considered to be their text.
class
SourceAnnotationExtractor
Annotation
=
Struct
.
new
(
:line
,
:tag
,
:text
)
do
def
self
.
directories
@@directories
||=
%w(app config db lib test)
+
(
ENV
[
"SOURCE_ANNOTATION_DIRECTORIES"
]
||
""
).
split
(
","
)
end
require
"active_support/deprecation"
# Registers additional directories to be included
# SourceAnnotationExtractor::Annotation.register_directories("spec", "another")
def
self
.
register_directories
(
*
dirs
)
directories
.
push
(
*
dirs
)
end
# Remove this deprecated class in the next minor version
#:nodoc:
SourceAnnotationExtractor
=
ActiveSupport
::
Deprecation
::
DeprecatedConstantProxy
.
new
(
"SourceAnnotationExtractor"
,
"Rails::SourceAnnotationExtractor"
)
def
self
.
extensions
@@extensions
||=
{}
end
module
Rails
# Implements the logic behind the rake tasks for annotations like
#
# rails notes
# rails notes:optimize
#
# and friends. See <tt>rails -T notes</tt> and <tt>railties/lib/rails/tasks/annotations.rake</tt>.
#
# Annotation objects are triplets <tt>:line</tt>, <tt>:tag</tt>, <tt>:text</tt> that
# represent the line where the annotation lives, its tag, and its text. Note
# the filename is not stored.
#
# Annotations are looked for in comments and modulus whitespace they have to
# start with the tag optionally followed by a colon. Everything up to the end
# of the line (or closing ERB comment tag) is considered to be their text.
class
SourceAnnotationExtractor
class
Annotation
<
Struct
.
new
(
:line
,
:tag
,
:text
)
def
self
.
directories
@@directories
||=
%w(app config db lib test)
+
(
ENV
[
"SOURCE_ANNOTATION_DIRECTORIES"
]
||
""
).
split
(
","
)
end
# Registers new Annotations File Extensions
# SourceAnnotationExtractor::Annotation.register_extensions("css", "scss", "sass", "less", "js") { |tag| /\/\/\s*(#{tag}):?\s*(.*)$/ }
def
self
.
register_extensions
(
*
exts
,
&
block
)
extensions
[
/\.(
#{
exts
.
join
(
"|"
)
}
)$/
]
=
block
end
# Registers additional directories to be included
# SourceAnnotationExtractor::Annotation.register_directories("spec", "another")
def
self
.
register_directories
(
*
dirs
)
directories
.
push
(
*
dirs
)
end
register_extensions
(
"builder"
,
"rb"
,
"rake"
,
"yml"
,
"yaml"
,
"ruby"
)
{
|
tag
|
/#\s*(
#{
tag
}
):?\s*(.*)$/
}
register_extensions
(
"css"
,
"js"
)
{
|
tag
|
/\/\/\s*(
#{
tag
}
):?\s*(.*)$/
}
register_extensions
(
"erb"
)
{
|
tag
|
/<%\s*#\s*(
#{
tag
}
):?\s*(.*?)\s*%>/
}
def
self
.
extensions
@@extensions
||=
{
}
end
# Returns a representation of the annotation that looks like this:
# Registers new Annotations File Extensions
# SourceAnnotationExtractor::Annotation.register_extensions("css", "scss", "sass", "less", "js") { |tag| /\/\/\s*(#{tag}):?\s*(.*)$/ }
def
self
.
register_extensions
(
*
exts
,
&
block
)
extensions
[
/\.(
#{
exts
.
join
(
"|"
)
}
)$/
]
=
block
end
register_extensions
(
"builder"
,
"rb"
,
"rake"
,
"yml"
,
"yaml"
,
"ruby"
)
{
|
tag
|
/#\s*(
#{
tag
}
):?\s*(.*)$/
}
register_extensions
(
"css"
,
"js"
)
{
|
tag
|
/\/\/\s*(
#{
tag
}
):?\s*(.*)$/
}
register_extensions
(
"erb"
)
{
|
tag
|
/<%\s*#\s*(
#{
tag
}
):?\s*(.*?)\s*%>/
}
# Returns a representation of the annotation that looks like this:
#
# [126] [TODO] This algorithm is simple and clearly correct, make it faster.
#
# If +options+ has a flag <tt>:tag</tt> the tag is shown as in the example above.
# Otherwise the string contains just line and text.
def
to_s
(
options
=
{})
s
=
"[
#{
line
.
to_s
.
rjust
(
options
[
:indent
])
}
] "
.
dup
s
<<
"[
#{
tag
}
] "
if
options
[
:tag
]
s
<<
text
end
end
# Prints all annotations with tag +tag+ under the root directories +app+,
# +config+, +db+, +lib+, and +test+ (recursively).
#
# [126] [TODO] This algorithm is simple and clearly correct, make it faster.
# Additional directories may be added using a comma-delimited list set using
# <tt>ENV['SOURCE_ANNOTATION_DIRECTORIES']</tt>.
#
# If +options+ has a flag <tt>:tag</tt> the tag is shown as in the example above.
# Otherwise the string contains just line and text.
def
to_s
(
options
=
{})
s
=
"[
#{
line
.
to_s
.
rjust
(
options
[
:indent
])
}
] "
.
dup
s
<<
"[
#{
tag
}
] "
if
options
[
:tag
]
s
<<
text
# Directories may also be explicitly set using the <tt>:dirs</tt> key in +options+.
#
# SourceAnnotationExtractor.enumerate 'TODO|FIXME', dirs: %w(app lib), tag: true
#
# If +options+ has a <tt>:tag</tt> flag, it will be passed to each annotation's +to_s+.
#
# See <tt>#find_in</tt> for a list of file extensions that will be taken into account.
#
# This class method is the single entry point for the rake tasks.
def
self
.
enumerate
(
tag
,
options
=
{})
extractor
=
new
(
tag
)
dirs
=
options
.
delete
(
:dirs
)
||
Annotation
.
directories
extractor
.
display
(
extractor
.
find
(
dirs
),
options
)
end
end
# Prints all annotations with tag +tag+ under the root directories +app+,
# +config+, +db+, +lib+, and +test+ (recursively).
#
# Additional directories may be added using a comma-delimited list set using
# <tt>ENV['SOURCE_ANNOTATION_DIRECTORIES']</tt>.
#
# Directories may also be explicitly set using the <tt>:dirs</tt> key in +options+.
#
# SourceAnnotationExtractor.enumerate 'TODO|FIXME', dirs: %w(app lib), tag: true
#
# If +options+ has a <tt>:tag</tt> flag, it will be passed to each annotation's +to_s+.
#
# See <tt>#find_in</tt> for a list of file extensions that will be taken into account.
#
# This class method is the single entry point for the rake tasks.
def
self
.
enumerate
(
tag
,
options
=
{})
extractor
=
new
(
tag
)
dirs
=
options
.
delete
(
:dirs
)
||
Annotation
.
directories
extractor
.
display
(
extractor
.
find
(
dirs
),
options
)
end
attr_reader
:tag
def
initialize
(
tag
)
@tag
=
tag
end
attr_reader
:tag
# Returns a hash that maps filenames under +dirs+ (recursively) to arrays
# with their annotations.
def
find
(
dirs
)
dirs
.
inject
({})
{
|
h
,
dir
|
h
.
update
(
find_in
(
dir
))
}
end
def
initialize
(
tag
)
@tag
=
tag
end
# Returns a hash that maps filenames under +dir+ (recursively) to arrays
# with their annotations. Only files with annotations are included. Files
# with extension +.builder+, +.rb+, +.rake+, +.yml+, +.yaml+, +.ruby+,
# +.css+, +.js+ and +.erb+ are taken into account.
def
find_in
(
dir
)
results
=
{}
Dir
.
glob
(
"
#{
dir
}
/*"
)
do
|
item
|
next
if
File
.
basename
(
item
)[
0
]
==
?.
if
File
.
directory?
(
item
)
results
.
update
(
find_in
(
item
))
else
extension
=
Annotation
.
extensions
.
detect
do
|
regexp
,
_block
|
regexp
.
match
(
item
)
end
# Returns a hash that maps filenames under +dirs+ (recursively) to arrays
# with their annotations.
def
find
(
dirs
)
dirs
.
inject
({})
{
|
h
,
dir
|
h
.
update
(
find_in
(
dir
))
}
end
if
extension
pattern
=
extension
.
last
.
call
(
tag
)
results
.
update
(
extract_annotations_from
(
item
,
pattern
))
if
pattern
# Returns a hash that maps filenames under +dir+ (recursively) to arrays
# with their annotations. Only files with annotations are included. Files
# with extension +.builder+, +.rb+, +.rake+, +.yml+, +.yaml+, +.ruby+,
# +.css+, +.js+ and +.erb+ are taken into account.
def
find_in
(
dir
)
results
=
{}
Dir
.
glob
(
"
#{
dir
}
/*"
)
do
|
item
|
next
if
File
.
basename
(
item
)[
0
]
==
?.
if
File
.
directory?
(
item
)
results
.
update
(
find_in
(
item
))
else
extension
=
Annotation
.
extensions
.
detect
do
|
regexp
,
_block
|
regexp
.
match
(
item
)
end
if
extension
pattern
=
extension
.
last
.
call
(
tag
)
results
.
update
(
extract_annotations_from
(
item
,
pattern
))
if
pattern
end
end
end
end
results
end
results
end
# If +file+ is the filename of a file that contains annotations this method returns
# a hash with a single entry that maps +file+ to an array of its annotations.
# Otherwise it returns an empty hash.
def
extract_annotations_from
(
file
,
pattern
)
lineno
=
0
result
=
File
.
readlines
(
file
,
encoding:
Encoding
::
BINARY
).
inject
([])
do
|
list
,
line
|
lineno
+=
1
next
list
unless
line
=~
pattern
list
<<
Annotation
.
new
(
lineno
,
$1
,
$2
)
# If +file+ is the filename of a file that contains annotations this method returns
# a hash with a single entry that maps +file+ to an array of its annotations.
# Otherwise it returns an empty hash.
def
extract_annotations_from
(
file
,
pattern
)
lineno
=
0
result
=
File
.
readlines
(
file
,
encoding:
Encoding
::
BINARY
).
inject
([])
do
|
list
,
line
|
lineno
+=
1
next
list
unless
line
=~
pattern
list
<<
Annotation
.
new
(
lineno
,
$1
,
$2
)
end
result
.
empty?
?
{}
:
{
file
=>
result
}
end
result
.
empty?
?
{}
:
{
file
=>
result
}
end
# Prints the mapping from filenames to annotations in +results+ ordered by filename.
# The +options+ hash is passed to each annotation's +to_s+.
def
display
(
results
,
options
=
{})
options
[
:indent
]
=
results
.
flat_map
{
|
f
,
a
|
a
.
map
(
&
:line
)
}.
max
.
to_s
.
size
results
.
keys
.
sort
.
each
do
|
file
|
puts
"
#{
file
}
:"
results
[
file
].
each
do
|
note
|
puts
" *
#{
note
.
to_s
(
options
)
}
"
# Prints the mapping from filenames to annotations in +results+ ordered by filename.
# The +options+ hash is passed to each annotation's +to_s+.
def
display
(
results
,
options
=
{})
options
[
:indent
]
=
results
.
flat_map
{
|
f
,
a
|
a
.
map
(
&
:line
)
}.
max
.
to_s
.
size
results
.
keys
.
sort
.
each
do
|
file
|
puts
"
#{
file
}
:"
results
[
file
].
each
do
|
note
|
puts
" *
#{
note
.
to_s
(
options
)
}
"
end
puts
end
puts
end
end
end
railties/lib/rails/tasks/annotations.rake
浏览文件 @
0ec23eff
...
...
@@ -4,19 +4,19 @@ require "rails/source_annotation_extractor"
desc
"Enumerate all annotations (use notes:optimize, :fixme, :todo for focus)"
task
:notes
do
SourceAnnotationExtractor
.
enumerate
"OPTIMIZE|FIXME|TODO"
,
tag:
true
Rails
::
SourceAnnotationExtractor
.
enumerate
"OPTIMIZE|FIXME|TODO"
,
tag:
true
end
namespace
:notes
do
[
"OPTIMIZE"
,
"FIXME"
,
"TODO"
].
each
do
|
annotation
|
# desc "Enumerate all #{annotation} annotations"
task
annotation
.
downcase
.
intern
do
SourceAnnotationExtractor
.
enumerate
annotation
Rails
::
SourceAnnotationExtractor
.
enumerate
annotation
end
end
desc
"Enumerate a custom annotation, specify with ANNOTATION=CUSTOM"
task
:custom
do
SourceAnnotationExtractor
.
enumerate
ENV
[
"ANNOTATION"
]
Rails
::
SourceAnnotationExtractor
.
enumerate
ENV
[
"ANNOTATION"
]
end
end
railties/test/application/configuration_test.rb
浏览文件 @
0ec23eff
...
...
@@ -1510,7 +1510,7 @@ def index
end
end
assert_not_nil
SourceAnnotationExtractor
::
Annotation
.
extensions
[
/\.(coffee)$/
]
assert_not_nil
Rails
::
SourceAnnotationExtractor
::
Annotation
.
extensions
[
/\.(coffee)$/
]
end
test
"rake_tasks block works at instance level"
do
...
...
railties/test/application/rake/notes_test.rb
浏览文件 @
0ec23eff
...
...
@@ -101,7 +101,7 @@ def teardown
task :notes_custom do
tags = 'TODO|FIXME'
opts = { dirs: %w(lib test), tag: true }
SourceAnnotationExtractor.enumerate(tags, opts)
Rails::
SourceAnnotationExtractor.enumerate(tags, opts)
end
EOS
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录