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,189 @@
1
+ {"version": 2, "width": 242, "height": 70, "timestamp": 1735967500, "env": {"SHELL": "/bin/zsh", "TERM": "xterm-256color"}}
2
+ [0.292339, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"]
3
+ [0.292893, "o", "\u001b]2;patrick204nqh@Patrick-Mac:~/Desktop/sandbox/trace_viz\u0007\u001b]1;..box/trace_viz\u0007"]
4
+ [0.294703, "o", "\u001b]7;file://Patrick-Mac.local/Users/patrick204nqh/Desktop/sandbox/trace_viz\u001b\\"]
5
+ [0.381608, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\r\n\u001b[1m\u001b[36mtrace_viz\u001b[0m\u001b[36m\u001b[39m\u001b[1m \u001b[0m\u001b[1m\u001b[39m…\u001b[0m\u001b[39m\u001b[1m\u001b[37m\r\n\u001b[0m\u001b[37m\u001b[39m\u001b[1m\u001b[32m➜ \u001b[0m\u001b[32m\u001b[39m\u001b[K\u001b[239C\u001b[1A\u001b[1B\u001b[239D"]
6
+ [0.381699, "o", "\u001b[?1h\u001b=\u001b[?2004h"]
7
+ [0.43318, "o", "\r\r\u001b[A\u001b[A\u001b[0m\u001b[27m\u001b[24m\u001b[J\r\n\u001b[1m\u001b[36mtrace_viz\u001b[0m\u001b[36m\u001b[39m\u001b[1m \u001b[0m\u001b[1m\u001b[39m…\u001b[0m\u001b[39m\u001b[1m\u001b[37m\r\n\u001b[0m\u001b[37m\u001b[39m\u001b[1m\u001b[32m➜ \u001b[0m\u001b[32m\u001b[39m\u001b[K\u001b[239C\u001b[1A\u001b[1B\u001b[239D"]
8
+ [0.559615, "o", "\r\r\u001b[A\u001b[A\u001b[0m\u001b[27m\u001b[24m\u001b[J\r\n\u001b[1m\u001b[36mtrace_viz\u001b[0m\u001b[36m\u001b[39m\u001b[1m \u001b[0m\u001b[1mvia \u001b[0m\u001b[1m\u001b[31m💎 v3.3.0\u001b[0m\u001b[31m\u001b[39m\u001b[1m \u001b[0m\u001b[1m\u001b[39m…\u001b[0m\u001b[39m\u001b[1m\u001b[37m\r\n\u001b[0m\u001b[37m\u001b[39m\u001b[1m\u001b[32m➜ \u001b[0m\u001b[32m\u001b[39m\u001b[K\u001b[239C\u001b[1A\u001b[1B\u001b[239D"]
9
+ [0.608213, "o", "\r\r\u001b[A\u001b[A\u001b[0m\u001b[27m\u001b[24m\u001b[J\r\n\u001b[1m\u001b[36mtrace_viz\u001b[0m\u001b[36m\u001b[39m\u001b[1m \u001b[0m\u001b[1mon \u001b[0m\u001b[1m\u001b[37m\u001b[1m\u001b[37m\u001b[35m develop\u001b[0m\u001b[35m\u001b[39m\u001b[1m\u001b[31m [⇡?]\u001b[0m\u001b[31m\u001b[39m\u001b[0m\u001b[39m\u001b[1m \u001b[0m\u001b[1mvia \u001b[0m\u001b[1m\u001b[31m💎 v3.3.0\u001b[0m\u001b[31m\u001b[39m\u001b[1m \u001b[0m\u001b[1m\u001b[39m…\u001b[0m\u001b[39m\u001b[1m\u001b[37m\r\n\u001b[0m\u001b[37m\u001b[39m\u001b[1m\u001b[32m➜ \u001b[0m\u001b[32m\u001b[39m\u001b[K\u001b[239C\u001b[1A\u001b[1B\u001b[239D"]
10
+ [0.751751, "o", "\r\r\u001b[A\u001b[A\u001b[0m\u001b[27m\u001b[24m\u001b[J\r\n\u001b[1m\u001b[36mtrace_viz\u001b[0m\u001b[36m\u001b[39m\u001b[1m \u001b[0m\u001b[1mon \u001b[0m\u001b[1m\u001b[37m\u001b[1m\u001b[37m\u001b[35m develop\u001b[0m\u001b[35m\u001b[39m\u001b[1m\u001b[31m [⇡?]\u001b[0m\u001b[31m\u001b[39m\u001b[0m\u001b[39m\u001b[1m \u001b[0m\u001b[1mvia \u001b[0m\u001b[1m\u001b[31m💎 v3.3.0\u001b[0m\u001b[31m\u001b[39m\u001b[1m \u001b[0m\u001b[1m\u001b[37m\r\n\u001b[0m\u001b[37m\u001b[39m\u001b[1m\u001b[32m➜ \u001b[0m\u001b[32m\u001b[39m\u001b[K\u001b[239C\u001b[1A\u001b[1B\u001b[239D"]
11
+ [1.032449, "o", "\u001b[H\u001b[2J\u001b[0m\u001b[27m\u001b[24m\u001b[J\r\n\u001b[1m\u001b[36mtrace_viz\u001b[0m\u001b[36m\u001b[39m\u001b[1m \u001b[0m\u001b[1mon \u001b[0m\u001b[1m\u001b[37m\u001b[1m\u001b[37m\u001b[35m develop\u001b[0m\u001b[35m\u001b[39m\u001b[1m\u001b[31m [⇡?]\u001b[0m\u001b[31m\u001b[39m\u001b[0m\u001b[39m\u001b[1m \u001b[0m\u001b[1mvia \u001b[0m\u001b[1m\u001b[31m💎 v3.3.0\u001b[0m\u001b[31m\u001b[39m\u001b[1m \u001b[0m\u001b[1m\u001b[37m\r\n\u001b[0m\u001b[37m\u001b[39m\u001b[1m\u001b[32m➜ \u001b[0m\u001b[32m\u001b[39m\u001b[K\u001b[239C\u001b[1A\u001b[1B\u001b[239D"]
12
+ [1.887263, "o", "n"]
13
+ [1.897704, "o", "\b\u001b[1m\u001b[31mn\u001b[0m\u001b[39m"]
14
+ [1.898063, "o", "\b\u001b[1m\u001b[31mn\u001b[0m\u001b[39m\u001b[90mpm update\u001b[39m\u001b[9D"]
15
+ [2.74247, "o", "\b\u001b[0m\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[10D"]
16
+ [3.18342, "o", "b"]
17
+ [3.189119, "o", "\b\u001b[4mb\u001b[24m"]
18
+ [3.189374, "o", "\b\u001b[4mb\u001b[24m\u001b[90mat tmp/trace_output.txt\u001b[39m\u001b[23D"]
19
+ [3.319126, "o", "\b\u001b[4mb\u001b[39m\u001b[4ma\u001b[24m"]
20
+ [3.32368, "o", "\b\b\u001b[24m\u001b[1m\u001b[31mb\u001b[24m\u001b[1m\u001b[31ma\u001b[0m\u001b[39m"]
21
+ [3.554232, "o", "\b\b\u001b[1m\u001b[31mb\u001b[1m\u001b[31ma\u001b[1m\u001b[31mt\u001b[0m\u001b[39m"]
22
+ [3.556947, "o", "\b\b\b\u001b[0m\u001b[32mb\u001b[0m\u001b[32ma\u001b[0m\u001b[32mt\u001b[39m"]
23
+ [3.810466, "o", "\b\u001b[32mt\u001b[32m \u001b[39m"]
24
+ [3.812702, "o", "\b\b\u001b[32mt\u001b[39m\u001b[39m "]
25
+ [4.123578, "o", "\u001b[39me\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[19D"]
26
+ [4.127925, "o", "\b\u001b[4me\u001b[24m"]
27
+ [4.128251, "o", "\u001b[90mxamples/eu_central_bank.rb\u001b[39m\u001b[26D"]
28
+ [4.385978, "o", "\b\u001b[4me\u001b[39m\u001b[4mx\u001b[24m"]
29
+ [4.511367, "o", "\b\u001b[4mx\u001b[39m\u001b[4ma\u001b[24m"]
30
+ [4.894204, "o", "\u001b[39mm\u001b[39mp\u001b[39ml\u001b[39me\u001b[39ms\u001b[39m/\u001b[39me\u001b[39mu\u001b[39m_\u001b[39mc\u001b[39me\u001b[39mn\u001b[39mt\u001b[39mr\u001b[39ma\u001b[39ml\u001b[39m_\u001b[39mb\u001b[39ma\u001b[39mn\u001b[39mk\u001b[39m.\u001b[39mr\u001b[39mb"]
31
+ [4.897206, "o", "\u001b[25D\u001b[4ma\u001b[4mm\u001b[4mp\u001b[4ml\u001b[4me\u001b[4ms\u001b[4m/\u001b[4me\u001b[4mu\u001b[4m_\u001b[4mc\u001b[4me\u001b[4mn\u001b[4mt\u001b[4mr\u001b[4ma\u001b[4ml\u001b[4m_\u001b[4mb\u001b[4ma\u001b[4mn\u001b[4mk\u001b[4m.\u001b[4mr\u001b[4mb\u001b[24m"]
32
+ [5.481568, "o", "\u001b[?1l\u001b>"]
33
+ [5.481772, "o", "\u001b[?2004l"]
34
+ [5.484482, "o", "\r\r\n"]
35
+ [5.485428, "o", "\u001b]2;bat examples/eu_central_bank.rb\u0007\u001b]1;bat\u0007"]
36
+ [5.535269, "o", "\u001b[?1049h\u001b[?1h\u001b=\r\u001b[38;5;238m───────┬──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\u001b[m\r\n \u001b[38;5;238m│ \u001b[0mFile: \u001b[1mexamples/eu_central_bank.rb\u001b[0m\u001b[m\r\n\u001b[38;5;238m───────┼───────────────────────────────────────────────────"]
37
+ [5.535356, "o", "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\u001b[m\r\n\u001b[38;5;238m 1\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;246;170;17m$\u001b[0m\u001b[38;2;255;255;255mLOAD_PATH\u001b[0m\u001b[38;2;248;248;242m.\u001b[0m\u001b[38;2;248;248;242munshift\u001b[0m\u001b[38;2;255;255;255m(\u001b[0m\u001b[38;2;102;217;239mFile\u001b[0m\u001b[38;2;248;248;242m.\u001b[0m\u001b[38;2;248;248;242mexpand_path\u001b[0m\u001b[38;2;255;255;255m(\u001b[0m\u001b[38;2;249;38;114m\"\u001b[0m\u001b[38;2;230;219;116m../lib\u001b[0m\u001b[38;2;249;38;114m\"\u001b[0m\u001b[38;2;248;248;242m,\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;102;217;239m__dir__\u001b[0m\u001b[38;2;255;255;255m)\u001b[0m\u001b[38;2;2"]
38
+ [5.535473, "o", "5"]
39
+ [5.535549, "o", "5;255;255m)\u001b[0m\u001b[m\r\n\u001b[38;5;238m 2\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;249;38;114mrequire\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;249;38;114m'\u001b[0m\u001b[38;2;230;219;116meu_central_bank\u001b[0m\u001b[38;2;249;38;114m'\u001b[0m\u001b[m\r\n\u001b[38;5;238m 3\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;249;38;114mrequire\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;249;38;114m'\u001b[0m\u001b[38;2;230;219;116mi18n\u001b[0m\u001b[38;2;249;38;114m'\u001b[0m\u001b[m\r\n\u001b[38;5;238m 4\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;249;38;114mrequire\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;249;38;114m'\u001b[0m\u001b[38;2;230;219;116mtrace_viz\u001b[0m\u001b[38;2;249;38;114m'\u001b[0m\u001b[m\r\n\u001b[38;5;238m 5\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[m\r\n\u001b[38;5;238m 6\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;117;113;94m#\u001b[0m\u001b[38;2;117;113;94m Fix the locale issue\u001b[0m\u001b[m\r\n\u001b[38;5;238m 7\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;102;217;239mI18n\u001b[0m\u001b[38;2;248;248;242m.\u001b[0m\u001b[38;2;248;248;242mconfig\u001b[0m\u001b[38;2;248;248;242m.\u001b[0m\u001b[38;2;248;248;242mavailable_locales \u001b[0m\u001b[38;2;249;38;114m=\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;248;248;242m[\u001b[0m\u001b[38;2;246;240;128m:\u001b[0m\u001b[38;2;246;240;128men\u001b[0m\u001b[38;2;2"]
40
+ [5.535691, "o", "48;248;242m]\u001b[0m\u001b[m\r\n\u001b[38;5;238m 8\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;102;217;239mI18n\u001b[0m\u001b[38;2;248;248;242m.\u001b[0m\u001b[38;2;248;248;242mlocale \u001b[0m\u001b[38;2;249;38;114m=\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;246;240;128m:\u001b[0m\u001b[38;2;246;240;128men\u001b[0m\u001b[m\r\n\u001b[38;5;238m 9\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[m\r\n\u001b[38;5;238m 10\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;102;217;239mTraceViz\u001b[0m\u001b[38;2;248;248;242m.\u001b[0m\u001b[38;2;248;248;242mtrace\u001b[0m\u001b[38;2;255;255;255m(\u001b[0m\u001b[m\r\n\u001b[38;5;238m 11\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;246;240;128mgeneral\u001b[0m\u001b[38;2;246;240;128m:\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;248;248;242m{\u001b[0m\u001b[m\r\n\u001b[38;5;238m 12\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;246;240;128mtab_size\u001b[0m\u001b[38;2;246;240;128m:\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;190;132;255m1\u001b[0m\u001b[38;2;248;248;242m,\u001b[0m\u001b[m\r\n\u001b[38;5;238m 13\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;246;240;128mmode\u001b[0m\u001b[38;2;246;240;128m:\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;246;240;128m:\u001b[0m\u001b[38;2;246;240;128msummary\u001b[0m\u001b[38;2;248;"]
41
+ [5.535767, "o", "248;242m,\u001b[0m\u001b[m\r\n\u001b[38;5;238m 14\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;246;240;128mshow_indent\u001b[0m\u001b[38;2;246;240;128m:\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;174;129;255mtrue\u001b[0m\u001b[38;2;248;248;242m,\u001b[0m\u001b[m\r\n\u001b[38;5;238m 15\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;246;240;128mshow_depth\u001b[0m\u001b[38;2;246;240;128m:\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;174;129;255mtrue\u001b[0m\u001b[38;2;248;248;242m,\u001b[0m\u001b[m\r\n\u001b[38;5;238m 16\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;246;240;128mmax_display_depth\u001b[0m\u001b[38;2;246;240;128m:\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;190;132;255m5\u001b[0m\u001b[38;2;248;248;242m,\u001b[0m\u001b[m\r\n\u001b[38;5;238m 17\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;246;240;128mshow_method_name\u001b[0m\u001b[38;2;246;240;128m:\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;174;129;255mtrue\u001b[0m\u001b[38;2;248;248;242m,\u001b[0m\u001b[m\r\n\u001b[38;5;238m 18\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;248;248;242m}\u001b[0m\u001b[38;2;248;248;242m,\u001b[0m\u001b[m\r\n\u001b[38;5;238m 19\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;"]
42
+ [5.535826, "o", "242m \u001b[0m\u001b[38;2;246;240;128mparams\u001b[0m\u001b[38;2;246;240;128m:\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;248;248;242m{\u001b[0m\u001b[m\r\n\u001b[38;5;238m 20\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;246;240;128mshow\u001b[0m\u001b[38;2;246;240;128m:\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;174;129;255mtrue\u001b[0m\u001b[38;2;248;248;242m,\u001b[0m\u001b[m\r\n\u001b[38;5;238m 21\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;246;240;128mmode\u001b[0m\u001b[38;2;246;240;128m:\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;246;240;128m:\u001b[0m\u001b[38;2;246;240;128mname_only\u001b[0m\u001b[38;2;248;248;242m,\u001b[0m\u001b[m\r\n\u001b[38;5;238m 22\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;117;113;94m#\u001b[0m\u001b[38;2;117;113;94m truncate_length: 10\u001b[0m\u001b[m\r\n\u001b[38;5;238m 23\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;248;248;242m}\u001b[0m\u001b[38;2;248;248;242m,\u001b[0m\u001b[m\r\n\u001b[38;5;238m 24\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;246;240;128mresult\u001b[0m\u001b[38;2;246;240;128m:\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;248;248;242m{\u001b[0m\u001b[m\r\n\u001b[38;5;238m 25\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;"]
43
+ [5.535847, "o", "248;242m \u001b[0m\u001b[38"]
44
+ [5.535899, "o", ";2;246;240;128mshow\u001b[0m\u001b[38;2;246;240;128m:\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;174;129;255mtrue\u001b[0m\u001b[38;2;248;248;242m,\u001b[0m\u001b[m\r\n\u001b[38;5;238m 26\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;246;240;128mtruncate_length\u001b[0m\u001b[38;2;246;240;128m:\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;190;132;255m15\u001b[0m\u001b[38;2;248;248;242m,\u001b[0m\u001b[m\r\n\u001b[38;5;238m 27\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;248;248;242m}\u001b[0m\u001b[38;2;248;248;242m,\u001b[0m\u001b[m\r\n\u001b[38;5;238m 28\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;246;240;128msource_location\u001b[0m\u001b[38;2;246;240;128m:\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;248;248;242m{\u001b[0m\u001b[m\r\n\u001b[38;5;238m 29\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;246;240;128mshow\u001b[0m\u001b[38;2;246;240;128m:\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;174;129;255mtrue\u001b[0m\u001b[38;2;248;248;242m,\u001b[0m\u001b[m\r\n\u001b[38;5;238m 30\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;246;240;128mtruncate_length\u001b[0m\u001b[38;2;246;240;128m:\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;190;132;255m50\u001b[0m\u001b[38;2;248;"]
45
+ [5.535962, "o", "248;242m,\u001b[0m\u001b[m\r\n\u001b[38;5;238m 31\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;248;248;242m}\u001b[0m\u001b[38;2;248;248;242m,\u001b[0m\u001b[m\r\n\u001b[38;5;238m 32\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;246;240;128mexecution\u001b[0m\u001b[38;2;246;240;128m:\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;248;248;242m{\u001b[0m\u001b[m\r\n\u001b[38;5;238m 33\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;246;240;128mshow_time\u001b[0m\u001b[38;2;246;240;128m:\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;174;129;255mtrue\u001b[0m\u001b[38;2;248;248;242m,\u001b[0m\u001b[m\r\n\u001b[38;5;238m 34\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;246;240;128mshow_trace_events\u001b[0m\u001b[38;2;246;240;128m:\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;248;248;242m[\u001b[0m\u001b[38;2;246;240;128m:\u001b[0m\u001b[38;2;246;240;128mcall\u001b[0m\u001b[38;2;248;248;242m,\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;246;240;128m:\u001b[0m\u001b[38;2;246;240;128mreturn\u001b[0m\u001b[38;2;248;248;242m]\u001b[0m\u001b[38;2;248;248;242m,\u001b[0m\u001b[m\r\n\u001b[38;5;238m 35\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;248;248;242m}\u001b[0m\u001b[38;2;248;248;242m,\u001b[0m\u001b[m\r\n\u001b[38"]
46
+ [5.536019, "o", ";5;238m "]
47
+ [5.536121, "o", "36\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;246;240;128mlog\u001b[0m\u001b[38;2;246;240;128m:\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;248;248;242m{\u001b[0m\u001b[m\r\n\u001b[38;5;238m 37\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;246;240;128mruntime\u001b[0m\u001b[38;2;246;240;128m:\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;174;129;255mfalse\u001b[0m\u001b[38;2;248;248;242m,\u001b[0m\u001b[m\r\n\u001b[38;5;238m 38\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;246;240;128mpost_collection\u001b[0m\u001b[38;2;246;240;128m:\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;174;129;255mtrue\u001b[0m\u001b[38;2;248;248;242m,\u001b[0m\u001b[m\r\n\u001b[38;5;238m 39\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;246;240;128mstats\u001b[0m\u001b[38;2;246;240;128m:\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;174;129;255mtrue\u001b[0m\u001b[m\r\n\u001b[38;5;238m 40\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;248;248;242m}\u001b[0m\u001b[38;2;248;248;242m,\u001b[0m\u001b[m\r\n\u001b[38;5;238m 41\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;246;240;128mfilters\u001b[0m\u001b[38;2;246;240;128m:\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;248;248;2"]
48
+ [5.536174, "o", "42m[\u001b[0m\u001b[m\r\n\u001b[38;5;238m 42\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;246;240;128m:\u001b[0m\u001b[38;2;246;240;128mexclude_internal_call\u001b[0m\u001b[38;2;248;248;242m,\u001b[0m\u001b[m\r\n\u001b[38;5;238m 43\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;246;240;128m:\u001b[0m\u001b[38;2;246;240;128mexclude_default_classes\u001b[0m\u001b[38;2;248;248;242m,\u001b[0m\u001b[m\r\n\u001b[38;5;238m 44\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;117;113;94m#\u001b[0m\u001b[38;2;117;113;94m include_classes: {\u001b[0m\u001b[m\r\n\u001b[38;5;238m 45\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;117;113;94m#\u001b[0m\u001b[38;2;117;113;94m classes: [EuCentralBank],\u001b[0m\u001b[m\r\n\u001b[38;5;238m 46\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;117;113;94m#\u001b[0m\u001b[38;2;117;113;94m },\u001b[0m\u001b[m\r\n\u001b[38;5;238m 47\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;117;113;94m#\u001b[0m\u001b[38;2;117;113;94m exclude_classes: {\u001b[0m\u001b[m\r\n\u001b[38;5;238m 48\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;117;113;94m#\u001b[0m\u001b[38;2;117;113;94m classes: ['Gem']\u001b[0m\u001b[m\r\n\u001b"]
49
+ [5.536204, "o", "[38;5;238m "]
50
+ [5.536245, "o", " 49\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;117;113;94m#\u001b[0m\u001b[38;2;117;113;94m },\u001b[0m\u001b[m\r\n\u001b[38;5;238m 50\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;246;240;128mexclude_gems\u001b[0m\u001b[38;2;246;240;128m:\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;248;248;242m{\u001b[0m\u001b[m\r\n\u001b[38;5;238m 51\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;246;240;128mgems\u001b[0m\u001b[38;2;246;240;128m:\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;248;248;242m[\u001b[0m\u001b[38;2;249;38;114m'\u001b[0m\u001b[38;2;230;219;116mnokogiri\u001b[0m\u001b[38;2;249;38;114m'\u001b[0m\u001b[38;2;248;248;242m,\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;249;38;114m'\u001b[0m\u001b[38;2;230;219;116mmoney\u001b[0m\u001b[38;2;249;38;114m'\u001b[0m\u001b[38;2;248;248;242m,\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;249;38;114m'\u001b[0m\u001b[38;2;230;219;116mi18n\u001b[0m\u001b[38;2;249;38;114m'\u001b[0m\u001b[38;2;248;248;242m]\u001b[0m\u001b[m\r\n\u001b[38;5;238m 52\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;248;248;242m}\u001b[0m\u001b[m\r\n\u001b[38;5;238m 53\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;248;248;242m]\u001b[0m\u001b[38;2;248;248;242m,\u001b[0m\u001b[m\r\n\u001b"]
51
+ [5.53628, "o", "[38;5;238m 54\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;246;240;128mexport\u001b[0m\u001b[38;2;246;240;128m:\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;248;248;242m{\u001b[0m\u001b[m\r\n\u001b[38;5;238m 55\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;246;240;128menabled\u001b[0m\u001b[38;2;246;240;128m:\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;174;129;255mtrue\u001b[0m\u001b[38;2;248;248;242m,\u001b[0m\u001b[m\r\n\u001b[38;5;238m 56\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;246;240;128mformat\u001b[0m\u001b[38;2;246;240;128m:\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;246;240;128m:\u001b[0m\u001b[38;2;246;240;128mtxt\u001b[0m\u001b[38;2;248;248;242m,\u001b[0m\u001b[m\r\n\u001b[38;5;238m 57\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;246;240;128moverwrite\u001b[0m\u001b[38;2;246;240;128m:\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;174;129;255mtrue\u001b[0m\u001b[38;2;248;248;242m,\u001b[0m\u001b[m\r\n\u001b[38;5;238m 58\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;248;248;242m}\u001b[0m\u001b[m\r\n\u001b[38;5;238m 59\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;255;255;255m)\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;249;38;114mdo\u001b[0m\u001b[m\r\n\u001b[38;5;238"]
52
+ [5.536335, "o", "m 60\u001b[0m"]
53
+ [5.536397, "o", " \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;117;113;94m#\u001b[0m\u001b[38;2;117;113;94m Create a new instance of the EuCentralBank\u001b[0m\u001b[m\r\n\u001b[38;5;238m 61\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m bank \u001b[0m\u001b[38;2;249;38;114m=\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;102;217;239mEuCentralBank\u001b[0m\u001b[38;2;248;248;242m.\u001b[0m\u001b[38;2;166;226;46mnew\u001b[0m\u001b[m\r\n\u001b[38;5;238m 62\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[m\r\n\u001b[38;5;238m 63\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;117;113;94m#\u001b[0m\u001b[38;2;117;113;94m Trace the update of exchange rates\u001b[0m\u001b[m\r\n\u001b[38;5;238m 64\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m bank\u001b[0m\u001b[38;2;248;248;242m.\u001b[0m\u001b[38;2;248;248;242mupdate_rates\u001b[0m\u001b[m\r\n\u001b[38;5;238m 65\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[m\r\n\u001b[38;5;238m 66\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;117;113;94m#\u001b[0m\u001b[38;2;117;113;94m Trace conversion of currency\u001b[0m\u001b[m\r\n:\u001b[K"]
54
+ [6.883177, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K"]
55
+ [6.883281, "o", "\u001b[38;5;238m 67\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m result \u001b[0m\u001b[38;2;249;38;114m=\u001b[0m\u001b[38;2;248;248;242m bank\u001b[0m\u001b[38;2;248;248;242m.\u001b[0m\u001b[38;2;248;248;242mexchange\u001b[0m\u001b[38;2;255;255;255m(\u001b[0m\u001b[38;2;190;132;255m50\u001b[0m\u001b[38;2;248;248;242m,\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;249;38;114m'\u001b[0m\u001b[38;2;230;219;116mUSD\u001b[0m\u001b[38;2;249;38;114m'\u001b[0m\u001b[38;2;248;248;242m,\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;249;38;114m'\u001b[0m\u001b[38;2;230;219;116mEUR\u001b[0m\u001b[38;2;249;38;114m'\u001b[0m\u001b[38;2;255;255;255m)\u001b[0m\u001b[m\r\n:\u001b[K"]
56
+ [6.929984, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\u001b[38;5;238m 68\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;102;217;239mputs\u001b[0m\u001b[38;2;248;248;242m \u001b[0m\u001b[38;2;249;38;114m\"\u001b[0m\u001b[38;2;230;219;116mConverted amount: \u001b[0m\u001b[38;2;248;248;242m#{\u001b[0m\u001b[38;2;248;248;242mresult\u001b[0m\u001b[38;2;248;248;242m}\u001b[0m\u001b[38;2;249;38;114m\"\u001b[0m\u001b[m\r\n:\u001b[K"]
57
+ [6.982182, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K"]
58
+ [6.982602, "o", "\u001b[38;5;238m 69\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;249;38;114mend\u001b[0m\u001b[m\r\n:\u001b[K"]
59
+ [7.040028, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K"]
60
+ [7.040124, "o", "\u001b[38;5;238m───────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\u001b[m\r\n:\u001b[K"]
61
+ [7.096966, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\u0007\r\u001b[K\u001b[7m(END)\u001b[27m\u001b[K"]
62
+ [7.155845, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\r\u001b[K\u001b[7m(END)\u001b[27m\u001b[K"]
63
+ [7.232304, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\r\u001b[K\u001b[7m(END)\u001b[27m\u001b[K"]
64
+ [7.297116, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\u0007\r\u001b[K\u001b[7m(END)\u001b[27m\u001b[K"]
65
+ [7.373575, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\r\u001b[K\u001b[7m(END)\u001b[27m\u001b[K"]
66
+ [7.413188, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\r\u001b[K\u001b[7m(END)\u001b[27m\u001b[K"]
67
+ [7.472814, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\r\u001b[K\u001b[7m(END)\u001b[27m\u001b[K"]
68
+ [7.514732, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\r\u001b[K\u001b[7m(END)\u001b[27m\u001b[K"]
69
+ [7.546937, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\r\u001b[K\u001b[7m(END)\u001b[27m\u001b[K"]
70
+ [7.563359, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\r\u001b[K\u001b[7m(END)\u001b[27m\u001b[K"]
71
+ [7.597565, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\r\u001b[K\u001b[7m(END)\u001b[27m\u001b[K"]
72
+ [7.614445, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K"]
73
+ [7.614539, "o", "\r\u001b[K\u001b[7m(END)\u001b[27m\u001b[K"]
74
+ [7.638313, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\r\u001b[K\u001b[7m(END)\u001b[27m\u001b[K"]
75
+ [7.656177, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\r\u001b[K\u001b[7m(END)\u001b[27m\u001b[K"]
76
+ [7.672448, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K"]
77
+ [7.672519, "o", "\r\u001b[K\u001b[7m(END)\u001b[27m\u001b[K"]
78
+ [7.697407, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\r\u001b[K\u001b[7m(END)\u001b[27m\u001b[K"]
79
+ [7.721632, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\r\u001b[K\u001b[7m(END)\u001b[27m\u001b[K"]
80
+ [7.756171, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\r\u001b[K\u001b[7m(END)\u001b[27m\u001b[K"]
81
+ [7.780013, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\r\u001b[K\u001b[7m(END)\u001b[27m\u001b[K"]
82
+ [7.822717, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\r\u001b[K\u001b[7m(END)\u001b[27m\u001b[K"]
83
+ [7.863136, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\r\u001b[K\u001b[7m(END)\u001b[27m\u001b[K"]
84
+ [7.93099, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\r\u001b[K\u001b[7m(END)\u001b[27m\u001b[K"]
85
+ [8.013234, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K\r\u001b[K\u001b[7m(END)\u001b[27m\u001b[K"]
86
+ [8.324059, "o", "\r\u001b[K \u001b[KESC\b\b\bESC\u001b[KO\bO\u001b[KB\bB\r\u001b[K"]
87
+ [8.324205, "o", "\u0007\r\u001b[K\u001b[7m(END)\u001b[27m\u001b[K"]
88
+ [8.634534, "o", "\r\u001b[K\u001b[?1l\u001b>\u001b[?1049l"]
89
+ [8.637498, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"]
90
+ [8.637791, "o", "\u001b]2;patrick204nqh@Patrick-Mac:~/Desktop/sandbox/trace_viz\u0007\u001b]1;..box/trace_viz\u0007"]
91
+ [8.642929, "o", "\u001b]7;file://Patrick-Mac.local/Users/patrick204nqh/Desktop/sandbox/trace_viz\u001b\\"]
92
+ [8.741206, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\r\n\u001b[1m\u001b[36mtrace_viz\u001b[0m\u001b[36m\u001b[39m\u001b[1m \u001b[0m\u001b[1mtook \u001b[0m\u001b[1m\u001b[33m3.2s\u001b[0m\u001b[33m\u001b[39m\u001b[1m \u001b[0m\u001b[1m\u001b[39m…\u001b[0m\u001b[39m\u001b[1m\u001b[37m\r\n\u001b[0m\u001b[37m\u001b[39m\u001b[1m\u001b[32m➜ \u001b[0m\u001b[32m\u001b[39m\u001b[K\u001b[239C\u001b[1A\u001b[1B\u001b[239D"]
93
+ [8.741299, "o", "\u001b[?1h\u001b=\u001b[?2004h"]
94
+ [8.792386, "o", "\r\r\u001b[A\u001b[A\u001b[0m\u001b[27m\u001b[24m\u001b[J\r\n\u001b[1m\u001b[36mtrace_viz\u001b[0m\u001b[36m\u001b[39m\u001b[1m \u001b[0m\u001b[1mtook \u001b[0m\u001b[1m\u001b[33m3.2s\u001b[0m\u001b[33m\u001b[39m\u001b[1m \u001b[0m\u001b[1m\u001b[39m…\u001b[0m\u001b[39m\u001b[1m\u001b[37m\r\n\u001b[0m\u001b[37m\u001b[39m\u001b[1m\u001b[32m➜ \u001b[0m\u001b[32m\u001b[39m\u001b[K\u001b[239C\u001b[1A\u001b[1B\u001b[239D"]
95
+ [8.91581, "o", "\r\r\u001b[A\u001b[A\u001b[0m\u001b[27m\u001b[24m\u001b[J\r\n\u001b[1m\u001b[36mtrace_viz\u001b[0m\u001b[36m\u001b[39m\u001b[1m \u001b[0m\u001b[1mvia \u001b[0m\u001b[1m\u001b[31m💎 v3.3.0\u001b[0m\u001b[31m\u001b[39m\u001b[1m \u001b[0m\u001b[1mtook \u001b[0m\u001b[1m\u001b[33m3.2s\u001b[0m\u001b[33m\u001b[39m\u001b[1m \u001b[0m\u001b[1m\u001b[39m…\u001b[0m\u001b[39m\u001b[1m\u001b[37m\r\n\u001b[0m\u001b[37m\u001b[39m\u001b[1m\u001b[32m➜ \u001b[0m\u001b[32m\u001b[39m\u001b[K\u001b[239C\u001b[1A\u001b[1B\u001b[239D"]
96
+ [8.970422, "o", "\r\r\u001b[A\u001b[A\u001b[0m\u001b[27m\u001b[24m\u001b[J\r\n\u001b[1m\u001b[36mtrace_viz\u001b[0m\u001b[36m\u001b[39m\u001b[1m \u001b[0m\u001b[1mon \u001b[0m\u001b[1m\u001b[37m\u001b[1m\u001b[37m\u001b[35m develop\u001b[0m\u001b[35m\u001b[39m\u001b[1m\u001b[31m [⇡?]\u001b[0m\u001b[31m\u001b[39m\u001b[0m\u001b[39m\u001b[1m \u001b[0m\u001b[1mvia \u001b[0m\u001b[1m\u001b[31m💎 v3.3.0\u001b[0m\u001b[31m\u001b[39m\u001b[1m \u001b[0m\u001b[1mtook \u001b[0m\u001b[1m\u001b[33m3.2s\u001b[0m\u001b[33m\u001b[39m\u001b[1m \u001b[0m\u001b[1m\u001b[39m…\u001b[0m\u001b[39m\u001b[1m\u001b[37m\r\n\u001b[0m\u001b[37m\u001b[39m\u001b[1m\u001b[32m➜ \u001b[0m\u001b[32m\u001b[39m\u001b[K\u001b[239C\u001b[1A\u001b[1B\u001b[239D"]
97
+ [9.111812, "o", "\r\r\u001b[A\u001b[A\u001b[0m\u001b[27m\u001b[24m\u001b[J\r\n\u001b[1m\u001b[36mtrace_viz\u001b[0m\u001b[36m\u001b[39m\u001b[1m \u001b[0m\u001b[1mon \u001b[0m\u001b[1m\u001b[37m\u001b[1m\u001b[37m\u001b[35m develop\u001b[0m\u001b[35m\u001b[39m\u001b[1m\u001b[31m [⇡?]\u001b[0m\u001b[31m\u001b[39m\u001b[0m\u001b[39m\u001b[1m \u001b[0m\u001b[1mvia \u001b[0m\u001b[1m\u001b[31m💎 v3.3.0\u001b[0m\u001b[31m\u001b[39m\u001b[1m \u001b[0m\u001b[1mtook \u001b[0m\u001b[1m\u001b[33m3.2s\u001b[0m\u001b[33m\u001b[39m\u001b[1m \u001b[0m\u001b[1m\u001b[37m\r\n\u001b[0m\u001b[37m\u001b[39m\u001b[1m\u001b[32m➜ \u001b[0m\u001b[32m\u001b[39m\u001b[K\u001b[239C\u001b[1A\u001b[1B\u001b[239D"]
98
+ [9.725681, "o", "r"]
99
+ [9.728399, "o", "\b\u001b[32mr\u001b[39m"]
100
+ [9.729089, "o", "\b\u001b[32mr\u001b[39m\u001b[90muby examples/eu_central_bank.rb\u001b[39m\u001b[31D"]
101
+ [9.82513, "o", "\b\u001b[32mr\u001b[32mu\u001b[39m"]
102
+ [9.830346, "o", "\b\b\u001b[1m\u001b[31mr\u001b[1m\u001b[31mu\u001b[0m\u001b[39m"]
103
+ [9.988699, "o", "\b\b\u001b[1m\u001b[31mr\u001b[1m\u001b[31mu\u001b[1m\u001b[31mb\u001b[0m\u001b[39m"]
104
+ [10.09082, "o", "\b\u001b[1m\u001b[31mb\u001b[1m\u001b[31my\u001b[0m\u001b[39m"]
105
+ [10.091809, "o", "\b\b\b\b\u001b[0m\u001b[32mr\u001b[0m\u001b[32mu\u001b[0m\u001b[32mb\u001b[0m\u001b[32my\u001b[39m"]
106
+ [10.78011, "o", "\u001b[39m \u001b[39me\u001b[39mx\u001b[39ma\u001b[39mm\u001b[39mp\u001b[39ml\u001b[39me\u001b[39ms\u001b[39m/\u001b[39me\u001b[39mu\u001b[39m_\u001b[39mc\u001b[39me\u001b[39mn\u001b[39mt\u001b[39mr\u001b[39ma\u001b[39ml\u001b[39m_\u001b[39mb\u001b[39ma\u001b[39mn\u001b[39mk\u001b[39m.\u001b[39mr\u001b[39mb"]
107
+ [10.781317, "o", "\u001b[27D\u001b[4me\u001b[4mx\u001b[4ma\u001b[4mm\u001b[4mp\u001b[4ml\u001b[4me\u001b[4ms\u001b[4m/\u001b[4me\u001b[4mu\u001b[4m_\u001b[4mc\u001b[4me\u001b[4mn\u001b[4mt\u001b[4mr\u001b[4ma\u001b[4ml\u001b[4m_\u001b[4mb\u001b[4ma\u001b[4mn\u001b[4mk\u001b[4m.\u001b[4mr\u001b[4mb\u001b[24m"]
108
+ [11.473352, "o", "\u001b[?1l\u001b>"]
109
+ [11.473406, "o", "\u001b[?2004l"]
110
+ [11.474614, "o", "\r\r\n"]
111
+ [11.475448, "o", "\u001b]2;ruby examples/eu_central_bank.rb\u0007\u001b]1;ruby\u0007"]
112
+ [12.525471, "o", "[WARNING] The default rounding mode will change from `ROUND_HALF_EVEN` to `ROUND_HALF_UP` in the next major release. Set it explicitly using `Money.rounding_mode=` to avoid potential problems.\r\n"]
113
+ [12.526926, "o", "[DEPRECATION] You are using the default localization behaviour that will change in the next major release. Find out more - https://github.com/RubyMoney/money#deprecation\r\n"]
114
+ [12.536495, "o", "Converted amount: 0,49\r\n"]
115
+ [12.538476, "o", "\u001b[38;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m0\u001b[0m\u001b[38;5;234m]\u001b[0m \u001b[1m\u001b[38;5;64mEuCentralBank\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5;33minitialize\u001b[0m \u001b[38;5;240mat .../gems/eu_central_bank-1.7.0/lib/eu_central_bank.rb:27\u001b[0m (\u001b[38;5;166mst\u001b[0m, \u001b[38;5;166mblock\u001b[0m) \u001b[38;5;245m#=>\u001b[0m \u001b[38;5;230mnil\u001b[0m \u001b[38;5;37min 0.000112ms\u001b[0m\u001b[0m\r\n\u001b[38;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m0\u001b[0m\u001b[38;5;234m]\u001b[0m \u001b[1m\u001b[38;5;64mEuCentralBank\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5;33mupdate_rates\u001b[0m \u001b[38;5;240mat .../gems/eu_central_bank-1.7.0/lib/eu_central_bank.rb:32\u001b[0m (\u001b[38;5;166mcache\u001b[0m, \u001b[38;5;166murl\u001b[0m) \u001b[38;5;245m#=>\u001b[0m \u001b[38;5;230m2025-01-04 12:1...\u001b[0m \u001b[38;5;37min 0.709774ms\u001b[0m\u001b[0m\r\n"]
116
+ [12.5386, "o", "\u001b[38;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m1\u001b[0m\u001b[38;5;234m]\u001b[0m \u001b[1m\u001b[38;5;64mEuCentralBank\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5;33mdoc\u001b[0m \u001b[38;5;240mat .../gems/eu_central_bank-1.7.0/lib/eu_central_bank.rb:175\u001b[0m (\u001b[38;5;166mcache\u001b[0m, \u001b[38;5;166murl\u001b[0m) \u001b[38;5;245m#=>\u001b[0m \u001b[38;5;230m#<EuCentralBank...\u001b[0m \u001b[38;5;37min 0.687315ms\u001b[0m\u001b[0m\r\n\u001b[38;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m2\u001b[0m\u001b[38;5;234m]\u001b[0m \u001b[1m\u001b[38;5;64mEuCentralBank\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5;33mopen_url\u001b[0m \u001b[38;5;240mat .../gems/eu_central_bank-1.7.0/lib/eu_central_bank.rb:237\u001b[0m (\u001b[38;5;166murl\u001b[0m) \u001b[38;5;245m#=>\u001b[0m \u001b[38;5;230m#<StringIO:0x00...\u001b[0m \u001b[38;5;37min 0.668835ms\u001b[0m\u001b[0m\r\n\u001b[38;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m3\u001b[0m\u001b[38;5;234m]\u001b[0m \u001b[1m\u001b[38;5;64m#<Class:URI>\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5;33mopen\u001b[0m \u001b[38;5;240mat ...sdf/installs/ruby/3.3.0/lib/ruby/3.3.0/open-uri.rb:23\u001b[0m () \u001b[38;5;245m#=>\u001b[0m \u001b[38;5;230m#<StringIO:0x00...\u001b[0m \u001b["]
117
+ [12.53868, "o", "38;5;37min 0.668764ms\u001b[0m\u001b[0m\r\n\u001b[38;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m4\u001b[0m\u001b[38;5;234m]\u001b[0m \u001b[1m\u001b[38;5;64m#<Class:URI>\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5;33mparse\u001b[0m \u001b[38;5;240mat ...b/ruby/gems/3.3.0/gems/uri-1.0.2/lib/uri/common.rb:207\u001b[0m () \u001b[38;5;245m#=>\u001b[0m \u001b[38;5;230m#<URI::HTTPS ht...\u001b[0m \u001b[38;5;37min 0.000141ms\u001b[0m\u001b[0m\r\n\u001b[38;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m5\u001b[0m\u001b[38;5;234m]\u001b[0m \u001b[1m\u001b[38;5;64mURI::RFC3986_Parser\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5;33mparse\u001b[0m \u001b[38;5;240mat ...ems/3.3.0/gems/uri-1.0.2/lib/uri/rfc3986_parser.rb:134\u001b[0m (\u001b[38;5;166muri\u001b[0m) \u001b[38;5;245m#=>\u001b[0m \u001b[38;5;230m#<URI::HTTPS ht...\u001b[0m \u001b[38;5;37min 0.000103ms\u001b[0m\u001b[0m\r\n\u001b[38;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m4\u001b[0m\u001b[38;5;234m]\u001b[0m \u001b[1m\u001b[38;5;64mOpenURI::OpenRead\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5;33mopen\u001b[0m \u001b[38;5;240mat ...sdf/installs/ruby/3.3.0/lib/ruby/3.3.0/open-uri.rb:749\u001b[0m (\u001b[38;5;166mrest\u001b[0m, \u001b[38;5;166mblock\u001b[0m) \u001b[38;5"]
118
+ [12.538794, "o", ";245m#=>\u001b[0m \u001b[38;5;230m#<StringIO:0x00...\u001b[0m \u001b[38;5;37min 0.668527ms\u001b[0m\u001b[0m\r\n"]
119
+ [12.538908, "o", "\u001b[38;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m5\u001b[0m\u001b[38;5;234m]\u001b[0m \u001b[1m\u001b[38;5;64m#<Class:OpenURI>\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5;33mopen_uri\u001b[0m \u001b[38;5;240mat ...sdf/installs/ruby/3.3.0/lib/ruby/3.3.0/open-uri.rb:133\u001b[0m () \u001b[38;5;245m#=>\u001b[0m \u001b[38;5;230m#<StringIO:0x00...\u001b[0m \u001b[38;5;37min 0.668346ms\u001b[0m\u001b[0m\r\n\u001b[38;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m2\u001b[0m\u001b[38;5;234m]\u001b[0m \u001b[1m\u001b[38;5;64mEuCentralBank\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5;33mparse_rates\u001b[0m \u001b[38;5;240mat .../gems/eu_central_bank-1.7.0/lib/eu_central_bank.rb:184\u001b[0m (\u001b[38;5;166mio\u001b[0m) \u001b[38;5;245m#=>\u001b[0m \u001b[38;5;230m#<EuCentralBank...\u001b[0m \u001b[38;5;37min 0.018372ms\u001b[0m\u001b[0m\r\n\u001b[38;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m3\u001b[0m\u001b[38;5;234m]\u001b[0m \u001b[1m\u001b[38;5;64mEuCentralBank::RatesDocument\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5;33minitialize\u001b[0m \u001b[38;5;240mat ...l_bank-1.7.0/lib/eu_central_bank/rates_document.rb:7\u001b[0m () \u001b[38;5;245m#=>\u001b[0m \u001b[38;5;230mnil\u001b[0m \u001b[38;5;37min 0.000073m"]
120
+ [12.539034, "o", "s\u001b[0m\u001b[0m\r\n\u001b[38;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m3\u001b[0m\u001b[38;5;234m]\u001b[0m \u001b[1m\u001b[38;5;64mSingleton::SingletonClassMethods\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5;33minstance\u001b[0m \u001b[38;5;240mat ...df/installs/ruby/3.3.0/lib/ruby/3.3.0/singleton.rb:123\u001b[0m () \u001b[38;5;245m#=>\u001b[0m \u001b[38;5;230m#<Nokogiri::Ver...\u001b[0m \u001b[38;5;37min 0.000063ms\u001b[0m\u001b[0m\r\n\u001b[38;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m3\u001b[0m\u001b[38;5;234m]\u001b[0m 🔄 \u001b[1m\u001b[38;5;64mEuCentralBank::RatesDocument\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5;33mstart_element\u001b[0m (\u001b[38;5;166mname\u001b[0m, \u001b[38;5;166mattributes\u001b[0m) \u001b[1m\u001b[3m\u001b[33m[Summary: 36 calls | Avg Time: in 0.000000ms]\u001b[0m\u001b[0m\r\n\u001b[38;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m3\u001b[0m\u001b[38;5;234m]\u001b[0m \u001b[1m\u001b[38;5;64mEuCentralBank::RatesDocument\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5;33mend_document\u001b[0m \u001b[38;5;240mat ...l_bank-1.7.0/lib/eu_central_bank/rates_document.rb:41\u001b[0m () \u001b[38;5;245m#=>\u001b[0m \u001b[38;5;230mnil\u001b[0m \u001b[38;5;37min 0.000030ms\u001b[0m\u001b[0m\r\n\u001b[3"]
121
+ [12.539088, "o", "8;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m1\u001b[0m\u001b[38;5;234m]\u001b[0m \u001b[1m\u001b[38;5;64mEuCentralBank\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5;33mupdate_parsed_rates\u001b[0m \u001b[38;5;240mat .../gems/eu_central_bank-1.7.0/lib/eu_central_bank.rb:211\u001b[0m (\u001b[38;5;166mrates_document\u001b[0m) \u001b[38;5;245m#=>\u001b[0m \u001b[38;5;230m2025-01-04 12:1...\u001b[0m \u001b[38;5;37min 0.022397ms\u001b[0m\u001b[0m\r\n\u001b[38;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m2\u001b[0m\u001b[38;5;234m]\u001b[0m \u001b[1m\u001b[38;5;64mMoney::RatesStore::StoreWithHistoricalDataSupport\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5;33mtransaction\u001b[0m \u001b[38;5;240mat .../rates_store/store_with_historical_data_support.rb:14\u001b[0m (\u001b[38;5;166mblock\u001b[0m) \u001b[38;5;245m#=>\u001b[0m \u001b[38;5;230m{#<Date: 2025-0...\u001b[0m \u001b[38;5;37min 0.022274ms\u001b[0m\u001b[0m\r\n\u001b[38;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m3\u001b[0m\u001b[38;5;234m]\u001b[0m \u001b[1m\u001b[38;5;64mEuCentralBank\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5;33mcopy_rates\u001b[0m \u001b[38;5;240mat .../gems/eu_central_bank-1.7.0/lib/eu_central_bank.rb:201\u001b[0m (\u001b[38;5;"]
122
+ [12.539135, "o", "166mrates_document\u001b[0m, \u001b[38;5;166mwith_date\u001b[0m) \u001b[38;5;245m#=>\u001b[0m \u001b[38;5;230m{#<Date: 2025-0...\u001b[0m \u001b[38;5;37min 0.022166ms\u001b[0m\u001b[0m\r\n\u001b[38;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m4\u001b[0m\u001b[38;5;234m]\u001b[0m 🔄 \u001b[1m\u001b[38;5;64mEuCentralBank\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5;33mset_rate\u001b[0m (\u001b[38;5;166mfrom\u001b[0m, \u001b[38;5;166mto\u001b[0m, \u001b[38;5;166mrate\u001b[0m, \u001b[38;5;166mdate\u001b[0m) \u001b[1m\u001b[3m\u001b[33m[Summary: 31 calls | Avg Time: in 0.000002ms]\u001b[0m\u001b[0m\r\n\u001b[38;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m5\u001b[0m\u001b[38;5;234m]\u001b[0m \u001b[1m\u001b[38;5;64mMoney::RatesStore::StoreWithHistoricalDataSupport\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5;33madd_rate\u001b[0m \u001b[38;5;240mat .../rates_store/store_with_historical_data_support.rb:5\u001b[0m (\u001b[38;5;166mcurrency_iso_from\u001b[0m, \u001b[38;5;166mcurrency_iso_to\u001b[0m, \u001b[38;5;166mrate\u001b[0m, \u001b[38;5;166mdate\u001b[0m) \u001b[38;5;245m#=>\u001b[0m \u001b[38;5;230m0.10299e1\u001b[0m \u001b[38;5;37min 0.000074ms\u001b[0m\u001b[0m\r\n\u001b[38;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m0\u001b[0m\u001b[38;5;234"]
123
+ [12.539205, "o", "m]\u001b[0m \u001b[1m\u001b[38;5;64mEuCentralBank\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5;33mexchange\u001b[0m \u001b[38;5;240mat .../gems/eu_central_bank-1.7.0/lib/eu_central_bank.rb:62\u001b[0m (\u001b[38;5;166mcents\u001b[0m, \u001b[38;5;166mfrom_currency\u001b[0m, \u001b[38;5;166mto_currency\u001b[0m, \u001b[38;5;166mdate\u001b[0m) \u001b[38;5;245m#=>\u001b[0m \u001b[38;5;230m#<Money fractio...\u001b[0m \u001b[38;5;37min 0.002284ms\u001b[0m\u001b[0m\r\n\u001b[38;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m1\u001b[0m\u001b[38;5;234m]\u001b[0m \u001b[1m\u001b[38;5;64mEuCentralBank\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5;33mexchange_with\u001b[0m \u001b[38;5;240mat .../gems/eu_central_bank-1.7.0/lib/eu_central_bank.rb:66\u001b[0m (\u001b[38;5;166mfrom\u001b[0m, \u001b[38;5;166mto_currency\u001b[0m, \u001b[38;5;166mdate\u001b[0m) \u001b[38;5;245m#=>\u001b[0m \u001b[38;5;230m#<Money fractio...\u001b[0m \u001b[38;5;37min 0.001976ms\u001b[0m\u001b[0m\r\n\u001b[38;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m2\u001b[0m\u001b[38;5;234m]\u001b[0m \u001b[1m\u001b[38;5;64mEuCentralBank\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5;33mget_rate\u001b[0m \u001b[38;5;240mat .../gems/eu_central_bank-1.7.0/lib/eu_central_bank.rb:89\u001b[0m (\u001b[38;5;166mfrom\u001b[0m, \u001b[38;5"]
124
+ [12.539308, "o", ";166mto\u001b[0m, \u001b[38;5;166mdate\u001b[0m) \u001b[38;5;245m#=>\u001b[0m \u001b[38;5;230mnil\u001b[0m \u001b[38;5;37min 0.000547ms\u001b[0m\u001b[0m\r\n\u001b[38;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m3\u001b[0m\u001b[38;5;234m]\u001b[0m 🔄 \u001b[1m\u001b[38;5;64mEuCentralBank\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5;33mcheck_currency_available\u001b[0m (\u001b[38;5;166mcurrency\u001b[0m) \u001b[1m\u001b[3m\u001b[33m[Summary: 2 calls | Avg Time: in 0.000000ms]\u001b[0m\u001b[0m\r\n\u001b[38;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m3\u001b[0m\u001b[38;5;234m]\u001b[0m \u001b[1m\u001b[38;5;64mMoney::RatesStore::StoreWithHistoricalDataSupport\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5;33mget_rate\u001b[0m \u001b[38;5;240mat .../rates_store/store_with_historical_data_support.rb:9\u001b[0m (\u001b[38;5;166mcurrency_iso_from\u001b[0m, \u001b[38;5;166mcurrency_iso_to\u001b[0m, \u001b[38;5;166mdate\u001b[0m) \u001b[38;5;245m#=>\u001b[0m \u001b[38;5;230mnil\u001b[0m \u001b[38;5;37min 0.000140ms\u001b[0m\u001b[0m\r\n\u001b[38;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m4\u001b[0m\u001b[38;5;234m]\u001b[0m \u001b[1m\u001b[38;5;64mMoney::RatesStore::StoreWithHistoricalDataSupport\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5"]
125
+ [12.539394, "o", ";33mtransaction\u001b[0m \u001b[38;5;240mat .../rates_store/store_with_historical_data_support.rb:14\u001b[0m (\u001b[38;5;166mblock\u001b[0m) \u001b[38;5;245m#=>\u001b[0m \u001b[38;5;230mnil\u001b[0m \u001b[38;5;37min 0.000093ms\u001b[0m\u001b[0m\r\n\u001b[38;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m5\u001b[0m\u001b[38;5;234m]\u001b[0m \u001b[1m\u001b[38;5;64mMoney::RatesStore::StoreWithHistoricalDataSupport\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5;33mrate_key_for\u001b[0m \u001b[38;5;240mat .../rates_store/store_with_historical_data_support.rb:46\u001b[0m (\u001b[38;5;166mcurrency_iso_from\u001b[0m, \u001b[38;5;166mcurrency_iso_to\u001b[0m, \u001b[38;5;166mdate\u001b[0m) \u001b[38;5;245m#=>\u001b[0m \u001b[38;5;230m\"USD_TO_EUR\"\u001b[0m \u001b[38;5;37min 0.000026ms\u001b[0m\u001b[0m\r\n\u001b[38;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m2\u001b[0m\u001b[38;5;234m]\u001b[0m \u001b[1m\u001b[38;5;64mMoney::RatesStore::StoreWithHistoricalDataSupport\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5;33mtransaction\u001b[0m \u001b[38;5;240mat .../rates_store/store_with_historical_data_support.rb:14\u001b[0m (\u001b[38;5;166mblock\u001b[0m) \u001b[38;5;245m#=>\u001b[0m \u001b[38;5;230m1\u001b[0m \u001b[38;5;37min 0.000648ms\u001b[0m\u001b[0m\r\n\u001b"]
126
+ [12.539499, "o", "[38;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m3\u001b[0m\u001b[38;5;234m]\u001b[0m 🔄 \u001b[1m\u001b[38;5;64mEuCentralBank\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5;33mget_rate\u001b[0m (\u001b[38;5;166mfrom\u001b[0m, \u001b[38;5;166mto\u001b[0m, \u001b[38;5;166mdate\u001b[0m) \u001b[1m\u001b[3m\u001b[33m[Summary: 2 calls | Avg Time: in 0.000072ms]\u001b[0m\u001b[0m\r\n\u001b[38;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m4\u001b[0m\u001b[38;5;234m]\u001b[0m 🔄 \u001b[1m\u001b[38;5;64mEuCentralBank\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5;33mcheck_currency_available\u001b[0m (\u001b[38;5;166mcurrency\u001b[0m) \u001b[1m\u001b[3m\u001b[33m[Summary: 2 calls | Avg Time: in 0.000000ms]\u001b[0m\u001b[0m\r\n\u001b[38;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m4\u001b[0m\u001b[38;5;234m]\u001b[0m \u001b[1m\u001b[38;5;64mMoney::RatesStore::StoreWithHistoricalDataSupport\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5;33mget_rate\u001b[0m \u001b[38;5;240mat .../rates_store/store_with_historical_data_support.rb:9\u001b[0m (\u001b[38;5;166mcurrency_iso_from\u001b[0m, \u001b[38;5;166mcurrency_iso_to\u001b[0m, \u001b[38;5;166mdate\u001b[0m) \u001b[38;5;245m#=>\u001b[0m \u001b[38;5;230m0.10299e1\u001b[0m \u001b[38;5;37min 0.00"]
127
+ [12.539562, "o", "0100ms\u001b[0m\u001b[0m\r\n\u001b[38;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m5\u001b[0m\u001b[38;5;234m]\u001b[0m \u001b[1m\u001b[38;5;64mMoney::RatesStore::StoreWithHistoricalDataSupport\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5;33mtransaction\u001b[0m \u001b[38;5;240mat .../rates_store/store_with_historical_data_support.rb:14\u001b[0m (\u001b[38;5;166mblock\u001b[0m) \u001b[38;5;245m#=>\u001b[0m \u001b[38;5;230m0.10299e1\u001b[0m \u001b[38;5;37min 0.000060ms\u001b[0m\u001b[0m\r\n\u001b[38;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m2\u001b[0m\u001b[38;5;234m]\u001b[0m \u001b[1m\u001b[38;5;64mEuCentralBank\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5;33mcalculate_exchange\u001b[0m \u001b[38;5;240mat .../gems/eu_central_bank-1.7.0/lib/eu_central_bank.rb:229\u001b[0m (\u001b[38;5;166mfrom\u001b[0m, \u001b[38;5;166mto_currency\u001b[0m, \u001b[38;5;166mrate\u001b[0m) \u001b[38;5;245m#=>\u001b[0m \u001b[38;5;230m#<Money fractio...\u001b[0m \u001b[38;5;37min 0.000652ms\u001b[0m\u001b[0m\r\n\u001b[38;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m0\u001b[0m\u001b[38;5;234m]\u001b[0m 🔄 \u001b[1m\u001b[38;5;64mConcurrent::Collection::NonConcurrentMapBackend\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5;33m[]\u001b[0m (\u001b[3"]
128
+ [12.539652, "o", "8;5;166mkey\u001b[0m) \u001b[1m\u001b[3m\u001b[33m[Summary: 12 calls | Avg Time: in 0.000014ms]\u001b[0m\u001b[0m\r\n\u001b[38;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m1\u001b[0m\u001b[38;5;234m]\u001b[0m \u001b[1m\u001b[38;5;64mConcurrent::Collection::MriMapBackend\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5;33minitialize\u001b[0m \u001b[38;5;240mat ...-ruby/concurrent/collection/map/mri_map_backend.rb:12\u001b[0m (\u001b[38;5;166moptions\u001b[0m, \u001b[38;5;166mdefault_proc\u001b[0m) \u001b[38;5;245m#=>\u001b[0m \u001b[38;5;230m#<Thread::Mutex...\u001b[0m \u001b[38;5;37min 0.000106ms\u001b[0m\u001b[0m\r\n\u001b[38;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m2\u001b[0m\u001b[38;5;234m]\u001b[0m \u001b[1m\u001b[38;5;64mConcurrent::Collection::NonConcurrentMapBackend\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5;33minitialize\u001b[0m \u001b[38;5;240mat ...rrent/collection/map/non_concurrent_map_backend.rb:15\u001b[0m (\u001b[38;5;166moptions\u001b[0m, \u001b[38;5;166mdefault_proc\u001b[0m) \u001b[38;5;245m#=>\u001b[0m \u001b[38;5;230mnil\u001b[0m \u001b[38;5;37min 0.000060ms\u001b[0m\u001b[0m\r\n\u001b[38;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m3\u001b[0m\u001b[38;5;234m]\u001b[0m \u001b[1m\u001b[38;5;64mConcurre"]
129
+ [12.539737, "o", "nt::Collection::NonConcurrentMapBackend\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5;33mset_backend\u001b[0m \u001b[38;5;240mat ...rrent/collection/map/non_concurrent_map_backend.rb:116\u001b[0m (\u001b[38;5;166mdefault_proc\u001b[0m) \u001b[38;5;245m#=>\u001b[0m \u001b[38;5;230m{:en=>[:en], \"n...\u001b[0m \u001b[38;5;37min 0.000021ms\u001b[0m\u001b[0m\r\n\u001b[38;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m1\u001b[0m\u001b[38;5;234m]\u001b[0m \u001b[1m\u001b[38;5;64mConcurrent::Collection::MriMapBackend\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5;33m[]=\u001b[0m \u001b[38;5;240mat ...-ruby/concurrent/collection/map/mri_map_backend.rb:17\u001b[0m (\u001b[38;5;166mkey\u001b[0m, \u001b[38;5;166mvalue\u001b[0m) \u001b[38;5;245m#=>\u001b[0m \u001b[38;5;230m#<Concurrent::M...\u001b[0m \u001b[38;5;37min 0.000056ms\u001b[0m\u001b[0m\r\n\u001b[38;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m2\u001b[0m\u001b[38;5;234m]\u001b[0m \u001b[1m\u001b[38;5;64mConcurrent::Collection::NonConcurrentMapBackend\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5;33m[]=\u001b[0m \u001b[38;5;240mat ...rrent/collection/map/non_concurrent_map_backend.rb:25\u001b[0m (\u001b[38;5;166mkey\u001b[0m, \u001b[38;5;166mvalue\u001b[0m) \u001b[38;5;245m#=>\u001b[0m \u001b[38;5;230m#<C"]
130
+ [12.539826, "o", "oncurrent::M...\u001b[0m \u001b[38;5;37min 0.000020ms\u001b[0m\u001b[0m\r\n\u001b[38;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m0\u001b[0m\u001b[38;5;234m]\u001b[0m 🔄 \u001b[1m\u001b[38;5;64mConcurrent::Collection::MriMapBackend\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5;33m[]=\u001b[0m (\u001b[38;5;166mkey\u001b[0m, \u001b[38;5;166mvalue\u001b[0m) \u001b[1m\u001b[3m\u001b[33m[Summary: 4 calls | Avg Time: in 0.000005ms]\u001b[0m\u001b[0m\r\n\u001b[38;5;33m🚀 [START] \u001b[3m\u001b[38;5;235mdepth\u001b[0m\u001b[38;5;235m[\u001b[0m\u001b[38;5;160m1\u001b[0m\u001b[38;5;234m]\u001b[0m \u001b[1m\u001b[38;5;64mConcurrent::Collection::NonConcurrentMapBackend\u001b[0m\u001b[38;5;61m#\u001b[0m\u001b[1m\u001b[38;5;33m[]=\u001b[0m \u001b[38;5;240mat ...rrent/collection/map/non_concurrent_map_backend.rb:25\u001b[0m (\u001b[38;5;166mkey\u001b[0m, \u001b[38;5;166mvalue\u001b[0m) \u001b[38;5;245m#=>\u001b[0m \u001b[38;5;230m[:en]\u001b[0m \u001b[38;5;37min 0.000019ms\u001b[0m\u001b[0m\r\n\u001b[1m\u001b[4m\u001b[38;5;254m📊 [STATS]Total Traces: 314 | Max Depth: 5 | Event Counts: [Call: 157, Return: 157]\u001b[0m\r\n"]
131
+ [12.541176, "o", "\u001b[38;5;240m🔄 [PROCESSING]Overwriting existing file: tmp/trace_output.txt\u001b[0m\r\n"]
132
+ [12.542046, "o", "\u001b[38;5;64m📤 [EXPORTED]Data successfully exported to tmp/trace_output.txt\u001b[0m\r\n"]
133
+ [12.545393, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"]
134
+ [12.545559, "o", "\u001b]2;patrick204nqh@Patrick-Mac:~/Desktop/sandbox/trace_viz\u0007\u001b]1;..box/trace_viz\u0007"]
135
+ [12.548209, "o", "\u001b]7;file://Patrick-Mac.local/Users/patrick204nqh/Desktop/sandbox/trace_viz\u001b\\"]
136
+ [12.633817, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\r\n\u001b[1m\u001b[36mtrace_viz\u001b[0m\u001b[36m\u001b[39m\u001b[1m \u001b[0m\u001b[1m\u001b[39m…\u001b[0m\u001b[39m\u001b[1m\u001b[37m\r\n\u001b[0m\u001b[37m\u001b[39m\u001b[1m\u001b[32m➜ \u001b[0m\u001b[32m\u001b[39m\u001b[K\u001b[239C\u001b[1A\u001b[1B\u001b[239D"]
137
+ [12.633892, "o", "\u001b[?1h\u001b=\u001b[?2004h"]
138
+ [12.687365, "o", "\r\r\u001b[A\u001b[A\u001b[0m\u001b[27m\u001b[24m\u001b[J\r\n\u001b[1m\u001b[36mtrace_viz\u001b[0m\u001b[36m\u001b[39m\u001b[1m \u001b[0m\u001b[1m\u001b[39m…\u001b[0m\u001b[39m\u001b[1m\u001b[37m\r\n\u001b[0m\u001b[37m\u001b[39m\u001b[1m\u001b[32m➜ \u001b[0m\u001b[32m\u001b[39m\u001b[K\u001b[239C\u001b[1A\u001b[1B\u001b[239D"]
139
+ [12.807312, "o", "\r\r\u001b[A\u001b[A\u001b[0m\u001b[27m\u001b[24m\u001b[J\r\n\u001b[1m\u001b[36mtrace_viz\u001b[0m\u001b[36m\u001b[39m\u001b[1m \u001b[0m\u001b[1mvia \u001b[0m\u001b[1m\u001b[31m💎 v3.3.0\u001b[0m\u001b[31m\u001b[39m\u001b[1m \u001b[0m\u001b[1m\u001b[39m…\u001b[0m\u001b[39m\u001b[1m\u001b[37m\r\n\u001b[0m\u001b[37m\u001b[39m\u001b[1m\u001b[32m➜ \u001b[0m\u001b[32m\u001b[39m\u001b[K\u001b[239C\u001b[1A\u001b[1B\u001b[239D"]
140
+ [12.858651, "o", "\r\r\u001b[A\u001b[A\u001b[0m\u001b[27m\u001b[24m\u001b[J\r\n\u001b[1m\u001b[36mtrace_viz\u001b[0m\u001b[36m\u001b[39m\u001b[1m \u001b[0m\u001b[1mon \u001b[0m\u001b[1m\u001b[37m\u001b[1m\u001b[37m\u001b[35m develop\u001b[0m\u001b[35m\u001b[39m\u001b[1m\u001b[31m [⇡?]\u001b[0m\u001b[31m\u001b[39m\u001b[0m\u001b[39m\u001b[1m \u001b[0m\u001b[1mvia \u001b[0m\u001b[1m\u001b[31m💎 v3.3.0\u001b[0m\u001b[31m\u001b[39m\u001b[1m \u001b[0m\u001b[1m\u001b[39m…\u001b[0m\u001b[39m\u001b[1m\u001b[37m\r\n\u001b[0m\u001b[37m\u001b[39m\u001b[1m\u001b[32m➜ \u001b[0m\u001b[32m\u001b[39m\u001b[K\u001b[239C\u001b[1A\u001b[1B\u001b[239D"]
141
+ [12.995774, "o", "\r\r\u001b[A\u001b[A\u001b[0m\u001b[27m\u001b[24m\u001b[J\r\n\u001b[1m\u001b[36mtrace_viz\u001b[0m\u001b[36m\u001b[39m\u001b[1m \u001b[0m\u001b[1mon \u001b[0m\u001b[1m\u001b[37m\u001b[1m\u001b[37m\u001b[35m develop\u001b[0m\u001b[35m\u001b[39m\u001b[1m\u001b[31m [⇡?]\u001b[0m\u001b[31m\u001b[39m\u001b[0m\u001b[39m\u001b[1m \u001b[0m\u001b[1mvia \u001b[0m\u001b[1m\u001b[31m💎 v3.3.0\u001b[0m\u001b[31m\u001b[39m\u001b[1m \u001b[0m\u001b[1m\u001b[37m\r\n\u001b[0m\u001b[37m\u001b[39m\u001b[1m\u001b[32m➜ \u001b[0m\u001b[32m\u001b[39m\u001b[K\u001b[239C\u001b[1A\u001b[1B\u001b[239D"]
142
+ [18.03876, "o", "b"]
143
+ [18.044081, "o", "\b\u001b[4mb\u001b[24m"]
144
+ [18.044409, "o", "\b\u001b[4mb\u001b[24m\u001b[90mat examples/eu_central_bank.rb\u001b[39m\u001b[30D"]
145
+ [18.110539, "o", "\b\u001b[4mb\u001b[39m\u001b[4ma\u001b[24m"]
146
+ [18.114467, "o", "\b\b\u001b[24m\u001b[1m\u001b[31mb\u001b[24m\u001b[1m\u001b[31ma\u001b[0m\u001b[39m"]
147
+ [18.301846, "o", "\b\b\u001b[1m\u001b[31mb\u001b[1m\u001b[31ma\u001b[1m\u001b[31mt\u001b[0m\u001b[39m"]
148
+ [18.302741, "o", "\b\b\b\u001b[0m\u001b[32mb\u001b[0m\u001b[32ma\u001b[0m\u001b[32mt\u001b[39m"]
149
+ [18.467515, "o", "\b\u001b[32mt\u001b[32m \u001b[39m"]
150
+ [18.468982, "o", "\b\b\u001b[32mt\u001b[39m\u001b[39m "]
151
+ [18.660857, "o", "\u001b[39mt\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[26D"]
152
+ [18.664391, "o", "\b\u001b[4mt\u001b[24m"]
153
+ [18.664653, "o", "\u001b[90mmp/trace_output.txt\u001b[39m\u001b[19D"]
154
+ [18.841845, "o", "\b\u001b[4mt\u001b[39m\u001b[4mm\u001b[24m"]
155
+ [19.129984, "o", "\b\u001b[4mm\u001b[39m\u001b[4mp\u001b[24m"]
156
+ [19.658855, "o", "\u001b[39m/\u001b[39mt\u001b[39mr\u001b[39ma\u001b[39mc\u001b[39me\u001b[39m_\u001b[39mo\u001b[39mu\u001b[39mt\u001b[39mp\u001b[39mu\u001b[39mt\u001b[39m.\u001b[39mt\u001b[39mx\u001b[39mt"]
157
+ [19.661751, "o", "\u001b[18D\u001b[4mp\u001b[4m/\u001b[4mt\u001b[4mr\u001b[4ma\u001b[4mc\u001b[4me\u001b[4m_\u001b[4mo\u001b[4mu\u001b[4mt\u001b[4mp\u001b[4mu\u001b[4mt\u001b[4m.\u001b[4mt\u001b[4mx\u001b[4mt\u001b[24m"]
158
+ [20.285253, "o", "\u001b[?1l\u001b>"]
159
+ [20.285322, "o", "\u001b[?2004l"]
160
+ [20.286674, "o", "\r\r\n"]
161
+ [20.287287, "o", "\u001b]2;bat tmp/trace_output.txt\u0007\u001b]1;bat\u0007"]
162
+ [20.315885, "o", "\r\u001b[38;5;238m───────┬──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\u001b[m\r\n \u001b[38;5;238m│ \u001b[0mFile: \u001b[1mtmp/trace_output.txt\u001b[0m\u001b[m\r\n\u001b[38;5;238m───────┼───────────────────────────────────────────────────────────"]
163
+ [20.315966, "o", "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\u001b[m\r\n\u001b[38;5;238m 1\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m depth[0] EuCentralBank#initialize at .../gems/eu_central_bank-1.7.0/lib/eu_central_bank.rb:27 (st, block)\u001b[0m\u001b[m\r\n\u001b[38;5;238m 2\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m depth[0] EuCentralBank#update_rates at .../gems/eu_central_bank-1.7.0/lib/eu_central_bank.rb:32 (cache, url)\u001b[0m\u001b[m\r\n\u001b[38;5;238m 3\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m depth[1] EuCentralBank#doc at .../gems/eu_central_bank-1.7.0/lib/eu_central"]
164
+ [20.316147, "o", "_bank.rb:175 (cache, url)\u001b[0m\u001b[m\r\n\u001b[38;5;238m 4\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m depth[2] EuCentralBank#open_url at .../gems/eu_central_bank-1.7.0/lib/eu_central_bank.rb:237 (url)\u001b[0m\u001b[m\r\n\u001b[38;5;238m 5\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m depth[3] #<Class:URI>#open at ...sdf/installs/ruby/3.3.0/lib/ruby/3.3.0/open-uri.rb:23 ()\u001b[0m\u001b[m\r\n\u001b[38;5;238m 6\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m depth[4] #<Class:URI>#parse at ...b/ruby/gems/3.3.0/gems/uri-1.0.2/lib/uri/common.rb:207 ()\u001b[0m\u001b[m\r\n\u001b[38;5;238m 7\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m depth[5] URI::RFC3986_Parser#parse at ...ems/3.3.0/gems/uri-1.0.2/lib/uri/rfc3986_parser.rb:134 (uri)\u001b[0m\u001b[m\r\n\u001b[38;5;238m 8\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m depth[4] OpenURI::OpenRead#open at ...sdf/installs/ruby/3.3.0/lib/ruby/3.3.0/open-uri.rb:749 (rest, block)\u001b[0m\u001b[m\r\n\u001b[38;5;238m 9\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m depth[5] #<Class:OpenURI>#open_uri at ...sdf/installs/ruby/3.3.0/lib/ru"]
165
+ [20.316239, "o", "by/3.3.0/open-uri.rb:133 ()\u001b[0m\u001b[m\r\n\u001b[38;5;238m 10\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m depth[2] EuCentralBank#parse_rates at .../gems/eu_central_bank-1.7.0/lib/eu_central_bank.rb:184 (io)\u001b[0m\u001b[m\r\n\u001b[38;5;238m 11\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m depth[3] EuCentralBank::RatesDocument#initialize at ...l_bank-1.7.0/lib/eu_central_bank/rates_document.rb:7 ()\u001b[0m\u001b[m\r\n\u001b[38;5;238m 12\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m depth[3] Singleton::SingletonClassMethods#instance at ...df/installs/ruby/3.3.0/lib/ruby/3.3.0/singleton.rb:123 ()\u001b[0m\u001b[m\r\n\u001b[38;5;238m 13\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m depth[3] 🔄 EuCentralBank::RatesDocument#start_element at ...l_bank-1.7.0/lib/eu_central_bank/rates_document.rb (name, attributes) [Summary: 36 calls | Avg Time: in 0.000000ms]\u001b[0m\u001b[m\r\n\u001b[38;5;238m 14\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m depth[3] EuCentralBank::RatesDocument#end_document at ...l_bank-1.7.0/lib/eu_central_bank/rates_document.rb:41 ()\u001b[0m\u001b[m\r\n\u001b[38;5;23"]
166
+ [20.316413, "o", "8m 15\u001b[0m "]
167
+ [20.316514, "o", "\u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m depth[1] EuCentralBank#update_parsed_rates at .../gems/eu_central_bank-1.7.0/lib/eu_central_bank.rb:211 (rates_document)\u001b[0m\u001b[m\r\n\u001b[38;5;238m 16\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m depth[2] Money::RatesStore::StoreWithHistoricalDataSupport#transaction at .../rates_store/store_with_historical_data_support.rb:14 (block)\u001b[0m\u001b[m\r\n\u001b[38;5;238m 17\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m depth[3] EuCentralBank#copy_rates at .../gems/eu_central_bank-1.7.0/lib/eu_central_bank.rb:201 (rates_document, with_date)\u001b[0m\u001b[m\r\n\u001b[38;5;238m 18\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m depth[4] 🔄 EuCentralBank#set_rate at .../gems/eu_central_bank-1.7.0/lib/eu_central_bank.rb (from, to, rate, date) [Summary: 31 calls | Avg Time: in 0.000002ms]\u001b[0m\u001b[m\r\n\u001b[38;5;238m 19\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m depth[5] Money::RatesStore::StoreWithHistoricalDataSupport#add_rate at .../rates_store/store_with_historical_data_support.rb:5 (currency_iso_from, c"]
168
+ [20.316594, "o", "urrency_iso_to, rate, date)\u001b[0m\u001b[m\r\n\u001b[38;5;238m 20\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m depth[0] EuCentralBank#exchange at .../gems/eu_central_bank-1.7.0/lib/eu_central_bank.rb:62 (cents, from_currency, to_currency, date)\u001b[0m\u001b[m\r\n\u001b[38;5;238m 21\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m depth[1] EuCentralBank#exchange_with at .../gems/eu_central_bank-1.7.0/lib/eu_central_bank.rb:66 (from, to_currency, date)\u001b[0m\u001b[m\r\n\u001b[38;5;238m 22\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m depth[2] EuCentralBank#get_rate at .../gems/eu_central_bank-1.7.0/lib/eu_central_bank.rb:89 (from, to, date)\u001b[0m\u001b[m\r\n\u001b[38;5;238m 23\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m depth[3] 🔄 EuCentralBank#check_currency_available at .../gems/eu_central_bank-1.7.0/lib/eu_central_bank.rb (currency) [Summary: 2 calls | Avg Time: in 0.000000ms]\u001b[0m\u001b[m\r\n\u001b[38;5;238m 24\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m depth[3] Money::RatesStore::StoreWithHistoricalDataSupport#get_rate at .../rates_store/store_with_historical_d"]
169
+ [20.316702, "o", "ata_sup"]
170
+ [20.316735, "o", "port.rb:9 (currency_iso_from, currency_iso_to, date)\u001b[0m\u001b[m\r\n\u001b[38;5;238m 25\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m depth[4] Money::RatesStore::StoreWithHistoricalDataSupport#transaction at .../rates_store/store_with_historical_data_support.rb:14 (block)\u001b[0m\u001b[m\r\n\u001b[38;5;238m 26\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m depth[5] Money::RatesStore::StoreWithHistoricalDataSupport#rate_key_for at .../rates_store/store_with_historical_data_support.rb:46 (currency_iso_from, currency_iso_to, date)\u001b[0m\u001b[m\r\n\u001b[38;5;238m 27\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m depth[2] Money::RatesStore::StoreWithHistoricalDataSupport#transaction at .../rates_store/store_with_historical_data_support.rb:14 (block)\u001b[0m\u001b[m\r\n\u001b[38;5;238m 28\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m depth[3] 🔄 EuCentralBank#get_rate at .../gems/eu_central_bank-1.7.0/lib/eu_central_bank.rb (from, to, date) [Summary: 2 calls | Avg Time: in 0.000072ms]\u001b[0m\u001b[m\r\n\u001b[38;5;238m 29\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m "]
171
+ [20.316785, "o", " dep"]
172
+ [20.316856, "o", "th[4] 🔄 EuCentralBank#check_currency_available at .../gems/eu_central_bank-1.7.0/lib/eu_central_bank.rb (currency) [Summary: 2 calls | Avg Time: in 0.000000ms]\u001b[0m\u001b[m\r\n\u001b[38;5;238m 30\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m depth[4] Money::RatesStore::StoreWithHistoricalDataSupport#get_rate at .../rates_store/store_with_historical_data_support.rb:9 (currency_iso_from, currency_iso_to, date)\u001b[0m\u001b[m\r\n\u001b[38;5;238m 31\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m depth[5] Money::RatesStore::StoreWithHistoricalDataSupport#transaction at .../rates_store/store_with_historical_data_support.rb:14 (block)\u001b[0m\u001b[m\r\n\u001b[38;5;238m 32\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m depth[2] EuCentralBank#calculate_exchange at .../gems/eu_central_bank-1.7.0/lib/eu_central_bank.rb:229 (from, to_currency, rate)\u001b[0m\u001b[m\r\n\u001b[38;5;238m 33\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m depth[0] 🔄 Concurrent::Collection::NonConcurrentMapBackend#[] at ...rrent/collection/map/non_concurrent_map_backend.rb (key) [Summary"]
173
+ [20.316927, "o", ": 1"]
174
+ [20.316978, "o", "2 calls | Avg Time: in 0.000014ms]\u001b[0m\u001b[m\r\n\u001b[38;5;238m 34\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m depth[1] Concurrent::Collection::MriMapBackend#initialize at ...-ruby/concurrent/collection/map/mri_map_backend.rb:12 (options, default_proc)\u001b[0m\u001b[m\r\n\u001b[38;5;238m 35\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m depth[2] Concurrent::Collection::NonConcurrentMapBackend#initialize at ...rrent/collection/map/non_concurrent_map_backend.rb:15 (options, default_proc)\u001b[0m\u001b[m\r\n\u001b[38;5;238m 36\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m depth[3] Concurrent::Collection::NonConcurrentMapBackend#set_backend at ...rrent/collection/map/non_concurrent_map_backend.rb:116 (default_proc)\u001b[0m\u001b[m\r\n\u001b[38;5;238m 37\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m depth[1] Concurrent::Collection::MriMapBackend#[]= at ...-ruby/concurrent/collection/map/mri_map_backend.rb:17 (key, value)\u001b[0m\u001b[m\r\n\u001b[38;5;238m 38\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m depth[2] Concurrent::Collection::NonConcurrentMapBackend#[]= at ...rrent"]
175
+ [20.317034, "o", "/col"]
176
+ [20.317141, "o", "lection/map/non_concurrent_map_backend.rb:25 (key, value)\u001b[0m\u001b[m\r\n\u001b[38;5;238m 39\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m depth[0] 🔄 Concurrent::Collection::MriMapBackend#[]= at ...-ruby/concurrent/collection/map/mri_map_backend.rb (key, value) [Summary: 4 calls | Avg Time: in 0.000005ms]\u001b[0m\u001b[m\r\n\u001b[38;5;238m 40\u001b[0m \u001b[38;5;238m│\u001b[0m \u001b[38;2;248;248;242m depth[1] Concurrent::Collection::NonConcurrentMapBackend#[]= at ...rrent/collection/map/non_concurrent_map_backend.rb:25 (key, value)\u001b[0m\u001b[m\r\n\u001b[38;5;238m───────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────"]
177
+ [20.31715, "o", "─"]
178
+ [20.317728, "o", "──────────────────────────────────────────────────────────────────────────\u001b[0m\u001b[m\r\n\r\u001b[K"]
179
+ [20.319106, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"]
180
+ [20.319276, "o", "\u001b]2;patrick204nqh@Patrick-Mac:~/Desktop/sandbox/trace_viz\u0007\u001b]1;..box/trace_viz\u0007"]
181
+ [20.321552, "o", "\u001b]7;file://Patrick-Mac.local/Users/patrick204nqh/Desktop/sandbox/trace_viz\u001b\\"]
182
+ [20.411785, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\r\n\u001b[1m\u001b[36mtrace_viz\u001b[0m\u001b[36m\u001b[39m\u001b[1m \u001b[0m\u001b[1m\u001b[39m…\u001b[0m\u001b[39m\u001b[1m\u001b[37m\r\n\u001b[0m\u001b[37m\u001b[39m\u001b[1m\u001b[32m➜ \u001b[0m\u001b[32m\u001b[39m\u001b[K\u001b[239C\u001b[1A\u001b[1B\u001b[239D"]
183
+ [20.411812, "o", "\u001b[?1h\u001b="]
184
+ [20.41196, "o", "\u001b[?2004h"]
185
+ [20.468542, "o", "\r\r\u001b[A\u001b[A\u001b[0m\u001b[27m\u001b[24m\u001b[J\r\n\u001b[1m\u001b[36mtrace_viz\u001b[0m\u001b[36m\u001b[39m\u001b[1m \u001b[0m\u001b[1m\u001b[39m…\u001b[0m\u001b[39m\u001b[1m\u001b[37m\r\n\u001b[0m\u001b[37m\u001b[39m\u001b[1m\u001b[32m➜ \u001b[0m\u001b[32m\u001b[39m\u001b[K\u001b[239C\u001b[1A\u001b[1B\u001b[239D"]
186
+ [20.586486, "o", "\r\r\u001b[A\u001b[A\u001b[0m\u001b[27m\u001b[24m\u001b[J\r\n\u001b[1m\u001b[36mtrace_viz\u001b[0m\u001b[36m\u001b[39m\u001b[1m \u001b[0m\u001b[1mvia \u001b[0m\u001b[1m\u001b[31m💎 v3.3.0\u001b[0m\u001b[31m\u001b[39m\u001b[1m \u001b[0m\u001b[1m\u001b[39m…\u001b[0m\u001b[39m\u001b[1m\u001b[37m\r\n\u001b[0m\u001b[37m\u001b[39m\u001b[1m\u001b[32m➜ \u001b[0m\u001b[32m\u001b[39m\u001b[K\u001b[239C\u001b[1A\u001b[1B\u001b[239D"]
187
+ [20.641947, "o", "\r\r\u001b[A\u001b[A\u001b[0m\u001b[27m\u001b[24m\u001b[J\r\n\u001b[1m\u001b[36mtrace_viz\u001b[0m\u001b[36m\u001b[39m\u001b[1m \u001b[0m\u001b[1mon \u001b[0m\u001b[1m\u001b[37m\u001b[1m\u001b[37m\u001b[35m develop\u001b[0m\u001b[35m\u001b[39m\u001b[1m\u001b[31m [⇡?]\u001b[0m\u001b[31m\u001b[39m\u001b[0m\u001b[39m\u001b[1m \u001b[0m\u001b[1mvia \u001b[0m\u001b[1m\u001b[31m💎 v3.3.0\u001b[0m\u001b[31m\u001b[39m\u001b[1m \u001b[0m\u001b[1m\u001b[39m…\u001b[0m\u001b[39m\u001b[1m\u001b[37m\r\n\u001b[0m\u001b[37m\u001b[39m\u001b[1m\u001b[32m➜ \u001b[0m\u001b[32m\u001b[39m\u001b[K\u001b[239C\u001b[1A\u001b[1B\u001b[239D"]
188
+ [20.78396, "o", "\r\r\u001b[A\u001b[A\u001b[0m\u001b[27m\u001b[24m\u001b[J\r\n\u001b[1m\u001b[36mtrace_viz\u001b[0m\u001b[36m\u001b[39m\u001b[1m \u001b[0m\u001b[1mon \u001b[0m\u001b[1m\u001b[37m\u001b[1m\u001b[37m\u001b[35m develop\u001b[0m\u001b[35m\u001b[39m\u001b[1m\u001b[31m [⇡?]\u001b[0m\u001b[31m\u001b[39m\u001b[0m\u001b[39m\u001b[1m \u001b[0m\u001b[1mvia \u001b[0m\u001b[1m\u001b[31m💎 v3.3.0\u001b[0m\u001b[31m\u001b[39m\u001b[1m \u001b[0m\u001b[1m\u001b[37m\r\n\u001b[0m\u001b[37m\u001b[39m\u001b[1m\u001b[32m➜ \u001b[0m\u001b[32m\u001b[39m\u001b[K\u001b[239C\u001b[1A\u001b[1B\u001b[239D"]
189
+ [23.671284, "o", "\u001b[?2004l\r\r\n"]
data/examples/example.rb CHANGED
@@ -1,42 +1,113 @@
1
1
  $LOAD_PATH.unshift(File.expand_path("../lib", __dir__))
2
2
  require "trace_viz"
3
3
 
4
- class Example
5
- def perform_task(x, y)
6
- result = add_numbers(x, y)
7
- log_result(result)
8
- result
4
+ class Calculator
5
+ def initialize(factor)
6
+ @factor = factor
9
7
  end
10
8
 
11
- def add_numbers(a, b)
12
- sleep(0.1)
13
- sum = a + b
14
- multiply_by_factor(sum, 2)
9
+ # A method that triggers a chain of calculations
10
+ def calculate_chain(a, b)
11
+ sum = add(a, b)
12
+ scaled = scale(sum)
13
+ complex_operation(scaled)
15
14
  end
16
15
 
17
- def multiply_by_factor(value, factor)
16
+ # Basic addition
17
+ def add(x, y)
18
18
  sleep(0.05)
19
- value * factor
19
+ x + y
20
20
  end
21
21
 
22
- def log_result(result)
23
- sleep(0.02)
24
- puts "Final result: #{result}"
22
+ # Scaling a number by the factor
23
+ def scale(value)
24
+ sleep(0.05)
25
+ value * @factor
26
+ end
27
+
28
+ # Complex operation involving another class
29
+ def complex_operation(value)
30
+ sleep(0.05)
31
+ Logger.new.log("Starting complex operation")
32
+ divider = Divider.new
33
+ divider.divide_and_process(value, 2)
34
+ end
35
+ end
36
+
37
+ class Divider
38
+ # Divides a number and calls a nested method
39
+ def divide_and_process(value, divisor)
40
+ result = divide(value, divisor)
41
+ process_divided_result(result)
42
+ end
43
+
44
+ # Performs division
45
+ def divide(a, b)
46
+ raise "Division by zero!" if b.zero?
47
+
48
+ sleep(0.05)
49
+ a / b
50
+ end
51
+
52
+ # Processes the divided result further
53
+ def process_divided_result(value)
54
+ Logger.new.log("Processing divided result: #{value}")
55
+ nested_process(value)
56
+ end
57
+
58
+ # A nested operation
59
+ def nested_process(value)
60
+ sleep(0.05)
61
+ Logger.new.log("Final nested processing on #{value}")
62
+ value + 10
63
+ end
64
+ end
65
+
66
+ class Logger
67
+ def log(message)
68
+ sleep(0.01)
69
+ puts "[LOG] #{message}"
25
70
  end
26
71
  end
27
72
 
28
73
  TraceViz.trace(
74
+ general: {
29
75
  tab_size: 4,
30
76
  show_indent: true,
31
77
  show_depth: true,
32
- max_display_depth: 3,
78
+ max_display_depth: 10,
33
79
  show_method_name: true,
34
- show_params: true,
35
- show_return_value: true,
36
- show_execution_time: true,
37
- show_source_location: true,
38
- show_trace_events: [:call, :return]
80
+ },
81
+ params: {
82
+ show: true,
83
+ mode: :name_and_value,
84
+ truncate_values: 10,
85
+ },
86
+ result: {
87
+ show: true,
88
+ truncate_length: 5,
89
+ },
90
+ source_location: {
91
+ show: true,
92
+ truncate_length: 20,
93
+ },
94
+ execution: {
95
+ show_time: true,
96
+ show_trace_events: [:call, :return],
97
+ },
98
+ filters: [
99
+ :exclude_internal_call,
100
+ include_classes: {
101
+ classes: [Calculator, Divider, Logger],
102
+ }
103
+ ],
104
+ export: {
105
+ enabled: true,
106
+ format: :txt,
107
+ overwrite: true
108
+ }
39
109
  ) do
40
- example = Example.new
41
- example.perform_task(5, 7)
42
- end
110
+ calculator = Calculator.new(3)
111
+ result = calculator.calculate_chain(10, 20)
112
+ puts "Final result: #{result}"
113
+ end
@@ -1,11 +1,32 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "trace_viz/context"
3
+ require "trace_viz/helpers"
4
+ require "trace_viz/loggers/logging_manager"
5
+ require "trace_viz/exporters/export_manager"
4
6
 
5
7
  module TraceViz
6
8
  module Adapters
7
9
  class BaseAdapter
8
- def trace
10
+ include Helpers::ConfigHelper
11
+
12
+ def initialize
13
+ @logger = Loggers::LoggingManager.new
14
+ @exporter = Exporters::ExportManager.new
15
+ end
16
+
17
+ def trace(&block)
18
+ execute_trace(&block)
19
+ ensure
20
+ logger.log_post_collection(collector)
21
+ logger.log_stats(collector)
22
+ exporter.export(collector)
23
+ end
24
+
25
+ private
26
+
27
+ attr_reader :logger, :exporter, :collector
28
+
29
+ def execute_trace
9
30
  raise NotImplementedError
10
31
  end
11
32
  end
@@ -1,23 +1,22 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "trace_viz/logger"
4
3
  require "trace_viz/adapters/base_adapter"
5
- require "trace_viz/adapters/trace_point/trace_formatter"
6
- require "trace_viz/adapters/trace_point/trace_logger"
7
- require "trace_viz/adapters/trace_point/trace_data"
8
- require "trace_viz/adapters/trace_point/event_handler"
4
+ require "trace_viz/collectors/trace_point_collector"
9
5
 
10
6
  module TraceViz
11
7
  module Adapters
12
8
  class TracePointAdapter < BaseAdapter
13
- def trace(&block)
14
- ::TracePoint.new(:call, :return) do |tp|
15
- trace_data = TracePoint::TraceData.new(tp)
9
+ def initialize
10
+ super()
11
+
12
+ @collector = Collectors::TracePointCollector.new
13
+ end
16
14
 
17
- next if trace_data.internal_call?
18
- next if trace_data.exceeded_max_depth?
15
+ private
19
16
 
20
- TracePoint::EventHandler.new(trace_data).handle
17
+ def execute_trace(&block)
18
+ ::TracePoint.new(:call, :return) do |tp|
19
+ collector.collect(tp)
21
20
  end.enable(&block)
22
21
  end
23
22
  end
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "trace_viz/helpers"
4
+ require "trace_viz/loggers/logging_manager"
5
+ require_relative "hierarchy_linker"
6
+ require_relative "trace_stats"
7
+ require_relative "trace_pipeline_builder"
8
+
9
+ module TraceViz
10
+ module Collectors
11
+ class BaseCollector
12
+ include Helpers::ConfigHelper
13
+ include Helpers::TrackingHelper
14
+
15
+ attr_reader :collection, :hierarchy, :stats, :renderer
16
+
17
+ # To implement collect trace data from the given event,
18
+ # you need to enter the `config` context to perform the evaluation.
19
+ def initialize
20
+ setup_logger
21
+ setup_stats
22
+ setup_pipeline
23
+ setup_hierarchy
24
+
25
+ clear
26
+ end
27
+
28
+ def collect(event)
29
+ return unless can_collect?(event)
30
+
31
+ trace_data = build_trace(event)
32
+ processed_data = process_trace(trace_data)
33
+
34
+ return unless processed_data
35
+
36
+ store_trace(processed_data)
37
+ link_to_hierarchy(processed_data)
38
+ end
39
+
40
+ def clear
41
+ @collection = []
42
+ end
43
+
44
+ private
45
+
46
+ attr_reader :logger, :pipeline
47
+
48
+ def setup_logger
49
+ @logger = Loggers::LoggingManager.new
50
+ end
51
+
52
+ def setup_stats
53
+ @stats = TraceStats.new
54
+ end
55
+
56
+ def setup_pipeline
57
+ @pipeline = TracePipelineBuilder.build
58
+ end
59
+
60
+ def setup_hierarchy
61
+ @hierarchy = TraceData::HierarchyLinker.new
62
+ end
63
+
64
+ def process_trace(trace_data)
65
+ pipeline.process(trace_data)
66
+ end
67
+
68
+ # Base on trace-event for specific adapter
69
+ def can_collect?(event)
70
+ raise NotImplementedError
71
+ end
72
+
73
+ # Builds trace data from the trace-event for specific adapter
74
+ def build_trace(event)
75
+ raise NotImplementedError
76
+ end
77
+
78
+ def store_trace(trace_data)
79
+ logger.log_runtime_trace(trace_data)
80
+ stats.update(trace_data)
81
+
82
+ @collection << trace_data
83
+ end
84
+
85
+ def link_to_hierarchy(trace_data)
86
+ hierarchy.link(trace_data)
87
+ end
88
+ end
89
+ end
90
+ end