rubocop-capybara 2.19.0 → 2.21.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5af741b67ec2d02d9e27e688d553e5e1c8cbb04c845f5d9771b480b291b1d805
4
- data.tar.gz: cbef51994ffa79af69a8a7aac9aabf69ccc307b3c2c104eae2a3a4c635467d26
3
+ metadata.gz: ed8a103d3d11a90d7873a5569246e580d816e2ebad0a614827bd2ed3546bf6bf
4
+ data.tar.gz: d09792f9ea669f7556814b898fbfd9829e8db25fdd3b8873ac85487ee9f199ef
5
5
  SHA512:
6
- metadata.gz: 98bcff699a8ee323a24118f26b412ed8e4d26754df9ee82eab0b107f1b96cb2a0ad7ba898925fde7683501244f1474231bd53591f450e6080321e0bd83245257
7
- data.tar.gz: 4194b54f6b12d4b168122c59fbfa18ec210e92cb4d20207665787ae870a3a92a240938818e187889f239e5ce29244db5c612c368bf761ee68f65f1617f72092f
6
+ metadata.gz: '0798dc5b62b3dc8a8ea31bd1f79cedde039d0d69e94cf18a902ced3da7ae757b0529fa17b8d5711baae964fb591eccfcce4f7b16320598cd9dafb657c4aee85c'
7
+ data.tar.gz: 7de56f77982c7b52973c38698317233da3ebeb2a55dff962c380105419d2708e43e16d5f1f63a87338ec935d6c5c24941efd95a2d308b2236d7dd840bf8c63ab
data/CHANGELOG.md CHANGED
@@ -2,6 +2,20 @@
2
2
 
3
3
  ## Edge (Unreleased)
4
4
 
5
+ ## 2.21.0 (2024-06-08)
6
+
7
+ - Fix a false negative for `Capybara/NegationMatcher` when using `to_not`. ([@ydah])
8
+ - Fix a false negative for `Capybara/SpecificFinders` when using `find(:id, 'some-id')`. ([@ydah])
9
+
10
+ ## 2.20.0 (2024-01-03)
11
+
12
+ - Change to default `EnforcedStyle: link_or_button` for `Capybara/ClickLinkOrButtonStyle` cop. ([@ydah])
13
+ - Fix a false negative for `RSpec/HaveSelector` when first argument is dstr node. ([@ydah])
14
+ - Add new `Capybara/RedundantWithinFind` cop. ([@ydah])
15
+ - Fix an invalid attributes parse when name with multiple `[]` for `Capybara/SpecificFinders` and `Capybara/SpecificActions` and `Capybara/SpecificMatcher`. ([@ydah])
16
+ - Change to default `EnforcedStyle: have_no` for `Capybara/NegationMatcher` cop. ([@ydah])
17
+ - Fix a false positive for `Capybara/SpecificMatcher` when `text:` or `exact_text:` with regexp. ([@ydah])
18
+
5
19
  ## 2.19.0 (2023-09-20)
6
20
 
7
21
  - Add new `Capybara/RSpec/PredicateMatcher` cop. ([@ydah])
data/config/default.yml CHANGED
@@ -10,13 +10,14 @@ Capybara:
10
10
  - "**/features/step_definitions/**/*"
11
11
 
12
12
  Capybara/ClickLinkOrButtonStyle:
13
- Description: Checks for click button or link style.
13
+ Description: Checks for methods of button or link clicks.
14
14
  Enabled: pending
15
15
  VersionAdded: '2.19'
16
- EnforcedStyle: strict
16
+ VersionChanged: '2.20'
17
+ EnforcedStyle: link_or_button
17
18
  SupportedStyles:
18
- - strict
19
19
  - link_or_button
20
+ - strict
20
21
  Reference: https://www.rubydoc.info/gems/rubocop-capybara/RuboCop/Cop/Capybara/ClickLinkOrButtonStyle
21
22
 
22
23
  Capybara/CurrentPathExpectation:
@@ -36,12 +37,19 @@ Capybara/NegationMatcher:
36
37
  Description: Enforces use of `have_no_*` or `not_to` for negated expectations.
37
38
  Enabled: pending
38
39
  VersionAdded: '2.14'
39
- EnforcedStyle: not_to
40
+ VersionChanged: '2.20'
41
+ EnforcedStyle: have_no
40
42
  SupportedStyles:
41
43
  - have_no
42
44
  - not_to
43
45
  Reference: https://www.rubydoc.info/gems/rubocop-capybara/RuboCop/Cop/Capybara/NegationMatcher
44
46
 
47
+ Capybara/RedundantWithinFind:
48
+ Description: Checks for redundant `within find(...)` calls.
49
+ Enabled: pending
50
+ VersionAdded: '2.20'
51
+ Reference: https://www.rubydoc.info/gems/rubocop-capybara/RuboCop/Cop/Capybara/RedundantWithinFind
52
+
45
53
  Capybara/SpecificActions:
46
54
  Description: Checks for there is a more specific actions offered by Capybara.
47
55
  Enabled: pending
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Capybara
5
+ module Cop
6
+ # Source and spec generator for new cops
7
+ #
8
+ # This generator will take a cop name and generate a source file
9
+ # and spec file when given a valid qualified cop name.
10
+ # @api private
11
+ class Generator < RuboCop::Cop::Generator
12
+ def todo
13
+ <<~TODO
14
+ Do 4 steps:
15
+ 1. Modify the description of #{badge} in config/default.yml
16
+ 2. Implement your new cop in the generated file!
17
+ 3. Add an entry about new cop to CHANGELOG.md
18
+ 4. Commit your new cop with a message such as
19
+ e.g. "Add new `#{badge}` cop"
20
+ TODO
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -4,7 +4,7 @@ module RuboCop
4
4
  module Capybara
5
5
  # Version information for the Capybara RuboCop plugin.
6
6
  module Version
7
- STRING = '2.19.0'
7
+ STRING = '2.21.0'
8
8
  end
9
9
  end
10
10
  end
@@ -3,18 +3,16 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Capybara
6
- # Checks for click button or link style.
6
+ # Checks for methods of button or link clicks.
7
7
  #
8
- # @example EnforcedStyle: strict (default)
9
- # # bad
10
- # click_link_or_button('foo')
11
- # click_on('foo')
8
+ # By default, prefer to use `click_link_or_button` or `click_on`.
9
+ # These methods offer a weaker coupling between the test and HTML,
10
+ # allowing for a more faithful reflection of how the user behaves.
12
11
  #
13
- # # good
14
- # click_link('foo')
15
- # click_button('foo')
12
+ # You can set `EnforcedStyle: strict` to prefer the use of
13
+ # `click_link` and `click_button`, but this is a deprecated setting.
16
14
  #
17
- # @example EnforcedStyle: link_or_button
15
+ # @example EnforcedStyle: link_or_button (default)
18
16
  # # bad
19
17
  # click_link('foo')
20
18
  # click_button('foo')
@@ -23,6 +21,15 @@ module RuboCop
23
21
  # click_link_or_button('foo')
24
22
  # click_on('foo')
25
23
  #
24
+ # @example EnforcedStyle: strict
25
+ # # bad
26
+ # click_link_or_button('foo')
27
+ # click_on('foo')
28
+ #
29
+ # # good
30
+ # click_link('foo')
31
+ # click_button('foo')
32
+ #
26
33
  class ClickLinkOrButtonStyle < ::RuboCop::Cop::Base
27
34
  include ConfigurableEnforcedStyle
28
35
 
@@ -43,8 +50,8 @@ module RuboCop
43
50
  private
44
51
 
45
52
  def offense?(node)
46
- style == :strict && !strict_method?(node) ||
47
- style == :link_or_button && !link_or_button_method?(node)
53
+ (style == :strict && !strict_method?(node)) ||
54
+ (style == :link_or_button && !link_or_button_method?(node))
48
55
  end
49
56
 
50
57
  def offense_message(node)
@@ -37,20 +37,20 @@ module RuboCop
37
37
  RESTRICT_ON_SEND = %i[expect].freeze
38
38
 
39
39
  # @!method expectation_set_on_current_path(node)
40
- def_node_matcher :expectation_set_on_current_path, <<-PATTERN
40
+ def_node_matcher :expectation_set_on_current_path, <<~PATTERN
41
41
  (send nil? :expect (send {(send nil? :page) nil?} :current_path))
42
42
  PATTERN
43
43
 
44
44
  # Supported matchers: eq(...) / match(/regexp/) / match('regexp')
45
45
  # @!method as_is_matcher(node)
