trace_viz 0.0.1 → 1.0.0

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 (157) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +34 -0
  3. data/README.md +134 -39
  4. data/Steepfile +34 -0
  5. data/examples/eu_central_bank.rb +69 -0
  6. data/examples/example.cast +189 -0
  7. data/examples/example.rb +94 -23
  8. data/lib/trace_viz/adapters/base_adapter.rb +23 -2
  9. data/lib/trace_viz/adapters/trace_point_adapter.rb +10 -11
  10. data/lib/trace_viz/collectors/base_collector.rb +90 -0
  11. data/lib/trace_viz/collectors/filters/base_class_filter.rb +29 -0
  12. data/lib/trace_viz/collectors/filters/base_exclude_filter.rb +16 -0
  13. data/lib/trace_viz/collectors/filters/base_filter.rb +17 -0
  14. data/lib/trace_viz/collectors/filters/base_include_filter.rb +16 -0
  15. data/lib/trace_viz/collectors/filters/exclude_classes_filter.rb +15 -0
  16. data/lib/trace_viz/collectors/filters/exclude_default_classes_filter.rb +34 -0
  17. data/lib/trace_viz/collectors/filters/exclude_gems_filter.rb +30 -0
  18. data/lib/trace_viz/collectors/filters/exclude_internal_call_filter.rb +31 -0
  19. data/lib/trace_viz/collectors/filters/exclude_rails_framework_filter.rb +38 -0
  20. data/lib/trace_viz/collectors/filters/include_classes_filter.rb +15 -0
  21. data/lib/trace_viz/collectors/filters/include_gems_filter.rb +54 -0
  22. data/lib/trace_viz/collectors/filters/registry.rb +59 -0
  23. data/lib/trace_viz/collectors/hierarchy_linker.rb +30 -0
  24. data/lib/trace_viz/collectors/matchers/base_matcher.rb +13 -0
  25. data/lib/trace_viz/collectors/matchers/trace_point_action_matcher.rb +38 -0
  26. data/lib/trace_viz/collectors/matchers/within_depth_matcher.rb +26 -0
  27. data/lib/trace_viz/collectors/steps/assign_depth_for_call_step.rb +30 -0
  28. data/lib/trace_viz/collectors/steps/assign_depth_for_return_step.rb +39 -0
  29. data/lib/trace_viz/collectors/steps/base_step.rb +27 -0
  30. data/lib/trace_viz/collectors/steps/build_hierarchy_step.rb +32 -0
  31. data/lib/trace_viz/collectors/steps/hidden_step.rb +25 -0
  32. data/lib/trace_viz/collectors/steps/linking_step.rb +36 -0
  33. data/lib/trace_viz/collectors/steps/validation_step.rb +33 -0
  34. data/lib/trace_viz/collectors/steps.rb +10 -0
  35. data/lib/trace_viz/collectors/trace_pipeline.rb +26 -0
  36. data/lib/trace_viz/collectors/trace_pipeline_builder.rb +29 -0
  37. data/lib/trace_viz/collectors/trace_point_collector.rb +41 -0
  38. data/lib/trace_viz/collectors/trace_stats.rb +21 -0
  39. data/lib/trace_viz/config/copier.rb +38 -0
  40. data/lib/trace_viz/config/validator.rb +75 -0
  41. data/lib/trace_viz/configuration.rb +36 -30
  42. data/lib/trace_viz/context/config_context.rb +1 -1
  43. data/lib/trace_viz/context/manager.rb +17 -21
  44. data/lib/trace_viz/context/map.rb +29 -0
  45. data/lib/trace_viz/context/registry.rb +37 -0
  46. data/lib/trace_viz/context/tracking/active_calls.rb +37 -0
  47. data/lib/trace_viz/context/tracking_context.rb +11 -2
  48. data/lib/trace_viz/context.rb +2 -2
  49. data/lib/trace_viz/core/tracer.rb +3 -0
  50. data/lib/trace_viz/defaults/actions.rb +84 -0
  51. data/lib/trace_viz/defaults/colors.rb +61 -0
  52. data/lib/trace_viz/defaults/config.rb +89 -0
  53. data/lib/trace_viz/defaults/themes.rb +66 -0
  54. data/lib/trace_viz/defaults.rb +20 -0
  55. data/lib/trace_viz/exporters/base_exporter.rb +81 -0
  56. data/lib/trace_viz/exporters/export_manager.rb +33 -0
  57. data/lib/trace_viz/exporters/registry.rb +25 -0
  58. data/lib/trace_viz/exporters/text_exporter.rb +37 -0
  59. data/lib/trace_viz/formatters/base_formatter.rb +15 -0
  60. data/lib/trace_viz/formatters/export/base_formatter.rb +12 -0
  61. data/lib/trace_viz/formatters/export/formatter_factory.rb +27 -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 +15 -0
  66. data/lib/trace_viz/formatters/helpers/indent_helper.rb +15 -0
  67. data/lib/trace_viz/formatters/helpers/log/color_helper.rb +23 -0
  68. data/lib/trace_viz/formatters/helpers/log/depth_helper.rb +22 -0
  69. data/lib/trace_viz/formatters/helpers/log/method_name_helper.rb +29 -0
  70. data/lib/trace_viz/formatters/helpers/log/params_helper.rb +51 -0
  71. data/lib/trace_viz/formatters/helpers/log/result_helper.rb +27 -0
  72. data/lib/trace_viz/formatters/helpers/log/summary/params_helper.rb +53 -0
  73. data/lib/trace_viz/formatters/helpers/method_details_helper.rb +15 -0
  74. data/lib/trace_viz/formatters/helpers/params_helper.rb +43 -0
  75. data/lib/trace_viz/formatters/helpers/result_helper.rb +21 -0
  76. data/lib/trace_viz/formatters/helpers/source_helper.rb +22 -0
  77. data/lib/trace_viz/formatters/helpers/summary/params_helper.rb +41 -0
  78. data/lib/trace_viz/formatters/helpers/summary/source_helper.rb +24 -0
  79. data/lib/trace_viz/formatters/helpers/time_helper.rb +15 -0
  80. data/lib/trace_viz/formatters/helpers.rb +10 -0
  81. data/lib/trace_viz/formatters/log/base_formatter.rb +13 -0
  82. data/lib/trace_viz/formatters/log/formatter_factory.rb +27 -0
  83. data/lib/trace_viz/formatters/log/method_call_formatter.rb +34 -0
  84. data/lib/trace_viz/formatters/log/method_return_formatter.rb +24 -0
  85. data/lib/trace_viz/formatters/log/summary_group_formatter.rb +40 -0
  86. data/lib/trace_viz/formatters/log/verbose_formatter.rb +14 -0
  87. data/lib/trace_viz/formatters/trace_data_formatter.rb +24 -0
  88. data/lib/trace_viz/helpers/config_helper.rb +13 -0
  89. data/lib/trace_viz/helpers/trace_point/param_helper.rb +98 -0
  90. data/lib/trace_viz/helpers/tracking_helper.rb +26 -0
  91. data/lib/trace_viz/helpers.rb +9 -0
  92. data/lib/trace_viz/logger.rb +28 -49
  93. data/lib/trace_viz/loggers/base_logger.rb +29 -0
  94. data/lib/trace_viz/loggers/log_level_resolver.rb +18 -0
  95. data/lib/trace_viz/loggers/logging_manager.rb +46 -0
  96. data/lib/trace_viz/loggers/post_collection_logger.rb +39 -0
  97. data/lib/trace_viz/loggers/trace_logger.rb +37 -0
  98. data/lib/trace_viz/loggers/trace_stats_logger.rb +47 -0
  99. data/lib/trace_viz/renderers/base_renderer.rb +24 -0
  100. data/lib/trace_viz/renderers/render_context.rb +18 -0
  101. data/lib/trace_viz/renderers/renderer_factory.rb +41 -0
  102. data/lib/trace_viz/renderers/summary/node_processor.rb +82 -0
  103. data/lib/trace_viz/renderers/summary_renderer.rb +22 -0
  104. data/lib/trace_viz/renderers/verbose_renderer.rb +29 -0
  105. data/lib/trace_viz/shared/renderer_helper.rb +46 -0
  106. data/lib/trace_viz/shared.rb +8 -0
  107. data/lib/trace_viz/trace_data/base.rb +49 -0
  108. data/lib/trace_viz/trace_data/node.rb +33 -0
  109. data/lib/trace_viz/trace_data/root_node.rb +20 -0
  110. data/lib/trace_viz/trace_data/summary_node.rb +49 -0
  111. data/lib/trace_viz/trace_data/trace_point/base.rb +59 -0
  112. data/lib/trace_viz/trace_data/trace_point/method_call.rb +47 -0
  113. data/lib/trace_viz/trace_data/trace_point/method_return.rb +45 -0
  114. data/lib/trace_viz/trace_data/trace_point_builder.rb +23 -0
  115. data/lib/trace_viz/traits/depth_trackable.rb +13 -0
  116. data/lib/trace_viz/traits/identifiable.rb +25 -0
  117. data/lib/trace_viz/traits/time_trackable.rb +13 -0
  118. data/lib/trace_viz/traits.rb +10 -0
  119. data/lib/trace_viz/utils/colorize.rb +12 -23
  120. data/lib/trace_viz/utils/format_utils/key_value_formatter.rb +37 -0
  121. data/lib/trace_viz/utils/format_utils/value_truncator.rb +74 -0
  122. data/lib/trace_viz/utils/format_utils.rb +24 -0
  123. data/lib/trace_viz/utils/id_generator.rb +35 -0
  124. data/lib/trace_viz/version.rb +1 -1
  125. data/sig/adapters/base_adapter.rbs +11 -0
  126. data/sig/adapters/trace_point_adapter.rbs +13 -0
  127. data/sig/collectors/filters/registry.rbs +13 -0
  128. data/sig/collectors/trace_point_collector.rbs +17 -0
  129. data/sig/config/copier.rbs +15 -0
  130. data/sig/config/validator.rbs +18 -0
  131. data/sig/configuration.rbs +22 -0
  132. data/sig/context/base_context.rbs +9 -0
  133. data/sig/context/config_context.rbs +13 -0
  134. data/sig/context/manager.rbs +10 -0
  135. data/sig/context/map.rbs +13 -0
  136. data/sig/context.rbs +5 -0
  137. data/sig/core/tracer.rbs +7 -0
  138. data/sig/core.rbs +4 -0
  139. data/sig/defaults.rbs +17 -0
  140. data/sig/errors.rbs +13 -0
  141. data/sig/logger.rbs +33 -0
  142. data/sig/trace_viz.rbs +1 -2
  143. data/sig/utils/colorize.rbs +8 -0
  144. data/sig/utils/format_utils/key_value_formatter.rbs +16 -0
  145. data/sig/utils/format_utils/value_truncator.rbs +19 -0
  146. data/sig/utils/format_utils.rbs +8 -0
  147. data/sig/version.rbs +3 -0
  148. metadata +140 -16
  149. data/lib/trace_viz/adapters/trace_point/depth_manager.rb +0 -34
  150. data/lib/trace_viz/adapters/trace_point/event_handler.rb +0 -36
  151. data/lib/trace_viz/adapters/trace_point/trace_data.rb +0 -89
  152. data/lib/trace_viz/adapters/trace_point/trace_formatter.rb +0 -95
  153. data/lib/trace_viz/adapters/trace_point/trace_logger.rb +0 -44
  154. data/lib/trace_viz/context/manager/context_map.rb +0 -31
  155. data/lib/trace_viz/context/manager/context_operations.rb +0 -60
  156. data/lib/trace_viz/context/manager/context_registry.rb +0 -20
  157. data/lib/trace_viz/context/manager/context_validation.rb +0 -34
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TraceViz
4
+ module Defaults
5
+ class Colors
6
+ COLORS = {
7
+ reset: "\e[0m",
8
+ bold: "\e[1m",
9
+ dim: "\e[2m",
10
+ italic: "\e[3m",
11
+ underline: "\e[4m",
12
+ reverse: "\e[7m",
13
+ hidden: "\e[8m",
14
+ strikethrough: "\e[9m",
15
+ }
16
+
17
+ # Reference ASCII color codes
18
+ # https://talyian.github.io/ansicolors/
19
+
20
+ # Map 256-color ANSI codes
21
+ (0..255).each do |i|
22
+ COLORS["color_#{i}".to_sym] = "\e[38;5;#{i}m"
23
+ end
24
+
25
+ # To add background colors
26
+ (0..255).each do |i|
27
+ COLORS["bg_color_#{i}".to_sym] = "\e[48;5;#{i}m"
28
+ end
29
+
30
+ # Predefined names
31
+ COLORS.merge!({
32
+ black: "\e[30m",
33
+ red: "\e[31m",
34
+ green: "\e[32m",
35
+ yellow: "\e[33m",
36
+ blue: "\e[34m",
37
+ magenta: "\e[35m",
38
+ cyan: "\e[36m",
39
+ white: "\e[37m",
40
+ bright_black: "\e[90m",
41
+ bright_red: "\e[91m",
42
+ bright_green: "\e[92m",
43
+ bright_yellow: "\e[93m",
44
+ bright_blue: "\e[94m",
45
+ bright_magenta: "\e[95m",
46
+ bright_cyan: "\e[96m",
47
+ bright_white: "\e[97m",
48
+ })
49
+
50
+ class << self
51
+ def all
52
+ COLORS
53
+ end
54
+
55
+ def fetch(color)
56
+ COLORS.fetch(color, COLORS[:reset])
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TraceViz
4
+ module Defaults
5
+ class Config
6
+ DEFAULTS = {
7
+ general: {
8
+ tab_size: 2,
9
+ mode: :summary, # :summary, :verbose
10
+ group_keys: [:event, :klass, :action],
11
+ show_indent: true,
12
+ show_depth: true,
13
+ max_display_depth: 3,
14
+ show_method_name: true,
15
+ },
16
+ source_location: {
17
+ show: false,
18
+ truncate_length: 100,
19
+ },
20
+ params: {
21
+ show: true,
22
+ mode: :name_and_value,
23
+ truncate_values: 10,
24
+ },
25
+ result: {
26
+ show: true,
27
+ truncate_length: 50,
28
+ },
29
+ execution: {
30
+ show_time: true,
31
+ show_trace_events: [:call, :return],
32
+ },
33
+ filters: [
34
+ :exclude_internal_call,
35
+ # :exclude_default_classes,
36
+ # :exclude_rails_framework,
37
+ # include_classes: {
38
+ # classes: [],
39
+ # },
40
+ # exclude_classes: {
41
+ # classes: [],
42
+ # },
43
+ # include_gems: {
44
+ # app_running: true,
45
+ # app_path: Dir.pwd,
46
+ # gems: [],
47
+ # },
48
+ # exclude_gems: {
49
+ # gems: [],
50
+ # },
51
+ ],
52
+ log: {
53
+ enabled: true,
54
+ runtime: false,
55
+ post_collection: true,
56
+ stats: true,
57
+ },
58
+ export: {
59
+ enabled: true,
60
+ path: "tmp",
61
+ format: :txt,
62
+ overwrite: false,
63
+ },
64
+ }.freeze
65
+
66
+ class << self
67
+ def fetch
68
+ DEFAULTS.dup
69
+ end
70
+
71
+ def valid_param_modes
72
+ [:name_and_value, :name_only, :value_only].freeze
73
+ end
74
+
75
+ def valid_param_mode?(mode)
76
+ valid_param_modes.include?(mode)
77
+ end
78
+
79
+ def valid_export_formats
80
+ [:txt, :json, :yaml].freeze
81
+ end
82
+
83
+ def valid_export_format?(format)
84
+ valid_export_formats.include?(format)
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
@@ -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
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "defaults/config"
4
+ require_relative "defaults/colors"
5
+ require_relative "defaults/themes"
6
+ require_relative "defaults/actions"
7
+
8
+ module TraceViz
9
+ module Defaults
10
+ @action_colors = Actions::COLORS.dup
11
+
12
+ class << self
13
+ attr_reader :action_colors
14
+
15
+ def action_colors=(new_colors)
16
+ @action_colors.merge!(new_colors)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "fileutils"
4
+ require "trace_viz/helpers"
5
+ require "trace_viz/shared"
6
+
7
+ module TraceViz
8
+ module Exporters
9
+ class BaseExporter
10
+ include Helpers::ConfigHelper
11
+ include Shared::RendererHelper
12
+
13
+ def initialize(collector)
14
+ @export_config = config.export
15
+ @logger = config.logger
16
+
17
+ @collector = collector
18
+ end
19
+
20
+ def export
21
+ unless export_enabled?
22
+ logger.warn("Export is disabled in configuration. Skipping export process.")
23
+ return
24
+ end
25
+
26
+ ensure_directory_exists
27
+ return if handle_empty_content == :skip
28
+ return if handle_existing_file == :skip
29
+
30
+ write_file(content)
31
+
32
+ logger.exported("Data successfully exported to #{file_path}")
33
+ end
34
+
35
+ private
36
+
37
+ attr_reader :export_config, :logger, :collector
38
+
39
+ def content
40
+ raise NotImplementedError
41
+ end
42
+
43
+ def export_enabled?
44
+ export_config[:enabled]
45
+ end
46
+
47
+ def ensure_directory_exists
48
+ FileUtils.mkdir_p(File.dirname(file_path))
49
+ end
50
+
51
+ def handle_existing_file
52
+ return unless File.exist?(file_path)
53
+
54
+ if export_config[:overwrite]
55
+ logger.processing("Overwriting existing file: #{file_path}")
56
+ else
57
+ logger.skipped("File already exists and overwrite is disabled: #{file_path}. Export skipped.")
58
+ :skip
59
+ end
60
+ end
61
+
62
+ def handle_empty_content
63
+ if content.nil? || content.strip.empty?
64
+ logger.skipped("Export content is empty. Export skipped.")
65
+ :skip
66
+ end
67
+ end
68
+
69
+ def file_path
70
+ format = export_config[:format]
71
+ path = export_config[:path]
72
+
73
+ "#{path}/trace_output.#{format}"
74
+ end
75
+
76
+ def write_file(data)
77
+ File.write(file_path, data)
78
+ end
79
+ end
80
+ end
81
+ end
@@ -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,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "text_exporter"
4
+
5
+ module TraceViz
6
+ module Exporters
7
+ class Registry
8
+ EXPORTS = {
9
+ txt: TextExporter,
10
+ }
11
+
12
+ class << self
13
+ def build(format, *options)
14
+ raise ArgumentError unless supported_formats.include?(format)
15
+
16
+ EXPORTS[format].new(*options)
17
+ end
18
+
19
+ def supported_formats
20
+ EXPORTS.keys
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base_exporter"
4
+ require "trace_viz/renderers/renderer_factory"
5
+ require "trace_viz/renderers/render_context"
6
+ require "trace_viz/formatters/export/formatter_factory"
7
+
8
+ module TraceViz
9
+ module Exporters
10
+ class TextExporter < BaseExporter
11
+ def initialize(collector)
12
+ super(collector)
13
+
14
+ @renderer = build_renderer(collector, Formatters::Export::FormatterFactory)
15
+ end
16
+
17
+ private
18
+
19
+ attr_reader :renderer
20
+
21
+ def content
22
+ data.join("\n")
23
+ end
24
+
25
+ def data
26
+ process_lines(renderer.to_lines) { |line| process_line(line) }
27
+ end
28
+
29
+ def process_line(line)
30
+ [
31
+ line[:line],
32
+ *process_lines(line[:nested_lines]) { |nested| process_line(nested) },
33
+ ].compact
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "trace_viz/helpers"
4
+
5
+ module TraceViz
6
+ module Formatters
7
+ class BaseFormatter
8
+ include Helpers::ConfigHelper
9
+
10
+ def call
11
+ raise NotImplementedError
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../trace_data_formatter"
4
+
5
+ module TraceViz
6
+ module Formatters
7
+ module Export
8
+ class BaseFormatter < TraceDataFormatter
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "method_call_formatter"
4
+ require_relative "method_return_formatter"
5
+ require_relative "summary_group_formatter"
6
+
7
+ module TraceViz
8
+ module Formatters
9
+ module Export
10
+ class FormatterFactory
11
+ FORMATTERS = {
12
+ call: MethodCallFormatter.new,
13
+ return: MethodReturnFormatter.new,
14
+ summary_group: SummaryGroupFormatter.new,
15
+ }.freeze
16
+
17
+ class << self
18
+ def fetch_formatter(key)
19
+ FORMATTERS.fetch(key) do
20
+ raise ArgumentError, "Unsupported factory key: #{key}"
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base_formatter"
4
+
5
+ module TraceViz
6
+ module Formatters
7
+ module Export
8
+ class MethodCallFormatter < BaseFormatter
9
+ def call(trace_data)
10
+ [
11
+ indent_representation(trace_data),
12
+ depth_representation(trace_data),
13
+ method_name_representation(trace_data),
14
+ source_location_representation(trace_data),
15
+ params_representation(trace_data),
16
+ ].compact.join(" ")
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base_formatter"
4
+
5
+ module TraceViz
6
+ module Formatters
7
+ module Export
8
+ class MethodReturnFormatter < BaseFormatter
9
+ def call(trace_data)
10
+ [
11
+ indent_representation(trace_data),
12
+ depth_representation(trace_data),
13
+ method_name_representation(trace_data),
14
+ result_representation(trace_data),
15
+ source_location_representation(trace_data),
16
+ execution_time_representation(trace_data),
17
+ ].compact.join(" ")
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base_formatter"
4
+
5
+ module TraceViz
6
+ module Formatters
7
+ module Export
8
+ class SummaryGroupFormatter < BaseFormatter
9
+ include Helpers::Summary::ParamsHelper
10
+ include Helpers::Summary::SourceHelper
11
+
12
+ def call(trace_data)
13
+ [
14
+ indent_representation(trace_data),
15
+ depth_representation(trace_data),
16
+ Defaults::Actions.emoji_for(:processing),
17
+ method_name_representation(trace_data),
18
+ source_location_representation(trace_data),
19
+ format_params_template(trace_data, config),
20
+ summary_info(trace_data),
21
+ ].compact.join(" ")
22
+ end
23
+
24
+ private
25
+
26
+ def summary_info(trace_data)
27
+ "[Summary: #{trace_data.count} calls | Avg Time: #{format(
28
+ "in %.6fms",
29
+ trace_data.average_duration,
30
+ )}]"
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TraceViz
4
+ module Formatters
5
+ module Helpers
6
+ module DepthHelper
7
+ def depth_representation(trace_data)
8
+ return unless config.general[:show_depth]
9
+
10
+ "depth[#{trace_data.depth}]"
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TraceViz
4
+ module Formatters
5
+ module Helpers
6
+ module IndentHelper
7
+ def indent_representation(trace_data)
8
+ return unless config.general[:show_indent] && config.general[:show_depth]
9
+
10
+ " " * (config.general[:tab_size] * trace_data.depth)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "trace_viz/utils/colorize"
4
+
5
+ module TraceViz
6
+ module Formatters
7
+ module Helpers
8
+ module Log
9
+ module ColorHelper
10
+ def colorize_for(text, action)
11
+ colors = Defaults::Actions.colors_for(action)
12
+
13
+ colorize(text, *colors)
14
+ end
15
+
16
+ def colorize(text, *colors)
17
+ Utils::Colorize.colorize(text, *colors)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TraceViz
4
+ module Formatters
5
+ module Helpers
6
+ module Log
7
+ module DepthHelper
8
+ def format_depth(trace_data, config)
9
+ return unless config.general[:show_depth]
10
+
11
+ prefix = colorize_for("depth", :trace_depth_prefix)
12
+ open_block = colorize_for("[", :trace_depth_open)
13
+ number = colorize_for(trace_data.depth, :trace_depth_value)
14
+ close_block = colorize_for("]", :trace_depth_close)
15
+
16
+ [prefix, open_block, number, close_block].join
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TraceViz
4
+ module Formatters
5
+ module Helpers
6
+ module Log
7
+ module MethodNameHelper
8
+ def format_method_name(trace_data, config)
9
+ return unless config.general[:show_method_name]
10
+
11
+ "#{format_class_name(trace_data)}#{format_action_name(trace_data)}"
12
+ end
13
+
14
+ private
15
+
16
+ def format_class_name(trace_data)
17
+ klass = colorize_for(trace_data.klass, :trace_method_class)
18
+ method_sign = colorize_for("#", :trace_method_sign)
19
+ [klass, method_sign].join
20
+ end
21
+
22
+ def format_action_name(trace_data)
23
+ colorize_for(trace_data.action, :trace_method_action)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end