rubocop-rspec 2.16.0 → 2.24.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +124 -9
- data/README.md +3 -3
- data/config/default.yml +145 -18
- data/config/obsoletion.yml +15 -0
- data/lib/rubocop/cop/rspec/be_empty.rb +44 -0
- data/lib/rubocop/cop/rspec/be_nil.rb +2 -2
- data/lib/rubocop/cop/rspec/capybara/current_path_expectation.rb +29 -115
- data/lib/rubocop/cop/rspec/capybara/match_style.rb +38 -0
- data/lib/rubocop/cop/rspec/capybara/negation_matcher.rb +23 -96
- data/lib/rubocop/cop/rspec/capybara/specific_actions.rb +19 -75
- data/lib/rubocop/cop/rspec/capybara/specific_finders.rb +14 -83
- data/lib/rubocop/cop/rspec/capybara/specific_matcher.rb +25 -69
- data/lib/rubocop/cop/rspec/capybara/visibility_matcher.rb +26 -63
- data/lib/rubocop/cop/rspec/change_by_zero.rb +33 -23
- data/lib/rubocop/cop/rspec/contain_exactly.rb +56 -0
- data/lib/rubocop/cop/rspec/context_method.rb +5 -1
- data/lib/rubocop/cop/rspec/context_wording.rb +13 -6
- data/lib/rubocop/cop/rspec/describe_method.rb +16 -8
- data/lib/rubocop/cop/rspec/described_class.rb +2 -1
- data/lib/rubocop/cop/rspec/described_class_module_wrapping.rb +7 -5
- data/lib/rubocop/cop/rspec/dialect.rb +1 -1
- data/lib/rubocop/cop/rspec/duplicated_metadata.rb +2 -2
- data/lib/rubocop/cop/rspec/empty_example_group.rb +10 -7
- data/lib/rubocop/cop/rspec/empty_hook.rb +2 -2
- data/lib/rubocop/cop/rspec/empty_line_after_example_group.rb +1 -1
- data/lib/rubocop/cop/rspec/empty_metadata.rb +46 -0
- data/lib/rubocop/cop/rspec/eq.rb +47 -0
- data/lib/rubocop/cop/rspec/example_wording.rb +1 -1
- data/lib/rubocop/cop/rspec/excessive_docstring_spacing.rb +14 -5
- data/lib/rubocop/cop/rspec/expect_actual.rb +4 -4
- data/lib/rubocop/cop/rspec/expect_in_hook.rb +1 -1
- data/lib/rubocop/cop/rspec/factory_bot/attribute_defined_statically.rb +25 -118
- data/lib/rubocop/cop/rspec/factory_bot/consistent_parentheses_style.rb +40 -107
- data/lib/rubocop/cop/rspec/factory_bot/create_list.rb +30 -250
- data/lib/rubocop/cop/rspec/factory_bot/factory_class_name.rb +19 -46
- data/lib/rubocop/cop/rspec/factory_bot/factory_name_style.rb +23 -64
- data/lib/rubocop/cop/rspec/factory_bot/syntax_methods.rb +45 -79
- data/lib/rubocop/cop/rspec/file_path.rb +8 -2
- data/lib/rubocop/cop/rspec/focus.rb +19 -5
- data/lib/rubocop/cop/rspec/hook_argument.rb +12 -9
- data/lib/rubocop/cop/rspec/hooks_before_examples.rb +5 -3
- data/lib/rubocop/cop/rspec/indexed_let.rb +112 -0
- data/lib/rubocop/cop/rspec/instance_variable.rb +1 -1
- data/lib/rubocop/cop/rspec/leaky_constant_declaration.rb +1 -1
- data/lib/rubocop/cop/rspec/let_before_examples.rb +8 -4
- data/lib/rubocop/cop/rspec/let_setup.rb +6 -8
- data/lib/rubocop/cop/rspec/match_array.rb +59 -0
- data/lib/rubocop/cop/rspec/metadata_style.rb +197 -0
- data/lib/rubocop/cop/rspec/mixin/empty_line_separation.rb +1 -2
- data/lib/rubocop/cop/rspec/mixin/file_help.rb +14 -0
- data/lib/rubocop/cop/rspec/mixin/location_help.rb +37 -0
- data/lib/rubocop/cop/rspec/mixin/metadata.rb +21 -7
- data/lib/rubocop/cop/rspec/mixin/skip_or_pending.rb +20 -4
- data/lib/rubocop/cop/rspec/multiple_expectations.rb +2 -1
- data/lib/rubocop/cop/rspec/named_subject.rb +7 -5
- data/lib/rubocop/cop/rspec/no_expectation_example.rb +2 -5
- data/lib/rubocop/cop/rspec/overwriting_setup.rb +3 -1
- data/lib/rubocop/cop/rspec/pending.rb +23 -13
- data/lib/rubocop/cop/rspec/pending_without_reason.rb +72 -36
- data/lib/rubocop/cop/rspec/predicate_matcher.rb +49 -40
- data/lib/rubocop/cop/rspec/rails/have_http_status.rb +11 -6
- data/lib/rubocop/cop/rspec/rails/http_status.rb +107 -34
- data/lib/rubocop/cop/rspec/rails/inferred_spec_type.rb +4 -4
- data/lib/rubocop/cop/rspec/rails/minitest_assertions.rb +60 -0
- data/lib/rubocop/cop/rspec/rails/negation_be_valid.rb +102 -0
- data/lib/rubocop/cop/rspec/rails/travel_around.rb +92 -0
- data/lib/rubocop/cop/rspec/receive_counts.rb +1 -1
- data/lib/rubocop/cop/rspec/receive_messages.rb +161 -0
- data/lib/rubocop/cop/rspec/redundant_around.rb +65 -0
- data/lib/rubocop/cop/rspec/repeated_example_group_body.rb +3 -6
- data/lib/rubocop/cop/rspec/repeated_example_group_description.rb +3 -6
- data/lib/rubocop/cop/rspec/repeated_include_example.rb +3 -4
- data/lib/rubocop/cop/rspec/scattered_setup.rb +23 -6
- data/lib/rubocop/cop/rspec/shared_context.rb +12 -13
- data/lib/rubocop/cop/rspec/shared_examples.rb +6 -4
- data/lib/rubocop/cop/rspec/skip_block_inside_example.rb +46 -0
- data/lib/rubocop/cop/rspec/sort_metadata.rb +4 -3
- data/lib/rubocop/cop/rspec/spec_file_path_format.rb +133 -0
- data/lib/rubocop/cop/rspec/spec_file_path_suffix.rb +40 -0
- data/lib/rubocop/cop/rspec/stubbed_mock.rb +1 -1
- data/lib/rubocop/cop/rspec/subject_stub.rb +0 -1
- data/lib/rubocop/cop/rspec/variable_definition.rb +5 -2
- data/lib/rubocop/cop/rspec/variable_name.rb +4 -1
- data/lib/rubocop/cop/rspec/verified_double_reference.rb +7 -7
- data/lib/rubocop/cop/rspec/verified_doubles.rb +1 -1
- data/lib/rubocop/cop/rspec/void_expect.rb +2 -1
- data/lib/rubocop/cop/rspec_cops.rb +16 -0
- data/lib/rubocop/rspec/config_formatter.rb +16 -0
- data/lib/rubocop/rspec/example_group.rb +6 -8
- data/lib/rubocop/rspec/language/node_pattern.rb +26 -0
- data/lib/rubocop/rspec/language.rb +25 -16
- data/lib/rubocop/rspec/version.rb +1 -1
- data/lib/rubocop-rspec.rb +4 -5
- metadata +50 -8
- data/lib/rubocop/cop/rspec/mixin/capybara_help.rb +0 -80
- data/lib/rubocop/cop/rspec/mixin/css_selector.rb +0 -146
- data/lib/rubocop/rspec/factory_bot/language.rb +0 -37
- data/lib/rubocop/rspec/factory_bot.rb +0 -64
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubocop-rspec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.24.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Backus
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2023-09-23 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rubocop
|
@@ -26,6 +26,34 @@ dependencies:
|
|
26
26
|
- - "~>"
|
27
27
|
- !ruby/object:Gem::Version
|
28
28
|
version: '1.33'
|
29
|
+
- !ruby/object:Gem::Dependency
|
30
|
+
name: rubocop-capybara
|
31
|
+
requirement: !ruby/object:Gem::Requirement
|
32
|
+
requirements:
|
33
|
+
- - "~>"
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: '2.17'
|
36
|
+
type: :runtime
|
37
|
+
prerelease: false
|
38
|
+
version_requirements: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - "~>"
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '2.17'
|
43
|
+
- !ruby/object:Gem::Dependency
|
44
|
+
name: rubocop-factory_bot
|
45
|
+
requirement: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '2.22'
|
50
|
+
type: :runtime
|
51
|
+
prerelease: false
|
52
|
+
version_requirements: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - "~>"
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '2.22'
|
29
57
|
description: |2
|
30
58
|
Code style checking for RSpec files.
|
31
59
|
A plugin for the RuboCop code style enforcing & linting tool.
|
@@ -52,12 +80,14 @@ files:
|
|
52
80
|
- lib/rubocop/cop/rspec/around_block.rb
|
53
81
|
- lib/rubocop/cop/rspec/base.rb
|
54
82
|
- lib/rubocop/cop/rspec/be.rb
|
83
|
+
- lib/rubocop/cop/rspec/be_empty.rb
|
55
84
|
- lib/rubocop/cop/rspec/be_eq.rb
|
56
85
|
- lib/rubocop/cop/rspec/be_eql.rb
|
57
86
|
- lib/rubocop/cop/rspec/be_nil.rb
|
58
87
|
- lib/rubocop/cop/rspec/before_after_all.rb
|
59
88
|
- lib/rubocop/cop/rspec/capybara/current_path_expectation.rb
|
60
89
|
- lib/rubocop/cop/rspec/capybara/feature_methods.rb
|
90
|
+
- lib/rubocop/cop/rspec/capybara/match_style.rb
|
61
91
|
- lib/rubocop/cop/rspec/capybara/negation_matcher.rb
|
62
92
|
- lib/rubocop/cop/rspec/capybara/specific_actions.rb
|
63
93
|
- lib/rubocop/cop/rspec/capybara/specific_finders.rb
|
@@ -65,6 +95,7 @@ files:
|
|
65
95
|
- lib/rubocop/cop/rspec/capybara/visibility_matcher.rb
|
66
96
|
- lib/rubocop/cop/rspec/change_by_zero.rb
|
67
97
|
- lib/rubocop/cop/rspec/class_check.rb
|
98
|
+
- lib/rubocop/cop/rspec/contain_exactly.rb
|
68
99
|
- lib/rubocop/cop/rspec/context_method.rb
|
69
100
|
- lib/rubocop/cop/rspec/context_wording.rb
|
70
101
|
- lib/rubocop/cop/rspec/describe_class.rb
|
@@ -81,6 +112,8 @@ files:
|
|
81
112
|
- lib/rubocop/cop/rspec/empty_line_after_final_let.rb
|
82
113
|
- lib/rubocop/cop/rspec/empty_line_after_hook.rb
|
83
114
|
- lib/rubocop/cop/rspec/empty_line_after_subject.rb
|
115
|
+
- lib/rubocop/cop/rspec/empty_metadata.rb
|
116
|
+
- lib/rubocop/cop/rspec/eq.rb
|
84
117
|
- lib/rubocop/cop/rspec/example_length.rb
|
85
118
|
- lib/rubocop/cop/rspec/example_without_description.rb
|
86
119
|
- lib/rubocop/cop/rspec/example_wording.rb
|
@@ -103,6 +136,7 @@ files:
|
|
103
136
|
- lib/rubocop/cop/rspec/implicit_block_expectation.rb
|
104
137
|
- lib/rubocop/cop/rspec/implicit_expect.rb
|
105
138
|
- lib/rubocop/cop/rspec/implicit_subject.rb
|
139
|
+
- lib/rubocop/cop/rspec/indexed_let.rb
|
106
140
|
- lib/rubocop/cop/rspec/instance_spy.rb
|
107
141
|
- lib/rubocop/cop/rspec/instance_variable.rb
|
108
142
|
- lib/rubocop/cop/rspec/it_behaves_like.rb
|
@@ -111,16 +145,18 @@ files:
|
|
111
145
|
- lib/rubocop/cop/rspec/leaky_constant_declaration.rb
|
112
146
|
- lib/rubocop/cop/rspec/let_before_examples.rb
|
113
147
|
- lib/rubocop/cop/rspec/let_setup.rb
|
148
|
+
- lib/rubocop/cop/rspec/match_array.rb
|
114
149
|
- lib/rubocop/cop/rspec/message_chain.rb
|
115
150
|
- lib/rubocop/cop/rspec/message_expectation.rb
|
116
151
|
- lib/rubocop/cop/rspec/message_spies.rb
|
152
|
+
- lib/rubocop/cop/rspec/metadata_style.rb
|
117
153
|
- lib/rubocop/cop/rspec/missing_example_group_argument.rb
|
118
|
-
- lib/rubocop/cop/rspec/mixin/capybara_help.rb
|
119
154
|
- lib/rubocop/cop/rspec/mixin/comments_help.rb
|
120
|
-
- lib/rubocop/cop/rspec/mixin/css_selector.rb
|
121
155
|
- lib/rubocop/cop/rspec/mixin/empty_line_separation.rb
|
156
|
+
- lib/rubocop/cop/rspec/mixin/file_help.rb
|
122
157
|
- lib/rubocop/cop/rspec/mixin/final_end_location.rb
|
123
158
|
- lib/rubocop/cop/rspec/mixin/inside_example_group.rb
|
159
|
+
- lib/rubocop/cop/rspec/mixin/location_help.rb
|
124
160
|
- lib/rubocop/cop/rspec/mixin/metadata.rb
|
125
161
|
- lib/rubocop/cop/rspec/mixin/namespace.rb
|
126
162
|
- lib/rubocop/cop/rspec/mixin/skip_or_pending.rb
|
@@ -142,8 +178,13 @@ files:
|
|
142
178
|
- lib/rubocop/cop/rspec/rails/have_http_status.rb
|
143
179
|
- lib/rubocop/cop/rspec/rails/http_status.rb
|
144
180
|
- lib/rubocop/cop/rspec/rails/inferred_spec_type.rb
|
181
|
+
- lib/rubocop/cop/rspec/rails/minitest_assertions.rb
|
182
|
+
- lib/rubocop/cop/rspec/rails/negation_be_valid.rb
|
183
|
+
- lib/rubocop/cop/rspec/rails/travel_around.rb
|
145
184
|
- lib/rubocop/cop/rspec/receive_counts.rb
|
185
|
+
- lib/rubocop/cop/rspec/receive_messages.rb
|
146
186
|
- lib/rubocop/cop/rspec/receive_never.rb
|
187
|
+
- lib/rubocop/cop/rspec/redundant_around.rb
|
147
188
|
- lib/rubocop/cop/rspec/repeated_description.rb
|
148
189
|
- lib/rubocop/cop/rspec/repeated_example.rb
|
149
190
|
- lib/rubocop/cop/rspec/repeated_example_group_body.rb
|
@@ -155,7 +196,10 @@ files:
|
|
155
196
|
- lib/rubocop/cop/rspec/shared_context.rb
|
156
197
|
- lib/rubocop/cop/rspec/shared_examples.rb
|
157
198
|
- lib/rubocop/cop/rspec/single_argument_message_chain.rb
|
199
|
+
- lib/rubocop/cop/rspec/skip_block_inside_example.rb
|
158
200
|
- lib/rubocop/cop/rspec/sort_metadata.rb
|
201
|
+
- lib/rubocop/cop/rspec/spec_file_path_format.rb
|
202
|
+
- lib/rubocop/cop/rspec/spec_file_path_suffix.rb
|
159
203
|
- lib/rubocop/cop/rspec/stubbed_mock.rb
|
160
204
|
- lib/rubocop/cop/rspec/subject_declaration.rb
|
161
205
|
- lib/rubocop/cop/rspec/subject_stub.rb
|
@@ -175,8 +219,6 @@ files:
|
|
175
219
|
- lib/rubocop/rspec/description_extractor.rb
|
176
220
|
- lib/rubocop/rspec/example.rb
|
177
221
|
- lib/rubocop/rspec/example_group.rb
|
178
|
-
- lib/rubocop/rspec/factory_bot.rb
|
179
|
-
- lib/rubocop/rspec/factory_bot/language.rb
|
180
222
|
- lib/rubocop/rspec/hook.rb
|
181
223
|
- lib/rubocop/rspec/inject.rb
|
182
224
|
- lib/rubocop/rspec/language.rb
|
@@ -200,14 +242,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
200
242
|
requirements:
|
201
243
|
- - ">="
|
202
244
|
- !ruby/object:Gem::Version
|
203
|
-
version: 2.
|
245
|
+
version: 2.7.0
|
204
246
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
205
247
|
requirements:
|
206
248
|
- - ">="
|
207
249
|
- !ruby/object:Gem::Version
|
208
250
|
version: '0'
|
209
251
|
requirements: []
|
210
|
-
rubygems_version: 3.
|
252
|
+
rubygems_version: 3.4.12
|
211
253
|
signing_key:
|
212
254
|
specification_version: 4
|
213
255
|
summary: Code style checking for RSpec files
|
@@ -1,80 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module RuboCop
|
4
|
-
module Cop
|
5
|
-
module RSpec
|
6
|
-
# Help methods for capybara.
|
7
|
-
module CapybaraHelp
|
8
|
-
module_function
|
9
|
-
|
10
|
-
# @param node [RuboCop::AST::SendNode]
|
11
|
-
# @param locator [String]
|
12
|
-
# @param element [String]
|
13
|
-
# @return [Boolean]
|
14
|
-
def specific_option?(node, locator, element)
|
15
|
-
attrs = CssSelector.attributes(locator).keys
|
16
|
-
return false unless replaceable_element?(node, element, attrs)
|
17
|
-
|
18
|
-
attrs.all? do |attr|
|
19
|
-
CssSelector.specific_options?(element, attr)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
# @param locator [String]
|
24
|
-
# @return [Boolean]
|
25
|
-
def specific_pseudo_classes?(locator)
|
26
|
-
CssSelector.pseudo_classes(locator).all? do |pseudo_class|
|
27
|
-
replaceable_pseudo_class?(pseudo_class, locator)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
# @param pseudo_class [String]
|
32
|
-
# @param locator [String]
|
33
|
-
# @return [Boolean]
|
34
|
-
def replaceable_pseudo_class?(pseudo_class, locator)
|
35
|
-
return false unless CssSelector.specific_pesudo_classes?(pseudo_class)
|
36
|
-
|
37
|
-
case pseudo_class
|
38
|
-
when 'not()' then replaceable_pseudo_class_not?(locator)
|
39
|
-
else true
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
# @param locator [String]
|
44
|
-
# @return [Boolean]
|
45
|
-
def replaceable_pseudo_class_not?(locator)
|
46
|
-
locator.scan(/not\(.*?\)/).all? do |negation|
|
47
|
-
CssSelector.attributes(negation).values.all? do |v|
|
48
|
-
v.is_a?(TrueClass) || v.is_a?(FalseClass)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
# @param node [RuboCop::AST::SendNode]
|
54
|
-
# @param element [String]
|
55
|
-
# @param attrs [Array<String>]
|
56
|
-
# @return [Boolean]
|
57
|
-
def replaceable_element?(node, element, attrs)
|
58
|
-
case element
|
59
|
-
when 'link' then replaceable_to_link?(node, attrs)
|
60
|
-
else true
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
# @param node [RuboCop::AST::SendNode]
|
65
|
-
# @param attrs [Array<String>]
|
66
|
-
# @return [Boolean]
|
67
|
-
def replaceable_to_link?(node, attrs)
|
68
|
-
include_option?(node, :href) || attrs.include?('href')
|
69
|
-
end
|
70
|
-
|
71
|
-
# @param node [RuboCop::AST::SendNode]
|
72
|
-
# @param option [Symbol]
|
73
|
-
# @return [Boolean]
|
74
|
-
def include_option?(node, option)
|
75
|
-
node.each_descendant(:sym).find { |opt| opt.value == option }
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
@@ -1,146 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module RuboCop
|
4
|
-
module Cop
|
5
|
-
module RSpec
|
6
|
-
# Helps parsing css selector.
|
7
|
-
module CssSelector
|
8
|
-
COMMON_OPTIONS = %w[
|
9
|
-
above below left_of right_of near count minimum maximum between text
|
10
|
-
id class style visible obscured exact exact_text normalize_ws match
|
11
|
-
wait filter_set focused
|
12
|
-
].freeze
|
13
|
-
SPECIFIC_OPTIONS = {
|
14
|
-
'button' => (
|
15
|
-
COMMON_OPTIONS + %w[disabled name value title type]
|
16
|
-
).freeze,
|
17
|
-
'link' => (
|
18
|
-
COMMON_OPTIONS + %w[href alt title download]
|
19
|
-
).freeze,
|
20
|
-
'table' => (
|
21
|
-
COMMON_OPTIONS + %w[
|
22
|
-
caption with_cols cols with_rows rows
|
23
|
-
]
|
24
|
-
).freeze,
|
25
|
-
'select' => (
|
26
|
-
COMMON_OPTIONS + %w[
|
27
|
-
disabled name placeholder options enabled_options
|
28
|
-
disabled_options selected with_selected multiple with_options
|
29
|
-
]
|
30
|
-
).freeze,
|
31
|
-
'field' => (
|
32
|
-
COMMON_OPTIONS + %w[
|
33
|
-
checked unchecked disabled valid name placeholder
|
34
|
-
validation_message readonly with type multiple
|
35
|
-
]
|
36
|
-
).freeze
|
37
|
-
}.freeze
|
38
|
-
SPECIFIC_PSEUDO_CLASSES = %w[
|
39
|
-
not() disabled enabled checked unchecked
|
40
|
-
].freeze
|
41
|
-
|
42
|
-
module_function
|
43
|
-
|
44
|
-
# @param element [String]
|
45
|
-
# @param attribute [String]
|
46
|
-
# @return [Boolean]
|
47
|
-
# @example
|
48
|
-
# specific_pesudo_classes?('button', 'name') # => true
|
49
|
-
# specific_pesudo_classes?('link', 'invalid') # => false
|
50
|
-
def specific_options?(element, attribute)
|
51
|
-
SPECIFIC_OPTIONS.fetch(element, []).include?(attribute)
|
52
|
-
end
|
53
|
-
|
54
|
-
# @param pseudo_class [String]
|
55
|
-
# @return [Boolean]
|
56
|
-
# @example
|
57
|
-
# specific_pesudo_classes?('disabled') # => true
|
58
|
-
# specific_pesudo_classes?('first-of-type') # => false
|
59
|
-
def specific_pesudo_classes?(pseudo_class)
|
60
|
-
SPECIFIC_PSEUDO_CLASSES.include?(pseudo_class)
|
61
|
-
end
|
62
|
-
|
63
|
-
# @param selector [String]
|
64
|
-
# @return [Boolean]
|
65
|
-
# @example
|
66
|
-
# id?('#some-id') # => true
|
67
|
-
# id?('.some-class') # => false
|
68
|
-
def id?(selector)
|
69
|
-
selector.start_with?('#')
|
70
|
-
end
|
71
|
-
|
72
|
-
# @param selector [String]
|
73
|
-
# @return [Boolean]
|
74
|
-
# @example
|
75
|
-
# attribute?('[attribute]') # => true
|
76
|
-
# attribute?('attribute') # => false
|
77
|
-
def attribute?(selector)
|
78
|
-
selector.start_with?('[')
|
79
|
-
end
|
80
|
-
|
81
|
-
# @param selector [String]
|
82
|
-
# @return [Array<String>]
|
83
|
-
# @example
|
84
|
-
# attributes('a[foo-bar_baz]') # => {"foo-bar_baz=>true}
|
85
|
-
# attributes('button[foo][bar]') # => {"foo"=>true, "bar"=>true}
|
86
|
-
# attributes('table[foo=bar]') # => {"foo"=>"'bar'"}
|
87
|
-
def attributes(selector)
|
88
|
-
selector.scan(/\[(.*?)\]/).flatten.to_h do |attr|
|
89
|
-
key, value = attr.split('=')
|
90
|
-
[key, normalize_value(value)]
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
# @param selector [String]
|
95
|
-
# @return [Boolean]
|
96
|
-
# @example
|
97
|
-
# common_attributes?('a[focused]') # => true
|
98
|
-
# common_attributes?('button[focused][visible]') # => true
|
99
|
-
# common_attributes?('table[id=some-id]') # => true
|
100
|
-
# common_attributes?('h1[invalid]') # => false
|
101
|
-
def common_attributes?(selector)
|
102
|
-
attributes(selector).keys.difference(COMMON_OPTIONS).none?
|
103
|
-
end
|
104
|
-
|
105
|
-
# @param selector [String]
|
106
|
-
# @return [Array<String>]
|
107
|
-
# @example
|
108
|
-
# pseudo_classes('button:not([disabled])') # => ['not()']
|
109
|
-
# pseudo_classes('a:enabled:not([valid])') # => ['enabled', 'not()']
|
110
|
-
def pseudo_classes(selector)
|
111
|
-
# Attributes must be excluded or else the colon in the `href`s URL
|
112
|
-
# will also be picked up as pseudo classes.
|
113
|
-
# "a:not([href='http://example.com']):enabled" => "a:not():enabled"
|
114
|
-
ignored_attribute = selector.gsub(/\[.*?\]/, '')
|
115
|
-
# "a:not():enabled" => ["not()", "enabled"]
|
116
|
-
ignored_attribute.scan(/:([^:]*)/).flatten
|
117
|
-
end
|
118
|
-
|
119
|
-
# @param selector [String]
|
120
|
-
# @return [Boolean]
|
121
|
-
# @example
|
122
|
-
# multiple_selectors?('a.cls b#id') # => true
|
123
|
-
# multiple_selectors?('a.cls') # => false
|
124
|
-
def multiple_selectors?(selector)
|
125
|
-
selector.match?(/[ >,+~]/)
|
126
|
-
end
|
127
|
-
|
128
|
-
# @param value [String]
|
129
|
-
# @return [Boolean, String]
|
130
|
-
# @example
|
131
|
-
# normalize_value('true') # => true
|
132
|
-
# normalize_value('false') # => false
|
133
|
-
# normalize_value(nil) # => false
|
134
|
-
# normalize_value("foo") # => "'foo'"
|
135
|
-
def normalize_value(value)
|
136
|
-
case value
|
137
|
-
when 'true' then true
|
138
|
-
when 'false' then false
|
139
|
-
when nil then true
|
140
|
-
else "'#{value}'"
|
141
|
-
end
|
142
|
-
end
|
143
|
-
end
|
144
|
-
end
|
145
|
-
end
|
146
|
-
end
|
@@ -1,37 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module RuboCop
|
4
|
-
module RSpec
|
5
|
-
module FactoryBot
|
6
|
-
# Contains node matchers for common FactoryBot DSL.
|
7
|
-
module Language
|
8
|
-
extend RuboCop::NodePattern::Macros
|
9
|
-
|
10
|
-
METHODS = %i[
|
11
|
-
attributes_for
|
12
|
-
attributes_for_list
|
13
|
-
attributes_for_pair
|
14
|
-
build
|
15
|
-
build_list
|
16
|
-
build_pair
|
17
|
-
build_stubbed
|
18
|
-
build_stubbed_list
|
19
|
-
build_stubbed_pair
|
20
|
-
create
|
21
|
-
create_list
|
22
|
-
create_pair
|
23
|
-
generate
|
24
|
-
generate_list
|
25
|
-
null
|
26
|
-
null_list
|
27
|
-
null_pair
|
28
|
-
].to_set.freeze
|
29
|
-
|
30
|
-
# @!method factory_bot?(node)
|
31
|
-
def_node_matcher :factory_bot?, <<~PATTERN
|
32
|
-
(const {nil? cbase} {:FactoryGirl :FactoryBot})
|
33
|
-
PATTERN
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
@@ -1,64 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module RuboCop
|
4
|
-
module RSpec
|
5
|
-
# RuboCop FactoryBot project namespace
|
6
|
-
module FactoryBot
|
7
|
-
ATTRIBUTE_DEFINING_METHODS = %i[
|
8
|
-
factory
|
9
|
-
ignore
|
10
|
-
trait
|
11
|
-
traits_for_enum
|
12
|
-
transient
|
13
|
-
].freeze
|
14
|
-
|
15
|
-
UNPROXIED_METHODS = %i[
|
16
|
-
__send__
|
17
|
-
__id__
|
18
|
-
nil?
|
19
|
-
send
|
20
|
-
object_id
|
21
|
-
extend
|
22
|
-
instance_eval
|
23
|
-
initialize
|
24
|
-
block_given?
|
25
|
-
raise
|
26
|
-
caller
|
27
|
-
method
|
28
|
-
].freeze
|
29
|
-
|
30
|
-
DEFINITION_PROXY_METHODS = %i[
|
31
|
-
add_attribute
|
32
|
-
after
|
33
|
-
association
|
34
|
-
before
|
35
|
-
callback
|
36
|
-
ignore
|
37
|
-
initialize_with
|
38
|
-
sequence
|
39
|
-
skip_create
|
40
|
-
to_create
|
41
|
-
].freeze
|
42
|
-
|
43
|
-
RESERVED_METHODS =
|
44
|
-
DEFINITION_PROXY_METHODS +
|
45
|
-
UNPROXIED_METHODS +
|
46
|
-
ATTRIBUTE_DEFINING_METHODS
|
47
|
-
|
48
|
-
private_constant(
|
49
|
-
:ATTRIBUTE_DEFINING_METHODS,
|
50
|
-
:UNPROXIED_METHODS,
|
51
|
-
:DEFINITION_PROXY_METHODS,
|
52
|
-
:RESERVED_METHODS
|
53
|
-
)
|
54
|
-
|
55
|
-
def self.attribute_defining_methods
|
56
|
-
ATTRIBUTE_DEFINING_METHODS
|
57
|
-
end
|
58
|
-
|
59
|
-
def self.reserved_methods
|
60
|
-
RESERVED_METHODS
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|