markdown_logging_proxy 1.1.1 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +13 -0
- data/Gemfile.lock +1 -1
- data/dist/markdown_logging_proxy.rb +69 -34
- data/lib/markdown_logging_proxy/markdown_logger.rb +0 -14
- data/lib/markdown_logging_proxy/proxy.rb +4 -7
- data/lib/markdown_logging_proxy/tracer.rb +65 -13
- data/markdown_logging_proxy.gemspec +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e893add5ca96b98f32be5370fb7bfc61e3f80f387392359b4c8e25f9d7e1ca45
|
4
|
+
data.tar.gz: 37dd7b894552ba38329279dcb2c8ef23961ca719c23ba1f7a5343e0e1c365c89
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fd08c3cecf05ef6173ae54c8cd9885e2817c94c141fd3c168c1a04f79f9c267e9fbaebb164cf00ba6670125f4dafd0135a47d39b758b11b043feabf851bf9e8d
|
7
|
+
data.tar.gz: '096efff296da1406507b5f2a5531bbf267324a4b53c27ce7ced1b05f85e59b223480e5cb21838b658937a00093cad8e2d961f1c6727a48e85bf3ecf06a9797bb'
|
data/CHANGELOG.md
CHANGED
@@ -29,3 +29,16 @@
|
|
29
29
|
|
30
30
|
- Allow proxying of `nil`
|
31
31
|
- Add require statements to copy+paste version
|
32
|
+
|
33
|
+
## [1.2.0]
|
34
|
+
|
35
|
+
- Overwrite as many `Object` methods as we can by default
|
36
|
+
|
37
|
+
## [1.3.0]
|
38
|
+
|
39
|
+
- Add `inspect_method` configuration option
|
40
|
+
|
41
|
+
## [1.3.1]
|
42
|
+
|
43
|
+
- Object inspection improvements and fixes
|
44
|
+
- Implement `inspect_method: :limited` configuration option
|
data/Gemfile.lock
CHANGED
@@ -4,20 +4,6 @@ require 'pp'
|
|
4
4
|
require 'time'
|
5
5
|
module MarkdownLoggingProxy
|
6
6
|
class MarkdownLogger
|
7
|
-
def self.inspect_object(object, show_id = true)
|
8
|
-
[
|
9
|
-
'```ruby',
|
10
|
-
("# #{id_object(object)}" if show_id),
|
11
|
-
object.pretty_inspect.chomp,
|
12
|
-
'```'
|
13
|
-
].compact.join("\n")
|
14
|
-
end
|
15
|
-
|
16
|
-
def self.id_object(object)
|
17
|
-
# #<Object:0x00007f5a0919e140>
|
18
|
-
"`#<#{object.class}:0x#{object.object_id.to_s(16)}>`"
|
19
|
-
end
|
20
|
-
|
21
7
|
def self.build(location, **options)
|
22
8
|
return location if location.is_a?(MarkdownLogger)
|
23
9
|
new(location, **options)
|
@@ -86,19 +72,15 @@ module MarkdownLoggingProxy
|
|
86
72
|
end
|
87
73
|
module MarkdownLoggingProxy
|
88
74
|
class Proxy
|
89
|
-
|
90
|
-
DEFAULT_OVERWRITES =
|
91
|
-
! != !~ <=> == === =~
|
92
|
-
clone display dup enum_for eql? equal? freeze frozen? hash inspect
|
93
|
-
is_a? itself kind_of? nil? taint tainted? tap then to_enum to_s
|
94
|
-
trust untaint unstrust untrusted? yield_self
|
95
|
-
]
|
75
|
+
DO_NOT_OVERWRITE = %i[__binding__ __id__ __send__ class extend]
|
76
|
+
DEFAULT_OVERWRITES = Object.new.methods - DO_NOT_OVERWRITE
|
96
77
|
|
97
78
|
def initialize(
|
98
79
|
to_proxy = nil,
|
99
80
|
target: nil,
|
100
81
|
location: STDOUT,
|
101
82
|
backtrace: true, # regex/true/false backtrace control
|
83
|
+
inspect_method: :pretty_inspect,
|
102
84
|
ignore: [], # methods we shouldn't log/proxy
|
103
85
|
proxy_response: [], # methods we should return a proxy for
|
104
86
|
overwrite: DEFAULT_OVERWRITES
|
@@ -109,6 +91,7 @@ module MarkdownLoggingProxy
|
|
109
91
|
target: @target,
|
110
92
|
proxy: self,
|
111
93
|
logger: @logger,
|
94
|
+
inspect_method: inspect_method,
|
112
95
|
ignore: ignore,
|
113
96
|
proxy_response: proxy_response,
|
114
97
|
proxy_options: {
|
@@ -130,18 +113,20 @@ module MarkdownLoggingProxy
|
|
130
113
|
end
|
131
114
|
module MarkdownLoggingProxy
|
132
115
|
class Tracer
|
133
|
-
attr_reader :target, :logger, :ignore, :proxy
|
116
|
+
attr_reader :target, :logger, :ignore, :proxy, :inspect_method
|
134
117
|
|
135
118
|
def initialize(
|
136
119
|
target:,
|
137
120
|
proxy:,
|
138
121
|
logger: nil,
|
122
|
+
inspect_method: :pretty_inspect,
|
139
123
|
ignore: [],
|
140
124
|
proxy_response: [],
|
141
125
|
proxy_options: {}
|
142
126
|
)
|
143
127
|
@target = target
|
144
128
|
@logger = logger
|
129
|
+
@inspect_method = inspect_method
|
145
130
|
@ignore = ignore
|
146
131
|
@proxy_response = proxy_response
|
147
132
|
@proxy_options = proxy_options
|
@@ -166,16 +151,64 @@ module MarkdownLoggingProxy
|
|
166
151
|
@ignore.member?(meth)
|
167
152
|
end
|
168
153
|
|
154
|
+
def inspect_object(obj, args: false)
|
155
|
+
obj_str =
|
156
|
+
case inspect_method
|
157
|
+
when :inspect then obj.inspect
|
158
|
+
when :limited then limited_inspect(obj)
|
159
|
+
when :id_object
|
160
|
+
if args
|
161
|
+
"[#{obj.map { |o| id_object(o) }.join(',')}]"
|
162
|
+
else
|
163
|
+
id_object(obj)
|
164
|
+
end
|
165
|
+
when :pretty_inpect
|
166
|
+
[obj.pretty_inspect.chomp].tap do |lines|
|
167
|
+
lines.prepend "# #{id_object(obj)}" unless args
|
168
|
+
end.join("\n")
|
169
|
+
else
|
170
|
+
obj.send(inspect_method)
|
171
|
+
end
|
172
|
+
['```ruby', obj_str, '```'].join("\n")
|
173
|
+
end
|
174
|
+
|
175
|
+
# recursive
|
176
|
+
def limited_inspect(obj)
|
177
|
+
case obj
|
178
|
+
when Array
|
179
|
+
"[#{obj.map { |o| limited_inspect(o) }.join(',')}]"
|
180
|
+
when Hash
|
181
|
+
# assumes keys are safe to .inspect
|
182
|
+
insides = obj.each { |k, v| "#{k.inspect} => #{limited_inspect(v)}" }
|
183
|
+
"{#{insides.join(', ')}}"
|
184
|
+
when String, Symbol, Numeric, Class, true, false, nil
|
185
|
+
truncated_inspect(obj)
|
186
|
+
else
|
187
|
+
id_object(obj)
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
def id_object(object)
|
192
|
+
# #<Object:0xe140>
|
193
|
+
"#<#{object.class}:0x#{object.object_id.to_s(16)}>"
|
194
|
+
end
|
195
|
+
|
196
|
+
def truncated_inspect(obj, limit = 280)
|
197
|
+
obj_str = obj.inspect
|
198
|
+
obj_str = "#{obj_str.first(limit)}..." if obj_str.length > limit
|
199
|
+
obj_str
|
200
|
+
end
|
201
|
+
|
169
202
|
private
|
170
203
|
|
171
204
|
def log_call_signature(meth, args, &blk)
|
172
205
|
return if ignore.member?(meth)
|
173
206
|
logger.log :info, 1, <<~MSG.chomp
|
174
|
-
Calling `#{meth}` on
|
207
|
+
Calling `#{meth}` on `#{id_object(target)}`
|
175
208
|
|
176
209
|
Arguments:
|
177
210
|
|
178
|
-
#{
|
211
|
+
#{inspect_object(args, args: true)}
|
179
212
|
|
180
213
|
Block given? #{block_given? ? 'Yes' : 'No'}
|
181
214
|
#{logger.inspect_backtrace}
|
@@ -189,15 +222,16 @@ module MarkdownLoggingProxy
|
|
189
222
|
logger.log :info, 3, <<~MSG.chomp
|
190
223
|
Returning proxied response to `#{meth}`
|
191
224
|
|
192
|
-
Proxy from `#{meth}` on
|
225
|
+
Proxy from `#{meth}` on `#{id_object(target)}`
|
193
226
|
|
194
227
|
Proxy for:
|
195
228
|
|
196
|
-
#{
|
229
|
+
#{inspect_object(response)}
|
197
230
|
MSG
|
198
231
|
Proxy.new(**@proxy_options.merge(
|
199
232
|
target: response,
|
200
233
|
location: logger,
|
234
|
+
inspect_method: inspect_method,
|
201
235
|
proxy_response: @proxy_response,
|
202
236
|
ignore: @ignore,
|
203
237
|
))
|
@@ -205,19 +239,20 @@ module MarkdownLoggingProxy
|
|
205
239
|
|
206
240
|
def log_and_proxy_block(meth, blk)
|
207
241
|
return if blk.nil?
|
242
|
+
tracer = self
|
208
243
|
proc do |*args|
|
209
|
-
logger.log :info, 2, <<~MSG.chomp
|
210
|
-
Yield to block in `#{meth}` on
|
244
|
+
tracer.logger.log :info, 2, <<~MSG.chomp
|
245
|
+
Yield to block in `#{meth}` on `#{tracer.id_object(tracer.target)}`
|
211
246
|
|
212
247
|
Arguments:
|
213
248
|
|
214
|
-
#{
|
249
|
+
#{tracer.inspect_object(args, args: true)}
|
215
250
|
MSG
|
216
|
-
|
217
|
-
logger.log :info, 3, <<~MSG.chomp
|
251
|
+
instance_exec(*args, &blk).tap do |response|
|
252
|
+
tracer.logger.log :info, 3, <<~MSG.chomp
|
218
253
|
Response from block in `#{meth}`
|
219
254
|
|
220
|
-
#{
|
255
|
+
#{tracer.inspect_object(response)}
|
221
256
|
MSG
|
222
257
|
end
|
223
258
|
end
|
@@ -229,7 +264,7 @@ module MarkdownLoggingProxy
|
|
229
264
|
|
230
265
|
Type: #{error.class}
|
231
266
|
|
232
|
-
#{
|
267
|
+
#{inspect_object(error)}
|
233
268
|
MSG
|
234
269
|
raise error
|
235
270
|
end
|
@@ -239,7 +274,7 @@ module MarkdownLoggingProxy
|
|
239
274
|
logger.log :info, 2, <<~MSG.chomp
|
240
275
|
`#{meth}` response
|
241
276
|
|
242
|
-
#{
|
277
|
+
#{inspect_object(response)}
|
243
278
|
MSG
|
244
279
|
end
|
245
280
|
end
|
@@ -1,19 +1,5 @@
|
|
1
1
|
module MarkdownLoggingProxy
|
2
2
|
class MarkdownLogger
|
3
|
-
def self.inspect_object(object, show_id = true)
|
4
|
-
[
|
5
|
-
'```ruby',
|
6
|
-
("# #{id_object(object)}" if show_id),
|
7
|
-
object.pretty_inspect.chomp,
|
8
|
-
'```'
|
9
|
-
].compact.join("\n")
|
10
|
-
end
|
11
|
-
|
12
|
-
def self.id_object(object)
|
13
|
-
# #<Object:0x00007f5a0919e140>
|
14
|
-
"`#<#{object.class}:0x#{object.object_id.to_s(16)}>`"
|
15
|
-
end
|
16
|
-
|
17
3
|
def self.build(location, **options)
|
18
4
|
return location if location.is_a?(MarkdownLogger)
|
19
5
|
new(location, **options)
|
@@ -1,18 +1,14 @@
|
|
1
1
|
module MarkdownLoggingProxy
|
2
2
|
class Proxy
|
3
|
-
|
4
|
-
DEFAULT_OVERWRITES =
|
5
|
-
! != !~ <=> == === =~
|
6
|
-
clone display dup enum_for eql? equal? freeze frozen? hash inspect
|
7
|
-
is_a? itself kind_of? nil? taint tainted? tap then to_enum to_s
|
8
|
-
trust untaint unstrust untrusted? yield_self
|
9
|
-
]
|
3
|
+
DO_NOT_OVERWRITE = %i[__binding__ __id__ __send__ class extend]
|
4
|
+
DEFAULT_OVERWRITES = Object.new.methods - DO_NOT_OVERWRITE
|
10
5
|
|
11
6
|
def initialize(
|
12
7
|
to_proxy = nil,
|
13
8
|
target: nil,
|
14
9
|
location: STDOUT,
|
15
10
|
backtrace: true, # regex/true/false backtrace control
|
11
|
+
inspect_method: :pretty_inspect,
|
16
12
|
ignore: [], # methods we shouldn't log/proxy
|
17
13
|
proxy_response: [], # methods we should return a proxy for
|
18
14
|
overwrite: DEFAULT_OVERWRITES
|
@@ -23,6 +19,7 @@ module MarkdownLoggingProxy
|
|
23
19
|
target: @target,
|
24
20
|
proxy: self,
|
25
21
|
logger: @logger,
|
22
|
+
inspect_method: inspect_method,
|
26
23
|
ignore: ignore,
|
27
24
|
proxy_response: proxy_response,
|
28
25
|
proxy_options: {
|
@@ -1,17 +1,19 @@
|
|
1
1
|
module MarkdownLoggingProxy
|
2
2
|
class Tracer
|
3
|
-
attr_reader :target, :logger, :ignore, :proxy
|
3
|
+
attr_reader :target, :logger, :ignore, :proxy, :inspect_method
|
4
4
|
|
5
5
|
def initialize(
|
6
6
|
target:,
|
7
7
|
proxy:,
|
8
8
|
logger: nil,
|
9
|
+
inspect_method: :pretty_inspect,
|
9
10
|
ignore: [],
|
10
11
|
proxy_response: [],
|
11
12
|
proxy_options: {}
|
12
13
|
)
|
13
14
|
@target = target
|
14
15
|
@logger = logger
|
16
|
+
@inspect_method = inspect_method
|
15
17
|
@ignore = ignore
|
16
18
|
@proxy_response = proxy_response
|
17
19
|
@proxy_options = proxy_options
|
@@ -36,16 +38,64 @@ module MarkdownLoggingProxy
|
|
36
38
|
@ignore.member?(meth)
|
37
39
|
end
|
38
40
|
|
41
|
+
def inspect_object(obj, args: false)
|
42
|
+
obj_str =
|
43
|
+
case inspect_method
|
44
|
+
when :inspect then obj.inspect
|
45
|
+
when :limited then limited_inspect(obj)
|
46
|
+
when :id_object
|
47
|
+
if args
|
48
|
+
"[#{obj.map { |o| id_object(o) }.join(',')}]"
|
49
|
+
else
|
50
|
+
id_object(obj)
|
51
|
+
end
|
52
|
+
when :pretty_inpect
|
53
|
+
[obj.pretty_inspect.chomp].tap do |lines|
|
54
|
+
lines.prepend "# #{id_object(obj)}" unless args
|
55
|
+
end.join("\n")
|
56
|
+
else
|
57
|
+
obj.send(inspect_method)
|
58
|
+
end
|
59
|
+
['```ruby', obj_str, '```'].join("\n")
|
60
|
+
end
|
61
|
+
|
62
|
+
# recursive
|
63
|
+
def limited_inspect(obj)
|
64
|
+
case obj
|
65
|
+
when Array
|
66
|
+
"[#{obj.map { |o| limited_inspect(o) }.join(',')}]"
|
67
|
+
when Hash
|
68
|
+
# assumes keys are safe to .inspect
|
69
|
+
insides = obj.each { |k, v| "#{k.inspect} => #{limited_inspect(v)}" }
|
70
|
+
"{#{insides.join(', ')}}"
|
71
|
+
when String, Symbol, Numeric, Class, true, false, nil
|
72
|
+
truncated_inspect(obj)
|
73
|
+
else
|
74
|
+
id_object(obj)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def id_object(object)
|
79
|
+
# #<Object:0xe140>
|
80
|
+
"#<#{object.class}:0x#{object.object_id.to_s(16)}>"
|
81
|
+
end
|
82
|
+
|
83
|
+
def truncated_inspect(obj, limit = 280)
|
84
|
+
obj_str = obj.inspect
|
85
|
+
obj_str = "#{obj_str.first(limit)}..." if obj_str.length > limit
|
86
|
+
obj_str
|
87
|
+
end
|
88
|
+
|
39
89
|
private
|
40
90
|
|
41
91
|
def log_call_signature(meth, args, &blk)
|
42
92
|
return if ignore.member?(meth)
|
43
93
|
logger.log :info, 1, <<~MSG.chomp
|
44
|
-
Calling `#{meth}` on
|
94
|
+
Calling `#{meth}` on `#{id_object(target)}`
|
45
95
|
|
46
96
|
Arguments:
|
47
97
|
|
48
|
-
#{
|
98
|
+
#{inspect_object(args, args: true)}
|
49
99
|
|
50
100
|
Block given? #{block_given? ? 'Yes' : 'No'}
|
51
101
|
#{logger.inspect_backtrace}
|
@@ -59,15 +109,16 @@ module MarkdownLoggingProxy
|
|
59
109
|
logger.log :info, 3, <<~MSG.chomp
|
60
110
|
Returning proxied response to `#{meth}`
|
61
111
|
|
62
|
-
Proxy from `#{meth}` on
|
112
|
+
Proxy from `#{meth}` on `#{id_object(target)}`
|
63
113
|
|
64
114
|
Proxy for:
|
65
115
|
|
66
|
-
#{
|
116
|
+
#{inspect_object(response)}
|
67
117
|
MSG
|
68
118
|
Proxy.new(**@proxy_options.merge(
|
69
119
|
target: response,
|
70
120
|
location: logger,
|
121
|
+
inspect_method: inspect_method,
|
71
122
|
proxy_response: @proxy_response,
|
72
123
|
ignore: @ignore,
|
73
124
|
))
|
@@ -75,19 +126,20 @@ module MarkdownLoggingProxy
|
|
75
126
|
|
76
127
|
def log_and_proxy_block(meth, blk)
|
77
128
|
return if blk.nil?
|
129
|
+
tracer = self
|
78
130
|
proc do |*args|
|
79
|
-
logger.log :info, 2, <<~MSG.chomp
|
80
|
-
Yield to block in `#{meth}` on
|
131
|
+
tracer.logger.log :info, 2, <<~MSG.chomp
|
132
|
+
Yield to block in `#{meth}` on `#{tracer.id_object(tracer.target)}`
|
81
133
|
|
82
134
|
Arguments:
|
83
135
|
|
84
|
-
#{
|
136
|
+
#{tracer.inspect_object(args, args: true)}
|
85
137
|
MSG
|
86
|
-
|
87
|
-
logger.log :info, 3, <<~MSG.chomp
|
138
|
+
instance_exec(*args, &blk).tap do |response|
|
139
|
+
tracer.logger.log :info, 3, <<~MSG.chomp
|
88
140
|
Response from block in `#{meth}`
|
89
141
|
|
90
|
-
#{
|
142
|
+
#{tracer.inspect_object(response)}
|
91
143
|
MSG
|
92
144
|
end
|
93
145
|
end
|
@@ -99,7 +151,7 @@ module MarkdownLoggingProxy
|
|
99
151
|
|
100
152
|
Type: #{error.class}
|
101
153
|
|
102
|
-
#{
|
154
|
+
#{inspect_object(error)}
|
103
155
|
MSG
|
104
156
|
raise error
|
105
157
|
end
|
@@ -109,7 +161,7 @@ module MarkdownLoggingProxy
|
|
109
161
|
logger.log :info, 2, <<~MSG.chomp
|
110
162
|
`#{meth}` response
|
111
163
|
|
112
|
-
#{
|
164
|
+
#{inspect_object(response)}
|
113
165
|
MSG
|
114
166
|
end
|
115
167
|
end
|