Commit 8e764ce
Changed files (3)
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