rails_tracepoint_stack 0.1.4 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rails_tracepoint_stack/configuration.rb +12 -0
- data/lib/rails_tracepoint_stack/filter/gem_path.rb +9 -0
- data/lib/rails_tracepoint_stack/filter/rb_config.rb +9 -0
- data/lib/rails_tracepoint_stack/log_formatter.rb +26 -0
- data/lib/rails_tracepoint_stack/logger.rb +14 -0
- data/lib/rails_tracepoint_stack/trace.rb +30 -0
- data/lib/rails_tracepoint_stack/trace_filter.rb +60 -0
- data/lib/rails_tracepoint_stack/tracer.rb +22 -0
- data/lib/rails_tracepoint_stack/version.rb +3 -0
- data/lib/rails_tracepoint_stack.rb +20 -30
- metadata +53 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a6e61976b25735790c540866ecebe19e2107f14ca9f2434fc0c176de91953303
|
4
|
+
data.tar.gz: 5df99b05328e5158e8763469e2f5f24ffd34fb914c251d88ef0bcb7f3ee96e49
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 867a2672fd90e65f0244632cc2ba9f189c865d7d8ae81ea0004e2a8461770c61dabb0b9fc45a32c9e244218292cf6b8ca34beae31a965a7508fd1d90e4327283
|
7
|
+
data.tar.gz: 043e6d052f87535dccd6acaeaa224fe94337e2305ffbcdca392c946fbf3cfab4645648cc4b9d80252835018954376af16d8df76fd017e7693ec22d9d36e6f53b
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module RailsTracepointStack
|
2
|
+
class Configuration
|
3
|
+
attr_accessor :ignore_patterns, :logger, :log_format, :file_path_to_filter_patterns
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@ignore_patterns = []
|
7
|
+
@file_path_to_filter_patterns = []
|
8
|
+
@logger = nil
|
9
|
+
@log_format = :text
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module RailsTracepointStack
|
2
|
+
module LogFormatter
|
3
|
+
def self.message(trace)
|
4
|
+
case RailsTracepointStack.configuration&.log_format
|
5
|
+
when :json
|
6
|
+
json trace
|
7
|
+
else
|
8
|
+
text trace
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.text(trace)
|
13
|
+
"called: #{trace.class_name}##{trace.method_name} in #{trace.file_path}:#{trace.line_number} with params: #{trace.params}"
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.json(trace)
|
17
|
+
{
|
18
|
+
class: trace.class_name,
|
19
|
+
method_name: trace.method_name,
|
20
|
+
path: trace.file_path,
|
21
|
+
line: trace.line_number,
|
22
|
+
params: trace.params
|
23
|
+
}.to_json
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module RailsTracepointStack
|
2
|
+
class Logger
|
3
|
+
def self.log(msg)
|
4
|
+
if RailsTracepointStack.configuration&.logger
|
5
|
+
RailsTracepointStack.configuration.logger.info(msg)
|
6
|
+
else
|
7
|
+
# TODO: Add the support to Rails.env for the default filename
|
8
|
+
File.open("log/rails_tracepoint_stack.log", 'a') do |f|
|
9
|
+
f.puts msg
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
3
|
+
module RailsTracepointStack
|
4
|
+
class Trace
|
5
|
+
extend Forwardable
|
6
|
+
|
7
|
+
attr_reader :params, :trace_point
|
8
|
+
|
9
|
+
def_delegator :@trace_point, :defined_class, :class_name
|
10
|
+
def_delegator :@trace_point, :method_id, :method_name
|
11
|
+
def_delegator :@trace_point, :path, :file_path
|
12
|
+
def_delegator :@trace_point, :lineno, :line_number
|
13
|
+
|
14
|
+
def initialize(trace_point:)
|
15
|
+
@trace_point = trace_point
|
16
|
+
end
|
17
|
+
|
18
|
+
def params
|
19
|
+
@params ||= fetch_params(trace_point)
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def fetch_params(trace_point)
|
25
|
+
trace_point.binding.local_variables.map { |var|
|
26
|
+
[var, trace_point.binding.local_variable_get(var)]
|
27
|
+
}.to_h
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'rails_tracepoint_stack/filter/gem_path'
|
2
|
+
require 'rails_tracepoint_stack/filter/rb_config'
|
3
|
+
|
4
|
+
module RailsTracepointStack
|
5
|
+
class TraceFilter
|
6
|
+
def self.ignore_trace?(trace:)
|
7
|
+
if defined_file_path_to_filter_patterns?
|
8
|
+
not_matches_file_path_to_filter_patterns?(trace)
|
9
|
+
else
|
10
|
+
contains_to_ignore_strings?(trace) || from_gempath_or_lib_path?(trace) || is_a_to_ignore_pattern?(trace)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def self.contains_to_ignore_strings?(trace)
|
17
|
+
trace.file_path.start_with?('<internal:') || trace.file_path == '(eval)'
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.from_gempath_or_lib_path?(trace)
|
21
|
+
file_path_starts_with_gem_path?(trace) ||
|
22
|
+
file_path_starts_with_ruby_lib_path?(trace) ||
|
23
|
+
file_path_starts_with_bundler_path?(trace)
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.is_a_to_ignore_pattern?(trace)
|
27
|
+
RailsTracepointStack.configuration&.ignore_patterns&.any? { |pattern| trace.file_path.match?(pattern) }
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.file_path_starts_with_gem_path?(trace)
|
31
|
+
gem_paths.any? { |path| trace.file_path.start_with?(path) }
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.file_path_starts_with_ruby_lib_path?(trace)
|
35
|
+
trace.file_path.start_with?(ruby_lib_path)
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.file_path_starts_with_bundler_path?(trace)
|
39
|
+
trace.file_path.include?("gems/bundler")
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.gem_paths
|
43
|
+
@gem_paths ||= RailsTracepointStack::Filter::GemPath.full_gem_path
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.ruby_lib_path
|
47
|
+
@ruby_lib_path ||= RailsTracepointStack::Filter::RbConfig.ruby_lib_path
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.defined_file_path_to_filter_patterns?
|
51
|
+
RailsTracepointStack.configuration&.file_path_to_filter_patterns&.any?
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.not_matches_file_path_to_filter_patterns?(trace)
|
55
|
+
!RailsTracepointStack.configuration.file_path_to_filter_patterns.any? do |pattern|
|
56
|
+
trace.file_path.match?(pattern)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,22 @@
|
|
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
|
+
|
7
|
+
module RailsTracepointStack
|
8
|
+
class Tracer
|
9
|
+
# TODO: Tracer.new shoud return the tracer. Is weird to call Tracer.new.tracer
|
10
|
+
def tracer
|
11
|
+
@tracer ||= TracePoint.new(:call) do |tracepoint|
|
12
|
+
trace = RailsTracepointStack::Trace.new(trace_point: tracepoint)
|
13
|
+
|
14
|
+
next if RailsTracepointStack::TraceFilter.ignore_trace?(trace: trace)
|
15
|
+
|
16
|
+
# TODO: Use proper OO
|
17
|
+
message = RailsTracepointStack::LogFormatter.message trace
|
18
|
+
RailsTracepointStack::Logger.log message
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -1,43 +1,33 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
@gem_paths = Bundler.load.specs.map(&:full_gem_path)
|
6
|
-
@ruby_lib_path = RbConfig::CONFIG['rubylibdir']
|
7
|
-
end
|
1
|
+
require 'json'
|
2
|
+
require 'rails_tracepoint_stack/configuration'
|
3
|
+
require 'rails_tracepoint_stack/log_formatter'
|
4
|
+
require 'rails_tracepoint_stack/tracer'
|
8
5
|
|
9
|
-
|
10
|
-
@trace ||= TracePoint.new(:call) do |tp|
|
11
|
-
next if start_with_to_ignore_prefixes?(tp) || from_gempath_or_lib_path?(tp)
|
6
|
+
$rails_tracer_rtps = nil
|
12
7
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
end
|
8
|
+
module RailsTracepointStack
|
9
|
+
class << self
|
10
|
+
attr_accessor :configuration, :logger
|
17
11
|
end
|
18
12
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
def fetch_params(tp)
|
23
|
-
tp.binding.local_variables.map { |var|
|
24
|
-
[var, tp.binding.local_variable_get(var)]
|
25
|
-
}.to_h
|
13
|
+
def self.configure
|
14
|
+
self.configuration ||= RailsTracepointStack::Configuration.new
|
15
|
+
yield(configuration)
|
26
16
|
end
|
27
17
|
|
28
|
-
def
|
29
|
-
|
30
|
-
end
|
18
|
+
def self.enable_trace
|
19
|
+
raise ArgumentError, "Block not given to #enable_trace" unless block_given?
|
31
20
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
21
|
+
tracer = RailsTracepointStack::Tracer.new.tracer
|
22
|
+
tracer.enable
|
23
|
+
yield
|
24
|
+
ensure
|
25
|
+
tracer.disable
|
36
26
|
end
|
37
27
|
end
|
38
28
|
|
39
|
-
if ENV.fetch('
|
40
|
-
$rails_tracer_rtps = RailsTracepointStack.new.tracer
|
29
|
+
if ENV.fetch('RAILS_TRACEPOINT_STACK_ENABLED', 'false') == 'true'
|
30
|
+
$rails_tracer_rtps = RailsTracepointStack::Tracer.new.tracer
|
41
31
|
$rails_tracer_rtps.enable
|
42
32
|
|
43
33
|
at_exit do
|
metadata
CHANGED
@@ -1,15 +1,55 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_tracepoint_stack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Carlos Daniel Pohlod
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-07-
|
12
|
-
dependencies:
|
11
|
+
date: 2024-07-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rspec
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.0'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 3.0.0
|
23
|
+
type: :development
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '3.0'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 3.0.0
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: rake
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '13.0'
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 13.0.0
|
43
|
+
type: :development
|
44
|
+
prerelease: false
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '13.0'
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 13.0.0
|
13
53
|
description: A formatted output of all methods called in your rails application of
|
14
54
|
code created by the developer, with the complete path to the class/module, including
|
15
55
|
passed params.
|
@@ -19,11 +59,21 @@ extensions: []
|
|
19
59
|
extra_rdoc_files: []
|
20
60
|
files:
|
21
61
|
- lib/rails_tracepoint_stack.rb
|
62
|
+
- lib/rails_tracepoint_stack/configuration.rb
|
63
|
+
- lib/rails_tracepoint_stack/filter/gem_path.rb
|
64
|
+
- lib/rails_tracepoint_stack/filter/rb_config.rb
|
65
|
+
- lib/rails_tracepoint_stack/log_formatter.rb
|
66
|
+
- lib/rails_tracepoint_stack/logger.rb
|
67
|
+
- lib/rails_tracepoint_stack/trace.rb
|
68
|
+
- lib/rails_tracepoint_stack/trace_filter.rb
|
69
|
+
- lib/rails_tracepoint_stack/tracer.rb
|
70
|
+
- lib/rails_tracepoint_stack/version.rb
|
22
71
|
homepage: https://github.com/carlosdanielpohlod/rails_tracepoint_stack/
|
23
72
|
licenses:
|
24
73
|
- MIT
|
25
74
|
metadata:
|
26
75
|
documentation_uri: https://github.com/carlosdanielpohlod/rails_tracepoint_stack/
|
76
|
+
changelog_uri: https://github.com/carlosdanielpohlod/rails_tracepoint_stack/blob/main/changelog.md
|
27
77
|
post_install_message:
|
28
78
|
rdoc_options: []
|
29
79
|
require_paths:
|