reek 6.0.3 → 6.0.4
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 +4 -4
- data/CHANGELOG.md +6 -1
- data/CONTRIBUTING.md +3 -0
- data/Dockerfile +1 -1
- data/Gemfile +6 -6
- data/lib/reek/ast/ast_node_class_map.rb +1 -1
- data/lib/reek/report/code_climate/code_climate_formatter.rb +1 -3
- data/lib/reek/smell_detectors/base_detector.rb +1 -1
- data/lib/reek/smell_warning.rb +1 -1
- data/lib/reek/source/source_locator.rb +1 -3
- data/lib/reek/version.rb +1 -1
- data/reek.gemspec +4 -1
- metadata +3 -208
- data/docs/API.md +0 -174
- data/docs/Attribute.md +0 -39
- data/docs/Basic-Smell-Options.md +0 -85
- data/docs/Boolean-Parameter.md +0 -54
- data/docs/Class-Variable.md +0 -40
- data/docs/Code-Smells.md +0 -39
- data/docs/Command-Line-Options.md +0 -119
- data/docs/Control-Couple.md +0 -26
- data/docs/Control-Parameter.md +0 -32
- data/docs/Data-Clump.md +0 -46
- data/docs/Duplicate-Method-Call.md +0 -264
- data/docs/Feature-Envy.md +0 -93
- data/docs/How-To-Write-New-Detectors.md +0 -132
- data/docs/How-reek-works-internally.md +0 -114
- data/docs/Instance-Variable-Assumption.md +0 -163
- data/docs/Irresponsible-Module.md +0 -47
- data/docs/Large-Class.md +0 -16
- data/docs/Long-Parameter-List.md +0 -39
- data/docs/Long-Yield-List.md +0 -37
- data/docs/Manual-Dispatch.md +0 -30
- data/docs/Missing-Safe-Method.md +0 -92
- data/docs/Module-Initialize.md +0 -62
- data/docs/Nested-Iterators.md +0 -59
- data/docs/Nil-Check.md +0 -47
- data/docs/RSpec-matchers.md +0 -129
- data/docs/Rake-Task.md +0 -66
- data/docs/Reek-4-to-Reek-5-migration.md +0 -188
- data/docs/Reek-Driven-Development.md +0 -46
- data/docs/Repeated-Conditional.md +0 -47
- data/docs/Simulated-Polymorphism.md +0 -16
- data/docs/Smell-Suppression.md +0 -96
- data/docs/Style-Guide.md +0 -19
- data/docs/Subclassed-From-Core-Class.md +0 -79
- data/docs/Too-Many-Constants.md +0 -37
- data/docs/Too-Many-Instance-Variables.md +0 -43
- data/docs/Too-Many-Methods.md +0 -56
- data/docs/Too-Many-Statements.md +0 -54
- data/docs/Uncommunicative-Method-Name.md +0 -94
- data/docs/Uncommunicative-Module-Name.md +0 -92
- data/docs/Uncommunicative-Name.md +0 -18
- data/docs/Uncommunicative-Parameter-Name.md +0 -90
- data/docs/Uncommunicative-Variable-Name.md +0 -96
- data/docs/Unused-Parameters.md +0 -28
- data/docs/Unused-Private-Method.md +0 -101
- data/docs/Utility-Function.md +0 -56
- data/docs/Versioning-Policy.md +0 -7
- data/docs/YAML-Reports.md +0 -93
- data/docs/defaults.reek.yml +0 -129
- data/docs/templates/default/docstring/html/public_api_marker.erb +0 -3
- data/docs/templates/default/docstring/setup.rb +0 -35
- data/docs/templates/default/fulldoc/html/css/common.css +0 -1
- data/docs/yard_plugin.rb +0 -17
- data/features/command_line_interface/basic_usage.feature +0 -15
- data/features/command_line_interface/options.feature +0 -123
- data/features/command_line_interface/show_progress.feature +0 -33
- data/features/command_line_interface/smell_selection.feature +0 -15
- data/features/command_line_interface/smells_count.feature +0 -38
- data/features/command_line_interface/stdin.feature +0 -65
- data/features/configuration_files/accept_setting.feature +0 -87
- data/features/configuration_files/directory_specific_directives.feature +0 -274
- data/features/configuration_files/exclude_directives.feature +0 -35
- data/features/configuration_files/exclude_paths_directives.feature +0 -42
- data/features/configuration_files/masking_smells.feature +0 -94
- data/features/configuration_files/mix_accept_reject_setting.feature +0 -84
- data/features/configuration_files/reject_setting.feature +0 -89
- data/features/configuration_files/schema_validation.feature +0 -59
- data/features/configuration_files/show_configuration_file.feature +0 -44
- data/features/configuration_files/unused_private_method.feature +0 -68
- data/features/configuration_loading.feature +0 -91
- data/features/configuration_via_source_comments/erroneous_source_comments.feature +0 -68
- data/features/configuration_via_source_comments/well_formed_source_comments.feature +0 -116
- data/features/locales.feature +0 -32
- data/features/programmatic_access.feature +0 -41
- data/features/rake_task/rake_task.feature +0 -138
- data/features/reports/codeclimate.feature +0 -59
- data/features/reports/json.feature +0 -59
- data/features/reports/reports.feature +0 -219
- data/features/reports/yaml.feature +0 -52
- data/features/rspec_matcher.feature +0 -41
- data/features/samples.feature +0 -305
- data/features/step_definitions/.rubocop.yml +0 -5
- data/features/step_definitions/reek_steps.rb +0 -102
- data/features/step_definitions/sample_file_steps.rb +0 -63
- data/features/support/env.rb +0 -33
- data/features/todo_list.feature +0 -108
- data/samples/checkstyle.xml +0 -7
- data/samples/clean_source/clean.rb +0 -6
- data/samples/configuration/accepts_rejects_and_excludes_for_detectors.reek.yml +0 -29
- data/samples/configuration/accepts_rejects_and_excludes_for_directory_directives.reek.yml +0 -30
- data/samples/configuration/corrupt.reek +0 -1
- data/samples/configuration/empty.reek +0 -0
- data/samples/configuration/full_configuration.reek +0 -13
- data/samples/configuration/full_mask.reek +0 -6
- data/samples/configuration/home/home.reek.yml +0 -4
- data/samples/configuration/partial_mask.reek +0 -4
- data/samples/configuration/regular_configuration/.reek.yml +0 -4
- data/samples/configuration/regular_configuration/empty_sub_directory/.gitignore +0 -0
- data/samples/configuration/with_excluded_paths.reek +0 -5
- data/samples/no_config_file/.keep +0 -0
- data/samples/paths.rb +0 -5
- data/samples/smelly_source/inline.rb +0 -704
- data/samples/smelly_source/optparse.rb +0 -1788
- data/samples/smelly_source/redcloth.rb +0 -1130
- data/samples/smelly_source/ruby.rb +0 -368
- data/samples/smelly_source/smelly.rb +0 -7
- data/samples/source_with_exclude_paths/ignore_me/uncommunicative_method_name.rb +0 -5
- data/samples/source_with_exclude_paths/nested/ignore_me_as_well/irresponsible_module.rb +0 -2
- data/samples/source_with_exclude_paths/nested/uncommunicative_parameter_name.rb +0 -6
- data/samples/source_with_exclude_paths/nested/uncommunicative_variable_name.rb +0 -6
- data/samples/source_with_hidden_directories/.hidden/hidden.rb +0 -1
- data/samples/source_with_hidden_directories/not_hidden.rb +0 -1
- data/samples/source_with_non_ruby_files/gibberish +0 -1
- data/samples/source_with_non_ruby_files/python_source.py +0 -1
- data/samples/source_with_non_ruby_files/ruby.rb +0 -6
- data/spec/performance/reek/smell_detectors/runtime_speed_spec.rb +0 -15
- data/spec/quality/documentation_spec.rb +0 -41
- data/spec/quality/reek_source_spec.rb +0 -11
- data/spec/reek/ast/node_spec.rb +0 -211
- data/spec/reek/ast/object_refs_spec.rb +0 -83
- data/spec/reek/ast/reference_collector_spec.rb +0 -47
- data/spec/reek/ast/sexp_extensions_spec.rb +0 -498
- data/spec/reek/cli/application_spec.rb +0 -168
- data/spec/reek/cli/command/report_command_spec.rb +0 -44
- data/spec/reek/cli/command/todo_list_command_spec.rb +0 -86
- data/spec/reek/cli/options_spec.rb +0 -51
- data/spec/reek/cli/silencer_spec.rb +0 -28
- data/spec/reek/code_comment_spec.rb +0 -184
- data/spec/reek/configuration/app_configuration_spec.rb +0 -195
- data/spec/reek/configuration/configuration_file_finder_spec.rb +0 -230
- data/spec/reek/configuration/default_directive_spec.rb +0 -13
- data/spec/reek/configuration/directory_directives_spec.rb +0 -122
- data/spec/reek/configuration/excluded_paths_spec.rb +0 -25
- data/spec/reek/configuration/rake_task_converter_spec.rb +0 -33
- data/spec/reek/configuration/schema_validator_spec.rb +0 -165
- data/spec/reek/context/code_context_spec.rb +0 -192
- data/spec/reek/context/ghost_context_spec.rb +0 -60
- data/spec/reek/context/method_context_spec.rb +0 -72
- data/spec/reek/context/module_context_spec.rb +0 -55
- data/spec/reek/context/root_context_spec.rb +0 -12
- data/spec/reek/context/statement_counter_spec.rb +0 -24
- data/spec/reek/context_builder_spec.rb +0 -457
- data/spec/reek/detector_repository_spec.rb +0 -22
- data/spec/reek/documentation_link_spec.rb +0 -20
- data/spec/reek/errors/base_error_spec.rb +0 -13
- data/spec/reek/examiner_spec.rb +0 -309
- data/spec/reek/logging_error_handler_spec.rb +0 -24
- data/spec/reek/rake/task_spec.rb +0 -56
- data/spec/reek/report/code_climate/code_climate_configuration_spec.rb +0 -22
- data/spec/reek/report/code_climate/code_climate_fingerprint_spec.rb +0 -126
- data/spec/reek/report/code_climate/code_climate_formatter_spec.rb +0 -51
- data/spec/reek/report/code_climate/code_climate_report_spec.rb +0 -56
- data/spec/reek/report/html_report_spec.rb +0 -19
- data/spec/reek/report/json_report_spec.rb +0 -58
- data/spec/reek/report/location_formatter_spec.rb +0 -32
- data/spec/reek/report/progress_formatter_spec.rb +0 -68
- data/spec/reek/report/text_report_spec.rb +0 -89
- data/spec/reek/report/xml_report_spec.rb +0 -24
- data/spec/reek/report/yaml_report_spec.rb +0 -55
- data/spec/reek/report_spec.rb +0 -28
- data/spec/reek/smell_configuration_spec.rb +0 -56
- data/spec/reek/smell_detectors/attribute_spec.rb +0 -197
- data/spec/reek/smell_detectors/base_detector_spec.rb +0 -50
- data/spec/reek/smell_detectors/boolean_parameter_spec.rb +0 -93
- data/spec/reek/smell_detectors/class_variable_spec.rb +0 -106
- data/spec/reek/smell_detectors/control_parameter_spec.rb +0 -300
- data/spec/reek/smell_detectors/data_clump_spec.rb +0 -134
- data/spec/reek/smell_detectors/duplicate_method_call_spec.rb +0 -211
- data/spec/reek/smell_detectors/feature_envy_spec.rb +0 -295
- data/spec/reek/smell_detectors/instance_variable_assumption_spec.rb +0 -96
- data/spec/reek/smell_detectors/irresponsible_module_spec.rb +0 -226
- data/spec/reek/smell_detectors/long_parameter_list_spec.rb +0 -61
- data/spec/reek/smell_detectors/long_yield_list_spec.rb +0 -49
- data/spec/reek/smell_detectors/manual_dispatch_spec.rb +0 -75
- data/spec/reek/smell_detectors/missing_safe_method_spec.rb +0 -68
- data/spec/reek/smell_detectors/module_initialize_spec.rb +0 -77
- data/spec/reek/smell_detectors/nested_iterators_spec.rb +0 -333
- data/spec/reek/smell_detectors/nil_check_spec.rb +0 -100
- data/spec/reek/smell_detectors/repeated_conditional_spec.rb +0 -100
- data/spec/reek/smell_detectors/subclassed_from_core_class_spec.rb +0 -77
- data/spec/reek/smell_detectors/too_many_constants_spec.rb +0 -144
- data/spec/reek/smell_detectors/too_many_instance_variables_spec.rb +0 -132
- data/spec/reek/smell_detectors/too_many_methods_spec.rb +0 -54
- data/spec/reek/smell_detectors/too_many_statements_spec.rb +0 -90
- data/spec/reek/smell_detectors/uncommunicative_method_name_spec.rb +0 -78
- data/spec/reek/smell_detectors/uncommunicative_module_name_spec.rb +0 -78
- data/spec/reek/smell_detectors/uncommunicative_parameter_name_spec.rb +0 -147
- data/spec/reek/smell_detectors/uncommunicative_variable_name_spec.rb +0 -201
- data/spec/reek/smell_detectors/unused_parameters_spec.rb +0 -114
- data/spec/reek/smell_detectors/unused_private_method_spec.rb +0 -205
- data/spec/reek/smell_detectors/utility_function_spec.rb +0 -309
- data/spec/reek/smell_warning_spec.rb +0 -137
- data/spec/reek/source/source_code_spec.rb +0 -79
- data/spec/reek/source/source_locator_spec.rb +0 -166
- data/spec/reek/spec/should_reek_of_spec.rb +0 -153
- data/spec/reek/spec/should_reek_only_of_spec.rb +0 -91
- data/spec/reek/spec/should_reek_spec.rb +0 -52
- data/spec/reek/spec/smell_matcher_spec.rb +0 -87
- data/spec/reek/tree_dresser_spec.rb +0 -46
- data/spec/spec_helper.rb +0 -110
- data/tasks/configuration.rake +0 -18
- data/tasks/console.rake +0 -5
- data/tasks/reek.rake +0 -6
- data/tasks/rubocop.rake +0 -11
- data/tasks/test.rake +0 -32
@@ -1,166 +0,0 @@
|
|
1
|
-
require 'pathname'
|
2
|
-
require_relative '../../spec_helper'
|
3
|
-
require_lib 'reek/configuration/app_configuration'
|
4
|
-
require_lib 'reek/source/source_locator'
|
5
|
-
|
6
|
-
RSpec.describe Reek::Source::SourceLocator do
|
7
|
-
describe '#sources' do
|
8
|
-
context 'when applied to hidden directories' do
|
9
|
-
let(:path) { SAMPLES_DIR.join('source_with_hidden_directories') }
|
10
|
-
|
11
|
-
let(:expected_paths) do
|
12
|
-
[path.join('not_hidden.rb')]
|
13
|
-
end
|
14
|
-
|
15
|
-
let(:paths_that_are_expected_to_be_ignored) do
|
16
|
-
[path.join('.hidden/hidden.rb')]
|
17
|
-
end
|
18
|
-
|
19
|
-
it 'does not scan hidden directories' do
|
20
|
-
sources = described_class.new([path]).sources
|
21
|
-
|
22
|
-
expect(sources).not_to include(*paths_that_are_expected_to_be_ignored)
|
23
|
-
end
|
24
|
-
|
25
|
-
it 'scans directories that are not hidden' do
|
26
|
-
sources = described_class.new([path]).sources
|
27
|
-
|
28
|
-
expect(sources).to match_array expected_paths
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
context 'with excluded paths' do
|
33
|
-
let(:configuration) do
|
34
|
-
test_configuration_for(CONFIGURATION_DIR.join('with_excluded_paths.reek'))
|
35
|
-
end
|
36
|
-
|
37
|
-
let(:options) { instance_double('Reek::CLI::Options', force_exclusion?: false) }
|
38
|
-
|
39
|
-
context 'when the path is absolute' do
|
40
|
-
let(:path) do
|
41
|
-
SAMPLES_DIR.join('source_with_exclude_paths',
|
42
|
-
'ignore_me',
|
43
|
-
'uncommunicative_method_name.rb').expand_path
|
44
|
-
end
|
45
|
-
|
46
|
-
context 'when options.force_exclusion? is true' do
|
47
|
-
before do
|
48
|
-
allow(options).to receive(:force_exclusion?).and_return(true)
|
49
|
-
end
|
50
|
-
|
51
|
-
it 'excludes this file' do
|
52
|
-
sources = described_class.new([path], configuration: configuration, options: options).sources
|
53
|
-
expect(sources).not_to include(path)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
context 'when options.force_exclusion? is false' do
|
58
|
-
before do
|
59
|
-
allow(options).to receive(:force_exclusion?).and_return(false)
|
60
|
-
end
|
61
|
-
|
62
|
-
it 'includes this file' do
|
63
|
-
sources = described_class.new([path], configuration: configuration, options: options).sources
|
64
|
-
expect(sources).to include(path)
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
context 'when the path is a file name in an excluded directory' do
|
70
|
-
let(:path) { SAMPLES_DIR.join('source_with_exclude_paths', 'ignore_me', 'uncommunicative_method_name.rb') }
|
71
|
-
|
72
|
-
context 'when options.force_exclusion? is true' do
|
73
|
-
before do
|
74
|
-
allow(options).to receive(:force_exclusion?).and_return(true)
|
75
|
-
end
|
76
|
-
|
77
|
-
it 'excludes this file' do
|
78
|
-
sources = described_class.new([path], configuration: configuration, options: options).sources
|
79
|
-
expect(sources).not_to include(path)
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
context 'when options.force_exclusion? is false' do
|
84
|
-
before do
|
85
|
-
allow(options).to receive(:force_exclusion?).and_return(false)
|
86
|
-
end
|
87
|
-
|
88
|
-
it 'includes this file' do
|
89
|
-
sources = described_class.new([path], configuration: configuration, options: options).sources
|
90
|
-
expect(sources).to include(path)
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
context 'when path is a directory or a file' do
|
96
|
-
let(:path) { SAMPLES_DIR.join('source_with_exclude_paths') }
|
97
|
-
|
98
|
-
let(:expected_paths) do
|
99
|
-
[path.join('nested/uncommunicative_variable_name.rb')]
|
100
|
-
end
|
101
|
-
|
102
|
-
let(:paths_that_are_expected_to_be_ignored) do
|
103
|
-
[
|
104
|
-
path.join('ignore_me/uncommunicative_method_name.rb'),
|
105
|
-
path.join('nested/ignore_me_as_well/irresponsible_module.rb'),
|
106
|
-
path.join('nested/uncommunicative_parameter_name.rb')
|
107
|
-
]
|
108
|
-
end
|
109
|
-
|
110
|
-
it 'does not use excluded paths' do
|
111
|
-
sources = described_class.new([path], configuration: configuration, options: options).sources
|
112
|
-
expect(sources).not_to include(*paths_that_are_expected_to_be_ignored)
|
113
|
-
end
|
114
|
-
|
115
|
-
it 'scans directories and files that are not excluded' do
|
116
|
-
sources = described_class.new([path], configuration: configuration).sources
|
117
|
-
expect(sources).to eq expected_paths
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
context 'with non-Ruby paths' do
|
123
|
-
let(:path) { SAMPLES_DIR.join('source_with_non_ruby_files') }
|
124
|
-
let(:expected_sources) do
|
125
|
-
[path.join('ruby.rb')]
|
126
|
-
end
|
127
|
-
let(:paths_that_are_expected_to_be_ignored) do
|
128
|
-
[
|
129
|
-
path.join('gibberish'),
|
130
|
-
path.join('python_source.py')
|
131
|
-
]
|
132
|
-
end
|
133
|
-
|
134
|
-
it 'uses Ruby source paths' do
|
135
|
-
sources = described_class.new([path]).sources
|
136
|
-
|
137
|
-
expect(sources).to include(*expected_sources)
|
138
|
-
end
|
139
|
-
|
140
|
-
it 'does not use non-Ruby source paths' do
|
141
|
-
sources = described_class.new([path]).sources
|
142
|
-
|
143
|
-
expect(sources).not_to include(*paths_that_are_expected_to_be_ignored)
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
context 'when passing "." or "./" as argument' do
|
148
|
-
let(:expected_sources) do
|
149
|
-
[Pathname.new('spec/spec_helper.rb'), Pathname.new('lib/reek.rb')]
|
150
|
-
end
|
151
|
-
|
152
|
-
it 'expands it correctly' do
|
153
|
-
sources_for_dot = described_class.new([Pathname.new('.')]).sources
|
154
|
-
|
155
|
-
expect(sources_for_dot).to include(*expected_sources)
|
156
|
-
end
|
157
|
-
|
158
|
-
it 'ignores the trailing slash' do
|
159
|
-
sources_for_dot = described_class.new([Pathname.new('.')]).sources
|
160
|
-
sources_for_dot_slash = described_class.new([Pathname.new('./')]).sources
|
161
|
-
|
162
|
-
expect(sources_for_dot).to eq(sources_for_dot_slash)
|
163
|
-
end
|
164
|
-
end
|
165
|
-
end
|
166
|
-
end
|
@@ -1,153 +0,0 @@
|
|
1
|
-
require 'pathname'
|
2
|
-
require_relative '../../spec_helper'
|
3
|
-
require_lib 'reek/spec'
|
4
|
-
|
5
|
-
RSpec.describe Reek::Spec::ShouldReekOf do
|
6
|
-
describe 'smell type selection' do
|
7
|
-
let(:ruby) { 'def double_thing() @other.thing.foo + @other.thing.foo end' }
|
8
|
-
|
9
|
-
it 'reports duplicate calls by smell type' do
|
10
|
-
expect(ruby).to reek_of(:DuplicateMethodCall)
|
11
|
-
end
|
12
|
-
|
13
|
-
it 'does not report any feature envy' do
|
14
|
-
expect(ruby).not_to reek_of(:FeatureEnvy)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
describe 'different sources of input' do
|
19
|
-
context 'when checking code in a string' do
|
20
|
-
let(:clean_code) { 'def good() true; end' }
|
21
|
-
let(:matcher) { described_class.new(:UncommunicativeVariableName, name: 'y') }
|
22
|
-
let(:smelly_code) { 'def x() y = 4; end' }
|
23
|
-
|
24
|
-
it 'matches a smelly String' do
|
25
|
-
expect(matcher).to be_matches(smelly_code)
|
26
|
-
end
|
27
|
-
|
28
|
-
it 'doesnt match a fragrant String' do
|
29
|
-
expect(matcher).not_to be_matches(clean_code)
|
30
|
-
end
|
31
|
-
|
32
|
-
it 're-calculates matches every time' do
|
33
|
-
matcher.matches? smelly_code
|
34
|
-
expect(matcher).not_to be_matches(clean_code)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
context 'when checking code in a File' do
|
39
|
-
let(:matcher) { described_class.new(:UncommunicativeMethodName, name: 'x') }
|
40
|
-
|
41
|
-
it 'matches a smelly file' do
|
42
|
-
expect(matcher).to be_matches(SMELLY_FILE)
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'doesnt match a fragrant file' do
|
46
|
-
expect(matcher).not_to be_matches(CLEAN_FILE)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
describe 'smell types and smell details' do
|
52
|
-
context 'when passing in smell_details with unknown parameter name' do
|
53
|
-
let(:matcher) { described_class.new(:UncommunicativeVariableName, foo: 'y') }
|
54
|
-
let(:smelly_code) { 'def x() y = 4; end' }
|
55
|
-
|
56
|
-
it 'raises ArgumentError' do
|
57
|
-
expect { matcher.matches?(smelly_code) }.to raise_error(ArgumentError)
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
context 'when both are matching' do
|
62
|
-
let(:matcher) { described_class.new(:UncommunicativeVariableName, name: 'y') }
|
63
|
-
let(:smelly_code) { 'def x() y = 4; end' }
|
64
|
-
|
65
|
-
it 'is truthy' do
|
66
|
-
expect(matcher).to be_matches(smelly_code)
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
context 'when no smell_type is matching' do
|
71
|
-
let(:smelly_code) { 'def dummy() y = 4; end' }
|
72
|
-
|
73
|
-
let(:falsey_matcher) { described_class.new(:FeatureEnvy, name: 'y') }
|
74
|
-
let(:truthy_matcher) { described_class.new(:UncommunicativeVariableName, name: 'y') }
|
75
|
-
|
76
|
-
it 'is falsey' do
|
77
|
-
expect(falsey_matcher).not_to be_matches(smelly_code)
|
78
|
-
end
|
79
|
-
|
80
|
-
it 'sets the proper error message' do
|
81
|
-
falsey_matcher.matches?(smelly_code)
|
82
|
-
|
83
|
-
expect(falsey_matcher.failure_message).to\
|
84
|
-
match('Expected string to reek of FeatureEnvy, but it didn\'t')
|
85
|
-
end
|
86
|
-
|
87
|
-
it 'sets the proper error message when negated' do
|
88
|
-
truthy_matcher.matches?(smelly_code)
|
89
|
-
|
90
|
-
expect(truthy_matcher.failure_message_when_negated).to\
|
91
|
-
match('Expected string not to reek of UncommunicativeVariableName, but it did')
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
context 'when smell type is matching but smell details are not' do
|
96
|
-
let(:smelly_code) { 'def double_thing() @other.thing.foo + @other.thing.foo end' }
|
97
|
-
let(:matcher) { described_class.new(:DuplicateMethodCall, name: 'foo', count: 15) }
|
98
|
-
|
99
|
-
it 'is falsey' do
|
100
|
-
expect(matcher).not_to be_matches(smelly_code)
|
101
|
-
end
|
102
|
-
|
103
|
-
it 'sets the proper error message' do
|
104
|
-
matcher.matches?(smelly_code)
|
105
|
-
expected = <<~TEXT
|
106
|
-
Expected string to reek of DuplicateMethodCall (which it did) with smell details {:name=>"foo", :count=>15}, which it didn't.
|
107
|
-
The number of smell details I had to compare with the given one was 2 and here they are:
|
108
|
-
1.)
|
109
|
-
{"context"=>"double_thing", "lines"=>[1, 1], "message"=>"calls '@other.thing' 2 times", "source"=>"string", "name"=>"@other.thing", "count"=>2}
|
110
|
-
2.)
|
111
|
-
{"context"=>"double_thing", "lines"=>[1, 1], "message"=>"calls '@other.thing.foo' 2 times", "source"=>"string", "name"=>"@other.thing.foo", "count"=>2}
|
112
|
-
TEXT
|
113
|
-
|
114
|
-
expect(matcher.failure_message).to eq(expected)
|
115
|
-
end
|
116
|
-
|
117
|
-
it 'sets the proper error message when negated' do
|
118
|
-
matcher.matches?(smelly_code)
|
119
|
-
|
120
|
-
expect(matcher.failure_message_when_negated).to\
|
121
|
-
match('Expected string not to reek of DuplicateMethodCall with smell '\
|
122
|
-
'details {:name=>"foo", :count=>15}, but it did')
|
123
|
-
end
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
context 'with a smell that is disabled by default' do
|
128
|
-
it 'enables the smell detector to match automatically' do
|
129
|
-
default_config = Reek::SmellDetectors::UnusedPrivateMethod.default_config
|
130
|
-
src = 'class C; private; def foo; end; end'
|
131
|
-
|
132
|
-
aggregate_failures do
|
133
|
-
expect(default_config[Reek::SmellConfiguration::ENABLED_KEY]).to be_falsy
|
134
|
-
expect(src).to reek_of(:UnusedPrivateMethod)
|
135
|
-
end
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
|
-
describe '#with_config' do
|
140
|
-
let(:matcher) { described_class.new(:UncommunicativeVariableName) }
|
141
|
-
let(:configured_matcher) { matcher.with_config('accept' => 'x') }
|
142
|
-
|
143
|
-
it 'uses the passed-in configuration for matching' do
|
144
|
-
expect(configured_matcher).to be_matches('def foo; q = 2; end')
|
145
|
-
expect(configured_matcher).not_to be_matches('def foo; x = 2; end')
|
146
|
-
end
|
147
|
-
|
148
|
-
it 'leaves the original matcher intact' do
|
149
|
-
expect(configured_matcher).not_to be_matches('def foo; x = 2; end')
|
150
|
-
expect(matcher).to be_matches('def foo; x = 2; end')
|
151
|
-
end
|
152
|
-
end
|
153
|
-
end
|
@@ -1,91 +0,0 @@
|
|
1
|
-
require_relative '../../spec_helper'
|
2
|
-
require_lib 'reek/spec'
|
3
|
-
|
4
|
-
RSpec.describe Reek::Spec::ShouldReekOnlyOf do
|
5
|
-
let(:examiner) { instance_double('Reek::Examiner').as_null_object }
|
6
|
-
let(:expected_context_name) { 'SmellyClass#big_method' }
|
7
|
-
let(:expected_smell_type) { :NestedIterators }
|
8
|
-
let(:matcher) { described_class.new(expected_smell_type) }
|
9
|
-
let(:matcher_matches) { matcher.matches_examiner?(examiner) }
|
10
|
-
|
11
|
-
before do
|
12
|
-
allow(examiner).to receive(:smells) { smells }
|
13
|
-
matcher_matches
|
14
|
-
end
|
15
|
-
|
16
|
-
shared_examples_for 'no match' do
|
17
|
-
it 'does not match' do
|
18
|
-
expect(matcher_matches).to be_falsey
|
19
|
-
end
|
20
|
-
|
21
|
-
context 'when a match was expected' do
|
22
|
-
let(:source) { 'the_path/to_a/source_file.rb' }
|
23
|
-
|
24
|
-
before { allow(examiner).to receive(:origin).and_return(source) }
|
25
|
-
|
26
|
-
it 'reports the source' do
|
27
|
-
expect(matcher.failure_message).to match(source)
|
28
|
-
end
|
29
|
-
|
30
|
-
it 'reports the expected smell class' do
|
31
|
-
expect(matcher.failure_message).to match(expected_smell_type.to_s)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
context 'with no smells' do
|
37
|
-
let(:smells) { [] }
|
38
|
-
|
39
|
-
it_behaves_like 'no match'
|
40
|
-
end
|
41
|
-
|
42
|
-
context 'with 1 non-matching smell' do
|
43
|
-
let(:smells) { [build_smell_warning(smell_type: 'ControlParameter')] }
|
44
|
-
|
45
|
-
it_behaves_like 'no match'
|
46
|
-
end
|
47
|
-
|
48
|
-
context 'with 2 non-matching smells' do
|
49
|
-
let(:smells) do
|
50
|
-
[
|
51
|
-
build_smell_warning(smell_type: 'ControlParameter'),
|
52
|
-
build_smell_warning(smell_type: 'FeatureEnvy')
|
53
|
-
]
|
54
|
-
end
|
55
|
-
|
56
|
-
it_behaves_like 'no match'
|
57
|
-
end
|
58
|
-
|
59
|
-
context 'with 1 non-matching and 1 matching smell' do
|
60
|
-
let(:smells) do
|
61
|
-
[
|
62
|
-
build_smell_warning(smell_type: 'ControlParameter'),
|
63
|
-
build_smell_warning(smell_type: expected_smell_type.to_s,
|
64
|
-
message: "message mentioning #{expected_context_name}")
|
65
|
-
]
|
66
|
-
end
|
67
|
-
|
68
|
-
it_behaves_like 'no match'
|
69
|
-
end
|
70
|
-
|
71
|
-
context 'with 1 matching smell' do
|
72
|
-
let(:smells) do
|
73
|
-
[build_smell_warning(smell_type: expected_smell_type.to_s,
|
74
|
-
message: "message mentioning #{expected_context_name}")]
|
75
|
-
end
|
76
|
-
|
77
|
-
it 'matches' do
|
78
|
-
expect(matcher_matches).to be_truthy
|
79
|
-
end
|
80
|
-
|
81
|
-
it 'reports the expected smell when no match was expected' do
|
82
|
-
expect(matcher.failure_message_when_negated).to match(expected_smell_type.to_s)
|
83
|
-
end
|
84
|
-
|
85
|
-
it 'reports the source when no match was expected' do
|
86
|
-
source = 'the_path/to_a/source_file.rb'
|
87
|
-
allow(examiner).to receive(:origin).and_return(source)
|
88
|
-
expect(matcher.failure_message_when_negated).to match(source)
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
@@ -1,52 +0,0 @@
|
|
1
|
-
require_relative '../../spec_helper'
|
2
|
-
require_lib 'reek/spec'
|
3
|
-
|
4
|
-
RSpec.describe Reek::Spec::ShouldReek do
|
5
|
-
describe 'checking code in a string' do
|
6
|
-
let(:matcher) { described_class.new }
|
7
|
-
let(:clean_code) { 'def good() true; end' }
|
8
|
-
let(:smelly_code) { 'def x() y = 4; end' }
|
9
|
-
|
10
|
-
it 'matches a smelly String' do
|
11
|
-
expect(matcher).to be_matches(smelly_code)
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'doesnt match a fragrant String' do
|
15
|
-
expect(matcher).not_to be_matches(clean_code)
|
16
|
-
end
|
17
|
-
|
18
|
-
it 'reports the smells when should_not fails' do
|
19
|
-
matcher.matches?(smelly_code)
|
20
|
-
expect(matcher.failure_message_when_negated).to match('UncommunicativeVariableName')
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
describe 'checking code in a File' do
|
25
|
-
context 'without masking' do
|
26
|
-
let(:matcher) { described_class.new }
|
27
|
-
|
28
|
-
it 'matches a smelly File' do
|
29
|
-
expect(matcher).to be_matches(SMELLY_FILE)
|
30
|
-
end
|
31
|
-
|
32
|
-
it 'doesnt match a fragrant File' do
|
33
|
-
expect(matcher).not_to be_matches(CLEAN_FILE)
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'reports the smells when should_not fails' do
|
37
|
-
matcher.matches?(SMELLY_FILE)
|
38
|
-
expect(matcher.failure_message_when_negated).to match('UncommunicativeMethodName')
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
context 'with masking' do
|
43
|
-
let(:path) { CONFIGURATION_DIR.join('full_mask.reek') }
|
44
|
-
let(:configuration) { test_configuration_for(path) }
|
45
|
-
let(:matcher) { described_class.new(configuration: configuration) }
|
46
|
-
|
47
|
-
it 'masks smells using the relevant configuration' do
|
48
|
-
expect(matcher).not_to be_matches(SMELLY_FILE)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|