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,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "node"
4
+
5
+ module TraceViz
6
+ module TraceData
7
+ class RootNode < Node
8
+ def initialize
9
+ super()
10
+
11
+ # Explicitly ensure no parent for root
12
+ @parent = nil
13
+ end
14
+
15
+ def parent=(_parent)
16
+ raise NoMethodError, "RootNode cannot have a parent"
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "node"
4
+
5
+ module TraceViz
6
+ module TraceData
7
+ class SummaryNode < Node
8
+ attr_reader :group, :count, :representative_node, :event, :klass, :action, :path, :params, :result
9
+
10
+ def initialize(group:)
11
+ super()
12
+
13
+ @group = group
14
+ @count = group.size
15
+
16
+ @representative_node = group.first
17
+ @depth = representative_node.depth
18
+ @event = representative_node.event
19
+ @klass = representative_node.klass
20
+ @path = representative_node.path
21
+ @action = representative_node.action
22
+
23
+ # Representative node is the first node in the group belonging to MethodCall
24
+ @params = representative_node.params
25
+ @result = representative_node.method_return.result
26
+
27
+ add_children(representative_node.children)
28
+ end
29
+
30
+ def average_duration
31
+ return 0 if count.zero?
32
+
33
+ total_duration / count
34
+ end
35
+
36
+ def total_duration
37
+ children.map(&:duration).sum
38
+ end
39
+
40
+ private
41
+
42
+ def add_children(nodes)
43
+ nodes.each do |node|
44
+ add_child(node)
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "trace_viz/traits"
4
+ require_relative "../node"
5
+
6
+ module TraceViz
7
+ module TraceData
8
+ module TracePoint
9
+ class Base < TraceData::Node
10
+ include Traits::Identifiable
11
+
12
+ attr_reader :trace_point,
13
+ :memory_id,
14
+ :event,
15
+ :klass,
16
+ :action,
17
+ :path,
18
+ :line_number
19
+
20
+ def initialize(trace_point)
21
+ super()
22
+
23
+ @trace_point = trace_point
24
+ populate_attributes
25
+ assign_memory_id
26
+ assign_ids
27
+ end
28
+
29
+ def duration
30
+ 0
31
+ end
32
+
33
+ def to_h
34
+ super.merge(
35
+ {
36
+ id: id,
37
+ action_id: action_id,
38
+ memory_id: memory_id,
39
+ },
40
+ )
41
+ end
42
+
43
+ private
44
+
45
+ def populate_attributes
46
+ @event = trace_point.event
47
+ @klass = trace_point.defined_class
48
+ @action = trace_point.callee_id
49
+ @path = trace_point.path
50
+ @line_number = trace_point.lineno
51
+ end
52
+
53
+ def assign_memory_id
54
+ @memory_id = trace_point.self.object_id
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "trace_viz/helpers/trace_point/param_helper"
4
+ require_relative "base"
5
+
6
+ module TraceViz
7
+ module TraceData
8
+ module TracePoint
9
+ class MethodCall < Base
10
+ include Helpers::TracePoint::ParamHelper
11
+
12
+ attr_reader :params, :method_return
13
+
14
+ def initialize(trace_point)
15
+ super(trace_point)
16
+
17
+ populate_params
18
+ end
19
+
20
+ def link(method_return)
21
+ @method_return = method_return
22
+ end
23
+
24
+ def duration
25
+ return 0 unless method_return
26
+
27
+ method_return.timestamp - timestamp
28
+ end
29
+
30
+ def to_h
31
+ super.merge(
32
+ {
33
+ params: params,
34
+ method_return_id: method_return&.id,
35
+ },
36
+ )
37
+ end
38
+
39
+ private
40
+
41
+ def populate_params
42
+ @params = extract_params(trace_point.binding, action)
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "base"
4
+
5
+ module TraceViz
6
+ module TraceData
7
+ module TracePoint
8
+ class MethodReturn < Base
9
+ attr_reader :result, :method_call
10
+
11
+ def initialize(trace_point)
12
+ super(trace_point)
13
+
14
+ populate_result
15
+ end
16
+
17
+ def link(method_call)
18
+ @method_call = method_call
19
+ method_call.link(self)
20
+ end
21
+
22
+ def duration
23
+ return 0 unless method_call
24
+
25
+ timestamp - method_call.timestamp
26
+ end
27
+
28
+ def to_h
29
+ super.merge(
30
+ {
31
+ result: result,
32
+ method_call_id: method_call&.id,
33
+ },
34
+ )
35
+ end
36
+
37
+ private
38
+
39
+ def populate_result
40
+ @result = @trace_point.return_value
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "trace_point/method_call"
4
+ require_relative "trace_point/method_return"
5
+
6
+ module TraceViz
7
+ module TraceData
8
+ class TracePointBuilder
9
+ class << self
10
+ def build(tp)
11
+ case tp.event
12
+ when :call
13
+ TracePoint::MethodCall.new(tp)
14
+ when :return
15
+ TracePoint::MethodReturn.new(tp)
16
+ else
17
+ raise ArgumentError, "Unsupported TracePoint event: #{tp.event}"
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TraceViz
4
+ module Traits
5
+ module DepthTrackable
6
+ attr_reader :depth
7
+
8
+ def assign_depth(depth)
9
+ @depth = depth
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "trace_viz/utils/id_generator"
4
+
5
+ module TraceViz
6
+ module Traits
7
+ module Identifiable
8
+ attr_reader :id, :action_id
9
+
10
+ def assign_ids
11
+ @id = Utils::IDGenerator.generate_unique_id(
12
+ memory_id: memory_id,
13
+ action: action,
14
+ path: path,
15
+ line_number: line_number,
16
+ )
17
+
18
+ @action_id = Utils::IDGenerator.generate_action_id(
19
+ memory_id: memory_id,
20
+ action: action,
21
+ )
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TraceViz
4
+ module Traits
5
+ module TimeTrackable
6
+ attr_reader :timestamp
7
+
8
+ def record_timestamp
9
+ @timestamp = Time.now
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "traits/time_trackable"
4
+ require_relative "traits/depth_trackable"
5
+ require_relative "traits/identifiable"
6
+
7
+ module TraceViz
8
+ module Traits
9
+ end
10
+ end
@@ -3,31 +3,20 @@
3
3
  module TraceViz
