trace_viz 0.0.2 → 1.0.1

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.
Files changed (172) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +68 -43
  3. data/Steepfile +34 -0
  4. data/examples/eu_central_bank.rb +69 -0
  5. data/examples/example.cast +189 -285
  6. data/lib/trace_viz/adapters/base_adapter.rb +24 -1
  7. data/lib/trace_viz/adapters/trace_point_adapter.rb +3 -10
  8. data/lib/trace_viz/builders/base_builder.rb +11 -0
  9. data/lib/trace_viz/builders/diagram/base_builder.rb +10 -0
  10. data/lib/trace_viz/builders/diagram/message_builder.rb +96 -0
  11. data/lib/trace_viz/builders/diagram/sequence_builder.rb +50 -0
  12. data/lib/trace_viz/collectors/base_collector.rb +42 -35
  13. data/lib/trace_viz/collectors/filters/base_class_filter.rb +31 -0
  14. data/lib/trace_viz/collectors/filters/base_exclude_filter.rb +16 -0
  15. data/lib/trace_viz/collectors/filters/base_filter.rb +2 -8
  16. data/lib/trace_viz/collectors/filters/base_include_filter.rb +16 -0
  17. data/lib/trace_viz/collectors/filters/exclude_classes_filter.rb +4 -17
  18. data/lib/trace_viz/collectors/filters/exclude_default_classes_filter.rb +22 -26
  19. data/lib/trace_viz/collectors/filters/include_classes_filter.rb +4 -17
  20. data/lib/trace_viz/collectors/hierarchy_linker.rb +30 -0
  21. data/lib/trace_viz/collectors/matchers/base_matcher.rb +13 -0
  22. data/lib/trace_viz/collectors/matchers/trace_point_action_matcher.rb +12 -10
  23. data/lib/trace_viz/collectors/matchers/within_depth_matcher.rb +6 -5
  24. data/lib/trace_viz/collectors/steps/assign_depth_for_call_step.rb +30 -0
  25. data/lib/trace_viz/collectors/steps/assign_depth_for_return_step.rb +39 -0
  26. data/lib/trace_viz/collectors/steps/base_step.rb +27 -0
  27. data/lib/trace_viz/collectors/steps/build_hierarchy_step.rb +32 -0
  28. data/lib/trace_viz/collectors/{evaluators/hidden_evaluator.rb → steps/hidden_step.rb} +9 -5
  29. data/lib/trace_viz/collectors/steps/linking_step.rb +36 -0
  30. data/lib/trace_viz/collectors/{evaluators/filter_evaluator.rb → steps/validation_step.rb} +9 -6
  31. data/lib/trace_viz/collectors/steps.rb +10 -0
  32. data/lib/trace_viz/collectors/trace_pipeline.rb +26 -0
  33. data/lib/trace_viz/collectors/trace_pipeline_builder.rb +29 -0
  34. data/lib/trace_viz/collectors/trace_point_collector.rb +1 -11
  35. data/lib/trace_viz/config/validator.rb +6 -5
  36. data/lib/trace_viz/configuration.rb +3 -3
  37. data/lib/trace_viz/context/tracking_context.rb +4 -0
  38. data/lib/trace_viz/core/tracer.rb +2 -0
  39. data/lib/trace_viz/defaults/actions.rb +84 -0
  40. data/lib/trace_viz/defaults/colors.rb +61 -0
  41. data/lib/trace_viz/defaults/config.rb +91 -0
  42. data/lib/trace_viz/defaults/themes.rb +66 -0
  43. data/lib/trace_viz/defaults.rb +10 -129
  44. data/lib/trace_viz/exporters/base_exporter.rb +31 -13
  45. data/lib/trace_viz/exporters/export_manager.rb +33 -0
  46. data/lib/trace_viz/exporters/mermaid_exporter.rb +17 -0
  47. data/lib/trace_viz/exporters/registry.rb +27 -0
  48. data/lib/trace_viz/exporters/text_exporter.rb +2 -2
  49. data/lib/trace_viz/extractors/base_extractor.rb +17 -0
  50. data/lib/trace_viz/extractors/diagram/base_extractor.rb +18 -0
  51. data/lib/trace_viz/extractors/diagram/box_extractor.rb +50 -0
  52. data/lib/trace_viz/extractors/diagram/message_extractor.rb +23 -0
  53. data/lib/trace_viz/extractors/diagram/participant_extractor.rb +37 -0
  54. data/lib/trace_viz/extractors/diagram/processors/message_processor.rb +93 -0
  55. data/lib/trace_viz/formatters/base_formatter.rb +4 -30
  56. data/lib/trace_viz/formatters/base_formatter_factory.rb +23 -0
  57. data/lib/trace_viz/formatters/diagram/sequence/base_formatter.rb +14 -0
  58. data/lib/trace_viz/formatters/diagram/sequence/message_formatter.rb +37 -0
  59. data/lib/trace_viz/formatters/diagram_formatter.rb +10 -0
  60. data/lib/trace_viz/formatters/export/base_formatter.rb +12 -0
  61. data/lib/trace_viz/formatters/export/formatter_factory.rb +22 -0
  62. data/lib/trace_viz/formatters/export/method_call_formatter.rb +21 -0
  63. data/lib/trace_viz/formatters/export/method_return_formatter.rb +22 -0
  64. data/lib/trace_viz/formatters/export/summary_group_formatter.rb +35 -0
  65. data/lib/trace_viz/formatters/helpers/depth_helper.rb +2 -8
  66. data/lib/trace_viz/formatters/helpers/digram/action_helper.rb +17 -0
  67. data/lib/trace_viz/formatters/helpers/digram/result_helper.rb +39 -0
  68. data/lib/trace_viz/formatters/helpers/indent_helper.rb +1 -1
  69. data/lib/trace_viz/formatters/helpers/log/color_helper.rb +23 -0
  70. data/lib/trace_viz/formatters/helpers/log/depth_helper.rb +22 -0
  71. data/lib/trace_viz/formatters/helpers/log/method_name_helper.rb +29 -0
  72. data/lib/trace_viz/formatters/helpers/log/params_helper.rb +55 -0
  73. data/lib/trace_viz/formatters/helpers/log/result_helper.rb +27 -0
  74. data/lib/trace_viz/formatters/helpers/log/summary/params_helper.rb +57 -0
  75. data/lib/trace_viz/formatters/helpers/method_details_helper.rb +1 -1
  76. data/lib/trace_viz/formatters/helpers/params_helper.rb +30 -9
  77. data/lib/trace_viz/formatters/helpers/result_helper.rb +5 -4
  78. data/lib/trace_viz/formatters/helpers/source_helper.rb +6 -4
  79. data/lib/trace_viz/formatters/helpers/summary/params_helper.rb +45 -0
  80. data/lib/trace_viz/formatters/helpers/summary/source_helper.rb +24 -0
  81. data/lib/trace_viz/formatters/helpers/time_helper.rb +2 -2
  82. data/lib/trace_viz/formatters/helpers.rb +10 -0
  83. data/lib/trace_viz/formatters/log/base_formatter.rb +13 -0
  84. data/lib/trace_viz/formatters/log/formatter_factory.rb +22 -0
  85. data/lib/trace_viz/formatters/log/method_call_formatter.rb +34 -0
  86. data/lib/trace_viz/formatters/log/method_return_formatter.rb +24 -0
  87. data/lib/trace_viz/formatters/log/summary_group_formatter.rb +40 -0
  88. data/lib/trace_viz/formatters/log/verbose_formatter.rb +14 -0
  89. data/lib/trace_viz/formatters/trace_data_formatter.rb +24 -0
  90. data/lib/trace_viz/helpers/config_helper.rb +17 -0
  91. data/lib/trace_viz/helpers/trace_point/param_helper.rb +98 -0
  92. data/lib/trace_viz/helpers/tracking_helper.rb +26 -0
  93. data/lib/trace_viz/helpers.rb +9 -0
  94. data/lib/trace_viz/logger.rb +9 -20
  95. data/lib/trace_viz/loggers/base_logger.rb +29 -0
  96. data/lib/trace_viz/loggers/log_level_resolver.rb +18 -0
  97. data/lib/trace_viz/loggers/logging_manager.rb +46 -0
  98. data/lib/trace_viz/loggers/post_collection_logger.rb +44 -0
  99. data/lib/trace_viz/loggers/trace_logger.rb +14 -18
  100. data/lib/trace_viz/loggers/trace_stats_logger.rb +28 -14
  101. data/lib/trace_viz/managers/diagram/participant_manager.rb +23 -0
  102. data/lib/trace_viz/models/box.rb +19 -0
  103. data/lib/trace_viz/models/diagram.rb +27 -0
  104. data/lib/trace_viz/models/message.rb +16 -0
  105. data/lib/trace_viz/models/participant.rb +18 -0
  106. data/lib/trace_viz/models.rb +8 -0
  107. data/lib/trace_viz/renderers/base_renderer.rb +27 -0
  108. data/lib/trace_viz/renderers/diagram/sequence_renderer.rb +59 -0
  109. data/lib/trace_viz/renderers/render_context.rb +17 -0
  110. data/lib/trace_viz/renderers/renderer_builder.rb +20 -0
  111. data/lib/trace_viz/renderers/renderer_factory.rb +29 -0
  112. data/lib/trace_viz/renderers/summary_renderer.rb +34 -0
  113. data/lib/trace_viz/renderers/verbose_renderer.rb +29 -0
  114. data/lib/trace_viz/shared/renderer_helper.rb +25 -0
  115. data/lib/trace_viz/shared.rb +8 -0
  116. data/lib/trace_viz/syntax/mermaid/sequence_syntax.rb +99 -0
  117. data/lib/trace_viz/trace_data/base.rb +22 -22
  118. data/lib/trace_viz/trace_data/node.rb +39 -0
  119. data/lib/trace_viz/trace_data/root_node.rb +24 -0
  120. data/lib/trace_viz/trace_data/summary_node.rb +45 -0
  121. data/lib/trace_viz/trace_data/trace_point/base.rb +26 -31
  122. data/lib/trace_viz/trace_data/trace_point/method_call.rb +25 -16
  123. data/lib/trace_viz/trace_data/trace_point/method_return.rb +21 -1
  124. data/lib/trace_viz/traits/depth_trackable.rb +13 -0
  125. data/lib/trace_viz/traits/identifiable.rb +25 -0
  126. data/lib/trace_viz/traits/time_trackable.rb +13 -0
  127. data/lib/trace_viz/traits.rb +10 -0
  128. data/lib/trace_viz/transformers/base_transformer.rb +29 -0
  129. data/lib/trace_viz/transformers/summary_transformer.rb +70 -0
  130. data/lib/trace_viz/utils/alias_generator.rb +58 -0
  131. data/lib/trace_viz/utils/colorize.rb +6 -6
  132. data/lib/trace_viz/utils/format/key_value_formatter.rb +42 -0
  133. data/lib/trace_viz/utils/format/value_truncator.rb +123 -0
  134. data/lib/trace_viz/utils/id_generator.rb +35 -0
  135. data/lib/trace_viz/utils.rb +8 -0
  136. data/lib/trace_viz/version.rb +1 -1
  137. data/sig/adapters/base_adapter.rbs +11 -0
  138. data/sig/adapters/trace_point_adapter.rbs +13 -0
  139. data/sig/collectors/filters/registry.rbs +13 -0
  140. data/sig/collectors/trace_point_collector.rbs +17 -0
  141. data/sig/config/copier.rbs +15 -0
  142. data/sig/config/validator.rbs +18 -0
  143. data/sig/configuration.rbs +22 -0
  144. data/sig/context/base_context.rbs +9 -0
  145. data/sig/context/config_context.rbs +13 -0
  146. data/sig/context/manager.rbs +10 -0
  147. data/sig/context/map.rbs +13 -0
  148. data/sig/context.rbs +5 -0
  149. data/sig/core/tracer.rbs +7 -0
  150. data/sig/core.rbs +4 -0
  151. data/sig/defaults.rbs +17 -0
  152. data/sig/errors.rbs +13 -0
  153. data/sig/logger.rbs +33 -0
  154. data/sig/trace_viz.rbs +1 -2
  155. data/sig/utils/colorize.rbs +8 -0
  156. data/sig/utils/format_utils/key_value_formatter.rbs +16 -0
  157. data/sig/utils/format_utils/value_truncator.rbs +19 -0
  158. data/sig/utils/format_utils.rbs +8 -0
  159. data/sig/version.rbs +3 -0
  160. metadata +124 -18
  161. data/lib/trace_viz/collectors/depth_manager.rb +0 -37
  162. data/lib/trace_viz/collectors/evaluators/base_evaluator.rb +0 -23
  163. data/lib/trace_viz/exporters/formatters/base_formatter.rb +0 -12
  164. data/lib/trace_viz/exporters/formatters/method_call_formatter.rb +0 -21
  165. data/lib/trace_viz/exporters/formatters/method_return_formatter.rb +0 -22
  166. data/lib/trace_viz/exporters/transformers/base_transformer.rb +0 -25
  167. data/lib/trace_viz/exporters/transformers/text_transformer.rb +0 -28
  168. data/lib/trace_viz/loggers/trace_builder.rb +0 -30
  169. data/lib/trace_viz/loggers/trace_formatters/base_formatter.rb +0 -32
  170. data/lib/trace_viz/loggers/trace_formatters/method_call_formatter.rb +0 -21
  171. data/lib/trace_viz/loggers/trace_formatters/method_return_formatter.rb +0 -22
  172. data/lib/trace_viz/utils/format_utils.rb +0 -67
