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
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TraceViz
4
+ module Defaults
5
+ class Themes
6
+ SOLARIZED = {
7
+ base03: :color_234,
8
+ base02: :color_235,
9
+ base01: :color_240,
10
+ base00: :color_241,
11
+ base0: :color_244,
12
+ base1: :color_245,
13
+ base2: :color_254,
14
+ base3: :color_230,
15
+ yellow: :color_136,
16
+ orange: :color_166,
17
+ red: :color_160,
18
+ magenta: :color_125,
19
+ violet: :color_61,
20
+ blue: :color_33,
21
+ cyan: :color_37,
22
+ green: :color_64,
23
+ }.freeze
24
+
25
+ class << self
26
+ def solarized
27
+ SOLARIZED
28
+ end
29
+
30
+ def apply_solarized_theme
31
+ colors = {
32
+ default: SOLARIZED[:base0],
33
+ info: SOLARIZED[:blue],
34
+ success: SOLARIZED[:green],
35
+ error: SOLARIZED[:red],
36
+ warn: SOLARIZED[:yellow],
37
+ start: SOLARIZED[:blue],
38
+ processing: SOLARIZED[:base01],
39
+ finish: SOLARIZED[:magenta],
40
+ exported: SOLARIZED[:green],
41
+ skipped: SOLARIZED[:base01],
42
+ stats: [:bold, :underline, SOLARIZED[:base2]],
43
+ trace_indent: SOLARIZED[:base03],
44
+ trace_depth: SOLARIZED[:blue],
45
+ trace_depth_prefix: [:italic, SOLARIZED[:base02]],
46
+ trace_depth_open: SOLARIZED[:base02],
47
+ trace_depth_value: SOLARIZED[:red],
48
+ trace_depth_close: SOLARIZED[:base03],
49
+ trace_method_name: SOLARIZED[:cyan],
50
+ trace_method_class: [:bold, SOLARIZED[:green]],
51
+ trace_method_sign: SOLARIZED[:violet],
52
+ trace_method_action: [:bold, SOLARIZED[:blue]],
53
+ trace_source_location: SOLARIZED[:base01],
54
+ trace_params_key: SOLARIZED[:orange],
55
+ trace_params_value: SOLARIZED[:base00],
56
+ trace_result_prefix: SOLARIZED[:base1],
57
+ trace_result_value: SOLARIZED[:base3],
58
+ trace_execution_time: SOLARIZED[:cyan],
59
+ }
60
+
61
+ Defaults.action_colors = colors
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -1,138 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module TraceViz
4
- class Defaults
5
- COLORS = {
6
- reset: "\e[0m",
7
- bold: "\e[1m",
8
- dim: "\e[2m",
9
- underline: "\e[4m",
10
- reverse: "\e[7m",
11
- black: "\e[30m",
12
- red: "\e[31m",
13
- green: "\e[32m",
14
- yellow: "\e[33m",
15
- blue: "\e[34m",
16
- magenta: "\e[35m",
17
- cyan: "\e[36m",
18
- light_gray: "\e[37m",
19
- dark_gray: "\e[90m",
20
- light_red: "\e[91m",
21
- light_green: "\e[92m",
22
- light_yellow: "\e[93m",
23
- light_blue: "\e[94m",
24
- light_magenta: "\e[95m",
25
- light_cyan: "\e[96m",
26
- white: "\e[97m",
27
- dim_light_gray: "\e[2;37m",
28
- }.freeze
29
-
30
- ACTION_EMOJIS = {
31
- default: "",
32
- info: "ℹ️",
33
- success: "✅",
34
- error: "❌",
35
- warn: "⚠️",
36
- start: "🚀",
37
- processing: "🔄",
38
- finish: "🏁",
39
- exported: "📤",
40
- skipped: "⏩",
41
- stats: "📊",
42
- }.freeze
43
-
44
- ACTION_COLORS = {
45
- default: :reset,
46
- info: :cyan,
47
- success: :green,
48
- error: :light_red,
49
- warn: :yellow,
50
- start: :light_cyan,
51
- processing: :dim_light_gray,
52
- finish: :light_magenta,
53
- exported: :light_green,
54
- skipped: :dark_gray,
55
- stats: :underline,
56
- }.freeze
57
-
58
- CONFIG = {
59
- general: {
60
- tab_size: 2,
61
- show_indent: true,
62
- show_depth: true,
63
- max_display_depth: 3,
64
- show_method_name: true,
65
- },
66
- source_location: {
67
- show: false,
68
- truncate_length: 100,
69
- },
70
- params: {
71
- show: true,
72
- mode: :name_and_value,
73
- truncate_values: 50,
74
- },
75
- result: {
76
- show: true,
77
- truncate_length: 50,
78
- },
79
- execution: {
80
- show_time: true,
81
- show_trace_events: [:call, :return],
82
- },
83
- filters: [
84
- :exclude_internal_call,
85
- # :exclude_default_classes,
86
- # :exclude_rails_framework,
87
- # include_classes: {
88
- # classes: [],
89
- # },
90
- # exclude_classes: {
91
- # classes: [],
92
- # },
93
- # include_gems: {
94
- # app_running: true,
95
- # app_path: Dir.pwd,
96
- # gems: [],
97
- # },
98
- # exclude_gems: {
99
- # gems: [],
100
- # },
101
- ],
102
- export: {
103
- enabled: true,
104
- path: "tmp",
105
- format: :txt,
106
- overwrite: false,
107
- },
108
- }.freeze
3
+ require_relative "defaults/config"
4
+ require_relative "defaults/colors"
5
+ require_relative "defaults/themes"
6
+ require_relative "defaults/actions"
109
7
 