4
4
  module Utils
5
5
  module Colorize
6
- ANSI_COLORS = {
7
- reset: "\e[0m",
8
- black: "\e[30m",
9
- red: "\e[31m",
10
- green: "\e[32m",
11
- yellow: "\e[33m",
12
- blue: "\e[34m",
13
- magenta: "\e[35m",
14
- cyan: "\e[36m",
15
- light_gray: "\e[37m",
16
- dark_gray: "\e[90m",
17
- light_red: "\e[91m",
18
- light_green: "\e[92m",
19
- light_yellow: "\e[93m",
20
- light_blue: "\e[94m",
21
- light_magenta: "\e[95m",
22
- light_cyan: "\e[96m",
23
- white: "\e[97m",
24
- }.freeze
25
-
26
6
  class << self
27
- def colorize(text, color)
28
- return text unless text
7
+ def colorize(text, *colors)
8
+ return text if text.nil? || colors.empty?
9
+
10
+ "#{build_color_sequence(colors)}#{text}#{Defaults::Colors.fetch(:default)}"
11
+ end
12
+
13
+ private
29
14
 
30
- "#{ANSI_COLORS[color]}#{text}#{ANSI_COLORS[:reset]}"
15
+ def build_color_sequence(colors)
16
+ colors
17
+ .map { |color| Defaults::Colors.fetch(color) }
18
+ .compact
19
+ .join
31
20
  end
32
21
  end
33
22
  end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TraceViz
