otwarchive-symphonyarchive/rubocop/cop/cucumber/regex_step_name.rb
2026-03-11 22:22:11 +00:00

51 lines
1.3 KiB
Ruby

# frozen_string_literal: true
module RuboCop
module Cop
module Cucumber
# Checks that Cucumber step definitions use Cucumber expressions
# instead of Regex. Note: this may not always be possible, and this
# cop is not smart enough to detect those cases.
#
# @example
# # bad
# Given /foobar/ do
# ...
# end
# When /baz/ do
# ...
# end
# Then /oops(\w+)/ do |it|
# ...
# end
#
# @example
# # good
# Given "foobar(s)" do
# ...
# end
# When "baz" do
# ...
# end
# Then "oops{str}" do |it|
# ...
# end
class RegexStepName < RuboCop::Cop::Base
MSG = "Prefer Cucumber expressions (https://github.com/cucumber/cucumber-expressions) over regex for step names; refer to https://github.com/otwcode/otwarchive/wiki/Reviewdog-and-RuboCop if regex is still required"
RESTRICT_ON_SEND = %i[Given When Then].freeze
# @!method regex_name(node)
def_node_matcher :regex_name, <<~PATTERN
(send nil? _ $(:regexp ...) ...)
PATTERN
def on_send(node)
regex_name(node) do |regex_node|
add_offense(regex_node, severity: :refactor)
end
end
end
end
end
end