From 8e764ce96a92633e79e560f2ebb9656eca6cec67 Mon Sep 17 00:00:00 2001 From: mo khan Date: Wed, 22 Dec 2021 15:01:13 -0700 Subject: feat: Add trace point tracer --- CHANGELOG.md | 1 + lib/straw.rb | 32 ++++++++++++++++++++++++++++++++ test/test_memoizable.rb | 32 ++++++++++++++++---------------- 3 files changed, 49 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0392ba7..5c36ab0 100644 --- a/CHANGELOG.md +++ b/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 diff --git a/lib/straw.rb b/lib/straw.rb index 6a882ff..9b2ca96 100644 --- a/lib/straw.rb +++ b/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 diff --git a/test/test_memoizable.rb b/test/test_memoizable.rb index 05b5be6..e33d261 100644 --- a/test/test_memoizable.rb +++ b/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 - -- cgit v1.2.3