Commit 9722158c authored by Yorick Peterse's avatar Yorick Peterse

Fix detecting nested EE constants in RuboCop

The InjectEnterpriseEditionModule cop would not detect certain nested EE
constants such as `EE::Foo::Bar::Baz`. This could result in it not
enforcing `prepend` being placed on the last line. This commit fixes
this by just performing a string match on the line, instead of relying
on AST matching.
parent 454942da
...@@ -11,9 +11,13 @@ module RuboCop ...@@ -11,9 +11,13 @@ module RuboCop
METHODS = Set.new(%i[include extend prepend]).freeze METHODS = Set.new(%i[include extend prepend]).freeze
def_node_matcher :ee_const?, <<~PATTERN def ee_const?(node)
(const (const _ :EE) _) line = node.location.expression.source_line
PATTERN
# We use `match?` here instead of RuboCop's AST matching, as this makes
# it far easier to handle nested constants such as `EE::Foo::Bar::Baz`.
line.match?(/(\s|\()(::)?EE::/)
end
def on_send(node) def on_send(node)
return unless METHODS.include?(node.children[1]) return unless METHODS.include?(node.children[1])
......
...@@ -19,6 +19,41 @@ describe RuboCop::Cop::InjectEnterpriseEditionModule do ...@@ -19,6 +19,41 @@ describe RuboCop::Cop::InjectEnterpriseEditionModule do
SOURCE SOURCE
end end
it 'does not flag the use of `prepend EEFoo` in the middle of a file' do
expect_no_offenses(<<~SOURCE)
class Foo
prepend EEFoo
end
SOURCE
end
it 'flags the use of `prepend EE::Foo::Bar` in the middle of a file' do
expect_offense(<<~SOURCE)
class Foo
prepend EE::Foo::Bar
^^^^^^^^^^^^^^^^^^^^ Injecting EE modules must be done on the last line of this file, outside of any class or module definitions
end
SOURCE
end
it 'flags the use of `prepend(EE::Foo::Bar)` in the middle of a file' do
expect_offense(<<~SOURCE)
class Foo
prepend(EE::Foo::Bar)
^^^^^^^^^^^^^^^^^^^^^ Injecting EE modules must be done on the last line of this file, outside of any class or module definitions
end
SOURCE
end
it 'flags the use of `prepend EE::Foo::Bar::Baz` in the middle of a file' do
expect_offense(<<~SOURCE)
class Foo
prepend EE::Foo::Bar::Baz
^^^^^^^^^^^^^^^^^^^^^^^^^ Injecting EE modules must be done on the last line of this file, outside of any class or module definitions
end
SOURCE
end
it 'flags the use of `prepend ::EE` in the middle of a file' do it 'flags the use of `prepend ::EE` in the middle of a file' do
expect_offense(<<~SOURCE) expect_offense(<<~SOURCE)
class Foo class Foo
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment