Class: Reek::Smells::UncommunicativeModuleName

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

Overview

An Uncommunicative Name is a name that doesn't communicate its intent well enough.

Poor names make it hard for the reader to build a mental picture of what's going on in the code. They can also be mis-interpreted; and they hurt the flow of reading, because the reader must slow down to interpret the names.

Currently UncommunicativeModuleName checks for

  • 1-character names

  • names ending with a number

Constant Summary collapse

REJECT_KEY =

The name of the config field that lists the regexps of smelly names to be reported.

'reject'
DEFAULT_REJECT_SET =
[/^.$/, /[0-9]$/]
ACCEPT_KEY =

The name of the config field that lists the specific names that are to be treated as exceptions; these names will not be reported as uncommunicative.

'accept'
DEFAULT_ACCEPT_SET =
['Inline::C']

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_smell_category, #enabled?, #enabled_for?, #examine, #exception?, #initialize, #register, #report_on, smell_type, #value

Constructor Details

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

Class Method Details

.contextsObject

:nodoc:


42
43
44
# File 'lib/reek/smells/uncommunicative_module_name.rb', line 42

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

.default_configObject


35
36
37
38
39
40
# File 'lib/reek/smells/uncommunicative_module_name.rb', line 35

def self.default_config
  super.merge(
    REJECT_KEY => DEFAULT_REJECT_SET,
    ACCEPT_KEY => DEFAULT_ACCEPT_SET
  )
end

.smell_categoryObject


31
32
33
# File 'lib/reek/smells/uncommunicative_module_name.rb', line 31

def self.smell_category
  'UncommunicativeName'
end

Instance Method Details

#examine_context(ctx) ⇒ Array<SmellWarning>

Checks the given context for uncommunicative names.

:reek:Duplication { allow_calls: [ to_s ] }

Returns:


52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/reek/smells/uncommunicative_module_name.rb', line 52

def examine_context(ctx)
  @reject_names = value(REJECT_KEY, ctx, DEFAULT_REJECT_SET)
  @accept_names = value(ACCEPT_KEY, ctx, DEFAULT_ACCEPT_SET)
  exp = ctx.exp
  full_name = ctx.full_name
  name = exp.simple_name.to_s
  return [] if @accept_names.include?(full_name)
  var = name.gsub(/^[@\*\&]*/, '')
  return [] if @accept_names.include?(var)
  return [] unless @reject_names.find { |patt| patt =~ var }
  [SmellWarning.new(self,
                    context: full_name,
                    lines: [exp.line],
                    message: "has the name '#{name}'",
                    parameters: { name: name })]
end