trace_viz 0.0.2 → 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 (143) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +40 -37
  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/collectors/base_collector.rb +42 -35
  9. data/lib/trace_viz/collectors/filters/base_class_filter.rb +29 -0
  10. data/lib/trace_viz/collectors/filters/base_exclude_filter.rb +16 -0
  11. data/lib/trace_viz/collectors/filters/base_filter.rb +2 -8
  12. data/lib/trace_viz/collectors/filters/base_include_filter.rb +16 -0
  13. data/lib/trace_viz/collectors/filters/exclude_classes_filter.rb +4 -17
  14. data/lib/trace_viz/collectors/filters/exclude_default_classes_filter.rb +22 -26
  15. data/lib/trace_viz/collectors/filters/include_classes_filter.rb +4 -17
  16. data/lib/trace_viz/collectors/hierarchy_linker.rb +30 -0
  17. data/lib/trace_viz/collectors/matchers/base_matcher.rb +13 -0
  18. data/lib/trace_viz/collectors/matchers/trace_point_action_matcher.rb +12 -10
  19. data/lib/trace_viz/collectors/matchers/within_depth_matcher.rb +6 -5
  20. data/lib/trace_viz/collectors/steps/assign_depth_for_call_step.rb +30 -0
  21. data/lib/trace_viz/collectors/steps/assign_depth_for_return_step.rb +39 -0
  22. data/lib/trace_viz/collectors/steps/base_step.rb +27 -0
  23. data/lib/trace_viz/collectors/steps/build_hierarchy_step.rb +32 -0
  24. data/lib/trace_viz/collectors/{evaluators/hidden_evaluator.rb → steps/hidden_step.rb} +9 -5
  25. data/lib/trace_viz/collectors/steps/linking_step.rb +36 -0
  26. data/lib/trace_viz/collectors/{evaluators/filter_evaluator.rb → steps/validation_step.rb} +9 -6
  27. data/lib/trace_viz/collectors/steps.rb +10 -0
  28. data/lib/trace_viz/collectors/trace_pipeline.rb +26 -0
  29. data/lib/trace_viz/collectors/trace_pipeline_builder.rb +29 -0
  30. data/lib/trace_viz/collectors/trace_point_collector.rb +1 -11
  31. data/lib/trace_viz/config/validator.rb +6 -5
  32. data/lib/trace_viz/configuration.rb +3 -3
  33. data/lib/trace_viz/context/tracking_context.rb +4 -0
  34. data/lib/trace_viz/core/tracer.rb +2 -0
  35. data/lib/trace_viz/defaults/actions.rb +84 -0
  36. data/lib/trace_viz/defaults/colors.rb +61 -0
  37. data/lib/trace_viz/defaults/config.rb +89 -0
  38. data/lib/trace_viz/defaults/themes.rb +66 -0
  39. data/lib/trace_viz/defaults.rb +10 -129
  40. data/lib/trace_viz/exporters/base_exporter.rb +8 -11
  41. data/lib/trace_viz/exporters/export_manager.rb +33 -0
  42. data/lib/trace_viz/exporters/registry.rb +25 -0
  43. data/lib/trace_viz/exporters/text_exporter.rb +22 -0
  44. data/lib/trace_viz/formatters/base_formatter.rb +3 -30
  45. data/lib/trace_viz/formatters/export/base_formatter.rb +12 -0
  46. data/lib/trace_viz/formatters/export/formatter_factory.rb +27 -0
  47. data/lib/trace_viz/formatters/export/method_call_formatter.rb +21 -0
  48. data/lib/trace_viz/formatters/export/method_return_formatter.rb +22 -0
  49. data/lib/trace_viz/formatters/export/summary_group_formatter.rb +35 -0
  50. data/lib/trace_viz/formatters/helpers/depth_helper.rb +2 -8
  51. data/lib/trace_viz/formatters/helpers/indent_helper.rb +1 -1
  52. data/lib/trace_viz/formatters/helpers/log/color_helper.rb +23 -0
  53. data/lib/trace_viz/formatters/helpers/log/depth_helper.rb +22 -0
  54. data/lib/trace_viz/formatters/helpers/log/method_name_helper.rb +29 -0
  55. data/lib/trace_viz/formatters/helpers/log/params_helper.rb +51 -0
  56. data/lib/trace_viz/formatters/helpers/log/result_helper.rb +27 -0
  57. data/lib/trace_viz/formatters/helpers/log/summary/params_helper.rb +53 -0
  58. data/lib/trace_viz/formatters/helpers/method_details_helper.rb +1 -1
  59. data/lib/trace_viz/formatters/helpers/params_helper.rb +26 -9
  60. data/lib/trace_viz/formatters/helpers/result_helper.rb +1 -1
  61. data/lib/trace_viz/formatters/helpers/source_helper.rb +2 -1
  62. data/lib/trace_viz/formatters/helpers/summary/params_helper.rb +41 -0
  63. data/lib/trace_viz/formatters/helpers/summary/source_helper.rb +24 -0
  64. data/lib/trace_viz/formatters/helpers/time_helper.rb +2 -2
  65. data/lib/trace_viz/formatters/helpers.rb +10 -0
  66. data/lib/trace_viz/formatters/log/base_formatter.rb +13 -0
  67. data/lib/trace_viz/formatters/log/formatter_factory.rb +27 -0
  68. data/lib/trace_viz/formatters/log/method_call_formatter.rb +34 -0
  69. data/lib/trace_viz/formatters/log/method_return_formatter.rb +24 -0
  70. data/lib/trace_viz/formatters/log/summary_group_formatter.rb +40 -0
  71. data/lib/trace_viz/formatters/log/verbose_formatter.rb +14 -0
  72. data/lib/trace_viz/formatters/trace_data_formatter.rb +24 -0
  73. data/lib/trace_viz/helpers/config_helper.rb +13 -0
  74. data/lib/trace_viz/helpers/trace_point/param_helper.rb +98 -0
  75. data/lib/trace_viz/helpers/tracking_helper.rb +26 -0
  76. data/lib/trace_viz/helpers.rb +9 -0
  77. data/lib/trace_viz/logger.rb +9 -20
  78. data/lib/trace_viz/loggers/base_logger.rb +29 -0
  79. data/lib/trace_viz/loggers/log_level_resolver.rb +18 -0
  80. data/lib/trace_viz/loggers/logging_manager.rb +46 -0
  81. data/lib/trace_viz/loggers/post_collection_logger.rb +39 -0
  82. data/lib/trace_viz/loggers/trace_logger.rb +17 -18
  83. data/lib/trace_viz/loggers/trace_stats_logger.rb +28 -14
  84. data/lib/trace_viz/renderers/base_renderer.rb +24 -0
  85. data/lib/trace_viz/renderers/render_context.rb +18 -0
  86. data/lib/trace_viz/renderers/renderer_factory.rb +41 -0
  87. data/lib/trace_viz/renderers/summary/node_processor.rb +82 -0
  88. data/lib/trace_viz/renderers/summary_renderer.rb +22 -0
  89. data/lib/trace_viz/renderers/verbose_renderer.rb +29 -0
  90. data/lib/trace_viz/shared/renderer_helper.rb +46 -0
  91. data/lib/trace_viz/shared.rb +8 -0
  92. data/lib/trace_viz/trace_data/base.rb +16 -23
  93. data/lib/trace_viz/trace_data/node.rb +33 -0
  94. data/lib/trace_viz/trace_data/root_node.rb +20 -0
  95. data/lib/trace_viz/trace_data/summary_node.rb +49 -0
  96. data/lib/trace_viz/trace_data/trace_point/base.rb +22 -31
  97. data/lib/trace_viz/trace_data/trace_point/method_call.rb +22 -17
  98. data/lib/trace_viz/trace_data/trace_point/method_return.rb +21 -1
  99. data/lib/trace_viz/traits/depth_trackable.rb +13 -0
  100. data/lib/trace_viz/traits/identifiable.rb +25 -0
  101. data/lib/trace_viz/traits/time_trackable.rb +13 -0
  102. data/lib/trace_viz/traits.rb +10 -0
  103. data/lib/trace_viz/utils/colorize.rb +6 -6
  104. data/lib/trace_viz/utils/format_utils/key_value_formatter.rb +37 -0
  105. data/lib/trace_viz/utils/format_utils/value_truncator.rb +74 -0
  106. data/lib/trace_viz/utils/format_utils.rb +10 -53
  107. data/lib/trace_viz/utils/id_generator.rb +35 -0
  108. data/lib/trace_viz/version.rb +1 -1
  109. data/sig/adapters/base_adapter.rbs +11 -0
  110. data/sig/adapters/trace_point_adapter.rbs +13 -0
  111. data/sig/collectors/filters/registry.rbs +13 -0
  112. data/sig/collectors/trace_point_collector.rbs +17 -0
  113. data/sig/config/copier.rbs +15 -0
  114. data/sig/config/validator.rbs +18 -0
  115. data/sig/configuration.rbs +22 -0
  116. data/sig/context/base_context.rbs +9 -0
  117. data/sig/context/config_context.rbs +13 -0
  118. data/sig/context/manager.rbs +10 -0
  119. data/sig/context/map.rbs +13 -0
  120. data/sig/context.rbs +5 -0
  121. data/sig/core/tracer.rbs +7 -0
  122. data/sig/core.rbs +4 -0
  123. data/sig/defaults.rbs +17 -0
  124. data/sig/errors.rbs +13 -0
  125. data/sig/logger.rbs +33 -0
  126. data/sig/trace_viz.rbs +1 -2
  127. data/sig/utils/colorize.rbs +8 -0
  128. data/sig/utils/format_utils/key_value_formatter.rbs +16 -0
  129. data/sig/utils/format_utils/value_truncator.rbs +19 -0
  130. data/sig/utils/format_utils.rbs +8 -0
  131. data/sig/version.rbs +3 -0
  132. metadata +97 -18
  133. data/lib/trace_viz/collectors/depth_manager.rb +0 -37
  134. data/lib/trace_viz/collectors/evaluators/base_evaluator.rb +0 -23
  135. data/lib/trace_viz/exporters/formatters/base_formatter.rb +0 -12
  136. data/lib/trace_viz/exporters/formatters/method_call_formatter.rb +0 -21
  137. data/lib/trace_viz/exporters/formatters/method_return_formatter.rb +0 -22
  138. data/lib/trace_viz/exporters/transformers/base_transformer.rb +0 -25
  139. data/lib/trace_viz/exporters/transformers/text_transformer.rb +0 -28
  140. data/lib/trace_viz/loggers/trace_builder.rb +0 -30
  141. data/lib/trace_viz/loggers/trace_formatters/base_formatter.rb +0 -32
  142. data/lib/trace_viz/loggers/trace_formatters/method_call_formatter.rb +0 -21
  143. data/lib/trace_viz/loggers/trace_formatters/method_return_formatter.rb +0 -22
