Sha256: 6b1694cd0acf2fe1621bb706dbf01de459232738048f5f983c32065ddc363eb3

Contents?: true

Size: 1.55 KB

Versions: 1

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 < Cop
        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

1 entries across 1 versions & 1 rubygems

Version Path
anony-1.2.0 lib/anony/cops/define_deletion_strategy.rb