110
- VALID_PARAM_MODES = [:name_and_value, :name_only, :value_only].freeze
111
- VALID_EXPORT_FORMATS = [:txt, :json, :yml].freeze
8
+ module TraceViz
9
+ module Defaults
10
+ @action_colors = Actions::COLORS.dup
112
11
 
113
12
  class << self
114
- def colors
115
- COLORS
116
- end
117
-
118
- def action_colors
119
- ACTION_COLORS
120
- end
121
-
122
- def action_emojis
123
- ACTION_EMOJIS
124
- end
125
-
126
- def fetch_defaults
127
- CONFIG.dup
128
- end
129
-
130
- def valid_param_modes
131
- VALID_PARAM_MODES
132
- end
13
+ attr_reader :action_colors
133
14
 
134
- def valid_export_formats
135
- VALID_EXPORT_FORMATS
15
+ def action_colors=(new_colors)
16
+ @action_colors.merge!(new_colors)
136
17
  end
137
18
  end
138
19
  end
@@ -1,18 +1,28 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "fileutils"
4
-
5
- require "trace_viz/context"
6
- require_relative "transformers/text_transformer"
4
+ require "trace_viz/helpers"
5
+ require "trace_viz/shared"
6
+ require "trace_viz/renderers/renderer_builder"
7
+ require "trace_viz/formatters/export/formatter_factory"
7
8
 
8
9
  module TraceViz
9
10
  module Exporters
10
11
  class BaseExporter
12
+ include Helpers::ConfigHelper
13
+ include Shared::RendererHelper
14
+
11
15
  def initialize(collector)
12
- @config = Context.for(:config).configuration
13
16
  @export_config = config.export
14
17
  @logger = config.logger
15
- @data = transform_collector_data(collector)
18
+
19
+ @collector = collector
20
+
21
+ @renderer = Renderers::RendererBuilder.build(
22
+ collector,
23
+ key: renderer_mode,
24
+ formatter_factory: Formatters::Export::FormatterFactory.new,
25
+ )
16
26
  end
17
27
 
18
28
  def export
@@ -32,15 +42,18 @@ module TraceViz
32
42
 
33
43
  private
34
44
 
35
- attr_reader :config, :export_config, :logger, :data
45
+ attr_reader :export_config, :logger, :collector, :renderer
36
46
 
37
- def transform_collector_data(collector)
38
- transformer = Transformers::TextTransformer.new(collector)
39
- transformer.transform
47
+ def renderer_mode
48
+ fetch_general_config(:mode)
40
49
  end
41
50
 
42
51
  def content
43
- raise NotImplementedError
52
+ data.join("\n")
53
+ end
54
+
55
+ def data
56
+ process_lines(renderer.to_lines) { |line| line[:line] }
44
57
  end
45
58
 
46
59
  def export_enabled?
@@ -70,10 +83,15 @@ module TraceViz
70
83
  end
71
84
 
72
85
  def file_path
73
- format = export_config[:format]
74
- path = export_config[:path]
86
+ "#{export_directory}/trace_output#{file_extension}"
87
+ end
75
88
 
76
- "#{path}/trace_output.#{format}"
89
+ def export_directory
90
+ export_config[:path]
91
+ end
92
+
93
+ def file_extension
94
+ raise NotImplementedError
77
95
  end
78
96
 
