Sha256: 499ffaa942f570fd188220b8863ec97f05a516e313a8b2c0d36ac804448ce887

Contents?: true

Size: 1.31 KB

Versions: 2

Compression:

Stored size: 1.31 KB

Contents

# frozen-string-literal: true

module StackTrace
  class Setup
    class << self
      def trackable?(mod, method_id)
        store[mod].trace?(method_id)
      end

      def store
        @store ||= Hash.new do |h, k|
          h[k.singleton_class] = new(k, :class_methods)
          h[k] = new(k, :instance_methods)
        end
      end
    end

    def initialize(klass, context)
      self.klass = klass
      self.context = context
    end

    def trace?(method_id)
      enabled? && traced_method?(method_id)
    end

    private

    attr_accessor :klass, :context

    def enabled?
      defined?(@enabled) ? @enabled : (@enabled = !config.nil?)
    end

    def config
      @config ||= StackTrace.configuration.for(klass)
    end

    def traced_method?(method_id)
      method_lookup[method_id]
    end

    def method_lookup
      @method_lookup ||= Hash.new { |lookup, method_id| lookup[method_id] = method_enabled?(method_id) }
    end

    def method_enabled?(method_id)
      case method_config
      when Array
        method_config.include?(method_id)
      when Symbol
        method_config != :skip_inherited || instance_methods(false).include?(method_id)
      when Regexp
        method_id =~ method_config
      end
    end

    def method_config
      @method_config ||= config[1].fetch(context, [])
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
stack_trace-0.2.1 lib/stack_trace/setup.rb
stack_trace-0.2.0 lib/stack_trace/setup.rb