@@ -1,9 +1,32 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "trace_viz/helpers"
4
+ require "trace_viz/loggers/logging_manager"
5
+ require "trace_viz/exporters/export_manager"
6
+
3
7
  module TraceViz
4
8
  module Adapters
5
9
  class BaseAdapter
6
- def trace
10
+ include Helpers::ConfigHelper
11
+
12
+ def initialize
13
+ @logger = Loggers::LoggingManager.new
14
+ @exporter = Exporters::ExportManager.new
15
+ end
16
+
17
+ def trace(&block)
18
+ execute_trace(&block)
19
+ ensure
20
+ logger.log_post_collection(collector)
21
+ logger.log_stats(collector)
22
+ exporter.export(collector)
23
+ end
24
+
25
+ private
26
+
27
+ attr_reader :logger, :exporter, :collector
28
+
29
+ def execute_trace
7
30
  raise NotImplementedError
8
31
  end
9
32
  end
@@ -2,8 +2,6 @@
2
2
 
3
3
  require "trace_viz/adapters/base_adapter"
4
4
  require "trace_viz/collectors/trace_point_collector"
5
- require "trace_viz/exporters/text_exporter"
6
- require "trace_viz/loggers/trace_stats_logger"
7
5
 
8
6
  module TraceViz
9
7
  module Adapters