79
97
  def write_file(data)
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "trace_viz/helpers"
4
+ require_relative "registry"
5
+
6
+ module TraceViz
7
+ module Exporters
8
+ class ExportManager
9
+ include Helpers::ConfigHelper
10
+
11
+ def export(collector)
12
+ return unless export_enabled?
13
+
14
+ exporter = build_exporter(collector)
15
+ exporter.export
16
+ end
17
+
18
+ private
19
+
20
+ def build_exporter(collector)
21
+ Registry.build(export_format, collector)
22
+ end
23
+
24
+ def export_format
25
+ config.export[:format]
26
+ end
27
+
28
+ def export_enabled?
29
+ config.export[:enabled]
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TraceViz
4
+ module Exporters
5
+ class MermaidExporter < BaseExporter
6
+ private
7
+
8
+ def renderer_mode
9
+ :sequence_diagram
10
+ end
11
+
12
+ def file_extension
13
+ ".mmd"
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "text_exporter"
4
+ require_relative "mermaid_exporter"
5
+
6
+ module TraceViz
7
+ module Exporters
8
+ class Registry
9
+ EXPORTS = {
10
+ txt: TextExporter,
11
+ mermaid: MermaidExporter,
12
+ }
13
+
14
+ class << self
15
+ def build(format, *options)
16
+ raise ArgumentError unless supported_formats.include?(format)
17
+
18
+ EXPORTS[format].new(*options)
19
+ end
20
+
21
+ def supported_formats
22
+ EXPORTS.keys
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -7,8 +7,8 @@ module TraceViz
7
7
  class TextExporter < BaseExporter
8
8
  private
9
9
 
10
- def content
11
- data.join("\n")
10
+ def file_extension
11
+ ".txt"
12
12
  end
13
13
  end
14
14
  end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TraceViz
4
+ module Extractors
5
+ class BaseExtractor
6
+ attr_reader :collector
7
+
8
+ def initialize(collector)
9
+ @collector = collector
10
+ end
11
+
12
+ def extract
13
+ raise NotImplementedError
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "trace_viz/transformers/summary_transformer"
4
+ require_relative "../base_extractor"
5
+
6
+ module TraceViz
7
+ module Extractors
8
+ module Diagram
9
+ class BaseExtractor < BaseExtractor
10
+ private
11
+
12
+ def data
13
+ @data ||= Transformers::SummaryTransformer.new(collector).transform
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base_extractor"
4
+ require_relative "participant_extractor"
5
+ require "trace_viz/models/box"
6
+
7
+ module TraceViz
8
+ module Extractors
9
+ module Diagram
10
+ class BoxExtractor < BaseExtractor
11
+ def initialize(collector)
12
+ super(collector)
13
+
14
+ @participants = ParticipantExtractor.new(collector).extract
15
+ end
16
+
17
+ def extract
18
+ grouped_participants = group_by_namespace(@participants)
19
+
20
+ grouped_participants.map do |namespace, participants|
21
+ box = Models::Box.new(
22
+ color: random_rgb,
23
+ description: namespace,
24
+ )
25
+
26
+ participants.each do |participant|
27
+ box.add_participant(participant)
28
+ end
29
+
30
+ box
31
+ end
32
+ end
33
+
34
+ private
35
+
36
+ def group_by_namespace(participants)
37
+ participants.group_by { |participant| extract_namespace(participant.name) }
38
+ end
39
+
40
+ def extract_namespace(klass_name)
41
+ klass_name.split("::").first
42
+ end
43
+
44
+ def random_rgb
45
+ "rgb(#{rand(200..255)}, #{rand(200..255)}, #{rand(200..255)})"
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "processors/message_processor"
4
+ require_relative "base_extractor"
5
+
6
+ module TraceViz
7
+ module Extractors
8
+ module Diagram
9
+ class MessageExtractor < BaseExtractor
10
+ def initialize(collector, participants)
11
+ super(collector)
12
+
13
+ @node_processor = Processors::MessageProcessor.new(participants)
14
+ end
15
+
16
+ def extract
17
+ root = data
18
+ root.children.flat_map { |child| @node_processor.process_node(child) }
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "trace_viz/utils/alias_generator"
4
+ require "trace_viz/models/participant"
5
+ require_relative "base_extractor"
6
+
7
+ module TraceViz
8
+ module Extractors
9
+ module Diagram
10
+ class ParticipantExtractor < BaseExtractor
11
+ def extract
12
+ unique_names = data.map(&:klass).uniq
13
+
14
+ assigned_aliases = {}
15
+
16
+ unique_names.map do |raw_name|
17
+ alias_name = Utils::AliasGenerator.generate(
18
+ name: raw_name,
19
+ assigned_aliases: assigned_aliases,
20
+ )
21
+
22
+ Models::Participant.new(
23
+ name: raw_name.to_s,
24
+ alias_name: alias_name,
25
+ )
26
+ end
27
+ end
28
+
29
+ private
30
+
31
+ def data
32
+ collector.collection
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,93 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "trace_viz/formatters/diagram/sequence/message_formatter"
4
+ require "trace_viz/builders/diagram/message_builder"
5
+
6
+ module TraceViz
7
+ module Extractors
8
+ module Diagram
9
+ module Processors
10
+ class MessageProcessor
11
+ def initialize(participants)
12
+ @formatter = Formatters::Diagram::Sequence::MessageFormatter.new
13
+ @message_builder = Builders::Diagram::MessageBuilder.new(@formatter, participants)
14
+ end
15
+
16
+ def process_node(node, caller_node = nil)
17
+ trace = node.data
18
+ caller_trace = caller_node&.data
19
+
20
+ [].tap do |messages|
21
+ # Handle participant transitions
22
+ messages << @message_builder.build_call_message(
23
+ caller_trace,
24
+ trace,
25
+ ) if caller_trace
26
+
27
+ # Process the current node
28
+ messages << handle_loop_start(trace)
29
+ messages << handle_internal_message(trace)
30
+ messages << handle_note(trace)
31
+ messages << handle_activation(trace)
32
+ messages.concat(process_children(node))
33
+ messages << handle_deactivation(trace)
34
+ messages << handle_loop_end(trace)
35
+
36
+ # Update the current node after processing
37
+ messages << @message_builder.build_return_message(
38
+ trace,
39
+ caller_trace,
40
+ ) if caller_trace
41
+ end.compact
42
+ end
43
+
44
+ private
45
+
46
+ def handle_loop_start(trace)
47
+ return unless loop?(trace)
48
+
49
+ @message_builder.build_loop_start_message(trace)
50
+ end
51
+
52
+ def handle_internal_message(trace)
53
+ @message_builder.build_internal_message(trace)
54
+ end
55
+
56
+ def handle_note(trace)
57
+ @message_builder.build_note(trace)
58
+ end
59
+
60
+ def handle_activation(trace)
61
+ return unless node_has_children?(trace)
62
+
63
+ @message_builder.build_activate_message(trace)
64
+ end
65
+
66
+ def handle_deactivation(trace)
67
+ return unless node_has_children?(trace)
68
+
69
+ @message_builder.build_deactivate_message(trace)
70
+ end
71
+
72
+ def handle_loop_end(trace)
73
+ return unless loop?(trace)
74
+
75
+ @message_builder.build_loop_end_message
76
+ end
77
+
78
+ def process_children(node)
79
+ node.children.flat_map { |child| process_node(child, node) }
80
+ end
81
+
82
+ def loop?(trace)
83
+ trace.key == :summary_group
84
+ end
85
+
86
+ def node_has_children?(trace)
87
+ trace.children.any?
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
@@ -1,42 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "helpers/indent_helper"
4
- require_relative "helpers/depth_helper"
5
- require_relative "helpers/time_helper"
6
- require_relative "helpers/params_helper"
7
- require_relative "helpers/source_helper"
8
- require_relative "helpers/result_helper"
9
- require_relative "helpers/method_details_helper"
3
+ require "trace_viz/helpers"
10
4
 
