Sha256: 00d6e65bfdd51c53849b8c869ea1169879ba91d0e3ee582eafc283ae3f6a4d12

Contents?: true

Size: 1.18 KB

Versions: 2

Compression:

Stored size: 1.18 KB

Contents

module DidYouMean
  module NoMethodErrorExtension
    def receiver
      args.first
    end

    def self.included(base)
      base.class_eval do
        alias all_backtrace backtrace
        alias backtrace backtrace_without_unneeded_lines
      end
    end

    def backtrace_without_unneeded_lines
      all_backtrace.reject do |line|
        line.include?("lib/did_you_mean/core_ext/object.rb")
      end if all_backtrace.is_a?(Array)
    end

    def did_you_mean?
      return if similar_methods.empty?

      output = "\n\n"
      output << "Did you mean?" << "\n"
      output << similar_methods.map{|word| "\t#{receiver_name}#{separator}#{word}" }.join("\n") << "\n"
      output << "\n"
    end

    def similar_methods
      @similar_methods ||= (receiver.methods + receiver.singleton_methods).uniq.select do |method|
        ::Text::Levenshtein.distance(method.to_s, name.to_s) <= 2
      end
    end

    private

    def receiver_name
      class_method? ? receiver.name : receiver.class.name
    end

    def separator
      class_method? ? "." : "#"
    end

    def class_method?
      receiver.is_a? Class
    end
  end
end

NoMethodError.send :include, DidYouMean::NoMethodErrorExtension

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
did_you_mean-0.3.0 lib/did_you_mean/no_method_error_extension.rb
did_you_mean-0.2.0 lib/did_you_mean/no_method_error_extension.rb