@@ -14,18 +12,13 @@ module TraceViz
14
12
  @collector = Collectors::TracePointCollector.new
15
13
  end
16
14
 
17
- def trace(&block)
15
+ private
16
+
17
+ def execute_trace(&block)
18
18
  ::TracePoint.new(:call, :return) do |tp|
19
19
  collector.collect(tp)
20
20
  end.enable(&block)
21
- ensure
22
- Loggers::TraceStatsLogger.log(collector)
23
- Exporters::TextExporter.new(collector).export
24
21
  end
25
-
26
- private
27
-
28
- attr_reader :collector
29
22
  end
30
23
  end
31
24
  end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TraceViz
4
+ module Builders
5
+ class BaseBuilder
6
+ def build
7
+ raise NotImplementedError
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TraceViz
4
+ module Builders
5
+ module Diagram
6
+ class BaseBuilder
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,96 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "trace_viz/managers/diagram/participant_manager"
4
+ require "trace_viz/models"
5
+ require_relative "base_builder"
6
+
7
+ module TraceViz
8
+ module Builders
9
+ module Diagram
10
+ class MessageBuilder < BaseBuilder
11
+ def initialize(formatter, participants)
12
+ super()
13
+ @formatter = formatter
14
+ @participants_manager = Managers::Diagram::ParticipantsManager.new(participants)
15
+ end
16
+
17
+ def build_call_message(from_trace, to_trace)
18
+ return if same_class?(from_trace, to_trace)
19
+
20
+ build(
21
+ :call,
22
+ from: participant_for(from_trace),
23
+ to: participant_for(to_trace),
24
+ content: formatter.format_call,
25
+ )
26
+ end
27
+
28
+ def build_return_message(from_trace, to_trace)
29
+ return if same_class?(from_trace, to_trace)
30
+
31
+ build(
32
+ :return,
33
+ from: participant_for(from_trace),
34
+ to: participant_for(to_trace),
35
+ content: formatter.format_return,
36
+ )
37
+ end
38
+
39
+ def build_loop_start_message(trace)
40
+ build(:loop_start, content: "#{trace.count} calls")
41
+ end
42
+
43
+ def build_loop_end_message
44
+ build(:loop_end)
45
+ end
46
+
47
+ def build_activate_message(trace)
48
+ build(:activate, to: participant_for(trace))
49
+ end
50
+
51
+ def build_deactivate_message(trace)
52
+ build(:deactivate, to: participant_for(trace))
53
+ end
54
+
55
+ def build_internal_message(trace)
56
+ build(
57
+ :call,
58
+ from: participant_for(trace),
59
+ to: participant_for(trace),
60
+ content: formatter.format_internal_message(trace),
61
+ )
62
+ end
63
+
64
+ def build_note(trace)
65
+ build(
66
+ :note,
67
+ from: participant_for(trace),
68
+ to: participant_for(trace),
69
+ content: formatter.format_result(trace),
70
+ )
71
+ end
72
+
73
+ private
74
+
75
+ attr_reader :formatter, :participants_manager
76
+
77
+ def build(type, from: nil, to: nil, content: "")
78
+ Models::Message.new(
79
+ type: type,
80
+ from: from,
81
+ to: to,
82
+ content: content,
83
+ )
84
+ end
85
+
86
+ def same_class?(from_trace, to_trace)
87
+ from_trace.klass == to_trace.klass
88
+ end
89
+
90
+ def participant_for(trace)
91
+ participants_manager.find(trace.klass)
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "trace_viz/models/diagram"
4
+ require "trace_viz/extractors/diagram/box_extractor"
5
+ require "trace_viz/extractors/diagram/message_extractor"
6
+ require_relative "base_builder"
7
+
8
+ module TraceViz
9
+ module Builders
10
+ module Diagram
11
+ class SequenceBuilder < BaseBuilder
12
+ def initialize(collector)
13
+ super()
14
+ @collector = collector
15
+ end
16
+
17
+ def build
18
+ Models::Diagram.new.tap do |diagram|
19
+ add_boxes_to(diagram)
20
+ add_messages_to(diagram)
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ attr_reader :collector
27
+
28
+ def add_boxes_to(diagram)
29
+ boxes.each { |box| diagram.add_box(box) }
30
+ end
31
+
32
+ def add_messages_to(diagram)
33
+ messages.each { |message| diagram.add_message(message) }
34
+ end
35
+
36
+ def boxes
37
+ @boxes ||= Extractors::Diagram::BoxExtractor.new(collector).extract
38
+ end
39
+
40
+ def participants
41
+ @participants ||= boxes.flat_map(&:participants)
42
+ end
43
+
44
+ def messages
45
+ @messages ||= Extractors::Diagram::MessageExtractor.new(collector, participants).extract
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -1,38 +1,40 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "trace_viz/context"
4
- require "trace_viz/loggers/trace_logger"
5
- require_relative "evaluators/filter_evaluator"
6
- require_relative "evaluators/hidden_evaluator"
3
+ require "trace_viz/helpers"
4
+ require "trace_viz/loggers/logging_manager"
5
+ require_relative "hierarchy_linker"
6
+ require_relative "trace_stats"
7
+ require_relative "trace_pipeline_builder"
7
8
 
