Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张重言
rails
提交
1e12dc04
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,发现更多精彩内容 >>
提交
1e12dc04
编写于
1月 12, 2010
作者:
J
José Valim
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Stub initial Rails::Subscriber implementation.
上级
5f34bd61
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
198 addition
and
0 deletion
+198
-0
railties/lib/rails/subscriber.rb
railties/lib/rails/subscriber.rb
+96
-0
railties/test/subscriber_test.rb
railties/test/subscriber_test.rb
+102
-0
未找到文件。
railties/lib/rails/subscriber.rb
0 → 100644
浏览文件 @
1e12dc04
require
'active_support/core_ext/class/inheritable_attributes'
require
'active_support/notifications'
module
Rails
# Rails::Subscriber is an object set to consume ActiveSupport::Notifications
# on initialization with solely purpose of logging. The subscriber dispatches
# notifications to a regirested object based on its given namespace.
#
# An example would be ActiveRecord subscriber responsible for logging queries:
#
# module ActiveRecord
# class Railtie
# class Subscriber < Rails::Subscriber
# def sql(event)
# "#{event.payload[:name]} (#{event.duration}) #{event.payload[:sql]}"
# end
# end
# end
# end
#
# It's finally registed as:
#
# Rails::Subscriber.add :active_record, ActiveRecord::Railtie::Subscriber.new
#
# So whenever a "active_record.sql" notification arrive to Rails::Subscriber,
# it will properly dispatch the event (ActiveSupport::Notifications::Event) to
# the sql method.
#
# This is useful because it avoids spanning several subscribers just for logging
# purposes(which slows down the main thread). Besides of providing a centralized
# facility on top of Rails.logger.
#
# Finally, Subscriber some helpers to deal with logging, like managing console colors.
class
Subscriber
cattr_accessor
:colorize_logging
,
:instance_writer
=>
false
self
.
colorize_logging
=
true
# Embed in a String to clear all previous ANSI sequences.
CLEAR
=
"
\e
[0m"
BOLD
=
"
\e
[1m"
# Colors
BLACK
=
"
\e
[30m"
RED
=
"
\e
[31m"
GREEN
=
"
\e
[32m"
YELLOW
=
"
\e
[33m"
BLUE
=
"
\e
[34m"
MAGENTA
=
"
\e
[35m"
CYAN
=
"
\e
[36m"
WHITE
=
"
\e
[37m"
def
self
.
add
(
namespace
,
subscriber
)
subscribers
[
namespace
.
to_sym
]
=
subscriber
end
def
self
.
subscribers
@subscribers
||=
{}
end
def
self
.
dispatch
(
args
)
namespace
,
name
=
args
[
0
].
split
(
"."
)
subscriber
=
subscribers
[
namespace
.
to_sym
]
if
subscriber
.
respond_to?
(
name
)
&&
subscriber
.
logger
subscriber
.
send
(
name
,
ActiveSupport
::
Notifications
::
Event
.
new
(
*
args
))
end
end
# By default, we use the Rails.logger for logging.
def
logger
Rails
.
logger
end
protected
%w(info debug warn error fatal unknown)
.
each
do
|
level
|
class_eval
<<-
METHOD
,
__FILE__
,
__LINE__
+
1
def
#{
level
}
(*args, &block)
logger.
#{
level
}
(*args, &block)
end
METHOD
end
# Set color by using a string or one of the defined constants. If a third
# option is set to true, it also adds bold to the string. This is based
# on Highline implementation and it automatically appends CLEAR to the end
# of the returned String.
#
def
color
(
text
,
color
,
bold
=
false
)
return
text
unless
colorize_logging
color
=
self
.
class
.
const_get
(
color
.
to_s
.
upcase
)
if
color
.
is_a?
(
Symbol
)
bold
=
bold
?
BOLD
:
""
"
#{
bold
}#{
color
}#{
text
}#{
CLEAR
}
"
end
end
end
\ No newline at end of file
railties/test/subscriber_test.rb
0 → 100644
浏览文件 @
1e12dc04
require
'abstract_unit'
require
'rails/subscriber'
Thread
.
abort_on_exception
=
true
class
MockLogger
def
initialize
@logged
=
Hash
.
new
{
|
h
,
k
|
h
[
k
]
=
[]
}
end
def
method_missing
(
level
,
message
)
@logged
[
level
]
<<
message
end
def
logged
(
level
)
@logged
[
level
].
compact
.
map
{
|
l
|
l
.
to_s
.
strip
}
end
end
ActiveSupport
::
Notifications
.
subscribe
do
|*
args
|
Rails
::
Subscriber
.
dispatch
(
args
)
end
class
MySubscriber
<
Rails
::
Subscriber
def
some_event
(
event
)
info
event
.
name
end
def
foo
(
event
)
debug
"debug"
info
"info"
warn
"warn"
end
def
bar
(
event
)
info
"
#{
color
(
"cool"
,
:red
)
}
,
#{
color
(
"isn't it?"
,
:blue
,
true
)
}
"
end
end
class
SubscriberTest
<
ActiveSupport
::
TestCase
def
setup
@logger
=
MockLogger
.
new
@previous_logger
,
Rails
.
logger
=
Rails
.
logger
,
@logger
@subscriber
=
MySubscriber
.
new
wait
end
def
teardown
Rails
.
logger
=
@previous_logger
Rails
::
Subscriber
.
subscribers
.
clear
end
def
instrument
(
*
args
,
&
block
)
ActiveSupport
::
Notifications
.
instrument
(
*
args
,
&
block
)
end
def
wait
ActiveSupport
::
Notifications
.
notifier
.
wait
end
def
test_proxies_method_to_rails_logger
@subscriber
.
foo
(
nil
)
assert_equal
%w(debug)
,
@logger
.
logged
(
:debug
)
assert_equal
%w(info)
,
@logger
.
logged
(
:info
)
assert_equal
%w(warn)
,
@logger
.
logged
(
:warn
)
end
def
test_set_color_for_messages
@subscriber
.
bar
(
nil
)
assert_equal
"
\e
[31mcool
\e
[0m,
\e
[1m
\e
[34misn't it?
\e
[0m"
,
@logger
.
logged
(
:info
).
last
end
def
test_does_not_set_color_if_colorize_logging_is_set_to_false
Rails
::
Subscriber
.
colorize_logging
=
false
@subscriber
.
bar
(
nil
)
assert_equal
"cool, isn't it?"
,
@logger
.
logged
(
:info
).
last
ensure
Rails
::
Subscriber
.
colorize_logging
=
true
end
def
test_event_is_sent_to_the_registered_class
Rails
::
Subscriber
.
add
:my_subscriber
,
@subscriber
instrument
"my_subscriber.some_event"
wait
assert_equal
%w(my_subscriber.some_event)
,
@logger
.
logged
(
:info
)
end
def
test_does_not_send_the_event_if_it_doesnt_match_the_class
Rails
::
Subscriber
.
add
:my_subscriber
,
@subscriber
instrument
"my_subscriber.unknown_event"
wait
# If we get here, it means that NoMethodError was raised.
end
def
test_does_not_send_the_event_if_logger_is_nil
Rails
.
logger
=
nil
Rails
::
Subscriber
.
add
:my_subscriber
,
@subscriber
instrument
"my_subscriber.some_event"
wait
assert_equal
[],
@logger
.
logged
(
:info
)
end
end
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录