4
+ module Utils
5
+ module FormatUtils
6
+ class KeyValueFormatter
7
+ DEFAULT_MODE = :name_and_value
8
+
9
+ def initialize(mode: DEFAULT_MODE)
10
+ @mode = mode
11
+ @formatter = build_formatter
12
+ end
13
+
14
+ def call(data)
15
+ validate_input(data)
16
+ data.map { |key, value| @formatter.call(key, value) }.join(", ")
17
+ end
18
+
19
+ private
20
+
21
+ def validate_input(data)
22
+ unless data.is_a?(Hash)
23
+ raise ArgumentError, "Expected a Hash for key-value formatting, got #{data.class}"
24
+ end
25
+ end
26
+
27
+ def build_formatter
28
+ {
29
+ name_and_value: ->(key, value) { "#{key}: #{value}" },
30
+ name_only: ->(key, _) { key.to_s },
31
+ value_only: ->(_, value) { value.to_s },
32
+ }.fetch(@mode) { raise ArgumentError, "Invalid mode: #{@mode}" }
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TraceViz
4
+ module Utils
5
+ module FormatUtils
6
+ class ValueTruncator
7
+ DEFAULT_LENGTH = -1
8
+ VALID_DIRECTIONS = [:start, :end].freeze
9
+
10
+ def initialize(length: DEFAULT_LENGTH, direction: :end)
11
+ @length = length
12
+ @direction = validate_direction(direction)
13
+ end
14
+
15
+ def truncate(value)
16
+ return value unless valid_length?
17
+
18
+ case value
19
+ when String then truncate_string(value)
20
+ when Array then truncate_array(value)
21
+ when Hash then truncate_hash(value)
22
+ else truncate_generic(value)
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ attr_reader :length, :direction
29
+
30
+ def validate_direction(direction)
31
+ return direction if VALID_DIRECTIONS.include?(direction)
32
+
33
+ raise ArgumentError, "Invalid direction: #{direction}. Valid options are :start or :end."
34
+ end
35
+
36
+ def valid_length?
37
+ length.is_a?(Integer) && length.positive?
38
+ end
39
+
40
+ def truncate_string(string)
41
+ return string if string.length <= length
42
+
43
+ case direction
44
+ when :start then "...#{string[-length..]}"
45
+ when :end then "#{string[0, length]}..."
46
+ end
47
+ end
48
+
49
+ def truncate_array(array)
50
+ truncated = array.take(length)
51
+ truncated << "..." if array.size > length
52
+ truncated
53
+ end
54
+
55
+ def truncate_hash(hash)
56
+ keys = hash.keys.take(length)
57
+ truncated_pairs = keys.map { |key| "#{key}: #{truncate(hash[key])}" }
58
+ truncated_pairs << "..." if hash.size > length
59
+ "{#{truncated_pairs.join(", ")}}"
60
+ end
61
+
62
+ def truncate_generic(object)
63
+ object_str = object.inspect
64
+ return object_str if object_str.length <= length
65
+
66
+ case direction
67
+ when :start then "#{object.class}(...#{object_str[-length..]})"
68
+ when :end then "#{object.class}(#{object_str[0, length]}...)"
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "format_utils/key_value_formatter"
4
+ require_relative "format_utils/value_truncator"
5
+
6
+ module TraceViz
7
+ module Utils
8
+ module FormatUtils
9
+ class << self
10
+ # Formats key-value pairs based on the provided mode
11
+ def format_key_value_pairs(data, mode)
12
+ formatter = KeyValueFormatter.new(mode: mode)
13
+ formatter.call(data)
14
+ end
15
+
16
+ # Truncates a value to the specified length
17
+ def truncate_value(value, length, direction: :end)
18
+ truncator = ValueTruncator.new(length: length, direction: direction)
19
+ truncator.truncate(value)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TraceViz
4
+ module Utils
5
+ class IDGenerator
6
+ ID_DELIMITER = "|"
7
+ COMPONENT_DELIMITER = ":"
8
+
9
+ class << self
10
+ def generate_unique_id(memory_id:, action:, path:, line_number:)
11
+ join_with_delimiters(
12
+ memory: memory_id,
13
+ action: action,
14
+ path: path,
15
+ line: line_number,
16
+ )
17
+ end
18
+
19
+ def generate_action_id(memory_id:, action:)
20
+ join_with_delimiters(
21
+ memory: memory_id,
22
+ action: action,
23
+ )
24
+ end
25
+
26
+ private
27
+
28
+ def join_with_delimiters(**components)
29
+ components.map { |key, value| "#{key}#{COMPONENT_DELIMITER}#{value}" }
30
+ .join(ID_DELIMITER)
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TraceViz
4
- VERSION = "0.0.1"
4
+ VERSION = "1.0.0"
5
5
  end
