reek 6.0.2 → 6.2.0
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/.github/dependabot.yml +13 -0
- data/.github/workflows/ruby.yml +57 -0
- data/.rubocop.yml +6 -12
- data/.rubocop_todo.yml +6 -4
- data/CHANGELOG.md +95 -0
- data/CONTRIBUTING.md +10 -10
- data/Dockerfile +1 -1
- data/Gemfile +8 -7
- data/README.md +29 -29
- data/bin/code_climate_reek +56 -8
- data/lib/reek/ast/ast_node_class_map.rb +1 -1
- data/lib/reek/ast/node.rb +1 -1
- data/lib/reek/ast/sexp_extensions/arguments.rb +20 -0
- data/lib/reek/ast/sexp_extensions/case.rb +1 -1
- data/lib/reek/ast/sexp_extensions/if.rb +1 -1
- data/lib/reek/ast/sexp_extensions/send.rb +22 -7
- data/lib/reek/cli/command/todo_list_command.rb +3 -3
- data/lib/reek/cli/options.rb +6 -6
- data/lib/reek/{report/code_climate → code_climate}/code_climate_configuration.rb +1 -1
- data/lib/reek/{report/code_climate → code_climate}/code_climate_configuration.yml +41 -41
- data/lib/reek/{report/code_climate → code_climate}/code_climate_fingerprint.rb +2 -2
- data/lib/reek/{report/code_climate → code_climate}/code_climate_formatter.rb +2 -4
- data/lib/reek/{report/code_climate → code_climate}/code_climate_report.rb +3 -3
- data/lib/reek/code_comment.rb +25 -20
- data/lib/reek/configuration/app_configuration.rb +5 -5
- data/lib/reek/configuration/configuration_converter.rb +1 -1
- data/lib/reek/configuration/configuration_file_finder.rb +5 -4
- data/lib/reek/configuration/default_directive.rb +1 -1
- data/lib/reek/configuration/directory_directives.rb +1 -1
- data/lib/reek/configuration/excluded_paths.rb +3 -2
- data/lib/reek/configuration/schema.rb +177 -0
- data/lib/reek/configuration/schema_validator.rb +12 -13
- data/lib/reek/context/attribute_context.rb +1 -1
- data/lib/reek/context/code_context.rb +1 -1
- data/lib/reek/context/method_context.rb +1 -1
- data/lib/reek/context/module_context.rb +4 -0
- data/lib/reek/context/refinement_context.rb +16 -0
- data/lib/reek/context/send_context.rb +7 -1
- data/lib/reek/context_builder.rb +17 -3
- data/lib/reek/documentation_link.rb +3 -5
- data/lib/reek/errors/bad_detector_configuration_key_in_comment_error.rb +2 -2
- data/lib/reek/errors/bad_detector_in_comment_error.rb +2 -2
- data/lib/reek/errors/encoding_error.rb +1 -1
- data/lib/reek/errors/garbage_detector_configuration_in_comment_error.rb +2 -2
- data/lib/reek/errors/incomprehensible_source_error.rb +1 -1
- data/lib/reek/errors/legacy_comment_separator_error.rb +2 -2
- data/lib/reek/errors/syntax_error.rb +1 -1
- data/lib/reek/rake/task.rb +5 -5
- data/lib/reek/smell_detectors/base_detector.rb +1 -1
- data/lib/reek/smell_detectors/class_variable.rb +2 -2
- data/lib/reek/smell_detectors/control_parameter_helpers/candidate.rb +6 -6
- data/lib/reek/smell_detectors/control_parameter_helpers/control_parameter_finder.rb +1 -1
- data/lib/reek/smell_detectors/duplicate_method_call.rb +5 -5
- data/lib/reek/smell_detectors/instance_variable_assumption.rb +8 -8
- data/lib/reek/smell_detectors/nested_iterators.rb +4 -3
- data/lib/reek/smell_detectors/unused_private_method.rb +3 -2
- data/lib/reek/smell_warning.rb +1 -1
- data/lib/reek/source/source_locator.rb +1 -3
- data/lib/reek/spec/should_reek_of.rb +11 -9
- data/lib/reek/spec.rb +1 -1
- data/lib/reek/version.rb +2 -2
- data/reek.gemspec +29 -25
- metadata +37 -250
- data/.travis.yml +0 -40
- 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 -37
- 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/lib/reek/configuration/schema.yml +0 -210
- 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 -16
- 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 -293
- 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
- /data/lib/reek/{report/code_climate.rb → code_climate.rb} +0 -0
|
@@ -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
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
require_relative '../../spec_helper'
|
|
2
|
-
require_lib 'reek/errors/config_file_error'
|
|
3
|
-
require_lib 'reek/configuration/excluded_paths'
|
|
4
|
-
|
|
5
|
-
RSpec.describe Reek::Configuration::ExcludedPaths do
|
|
6
|
-
describe '#add' do
|
|
7
|
-
let(:exclusions) { [].extend(described_class) }
|
|
8
|
-
let(:paths) { ['smelly/sources'] }
|
|
9
|
-
let(:expected_exclude_paths) { [Pathname('smelly/sources')] }
|
|
10
|
-
|
|
11
|
-
it 'adds the given paths as Pathname' do
|
|
12
|
-
exclusions.add(paths)
|
|
13
|
-
expect(exclusions).to eq expected_exclude_paths
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
end
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
require_relative '../../spec_helper'
|
|
2
|
-
require_lib 'reek/configuration/rake_task_converter'
|
|
3
|
-
|
|
4
|
-
RSpec.describe Reek::Configuration::RakeTaskConverter do
|
|
5
|
-
describe 'convert' do
|
|
6
|
-
let(:configuration_for_smell_detector) do
|
|
7
|
-
{
|
|
8
|
-
'exclude' => [/Klass#foobar$/, /^Klass#omg$/],
|
|
9
|
-
'reject' => [/^[a-z]$/, /[0-9]$/, /[A-Z]/],
|
|
10
|
-
'accept' => [/^_$/]
|
|
11
|
-
}
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
let(:expected_exclude) { ['/Klass#foobar$/', '/^Klass#omg$/'] }
|
|
15
|
-
let(:expected_reject) { ['/^[a-z]$/', '/[0-9]$/', '/[A-Z]/'] }
|
|
16
|
-
let(:expected_accept) { ['/^_$/'] }
|
|
17
|
-
|
|
18
|
-
it 'converts exclude regexes to strings' do
|
|
19
|
-
converted_configuration = described_class.convert configuration_for_smell_detector
|
|
20
|
-
expect(converted_configuration['exclude']).to eq(expected_exclude)
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
it 'converts reject regexes to strings' do
|
|
24
|
-
converted_configuration = described_class.convert configuration_for_smell_detector
|
|
25
|
-
expect(converted_configuration['reject']).to eq(expected_reject)
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
it 'converts accept regexes to strings' do
|
|
29
|
-
converted_configuration = described_class.convert configuration_for_smell_detector
|
|
30
|
-
expect(converted_configuration['accept']).to eq(expected_accept)
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
end
|
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
require_relative '../../spec_helper'
|
|
2
|
-
require_lib 'reek/configuration/schema_validator'
|
|
3
|
-
require_lib 'reek/errors/config_file_error'
|
|
4
|
-
|
|
5
|
-
RSpec.describe Reek::Configuration::SchemaValidator do
|
|
6
|
-
describe 'validate' do
|
|
7
|
-
subject(:validator) { described_class.new configuration }
|
|
8
|
-
|
|
9
|
-
context 'when configuration is valid' do
|
|
10
|
-
let(:configuration) do
|
|
11
|
-
{
|
|
12
|
-
Reek::DETECTORS_KEY => {
|
|
13
|
-
'UncommunicativeVariableName' => { 'enabled' => false },
|
|
14
|
-
'UncommunicativeMethodName' => { 'enabled' => false }
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
it 'returns nil' do
|
|
20
|
-
expect(validator.validate).to eq(nil)
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
context 'when detector is invalid' do
|
|
25
|
-
let(:configuration) do
|
|
26
|
-
{
|
|
27
|
-
Reek::DETECTORS_KEY => {
|
|
28
|
-
'DoesNotExist' => { 'enabled' => false }
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
it 'raises an error' do
|
|
34
|
-
message = %r{\[/detectors/DoesNotExist\] key 'DoesNotExist:' is undefined}
|
|
35
|
-
expect { validator.validate }.to raise_error(Reek::Errors::ConfigFileError, message)
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
context 'when `enabled` has a non-boolean value' do
|
|
40
|
-
let(:configuration) do
|
|
41
|
-
{
|
|
42
|
-
Reek::DETECTORS_KEY => {
|
|
43
|
-
'FeatureEnvy' => { 'enabled' => 'foo' }
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
it 'raises an error' do
|
|
49
|
-
message = %r{\[/detectors/FeatureEnvy/enabled\] 'foo': not a boolean}
|
|
50
|
-
expect { validator.validate }.to raise_error(Reek::Errors::ConfigFileError, message)
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
context 'when detector has an unknown option' do
|
|
55
|
-
let(:configuration) do
|
|
56
|
-
{
|
|
57
|
-
Reek::DETECTORS_KEY => {
|
|
58
|
-
'DataClump' => { 'does_not_exist' => 42 }
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
it 'raises an error' do
|
|
64
|
-
message = %r{\[/detectors/DataClump/does_not_exist\] key 'does_not_exist:' is undefined}
|
|
65
|
-
expect { validator.validate }.to raise_error(Reek::Errors::ConfigFileError, message)
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
context 'when `exclude`, `reject` and `accept`' do
|
|
70
|
-
%w(exclude reject accept).each do |attribute|
|
|
71
|
-
context 'when a scalar' do
|
|
72
|
-
let(:configuration) do
|
|
73
|
-
{
|
|
74
|
-
Reek::DETECTORS_KEY => {
|
|
75
|
-
'UncommunicativeMethodName' => { attribute => 42 }
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
it 'raises an error' do
|
|
81
|
-
message = %r{\[/detectors/UncommunicativeMethodName/#{attribute}\] '42': not a sequence}
|
|
82
|
-
expect { validator.validate }.to raise_error(Reek::Errors::ConfigFileError, message)
|
|
83
|
-
end
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
context 'when types are mixed' do
|
|
87
|
-
let(:configuration) do
|
|
88
|
-
{
|
|
89
|
-
Reek::DETECTORS_KEY => {
|
|
90
|
-
'UncommunicativeMethodName' => { attribute => [42, 'foo'] }
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
it 'raises an error' do
|
|
96
|
-
message = %r{\[/detectors/UncommunicativeMethodName/#{attribute}/0\] '42': not a string}
|
|
97
|
-
expect { validator.validate }.to raise_error(Reek::Errors::ConfigFileError, message)
|
|
98
|
-
end
|
|
99
|
-
end
|
|
100
|
-
end
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
context 'when `exclude_paths` is a scalar' do
|
|
104
|
-
let(:configuration) do
|
|
105
|
-
{
|
|
106
|
-
Reek::EXCLUDE_PATHS_KEY => 42
|
|
107
|
-
}
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
it 'raises an error' do
|
|
111
|
-
message = %r{\[/exclude_paths\] '42': not a sequence}
|
|
112
|
-
expect { validator.validate }.to raise_error(Reek::Errors::ConfigFileError, message)
|
|
113
|
-
end
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
context 'when `exclude_paths` mixes types' do
|
|
117
|
-
let(:configuration) do
|
|
118
|
-
{
|
|
119
|
-
Reek::EXCLUDE_PATHS_KEY => [42, 'foo']
|
|
120
|
-
}
|
|
121
|
-
end
|
|
122
|
-
|
|
123
|
-
it 'raises an error' do
|
|
124
|
-
message = %r{\[/exclude_paths/0\] '42': not a string}
|
|
125
|
-
expect { validator.validate }.to raise_error(Reek::Errors::ConfigFileError, message)
|
|
126
|
-
end
|
|
127
|
-
end
|
|
128
|
-
|
|
129
|
-
context 'with directory directives' do
|
|
130
|
-
context 'when bad detector' do
|
|
131
|
-
let(:configuration) do
|
|
132
|
-
{
|
|
133
|
-
Reek::DIRECTORIES_KEY => {
|
|
134
|
-
'web_app/app/helpers' => {
|
|
135
|
-
'Bar' => { 'enabled' => false }
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
it 'raises an error' do
|
|
142
|
-
message = %r{\[/directories/web_app/app/helpers/Bar\] key 'Bar:' is undefined}
|
|
143
|
-
expect { validator.validate }.to raise_error(Reek::Errors::ConfigFileError, message)
|
|
144
|
-
end
|
|
145
|
-
end
|
|
146
|
-
|
|
147
|
-
context 'when unknown attribute' do
|
|
148
|
-
let(:configuration) do
|
|
149
|
-
{
|
|
150
|
-
Reek::DIRECTORIES_KEY => {
|
|
151
|
-
'web_app/app/controllers' => {
|
|
152
|
-
'NestedIterators' => { 'foo' => false }
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
end
|
|
157
|
-
|
|
158
|
-
it 'raises an error' do
|
|
159
|
-
message = %r{\[/directories/web_app/app/controllers/NestedIterators/foo\] key 'foo:' is undefined}
|
|
160
|
-
expect { validator.validate }.to raise_error(Reek::Errors::ConfigFileError, message)
|
|
161
|
-
end
|
|
162
|
-
end
|
|
163
|
-
end
|
|
164
|
-
end
|
|
165
|
-
end
|