Sha256: a24ec4fb74abc59d59825a849217eac060f793f29ce99320dc0dbedcb57fc0e3
Contents?: true
Size: 1.79 KB
Versions: 14
Compression:
Stored size: 1.79 KB
Contents
# frozen_string_literal: true module RuboCop module Cop module Style # This cop 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 # class ConstantVisibility < Cop MSG = 'Explicitly make `%<constant_name>s` public or private using ' \ 'either `#public_constant` or `#private_constant`.' def on_casgn(node) return unless class_or_module_scope?(node) return if visibility_declaration?(node) add_offense(node) end private def message(node) _namespace, constant_name, _value = *node format(MSG, constant_name: constant_name) end def class_or_module_scope?(node) node.parent && %i[class module].include?(node.parent.type) end 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 def_node_matcher :visibility_declaration_for?, <<-PATTERN (send nil? {:public_constant :private_constant} ({sym str} %1)) PATTERN end end end end
Version data entries
14 entries across 14 versions & 2 rubygems