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,195 +0,0 @@
|
|
1
|
-
require 'pathname'
|
2
|
-
require_relative '../../spec_helper'
|
3
|
-
require_lib 'reek/configuration/app_configuration'
|
4
|
-
require_lib 'reek/configuration/directory_directives'
|
5
|
-
require_lib 'reek/configuration/default_directive'
|
6
|
-
require_lib 'reek/configuration/excluded_paths'
|
7
|
-
|
8
|
-
RSpec.describe Reek::Configuration::AppConfiguration do
|
9
|
-
describe 'factory methods' do
|
10
|
-
around do |example|
|
11
|
-
Dir.mktmpdir do |tmp|
|
12
|
-
Dir.chdir(tmp) do
|
13
|
-
example.run
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
let(:expected_exclude_file_names) do
|
19
|
-
%w(exclude_me.rb exclude_me_too.rb)
|
20
|
-
end
|
21
|
-
|
22
|
-
let(:expected_exclude_directories) do
|
23
|
-
%w(directory_with_trailing_slash/ directory_without_trailing_slash)
|
24
|
-
end
|
25
|
-
|
26
|
-
let(:expected_excluded_paths) do
|
27
|
-
(expected_exclude_file_names + expected_exclude_directories).map { |path| Pathname(path) }
|
28
|
-
end
|
29
|
-
|
30
|
-
let(:expected_default_directive) do
|
31
|
-
{ Reek::SmellDetectors::IrresponsibleModule => { 'enabled' => false } }
|
32
|
-
end
|
33
|
-
|
34
|
-
let(:expected_directory_directives) do
|
35
|
-
{ Pathname('directory_with_some_ruby_files') => {
|
36
|
-
Reek::SmellDetectors::UtilityFunction => { 'enabled' => false }
|
37
|
-
} }
|
38
|
-
end
|
39
|
-
|
40
|
-
describe '#from_path' do
|
41
|
-
let(:configuration_path) { 'config.reek' }
|
42
|
-
let(:configuration) do
|
43
|
-
<<~YAML
|
44
|
-
---
|
45
|
-
detectors:
|
46
|
-
IrresponsibleModule:
|
47
|
-
enabled: false
|
48
|
-
directories:
|
49
|
-
"directory_with_some_ruby_files":
|
50
|
-
UtilityFunction:
|
51
|
-
enabled: false
|
52
|
-
exclude_paths:
|
53
|
-
- "exclude_me.rb"
|
54
|
-
- "exclude_me_too.rb"
|
55
|
-
- "directory_with_trailing_slash/"
|
56
|
-
- "directory_without_trailing_slash"
|
57
|
-
YAML
|
58
|
-
end
|
59
|
-
|
60
|
-
before do
|
61
|
-
File.write configuration_path, configuration
|
62
|
-
FileUtils.touch expected_exclude_file_names
|
63
|
-
FileUtils.mkdir expected_exclude_directories
|
64
|
-
end
|
65
|
-
|
66
|
-
it 'properly loads configuration and processes it' do
|
67
|
-
config = described_class.from_path configuration_path
|
68
|
-
|
69
|
-
expect(config.send(:excluded_paths)).to eq(expected_excluded_paths)
|
70
|
-
expect(config.send(:default_directive)).to eq(expected_default_directive)
|
71
|
-
expect(config.send(:directory_directives)).to eq(expected_directory_directives)
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
describe '#from_hash' do
|
76
|
-
before do
|
77
|
-
FileUtils.touch expected_exclude_file_names
|
78
|
-
FileUtils.mkdir expected_exclude_directories
|
79
|
-
end
|
80
|
-
|
81
|
-
let(:default_directive_value) do
|
82
|
-
{ Reek::DETECTORS_KEY => {
|
83
|
-
'IrresponsibleModule' => { 'enabled' => false }
|
84
|
-
} }
|
85
|
-
end
|
86
|
-
|
87
|
-
let(:directory_directives_value) do
|
88
|
-
{ Reek::DIRECTORIES_KEY => {
|
89
|
-
'directory_with_some_ruby_files' => {
|
90
|
-
'UtilityFunction' => { 'enabled' => false }
|
91
|
-
}
|
92
|
-
} }
|
93
|
-
end
|
94
|
-
|
95
|
-
let(:exclude_paths_value) do
|
96
|
-
{ Reek::EXCLUDE_PATHS_KEY => (expected_exclude_file_names + expected_exclude_directories) }
|
97
|
-
end
|
98
|
-
|
99
|
-
let(:combined_value) do
|
100
|
-
directory_directives_value.
|
101
|
-
merge(default_directive_value).
|
102
|
-
merge(exclude_paths_value)
|
103
|
-
end
|
104
|
-
|
105
|
-
it 'sets the configuration a unified simple data structure' do
|
106
|
-
config = described_class.from_hash(combined_value)
|
107
|
-
|
108
|
-
expect(config.send(:excluded_paths)).to eq(expected_excluded_paths)
|
109
|
-
expect(config.send(:default_directive)).to eq(expected_default_directive)
|
110
|
-
expect(config.send(:directory_directives)).to eq(expected_directory_directives)
|
111
|
-
end
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
describe '#default' do
|
116
|
-
it 'returns a blank AppConfiguration' do
|
117
|
-
config = described_class.default
|
118
|
-
expect(config).to be_instance_of described_class
|
119
|
-
expect(config.send(:excluded_paths)).to eq([])
|
120
|
-
expect(config.send(:default_directive)).to eq({})
|
121
|
-
expect(config.send(:directory_directives)).to eq({})
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
describe '#directive_for' do
|
126
|
-
context 'with multiple directory directives and no default directive present' do
|
127
|
-
let(:source_via) { 'samples/some_files/dummy1.rb' }
|
128
|
-
let(:baz_config) { { IrresponsibleModule: { enabled: false } } }
|
129
|
-
let(:bang_config) { { Attribute: { enabled: true } } }
|
130
|
-
let(:expected_result) { { Reek::SmellDetectors::Attribute => { enabled: true } } }
|
131
|
-
|
132
|
-
let(:directory_directives) do
|
133
|
-
{
|
134
|
-
Reek::DIRECTORIES_KEY => {
|
135
|
-
'samples/some_files' => bang_config,
|
136
|
-
'samples/other_files' => baz_config
|
137
|
-
}
|
138
|
-
}
|
139
|
-
end
|
140
|
-
|
141
|
-
it 'returns the corresponding directive' do
|
142
|
-
configuration = described_class.from_hash directory_directives
|
143
|
-
expect(configuration.directive_for(source_via)).to eq expected_result
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
context 'with directory directive and default directive present' do
|
148
|
-
let(:directory) { 'spec/samples/two_smelly_files/' }
|
149
|
-
let(:source_via) { "#{directory}/dummy.rb" }
|
150
|
-
|
151
|
-
let(:configuration_as_hash) do
|
152
|
-
{
|
153
|
-
Reek::DIRECTORIES_KEY => {
|
154
|
-
directory => { TooManyStatements: { max_statements: 8 } }
|
155
|
-
},
|
156
|
-
Reek::DETECTORS_KEY => {
|
157
|
-
IrresponsibleModule: { enabled: false },
|
158
|
-
TooManyStatements: { max_statements: 15 }
|
159
|
-
}
|
160
|
-
}
|
161
|
-
end
|
162
|
-
|
163
|
-
it 'returns the directory directive with the default directive reverse-merged' do
|
164
|
-
configuration = described_class.from_hash configuration_as_hash
|
165
|
-
actual = configuration.directive_for(source_via)
|
166
|
-
|
167
|
-
expect(actual[Reek::SmellDetectors::IrresponsibleModule]).to be_truthy
|
168
|
-
expect(actual[Reek::SmellDetectors::TooManyStatements]).to be_truthy
|
169
|
-
expect(actual[Reek::SmellDetectors::TooManyStatements][:max_statements]).to eq(8)
|
170
|
-
end
|
171
|
-
end
|
172
|
-
|
173
|
-
context 'with a path not covered by a directory directive but a default directive present' do
|
174
|
-
let(:source_via) { 'samples/some_files/dummy.rb' }
|
175
|
-
|
176
|
-
let(:configuration_as_hash) do
|
177
|
-
{
|
178
|
-
Reek::DETECTORS_KEY => {
|
179
|
-
IrresponsibleModule: { enabled: false }
|
180
|
-
},
|
181
|
-
Reek::DIRECTORIES_KEY => {
|
182
|
-
'samples/other_files' => { Attribute: { enabled: false } }
|
183
|
-
}
|
184
|
-
}
|
185
|
-
end
|
186
|
-
|
187
|
-
let(:expected_result) { { Reek::SmellDetectors::IrresponsibleModule => { enabled: false } } }
|
188
|
-
|
189
|
-
it 'returns the default directive' do
|
190
|
-
configuration = described_class.from_hash configuration_as_hash
|
191
|
-
expect(configuration.directive_for(source_via)).to eq expected_result
|
192
|
-
end
|
193
|
-
end
|
194
|
-
end
|
195
|
-
end
|
@@ -1,230 +0,0 @@
|
|
1
|
-
require 'fileutils'
|
2
|
-
require 'pathname'
|
3
|
-
require 'tmpdir'
|
4
|
-
require_relative '../../spec_helper'
|
5
|
-
require_lib 'reek/configuration/app_configuration'
|
6
|
-
|
7
|
-
RSpec.describe Reek::Configuration::ConfigurationFileFinder do
|
8
|
-
describe '.find' do
|
9
|
-
let(:regular_configuration_dir) { CONFIGURATION_DIR.join('regular_configuration') }
|
10
|
-
let(:regular_configuration_file) { regular_configuration_dir.join('.reek.yml') }
|
11
|
-
|
12
|
-
it 'returns any explicitely passed path' do
|
13
|
-
path = Pathname.new 'foo/bar'
|
14
|
-
found = described_class.find(path: path)
|
15
|
-
expect(found).to eq(path)
|
16
|
-
end
|
17
|
-
|
18
|
-
it 'prefers an explicitely passed path over a file in current dir' do
|
19
|
-
path = Pathname.new 'foo/bar'
|
20
|
-
found = described_class.find(path: path, current: regular_configuration_dir)
|
21
|
-
expect(found).to eq(path)
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'returns the file in current dir if path is not set' do
|
25
|
-
found = described_class.find(current: regular_configuration_dir)
|
26
|
-
expect(found).to eq(regular_configuration_file)
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'returns the file in a parent dir if none in current dir' do
|
30
|
-
empty_sub_directory = CONFIGURATION_DIR.join('regular_configuration').join('empty_sub_directory')
|
31
|
-
found = described_class.find(current: empty_sub_directory)
|
32
|
-
expect(found).to eq(regular_configuration_file)
|
33
|
-
end
|
34
|
-
|
35
|
-
it 'skips files ending in .reek.yml in current dir' do
|
36
|
-
skip_if_a_config_in_tempdir
|
37
|
-
|
38
|
-
Dir.mktmpdir do |tempdir|
|
39
|
-
current = Pathname.new(tempdir)
|
40
|
-
bad_config = current.join('ignoreme.reek.yml')
|
41
|
-
FileUtils.touch bad_config
|
42
|
-
found = described_class.find(current: current)
|
43
|
-
expect(found).to be_nil
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
it 'returns the file in home if traversing from the current dir fails' do
|
48
|
-
skip_if_a_config_in_tempdir
|
49
|
-
|
50
|
-
Dir.mktmpdir do |tempdir|
|
51
|
-
found = described_class.find(current: Pathname.new(tempdir), home: regular_configuration_dir)
|
52
|
-
expect(found).to eq(regular_configuration_file)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
it 'prefers the file in :current over one in :home' do
|
57
|
-
home_dir = CONFIGURATION_DIR.join('home')
|
58
|
-
found = described_class.find(current: regular_configuration_dir, home: home_dir)
|
59
|
-
expect(found).to eq(regular_configuration_file)
|
60
|
-
end
|
61
|
-
|
62
|
-
it 'returns nil when there are no files to find' do
|
63
|
-
skip_if_a_config_in_tempdir
|
64
|
-
|
65
|
-
Dir.mktmpdir do |tempdir|
|
66
|
-
current = Pathname.new(tempdir)
|
67
|
-
home = Pathname.new(tempdir)
|
68
|
-
|
69
|
-
found = described_class.find(current: current, home: home)
|
70
|
-
|
71
|
-
expect(found).to be_nil
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
it 'does not traverse up from :home' do
|
76
|
-
skip_if_a_config_in_tempdir
|
77
|
-
|
78
|
-
Dir.mktmpdir do |tempdir|
|
79
|
-
current = Pathname.new(tempdir)
|
80
|
-
home = SAMPLES_DIR.join('no_config_file')
|
81
|
-
|
82
|
-
found = described_class.find(current: current, home: home)
|
83
|
-
|
84
|
-
expect(found).to be_nil
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
it 'works with paths that need escaping' do
|
89
|
-
Dir.mktmpdir("ma\ngic d*r") do |tempdir|
|
90
|
-
config = Pathname.new("#{tempdir}/.reek.yml")
|
91
|
-
subdir = Pathname.new("#{tempdir}/ma\ngic subd*r")
|
92
|
-
FileUtils.touch config
|
93
|
-
FileUtils.mkdir subdir
|
94
|
-
found = described_class.find(current: subdir)
|
95
|
-
expect(found).to eq(config)
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
describe '.load_from_file' do
|
101
|
-
let(:sample_configuration_loaded) do
|
102
|
-
{
|
103
|
-
Reek::DETECTORS_KEY => {
|
104
|
-
'UncommunicativeVariableName' => { 'enabled' => false },
|
105
|
-
'UncommunicativeMethodName' => { 'enabled' => false }
|
106
|
-
}
|
107
|
-
}
|
108
|
-
end
|
109
|
-
|
110
|
-
it 'loads the configuration from given file' do
|
111
|
-
configuration = described_class.load_from_file(CONFIGURATION_DIR.join('full_mask.reek'))
|
112
|
-
expect(configuration).to eq(sample_configuration_loaded)
|
113
|
-
end
|
114
|
-
|
115
|
-
it 'raises an error if it can not find the given file' do
|
116
|
-
Dir.mktmpdir do |tempdir|
|
117
|
-
path = Pathname.new(tempdir).join('does_not_exist.reek')
|
118
|
-
expect { described_class.load_from_file(path) }.
|
119
|
-
to raise_error(Reek::Errors::ConfigFileError, /Invalid configuration file/)
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
|
-
context 'with exclude, accept and reject settings' do
|
124
|
-
context 'when configuring top level detectors' do
|
125
|
-
let(:configuration) do
|
126
|
-
described_class.
|
127
|
-
load_from_file(CONFIGURATION_DIR.join('accepts_rejects_and_excludes_for_detectors.reek.yml')).
|
128
|
-
fetch(Reek::DETECTORS_KEY)
|
129
|
-
end
|
130
|
-
|
131
|
-
let(:expected) do
|
132
|
-
{
|
133
|
-
'UnusedPrivateMethod' => { 'exclude' => [/exclude regexp/] },
|
134
|
-
'UncommunicativeMethodName' => { 'reject' => ['reject name'],
|
135
|
-
'accept' => ['accept name'] },
|
136
|
-
'UncommunicativeModuleName' => { 'reject' => ['reject name 1', 'reject name 2'],
|
137
|
-
'accept' => ['accept name 1', 'accept name 2'] },
|
138
|
-
'UncommunicativeParameterName' => { 'reject' => ['reject name', /reject regexp/],
|
139
|
-
'accept' => ['accept name', /accept regexp/] },
|
140
|
-
'UncommunicativeVariableName' => { 'reject' => [/^reject regexp$/],
|
141
|
-
'accept' => [/accept(.*)regexp/] }
|
142
|
-
}
|
143
|
-
end
|
144
|
-
|
145
|
-
it 'converts marked strings to regexes' do
|
146
|
-
expect(configuration['UnusedPrivateMethod']).to eq(expected['UnusedPrivateMethod'])
|
147
|
-
end
|
148
|
-
|
149
|
-
it 'leaves regular single strings untouched' do
|
150
|
-
expect(configuration['UncommunicativeMethodName']).to eq(expected['UncommunicativeMethodName'])
|
151
|
-
end
|
152
|
-
|
153
|
-
it 'leaves regular multiple strings untouched' do
|
154
|
-
expect(configuration['UncommunicativeModuleName']).to eq(expected['UncommunicativeModuleName'])
|
155
|
-
end
|
156
|
-
|
157
|
-
it 'allows mixing of regular strings and marked strings' do
|
158
|
-
expect(configuration['UncommunicativeParameterName']).to eq(expected['UncommunicativeParameterName'])
|
159
|
-
end
|
160
|
-
|
161
|
-
it 'converts more complex marked strings correctly to regexes' do
|
162
|
-
expect(configuration['UncommunicativeVariableName']).to eq(expected['UncommunicativeVariableName'])
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
|
-
context 'when configuring directory directives' do
|
167
|
-
let(:directory_name) { 'app/controllers' }
|
168
|
-
let(:configuration) do
|
169
|
-
described_class.
|
170
|
-
load_from_file(CONFIGURATION_DIR.join('accepts_rejects_and_excludes_for_directory_directives.reek.yml')).
|
171
|
-
fetch(Reek::DIRECTORIES_KEY)
|
172
|
-
end
|
173
|
-
|
174
|
-
let(:expected) do
|
175
|
-
{
|
176
|
-
directory_name => {
|
177
|
-
'UnusedPrivateMethod' => { 'exclude' => [/exclude regexp/] },
|
178
|
-
'UncommunicativeMethodName' => { 'reject' => ['reject name'],
|
179
|
-
'accept' => ['accept name'] },
|
180
|
-
'UncommunicativeModuleName' => { 'reject' => ['reject name 1', 'reject name 2'],
|
181
|
-
'accept' => ['accept name 1', 'accept name 2'] },
|
182
|
-
'UncommunicativeParameterName' => { 'reject' => ['reject name', /reject regexp/],
|
183
|
-
'accept' => ['accept name', /accept regexp/] },
|
184
|
-
'UncommunicativeVariableName' => { 'reject' => [/^reject regexp$/],
|
185
|
-
'accept' => [/accept(.*)regexp/] }
|
186
|
-
}
|
187
|
-
}
|
188
|
-
end
|
189
|
-
|
190
|
-
it 'converts marked strings to regexes' do
|
191
|
-
expect(configuration[directory_name]['UnusedPrivateMethod']).
|
192
|
-
to eq(expected[directory_name]['UnusedPrivateMethod'])
|
193
|
-
end
|
194
|
-
|
195
|
-
it 'leaves regular single strings untouched' do
|
196
|
-
expect(configuration[directory_name]['UncommunicativeMethodName']).
|
197
|
-
to eq(expected[directory_name]['UncommunicativeMethodName'])
|
198
|
-
end
|
199
|
-
|
200
|
-
it 'leaves regular multiple strings untouched' do
|
201
|
-
expect(configuration[directory_name]['UncommunicativeModuleName']).
|
202
|
-
to eq(expected[directory_name]['UncommunicativeModuleName'])
|
203
|
-
end
|
204
|
-
|
205
|
-
it 'allows mixing of regular strings and marked strings' do
|
206
|
-
expect(configuration[directory_name]['UncommunicativeParameterName']).
|
207
|
-
to eq(expected[directory_name]['UncommunicativeParameterName'])
|
208
|
-
end
|
209
|
-
|
210
|
-
it 'converts more complex marked strings correctly to regexes' do
|
211
|
-
expect(configuration[directory_name]['UncommunicativeVariableName']).
|
212
|
-
to eq(expected[directory_name]['UncommunicativeVariableName'])
|
213
|
-
end
|
214
|
-
end
|
215
|
-
end
|
216
|
-
|
217
|
-
it 'returns blank hash when no file is found' do
|
218
|
-
config = described_class.load_from_file(nil)
|
219
|
-
|
220
|
-
expect(config).to eq({})
|
221
|
-
end
|
222
|
-
end
|
223
|
-
|
224
|
-
private
|
225
|
-
|
226
|
-
def skip_if_a_config_in_tempdir
|
227
|
-
found = described_class.find(current: Pathname.new(Dir.tmpdir))
|
228
|
-
skip "skipped: #{found} exists and would fail this test" if found
|
229
|
-
end
|
230
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
require_relative '../../spec_helper'
|
2
|
-
require_lib 'reek/configuration/default_directive'
|
3
|
-
|
4
|
-
RSpec.describe Reek::Configuration::DefaultDirective do
|
5
|
-
describe '#add' do
|
6
|
-
let(:directives) { {}.extend(described_class) }
|
7
|
-
|
8
|
-
it 'adds a smell configuration' do
|
9
|
-
directives.add(UncommunicativeVariableName: { enabled: false })
|
10
|
-
expect(directives).to eq(Reek::SmellDetectors::UncommunicativeVariableName => { enabled: false })
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
@@ -1,122 +0,0 @@
|
|
1
|
-
require_relative '../../spec_helper'
|
2
|
-
require_lib 'reek/errors/config_file_error'
|
3
|
-
require_lib 'reek/configuration/directory_directives'
|
4
|
-
|
5
|
-
RSpec.describe Reek::Configuration::DirectoryDirectives do
|
6
|
-
describe '#directive_for' do
|
7
|
-
let(:baz_config) { { Reek::SmellDetectors::IrresponsibleModule => { enabled: false } } }
|
8
|
-
let(:bang_config) { { Reek::SmellDetectors::Attribute => { enabled: true } } }
|
9
|
-
let(:directives) do
|
10
|
-
{
|
11
|
-
Pathname.new('foo/bar/baz') => baz_config,
|
12
|
-
Pathname.new('foo/bar/bang') => bang_config
|
13
|
-
}.extend(described_class)
|
14
|
-
end
|
15
|
-
let(:source_via) { 'foo/bar/bang/dummy.rb' }
|
16
|
-
|
17
|
-
context 'when our source is in a directory for which we have a directive' do
|
18
|
-
it 'returns the corresponding directive' do
|
19
|
-
expect(directives.directive_for(source_via)).to eq(bang_config)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
context 'when our source is not in a directory for which we have a directive' do
|
24
|
-
it 'returns nil' do
|
25
|
-
expect(directives.directive_for('does/not/exist')).to eq(nil)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
describe '#add' do
|
31
|
-
let(:directives) do
|
32
|
-
{}.extend(described_class)
|
33
|
-
end
|
34
|
-
|
35
|
-
context 'when one of given paths is a file' do
|
36
|
-
let(:file_as_path) { SAMPLES_DIR.join('smelly_source').join('inline.rb') }
|
37
|
-
|
38
|
-
it 'raises an error' do
|
39
|
-
expect { directives.add(file_as_path => nil) }.to raise_error(Reek::Errors::ConfigFileError)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
describe '#best_match_for' do
|
45
|
-
let(:directives) do
|
46
|
-
{
|
47
|
-
Pathname.new('foo/bar/baz') => {},
|
48
|
-
Pathname.new('foo/bar') => {},
|
49
|
-
Pathname.new('bar/boo') => {},
|
50
|
-
Pathname.new('bar/**/test/**') => {},
|
51
|
-
Pathname.new('bar/**/spec/*') => {},
|
52
|
-
Pathname.new('bar/**/.spec/*') => {}
|
53
|
-
}.extend(described_class)
|
54
|
-
end
|
55
|
-
|
56
|
-
it 'returns the corresponding directory when source_base_dir is a leaf' do
|
57
|
-
source_base_dir = 'foo/bar/baz/bang'
|
58
|
-
hit = directives.send :best_match_for, source_base_dir
|
59
|
-
expect(hit.to_s).to eq('foo/bar/baz')
|
60
|
-
end
|
61
|
-
|
62
|
-
it 'returns the corresponding directory when source_base_dir is in the middle of the tree' do
|
63
|
-
source_base_dir = 'foo/bar'
|
64
|
-
hit = directives.send :best_match_for, source_base_dir
|
65
|
-
expect(hit.to_s).to eq('foo/bar')
|
66
|
-
end
|
67
|
-
|
68
|
-
it 'returns the corresponding directory when source_base_dir matches the Dir.glob like pattern' do
|
69
|
-
source_base_dir = 'bar/something/test'
|
70
|
-
hit = directives.send :best_match_for, source_base_dir
|
71
|
-
expect(hit.to_s).to eq('bar/**/test/**')
|
72
|
-
end
|
73
|
-
|
74
|
-
it 'returns the corresponding directory when source_base_dir is a leaf of the Dir.glob like pattern' do
|
75
|
-
source_base_dir = 'bar/something/test/with/some/subdirectory'
|
76
|
-
hit = directives.send :best_match_for, source_base_dir
|
77
|
-
expect(hit.to_s).to eq('bar/**/test/**')
|
78
|
-
end
|
79
|
-
|
80
|
-
it 'returns the corresponding directory when source_base_dir is a direct leaf of the Dir.glob like pattern' do
|
81
|
-
source_base_dir = 'bar/something/spec/direct'
|
82
|
-
hit = directives.send :best_match_for, source_base_dir
|
83
|
-
expect(hit.to_s).to eq('bar/**/spec/*')
|
84
|
-
end
|
85
|
-
|
86
|
-
it 'returns the corresponding directory when source_base_dir contains a . character' do
|
87
|
-
source_base_dir = 'bar/something/.spec/direct'
|
88
|
-
hit = directives.send :best_match_for, source_base_dir
|
89
|
-
expect(hit.to_s).to eq('bar/**/.spec/*')
|
90
|
-
end
|
91
|
-
|
92
|
-
it 'returns the corresponding directory when source_base_dir is an absolute_path' do
|
93
|
-
source_base_dir = Pathname.new('foo/bar').expand_path
|
94
|
-
hit = directives.send :best_match_for, source_base_dir
|
95
|
-
expect(hit.to_s).to eq('foo/bar')
|
96
|
-
end
|
97
|
-
|
98
|
-
it 'does not match an arbitrary directory when source_base_dir contains a character that could match the .' do
|
99
|
-
source_base_dir = 'bar/something/aspec/direct'
|
100
|
-
hit = directives.send :best_match_for, source_base_dir
|
101
|
-
expect(hit.to_s).to eq('')
|
102
|
-
end
|
103
|
-
|
104
|
-
it 'returns nil when source_base_dir is a not direct leaf of the Dir.glob one-folder pattern' do
|
105
|
-
source_base_dir = 'bar/something/spec/with/some/subdirectory'
|
106
|
-
hit = directives.send :best_match_for, source_base_dir
|
107
|
-
expect(hit).to be_nil
|
108
|
-
end
|
109
|
-
|
110
|
-
it 'returns nil we are on top of the tree and all other directories are below' do
|
111
|
-
source_base_dir = 'foo'
|
112
|
-
hit = directives.send :best_match_for, source_base_dir
|
113
|
-
expect(hit).to be_nil
|
114
|
-
end
|
115
|
-
|
116
|
-
it 'returns nil when source_base_dir is not part of any directory directive at all' do
|
117
|
-
source_base_dir = 'non/existent'
|
118
|
-
hit = directives.send :best_match_for, source_base_dir
|
119
|
-
expect(hit).to be_nil
|
120
|
-
end
|
121
|
-
end
|
122
|
-
end
|