ruby_tracer 0.2.0 → 0.3.0
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/Gemfile +1 -0
- data/Gemfile.lock +7 -1
- data/README.md +50 -13
- data/lib/ruby_tracer/call_tracer.rb +2 -2
- data/lib/ruby_tracer/irb.rb +90 -0
- data/lib/ruby_tracer/version.rb +1 -1
- data/lib/ruby_tracer.rb +2 -0
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0ac708e995302930fed59fa3b9396dc5b3c45ab76d4306c8bbac65fe69c49377
|
4
|
+
data.tar.gz: 99f23f4e5fb2d5f8ae694ff1203524707c757fd5a91cd29131ac61e79c5cb15f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dd1e5c1aef7115227db143c95939ad7ce180c65924334f30540dbed8f9d2f5cd468f0e3e989af1e7d6dd4e49e023798d5a1133c26cf49ccef54080eceb6f925c
|
7
|
+
data.tar.gz: 0dd0e49cf41d3e9fe4fd880b68364f1727d4d29bb4fb8c35b76e37ed97549979130d2678f2f2a0c720282ad17bd0abb15b0694478dea24b40dc57baf452b434b
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,15 +1,20 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
ruby_tracer (0.
|
4
|
+
ruby_tracer (0.3.0)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
8
8
|
specs:
|
9
|
+
io-console (0.6.0)
|
10
|
+
irb (1.6.2)
|
11
|
+
reline (>= 0.3.0)
|
9
12
|
language_server-protocol (3.17.0.3)
|
10
13
|
power_assert (2.0.2)
|
11
14
|
prettier_print (1.2.0)
|
12
15
|
rake (13.0.6)
|
16
|
+
reline (0.3.2)
|
17
|
+
io-console (~> 0.5)
|
13
18
|
ruby-lsp (0.3.8)
|
14
19
|
language_server-protocol (~> 3.17.0)
|
15
20
|
sorbet-runtime
|
@@ -25,6 +30,7 @@ PLATFORMS
|
|
25
30
|
x86_64-linux
|
26
31
|
|
27
32
|
DEPENDENCIES
|
33
|
+
irb
|
28
34
|
rake (~> 13.0)
|
29
35
|
ruby-lsp
|
30
36
|
ruby_tracer!
|
data/README.md
CHANGED
@@ -1,14 +1,6 @@
|
|
1
1
|
# ruby_tracer
|
2
2
|
|
3
|
-
ruby_tracer is an extraction of [`ruby/debug`](https://github.com/ruby/debug)'s [powerful tracers](https://github.com/ruby/debug/blob/master/lib/debug/tracer.rb), with user-facing APIs and
|
4
|
-
|
5
|
-
Its goal is to help users understand their Ruby programss activities by emitting useful trace information, such us:
|
6
|
-
|
7
|
-
- How and where is the target object is being used (`ObjectTracer`)
|
8
|
-
- What exceptions are raised during the execution (`ExceptionTracer`)
|
9
|
-
- When method calls are being performed (`CallTracer`)
|
10
|
-
- Line execution (`LineTracer`)
|
11
|
-
|
3
|
+
ruby_tracer is an extraction of [`ruby/debug`](https://github.com/ruby/debug)'s [powerful tracers](https://github.com/ruby/debug/blob/master/lib/debug/tracer.rb), with user-facing APIs, IRB-integration, and improvements on accuracy.
|
12
4
|
|
13
5
|
## Installation
|
14
6
|
|
@@ -62,9 +54,54 @@ trace_call { ... } # trace method calls in the given block
|
|
62
54
|
trace_exception { ... } # trace exceptions in the given block
|
63
55
|
```
|
64
56
|
|
57
|
+
### IRB-integration
|
58
|
+
|
59
|
+
Once required, `ruby_tracer` registers a few IRB commands to help you trace Ruby expressions:
|
60
|
+
|
61
|
+
```
|
62
|
+
trace Trace the target object (or self) in the given expression. Usage: `trace [target,] <expression>`
|
63
|
+
trace_call Trace method calls in the given expression. Usage: `trace_call <expression>`
|
64
|
+
trace_exception Trace exceptions in the given expression. Usage: `trace_exception <expression>`
|
65
|
+
```
|
66
|
+
|
67
|
+
**Example**
|
68
|
+
|
69
|
+
```rb
|
70
|
+
# test.rb
|
71
|
+
require "ruby_tracer"
|
72
|
+
|
73
|
+
obj = Object.new
|
74
|
+
|
75
|
+
def obj.foo
|
76
|
+
100
|
77
|
+
end
|
78
|
+
|
79
|
+
def bar(obj)
|
80
|
+
obj.foo
|
81
|
+
end
|
82
|
+
|
83
|
+
binding.irb
|
84
|
+
```
|
85
|
+
|
86
|
+
|
87
|
+
```
|
88
|
+
irb(main):001:0> trace obj, bar(obj)
|
89
|
+
#depth:23 #<Object:0x0000000107a86648> is used as a parameter obj of Object#bar at (eval):1:in `<main>'
|
90
|
+
#depth:24 #<Object:0x0000000107a86648> receives .foo at test.rb:10:in `bar'
|
91
|
+
=> 100
|
92
|
+
irb(main):002:0> trace_call bar(obj)
|
93
|
+
#depth:23> Object#bar at (eval):1:in `<main>'
|
94
|
+
#depth:24> #<Object:0x0000000107a86648>.foo at test.rb:10:in `bar'
|
95
|
+
#depth:24< #<Object:0x0000000107a86648>.foo #=> 100 at test.rb:10:in `bar'
|
96
|
+
#depth:23< Object#bar #=> 100 at (eval):1:in `<main>'
|
97
|
+
=> 100
|
98
|
+
```
|
99
|
+
|
100
|
+
### Tracer Classes
|
101
|
+
|
65
102
|
If you want to have more control over individual traces, you can use individual tracer classes:
|
66
103
|
|
67
|
-
|
104
|
+
#### ObjectTracer
|
68
105
|
|
69
106
|
```rb
|
70
107
|
class User
|
@@ -89,7 +126,7 @@ end
|
|
89
126
|
#depth:4 #<User:0x000000010696cad8 @name="John"> receives #name (User#name) at test.rb:8:in `authorized?'
|
90
127
|
```
|
91
128
|
|
92
|
-
|
129
|
+
#### ExceptionTracer
|
93
130
|
|
94
131
|
```rb
|
95
132
|
ExceptionTracer.new.start
|
@@ -103,7 +140,7 @@ end
|
|
103
140
|
#depth:1 #<RuntimeError: boom> at test.rb:4
|
104
141
|
```
|
105
142
|
|
106
|
-
|
143
|
+
#### CallTracer
|
107
144
|
|
108
145
|
```rb
|
109
146
|
class User
|
@@ -135,7 +172,7 @@ end
|
|
135
172
|
#depth:4 < block #=> true at test.rb:16
|
136
173
|
```
|
137
174
|
|
138
|
-
|
175
|
+
#### LineTracer
|
139
176
|
|
140
177
|
```rb
|
141
178
|
class User
|
@@ -7,8 +7,8 @@ class CallTracer < Tracer::Base
|
|
7
7
|
TracePoint.new(:a_call, :a_return) do |tp|
|
8
8
|
next if skip?(tp)
|
9
9
|
|
10
|
-
location = caller_locations(2, 1).first
|
11
|
-
next if location.
|
10
|
+
location = caller_locations(2, 1).first.to_s
|
11
|
+
next if location.match?(DIR) || location.match?(/<internal:/)
|
12
12
|
|
13
13
|
depth = caller.size
|
14
14
|
|
@@ -0,0 +1,90 @@
|
|
1
|
+
require "irb/cmd/nop"
|
2
|
+
require "irb"
|
3
|
+
|
4
|
+
module Tracer
|
5
|
+
def self.register_irb_commands
|
6
|
+
ec = IRB::ExtendCommandBundle.instance_variable_get(:@EXTEND_COMMANDS)
|
7
|
+
|
8
|
+
[
|
9
|
+
[:trace, :Trace, nil, [:trace, IRB::ExtendCommandBundle::OVERRIDE_ALL]],
|
10
|
+
[
|
11
|
+
:trace_call,
|
12
|
+
:TraceCall,
|
13
|
+
nil,
|
14
|
+
[:trace_call, IRB::ExtendCommandBundle::OVERRIDE_ALL]
|
15
|
+
],
|
16
|
+
[
|
17
|
+
:trace_exception,
|
18
|
+
:TraceException,
|
19
|
+
nil,
|
20
|
+
[:trace_exception, IRB::ExtendCommandBundle::OVERRIDE_ALL]
|
21
|
+
]
|
22
|
+
].each do |ecconfig|
|
23
|
+
ec.push(ecconfig)
|
24
|
+
IRB::ExtendCommandBundle.def_extend_command(*ecconfig)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
module IRB
|
30
|
+
module ExtendCommand
|
31
|
+
class TraceCommand < Nop
|
32
|
+
class << self
|
33
|
+
def transform_args(args)
|
34
|
+
# Return a string literal as is for backward compatibility
|
35
|
+
if args.empty? || string_literal?(args)
|
36
|
+
args
|
37
|
+
else # Otherwise, consider the input as a String for convenience
|
38
|
+
args.strip.dump
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
class Trace < TraceCommand
|
45
|
+
category "Tracing"
|
46
|
+
description "Trace the target object (or self) in the given expression. Usage: `trace [target,] <expression>`"
|
47
|
+
|
48
|
+
def execute(*args)
|
49
|
+
args = args.first.split(/,/, 2)
|
50
|
+
|
51
|
+
case args.size
|
52
|
+
when 1
|
53
|
+
target = irb_context.workspace.main
|
54
|
+
expression = args.first
|
55
|
+
when 2
|
56
|
+
target = eval(args.first, irb_context.workspace.binding)
|
57
|
+
expression = args.last
|
58
|
+
else
|
59
|
+
raise ArgumentError,
|
60
|
+
"wrong number of arguments (given #{args.size}, expected 1..2)"
|
61
|
+
end
|
62
|
+
|
63
|
+
b = irb_context.workspace.binding
|
64
|
+
Tracer.trace(target) { eval(expression, b) }
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
class TraceCall < TraceCommand
|
69
|
+
category "Tracing"
|
70
|
+
description "Trace method calls in the given expression. Usage: `trace_call <expression>`"
|
71
|
+
|
72
|
+
def execute(expression)
|
73
|
+
b = irb_context.workspace.binding
|
74
|
+
Tracer.trace_call { eval(expression, b) }
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
class TraceException < TraceCommand
|
79
|
+
category "Tracing"
|
80
|
+
description "Trace exceptions in the given expression. Usage: `trace_exception <expression>`"
|
81
|
+
|
82
|
+
def execute(expression)
|
83
|
+
b = irb_context.workspace.binding
|
84
|
+
Tracer.trace_exception { eval(expression, b) }
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
Tracer.register_irb_commands
|
data/lib/ruby_tracer/version.rb
CHANGED
data/lib/ruby_tracer.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby_tracer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stan Lo
|
@@ -30,6 +30,7 @@ files:
|
|
30
30
|
- lib/ruby_tracer/color.rb
|
31
31
|
- lib/ruby_tracer/exception_tracer.rb
|
32
32
|
- lib/ruby_tracer/helper.rb
|
33
|
+
- lib/ruby_tracer/irb.rb
|
33
34
|
- lib/ruby_tracer/line_tracer.rb
|
34
35
|
- lib/ruby_tracer/object_tracer.rb
|
35
36
|
- lib/ruby_tracer/version.rb
|