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.
- checksums.yaml +4 -4
- data/README.md +68 -43
- data/Steepfile +34 -0
- data/examples/eu_central_bank.rb +69 -0
- data/examples/example.cast +189 -285
- data/lib/trace_viz/adapters/base_adapter.rb +24 -1
- data/lib/trace_viz/adapters/trace_point_adapter.rb +3 -10
- data/lib/trace_viz/builders/base_builder.rb +11 -0
- data/lib/trace_viz/builders/diagram/base_builder.rb +10 -0
- data/lib/trace_viz/builders/diagram/message_builder.rb +96 -0
- data/lib/trace_viz/builders/diagram/sequence_builder.rb +50 -0
- data/lib/trace_viz/collectors/base_collector.rb +42 -35
- data/lib/trace_viz/collectors/filters/base_class_filter.rb +31 -0
- data/lib/trace_viz/collectors/filters/base_exclude_filter.rb +16 -0
- data/lib/trace_viz/collectors/filters/base_filter.rb +2 -8
- data/lib/trace_viz/collectors/filters/base_include_filter.rb +16 -0
- data/lib/trace_viz/collectors/filters/exclude_classes_filter.rb +4 -17
- data/lib/trace_viz/collectors/filters/exclude_default_classes_filter.rb +22 -26
- data/lib/trace_viz/collectors/filters/include_classes_filter.rb +4 -17
- data/lib/trace_viz/collectors/hierarchy_linker.rb +30 -0
- data/lib/trace_viz/collectors/matchers/base_matcher.rb +13 -0
- data/lib/trace_viz/collectors/matchers/trace_point_action_matcher.rb +12 -10
- data/lib/trace_viz/collectors/matchers/within_depth_matcher.rb +6 -5
- data/lib/trace_viz/collectors/steps/assign_depth_for_call_step.rb +30 -0
- data/lib/trace_viz/collectors/steps/assign_depth_for_return_step.rb +39 -0
- data/lib/trace_viz/collectors/steps/base_step.rb +27 -0
- data/lib/trace_viz/collectors/steps/build_hierarchy_step.rb +32 -0
- data/lib/trace_viz/collectors/{evaluators/hidden_evaluator.rb → steps/hidden_step.rb} +9 -5
- data/lib/trace_viz/collectors/steps/linking_step.rb +36 -0
- data/lib/trace_viz/collectors/{evaluators/filter_evaluator.rb → steps/validation_step.rb} +9 -6
- data/lib/trace_viz/collectors/steps.rb +10 -0
- data/lib/trace_viz/collectors/trace_pipeline.rb +26 -0
- data/lib/trace_viz/collectors/trace_pipeline_builder.rb +29 -0
- data/lib/trace_viz/collectors/trace_point_collector.rb +1 -11
- data/lib/trace_viz/config/validator.rb +6 -5
- data/lib/trace_viz/configuration.rb +3 -3
- data/lib/trace_viz/context/tracking_context.rb +4 -0
- data/lib/trace_viz/core/tracer.rb +2 -0
- data/lib/trace_viz/defaults/actions.rb +84 -0
- data/lib/trace_viz/defaults/colors.rb +61 -0
- data/lib/trace_viz/defaults/config.rb +91 -0
- data/lib/trace_viz/defaults/themes.rb +66 -0
- data/lib/trace_viz/defaults.rb +10 -129
- data/lib/trace_viz/exporters/base_exporter.rb +31 -13
- data/lib/trace_viz/exporters/export_manager.rb +33 -0
- data/lib/trace_viz/exporters/mermaid_exporter.rb +17 -0
- data/lib/trace_viz/exporters/registry.rb +27 -0
- data/lib/trace_viz/exporters/text_exporter.rb +2 -2
- data/lib/trace_viz/extractors/base_extractor.rb +17 -0
- data/lib/trace_viz/extractors/diagram/base_extractor.rb +18 -0
- data/lib/trace_viz/extractors/diagram/box_extractor.rb +50 -0
- data/lib/trace_viz/extractors/diagram/message_extractor.rb +23 -0
- data/lib/trace_viz/extractors/diagram/participant_extractor.rb +37 -0
- data/lib/trace_viz/extractors/diagram/processors/message_processor.rb +93 -0
- data/lib/trace_viz/formatters/base_formatter.rb +4 -30
- data/lib/trace_viz/formatters/base_formatter_factory.rb +23 -0
- data/lib/trace_viz/formatters/diagram/sequence/base_formatter.rb +14 -0
- data/lib/trace_viz/formatters/diagram/sequence/message_formatter.rb +37 -0
- data/lib/trace_viz/formatters/diagram_formatter.rb +10 -0
- data/lib/trace_viz/formatters/export/base_formatter.rb +12 -0
- data/lib/trace_viz/formatters/export/formatter_factory.rb +22 -0
- data/lib/trace_viz/formatters/export/method_call_formatter.rb +21 -0
- data/lib/trace_viz/formatters/export/method_return_formatter.rb +22 -0
- data/lib/trace_viz/formatters/export/summary_group_formatter.rb +35 -0
- data/lib/trace_viz/formatters/helpers/depth_helper.rb +2 -8
- data/lib/trace_viz/formatters/helpers/digram/action_helper.rb +17 -0
- data/lib/trace_viz/formatters/helpers/digram/result_helper.rb +39 -0
- data/lib/trace_viz/formatters/helpers/indent_helper.rb +1 -1
- data/lib/trace_viz/formatters/helpers/log/color_helper.rb +23 -0
- data/lib/trace_viz/formatters/helpers/log/depth_helper.rb +22 -0
- data/lib/trace_viz/formatters/helpers/log/method_name_helper.rb +29 -0
- data/lib/trace_viz/formatters/helpers/log/params_helper.rb +55 -0
- data/lib/trace_viz/formatters/helpers/log/result_helper.rb +27 -0
- data/lib/trace_viz/formatters/helpers/log/summary/params_helper.rb +57 -0
- data/lib/trace_viz/formatters/helpers/method_details_helper.rb +1 -1
- data/lib/trace_viz/formatters/helpers/params_helper.rb +30 -9
- data/lib/trace_viz/formatters/helpers/result_helper.rb +5 -4
- data/lib/trace_viz/formatters/helpers/source_helper.rb +6 -4
- data/lib/trace_viz/formatters/helpers/summary/params_helper.rb +45 -0
- data/lib/trace_viz/formatters/helpers/summary/source_helper.rb +24 -0
- data/lib/trace_viz/formatters/helpers/time_helper.rb +2 -2
- data/lib/trace_viz/formatters/helpers.rb +10 -0
- data/lib/trace_viz/formatters/log/base_formatter.rb +13 -0
- data/lib/trace_viz/formatters/log/formatter_factory.rb +22 -0
- data/lib/trace_viz/formatters/log/method_call_formatter.rb +34 -0
- data/lib/trace_viz/formatters/log/method_return_formatter.rb +24 -0
- data/lib/trace_viz/formatters/log/summary_group_formatter.rb +40 -0
- data/lib/trace_viz/formatters/log/verbose_formatter.rb +14 -0
- data/lib/trace_viz/formatters/trace_data_formatter.rb +24 -0
- data/lib/trace_viz/helpers/config_helper.rb +17 -0
- data/lib/trace_viz/helpers/trace_point/param_helper.rb +98 -0
- data/lib/trace_viz/helpers/tracking_helper.rb +26 -0
- data/lib/trace_viz/helpers.rb +9 -0
- data/lib/trace_viz/logger.rb +9 -20
- data/lib/trace_viz/loggers/base_logger.rb +29 -0
- data/lib/trace_viz/loggers/log_level_resolver.rb +18 -0
- data/lib/trace_viz/loggers/logging_manager.rb +46 -0
- data/lib/trace_viz/loggers/post_collection_logger.rb +44 -0
- data/lib/trace_viz/loggers/trace_logger.rb +14 -18
- data/lib/trace_viz/loggers/trace_stats_logger.rb +28 -14
- data/lib/trace_viz/managers/diagram/participant_manager.rb +23 -0
- data/lib/trace_viz/models/box.rb +19 -0
- data/lib/trace_viz/models/diagram.rb +27 -0
- data/lib/trace_viz/models/message.rb +16 -0
- data/lib/trace_viz/models/participant.rb +18 -0
- data/lib/trace_viz/models.rb +8 -0
- data/lib/trace_viz/renderers/base_renderer.rb +27 -0
- data/lib/trace_viz/renderers/diagram/sequence_renderer.rb +59 -0
- data/lib/trace_viz/renderers/render_context.rb +17 -0
- data/lib/trace_viz/renderers/renderer_builder.rb +20 -0
- data/lib/trace_viz/renderers/renderer_factory.rb +29 -0
- data/lib/trace_viz/renderers/summary_renderer.rb +34 -0
- data/lib/trace_viz/renderers/verbose_renderer.rb +29 -0
- data/lib/trace_viz/shared/renderer_helper.rb +25 -0
- data/lib/trace_viz/shared.rb +8 -0
- data/lib/trace_viz/syntax/mermaid/sequence_syntax.rb +99 -0
- data/lib/trace_viz/trace_data/base.rb +22 -22
- data/lib/trace_viz/trace_data/node.rb +39 -0
- data/lib/trace_viz/trace_data/root_node.rb +24 -0
- data/lib/trace_viz/trace_data/summary_node.rb +45 -0
- data/lib/trace_viz/trace_data/trace_point/base.rb +26 -31
- data/lib/trace_viz/trace_data/trace_point/method_call.rb +25 -16
- data/lib/trace_viz/trace_data/trace_point/method_return.rb +21 -1
- data/lib/trace_viz/traits/depth_trackable.rb +13 -0
- data/lib/trace_viz/traits/identifiable.rb +25 -0
- data/lib/trace_viz/traits/time_trackable.rb +13 -0
- data/lib/trace_viz/traits.rb +10 -0
- data/lib/trace_viz/transformers/base_transformer.rb +29 -0
- data/lib/trace_viz/transformers/summary_transformer.rb +70 -0
- data/lib/trace_viz/utils/alias_generator.rb +58 -0
- data/lib/trace_viz/utils/colorize.rb +6 -6
- data/lib/trace_viz/utils/format/key_value_formatter.rb +42 -0
- data/lib/trace_viz/utils/format/value_truncator.rb +123 -0
- data/lib/trace_viz/utils/id_generator.rb +35 -0
- data/lib/trace_viz/utils.rb +8 -0
- data/lib/trace_viz/version.rb +1 -1
- data/sig/adapters/base_adapter.rbs +11 -0
- data/sig/adapters/trace_point_adapter.rbs +13 -0
- data/sig/collectors/filters/registry.rbs +13 -0
- data/sig/collectors/trace_point_collector.rbs +17 -0
- data/sig/config/copier.rbs +15 -0
- data/sig/config/validator.rbs +18 -0
- data/sig/configuration.rbs +22 -0
- data/sig/context/base_context.rbs +9 -0
- data/sig/context/config_context.rbs +13 -0
- data/sig/context/manager.rbs +10 -0
- data/sig/context/map.rbs +13 -0
- data/sig/context.rbs +5 -0
- data/sig/core/tracer.rbs +7 -0
- data/sig/core.rbs +4 -0
- data/sig/defaults.rbs +17 -0
- data/sig/errors.rbs +13 -0
- data/sig/logger.rbs +33 -0
- data/sig/trace_viz.rbs +1 -2
- data/sig/utils/colorize.rbs +8 -0
- data/sig/utils/format_utils/key_value_formatter.rbs +16 -0
- data/sig/utils/format_utils/value_truncator.rbs +19 -0
- data/sig/utils/format_utils.rbs +8 -0
- data/sig/version.rbs +3 -0
- metadata +124 -18
- data/lib/trace_viz/collectors/depth_manager.rb +0 -37
- data/lib/trace_viz/collectors/evaluators/base_evaluator.rb +0 -23
- data/lib/trace_viz/exporters/formatters/base_formatter.rb +0 -12
- data/lib/trace_viz/exporters/formatters/method_call_formatter.rb +0 -21
- data/lib/trace_viz/exporters/formatters/method_return_formatter.rb +0 -22
- data/lib/trace_viz/exporters/transformers/base_transformer.rb +0 -25
- data/lib/trace_viz/exporters/transformers/text_transformer.rb +0 -28
- data/lib/trace_viz/loggers/trace_builder.rb +0 -30
- data/lib/trace_viz/loggers/trace_formatters/base_formatter.rb +0 -32
- data/lib/trace_viz/loggers/trace_formatters/method_call_formatter.rb +0 -21
- data/lib/trace_viz/loggers/trace_formatters/method_return_formatter.rb +0 -22
- 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
|
data/lib/trace_viz/defaults.rb
CHANGED
@@ -1,138 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
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
|
-
|
111
|
-
|
8
|
+
module TraceViz
|
9
|
+
module Defaults
|
10
|
+
@action_colors = Actions::COLORS.dup
|
112
11
|
|
113
12
|
class << self
|
114
|
-
|
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
|
135
|
-
|
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/
|
6
|
-
|
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
|
-
|
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 :
|
45
|
+
attr_reader :export_config, :logger, :collector, :renderer
|
36
46
|
|
37
|
-
def
|
38
|
-
|
39
|
-
transformer.transform
|
47
|
+
def renderer_mode
|
48
|
+
fetch_general_config(:mode)
|
40
49
|
end
|
41
50
|
|
42
51
|
def content
|
43
|
-
|
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
|
-
|
74
|
-
|
86
|
+
"#{export_directory}/trace_output#{file_extension}"
|
87
|
+
end
|
75
88
|
|
76
|
-
|
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,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
|
@@ -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
|
-
|
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
|
-
|
21
|
-
|
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
|