8
9
  module TraceViz
9
10
  module Collectors
10
11
  class BaseCollector
11
- attr_reader :collection, :stats
12
+ include Helpers::ConfigHelper
13
+ include Helpers::TrackingHelper
14
+
15
+ attr_reader :collection, :hierarchy, :stats, :renderer
12
16
 
13
17
  # To implement collect trace data from the given event,
14
18
  # you need to enter the `config` context to perform the evaluation.
15
19
  def initialize
16
- @tracker = Context.for(:tracking)
17
- @stats = TraceStats.new
18
-
19
- @collection = []
20
+ setup_logger
21
+ setup_stats
22
+ setup_pipeline
23
+ setup_hierarchy
20
24
 
21
- @filter_evaluator = Evaluators::FilterEvaluator.new
22
- @hidden_evaluator = Evaluators::HiddenEvaluator.new
25
+ clear
23
26
  end
24
27
 
25
28
  def collect(event)
26
- return unless collectible?(event)
29
+ return unless can_collect?(event)
27
30
 
28
31
  trace_data = build_trace(event)
29
- return unless valid?(trace_data)
32
+ processed_data = process_trace(trace_data)
30
33
 
31
- trace_data = update_trace_depth(trace_data)
32
- return if hidden?(trace_data)
34
+ return unless processed_data
33
35
 
