46 lines
1.3 KiB
Ruby
46 lines
1.3 KiB
Ruby
|
# 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
|
||
|
$(send _ {:describe :context :it} (_ ...) (hash ... (pair (sym :db_strategy) (sym {:reset :reset_all}))))
|
||
|
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
|