rubocop-rspec 1.7.0 → 3.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/CHANGELOG.md +955 -79
- data/CODE_OF_CONDUCT.md +17 -0
- data/MIT-LICENSE.md +1 -2
- data/README.md +35 -35
- data/config/default.yml +940 -52
- data/config/obsoletion.yml +30 -0
- data/lib/rubocop/cop/rspec/align_left_let_brace.rb +49 -0
- data/lib/rubocop/cop/rspec/align_right_let_brace.rb +49 -0
- data/lib/rubocop/cop/rspec/any_instance.rb +10 -13
- data/lib/rubocop/cop/rspec/around_block.rb +97 -0
- data/lib/rubocop/cop/rspec/base.rb +26 -0
- data/lib/rubocop/cop/rspec/be.rb +39 -0
- data/lib/rubocop/cop/rspec/be_empty.rb +45 -0
- data/lib/rubocop/cop/rspec/be_eq.rb +47 -0
- data/lib/rubocop/cop/rspec/be_eql.rb +18 -15
- data/lib/rubocop/cop/rspec/be_nil.rb +74 -0
- data/lib/rubocop/cop/rspec/before_after_all.rb +45 -0
- data/lib/rubocop/cop/rspec/change_by_zero.rb +184 -0
- data/lib/rubocop/cop/rspec/class_check.rb +101 -0
- data/lib/rubocop/cop/rspec/contain_exactly.rb +56 -0
- data/lib/rubocop/cop/rspec/context_method.rb +57 -0
- data/lib/rubocop/cop/rspec/context_wording.rb +117 -0
- data/lib/rubocop/cop/rspec/describe_class.rb +52 -21
- data/lib/rubocop/cop/rspec/describe_method.rb +26 -11
- data/lib/rubocop/cop/rspec/describe_symbol.rb +37 -0
- data/lib/rubocop/cop/rspec/described_class.rb +181 -34
- data/lib/rubocop/cop/rspec/described_class_module_wrapping.rb +38 -0
- data/lib/rubocop/cop/rspec/dialect.rb +84 -0
- data/lib/rubocop/cop/rspec/duplicated_metadata.rb +58 -0
- data/lib/rubocop/cop/rspec/empty_example_group.rb +134 -47
- data/lib/rubocop/cop/rspec/empty_hook.rb +49 -0
- data/lib/rubocop/cop/rspec/empty_line_after_example.rb +82 -0
- data/lib/rubocop/cop/rspec/empty_line_after_example_group.rb +42 -0
- data/lib/rubocop/cop/rspec/empty_line_after_final_let.rb +40 -0
- data/lib/rubocop/cop/rspec/empty_line_after_hook.rb +82 -0
- data/lib/rubocop/cop/rspec/empty_line_after_subject.rb +36 -0
- data/lib/rubocop/cop/rspec/empty_metadata.rb +46 -0
- data/lib/rubocop/cop/rspec/empty_output.rb +47 -0
- data/lib/rubocop/cop/rspec/eq.rb +47 -0
- data/lib/rubocop/cop/rspec/example_length.rb +38 -20
- data/lib/rubocop/cop/rspec/example_without_description.rb +98 -0
- data/lib/rubocop/cop/rspec/example_wording.rb +117 -27
- data/lib/rubocop/cop/rspec/excessive_docstring_spacing.rb +110 -0
- data/lib/rubocop/cop/rspec/expect_actual.rb +46 -20
- data/lib/rubocop/cop/rspec/expect_change.rb +86 -0
- data/lib/rubocop/cop/rspec/expect_in_hook.rb +50 -0
- data/lib/rubocop/cop/rspec/expect_in_let.rb +42 -0
- data/lib/rubocop/cop/rspec/expect_output.rb +50 -0
- data/lib/rubocop/cop/rspec/focus.rb +79 -25
- data/lib/rubocop/cop/rspec/hook_argument.rb +48 -36
- data/lib/rubocop/cop/rspec/hooks_before_examples.rb +81 -0
- data/lib/rubocop/cop/rspec/identical_equality_assertion.rb +37 -0
- data/lib/rubocop/cop/rspec/implicit_block_expectation.rb +68 -0
- data/lib/rubocop/cop/rspec/implicit_expect.rb +100 -0
- data/lib/rubocop/cop/rspec/implicit_subject.rb +167 -0
- data/lib/rubocop/cop/rspec/indexed_let.rb +112 -0
- data/lib/rubocop/cop/rspec/instance_spy.rb +74 -0
- data/lib/rubocop/cop/rspec/instance_variable.rb +28 -14
- data/lib/rubocop/cop/rspec/is_expected_specify.rb +45 -0
- data/lib/rubocop/cop/rspec/it_behaves_like.rb +49 -0
- data/lib/rubocop/cop/rspec/iterated_expectation.rb +74 -0
- data/lib/rubocop/cop/rspec/leading_subject.rb +57 -29
- data/lib/rubocop/cop/rspec/leaky_constant_declaration.rb +127 -0
- data/lib/rubocop/cop/rspec/let_before_examples.rb +101 -0
- data/lib/rubocop/cop/rspec/let_setup.rb +32 -16
- data/lib/rubocop/cop/rspec/match_array.rb +59 -0
- data/lib/rubocop/cop/rspec/message_chain.rb +10 -15
- data/lib/rubocop/cop/rspec/message_expectation.rb +12 -9
- data/lib/rubocop/cop/rspec/message_spies.rb +88 -0
- data/lib/rubocop/cop/rspec/metadata_style.rb +202 -0
- data/lib/rubocop/cop/rspec/missing_example_group_argument.rb +35 -0
- data/lib/rubocop/cop/rspec/missing_expectation_target_method.rb +54 -0
- data/lib/rubocop/cop/rspec/mixin/comments_help.rb +38 -0
- data/lib/rubocop/cop/rspec/mixin/empty_line_separation.rb +59 -0
- data/lib/rubocop/cop/rspec/mixin/file_help.rb +14 -0
- data/lib/rubocop/cop/rspec/mixin/final_end_location.rb +19 -0
- data/lib/rubocop/cop/rspec/mixin/inside_example_group.rb +29 -0
- data/lib/rubocop/cop/rspec/mixin/location_help.rb +37 -0
- data/lib/rubocop/cop/rspec/mixin/metadata.rb +63 -0
- data/lib/rubocop/cop/rspec/mixin/namespace.rb +23 -0
- data/lib/rubocop/cop/rspec/mixin/skip_or_pending.rb +39 -0
- data/lib/rubocop/cop/rspec/mixin/top_level_group.rb +54 -0
- data/lib/rubocop/cop/rspec/mixin/variable.rb +21 -0
- data/lib/rubocop/cop/rspec/multiple_describes.rb +14 -12
- data/lib/rubocop/cop/rspec/multiple_expectations.rb +86 -26
- data/lib/rubocop/cop/rspec/multiple_memoized_helpers.rb +146 -0
- data/lib/rubocop/cop/rspec/multiple_subjects.rb +97 -0
- data/lib/rubocop/cop/rspec/named_subject.rb +107 -27
- data/lib/rubocop/cop/rspec/nested_groups.rb +84 -47
- data/lib/rubocop/cop/rspec/no_expectation_example.rb +102 -0
- data/lib/rubocop/cop/rspec/not_to_not.rb +30 -27
- data/lib/rubocop/cop/rspec/overwriting_setup.rb +74 -0
- data/lib/rubocop/cop/rspec/pending.rb +80 -0
- data/lib/rubocop/cop/rspec/pending_without_reason.rb +159 -0
- data/lib/rubocop/cop/rspec/predicate_matcher.rb +341 -0
- data/lib/rubocop/cop/rspec/receive_counts.rb +89 -0
- data/lib/rubocop/cop/rspec/receive_messages.rb +161 -0
- data/lib/rubocop/cop/rspec/receive_never.rb +41 -0
- data/lib/rubocop/cop/rspec/redundant_around.rb +65 -0
- data/lib/rubocop/cop/rspec/redundant_predicate_matcher.rb +67 -0
- data/lib/rubocop/cop/rspec/remove_const.rb +39 -0
- data/lib/rubocop/cop/rspec/repeated_description.rb +98 -0
- data/lib/rubocop/cop/rspec/repeated_example.rb +53 -0
- data/lib/rubocop/cop/rspec/repeated_example_group_body.rb +100 -0
- data/lib/rubocop/cop/rspec/repeated_example_group_description.rb +96 -0
- data/lib/rubocop/cop/rspec/repeated_include_example.rb +105 -0
- data/lib/rubocop/cop/rspec/repeated_subject_call.rb +125 -0
- data/lib/rubocop/cop/rspec/return_from_stub.rb +169 -0
- data/lib/rubocop/cop/rspec/scattered_let.rb +59 -0
- data/lib/rubocop/cop/rspec/scattered_setup.rb +92 -0
- data/lib/rubocop/cop/rspec/shared_context.rb +107 -0
- data/lib/rubocop/cop/rspec/shared_examples.rb +125 -0
- data/lib/rubocop/cop/rspec/single_argument_message_chain.rb +93 -0
- data/lib/rubocop/cop/rspec/skip_block_inside_example.rb +46 -0
- data/lib/rubocop/cop/rspec/sort_metadata.rb +71 -0
- 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 +176 -0
- data/lib/rubocop/cop/rspec/subject_declaration.rb +46 -0
- data/lib/rubocop/cop/rspec/subject_stub.rb +93 -74
- data/lib/rubocop/cop/rspec/undescriptive_literals_description.rb +69 -0
- data/lib/rubocop/cop/rspec/unspecified_exception.rb +67 -0
- data/lib/rubocop/cop/rspec/variable_definition.rb +77 -0
- data/lib/rubocop/cop/rspec/variable_name.rb +68 -0
- data/lib/rubocop/cop/rspec/verified_double_reference.rb +111 -0
- data/lib/rubocop/cop/rspec/verified_doubles.rb +28 -14
- data/lib/rubocop/cop/rspec/void_expect.rb +60 -0
- data/lib/rubocop/cop/rspec/yield.rb +82 -0
- data/lib/rubocop/cop/rspec_cops.rb +112 -0
- data/lib/rubocop/rspec/align_let_brace.rb +63 -0
- data/lib/rubocop/rspec/concept.rb +33 -0
- data/lib/rubocop/rspec/config_formatter.rb +27 -4
- data/lib/rubocop/rspec/cop/generator.rb +25 -0
- data/lib/rubocop/rspec/corrector/move_node.rb +51 -0
- data/lib/rubocop/rspec/description_extractor.rb +60 -18
- data/lib/rubocop/rspec/example.rb +37 -0
- data/lib/rubocop/rspec/example_group.rb +67 -0
- data/lib/rubocop/rspec/hook.rb +79 -0
- data/lib/rubocop/rspec/inject.rb +3 -1
- data/lib/rubocop/rspec/language.rb +184 -41
- data/lib/rubocop/rspec/node.rb +19 -0
- data/lib/rubocop/rspec/shared_contexts/default_rspec_language_config_context.rb +29 -0
- data/lib/rubocop/rspec/version.rb +1 -1
- data/lib/rubocop/rspec/wording.rb +61 -19
- data/lib/rubocop/rspec.rb +6 -2
- data/lib/rubocop-rspec.rb +45 -34
- metadata +130 -195
- data/Gemfile +0 -13
- data/Rakefile +0 -48
- data/lib/rubocop/cop/rspec/file_path.rb +0 -83
- data/lib/rubocop/rspec/language/node_pattern.rb +0 -16
- data/lib/rubocop/rspec/spec_only.rb +0 -61
- data/lib/rubocop/rspec/top_level_describe.rb +0 -61
- data/lib/rubocop/rspec/util.rb +0 -19
- data/rubocop-rspec.gemspec +0 -42
- data/spec/expect_violation/expectation_spec.rb +0 -85
- data/spec/project/changelog_spec.rb +0 -81
- data/spec/project/default_config_spec.rb +0 -52
- data/spec/project/project_requires_spec.rb +0 -8
- data/spec/rubocop/cop/rspec/any_instance_spec.rb +0 -30
- data/spec/rubocop/cop/rspec/be_eql_spec.rb +0 -59
- data/spec/rubocop/cop/rspec/describe_class_spec.rb +0 -113
- data/spec/rubocop/cop/rspec/describe_method_spec.rb +0 -32
- data/spec/rubocop/cop/rspec/described_class_spec.rb +0 -219
- data/spec/rubocop/cop/rspec/empty_example_group_spec.rb +0 -79
- data/spec/rubocop/cop/rspec/example_length_spec.rb +0 -117
- data/spec/rubocop/cop/rspec/example_wording_spec.rb +0 -82
- data/spec/rubocop/cop/rspec/expect_actual_spec.rb +0 -136
- data/spec/rubocop/cop/rspec/file_path_spec.rb +0 -236
- data/spec/rubocop/cop/rspec/focus_spec.rb +0 -130
- data/spec/rubocop/cop/rspec/hook_argument_spec.rb +0 -189
- data/spec/rubocop/cop/rspec/instance_variable_spec.rb +0 -75
- data/spec/rubocop/cop/rspec/leading_subject_spec.rb +0 -54
- data/spec/rubocop/cop/rspec/let_setup_spec.rb +0 -66
- data/spec/rubocop/cop/rspec/message_chain_spec.rb +0 -21
- data/spec/rubocop/cop/rspec/message_expectation_spec.rb +0 -63
- data/spec/rubocop/cop/rspec/multiple_describes_spec.rb +0 -28
- data/spec/rubocop/cop/rspec/multiple_expectations_spec.rb +0 -84
- data/spec/rubocop/cop/rspec/named_subject_spec.rb +0 -62
- data/spec/rubocop/cop/rspec/nested_groups_spec.rb +0 -55
- data/spec/rubocop/cop/rspec/not_to_not_spec.rb +0 -57
- data/spec/rubocop/cop/rspec/subject_stub_spec.rb +0 -183
- data/spec/rubocop/cop/rspec/verified_doubles_spec.rb +0 -71
- data/spec/rubocop/rspec/config_formatter_spec.rb +0 -48
- data/spec/rubocop/rspec/description_extractor_spec.rb +0 -35
- data/spec/rubocop/rspec/language/selector_set_spec.rb +0 -29
- data/spec/rubocop/rspec/spec_only_spec.rb +0 -97
- data/spec/rubocop/rspec/util/one_spec.rb +0 -21
- data/spec/rubocop/rspec/wording_spec.rb +0 -44
- data/spec/shared/rspec_only_cop_behavior.rb +0 -68
- data/spec/spec_helper.rb +0 -41
- data/spec/support/expect_violation.rb +0 -166
@@ -1,48 +0,0 @@
|
|
1
|
-
require 'rubocop/rspec/config_formatter'
|
2
|
-
|
3
|
-
RSpec.describe RuboCop::RSpec::ConfigFormatter do
|
4
|
-
let(:config) do
|
5
|
-
{
|
6
|
-
'AllCops' => {
|
7
|
-
'Setting' => 'fourty two'
|
8
|
-
},
|
9
|
-
'RSpec/Foo' => {
|
10
|
-
'Config' => 2,
|
11
|
-
'Enabled' => true
|
12
|
-
},
|
13
|
-
'RSpec/Bar' => {
|
14
|
-
'Enabled' => true
|
15
|
-
}
|
16
|
-
}
|
17
|
-
end
|
18
|
-
|
19
|
-
let(:descriptions) do
|
20
|
-
{
|
21
|
-
'RSpec/Foo' => {
|
22
|
-
'Description' => 'Blah'
|
23
|
-
},
|
24
|
-
'RSpec/Bar' => {
|
25
|
-
'Description' => 'Wow'
|
26
|
-
}
|
27
|
-
}
|
28
|
-
end
|
29
|
-
|
30
|
-
it 'builds a YAML dump with spacing between cops' do
|
31
|
-
formatter = described_class.new(config, descriptions)
|
32
|
-
|
33
|
-
expect(formatter.dump).to eql(<<-YAML.gsub(/^\s+\|/, ''))
|
34
|
-
|---
|
35
|
-
|AllCops:
|
36
|
-
| Setting: fourty two
|
37
|
-
|
|
38
|
-
|RSpec/Foo:
|
39
|
-
| Config: 2
|
40
|
-
| Enabled: true
|
41
|
-
| Description: Blah
|
42
|
-
|
|
43
|
-
|RSpec/Bar:
|
44
|
-
| Enabled: true
|
45
|
-
| Description: Wow
|
46
|
-
YAML
|
47
|
-
end
|
48
|
-
end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
require 'yard'
|
2
|
-
|
3
|
-
require 'rubocop/rspec/description_extractor'
|
4
|
-
|
5
|
-
RSpec.describe RuboCop::RSpec::DescriptionExtractor do
|
6
|
-
let(:yardocs) do
|
7
|
-
[
|
8
|
-
instance_double(
|
9
|
-
YARD::CodeObjects::MethodObject,
|
10
|
-
docstring: "Checks foo\n\nLong description",
|
11
|
-
to_s: 'RuboCop::Cop::RSpec::Foo',
|
12
|
-
type: :class,
|
13
|
-
name: 'Foo'
|
14
|
-
),
|
15
|
-
instance_double(
|
16
|
-
YARD::CodeObjects::MethodObject,
|
17
|
-
docstring: 'Hi',
|
18
|
-
to_s: 'RuboCop::Cop::RSpec::Foo#bar',
|
19
|
-
type: :method,
|
20
|
-
name: 'Foo#bar'
|
21
|
-
),
|
22
|
-
instance_double(
|
23
|
-
YARD::CodeObjects::MethodObject,
|
24
|
-
docstring: 'This is not a cop',
|
25
|
-
to_s: 'RuboCop::Cop::Mixin::Sneaky',
|
26
|
-
type: :class
|
27
|
-
)
|
28
|
-
]
|
29
|
-
end
|
30
|
-
|
31
|
-
it 'builds a hash of descriptions' do
|
32
|
-
expect(described_class.new(yardocs).to_h)
|
33
|
-
.to eql('RSpec/Foo' => { 'Description' => 'Checks foo' })
|
34
|
-
end
|
35
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
describe RuboCop::RSpec::Language::SelectorSet do
|
2
|
-
subject(:selector_set) { described_class.new(%i(foo bar)) }
|
3
|
-
|
4
|
-
it 'composes sets' do
|
5
|
-
combined = selector_set + described_class.new(%i(baz))
|
6
|
-
|
7
|
-
expect(combined).to eq(described_class.new(%i(foo bar baz)))
|
8
|
-
end
|
9
|
-
|
10
|
-
it 'compares by value' do
|
11
|
-
expect(selector_set).not_to eq(described_class.new(%i(foo bar baz)))
|
12
|
-
end
|
13
|
-
|
14
|
-
context '#include?' do
|
15
|
-
it 'returns false for selectors not in the set' do
|
16
|
-
expect(selector_set.include?(:baz)).to be(false)
|
17
|
-
end
|
18
|
-
|
19
|
-
it 'returns true for selectors in the set' do
|
20
|
-
expect(selector_set.include?(:foo)).to be(true)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
context '#to_node_pattern' do
|
25
|
-
it 'builds a node pattern' do
|
26
|
-
expect(selector_set.to_node_pattern).to eql(':foo :bar')
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
@@ -1,97 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
RSpec.describe RuboCop::RSpec::SpecOnly do
|
4
|
-
subject(:cop) { fake_cop.new(config) }
|
5
|
-
|
6
|
-
let(:config) do
|
7
|
-
rubocop_config =
|
8
|
-
{
|
9
|
-
'AllCops' => {
|
10
|
-
'RSpec' => {
|
11
|
-
'Patterns' => rspec_patterns
|
12
|
-
}
|
13
|
-
},
|
14
|
-
'RSpec/FakeCop' => {
|
15
|
-
'Exclude' => %w(bar_spec.rb)
|
16
|
-
}
|
17
|
-
}
|
18
|
-
|
19
|
-
RuboCop::Config.new(rubocop_config, 'fake_cop_config.yml')
|
20
|
-
end
|
21
|
-
|
22
|
-
let(:fake_cop) do
|
23
|
-
Class.new(RuboCop::Cop::Cop) do
|
24
|
-
include RuboCop::RSpec::SpecOnly
|
25
|
-
|
26
|
-
def self.name
|
27
|
-
'RuboCop::RSpec::FakeCop'
|
28
|
-
end
|
29
|
-
|
30
|
-
def on_send(node)
|
31
|
-
add_offense(node, :expression, 'I flag everything')
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
let(:rspec_patterns) { ['_spec.rb$', '(?:^|/)spec/'] }
|
37
|
-
|
38
|
-
context 'when the source path ends with `_spec.rb`' do
|
39
|
-
it 'registers an offense' do
|
40
|
-
expect_violation(<<-RUBY, filename: 'foo_spec.rb')
|
41
|
-
foo(1)
|
42
|
-
^^^^^^ I flag everything
|
43
|
-
RUBY
|
44
|
-
end
|
45
|
-
|
46
|
-
it 'ignores the file if it is ignored' do
|
47
|
-
expect_no_violations(<<-RUBY, filename: 'bar_spec.rb')
|
48
|
-
foo(1)
|
49
|
-
RUBY
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
context 'when the source path contains `/spec/`' do
|
54
|
-
it 'registers an offense' do
|
55
|
-
expect_violation(<<-RUBY, filename: '/spec/support/thing.rb')
|
56
|
-
foo(1)
|
57
|
-
^^^^^^ I flag everything
|
58
|
-
RUBY
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
context 'when the source path starts with `spec/`' do
|
63
|
-
it 'registers an offense' do
|
64
|
-
expect_violation(<<-RUBY, filename: 'spec/support/thing.rb')
|
65
|
-
foo(1)
|
66
|
-
^^^^^^ I flag everything
|
67
|
-
RUBY
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
context 'when the file is a source file without "spec" in the name' do
|
72
|
-
it 'ignores the source when the path is not a spec file' do
|
73
|
-
expect_no_violations(<<-RUBY, filename: 'foo.rb')
|
74
|
-
foo(1)
|
75
|
-
RUBY
|
76
|
-
end
|
77
|
-
|
78
|
-
it 'ignores the source when the path is not a specified pattern' do
|
79
|
-
expect_no_violations(<<-RUBY, filename: 'foo_test.rb')
|
80
|
-
foo(1)
|
81
|
-
RUBY
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
context 'when custom patterns are specified' do
|
86
|
-
let(:rspec_patterns) do
|
87
|
-
['_test\.rb$']
|
88
|
-
end
|
89
|
-
|
90
|
-
it 'registers offenses when the path matches a custom specified pattern' do
|
91
|
-
expect_violation(<<-RUBY, filename: 'foo_test.rb')
|
92
|
-
foo(1)
|
93
|
-
^^^^^^ I flag everything
|
94
|
-
RUBY
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
describe RuboCop::RSpec::Util, '.one' do
|
2
|
-
let(:first) { instance_double(Object) }
|
3
|
-
let(:array) { instance_double(Array, one?: true, first: first) }
|
4
|
-
let(:client) { Class.new.extend(described_class) }
|
5
|
-
|
6
|
-
it 'returns first element' do
|
7
|
-
expect(client.one(array)).to be(first)
|
8
|
-
end
|
9
|
-
|
10
|
-
it 'fails if the list is empty' do
|
11
|
-
expect { client.one([]) }
|
12
|
-
.to raise_error(described_class::SizeError)
|
13
|
-
.with_message('expected size to be exactly 1 but size was 0')
|
14
|
-
end
|
15
|
-
|
16
|
-
it 'fails if the list has more than one element' do
|
17
|
-
expect { client.one([1, 2]) }
|
18
|
-
.to raise_error(described_class::SizeError)
|
19
|
-
.with_message('expected size to be exactly 1 but size was 2')
|
20
|
-
end
|
21
|
-
end
|
@@ -1,44 +0,0 @@
|
|
1
|
-
describe RuboCop::RSpec::Wording do
|
2
|
-
let(:replacements) do
|
3
|
-
{ 'have' => 'has', 'not' => 'does not' }
|
4
|
-
end
|
5
|
-
|
6
|
-
let(:ignores) do
|
7
|
-
%w(only really)
|
8
|
-
end
|
9
|
-
|
10
|
-
expected_rewrites =
|
11
|
-
{
|
12
|
-
'should return something' => 'returns something',
|
13
|
-
'should not return something' => 'does not return something',
|
14
|
-
'should do nothing' => 'does nothing',
|
15
|
-
'should have sweets' => 'has sweets',
|
16
|
-
'should worry about the future' => 'worries about the future',
|
17
|
-
'should pay for pizza' => 'pays for pizza',
|
18
|
-
'should obey my orders' => 'obeys my orders',
|
19
|
-
'should deploy the app' => 'deploys the app',
|
20
|
-
'should buy the product' => 'buys the product',
|
21
|
-
'should miss me' => 'misses me',
|
22
|
-
'should fax the document' => 'faxes the document',
|
23
|
-
'should amass debt' => 'amasses debt',
|
24
|
-
'should echo the input' => 'echoes the input',
|
25
|
-
'should alias the method' => 'aliases the method',
|
26
|
-
'should search the internet' => 'searches the internet',
|
27
|
-
'should wish me luck' => 'wishes me luck',
|
28
|
-
'should really only return one item' => 'really only returns one item',
|
29
|
-
"shouldn't return something" => 'does not return something'
|
30
|
-
}
|
31
|
-
|
32
|
-
expected_rewrites.each do |old, new|
|
33
|
-
it %(rewrites "#{old}" as "#{new}") do
|
34
|
-
rewrite =
|
35
|
-
described_class.new(
|
36
|
-
old,
|
37
|
-
replace: replacements,
|
38
|
-
ignore: ignores
|
39
|
-
).rewrite
|
40
|
-
|
41
|
-
expect(rewrite).to eql(new)
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
@@ -1,68 +0,0 @@
|
|
1
|
-
module SpecHelper
|
2
|
-
# Provides a helper method for checking that `cop` works
|
3
|
-
#
|
4
|
-
# @note this is defined in a module so that the failure message can be
|
5
|
-
# a constant without creating a bunch of warnings when the shared
|
6
|
-
# context is included
|
7
|
-
#
|
8
|
-
module CheckCop
|
9
|
-
CURRENT_FILE = Pathname.new(__FILE__).relative_path_from(ROOT).freeze
|
10
|
-
|
11
|
-
FAILURE = <<-MSG.freeze
|
12
|
-
Attempting to access `cop` produced the following error:
|
13
|
-
|
14
|
-
%<exception>s
|
15
|
-
|
16
|
-
The shared context under #{CURRENT_FILE} is included for all RSpec
|
17
|
-
cops. This context expects you to define a subject named `cop` like so:
|
18
|
-
|
19
|
-
describe RuboCop::Cop::RSpec::SomeCheck do
|
20
|
-
subject(:cop) { described_class.new }
|
21
|
-
|
22
|
-
...
|
23
|
-
end
|
24
|
-
|
25
|
-
or if your cop is configurable you should have something like:
|
26
|
-
|
27
|
-
describe RuboCop::Cop::RSpec::SomeConfigurableCheck, :config do
|
28
|
-
subject(:cop) { described_class.new(config) }
|
29
|
-
|
30
|
-
let(:cop_config) do
|
31
|
-
{ 'EnforcedStyle' => 'fancy', 'WhateverElse' => 'YouNeed' }
|
32
|
-
end
|
33
|
-
|
34
|
-
...
|
35
|
-
end
|
36
|
-
|
37
|
-
This error likely means that you either don't define `cop` at the top
|
38
|
-
level or you have dependent definitions (like `cop_config`) that are not
|
39
|
-
defined at the top level.
|
40
|
-
MSG
|
41
|
-
|
42
|
-
# This method exists to reduce confusion for contributors. It is important
|
43
|
-
# that these shared examples are automatically included for all cops but
|
44
|
-
# it is easy for these to fail if you don't realize that your top level
|
45
|
-
# describe needs to define a useable `cop` subject.
|
46
|
-
def check_cop_definition
|
47
|
-
cop
|
48
|
-
rescue => exception
|
49
|
-
raise format(FAILURE, exception: exception)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
RSpec.shared_examples 'an rspec only cop', rspec_cop: true do
|
55
|
-
include SpecHelper::CheckCop
|
56
|
-
|
57
|
-
before do
|
58
|
-
check_cop_definition
|
59
|
-
end
|
60
|
-
|
61
|
-
it 'does not deem lib/feature/thing.rb to be a relevant file' do
|
62
|
-
expect(cop.relevant_file?('lib/feature/thing.rb')).to be_falsey
|
63
|
-
end
|
64
|
-
|
65
|
-
it 'deems spec/feature/thing_spec.rb to be a relevant file' do
|
66
|
-
expect(cop.relevant_file?('spec/feature/thing_spec.rb')).to be(true)
|
67
|
-
end
|
68
|
-
end
|
data/spec/spec_helper.rb
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
require 'rubocop'
|
2
|
-
|
3
|
-
require 'rubocop/rspec/support'
|
4
|
-
|
5
|
-
if ENV['CI']
|
6
|
-
require 'codeclimate-test-reporter'
|
7
|
-
CodeClimate::TestReporter.start
|
8
|
-
end
|
9
|
-
|
10
|
-
module SpecHelper
|
11
|
-
ROOT = Pathname.new(__dir__).parent.freeze
|
12
|
-
end
|
13
|
-
|
14
|
-
spec_helper_glob = File.expand_path('{support,shared}/*.rb', __dir__)
|
15
|
-
Dir.glob(spec_helper_glob).map(&method(:require))
|
16
|
-
|
17
|
-
RSpec.configure do |config|
|
18
|
-
config.order = :random
|
19
|
-
|
20
|
-
# Define spec metadata for all rspec cop spec files
|
21
|
-
cop_specs = 'spec/rubocop/cop/rspec/'
|
22
|
-
config.define_derived_metadata(file_path: /\b#{cop_specs}/) do |metadata|
|
23
|
-
# Attach metadata that signals the specified code is for an RSpec only cop
|
24
|
-
metadata[:rspec_cop] = true
|
25
|
-
end
|
26
|
-
|
27
|
-
config.expect_with :rspec do |expectations|
|
28
|
-
expectations.syntax = :expect # Disable `should`
|
29
|
-
end
|
30
|
-
|
31
|
-
config.mock_with :rspec do |mocks|
|
32
|
-
mocks.syntax = :expect # Disable `should_receive` and `stub`
|
33
|
-
end
|
34
|
-
|
35
|
-
config.include(ExpectViolation)
|
36
|
-
end
|
37
|
-
|
38
|
-
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
39
|
-
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
40
|
-
|
41
|
-
require 'rubocop-rspec'
|
@@ -1,166 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'adamantium'
|
4
|
-
require 'concord'
|
5
|
-
require 'anima'
|
6
|
-
|
7
|
-
module ExpectViolation
|
8
|
-
DEFAULT_FILENAME = 'example_spec.rb'.freeze
|
9
|
-
|
10
|
-
# rubocop:disable Metrics/AbcSize
|
11
|
-
def expect_violation(source, filename: DEFAULT_FILENAME)
|
12
|
-
expectation = Expectation.new(source)
|
13
|
-
inspect_source(cop, expectation.source, filename)
|
14
|
-
offenses = cop.offenses.map(&method(:to_assertion)).sort
|
15
|
-
|
16
|
-
if expectation.assertions.empty?
|
17
|
-
raise 'Use expect_no_violations to assert no violations'
|
18
|
-
end
|
19
|
-
|
20
|
-
expect(offenses).to eq(expectation.assertions.sort)
|
21
|
-
end
|
22
|
-
|
23
|
-
def expect_no_violations(source, filename: DEFAULT_FILENAME)
|
24
|
-
inspect_source(cop, source, filename)
|
25
|
-
|
26
|
-
expect(cop.offenses.empty?).to be(true)
|
27
|
-
end
|
28
|
-
|
29
|
-
private
|
30
|
-
|
31
|
-
def to_assertion(offense)
|
32
|
-
Expectation::Assertion.new(
|
33
|
-
message: offense.message,
|
34
|
-
line_number: offense.location.line,
|
35
|
-
column_range: offense.location.column_range
|
36
|
-
)
|
37
|
-
end
|
38
|
-
|
39
|
-
class Expectation
|
40
|
-
VIOLATION_LINE_PATTERN = /\A *\^/
|
41
|
-
|
42
|
-
VIOLATION = :violation
|
43
|
-
SOURCE = :line
|
44
|
-
|
45
|
-
include Adamantium, Concord.new(:string)
|
46
|
-
|
47
|
-
def source
|
48
|
-
source_map.to_s
|
49
|
-
end
|
50
|
-
|
51
|
-
def assertions
|
52
|
-
source_map.assertions
|
53
|
-
end
|
54
|
-
|
55
|
-
private
|
56
|
-
|
57
|
-
def source_map
|
58
|
-
tokens.reduce(Source::BLANK) do |source, (type, tokens)|
|
59
|
-
tokens.reduce(source, :"add_#{type}")
|
60
|
-
end
|
61
|
-
end
|
62
|
-
memoize :source_map
|
63
|
-
|
64
|
-
def tokens
|
65
|
-
string.each_line.chunk do |line|
|
66
|
-
next SOURCE unless line =~ VIOLATION_LINE_PATTERN
|
67
|
-
|
68
|
-
VIOLATION
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
class Source
|
73
|
-
include Concord.new(:lines)
|
74
|
-
|
75
|
-
BLANK = new([].freeze)
|
76
|
-
|
77
|
-
def add_line(line)
|
78
|
-
self.class.new(lines + [Line.new(text: line, number: lines.size + 1)])
|
79
|
-
end
|
80
|
-
|
81
|
-
def add_violation(violation)
|
82
|
-
self.class.new([*lines[0...-1], lines.last.add_violation(violation)])
|
83
|
-
end
|
84
|
-
|
85
|
-
def to_s
|
86
|
-
lines.map(&:text).join
|
87
|
-
end
|
88
|
-
|
89
|
-
def assertions
|
90
|
-
lines.flat_map(&:assertions)
|
91
|
-
end
|
92
|
-
|
93
|
-
class Line
|
94
|
-
DEFAULTS = { violations: [] }.freeze
|
95
|
-
|
96
|
-
include Anima.new(:text, :number, :violations)
|
97
|
-
|
98
|
-
def initialize(options)
|
99
|
-
super(DEFAULTS.merge(options))
|
100
|
-
end
|
101
|
-
|
102
|
-
def add_violation(violation)
|
103
|
-
with(violations: violations + [violation])
|
104
|
-
end
|
105
|
-
|
106
|
-
def assertions
|
107
|
-
violations.map do |violation|
|
108
|
-
Assertion.parse(
|
109
|
-
text: violation,
|
110
|
-
line_number: number
|
111
|
-
)
|
112
|
-
end
|
113
|
-
end
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
class Assertion
|
118
|
-
def self.parse(text:, line_number:)
|
119
|
-
parser = Parser.new(text)
|
120
|
-
|
121
|
-
new(
|
122
|
-
message: parser.message,
|
123
|
-
column_range: parser.column_range,
|
124
|
-
line_number: line_number
|
125
|
-
)
|
126
|
-
end
|
127
|
-
|
128
|
-
include Anima.new(:message, :column_range, :line_number),
|
129
|
-
Adamantium,
|
130
|
-
Comparable
|
131
|
-
|
132
|
-
def <=>(other)
|
133
|
-
to_a <=> other.to_a
|
134
|
-
end
|
135
|
-
|
136
|
-
protected
|
137
|
-
|
138
|
-
def to_a
|
139
|
-
[line_number, column_range.first, column_range.last, message]
|
140
|
-
end
|
141
|
-
|
142
|
-
class Parser
|
143
|
-
COLUMN_PATTERN = /^ *(?<carets>\^\^*) (?<message>.+)$/
|
144
|
-
|
145
|
-
include Concord.new(:text), Adamantium
|
146
|
-
|
147
|
-
def column_range
|
148
|
-
Range.new(*match.offset(:carets), true)
|
149
|
-
end
|
150
|
-
|
151
|
-
def message
|
152
|
-
match[:message]
|
153
|
-
end
|
154
|
-
|
155
|
-
private
|
156
|
-
|
157
|
-
def match
|
158
|
-
text.match(COLUMN_PATTERN)
|
159
|
-
end
|
160
|
-
memoize :match
|
161
|
-
end
|
162
|
-
|
163
|
-
private_constant(*constants(false))
|
164
|
-
end
|
165
|
-
end
|
166
|
-
end
|