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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: efdbfc08fca88589c49b580abbbeb36687b68986e365291c2c4758633b33943d
4
- data.tar.gz: 78e8147a5539bb79216281763274c676d916729b62af681b2811caa1772f7031
3
+ metadata.gz: e267f5e11b2c8624bc38c88c031a12e9b252b5581b803fe4076f40d532d75c81
4
+ data.tar.gz: 153c3b896ce3701be9bc26a9501f987220e23c8ebb4e253d42a0968cf2e43709
5
5
  SHA512:
6
- metadata.gz: 39fad4c1cb0663e510aaee89100090a10e689880da9f2fb2422fc404094337bad4bcbd5bb72a96270b284a3709392d4d9879cb1410d8f912d8e55db2962a8e4f
7
- data.tar.gz: de5d785cfe183f5a7109aeebb128086e0173ce126788165b7dc18b818de066909830e628b5322c84ff6c9655696cb34cc8c7d289aafff036965f6a7caeb7bda0
6
+ metadata.gz: a0c00f405183f7f3a5a33d7e9fd9b5bf4cc4692aabc6cf7400bc32b4fb3e704c0e94b583da98447a868f5c7079b290df835e8f0ed75d8ec66544404748df5466
7
+ data.tar.gz: 273df7e4c8b3107bb8fb5a09c1ef36c8489caf2f5e87550aaa9631b79bd0cdc3a7f4a5641db2f38107e6c28203e0f21a7a51f4e2e47d5da47ab7d3f5d1d89e66
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rshade (0.2.1)
4
+ rshade (0.2.2)
5
5
  binding_of_caller
6
6
  colorize
7
7
  prism
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
- config = ::RShade::Config.default
38
-
39
- RShade::Trace.reveal(config) do
40
- end.show
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
- config = ::RShade::Config.default.include_paths { |paths| paths << /devise/ }
47
- .exclude_paths { |paths| paths << /warden/ }
48
- .match_variable { |name, value| name == :current_user }
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
- config = ::RShade::Config.default.include_paths { |paths| paths << /devise/ }
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(config) do
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
- config = ::RShade::Config.default.exclude_paths { |paths| paths << /devise/ }
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(config) do
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::Trace.reveal(config) do
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[:store_default]
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[:store_default] = val
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
- map[:store_default] = ::RShade::Config::StackStore.new
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, :custom_serializers
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 [Hash] options
14
- # @option options [::RShade::Filter::FilterComposition] :filter_composition
15
- # @option options [#call(event_store)] :formatter
16
- def initialize(options = {})
17
- @filter = options.fetch(:filter, default_filter_composition)
18
- @formatter = options.fetch(:formatter, ::RShade::Formatter::Stack::Stdout.new)
19
- @custom_serializers = options.fetch(:custom_serializers, {})
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 add_custom_serializers(hash)
23
- custom_serializers.merge!(hash)
23
+ def serializer!(hash)
24
+ variable_serializer.merge!(hash)
24
25
  self
25
26
  end
26
27
 
27
- def config_filter(filter_type, &block)
28
- filter.config_filter(filter_type, &block)
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
- config_filter(::RShade::Filter::ExcludePathFilter) do |paths|
39
- paths.concat(RShade::Config.default_excluded_path)
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.default)
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::Store] 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.filter_composition.call(event)
44
+ config.filter.call(event)
45
45
  end
46
46
  end
47
47
  end
@@ -7,7 +7,7 @@ module RShade
7
7
 
8
8
  def initialize(store, config)
9
9
  @store = store
10
- custom_serializers = config.custom_serializers
10
+ custom_serializers = config.variable_serializer
11
11
  @serializer = ::RShade::Serializer::Traversal.new(custom_serializers)
12
12
  end
13
13
 
@@ -39,7 +39,7 @@ module RShade
39
39
  right&.each(&block)
40
40
  end
41
41
 
42
- def config_filter(type, &block)
42
+ def filter(type, &block)
43
43
  filter = find do |f|
44
44
  f.is_a? type
45
45
  end
@@ -22,8 +22,8 @@ module RShade
22
22
 
23
23
  def call(event)
24
24
  matchers.each do |match|
25
- event.vars.each do |name, value|
26
- return true if match.call(name, value)
25
+ event.vars.each do |name, hash|
26
+ return true if match.call(name, hash[:value])
27
27
  end
28
28
  end
29
29
  false
@@ -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: frame.local_vars,
45
- receiver_variables: frame.receiver_variables
46
+ local_variables: local_vars,
47
+ receiver_variables: receiver_variables
46
48
  }
47
49
  end
48
50
  end
@@ -4,7 +4,7 @@ module RShade
4
4
  module Formatter
5
5
  module Stack
6
6
  class Stdout < String
7
- def call(stack)
7
+ def call(stack_frames, variable_serializer: nil)
8
8
  puts super
9
9
  end
10
10
  end
@@ -12,10 +12,10 @@ module RShade
12
12
  @colorize = colorize
13
13
  end
14
14
 
15
- # @param [RShade::EventProcessor] stack
16
- def call(stack)
15
+ # @param [RShade::EventProcessor] stack_frames
16
+ def call(stack_frames, variable_serializer: nil)
17
17
  buffer = StringIO.new
18
- stack.each_with_index do |frame, idx|
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::Config.store_dir, FILE_NAME), data)
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::Config.root_dir, TEMPLATE))
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 :event_processor
7
+ attr_reader :filepath, :pretty
8
8
 
9
- # @param [RShade::EventProcessor] event_store
10
- def call(event_store)
11
- @event_store = event_store
12
- flat
9
+ def initialize(filepath:, pretty: false)
10
+ @filepath = filepath
11
+ @pretty = pretty
13
12
  end
14
13
 
15
- def flat
16
- arr = event_store.map do |node|
17
- item(node.event)
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
- def hierarchical
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 sort_hash(hash)
33
- {}.tap do |h2|
34
- hash.sort.each do |k, v|
35
- h2[k] = v.is_a?(Hash) ? sort_hash(v) : v
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 hash_iterate(hash, depth)
41
- (0..depth).each do |_lvl|
42
- hash[:inner] = {} unless hash[:inner]
43
- hash = hash[:inner]
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
- hash
35
+ arr.sort_by { |item| item[:level] }
46
36
  end
47
37
 
48
- def item(value)
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.depth,
43
+ level: value.level,
54
44
  vars: value.vars
55
45
  }
56
46
  end
@@ -17,6 +17,10 @@ module RShade
17
17
  new_val
18
18
  end
19
19
 
20
+ def merge!(new_types)
21
+ @types.merge!(new_types)
22
+ end
23
+
20
24
  def default_types
21
25
  {
22
26
  default: lambda(&:to_s),
data/lib/rshade/stack.rb CHANGED
@@ -20,7 +20,7 @@ module RShade
20
20
 
21
21
  frame
22
22
  end.compact.reverse
23
- config.formatter.call(result)
23
+ config.formatter.call(result, variable_serializer: config.variable_serializer)
24
24
  end
25
25
  end
26
26
  end
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::Store] config
8
- def initialize(config)
9
- @config = fetch_config(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 = nil, &block)
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::Store] 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)
@@ -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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RShade
4
- VERSION = '0.2.1'
4
+ VERSION = '0.2.2'
5
5
  end
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/config'
35
- require 'rshade/config/store'
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.1
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-07 00:00:00.000000000 Z
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
@@ -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