rshade 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +52 -13
- data/lib/rshade/config/event_store.rb +76 -0
- data/lib/rshade/config/registry.rb +30 -3
- data/lib/rshade/config/stack_store.rb +15 -14
- data/lib/rshade/core_extensions/object/reveal.rb +2 -2
- data/lib/rshade/event_observer.rb +2 -2
- data/lib/rshade/event_processor.rb +1 -1
- data/lib/rshade/filter/filter_composition.rb +1 -1
- data/lib/rshade/filter/variable_filter.rb +2 -2
- data/lib/rshade/formatter/stack/json.rb +8 -6
- data/lib/rshade/formatter/stack/stdout.rb +1 -1
- data/lib/rshade/formatter/stack/string.rb +3 -3
- data/lib/rshade/formatter/trace/html.rb +2 -2
- data/lib/rshade/formatter/trace/json.rb +21 -31
- data/lib/rshade/serializer/traversal.rb +4 -0
- data/lib/rshade/stack.rb +1 -1
- data/lib/rshade/trace.rb +5 -13
- data/lib/rshade/trace_observable.rb +1 -1
- data/lib/rshade/utils.rb +19 -0
- data/lib/rshade/version.rb +1 -1
- data/lib/rshade.rb +2 -3
- metadata +4 -5
- data/lib/rshade/config/store.rb +0 -51
- data/lib/rshade/config.rb +0 -77
- data/lib/rshade/formatter/trace/file.rb +0 -31
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e267f5e11b2c8624bc38c88c031a12e9b252b5581b803fe4076f40d532d75c81
|
4
|
+
data.tar.gz: 153c3b896ce3701be9bc26a9501f987220e23c8ebb4e253d42a0968cf2e43709
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a0c00f405183f7f3a5a33d7e9fd9b5bf4cc4692aabc6cf7400bc32b4fb3e704c0e94b583da98447a868f5c7079b290df835e8f0ed75d8ec66544404748df5466
|
7
|
+
data.tar.gz: 273df7e4c8b3107bb8fb5a09c1ef36c8489caf2f5e87550aaa9631b79bd0cdc3a7f4a5641db2f38107e6c28203e0f21a7a51f4e2e47d5da47ab7d3f5d1d89e66
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -16,6 +16,14 @@ gem install rshade
|
|
16
16
|
Simple wrap code that you want to check in to block and it will pretty print all of the calls which was made in this block with pointing line of executions, variables what was pass
|
17
17
|
inside methods and variables what was return
|
18
18
|
```ruby
|
19
|
+
# config
|
20
|
+
::RShade::Config::Registry.instance.trace_config do |config|
|
21
|
+
config.exclude_gems!
|
22
|
+
filepath = File.join(Rails.root, 'log', 'rshade-trace.json.log')
|
23
|
+
config.formatter!(:json, { filepath: filepath, pretty: false })
|
24
|
+
end
|
25
|
+
|
26
|
+
# execute
|
19
27
|
RShade::Trace.reveal do
|
20
28
|
#your code here
|
21
29
|
end.show
|
@@ -34,25 +42,41 @@ change this behaviour or add your own filter. Even when some piece of code are n
|
|
34
42
|
|
35
43
|
### Configuration
|
36
44
|
```ruby
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
45
|
+
::RShade::Config::Registry.instance.trace_config do |config|
|
46
|
+
# exclude gems
|
47
|
+
config.exclude_gems!
|
48
|
+
# path where save output
|
49
|
+
filepath = File.join(Rails.root, 'log', 'rshade-trace.json.log')
|
50
|
+
# output can be json or stdout
|
51
|
+
config.formatter!(:json, { filepath: filepath, pretty: false })
|
52
|
+
end
|
41
53
|
```
|
42
54
|
### Filters
|
43
55
|
Filters by default represent by expression `(include_path or variable_match) or (not exclude_path)`
|
44
56
|
Filters can be chained like:
|
45
57
|
```ruby
|
46
|
-
|
47
|
-
|
48
|
-
|
58
|
+
::RShade::Config::Registry.instance.trace_config do |config|
|
59
|
+
config.filter!(RShade::Filter::VariableFilter) do |name, value|
|
60
|
+
name == :current_user
|
61
|
+
end
|
62
|
+
config.filter!(::RShade::Filter::ExcludePathFilter) do |paths|
|
63
|
+
paths.concat(/gems/)
|
64
|
+
end
|
65
|
+
config.filter!(::RShade::Filter::IncludePathFilter) do |paths|
|
66
|
+
paths.concat(/devise/)
|
67
|
+
end
|
68
|
+
end
|
49
69
|
```
|
50
70
|
#### Filter by path include
|
51
71
|
`paths` - is array which accept regex or string
|
52
72
|
```ruby
|
53
|
-
|
73
|
+
::RShade::Config::Registry.instance.trace_config do |config|
|
74
|
+
config.filter!(::RShade::Filter::IncludePathFilter) do |paths|
|
75
|
+
paths.concat(/devise/)
|
76
|
+
end
|
77
|
+
end
|
54
78
|
|
55
|
-
RShade::Trace.reveal
|
79
|
+
RShade::Trace.reveal do
|
56
80
|
#your code
|
57
81
|
end.show
|
58
82
|
|
@@ -60,9 +84,13 @@ end.show
|
|
60
84
|
#### Filter by path exclude
|
61
85
|
`paths` - is array which accept regex or string
|
62
86
|
```ruby
|
63
|
-
|
87
|
+
::RShade::Config::Registry.instance.trace_config do |config|
|
88
|
+
config.filter!(::RShade::Filter::ExcludePathFilter) do |paths|
|
89
|
+
paths.concat(/gems/)
|
90
|
+
end
|
91
|
+
end
|
64
92
|
|
65
|
-
RShade::Trace.reveal
|
93
|
+
RShade::Trace.reveal do
|
66
94
|
#your code
|
67
95
|
end.show
|
68
96
|
```
|
@@ -71,9 +99,14 @@ end.show
|
|
71
99
|
`name` - represent variable name as symbol
|
72
100
|
`value` - actual variable value
|
73
101
|
```ruby
|
74
|
-
config = ::RShade::Config.default.match_variable { |name, value| name == :current_user }
|
75
102
|
|
76
|
-
RShade::
|
103
|
+
::RShade::Config::Registry.instance.trace_config do |config|
|
104
|
+
config.filter!(RShade::Filter::VariableFilter) do |name, value|
|
105
|
+
name == :current_user
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
RShade::Trace.reveal do
|
77
110
|
#your code
|
78
111
|
end.show
|
79
112
|
```
|
@@ -108,6 +141,12 @@ Config
|
|
108
141
|
config.exclude_gems!
|
109
142
|
filepath = File.join(Rails.root, 'log', 'rshade-stack.json.log')
|
110
143
|
config.formatter!(:json, { filepath: filepath, pretty: false })
|
144
|
+
|
145
|
+
config.serializer!({
|
146
|
+
ActionDispatch::Request => ->(value) do
|
147
|
+
"#{value.to_s} -> #{value.method} -> #{value.path}"
|
148
|
+
end
|
149
|
+
})
|
111
150
|
end
|
112
151
|
```
|
113
152
|
|
@@ -0,0 +1,76 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RShade
|
4
|
+
class Config
|
5
|
+
class EventStore
|
6
|
+
attr_reader :filter, :formatter, :tp_events, :variable_serializer
|
7
|
+
|
8
|
+
DEFAULT_FORMATTER = {
|
9
|
+
json: ::RShade::Formatter::Trace::Json,
|
10
|
+
stdout: ::RShade::Formatter::Trace::Stdout
|
11
|
+
}.freeze
|
12
|
+
|
13
|
+
def self.default
|
14
|
+
new.exclude_gems!
|
15
|
+
end
|
16
|
+
|
17
|
+
# @param [Array<Symbol>] tp_events
|
18
|
+
# @param [RShade::Formatter::Trace::Stdout] formatter
|
19
|
+
# @param [RShade::Filter::FilterComposition] filter
|
20
|
+
# @param [Hash] serializers
|
21
|
+
def initialize(tp_events: %i[call return], formatter: RShade::Formatter::Trace::Stdout.new,
|
22
|
+
filter: default_filter_composition,
|
23
|
+
serializers: {})
|
24
|
+
@filter = filter
|
25
|
+
@formatter = formatter
|
26
|
+
@tp_events = tp_events
|
27
|
+
@variable_serializer = serializers
|
28
|
+
end
|
29
|
+
|
30
|
+
def tp_events!(tp_events)
|
31
|
+
@tp_events = tp_events
|
32
|
+
self
|
33
|
+
end
|
34
|
+
|
35
|
+
def serializer!(hash)
|
36
|
+
variable_serializer.merge!(hash)
|
37
|
+
self
|
38
|
+
end
|
39
|
+
|
40
|
+
def filter!(filter_type, &block)
|
41
|
+
filter.filter(filter_type, &block)
|
42
|
+
self
|
43
|
+
end
|
44
|
+
|
45
|
+
def formatter!(formatter, opts = {})
|
46
|
+
@formatter = formatter.is_a?(Symbol) ? set_symbol_formatter(formatter, opts) : formatter
|
47
|
+
self
|
48
|
+
end
|
49
|
+
|
50
|
+
def exclude_gems!
|
51
|
+
filter!(::RShade::Filter::ExcludePathFilter) do |paths|
|
52
|
+
paths.concat(RShade::Utils.default_excluded_path)
|
53
|
+
end
|
54
|
+
self
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def set_symbol_formatter(type, opts)
|
60
|
+
formatter_class = DEFAULT_FORMATTER[type]
|
61
|
+
return formatter_class unless formatter_class
|
62
|
+
|
63
|
+
@formatter = formatter_class.new(**opts)
|
64
|
+
end
|
65
|
+
|
66
|
+
def default_filter_composition
|
67
|
+
variable_filter = RShade::Filter::VariableFilter.new
|
68
|
+
include_filter = RShade::Filter::IncludePathFilter.new
|
69
|
+
exclude_filter = RShade::Filter::ExcludePathFilter.new
|
70
|
+
|
71
|
+
RShade::Filter::FilterBuilder.build([:or,
|
72
|
+
[:or, variable_filter, include_filter], exclude_filter])
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -6,6 +6,9 @@ module RShade
|
|
6
6
|
include Singleton
|
7
7
|
attr_reader :map, :mutex
|
8
8
|
|
9
|
+
DEFAULT_EVENT_STORE = :event_store_default
|
10
|
+
DEFAULT_STACK_STORE = :stack_store_default
|
11
|
+
|
9
12
|
def initialize
|
10
13
|
@map = {}
|
11
14
|
@mutex = Mutex.new
|
@@ -15,7 +18,7 @@ module RShade
|
|
15
18
|
def default_stack_config
|
16
19
|
val = nil
|
17
20
|
mutex.synchronize do
|
18
|
-
val = map[
|
21
|
+
val = map[DEFAULT_STACK_STORE]
|
19
22
|
end
|
20
23
|
val
|
21
24
|
end
|
@@ -25,14 +28,38 @@ module RShade
|
|
25
28
|
mutex.synchronize do
|
26
29
|
val = ::RShade::Config::StackStore.new
|
27
30
|
block.call(val)
|
28
|
-
map[
|
31
|
+
map[DEFAULT_STACK_STORE] = val
|
32
|
+
end
|
33
|
+
val
|
34
|
+
end
|
35
|
+
|
36
|
+
def default_trace_config
|
37
|
+
val = nil
|
38
|
+
mutex.synchronize do
|
39
|
+
val = map[DEFAULT_EVENT_STORE]
|
40
|
+
end
|
41
|
+
val
|
42
|
+
end
|
43
|
+
|
44
|
+
def trace_config(&block)
|
45
|
+
val = nil
|
46
|
+
mutex.synchronize do
|
47
|
+
val = ::RShade::Config::EventStore.new
|
48
|
+
block.call(val)
|
49
|
+
map[DEFAULT_EVENT_STORE] = val
|
29
50
|
end
|
30
51
|
val
|
31
52
|
end
|
32
53
|
|
33
54
|
def defaults
|
34
55
|
mutex.synchronize do
|
35
|
-
|
56
|
+
stack_store = ::RShade::Config::StackStore.new
|
57
|
+
stack_store.exclude_gems!
|
58
|
+
map[DEFAULT_STACK_STORE] = stack_store
|
59
|
+
|
60
|
+
event_store = ::RShade::Config::EventStore.new
|
61
|
+
event_store.exclude_gems!
|
62
|
+
map[DEFAULT_EVENT_STORE] = event_store
|
36
63
|
end
|
37
64
|
end
|
38
65
|
end
|
@@ -3,29 +3,30 @@
|
|
3
3
|
module RShade
|
4
4
|
class Config
|
5
5
|
class StackStore
|
6
|
-
attr_reader :filter, :formatter, :
|
6
|
+
attr_reader :filter, :formatter, :variable_serializer
|
7
7
|
|
8
8
|
DEFAULT_FORMATTER = {
|
9
9
|
json: ::RShade::Formatter::Stack::Json,
|
10
10
|
stdout: ::RShade::Formatter::Stack::Stdout
|
11
11
|
}.freeze
|
12
12
|
|
13
|
-
# @param [
|
14
|
-
# @
|
15
|
-
# @
|
16
|
-
def initialize(
|
17
|
-
|
18
|
-
@
|
19
|
-
@
|
13
|
+
# @param [RShade::Formatter::Stack::Stdout] formatter
|
14
|
+
# @param [RShade::Filter::FilterComposition] filter
|
15
|
+
# @param [Hash] serializers
|
16
|
+
def initialize(formatter: RShade::Formatter::Stack::Stdout.new, filter: default_filter_composition,
|
17
|
+
serializers: {})
|
18
|
+
@filter = filter
|
19
|
+
@formatter = formatter
|
20
|
+
@variable_serializer = ::RShade::Serializer::Traversal.new(serializers)
|
20
21
|
end
|
21
22
|
|
22
|
-
def
|
23
|
-
|
23
|
+
def serializer!(hash)
|
24
|
+
variable_serializer.merge!(hash)
|
24
25
|
self
|
25
26
|
end
|
26
27
|
|
27
|
-
def
|
28
|
-
filter.
|
28
|
+
def filter!(filter_type, &block)
|
29
|
+
filter.filter(filter_type, &block)
|
29
30
|
self
|
30
31
|
end
|
31
32
|
|
@@ -35,8 +36,8 @@ module RShade
|
|
35
36
|
end
|
36
37
|
|
37
38
|
def exclude_gems!
|
38
|
-
|
39
|
-
paths.concat(RShade::
|
39
|
+
filter!(::RShade::Filter::ExcludePathFilter) do |paths|
|
40
|
+
paths.concat(RShade::Utils.default_excluded_path)
|
40
41
|
end
|
41
42
|
self
|
42
43
|
end
|
@@ -5,7 +5,7 @@ class Object
|
|
5
5
|
def reveal(method_name = nil, **opts, &block)
|
6
6
|
if method_name
|
7
7
|
@__cache_rshade_reveal ||= {}
|
8
|
-
config = opts.fetch(:config, ::RShade::Config.
|
8
|
+
config = opts.fetch(:config, ::RShade::Config::Registry.instance.default_trace_config)
|
9
9
|
@__cache_rshade_reveal[method_name] = config
|
10
10
|
instance_eval do
|
11
11
|
def method_added(name)
|
@@ -21,7 +21,7 @@ class Object
|
|
21
21
|
origin_method = instance_method(name)
|
22
22
|
define_method(name) do |*args, &fn|
|
23
23
|
val = nil
|
24
|
-
trace = ::RShade::Trace.reveal(config) do
|
24
|
+
trace = ::RShade::Trace.reveal(config: config) do
|
25
25
|
val = origin_method.bind(self).call(*args, &fn)
|
26
26
|
end
|
27
27
|
trace.show
|
@@ -4,7 +4,7 @@ module RShade
|
|
4
4
|
class EventObserver
|
5
5
|
attr_reader :event_processor, :config
|
6
6
|
|
7
|
-
# @param [RShade::Config::
|
7
|
+
# @param [RShade::Config::EventStore] config
|
8
8
|
# @param [RShade::EventProcessor] event_store
|
9
9
|
def initialize(config, event_processor)
|
10
10
|
@event_processor = event_processor
|
@@ -41,7 +41,7 @@ module RShade
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def pass?(event)
|
44
|
-
config.
|
44
|
+
config.filter.call(event)
|
45
45
|
end
|
46
46
|
end
|
47
47
|
end
|
@@ -4,7 +4,7 @@ module RShade
|
|
4
4
|
module Formatter
|
5
5
|
module Stack
|
6
6
|
class Json
|
7
|
-
attr_reader :filepath, :pretty
|
7
|
+
attr_reader :filepath, :pretty, :variable_serializer
|
8
8
|
|
9
9
|
def initialize(filepath:, pretty: false)
|
10
10
|
@filepath = filepath
|
@@ -12,9 +12,9 @@ module RShade
|
|
12
12
|
end
|
13
13
|
|
14
14
|
# @param [Array<RShade::StackFrame>] stack_frames
|
15
|
-
def call(stack_frames)
|
15
|
+
def call(stack_frames, variable_serializer: nil)
|
16
16
|
payload = stack_frames.map.with_index do |frame, idx|
|
17
|
-
serialize(idx, frame)
|
17
|
+
serialize(idx, frame, variable_serializer)
|
18
18
|
end
|
19
19
|
|
20
20
|
File.open(filepath, 'a+') do |file|
|
@@ -37,12 +37,14 @@ module RShade
|
|
37
37
|
end
|
38
38
|
|
39
39
|
# @param [RShade::StackFrame] frame
|
40
|
-
def serialize(idx, frame)
|
40
|
+
def serialize(idx, frame, variable_serializer)
|
41
|
+
local_vars = variable_serializer.nil? ? frame.local_vars : variable_serializer.call(frame.local_vars)
|
42
|
+
receiver_variables = variable_serializer.call(frame.receiver_variables) unless variable_serializer.nil?
|
41
43
|
{
|
42
44
|
frame: idx,
|
43
45
|
source_location: "#{frame.source_location[:path]}:#{frame.source_location[:line]}",
|
44
|
-
local_variables:
|
45
|
-
receiver_variables:
|
46
|
+
local_variables: local_vars,
|
47
|
+
receiver_variables: receiver_variables
|
46
48
|
}
|
47
49
|
end
|
48
50
|
end
|
@@ -12,10 +12,10 @@ module RShade
|
|
12
12
|
@colorize = colorize
|
13
13
|
end
|
14
14
|
|
15
|
-
# @param [RShade::EventProcessor]
|
16
|
-
def call(
|
15
|
+
# @param [RShade::EventProcessor] stack_frames
|
16
|
+
def call(stack_frames, variable_serializer: nil)
|
17
17
|
buffer = StringIO.new
|
18
|
-
|
18
|
+
stack_frames.each_with_index do |frame, idx|
|
19
19
|
if idx.zero?
|
20
20
|
buffer << ROOT_SEP
|
21
21
|
next
|
@@ -24,11 +24,11 @@ module RShade
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def write_to_file(data)
|
27
|
-
::File.write(::File.join(RShade::
|
27
|
+
::File.write(::File.join(RShade::Utils.store_dir, FILE_NAME), data)
|
28
28
|
end
|
29
29
|
|
30
30
|
def template
|
31
|
-
@template ||= ::File.read(::File.join(::RShade::
|
31
|
+
@template ||= ::File.read(::File.join(::RShade::Utils.root_dir, TEMPLATE))
|
32
32
|
end
|
33
33
|
end
|
34
34
|
end
|
@@ -4,53 +4,43 @@ module RShade
|
|
4
4
|
module Formatter
|
5
5
|
module Trace
|
6
6
|
class Json
|
7
|
-
attr_reader :
|
7
|
+
attr_reader :filepath, :pretty
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
@
|
12
|
-
flat
|
9
|
+
def initialize(filepath:, pretty: false)
|
10
|
+
@filepath = filepath
|
11
|
+
@pretty = pretty
|
13
12
|
end
|
14
13
|
|
15
|
-
|
16
|
-
|
17
|
-
|
14
|
+
# @param [RShade::EventProcessor] event_store
|
15
|
+
def call(event_store)
|
16
|
+
::File.open(filepath, 'a+') do |file|
|
17
|
+
file.puts(convert_to_json(flat(event_store), pretty))
|
18
18
|
end
|
19
|
-
arr.sort_by { |item| item[:level] }
|
20
19
|
end
|
21
20
|
|
22
|
-
|
23
|
-
hash = {}
|
24
|
-
event_store.each do |node|
|
25
|
-
depth = node.level
|
26
|
-
ref = hash_iterate(hash, depth)
|
27
|
-
ref[:data] = item(node)
|
28
|
-
end
|
29
|
-
sort_hash(hash)
|
30
|
-
end
|
21
|
+
private
|
31
22
|
|
32
|
-
def
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
end
|
37
|
-
end
|
23
|
+
def convert_to_json(object, pretty)
|
24
|
+
return JSON.pretty_generate(object) if pretty
|
25
|
+
|
26
|
+
JSON.generate(object)
|
38
27
|
end
|
39
28
|
|
40
|
-
def
|
41
|
-
|
42
|
-
|
43
|
-
|
29
|
+
def flat(event_store)
|
30
|
+
arr = event_store.filter_map do |node|
|
31
|
+
next unless node.value
|
32
|
+
|
33
|
+
serialize(node.value)
|
44
34
|
end
|
45
|
-
|
35
|
+
arr.sort_by { |item| item[:level] }
|
46
36
|
end
|
47
37
|
|
48
|
-
def
|
38
|
+
def serialize(value)
|
49
39
|
{
|
50
40
|
class: value.klass.to_s,
|
51
41
|
method_name: value.method_name,
|
52
42
|
full_path: "#{value.path}:#{value.lineno}",
|
53
|
-
level: value.
|
43
|
+
level: value.level,
|
54
44
|
vars: value.vars
|
55
45
|
}
|
56
46
|
end
|
data/lib/rshade/stack.rb
CHANGED
data/lib/rshade/trace.rb
CHANGED
@@ -4,14 +4,14 @@ module RShade
|
|
4
4
|
class Trace
|
5
5
|
attr_reader :config, :event_store
|
6
6
|
|
7
|
-
# @param [RShade::Config,RShade::Config::
|
8
|
-
def initialize(config)
|
9
|
-
@config =
|
7
|
+
# @param [RShade::Config,RShade::Config::EventStore] config
|
8
|
+
def initialize(config: ::RShade::Config::Registry.instance.default_trace_config)
|
9
|
+
@config = config
|
10
10
|
@event_store = EventTree.new
|
11
11
|
end
|
12
12
|
|
13
|
-
def self.reveal(config
|
14
|
-
new(config).reveal(&block)
|
13
|
+
def self.reveal(config: ::RShade::Config::Registry.instance.default_trace_config, &block)
|
14
|
+
new(config: config).reveal(&block)
|
15
15
|
end
|
16
16
|
|
17
17
|
def reveal(&block)
|
@@ -25,13 +25,5 @@ module RShade
|
|
25
25
|
def show
|
26
26
|
config.formatter.call(event_store)
|
27
27
|
end
|
28
|
-
|
29
|
-
private
|
30
|
-
|
31
|
-
def fetch_config(config)
|
32
|
-
config ||= ::RShade::Config.default
|
33
|
-
config = config.value if config.is_a?(::RShade::Config)
|
34
|
-
config
|
35
|
-
end
|
36
28
|
end
|
37
29
|
end
|
@@ -9,7 +9,7 @@ module RShade
|
|
9
9
|
RETURN_EVENTS = Set[:return, :c_return, :b_return]
|
10
10
|
|
11
11
|
# @param [Enumerable<#call>, #call] observers
|
12
|
-
# @param [::RShade::Config::
|
12
|
+
# @param [::RShade::Config::EventStore] config
|
13
13
|
def initialize(observers, config)
|
14
14
|
@trace_p = TracePoint.new(*config.tp_events, &method(:process))
|
15
15
|
observers = [observers] unless observers.is_a?(Enumerable)
|
data/lib/rshade/utils.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RShade
|
4
|
+
module Utils
|
5
|
+
RUBY_VERSION_PATTERN = /ruby-[0-9.]*/.freeze
|
6
|
+
|
7
|
+
def self.store_dir
|
8
|
+
File.expand_path('../../tmp', __dir__)
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.root_dir
|
12
|
+
@root_dir ||= File.expand_path('../../', __dir__)
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.default_excluded_path
|
16
|
+
[ENV['GEM_PATH'].split(':'), RUBY_VERSION_PATTERN, /internal/, %r{/gems/}].flatten.compact
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/rshade/version.rb
CHANGED
data/lib/rshade.rb
CHANGED
@@ -23,7 +23,6 @@ require 'rshade/filter/default'
|
|
23
23
|
|
24
24
|
require 'rshade/formatter/trace/string'
|
25
25
|
require 'rshade/formatter/trace/json'
|
26
|
-
require 'rshade/formatter/trace/file'
|
27
26
|
require 'rshade/formatter/trace/html'
|
28
27
|
require 'rshade/formatter/trace/stdout'
|
29
28
|
|
@@ -31,8 +30,8 @@ require 'rshade/formatter/stack/string'
|
|
31
30
|
require 'rshade/formatter/stack/stdout'
|
32
31
|
require 'rshade/formatter/stack/json'
|
33
32
|
|
34
|
-
require 'rshade/
|
35
|
-
require 'rshade/config/
|
33
|
+
require 'rshade/utils'
|
34
|
+
require 'rshade/config/event_store'
|
36
35
|
require 'rshade/config/stack_store'
|
37
36
|
require 'rshade/config/registry'
|
38
37
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rshade
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ivan Lopatin
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-01-
|
11
|
+
date: 2025-01-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: binding_of_caller
|
@@ -72,10 +72,9 @@ files:
|
|
72
72
|
- bin/setup
|
73
73
|
- html/template.html.erb
|
74
74
|
- lib/rshade.rb
|
75
|
-
- lib/rshade/config.rb
|
75
|
+
- lib/rshade/config/event_store.rb
|
76
76
|
- lib/rshade/config/registry.rb
|
77
77
|
- lib/rshade/config/stack_store.rb
|
78
|
-
- lib/rshade/config/store.rb
|
79
78
|
- lib/rshade/core_extensions/object/reveal.rb
|
80
79
|
- lib/rshade/event.rb
|
81
80
|
- lib/rshade/event_observer.rb
|
@@ -91,7 +90,6 @@ files:
|
|
91
90
|
- lib/rshade/formatter/stack/json.rb
|
92
91
|
- lib/rshade/formatter/stack/stdout.rb
|
93
92
|
- lib/rshade/formatter/stack/string.rb
|
94
|
-
- lib/rshade/formatter/trace/file.rb
|
95
93
|
- lib/rshade/formatter/trace/html.rb
|
96
94
|
- lib/rshade/formatter/trace/json.rb
|
97
95
|
- lib/rshade/formatter/trace/stdout.rb
|
@@ -102,6 +100,7 @@ files:
|
|
102
100
|
- lib/rshade/stack_frame.rb
|
103
101
|
- lib/rshade/trace.rb
|
104
102
|
- lib/rshade/trace_observable.rb
|
103
|
+
- lib/rshade/utils.rb
|
105
104
|
- lib/rshade/version.rb
|
106
105
|
- rshade.gemspec
|
107
106
|
- shade.jpg
|
data/lib/rshade/config/store.rb
DELETED
@@ -1,51 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module RShade
|
4
|
-
class Config
|
5
|
-
class Store
|
6
|
-
attr_reader :filter_composition, :formatter, :tp_events, :custom_serializers
|
7
|
-
|
8
|
-
# @param [Hash] options
|
9
|
-
# @option options [RShade::Filter::FilterComposition] :filter_composition
|
10
|
-
# @option options [#call(event_store)] :formatter
|
11
|
-
# @option options [Array<Symbol>] :tp_events
|
12
|
-
def initialize(options = {})
|
13
|
-
@filter_composition = options.fetch(:filter_composition, default_filter_composition)
|
14
|
-
@formatter = options.fetch(:formatter, ::RShade::Formatter::Trace::Stdout)
|
15
|
-
@tp_events = options.fetch(:tp_events, %i[call return])
|
16
|
-
@custom_serializers = options.fetch(:custom_serializers, {})
|
17
|
-
end
|
18
|
-
|
19
|
-
def tp_events!(tp_events)
|
20
|
-
@tp_events = tp_events
|
21
|
-
self
|
22
|
-
end
|
23
|
-
|
24
|
-
def add_custom_serializers(hash)
|
25
|
-
custom_serializers.merge!(hash)
|
26
|
-
self
|
27
|
-
end
|
28
|
-
|
29
|
-
def config_filter(filter_type, &block)
|
30
|
-
filter_composition.config_filter(filter_type, &block)
|
31
|
-
self
|
32
|
-
end
|
33
|
-
|
34
|
-
def formatter!(formatter)
|
35
|
-
@formatter = formatter
|
36
|
-
self
|
37
|
-
end
|
38
|
-
|
39
|
-
private
|
40
|
-
|
41
|
-
def default_filter_composition
|
42
|
-
variable_filter = RShade::Filter::VariableFilter.new
|
43
|
-
include_filter = RShade::Filter::IncludePathFilter.new
|
44
|
-
exclude_filter = RShade::Filter::ExcludePathFilter.new
|
45
|
-
|
46
|
-
RShade::Filter::FilterBuilder.build([:or,
|
47
|
-
[:or, variable_filter, include_filter], exclude_filter])
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
data/lib/rshade/config.rb
DELETED
@@ -1,77 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module RShade
|
4
|
-
class Config
|
5
|
-
RUBY_VERSION_PATTERN = /ruby-[0-9.]*/.freeze
|
6
|
-
|
7
|
-
def self.default
|
8
|
-
::RShade::Config::Store.new.formatter!(::RShade::Formatter::Trace::Stdout.new)
|
9
|
-
.config_filter(::RShade::Filter::ExcludePathFilter) do |paths|
|
10
|
-
default_excluded_path.each do |path|
|
11
|
-
paths << path
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
# @param [RShade::Config::Store] config_store
|
17
|
-
def initialize(config_store)
|
18
|
-
@config_store = config_store
|
19
|
-
end
|
20
|
-
|
21
|
-
# @param [Hash] options
|
22
|
-
# @option options [RShade::Filter::FilterComposition] :filter_composition
|
23
|
-
# @option options [#call(event_store)] :formatter
|
24
|
-
# @option options [Array<Symbol>] :tp_events
|
25
|
-
def self.create(options = {})
|
26
|
-
new(Config::Store.new(options))
|
27
|
-
end
|
28
|
-
|
29
|
-
def tp_events(&block)
|
30
|
-
events = block.call
|
31
|
-
@config_store.tp_events!(events)
|
32
|
-
self
|
33
|
-
end
|
34
|
-
|
35
|
-
def include_paths(&block)
|
36
|
-
@config_store.config_filter(::RShade::Filter::IncludePathFilter, &block)
|
37
|
-
self
|
38
|
-
end
|
39
|
-
|
40
|
-
def exclude_paths(&block)
|
41
|
-
@config_store.config_filter(::RShade::Filter::ExcludePathFilter, &block)
|
42
|
-
self
|
43
|
-
end
|
44
|
-
|
45
|
-
def match_variable(&block)
|
46
|
-
@config_store.config_filter(::RShade::Filter::VariableFilter, &block)
|
47
|
-
self
|
48
|
-
end
|
49
|
-
|
50
|
-
def formatter(&block)
|
51
|
-
formatter = block.call
|
52
|
-
@config_store.formatter!(formatter)
|
53
|
-
self
|
54
|
-
end
|
55
|
-
|
56
|
-
def add_custom_serializers(hash)
|
57
|
-
@config_store.add_custom_serializers(hash)
|
58
|
-
self
|
59
|
-
end
|
60
|
-
|
61
|
-
def value
|
62
|
-
@config_store
|
63
|
-
end
|
64
|
-
|
65
|
-
def self.store_dir
|
66
|
-
File.expand_path('../../tmp', __dir__)
|
67
|
-
end
|
68
|
-
|
69
|
-
def self.root_dir
|
70
|
-
@root_dir ||= File.expand_path('../../', __dir__)
|
71
|
-
end
|
72
|
-
|
73
|
-
def self.default_excluded_path
|
74
|
-
[ENV['GEM_PATH'].split(':'), RUBY_VERSION_PATTERN, /internal/, %r{/gems/}].flatten.compact
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module RShade
|
4
|
-
module Formatter
|
5
|
-
module Trace
|
6
|
-
class File
|
7
|
-
attr_reader :formatter
|
8
|
-
|
9
|
-
FILE_NAME = 'stacktrace.json'
|
10
|
-
|
11
|
-
def initialize(args = {})
|
12
|
-
@formatter = args.fetch(:format, Json)
|
13
|
-
end
|
14
|
-
|
15
|
-
# @param [RShade::EventProcessor] event_store
|
16
|
-
def call(event_store)
|
17
|
-
data = formatter.call(event_store)
|
18
|
-
if formatter == Json
|
19
|
-
write_to_file(JSON.pretty_generate(data))
|
20
|
-
else
|
21
|
-
write_to_file(data.to_s)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def write_to_file(data)
|
26
|
-
::File.write(::File.join(RShade::Config.store_dir, FILE_NAME), data)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|