11
5
  module TraceViz
12
6
  module Formatters
13
7
  class BaseFormatter
14
- #
15
- # General formatting methods for TraceData::Base
16
- # These methods are used to format the output of the trace data
17
- # based on the configuration settings.
18
- #
8
+ include Helpers::ConfigHelper
19
9
 
20
- include Helpers::IndentHelper
21
- include Helpers::DepthHelper
22
- include Helpers::TimeHelper
23
- include Helpers::ParamsHelper
24
- include Helpers::SourceHelper
25
- include Helpers::ResultHelper
26
- include Helpers::MethodDetailsHelper
27
-
28
- def initialize(trace_data)
29
- @trace_data = trace_data
30
- @config = @trace_data.config
31
- end
32
-
33
- def format
10
+ # Format the data to a line
11
+ def call
34
12
  raise NotImplementedError
35
13
  end
36
-
37
- private
38
-
39
- attr_reader :trace_data, :config
40
14
  end
41
15
  end
42
16
  end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TraceViz
4
+ module Formatters
5
+ class BaseFormatterFactory
6
+ def initialize(formatters)
7
+ @formatters = formatters.freeze
8
+ end
9
+
10
+ def fetch_formatter(key)
11
+ @formatters.fetch(key) do
12
+ raise ArgumentError, "Unsupported formatter key: #{key}. Available keys: #{available_keys.join(", ")}"
13
+ end
14
+ end
15
+
16
+ private
17
+
18
+ def available_keys
19
+ @formatters.keys
20
+ end
21
+ end
22
+ end
23
+ end