class RuboCop::Cop::Lint::ConstantDefinitionInBlock
Do not define constants within a block, since the block’s scope does not isolate or namespace the constant in any way.
If you are trying to define that constant once, define it outside of the block instead, or use a variable or method if defining the constant in the outer scope would be problematic.
For meta-programming, use ‘const_set`.
@example
# bad task :lint do FILES_TO_LINT = Dir['lib/*.rb'] end # bad describe 'making a request' do class TestRequest; end end # bad module M extend ActiveSupport::Concern included do LIST = [] end end # good task :lint do files_to_lint = Dir['lib/*.rb'] end # good describe 'making a request' do let(:test_request) { Class.new } # see also `stub_const` for RSpec end # good module M extend ActiveSupport::Concern included do const_set(:LIST, []) end end
@example AllowedMethods: [‘enums’] (default)
# good # `enums` for Typed Enums via `T::Enum` in Sorbet. # https://sorbet.org/docs/tenum class TestEnum < T::Enum enums do Foo = new("foo") end end
Constants
- MSG
Public Instance Methods
on_casgn(node)
click to toggle source
# File lib/rubocop/cop/lint/constant_definition_in_block.rb, line 79 def on_casgn(node) return if !constant_assigned_in_block?(node) || allowed_method?(method_name(node)) add_offense(node) end
on_class(node)
click to toggle source
# File lib/rubocop/cop/lint/constant_definition_in_block.rb, line 85 def on_class(node) return if !module_defined_in_block?(node) || allowed_method?(method_name(node)) add_offense(node) end
Also aliased as: on_module
Private Instance Methods
method_name(node)
click to toggle source
# File lib/rubocop/cop/lint/constant_definition_in_block.rb, line 94 def method_name(node) node.ancestors.find(&:block_type?).method_name end