34
- log_trace(trace_data)
35
- store_trace(trace_data)
36
+ store_trace(processed_data)
37
+ link_to_hierarchy(processed_data)
36
38
  end
37
39
 
38
40
  def clear
@@ -41,43 +43,48 @@ module TraceViz
41
43
 
42
44
  private
43
45
 
44
- attr_reader :tracker,
45
- :filter_evaluator,
46
- :hidden_evaluator
46
+ attr_reader :logger, :pipeline
47
47
 
48
- # Checks if trace data is collectible.
49
- def collectible?(event)
50
- raise NotImplementedError
48
+ def setup_logger
49
+ @logger = Loggers::LoggingManager.new
51
50
  end
52
51
 
53
- # Validates trace data against filters.
54
- def valid?(trace_data)
55
- filter_evaluator.pass?(trace_data)
52
+ def setup_stats
53
+ @stats = TraceStats.new
56
54
  end
57
55
 
58
- # Checks if trace data should be hidden.
59
- def hidden?(trace_data)
60
- hidden_evaluator.pass?(trace_data)
56
+ def setup_pipeline
57
+ @pipeline = TracePipelineBuilder.build
61
58
  end
62
59
 
63
- # Builds trace data from the given data.
64
- def build_trace(event)
65
- raise NotImplementedError
60
+ def setup_hierarchy
61
+ @hierarchy = TraceData::HierarchyLinker.new
62
+ end
63
+
64
+ def process_trace(trace_data)
65
+ pipeline.process(trace_data)
66
66
  end
