diff --git a/.rubocop.yml b/.rubocop.yml index 5add6e26a..1cdfbc713 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -2,6 +2,8 @@ require: - rubocop-performance - rubocop-rails - rubocop-rspec + - ./rubocop/use_from_email.rb + - ./rubocop/custom_cop_location.rb Layout/LineLength: Max: 150 @@ -140,6 +142,16 @@ RSpec/MultipleExpectations: RSpec/MultipleMemoizedHelpers: Max: 14 +# custom rules +UseFromEmail: + Enabled: true + Exclude: + - 'app/models/user.rb' + - 'app/models/contact.rb' + +CustomCopLocation: + Enabled: true + AllCops: NewCops: enable Exclude: diff --git a/rubocop/custom_cop_location.rb b/rubocop/custom_cop_location.rb new file mode 100644 index 000000000..8b5c287fc --- /dev/null +++ b/rubocop/custom_cop_location.rb @@ -0,0 +1,18 @@ +require 'rubocop' + +# enforce rubocop custom rules to only be added in the `rubocop` directory +class CustomCopLocation < RuboCop::Cop::Base + MSG = 'Custom cops should be added in the `rubocop` directory.'.freeze + + def on_send(node) + return unless node.source.include?('require \'rubocop\'') + + # convert the full path to relative + full_path = processed_source.file_path + relative_path = Pathname.new(full_path).relative_path_from(Pathname.new(Dir.pwd)).to_s + + return if relative_path.start_with?('rubocop') + + add_offense(node, message: MSG) + end +end diff --git a/rubocop/use_from_email.rb b/rubocop/use_from_email.rb new file mode 100644 index 000000000..189877c94 --- /dev/null +++ b/rubocop/use_from_email.rb @@ -0,0 +1,16 @@ +require 'rubocop' + +# Enforces use of from_email for email attribute lookups +class UseFromEmail < RuboCop::Cop::Base + MSG = 'Use `from_email` for email lookups to ensure case insensitivity.'.freeze + + def_node_matcher :find_by_email?, <<~PATTERN + (send _ :find_by (hash (pair (sym :email) _))) + PATTERN + + def on_send(node) + return unless find_by_email?(node) + + add_offense(node, message: MSG) + end +end