@@ -1,14 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "../base"
3
+ require "trace_viz/traits"
4
+ require_relative "../node"
4
5
 
5
6
  module TraceViz
6
7
  module TraceData
7
8
  module TracePoint
8
- class Base < TraceData::Base
9
+ class Base < TraceData::Node
10
+ include Traits::Identifiable
11
+
9
12
  attr_reader :trace_point,
10
- :id,
11
- :action_id,
13
+ :memory_id,
12
14
  :event,
13
15
  :klass,
14
16
  :action,
@@ -19,18 +21,28 @@ module TraceViz
19
21
  super()
20
22
 
21
23
  @trace_point = trace_point
22
-
23
- populate_trace_attributes
24
+ populate_attributes
25
+ assign_memory_id
24
26
  assign_ids
25
27
  end
26
28
 
27
29
  def duration
28
- # TODO: Implement duration calculation
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
+ )
29
41
  end
30
42
 
31
43
  private
32
44
 
33
- def populate_trace_attributes
45
+ def populate_attributes
34
46
  @event = trace_point.event
35
47
  @klass = trace_point.defined_class
36
48
  @action = trace_point.callee_id
@@ -38,29 +50,8 @@ module TraceViz
38
50
  @line_number = trace_point.lineno
39
51
  end
40
52
 
