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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a3045ee154f570e6a780af9aff0edfcd18822b3394a0f268ee9a4e07e6d5769f
4
- data.tar.gz: 9865f094f0a70ffcb474148aaab7ee6712ac63450326bf7e3385dfc55e1c123f
3
+ metadata.gz: f67c982828a7ad060513cbb50daf9f88399229a534a43cf12a674571b6ae11ae
4
+ data.tar.gz: fd80c178bf9de58408e769742d7640b0ccdbcc99a4722ec9ccbd6e68d115ff51
5
5
  SHA512:
6
- metadata.gz: 6c5482941d4e5119b88133eca986cdb87c490d0ed6e69ed0df5a09ebe1d2efebff0c4abbf9b554abf44cbab80038b96b3bf53cb8c86b1052b967d7ad307573d8
7
- data.tar.gz: 699757a6965a6101ee9b80e5039580840a5e34de1271538a286d95c6ea5d2f0e678e666c8f098b2a93df5896868fc821182258f4d07616684bace6857087e7b8
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
- !filter_match_a_custom_pattern_to_be_not_ignored?(trace)
7
+ filter_match_a_custom_pattern_to_be_not_ignored?(trace)
8
8
  end
9
9
 
10
10
  private
@@ -2,7 +2,7 @@ module RailsTracepointStack
2
2
  module Filter
3
3
  class RbConfig
4
4
  def self.ruby_lib_path
5
- @ruby_lib_path ||= ::RbConfig::CONFIG['rubylibdir']
5
+ @ruby_lib_path ||= ::RbConfig::CONFIG["rubylibdir"]
6
6
  end
7
7
  end
8
8
  end
@@ -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
- }.to_json
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", 'a') do |f|
8
+ File.open("log/rails_tracepoint_stack.log", "a") do |f|
9
9
  f.puts msg
10
10
  end
11
11
  end
@@ -1,4 +1,4 @@
1
- require 'forwardable'
1
+ require "forwardable"
2
2
 
3
3
  module RailsTracepointStack
4
4
  class Trace
@@ -22,7 +22,7 @@ module RailsTracepointStack
22
22
  end
23
23
  if should_ignore_because_is_ruby_trace?(trace: trace)
24
24
  return true
25
- end
25
+ end
26
26
 
27
27
  return false
28
28
  end
@@ -1,14 +1,23 @@
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'
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
- # TODO: Tracer.new shoud return the tracer. Is weird to call Tracer.new.tracer
11
- def tracer
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
@@ -1,3 +1,3 @@
1
1
  module RailsTracepointStack
2
- VERSION = "0.3.4"
2
+ VERSION = "0.3.5"
3
3
  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.tracer
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('RAILS_TRACEPOINT_STACK_ENABLED', 'false') == 'true'
32
- $rails_tracer_rtps = RailsTracepointStack::Tracer.new.tracer
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
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: 2024-08-03 00:00:00.000000000 Z
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.10
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: []