Sha256: 041234a437431d9b59947982b7759d7668c636d9f3a83d67ef0bedf0557ea15c

Contents?: true

Size: 1.55 KB

Versions: 3

Compression:

Stored size: 1.55 KB

Contents

# frozen_string_literal: true

require "rubocop"

require_relative "../version"

module RuboCop
  module Cop
    module Lint
      # This cop checks whether an ActiveRecord model implements the `.anonymise`
      # preference (using the Anony gem).
      #
      # @example Good
      #   class User < ApplicationRecord
      #     anonymise do
      #       overwrite do
      #         email :email
      #         hex :given_name
      #       end
      #     end
      #   end
      #
      # @example Bad
      #   class MyNewThing < ApplicationRecord; end
      class DefineDeletionStrategy < Base
        MSG = "Define .anonymise for %<model>s, see https://github.com/gocardless/" \
              "anony/blob/#{Anony::VERSION}/README.md for details".freeze

        def_node_search :uses_anonymise?, "(send nil? :anonymise)"

        def on_class(node)
          return unless model?(node)
          return if uses_anonymise?(node)

          add_offense(node, message: sprintf(MSG, model: class_name(node)))
        end

        def model?(node)
          superclass = node.children[1]
          model_superclass_name.include? superclass&.const_name
        end

        def class_name(node)
          node.children[0].const_name
        end

        def model_superclass_name
          unless cop_config["ModelSuperclass"]
            return ["ApplicationRecord"]
          end

          if cop_config["ModelSuperclass"].is_a?(Array)
            return cop_config["ModelSuperclass"]
          end

          [cop_config["ModelSuperclass"]]
        end
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
anony-1.6.0 lib/anony/cops/define_deletion_strategy.rb
anony-1.5.0 lib/anony/cops/define_deletion_strategy.rb
anony-1.4.0 lib/anony/cops/define_deletion_strategy.rb