41
- def assign_ids
42
- @id = generate_unique_id
43
- @action_id = generate_action_id
44
- end
45
-
46
- def memory_id
47
- trace_point.self.object_id
48
- end
49
-
50
- def generate_unique_id
51
- [
52
- memory_id,
53
- action,
54
- path,
55
- line_number,
56
- ].join("_")
57
- end
58
-
59
- def generate_action_id
60
- [
61
- memory_id,
62
- action,
63
- ].join("_")
53
+ def assign_memory_id
54
+ @memory_id = trace_point.self.object_id
64
55
  end
65
56
  end
66
57
  end
@@ -1,12 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "trace_viz/helpers/trace_point/param_helper"
3
4
  require_relative "base"
4
5
 
5
6
  module TraceViz
6
7
  module TraceData
7
8
  module TracePoint
8
9
  class MethodCall < Base
9
- attr_reader :params
10
+ include Helpers::TracePoint::ParamHelper
11
+
12
+ attr_reader :params, :method_return
10
13
 
11
14
  def initialize(trace_point)
12
15
  super(trace_point)
@@ -14,27 +17,29 @@ module TraceViz
14
17
  populate_params
15
18
  end
16
19
 
17
- private
18
-
19
- def populate_params
20
- @params = extract_params(trace_point.binding)
20
+ def link(method_return)
21
+ @method_return = method_return
21
22
  end
