1
1
##
2
2
# Adapted from:
3
+ # https://github.com/rubygems/rubygems/blob/cb28f5e991/lib/rubygems/deprecate.rb
3
4
# https://github.com/rails/rails/blob/280654ef88/activejob/lib/active_job/logging.rb
5
+ #
6
+ # Provides a single method +notify+ to be used to declare when
7
+ # something a method notifies.
8
+ #
9
+ # class Adapter
10
+ # def self.klass_method
11
+ # # ...
12
+ # end
13
+ #
14
+ # def instance_method
15
+ # # ...
16
+ # end
17
+ #
18
+ # extend ActiveModelSerializers::Logging
19
+ # notify :instance_method, :render
20
+ #
21
+ # class << self
22
+ # extend ActiveModelSerializers::Logging
23
+ # notify :klass_method, :render
24
+ # end
25
+ # end
4
26
module ActiveModelSerializers ::Logging
5
- def self . included ( base )
6
- base . send ( :include , ActiveSupport ::Callbacks )
7
- base . extend ClassMethods
8
- base . class_eval do
27
+ extend ActiveSupport ::Concern
28
+
29
+ included do
30
+ include ActiveSupport ::Callbacks
31
+ instrument_around_render
32
+ end
33
+
34
+ module ClassMethods
35
+ def instrument_around_render
9
36
define_callbacks :render
10
- around_render do |_ , block |
11
- notify_active_support do
12
- block . call
37
+ around_render do |args , block |
38
+ tag_logger do
39
+ notify_render do
40
+ block . call ( args )
41
+ end
13
42
end
14
43
end
15
44
end
16
- end
17
45
18
- module ClassMethods
19
46
def around_render ( *filters , &blk )
20
47
set_callback ( :render , :around , *filters , &blk )
21
48
end
49
+
22
50
##
23
51
# Simple notify method that wraps up +name+
24
- # in a dummy method. It notifies on each call to the dummy method
25
- # telling what the current serializer and adapter are being rendered.
52
+ # in a dummy method. It notifies on with the +callback_name+ notifier on
53
+ # each call to the dummy method, telling what the current serializer and adapter
54
+ # are being rendered.
26
55
# Adapted from:
27
56
# https://github.com/rubygems/rubygems/blob/cb28f5e991/lib/rubygems/deprecate.rb
28
-
29
57
def notify ( name , callback_name )
30
58
class_eval do
31
59
old = "_notifying_#{ callback_name } _#{ name } "
@@ -39,25 +67,39 @@ def notify(name, callback_name)
39
67
end
40
68
end
41
69
42
- def notify_active_support
70
+ def notify_render ( * )
43
71
event_name = 'render.active_model_serializers' . freeze
44
- payload = { serializer : serializer , adapter : adapter }
45
- ActiveSupport ::Notifications . instrument ( event_name , payload ) do
72
+ ActiveSupport ::Notifications . instrument ( event_name , notify_render_payload ) do
46
73
yield
47
74
end
48
75
end
49
76
77
+ def notify_render_payload
78
+ { serializer : serializer , adapter : adapter }
79
+ end
80
+
50
81
private
51
82
83
+ def tag_logger ( *tags )
84
+ if ActiveModelSerializers . logger . respond_to? ( :tagged )
85
+ tags . unshift 'AMS' . freeze unless logger_tagged_by_active_model_serializers?
86
+ ActiveModelSerializers . logger . tagged ( *tags ) { yield }
87
+ else
88
+ yield
89
+ end
90
+ end
91
+
92
+ def logger_tagged_by_active_model_serializers?
93
+ ActiveModelSerializers . logger . formatter . current_tags . include? ( 'AMS' . freeze )
94
+ end
95
+
52
96
class LogSubscriber < ActiveSupport ::LogSubscriber
53
97
def render ( event )
54
- logger . tagged ( 'AMS' ) do
55
- info do
56
- serializer = event . payload [ :serializer ]
57
- adapter = event . payload [ :adapter ]
58
- duration = event . duration . round ( 2 )
59
- "Rendered #{ serializer . name } with #{ adapter . class } (#{ duration } ms)"
60
- end
98
+ info do
99
+ serializer = event . payload [ :serializer ]
100
+ adapter = event . payload [ :adapter ]
101
+ duration = event . duration . round ( 2 )
102
+ "Rendered #{ serializer . name } with #{ adapter . class } (#{ duration } ms)"
61
103
end
62
104
end
63
105
0 commit comments