2021-09-20 07:14:27 +00:00
|
|
|
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
|
|
|
|
|
|
|
module RuboCop
|
|
|
|
module Cop
|
|
|
|
module Zammad
|
|
|
|
class ExistsDbStrategy < Base
|
|
|
|
def_node_matcher :migration_execute?, <<-PATTERN
|
|
|
|
$(send (const (const _ :ObjectManager ) :Attribute) :migration_execute)
|
|
|
|
PATTERN
|
|
|
|
|
|
|
|
def_node_matcher :create_attribute?, <<-PATTERN
|
|
|
|
$(send _ :create_attribute ...)
|
|
|
|
PATTERN
|
|
|
|
|
|
|
|
def_node_matcher :is_block?, <<-PATTERN
|
|
|
|
$(block ...)
|
|
|
|
PATTERN
|
|
|
|
|
|
|
|
def_node_matcher :has_reset?, <<-PATTERN
|
2021-10-20 09:43:35 +00:00
|
|
|
$(send _ {:describe :context :it :shared_examples} (_ ...) (hash ... (pair (sym :db_strategy) (sym {:reset :reset_all}))))
|
2021-09-20 07:14:27 +00:00
|
|
|
PATTERN
|
|
|
|
|
|
|
|
MSG = 'Add a `db_strategy: :reset` to your context/decribe when you are creating object manager attributes!'.freeze
|
|
|
|
|
|
|
|
def on_send(node)
|
|
|
|
return if !migration_execute?(node) && !create_attribute?(node)
|
|
|
|
|
|
|
|
reset = false
|
|
|
|
node_parent = node.parent
|
|
|
|
until node_parent.nil?
|
|
|
|
if is_block?(node_parent) && has_reset?(node_parent.children[0])
|
|
|
|
reset = true
|
|
|
|
break
|
|
|
|
end
|
|
|
|
node_parent = node_parent.parent
|
|
|
|
end
|
|
|
|
|
|
|
|
return if reset
|
|
|
|
|
|
|
|
add_offense(node)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|