diff options
Diffstat (limited to 'lib/straw.rb')
| -rw-r--r-- | lib/straw.rb | 32 |
1 files changed, 32 insertions, 0 deletions
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 |
