Commit 8e764ce

mo khan <mo@mokhan.ca>
2021-12-22 22:01:13
feat: Add trace point tracer
1 parent db383c5
lib/straw.rb
@@ -13,6 +13,10 @@ module Straw
     end
   end
 
+  def self.tracer
+    @tracer ||= Tracer.new(logger)
+  end
+
   module Memoizable
     def memoize(key)
       if memoized?(key)
@@ -32,4 +36,32 @@ module Straw
       "@#{key}"
     end
   end
+
+  class Tracer
+    def initialize(logger)
+      @logger = logger
+    end
+
+    def trace(defaults = {})
+      tracer = TracePoint.new(:call) do |x|
+        @logger.debug(defaults.merge({ path: x.path, lineno: x.lineno, clazz: x.defined_class, method: x.method_id, args: args_from(x), locals: locals_from(x) }))
+      rescue StandardError => boom
+        @logger.error(defaults.merge({ message: boom.message, stacktrace: boom.backtrace }))
+      end
+      tracer.enable
+      yield
+    ensure
+      tracer.disable
+    end
+
+    private
+
+    def args_from(trace)
+      trace.parameters.map(&:last).map { |x| [x, trace.binding.eval(x.to_s)] }.to_h
+    end
+
+    def locals_from(trace)
+      trace.binding.local_variables.map { |x| [x, trace.binding.local_variable_get(x)] }.to_h
+    end
+  end
 end
test/test_memoizable.rb
@@ -2,25 +2,26 @@
 
 require "test_helper"
 
-describe ::Straw::Memoizable do
-  def setup
-    item_clazz = Class.new do
-      include ::Straw::Memoizable
+class Item
+  include ::Straw::Memoizable
 
-      attr_reader :calls
+  attr_reader :calls
 
-      def initialize
-        @calls = Hash.new { |h, k| h[k] = 0 }
-      end
+  def initialize
+    @calls = Hash.new { |h, k| h[k] = 0 }
+  end
 
-      def value(item)
-        memoize(:value) do
-          @calls[:value] += 1
-          item
-        end
-      end
+  def value(item)
+    memoize(:value) do
+      @calls[:value] += 1
+      item
     end
-    @subject = item_clazz.new
+  end
+end
+
+describe ::Straw::Memoizable do
+  def setup
+    @subject = Item.new
   end
 
   describe "#memoize" do
@@ -46,4 +47,3 @@ describe ::Straw::Memoizable do
     end
   end
 end
-
CHANGELOG.md
@@ -2,6 +2,7 @@
 
 - feat: Add Memoizable module
 - feat: Add default logger
+- feat: Add trace point tracer
 
 ## [0.1.0] - 2021-12-22