22
23
 
23
- def extract_params(binding)
24
- method = binding.eval("method(:#{action})")
25
- method.parameters.each_with_object({}) do |(_, name), hash|
26
- next unless name
27
- next if name.to_s.include?("*") # Skip invalid or special variable names
24
+ def duration
25
+ return 0 unless method_return
28
26
 
29
- value = safe_local_variable_get(binding, name)
30
- hash[name] = value
31
- end
27
+ method_return.timestamp - timestamp
32
28
  end
33
29
 
34
- def safe_local_variable_get(binding, name)
35
- binding.local_variable_defined?(name) ? binding.local_variable_get(name) : nil
36
- rescue NameError
37
- nil
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)
38
43
  end
39
44
  end
40
45
  end
@@ -6,7 +6,7 @@ module TraceViz
6
6
  module TraceData
7
7
  module TracePoint
8
8
  class MethodReturn < Base
9
- attr_reader :result
9
+ attr_reader :result, :method_call
10
10
 
11
11
  def initialize(trace_point)
12
12
  super(trace_point)
@@ -14,6 +14,26 @@ module TraceViz
14
14
  populate_result
15
15
  end
16
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
+
17
37
  private
18
38
 
19
39
  def populate_result
@@ -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
@@ -4,17 +4,17 @@ module TraceViz
4
4
  module Utils
5
5
  module Colorize
6
6
  class << self
7
- def colorize(text, *styles)
8
- return text if text.nil? || styles.empty?
7
+ def colorize(text, *colors)
8
+ return text if text.nil? || colors.empty?
9
9
 
10
- "#{build_color_sequence(styles)}#{text}#{Defaults.colors[:reset]}"
10
+ "#{build_color_sequence(colors)}#{text}#{Defaults::Colors.fetch(:default)}"
11
11
  end
