Skip to content

Commit

Permalink
Merge pull request #1298 from ytjmt/support-new-enum-syntax-for-enum-…
Browse files Browse the repository at this point in the history
…uniqueness-cop

Support Rails 7 enum syntax for Rails/EnumUniqueness cop
  • Loading branch information
koic authored Jul 5, 2024
2 parents 9e7ca20 + b2b3724 commit 4aa830b
Show file tree
Hide file tree
Showing 3 changed files with 255 additions and 78 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* [#1298](https://github.com/rubocop/rubocop-rails/pull/1298): Support Rails 7 syntax for `Rails/EnumUniqueness` cop. ([@ytjmt][])
36 changes: 29 additions & 7 deletions lib/rubocop/cop/rails/enum_uniqueness.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,18 @@ module Rails
#
# @example
# # bad
# enum :status, { active: 0, archived: 0 }
#
# # good
# enum :status, { active: 0, archived: 1 }
#
# # bad
# enum :status, [:active, :archived, :active]
#
# # good
# enum :status, [:active, :archived]
#
# # bad
# enum status: { active: 0, archived: 0 }
#
# # good
Expand All @@ -24,6 +36,10 @@ class EnumUniqueness < Base
RESTRICT_ON_SEND = %i[enum].freeze

def_node_matcher :enum?, <<~PATTERN
(send nil? :enum $_ ${array hash} ...)
PATTERN

def_node_matcher :enum_with_old_syntax?, <<~PATTERN
(send nil? :enum (hash $...))
PATTERN

Expand All @@ -32,15 +48,17 @@ class EnumUniqueness < Base
PATTERN

def on_send(node)
enum?(node) do |pairs|
enum?(node) do |key, args|
consecutive_duplicates(args.values).each do |item|
add_offense(item, message: message(key, item))
end
end

enum_with_old_syntax?(node) do |pairs|
pairs.each do |pair|
enum_values(pair) do |key, args|
items = args.values

next unless duplicates?(items)

consecutive_duplicates(items).each do |item|
add_offense(item, message: format(MSG, value: item.source, enum: enum_name(key)))
consecutive_duplicates(args.values).each do |item|
add_offense(item, message: message(key, item))
end
end
end
Expand All @@ -57,6 +75,10 @@ def enum_name(key)
key.source
end
end

def message(key, item)
format(MSG, value: item.source, enum: enum_name(key))
end
end
end
end
Expand Down
Loading

0 comments on commit 4aa830b

Please sign in to comment.