diff --git a/CHANGELOG.md b/CHANGELOG.md index 76228a4..4eb4c0e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## master (unreleased) +* [#49](https://github.com/rubocop/rubocop-rake/issues/49): Fix false negatives for `Rake/Desc` when a task has a single prerequisite in an array. ([@ydakuka][]) + ## 0.7.1 (2025-02-16) ### Bug fixes @@ -78,3 +80,4 @@ [@jaruuuu]: https://github.com/jaruuuu [@koic]: https://github.com/koic [@tejasbubane]: https://github.com/tejasbubane +[@ydakuka]: https://github.com/ydakuka diff --git a/lib/rubocop/cop/rake/desc.rb b/lib/rubocop/cop/rake/desc.rb index 88b84c4..89343fd 100644 --- a/lib/rubocop/cop/rake/desc.rb +++ b/lib/rubocop/cop/rake/desc.rb @@ -39,10 +39,8 @@ class Desc < Base def on_task(node) return if task_with_desc?(node) - return if Helper::TaskName.task_name(node) == :default - - requirements = prerequisites(node) - return if requirements&.array_type? + return if default_task?(node) + return if multiple_prerequisites?(node) add_offense(node) end @@ -76,6 +74,18 @@ def on_task(node) private def can_insert_desc_to?(parent) parent.type?(:begin, :block, :kwbegin) end + + private def default_task?(node) + Helper::TaskName.task_name(node) == :default + end + + private def multiple_prerequisites?(node) + requirements = prerequisites(node) + return false unless requirements&.array_type? + + children = requirements.children + children && children.size > 1 + end end end end diff --git a/spec/rubocop/cop/rake/desc_spec.rb b/spec/rubocop/cop/rake/desc_spec.rb index ffbd08e..63aad8b 100644 --- a/spec/rubocop/cop/rake/desc_spec.rb +++ b/spec/rubocop/cop/rake/desc_spec.rb @@ -68,12 +68,28 @@ expect_offense(<<~RUBY) task release: 'changelog:check_clean' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Describe the task with `desc` method. + + task release: :changelog + ^^^^^^^^^^^^^^^^^^^^^^^^ Describe the task with `desc` method. + + task release: %w[changelog] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Describe the task with `desc` method. + + task release: %i[changelog] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Describe the task with `desc` method. + + task "release" => :environment + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Describe the task with `desc` method. RUBY end it 'does not register an offense for multiple prerequisite declarations' do expect_no_offenses(<<~RUBY) task release: ['changelog:check_clean', 'changelog:create'] + + task release: %w[changelog lint] + + task release: %i[changelog lint] RUBY end end