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
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) add_offense(node, message: format(MSG, constant_name: node.name)) end
Private Instance Methods
Source
# File lib/rubocop/cop/style/constant_visibility.rb, line 69 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
Source
# File lib/rubocop/cop/style/constant_visibility.rb, line 61 def ignore_modules? cop_config.fetch('IgnoreModules', false) end
Source
# File lib/rubocop/cop/style/constant_visibility.rb, line 91 def match_name?(name, constant_name) name.to_sym == constant_name.to_sym end
Source
# File lib/rubocop/cop/style/constant_visibility.rb, line 65 def module?(node) node.expression.class_constructor? end
Source
# File lib/rubocop/cop/style/constant_visibility.rb, line 80 def visibility_declaration?(node) node.parent.each_child_node(:send).any? do |child| visibility_declaration_for?(child, node.name) end end