52 lines
1.3 KiB
Ruby
52 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
|