class RuboCop::Cop::Style::ConstantVisibility

Checks that constants defined in classes and modules have an explicit visibility declaration. By default, Ruby makes all class- and module constants public, which litters the public API of the class or module. Explicitly declaring a visibility makes intent more clear, and prevents outside actors from touching private state.

@example

# bad
class Foo
  BAR = 42
  BAZ = 43
end

# good
class Foo
  BAR = 42
  private_constant :BAR

  BAZ = 43
  public_constant :BAZ
end

@example IgnoreModules: false (default)

# bad
class Foo
  MyClass = Struct.new()
end

# good
class Foo
  MyClass = Struct.new()
  public_constant :MyClass
end

@example IgnoreModules: true

# good
class Foo
  MyClass = Struct.new()
end

Constants

MSG

Public Instance Methods

on_casgn(node) click to toggle source
# File lib/rubocop/cop/style/constant_visibility.rb, line 51
def on_casgn(node)
  return unless class_or_module_scope?(node)
  return if visibility_declaration?(node)
  return if ignore_modules? && module?(node)

  message = message(node)
  add_offense(node, message: message)
end

Private Instance Methods

class_or_module_scope?(node) click to toggle source
# File lib/rubocop/cop/style/constant_visibility.rb, line 76
def class_or_module_scope?(node)
  return false unless node.parent

  case node.parent.type
  when :begin
    class_or_module_scope?(node.parent)
  when :class, :module
    true
  end
end
ignore_modules?() click to toggle source
# File lib/rubocop/cop/style/constant_visibility.rb, line 62
def ignore_modules?
  cop_config.fetch('IgnoreModules', false)
end
match_name?(name, constant_name) click to toggle source
# File lib/rubocop/cop/style/constant_visibility.rb, line 100
def match_name?(name, constant_name)
  name.to_sym == constant_name.to_sym
end
message(node) click to toggle source
# File lib/rubocop/cop/style/constant_visibility.rb, line 70
def message(node)
  _namespace, constant_name, _value = *node

  format(MSG, constant_name: constant_name)
end
module?(node) click to toggle source
# File lib/rubocop/cop/style/constant_visibility.rb, line 66
def module?(node)
  node.children.last.class_constructor?
end
visibility_declaration?(node) click to toggle source
# File lib/rubocop/cop/style/constant_visibility.rb, line 87
def visibility_declaration?(node)
  _namespace, constant_name, _value = *node

  node.parent.each_child_node(:send).any? do |child|
    visibility_declaration_for?(child, constant_name)
  end
end