Class: RuboCop::Cop::Rails::Env
- Inherits:
-
Base
- Object
- Base
- RuboCop::Cop::Rails::Env
- Defined in:
- lib/rubocop/cop/rails/env.rb
Overview
Checks for usage of Rails.env which can be replaced with Feature Flags
The cop does not flag Rails.env.local?, the built-in alias for
"development or test" introduced in Rails 7.1. Unlike per-environment
predicates such as development? or production?, local? expresses
the intent of guarding code that must only ever run in development or
test (sanity checks, devtools, seed data) rather than gating an
environment rollout, so a Feature Flag is not a suitable replacement.
Constant Summary collapse
- MSG =
'Use Feature Flags or config instead of `Rails.env`.'- RESTRICT_ON_SEND =
%i[env].freeze
- ALLOWED_LIST =
This allow list is derived from: (Rails.env.methods - Object.instance_methods).select { |m| m.to_s.end_with?('?') } and then removing the environment specific methods like development?, test?, and production?.
local?is kept on the allow list because it intentionally expresses "development or test" rather than a single environment rollout. Set.new( %i[ unicode_normalized? exclude? empty? acts_like_string? include? is_utf8? casecmp? match? starts_with? ends_with? start_with? end_with? valid_encoding? ascii_only? between? local? ] ).freeze
Instance Method Summary collapse
Instance Method Details
#on_send(node) ⇒ Object
57 58 59 60 61 62 63 64 65 66 |
# File 'lib/rubocop/cop/rails/env.rb', line 57 def on_send(node) return unless node.receiver&.const_name == 'Rails' parent = node.parent return unless parent.respond_to?(:predicate_method?) && parent.predicate_method? return if ALLOWED_LIST.include?(parent.method_name) add_offense(parent) end |