Class: Reek::Smells::PrimaDonnaMethod

Inherits:
SmellDetector show all
Defined in:
lib/reek/smells/prima_donna_method.rb

Overview

Excerpt from: dablog.rubypal.com/2007/8/15/bang-methods-or-danger-will-rubyist since this sums it up really well:

The ! in method names that end with ! means, "This method is dangerous"
-- or, more precisely, this method is the "dangerous" version of an
equivalent method, with the same name minus the !. "Danger" is
relative; the ! doesn't mean anything at all unless the method name
it's in corresponds to a similar but bang-less method name.

Don't add ! to your destructive (receiver-changing) methods' names,
unless you consider the changing to be "dangerous" and you have a
"non-dangerous" equivalent method without the !. If some arbitrary
subset of destructive methods end with !, then the whole point of !
gets distorted and diluted, and ! ceases to convey any information
whatsoever.

Such a method is called PrimaDonnaMethod and is reported as a smell.

Constant Summary

Constants inherited from SmellDetector

SmellDetector::DEFAULT_EXCLUDE_SET, SmellDetector::EXCLUDE_KEY

Instance Attribute Summary

Attributes inherited from SmellDetector

#smell_category, #smell_type, #smells_found, #source

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from SmellDetector

#config_for, #configure_with, default_config, default_smell_category, #enabled?, #enabled_for?, #examine, #exception?, #initialize, #register, #report_on, smell_category, smell_type, #value

Constructor Details

This class inherits a constructor from Reek::Smells::SmellDetector

Class Method Details

.contextsObject

:nodoc:


26
27
28
# File 'lib/reek/smells/prima_donna_method.rb', line 26

def self.contexts # :nodoc:
  [:class]
end

Instance Method Details

#examine_context(ctx) ⇒ Object


30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/reek/smells/prima_donna_method.rb', line 30

def examine_context(ctx)
  ctx.node_instance_methods.map do |method_sexp|
    next unless method_sexp.ends_with_bang?

    version_without_bang = ctx.node_instance_methods.find do |sexp_item|
      sexp_item.name.to_s == method_sexp.name_without_bang
    end
    next if version_without_bang

    SmellWarning.new self,
                     context: ctx.full_name,
                     lines: [ctx.exp.line],
                     message: "has prima donna method `#{method_sexp.name}`"
  end.compact
end