46
- def_node_matcher :as_is_matcher, <<-PATTERN
46
+ def_node_matcher :as_is_matcher, <<~PATTERN
47
47
  (send
48
48
  #expectation_set_on_current_path ${:to :to_not :not_to}
49
49
  ${(send nil? :eq ...) (send nil? :match (regexp ...))})
50
50
  PATTERN
51
51
 
52
52
  # @!method regexp_node_matcher(node)
53
- def_node_matcher :regexp_node_matcher, <<-PATTERN
53
+ def_node_matcher :regexp_node_matcher, <<~PATTERN
54
54
  (send
55
55
  #expectation_set_on_current_path ${:to :to_not :not_to}
56
56
  $(send nil? :match ${str dstr xstr}))
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Capybara
6
+ # Css selector parser.
7
+ # @api private
8
+ class CssAttributesParser
9
+ def initialize(selector)
10
+ @selector = selector
11
+ @state = :initial
12
+ @temp = ''
13
+ @results = {}
14
+ @bracket_count = 0
15
+ end
16
+
17
+ # @return [Array<String>]
18
+ def parse # rubocop:disable Metrics/MethodLength
19
+ @selector.each_char do |char|
20
+ if char == '['
21
+ on_bracket_start
22
+ elsif char == ']'
23
+ on_bracket_end
24
+ elsif @state == :inside_attr
25
+ @temp += char
26
+ end
27
+ end
28
+ @results
29
+ end
30
+
31
+ private
32
+
33
+ def on_bracket_start
34
+ @bracket_count += 1
35
+ if @state == :initial
36
+ @state = :inside_attr
37
+ else
38
+ @temp += '['
39
+ end
40
+ end
41
+
42
+ def on_bracket_end
43
+ @bracket_count -= 1
44
+ if @bracket_count.zero?
45
+ @state = :initial
46
+ key, value = @temp.split('=')
47
+ @results[key] = normalize_value(value)
48
+ @temp.clear
49
+ else
50
+ @temp += ']'
51
+ end
52
+ end
53
+
54
+ # @param value [String]
55
+ # @return [Boolean, String]
56
+ # @example
57
+ # normalize_value('true') # => true
58
+ # normalize_value('false') # => false
59
+ # normalize_value(nil) # => nil
60
+ # normalize_value("foo") # => "'foo'"
61
+ def normalize_value(value)
62
+ case value
63
+ when 'true' then true
64
+ when 'false' then false
65
+ when nil then nil
66
+ else "'#{value.gsub(/"|'/, '')}'"
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
@@ -55,15 +55,9 @@ module RuboCop
55
55
  # attributes('a[foo-bar_baz]') # => {"foo-bar_baz=>nil}
56
56
  # attributes('button[foo][bar=baz]') # => {"foo"=>nil, "bar"=>"'baz'"}
57
57
  # attributes('table[foo=bar]') # => {"foo"=>"'bar'"}
58
+ # attributes('[foo="bar[baz][qux]"]') # => {"foo"=>"'bar[baz][qux]'"}
58
59
  def attributes(selector)
59
- # Extract the inner strings of attributes.
60
- # For example, extract the following:
61
- # 'button[foo][bar=baz]' => 'foo][bar=baz'
62
- inside_attributes = selector.scan(/\[(.*)\]/).flatten.join
63
- inside_attributes.split('][').to_h do |attr|
64
- key, value = attr.split('=')
65
- [key, normalize_value(value)]
66
- end
60
+ CssAttributesParser.new(selector).parse
67
61
  end
68
62
 
69
63
  # @param selector [String]
@@ -89,22 +83,6 @@ module RuboCop
89
83
  normalize = selector.gsub(/(\\[>,+~]|\(.*\))/, '')
90
84
  normalize.match?(/[ >,+~]/)
91
85
  end
92
-
93
- # @param value [String]
94
- # @return [Boolean, String]
95
- # @example
96
- # normalize_value('true') # => true
97
- # normalize_value('false') # => false
98
- # normalize_value(nil) # => nil
99
- # normalize_value("foo") # => "'foo'"
100
- def normalize_value(value)
101
- case value
102
- when 'true' then true
103
- when 'false' then false
104
- when nil then nil
105
- else "'#{value.gsub(/"|'/, '')}'"
106
- end
107
- end
108
86
  end
