rails_tracepoint_stack 0.3.4 → 0.3.5
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/lib/rails_tracepoint_stack/filter/custom_trace_selector_filter.rb +1 -1
- data/lib/rails_tracepoint_stack/filter/rb_config.rb +1 -1
- data/lib/rails_tracepoint_stack/log_formatter.rb +175 -7
- data/lib/rails_tracepoint_stack/logger.rb +1 -1
- data/lib/rails_tracepoint_stack/trace.rb +1 -1
- data/lib/rails_tracepoint_stack/trace_filter.rb +1 -1
- data/lib/rails_tracepoint_stack/tracer.rb +17 -8
- data/lib/rails_tracepoint_stack/version.rb +1 -1
- data/lib/rails_tracepoint_stack.rb +3 -3
- metadata +26 -6
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: f67c982828a7ad060513cbb50daf9f88399229a534a43cf12a674571b6ae11ae
|
|
4
|
+
data.tar.gz: fd80c178bf9de58408e769742d7640b0ccdbcc99a4722ec9ccbd6e68d115ff51
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 57b7125a7a242bf59f15096fffeef7de3c8a7543162fa7851566a07256d2ed790d39ff9c9dfcd1f3c3f8ca54714b797ed5f5015f2eb0d6f0adbe57e3ad582412
|
|
7
|
+
data.tar.gz: cd33cf3e53fe35fe62ba3867cfe8ff56047cceae59e2139c55898fcb0ed0e44d8dccf57a0b66954f1543797c1cb1070b6c68f479f76ce80f0c15282518c50110
|
|
@@ -4,7 +4,7 @@ module RailsTracepointStack
|
|
|
4
4
|
def is_a_trace_required_to_watch_by_the_custom_configs?(trace:)
|
|
5
5
|
return false unless RailsTracepointStack.configuration.file_path_to_filter_patterns.any?
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
filter_match_a_custom_pattern_to_be_not_ignored?(trace)
|
|
8
8
|
end
|
|
9
9
|
|
|
10
10
|
private
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
require "json"
|
|
2
|
+
|
|
1
3
|
module RailsTracepointStack
|
|
2
4
|
module LogFormatter
|
|
3
5
|
def self.message(trace)
|
|
@@ -10,17 +12,183 @@ module RailsTracepointStack
|
|
|
10
12
|
end
|
|
11
13
|
|
|
12
14
|
def self.text(trace)
|
|
13
|
-
"called: #{trace.class_name}##{trace.method_name} in #{trace.file_path}:#{trace.line_number} with params: #{trace.params}"
|
|
15
|
+
"called: #{trace.class_name}##{trace.method_name} in #{trace.file_path}:#{trace.line_number} with params: #{text_value(trace.params)}"
|
|
14
16
|
end
|
|
15
17
|
|
|
16
18
|
def self.json(trace)
|
|
17
|
-
|
|
18
|
-
class: trace.class_name,
|
|
19
|
-
method_name: trace.method_name,
|
|
20
|
-
path: trace.file_path,
|
|
19
|
+
JSON.generate(
|
|
20
|
+
class: stringify(trace.class_name),
|
|
21
|
+
method_name: stringify(trace.method_name),
|
|
22
|
+
path: stringify(trace.file_path),
|
|
21
23
|
line: trace.line_number,
|
|
22
|
-
params: trace.params
|
|
23
|
-
|
|
24
|
+
params: safe_value(trace.params)
|
|
25
|
+
)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def self.stringify(value)
|
|
29
|
+
return nil if value.nil?
|
|
30
|
+
|
|
31
|
+
value.to_s
|
|
32
|
+
rescue SystemStackError, StandardError => error
|
|
33
|
+
inspect_fallback(value, error)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def self.safe_value(value, ancestry = {})
|
|
37
|
+
case value
|
|
38
|
+
when nil, true, false, Numeric, String
|
|
39
|
+
value
|
|
40
|
+
when Symbol
|
|
41
|
+
value.to_s
|
|
42
|
+
when Array
|
|
43
|
+
safe_array(value, ancestry)
|
|
44
|
+
when Hash
|
|
45
|
+
safe_hash(value, ancestry)
|
|
46
|
+
else
|
|
47
|
+
safe_json_object(value)
|
|
48
|
+
end
|
|
49
|
+
rescue SystemStackError, StandardError => error
|
|
50
|
+
inspect_fallback(value, error)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def self.safe_array(value, ancestry)
|
|
54
|
+
object_id = value.__id__
|
|
55
|
+
return recursive_placeholder(value) if ancestry.key?(object_id)
|
|
56
|
+
|
|
57
|
+
ancestry[object_id] = true
|
|
58
|
+
value.map { |item| safe_value(item, ancestry) }
|
|
59
|
+
ensure
|
|
60
|
+
ancestry.delete(object_id)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def self.safe_hash(value, ancestry)
|
|
64
|
+
object_id = value.__id__
|
|
65
|
+
return recursive_placeholder(value) if ancestry.key?(object_id)
|
|
66
|
+
|
|
67
|
+
ancestry[object_id] = true
|
|
68
|
+
value.each_with_object({}) do |(key, item), result|
|
|
69
|
+
result[safe_hash_key(key, ancestry)] = safe_value(item, ancestry)
|
|
70
|
+
end
|
|
71
|
+
ensure
|
|
72
|
+
ancestry.delete(object_id)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def self.safe_hash_key(key, ancestry = {})
|
|
76
|
+
case key
|
|
77
|
+
when String
|
|
78
|
+
key
|
|
79
|
+
when Symbol, Numeric
|
|
80
|
+
key.to_s
|
|
81
|
+
when true, false, nil
|
|
82
|
+
key.inspect
|
|
83
|
+
else
|
|
84
|
+
stringify_hash_key(key, ancestry)
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def self.safe_json_object(value)
|
|
89
|
+
json_value = JSON.parse(JSON.generate(value))
|
|
90
|
+
|
|
91
|
+
return json_value unless default_string_representation?(value, json_value)
|
|
92
|
+
|
|
93
|
+
safe_object_string(value)
|
|
94
|
+
rescue SystemStackError, StandardError
|
|
95
|
+
safe_object_string(value)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def self.default_string_representation?(value, json_value)
|
|
99
|
+
json_value.is_a?(String) &&
|
|
100
|
+
value.method(:to_s).owner == Kernel &&
|
|
101
|
+
json_value == value.to_s
|
|
102
|
+
rescue SystemStackError, StandardError
|
|
103
|
+
false
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def self.stringify_hash_key(key, ancestry)
|
|
107
|
+
normalized_key = safe_value(key, ancestry)
|
|
108
|
+
|
|
109
|
+
case normalized_key
|
|
110
|
+
when String
|
|
111
|
+
normalized_key
|
|
112
|
+
when nil
|
|
113
|
+
"null"
|
|
114
|
+
when true, false, Numeric
|
|
115
|
+
normalized_key.to_s
|
|
116
|
+
else
|
|
117
|
+
JSON.generate(normalized_key)
|
|
118
|
+
end
|
|
119
|
+
rescue SystemStackError, StandardError
|
|
120
|
+
safe_object_string(key)
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def self.safe_object_string(value)
|
|
124
|
+
value.inspect
|
|
125
|
+
rescue SystemStackError, StandardError => error
|
|
126
|
+
inspect_fallback(value, error)
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def self.inspect_fallback(value, error)
|
|
130
|
+
class_name = value.nil? ? "NilClass" : value.class.to_s
|
|
131
|
+
"#<#{class_name} unserializable: #{error.class}: #{error.message}>"
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def self.recursive_placeholder(value)
|
|
135
|
+
"[recursive #{value.class}]"
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def self.text_value(value, ancestry = {})
|
|
139
|
+
case value
|
|
140
|
+
when nil
|
|
141
|
+
"nil"
|
|
142
|
+
when true, false, Numeric
|
|
143
|
+
value.to_s
|
|
144
|
+
when String
|
|
145
|
+
value.inspect
|
|
146
|
+
when Symbol
|
|
147
|
+
":#{value}"
|
|
148
|
+
when Array
|
|
149
|
+
text_array(value, ancestry)
|
|
150
|
+
when Hash
|
|
151
|
+
text_hash(value, ancestry)
|
|
152
|
+
else
|
|
153
|
+
safe_object_string(value)
|
|
154
|
+
end
|
|
155
|
+
rescue SystemStackError, StandardError => error
|
|
156
|
+
inspect_fallback(value, error)
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
def self.text_array(value, ancestry)
|
|
160
|
+
object_id = value.__id__
|
|
161
|
+
return recursive_placeholder(value) if ancestry.key?(object_id)
|
|
162
|
+
|
|
163
|
+
ancestry[object_id] = true
|
|
164
|
+
"[#{value.map { |item| text_value(item, ancestry) }.join(", ")}]"
|
|
165
|
+
ensure
|
|
166
|
+
ancestry.delete(object_id)
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
def self.text_hash(value, ancestry)
|
|
170
|
+
object_id = value.__id__
|
|
171
|
+
return recursive_placeholder(value) if ancestry.key?(object_id)
|
|
172
|
+
|
|
173
|
+
ancestry[object_id] = true
|
|
174
|
+
pairs = value.map do |key, item|
|
|
175
|
+
"#{text_hash_key(key, ancestry)}=>#{text_value(item, ancestry)}"
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
"{#{pairs.join(", ")}}"
|
|
179
|
+
ensure
|
|
180
|
+
ancestry.delete(object_id)
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
def self.text_hash_key(key, ancestry = {})
|
|
184
|
+
case key
|
|
185
|
+
when Symbol
|
|
186
|
+
":#{key}"
|
|
187
|
+
when String
|
|
188
|
+
key.inspect
|
|
189
|
+
else
|
|
190
|
+
text_value(key, ancestry)
|
|
191
|
+
end
|
|
24
192
|
end
|
|
25
193
|
end
|
|
26
194
|
end
|
|
@@ -5,7 +5,7 @@ module RailsTracepointStack
|
|
|
5
5
|
RailsTracepointStack.configuration.logger.info(msg)
|
|
6
6
|
else
|
|
7
7
|
# TODO: Add the support to Rails.env for the default filename
|
|
8
|
-
File.open("log/rails_tracepoint_stack.log",
|
|
8
|
+
File.open("log/rails_tracepoint_stack.log", "a") do |f|
|
|
9
9
|
f.puts msg
|
|
10
10
|
end
|
|
11
11
|
end
|
|
@@ -1,14 +1,23 @@
|
|
|
1
|
-
#TODO: Move to a loader file
|
|
2
|
-
require
|
|
3
|
-
require
|
|
4
|
-
require
|
|
5
|
-
require
|
|
1
|
+
# TODO: Move to a loader file
|
|
2
|
+
require "rails_tracepoint_stack/logger"
|
|
3
|
+
require "rails_tracepoint_stack/trace_filter"
|
|
4
|
+
require "rails_tracepoint_stack/trace"
|
|
5
|
+
require "rails_tracepoint_stack/log_formatter"
|
|
6
6
|
|
|
7
7
|
module RailsTracepointStack
|
|
8
8
|
class Tracer
|
|
9
9
|
include RailsTracepointStack::TraceFilter
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
extend Forwardable
|
|
11
|
+
|
|
12
|
+
def_delegators :@tracer, :enable, :disable
|
|
13
|
+
|
|
14
|
+
def initialize
|
|
15
|
+
generate_tracer
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
private
|
|
19
|
+
|
|
20
|
+
def generate_tracer
|
|
12
21
|
@tracer ||= TracePoint.new(:call) do |tracepoint|
|
|
13
22
|
trace = RailsTracepointStack::Trace.new(trace_point: tracepoint)
|
|
14
23
|
|
|
@@ -16,7 +25,7 @@ module RailsTracepointStack
|
|
|
16
25
|
|
|
17
26
|
# TODO: Use proper OO
|
|
18
27
|
message = RailsTracepointStack::LogFormatter.message trace
|
|
19
|
-
RailsTracepointStack::Logger.log message
|
|
28
|
+
RailsTracepointStack::Logger.log message
|
|
20
29
|
end
|
|
21
30
|
end
|
|
22
31
|
end
|
|
@@ -20,7 +20,7 @@ module RailsTracepointStack
|
|
|
20
20
|
def self.enable_trace
|
|
21
21
|
raise ArgumentError, "Block not given to #enable_trace" unless block_given?
|
|
22
22
|
|
|
23
|
-
tracer = RailsTracepointStack::Tracer.new
|
|
23
|
+
tracer = RailsTracepointStack::Tracer.new
|
|
24
24
|
tracer.enable
|
|
25
25
|
yield
|
|
26
26
|
ensure
|
|
@@ -28,8 +28,8 @@ module RailsTracepointStack
|
|
|
28
28
|
end
|
|
29
29
|
end
|
|
30
30
|
|
|
31
|
-
if ENV.fetch(
|
|
32
|
-
$rails_tracer_rtps = RailsTracepointStack::Tracer.new
|
|
31
|
+
if ENV.fetch("RAILS_TRACEPOINT_STACK_ENABLED", "false") == "true"
|
|
32
|
+
$rails_tracer_rtps = RailsTracepointStack::Tracer.new
|
|
33
33
|
$rails_tracer_rtps.enable
|
|
34
34
|
|
|
35
35
|
at_exit do
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rails_tracepoint_stack
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.3.
|
|
4
|
+
version: 0.3.5
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Carlos Daniel Pohlod
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2026-05-17 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rspec
|
|
@@ -50,6 +50,26 @@ dependencies:
|
|
|
50
50
|
- - ">="
|
|
51
51
|
- !ruby/object:Gem::Version
|
|
52
52
|
version: 13.0.0
|
|
53
|
+
- !ruby/object:Gem::Dependency
|
|
54
|
+
name: standard
|
|
55
|
+
requirement: !ruby/object:Gem::Requirement
|
|
56
|
+
requirements:
|
|
57
|
+
- - "~>"
|
|
58
|
+
- !ruby/object:Gem::Version
|
|
59
|
+
version: '1.39'
|
|
60
|
+
- - ">="
|
|
61
|
+
- !ruby/object:Gem::Version
|
|
62
|
+
version: 1.39.1
|
|
63
|
+
type: :development
|
|
64
|
+
prerelease: false
|
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
66
|
+
requirements:
|
|
67
|
+
- - "~>"
|
|
68
|
+
- !ruby/object:Gem::Version
|
|
69
|
+
version: '1.39'
|
|
70
|
+
- - ">="
|
|
71
|
+
- !ruby/object:Gem::Version
|
|
72
|
+
version: 1.39.1
|
|
53
73
|
description: A formatted output of all methods called in your rails application of
|
|
54
74
|
code created by the developer, with the complete path to the class/module, including
|
|
55
75
|
passed params.
|
|
@@ -78,7 +98,7 @@ licenses:
|
|
|
78
98
|
metadata:
|
|
79
99
|
documentation_uri: https://github.com/carlosdanielpohlod/rails_tracepoint_stack/
|
|
80
100
|
changelog_uri: https://github.com/carlosdanielpohlod/rails_tracepoint_stack/blob/main/changelog.md
|
|
81
|
-
post_install_message:
|
|
101
|
+
post_install_message:
|
|
82
102
|
rdoc_options: []
|
|
83
103
|
require_paths:
|
|
84
104
|
- lib
|
|
@@ -93,8 +113,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
93
113
|
- !ruby/object:Gem::Version
|
|
94
114
|
version: '0'
|
|
95
115
|
requirements: []
|
|
96
|
-
rubygems_version: 3.4.
|
|
97
|
-
signing_key:
|
|
116
|
+
rubygems_version: 3.4.19
|
|
117
|
+
signing_key:
|
|
98
118
|
specification_version: 4
|
|
99
119
|
summary: Get a complete stack trace for your code on a Rails application.
|
|
100
120
|
test_files: []
|