67
67
 
68
- def update_trace_depth(trace_data)
68
+ # Base on trace-event for specific adapter
69
+ def can_collect?(event)
69
70
  raise NotImplementedError
70
71
  end
71
72
 
72
- def log_trace(trace_data)
73
- Loggers::TraceLogger.log(trace_data)
73
+ # Builds trace data from the trace-event for specific adapter
74
+ def build_trace(event)
75
+ raise NotImplementedError
74
76
  end
75
77
 
76
78
  def store_trace(trace_data)
79
+ logger.log_runtime_trace(trace_data)
77
80
  stats.update(trace_data)
78
81
 
79
82
  @collection << trace_data
80
83
  end
84
+
85
+ def link_to_hierarchy(trace_data)
86
+ hierarchy.link(trace_data)
87
+ end
81
88
  end
82
89
  end
83
90
  end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base_filter"
4
+
5
+ module TraceViz
6
+ module Collectors
7
+ module Filters
8
+ class BaseClassFilter < BaseFilter
9
+ def initialize(classes:)
10
+ super()
11
+ @classes_and_modules = classes.map(&:to_s).freeze
12
+ end
13
+
14
+ protected
15
+
16
+ attr_reader :classes_and_modules
17
+
18
+ def normalize_class_name(klass)
19
+ # Normalize class/module names to handle dynamic/nested representations
20
+ klass.to_s
21
+ .gsub(/^#<Class/, "<Class")
22
+ .strip
23
+ end
24
+
25
+ def matches_hierarchy?(klass_name, target_name)
26
+ klass_name == target_name || klass_name.start_with?("#{target_name}::")
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base_class_filter"
4
+
5
+ module TraceViz
6
+ module Collectors
7
+ module Filters
8
+ class BaseExcludeFilter < BaseClassFilter
9
+ def apply?(trace_data)
10
+ klass_name = normalize_class_name(trace_data.klass)
11
+ !classes_and_modules.any? { |excluded| matches_hierarchy?(klass_name, excluded) }
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -1,22 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "trace_viz/context"
3
+ require "trace_viz/helpers"
4
4
 
5
5
  module TraceViz
6
6
  module Collectors
7
7
  module Filters
8
8
  class BaseFilter
9
- def initialize
10
- @config = Context.for(:config).configuration
11
- end
9
+ include Helpers::ConfigHelper
12
10
 
13
11
  def apply?(trace_data)
14
12
  raise NotImplementedError
15
13
  end
16
-
17
- private
18
-
19
- attr_reader :config
20
14
  end
21
15
  end
22
16
  end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base_class_filter"
4
+
5
+ module TraceViz
6
+ module Collectors
7
+ module Filters
8
+ class BaseIncludeFilter < BaseClassFilter
9
+ def apply?(trace_data)
10
+ klass_name = normalize_class_name(trace_data.klass)
11
+ classes_and_modules.any? { |allowed| matches_hierarchy?(klass_name, allowed) }
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -1,26 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "base_filter"
3
+ require_relative "base_exclude_filter"
4
4
 
5
5
  module TraceViz
6
6
  module Collectors
7
7
  module Filters
8
- class ExcludeClassesFilter < BaseFilter
9
- def initialize(**options)
10
- super()
11
- @excluded_classes = options[:classes].map(&:to_s).freeze
12
- end
13
-
14
- def apply?(trace_data)
15
- !exclude_class?(trace_data.klass)
16
- end
17
-
18
- private
19
-
20
- attr_reader :excluded_classes
21
-
22
- def exclude_class?(klass)
23
- excluded_classes.include?(klass.to_s)
8
+ class ExcludeClassesFilter < BaseExcludeFilter
9
+ def initialize(classes:)
10
+ super(classes: classes)
24
11
  end
25
12
  end
26
13
  end
@@ -1,36 +1,32 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "set"
4
- require_relative "base_filter"
3
+ require_relative "base_exclude_filter"
5
4
 
6
5
  module TraceViz
7
6
  module Collectors
8
7
  module Filters
9
- class ExcludeDefaultClassesFilter < BaseFilter
10
- RUBY_CORE_CLASSES = Set.new([
11
- Object,
12
- String,
13
- Array,
14
- Hash,
15
- Numeric,
16
- Integer,
17
- Float,
18
- Symbol,
19
- Kernel,
20
- Module,
21
- Class,
22
- Range,
23
- Regexp,
24
- ].map(&:to_s).freeze)
8
+ class ExcludeDefaultClassesFilter < BaseExcludeFilter
9
+ DEFAULT_CLASSES_AND_MODULES = [
10
+ "Object",
11
+ "String",
12
+ "Array",
13
+ "Hash",
14
+ "Numeric",
15
+ "Integer",
16
+ "Float",
17
+ "Symbol",
18
+ "Kernel",
19
+ "Module",
20
+ "Class",
21
+ "Range",
22
+ "Regexp",
23
+ "BigDecimal",
24
+ "Set",
25
+ "Gem",
26
+ ].freeze
25
27
 
26
- def apply?(trace_data)
27
- !excluded_class?(trace_data.klass)
28
- end
29
-
30
- private
31
-
32
- def excluded_class?(klass)
33
- RUBY_CORE_CLASSES.include?(klass.to_s)
28
+ def initialize
29
+ super(classes: DEFAULT_CLASSES_AND_MODULES)
34
30
  end
35
31
  end
36
32
  end
@@ -1,26 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "base_filter"
3
+ require_relative "base_include_filter"
4
4
 
5
5
  module TraceViz
6
6
  module Collectors
7
7
  module Filters
8
- class IncludeClassesFilter < BaseFilter
9
- def initialize(**options)
10
- super()
11
- @allowed_classes = options[:classes].map(&:to_s).freeze
12
- end
13
-
14
- def apply?(trace_data)
15
- include_class?(trace_data.klass)
16
- end
17
-
18
- private
19
-
20
- attr_reader :allowed_classes
21
-
22
- def include_class?(klass)
23
- allowed_classes.include?(klass.to_s)
8
+ class IncludeClassesFilter < BaseIncludeFilter
9
+ def initialize(classes:)
10
+ super(classes: classes)
24
11
  end
25
12
  end
26
13
  end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "trace_viz/trace_data/root_node"
4
+
5
+ module TraceViz
6
+ module TraceData
7
+ class HierarchyLinker
8
+ attr_reader :root
9
+
10
+ def initialize
11
+ @root = RootNode.new
12
+ end
13
+
14
+ def link(trace_data)
15
+ return unless valid?(trace_data)
16
+
17
+ root.add_child(trace_data)
18
+ end
19
+
20
+ private
21
+
22
+ def valid?(trace_data)
23
+ [
24
+ trace_data.event == :call,
25
+ trace_data.parent.nil?,
26
+ ].all?
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TraceViz
4
+ module Collectors
5
+ module Matchers
6
+ class BaseMatcher
7
+ def matches?
8
+ false
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,12 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "trace_viz/utils/id_generator"
4
+ require "trace_viz/helpers/tracking_helper"
5
+ require_relative "base_matcher"
6
+
3
7
  module TraceViz
4
8
  module Collectors
5
9
  module Matchers
6
- class TracePointActionMatcher
7
- def initialize
8
- @tracker = Context.for(:tracking)
9
- end
10
+ class TracePointActionMatcher < BaseMatcher
11
+ include Helpers::TrackingHelper
10
12
 
11
13
  def matches?(trace_point)
12
14
  current_action_id == build_action_id(trace_point)
@@ -14,8 +16,6 @@ module TraceViz
14
16
 
15
17
  private
16
18
 
17
- attr_reader :tracker
18
-
19
19
  def current_action
20
20
  tracker.active_calls.current
21
21
  end
@@ -25,11 +25,13 @@ module TraceViz
25
25
  end
26
26
 
27
27
  def build_action_id(trace_point)
28
- [
29
- trace_point.self.object_id,
30
- trace_point.callee_id,
31
- ].join("_")
28
+ Utils::IDGenerator.generate_action_id(
29
+ memory_id: trace_point.self.object_id,
30
+ action: trace_point.callee_id,
31
+ )
32
32
  end
33
+
34
+ private :tracker, :active_call_stack, :current_call, :current_depth
33
35
  end
34
36
  end
35
37
  end