109
87
  end
110
88
  end
@@ -5,23 +5,23 @@ module RuboCop
5
5
  module Capybara
6
6
  # Enforces use of `have_no_*` or `not_to` for negated expectations.
7
7
  #
8
- # @example EnforcedStyle: not_to (default)
8
+ # @example EnforcedStyle: have_no (default)
9
9
  # # bad
10
- # expect(page).to have_no_selector
11
- # expect(page).to have_no_css('a')
10
+ # expect(page).not_to have_selector 'a'
11
+ # expect(page).not_to have_css('a')
12
12
  #
13
13
  # # good
14
- # expect(page).not_to have_selector
15
- # expect(page).not_to have_css('a')
14
+ # expect(page).to have_no_selector 'a'
15
+ # expect(page).to have_no_css('a')
16
16
  #
17
- # @example EnforcedStyle: have_no
17
+ # @example EnforcedStyle: not_to
18
18
  # # bad
19
- # expect(page).not_to have_selector
20
- # expect(page).not_to have_css('a')
19
+ # expect(page).to have_no_selector 'a'
20
+ # expect(page).to have_no_css('a')
21
21
  #
22
22
  # # good
23
- # expect(page).to have_no_selector
24
- # expect(page).to have_no_css('a')
23
+ # expect(page).not_to have_selector 'a'
24
+ # expect(page).not_to have_css('a')
25
25
  #
26
26
  class NegationMatcher < ::RuboCop::Cop::Base
27
27
  extend AutoCorrector
@@ -42,7 +42,7 @@ module RuboCop
42
42
 
43
43
  # @!method not_to?(node)
44
44
  def_node_matcher :not_to?, <<~PATTERN