@@ -0,0 +1,11 @@
1
+ module TraceViz
2
+ module Adapters
3
+ class BaseAdapter
4
+ def initialize: () -> void
5
+
6
+ def trace: () -> void
7
+
8
+ private attr_reader config: untyped
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,13 @@
1
+ module TraceViz
2
+ module Adapters
3
+ class TracePointAdapter < BaseAdapter
4
+ def initialize: () -> void
5
+
6
+ def trace: () { () -> void } -> void
7
+
8
+ private attr_reader collector: TraceViz::Collectors::TracePointCollector
9
+
10
+ private def exporter: () -> untyped
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module TraceViz
2
+ module Collectors
3
+ module Filters
4
+ class Registry
5
+ FILTERS: Hash[Symbol, untyped]
6
+
7
+ def self.build: (Array[Symbol | Hash[Symbol, untyped]] filters) -> Array[untyped]
8
+
9
+ private def self.fetch_filter_class: (Symbol filter_key) -> untyped
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,17 @@
1
+ module TraceViz
2
+ module Collectors
3
+ class TracePointCollector
4
+ def initialize: () -> void
5
+
6
+ private attr_reader action_matcher: TraceViz::Matchers::TracePointActionMatcher
7
+ private attr_reader within_depth_matcher: TraceViz::Matchers::WithinDepthMatcher
8
+
9
+ private def collectible?: (untyped) -> bool
10
+ private def build_trace: (untyped) -> untyped
11
+ private def update_trace_depth: (untyped) -> void
12
+ private def match_action?: (untyped) -> bool
13
+ private def within_depth?: () -> bool
14
+ private def depth_manager: () -> TraceViz::Collectors::DepthManager
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,15 @@
1
+ module TraceViz
2
+ module Config
3
+ class Copier
4
+ @origin_configuration: untyped
5
+ @settings: Hash[Symbol, untyped]
6
+
7
+ def initialize: (untyped configuration) -> void
8
+ def copy: () -> untyped
9
+
10
+ private def deep_copy: (untyped value) -> untyped
11
+ private attr_reader origin_configuration: untyped
12
+ private attr_reader settings: Hash[Symbol, untyped]
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,18 @@
1
+ module TraceViz
2
+ module Config
3
+ class Validator
4
+ FILTER_KEYS: Array[Symbol]
5
+
6
+ @validations: Hash[Symbol, ^(untyped) -> void]
7
+
8
+ def initialize: () -> void
9
+ def validate: (Symbol group, Symbol value) -> void
10
+
11
+ private def validate_params: (Hash[Symbol, untyped] value) -> void
12
+ private def validate_result: (Hash[Symbol, untyped] value) -> void
13
+ private def validate_source_location: (Hash[Symbol, untyped] value) -> void
14
+ private def validate_filters: (Array[untyped] filters) -> void
15
+ private def validate_export: (Hash[Symbol, untyped] value) -> void
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,22 @@
1
+ module TraceViz
2
+ class Configuration
3
+ @logger: TraceViz::Logger
4
+ @validator: TraceViz::Config::Validator
5
+ @settings: Hash[Symbol, untyped]
6
+
7
+ attr_reader logger: TraceViz::Logger
8
+ attr_reader settings: Hash[Symbol, untyped]
9
+
10
+ def initialize: () -> void
11
+ def []: (Symbol key) -> untyped
12
+ def update: (Symbol group, untyped values) -> void
13
+ def reset_defaults: () -> void
14
+ def dup: () -> TraceViz::Config::Copier
15
+
16
+ private def define_dynamic_accessors: () -> void
17
+ end
18
+
19
+ def self.configuration: () -> TraceViz::Configuration
20
+ def self.configure: () { (TraceViz::Configuration) -> void } -> void
21
+ def self.logger: () -> TraceViz::Logger
22
+ end
@@ -0,0 +1,9 @@
1
+ module TraceViz
2
+ module Context
3
+ class BaseContext
4
+ attr_reader options: Hash[Symbol, untyped]
5
+
6
+ def initialize: (options: Hash[Symbol, untyped]) -> void
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ module TraceViz
2
+ module Context
3
+ class ConfigContext
4
+ attr_reader configuration: untyped
5
+
6
+ def initialize: (options: Hash[Symbol, untyped]) -> void
7
+
8
+ def temp_configuration: () -> untyped
9
+
10
+ def apply_options: (Hash[Symbol, untyped]) -> untyped
11
+ end
12
+ end
13
+ end