12
12
 
13
13
  private
14
14
 
15
- def build_color_sequence(styles)
16
- styles
17
- .map { |style| Defaults.colors[style] }
15
+ def build_color_sequence(colors)
16
+ colors
17
+ .map { |color| Defaults::Colors.fetch(color) }
18
18
  .compact
19
19
  .join
20
20
  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
@@ -1,65 +1,22 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "format_utils/key_value_formatter"
4
+ require_relative "format_utils/value_truncator"
5
+
3
6
  module TraceViz
4
7
  module Utils
5
8
  module FormatUtils
6
9
  class << self
7
- # Formats a hash or array of key-value pairs based on the specified mode
10
+ # Formats key-value pairs based on the provided mode
8
11
  def format_key_value_pairs(data, mode)
9
- data.map { |key, value| display_mode(mode).call(key, value) }.join(", ")
10
- end
11
-
12
- # Determines how key-value pairs are displayed based on the mode
13
- def display_mode(mode)
14
- {
15
- name_and_value: ->(name, value) { "#{name}: #{value}" },
16
- name_only: ->(name, _) { name.to_s },
17
- value_only: ->(_, value) { value },
18
- }.fetch(mode)
19
- end
20
-
21
- # Truncates a string or array to the specified length
22
- def truncate_value(value, length)
23
- return value unless length.is_a?(Integer) && length.positive?
24
-
25
- case value
26
- when String
27
- truncate_string(value, length)
28
- when Array
29
- truncate_array(value, length)
30
- when Hash
31
- truncate_hash(value, length)
32
- else
33
- truncate_object(value, length)
34
- end
35
- end
36
-
37
- private
38
-
39
- def truncate_string(string, length)
40
- string.length > length ? "#{string[0, length]}..." : string
41
- end
42
-
43
- def truncate_array(array, length)
44
- truncated_array = array.take(length)
45
- truncated_array << "..." if array.size > length
46
- truncated_array
47
- end
48
-
49
- def truncate_hash(hash, length)
50
- keys = hash.keys.take(length)
51
- truncated_pairs = keys.map { |key| "#{key}: #{truncate_value(hash[key], length)}" }
52
- truncated_pairs << "..." if hash.size > length
53
- "{#{truncated_pairs.join(", ")}}"
12
+ formatter = KeyValueFormatter.new(mode: mode)
13
+ formatter.call(data)
54
14
  end
55
15
 
56
- def truncate_object(object, length)
57
- object_string = object.inspect
58
- if object.is_a?(Hash) || object.is_a?(Array)
59
- truncate_value(object, length)
60
- else
61
- object_string.length > length ? "#{object.class}(#{object_string[0, length]}...)" : object_string
62
- end
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)
63
20
  end
64
21
  end
65
22
  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.2"
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
@@ -0,0 +1,10 @@
1
+ module TraceViz
2
+ module Context
3
+ class Manager
4
+ def self.enter_contexts: (Hash[Symbol, untyped] contexts) -> void
5
+ def self.exit_contexts: (*Symbol keys) -> void
6
+ def self.with_contexts: (?Hash[Symbol, untyped] contexts) { () -> void } -> void
7
+ def self.fetch_context: (Symbol key) -> untyped
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,13 @@
1
+ module TraceViz
2
+ module Context
3
+ class Map
4
+ @context_map: Hash[Symbol, untyped]
5
+
6
+ def initialize: () -> void
7
+ def replace: (Hash[Symbol, untyped] new_map) -> void
8
+ def fetch: (Symbol key) -> untyped
9
+ def remove: (*Symbol keys) -> void
10
+ def reset: () -> void
11
+ end
12
+ end
13
+ end
data/sig/context.rbs ADDED
@@ -0,0 +1,5 @@
1
+ module TraceViz
2
+ module Context
3
+ def self.for: (Symbol key) -> TraceViz::Context::Manager
4
+ end
5
+ end