45
- (send ... :not_to
45
+ (send ... {:not_to :to_not}
46
46
  (send nil? %POSITIVE_MATCHERS ...))
47
47
  PATTERN
48
48
 
@@ -53,7 +53,7 @@ module RuboCop
53
53
  PATTERN
54
54
 
55
55
  def on_send(node)
56
- return unless offense?(node.parent)
56
+ return unless offense?(node)
57
57
 
58
58
  matcher = node.method_name.to_s
59
59
  add_offense(offense_range(node),
@@ -67,8 +67,9 @@ module RuboCop
67
67
  private
68
68
 
69
69
  def offense?(node)
70
- (style == :have_no && not_to?(node)) ||
71
- (style == :not_to && have_no?(node))
70
+ node.arguments? &&
71
+ ((style == :have_no && not_to?(node.parent)) ||
72
+ (style == :not_to && have_no?(node.parent)))
72
73
  end
73
74
 
74
75
  def offense_range(node)
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Capybara
6
+ # Checks for redundant `within find(...)` calls.
7
+ #
8
+ # @example
9
+ # # bad
10
+ # within find('foo.bar') do
11
+ # # ...
12
+ # end
13
+ #
14
+ # # good
15
+ # within 'foo.bar' do
16
+ # # ...
17
+ # end
18
+ #
19
+ # # bad
20
+ # within find_by_id('foo') do
21
+ # # ...
22
+ # end
23
+ #
24
+ # # good
25
+ # within '#foo' do
26
+ # # ...
27
+ # end
28
+ #
29
+ class RedundantWithinFind < ::RuboCop::Cop::Base
30
+ extend AutoCorrector
31
+ MSG = 'Redundant `within %<method>s(...)` call detected.'
32
+ RESTRICT_ON_SEND = %i[within].freeze
33
+ FIND_METHODS = Set.new(%i[find find_by_id]).freeze
34
+
35
+ # @!method within_find(node)
36
+ def_node_matcher :within_find, <<~PATTERN
37
+ (send nil? :within
38
+ $(send nil? %FIND_METHODS ...))
39
+ PATTERN
40
+
41
+ def on_send(node)
42
+ within_find(node) do |find_node|
43
+ add_offense(find_node, message: msg(find_node)) do |corrector|
44
+ corrector.replace(find_node, replaced(find_node))
45
+ end
46
+ end
47
+ end
48
+
49
+ private
50
+
51
+ def msg(node)
52
+ format(MSG, method: node.method_name)
53
+ end
54
+
55
+ def replaced(node)
56
+ replaced = node.arguments.map(&:source).join(', ')
57
+ if node.method?(:find_by_id)
58
+ replaced.sub(/\A(["'])/, '\1#')
59
+ else
60
+ replaced
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -44,7 +44,7 @@ module RuboCop
44
44
  def on_send(node)
45
45
  argument = node.first_argument
46
46
  on_select_with_type(node, argument) if argument.sym_type?
47
- on_select_without_type(node) if argument.str_type?
47
+ on_select_without_type(node) if %i[str dstr].include?(argument.type)
48
48
  end
49
49
 
50
50
  private
@@ -28,7 +28,7 @@ module RuboCop
28
28
  }.freeze
29
29
 
30
30
  # @!method click_on_selector(node)
31
- def_node_matcher :click_on_selector, <<-PATTERN
31
+ def_node_matcher :click_on_selector, <<~PATTERN
32
32
  (send _ :find (str $_) ...)
33
33
  PATTERN
34
34
 
@@ -10,6 +10,7 @@ module RuboCop
10
10
  # find('#some-id')
11
11
  # find('[id=some-id]')
12
12
  # find(:css, '#some-id')
13
+ # find(:id, 'some-id')
13
14
  #
14
15
  # # good
15
16
  # find_by_id('some-id')
@@ -23,7 +24,7 @@ module RuboCop
23
24
 
24
25
  # @!method find_argument(node)
25
26
  def_node_matcher :find_argument, <<~PATTERN
26
- (send _ :find $(sym :css)? (str $_) ...)
27
+ (send _ :find $(sym {:css :id})? (str $_) ...)
27
28
  PATTERN
28
29
 
29
30
  # @!method class_options(node)
@@ -38,6 +39,7 @@ module RuboCop
38
39
 
39
40
  on_attr(node, sym, arg) if attribute?(arg)
40
41
  on_id(node, sym, arg) if CssSelector.id?(arg)
42
+ on_sym_id(node, sym, arg) if sym.first&.value == :id
41
43
  end
42
44
  end
43
45
 
@@ -59,6 +61,10 @@ module RuboCop
59
61
  CssSelector.classes(arg.sub("##{id}", '')))
60
62
  end
61
63
 
64
+ def on_sym_id(node, sym, id)
65
+ register_offense(node, sym, "'#{id}'")
66
+ end
67
+
62
68
  def attribute?(arg)
63
69
  CssSelector.attribute?(arg) &&
64
70
  CapybaraHelp.common_attributes?(arg)
@@ -76,7 +82,7 @@ module RuboCop
76
82
  end
77
83
 
78
84
  def deletion_range(node)
79
- range_between(node.arguments[0].source_range.end_pos,
85
+ range_between(node.first_argument.source_range.end_pos,
80
86
  node.arguments[1].source_range.end_pos)
81
87
  end
82
88
 
@@ -106,11 +112,11 @@ module RuboCop
106
112
  end
107
113
 
108
114
  def to_options(attrs)
109
- attrs.each.map do |key, value|
115
+ attrs.each.filter_map do |key, value|
110
116
  next if key == 'id'
111
117
 
112
118
  "#{key}: #{value}"
113
- end.compact.join(', ')
119
+ end.join(', ')
114
120
  end
115
121
 
116
122
  def offense_range(node)
@@ -23,7 +23,7 @@ module RuboCop
23
23
  # expect(page).to have_no_link('foo', class: 'cls', href: 'http://example.com')
24
24
  # expect(page).to have_table(class: 'cls')
25
25
  # expect(page).to have_select
26
- # expect(page).to have_field('foo')
26
+ # expect(page).to have_field(with: 'foo')
27
27
  #
28
28
  class SpecificMatcher < ::RuboCop::Cop::Base
29
29
  MSG = 'Prefer `%<good_matcher>s` over `%<bad_matcher>s`.'
@@ -38,10 +38,15 @@ module RuboCop
38
38
  }.freeze
39
39
 
40
40
  # @!method first_argument(node)
41
- def_node_matcher :first_argument, <<-PATTERN
41
+ def_node_matcher :first_argument, <<~PATTERN
42
42
  (send nil? _ (str $_) ... )
43
43
  PATTERN
44
44
 
45
+ # @!method text_with_regexp?(node)
46
+ def_node_search :text_with_regexp?, <<~PATTERN
47
+ (pair (sym {:text :exact_text}) (regexp ...))
48
+ PATTERN
49
+
45
50
  def on_send(node)
46
51
  first_argument(node) do |arg|
47
52
  next unless (matcher = specific_matcher(arg))
@@ -61,6 +66,7 @@ module RuboCop
61
66
 
62
67
  def replaceable?(node, arg, matcher)
63
68
  replaceable_attributes?(arg) &&
69
+ !text_with_regexp?(node) &&
64
70
  CapybaraHelp.replaceable_option?(node, arg, matcher) &&
65
71
  CapybaraHelp.replaceable_pseudo_classes?(arg)
66
72
  end
@@ -7,6 +7,7 @@ require_relative 'capybara/click_link_or_button_style'
7
7
  require_relative 'capybara/current_path_expectation'
8
8
  require_relative 'capybara/match_style'
9
9
  require_relative 'capybara/negation_matcher'
10
+ require_relative 'capybara/redundant_within_find'
10
11
  require_relative 'capybara/specific_actions'
11
12
  require_relative 'capybara/specific_finders'
12
13
  require_relative 'capybara/specific_matcher'
@@ -6,6 +6,7 @@ require 'yaml'
6
6
  require 'rubocop'
7
7
 
8
8
  require_relative 'rubocop/cop/capybara/mixin/capybara_help'
9
+ require_relative 'rubocop/cop/capybara/mixin/css_attributes_parser'
9
10
  require_relative 'rubocop/cop/capybara/mixin/css_selector'
10
11
 
11
12
  require_relative 'rubocop/cop/capybara_cops'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop-capybara
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.19.0
4
+ version: 2.21.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yudai Takada
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-09-19 00:00:00.000000000 Z
11
+ date: 2024-06-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubocop
@@ -24,10 +24,10 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.41'
27
- description: |2
28
- Code style checking for Capybara test files (RSpec, Cucumber, Minitest).
29
- A plugin for the RuboCop code style enforcing & linting tool.
30
- email:
27
+ description: |
28
+ Code style checking for Capybara test files (RSpec, Cucumber, Minitest).
29
+ A plugin for the RuboCop code style enforcing & linting tool.
30
+ email:
31
31
  executables: []
32
32
  extensions: []
33
33
  extra_rdoc_files:
@@ -41,14 +41,17 @@ files:
41
41
  - config/default.yml
42
42
  - lib/rubocop-capybara.rb
43
43
  - lib/rubocop/capybara/config_formatter.rb
44
+ - lib/rubocop/capybara/cop/generator.rb
44
45
  - lib/rubocop/capybara/description_extractor.rb
45
46
  - lib/rubocop/capybara/version.rb
46
47
  - lib/rubocop/cop/capybara/click_link_or_button_style.rb
47
48
  - lib/rubocop/cop/capybara/current_path_expectation.rb
48
49
  - lib/rubocop/cop/capybara/match_style.rb
49
50
  - lib/rubocop/cop/capybara/mixin/capybara_help.rb
51
+ - lib/rubocop/cop/capybara/mixin/css_attributes_parser.rb
50
52
  - lib/rubocop/cop/capybara/mixin/css_selector.rb
51
53
  - lib/rubocop/cop/capybara/negation_matcher.rb
54
+ - lib/rubocop/cop/capybara/redundant_within_find.rb
52
55
  - lib/rubocop/cop/capybara/rspec/have_selector.rb
53
56
  - lib/rubocop/cop/capybara/rspec/predicate_matcher.rb
54
57
  - lib/rubocop/cop/capybara/specific_actions.rb
@@ -63,7 +66,7 @@ metadata:
63
66
  changelog_uri: https://github.com/rubocop/rubocop-capybara/blob/main/CHANGELOG.md
64
67
  documentation_uri: https://docs.rubocop.org/rubocop-capybara/
65
68
  rubygems_mfa_required: 'true'
66
- post_install_message:
69
+ post_install_message:
67
70
  rdoc_options: []
68
71
  require_paths:
69
72
  - lib
@@ -78,8 +81,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
78
81
  - !ruby/object:Gem::Version
79
82
  version: '0'
80
83
  requirements: []
81
- rubygems_version: 3.3.7
82
- signing_key:
84
+ rubygems_version: 3.5.9
85
+ signing_key:
83
86
  specification_version: 4
84
87
  summary: Code style checking for Capybara test files
85
88
  test_files: []