reek 3.2.1 → 3.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/Rakefile +0 -1
- data/config/defaults.reek +1 -1
- data/features/samples.feature +17 -16
- data/lib/reek.rb +0 -1
- data/lib/reek/ast/ast_node_class_map.rb +5 -1
- data/lib/reek/ast/node.rb +10 -3
- data/lib/reek/ast/object_refs.rb +11 -5
- data/lib/reek/ast/reference_collector.rb +6 -2
- data/lib/reek/ast/sexp_extensions.rb +42 -1
- data/lib/reek/ast/sexp_formatter.rb +2 -1
- data/lib/reek/cli/application.rb +12 -9
- data/lib/reek/cli/command.rb +6 -0
- data/lib/reek/cli/input.rb +4 -4
- data/lib/reek/cli/option_interpreter.rb +11 -7
- data/lib/reek/cli/options.rb +42 -40
- data/lib/reek/cli/reek_command.rb +3 -3
- data/lib/reek/cli/silencer.rb +12 -3
- data/lib/reek/cli/warning_collector.rb +8 -3
- data/lib/reek/code_comment.rb +6 -1
- data/lib/reek/configuration/app_configuration.rb +65 -100
- data/lib/reek/configuration/configuration_file_finder.rb +4 -13
- data/lib/reek/configuration/configuration_validator.rb +35 -0
- data/lib/reek/configuration/default_directive.rb +12 -0
- data/lib/reek/configuration/directory_directives.rb +54 -0
- data/lib/reek/configuration/excluded_paths.rb +18 -0
- data/lib/reek/context/code_context.rb +19 -17
- data/lib/reek/examiner.rb +9 -7
- data/lib/reek/rake/task.rb +12 -22
- data/lib/reek/report/formatter.rb +6 -1
- data/lib/reek/report/report.rb +22 -13
- data/lib/reek/smells/attribute.rb +6 -53
- data/lib/reek/smells/control_parameter.rb +21 -13
- data/lib/reek/smells/data_clump.rb +17 -9
- data/lib/reek/smells/duplicate_method_call.rb +12 -6
- data/lib/reek/smells/long_parameter_list.rb +2 -2
- data/lib/reek/smells/long_yield_list.rb +4 -4
- data/lib/reek/smells/nested_iterators.rb +4 -2
- data/lib/reek/smells/nil_check.rb +6 -2
- data/lib/reek/smells/repeated_conditional.rb +3 -3
- data/lib/reek/smells/smell_configuration.rb +17 -7
- data/lib/reek/smells/smell_detector.rb +24 -11
- data/lib/reek/smells/smell_repository.rb +1 -1
- data/lib/reek/smells/smell_warning.rb +6 -6
- data/lib/reek/smells/too_many_instance_variables.rb +2 -2
- data/lib/reek/smells/too_many_methods.rb +4 -4
- data/lib/reek/smells/too_many_statements.rb +4 -4
- data/lib/reek/smells/uncommunicative_method_name.rb +5 -5
- data/lib/reek/smells/uncommunicative_module_name.rb +6 -6
- data/lib/reek/smells/uncommunicative_parameter_name.rb +8 -4
- data/lib/reek/smells/uncommunicative_variable_name.rb +9 -5
- data/lib/reek/smells/utility_function.rb +1 -1
- data/lib/reek/source/source_code.rb +5 -1
- data/lib/reek/source/source_locator.rb +3 -2
- data/lib/reek/spec.rb +3 -3
- data/lib/reek/spec/should_reek.rb +10 -5
- data/lib/reek/spec/should_reek_of.rb +9 -6
- data/lib/reek/spec/should_reek_only_of.rb +13 -8
- data/lib/reek/tree_dresser.rb +6 -2
- data/lib/reek/tree_walker.rb +40 -32
- data/lib/reek/version.rb +1 -1
- data/reek.gemspec +1 -1
- data/spec/reek/ast/node_spec.rb +1 -2
- data/spec/reek/ast/object_refs_spec.rb +40 -42
- data/spec/reek/ast/sexp_extensions_spec.rb +98 -104
- data/spec/reek/cli/warning_collector_spec.rb +8 -12
- data/spec/reek/code_comment_spec.rb +3 -5
- data/spec/reek/configuration/app_configuration_spec.rb +43 -57
- data/spec/reek/configuration/configuration_file_finder_spec.rb +5 -7
- data/spec/reek/configuration/default_directive_spec.rb +13 -0
- data/spec/reek/configuration/directory_directives_spec.rb +89 -0
- data/spec/reek/configuration/excluded_paths_spec.rb +30 -0
- data/spec/reek/context/code_context_spec.rb +63 -62
- data/spec/reek/context/method_context_spec.rb +8 -12
- data/spec/reek/context/module_context_spec.rb +1 -1
- data/spec/reek/context/root_context_spec.rb +3 -7
- data/spec/reek/examiner_spec.rb +14 -25
- data/spec/reek/smells/attribute_spec.rb +2 -4
- data/spec/reek/smells/boolean_parameter_spec.rb +5 -7
- data/spec/reek/smells/class_variable_spec.rb +29 -44
- data/spec/reek/smells/control_parameter_spec.rb +7 -9
- data/spec/reek/smells/data_clump_spec.rb +25 -32
- data/spec/reek/smells/duplicate_method_call_spec.rb +8 -7
- data/spec/reek/smells/feature_envy_spec.rb +16 -17
- data/spec/reek/smells/irresponsible_module_spec.rb +2 -4
- data/spec/reek/smells/long_parameter_list_spec.rb +6 -9
- data/spec/reek/smells/long_yield_list_spec.rb +6 -9
- data/spec/reek/smells/nested_iterators_spec.rb +14 -16
- data/spec/reek/smells/repeated_conditional_spec.rb +25 -25
- data/spec/reek/smells/smell_configuration_spec.rb +32 -27
- data/spec/reek/smells/smell_detector_shared.rb +12 -13
- data/spec/reek/smells/smell_warning_spec.rb +54 -58
- data/spec/reek/smells/too_many_instance_variables_spec.rb +9 -9
- data/spec/reek/smells/too_many_methods_spec.rb +13 -14
- data/spec/reek/smells/too_many_statements_spec.rb +8 -10
- data/spec/reek/smells/uncommunicative_method_name_spec.rb +8 -9
- data/spec/reek/smells/uncommunicative_module_name_spec.rb +12 -13
- data/spec/reek/smells/uncommunicative_parameter_name_spec.rb +7 -10
- data/spec/reek/smells/uncommunicative_variable_name_spec.rb +16 -20
- data/spec/reek/smells/utility_function_spec.rb +11 -15
- data/spec/reek/source/source_code_spec.rb +6 -11
- data/spec/reek/spec/should_reek_of_spec.rb +19 -30
- data/spec/reek/spec/should_reek_only_of_spec.rb +28 -34
- data/spec/reek/tree_walker_spec.rb +14 -2
- data/spec/spec_helper.rb +2 -3
- data/tasks/test.rake +0 -5
- metadata +10 -6
- data/docs/Configuration-Files.md +0 -49
- data/spec/gem/updates_spec.rb +0 -25
- data/spec/gem/yard_spec.rb +0 -11
- data/spec/reek/smells/behaves_like_variable_detector.rb +0 -39
@@ -13,11 +13,11 @@ module Reek
|
|
13
13
|
|
14
14
|
extend Forwardable
|
15
15
|
|
16
|
-
def_delegators
|
16
|
+
def_delegators :options, :smells_to_detect
|
17
17
|
|
18
18
|
def initialize(options)
|
19
19
|
@options = options
|
20
|
-
@argv =
|
20
|
+
@argv = options.argv
|
21
21
|
end
|
22
22
|
|
23
23
|
def reporter
|
@@ -30,7 +30,7 @@ module Reek
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def report_class
|
33
|
-
Report.report_class(
|
33
|
+
Report.report_class(options.report_format)
|
34
34
|
end
|
35
35
|
|
36
36
|
def warning_formatter
|
@@ -38,20 +38,24 @@ module Reek
|
|
38
38
|
end
|
39
39
|
|
40
40
|
def warning_formatter_class
|
41
|
-
Report.warning_formatter_class(
|
41
|
+
Report.warning_formatter_class(options.show_links ? :wiki_links : :simple)
|
42
42
|
end
|
43
43
|
|
44
44
|
def location_formatter
|
45
|
-
Report.location_formatter(
|
45
|
+
Report.location_formatter(options.location_format)
|
46
46
|
end
|
47
47
|
|
48
48
|
def heading_formatter
|
49
|
-
Report.heading_formatter(
|
49
|
+
Report.heading_formatter(options.show_empty ? :verbose : :quiet)
|
50
50
|
end
|
51
51
|
|
52
52
|
def sort_by_issue_count
|
53
|
-
|
53
|
+
options.sorting == :smelliness
|
54
54
|
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
private_attr_reader :argv, :options
|
55
59
|
end
|
56
60
|
end
|
57
61
|
end
|
data/lib/reek/cli/options.rb
CHANGED
@@ -23,14 +23,16 @@ module Reek
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def parse
|
26
|
-
|
27
|
-
|
28
|
-
Rainbow.enabled =
|
29
|
-
|
26
|
+
parser.parse!(argv)
|
27
|
+
options.argv = argv
|
28
|
+
Rainbow.enabled = options.colored
|
29
|
+
options
|
30
30
|
end
|
31
31
|
|
32
32
|
private
|
33
33
|
|
34
|
+
private_attr_reader :argv, :options, :parser
|
35
|
+
|
34
36
|
def color_support?
|
35
37
|
$stdout.tty?
|
36
38
|
end
|
@@ -44,8 +46,8 @@ module Reek
|
|
44
46
|
end
|
45
47
|
|
46
48
|
def set_banner
|
47
|
-
program_name =
|
48
|
-
|
49
|
+
program_name = parser.program_name
|
50
|
+
parser.banner = <<-EOB.gsub(/^[ ]+/, '')
|
49
51
|
Usage: #{program_name} [options] [files]
|
50
52
|
|
51
53
|
Examples:
|
@@ -60,29 +62,29 @@ module Reek
|
|
60
62
|
end
|
61
63
|
|
62
64
|
def set_alternative_formatter_options
|
63
|
-
|
64
|
-
|
65
|
+
parser.separator "\nReport format:"
|
66
|
+
parser.on(
|
65
67
|
'-f', '--format FORMAT', [:html, :text, :yaml, :json, :xml],
|
66
68
|
'Report smells in the given format:',
|
67
69
|
' html', ' text (default)', ' yaml', ' json', ' xml'
|
68
70
|
) do |opt|
|
69
|
-
|
71
|
+
options.report_format = opt
|
70
72
|
end
|
71
73
|
end
|
72
74
|
|
73
75
|
def set_configuration_options
|
74
|
-
|
75
|
-
|
76
|
+
parser.separator 'Configuration:'
|
77
|
+
parser.on('-c', '--config FILE', 'Read configuration options from FILE') do |file|
|
76
78
|
raise ArgumentError, "Config file #{file} doesn't exist" unless File.exist?(file)
|
77
|
-
|
79
|
+
options.config_file = Pathname.new(file)
|
78
80
|
end
|
79
|
-
|
80
|
-
|
81
|
+
parser.on('--smell SMELL', 'Detect smell SMELL (default: all enabled smells)') do |smell|
|
82
|
+
options.smells_to_detect << smell
|
81
83
|
end
|
82
84
|
end
|
83
85
|
|
84
86
|
def set_report_formatting_options
|
85
|
-
|
87
|
+
parser.separator "\nText format options:"
|
86
88
|
set_up_color_option
|
87
89
|
set_up_verbosity_options
|
88
90
|
set_up_location_formatting_options
|
@@ -90,50 +92,50 @@ module Reek
|
|
90
92
|
end
|
91
93
|
|
92
94
|
def set_up_color_option
|
93
|
-
|
94
|
-
|
95
|
+
parser.on('--[no-]color', 'Use colors for the output (default: true)') do |opt|
|
96
|
+
options.colored = opt
|
95
97
|
end
|
96
98
|
end
|
97
99
|
|
98
100
|
def set_up_verbosity_options
|
99
|
-
|
100
|
-
|
101
|
-
|
101
|
+
parser.on('-V', '--[no-]empty-headings',
|
102
|
+
'Show headings for smell-free source files (default: false)') do |show_empty|
|
103
|
+
options.show_empty = show_empty
|
102
104
|
end
|
103
|
-
|
104
|
-
|
105
|
-
|
105
|
+
parser.on('-U', '--[no-]wiki-links',
|
106
|
+
'Show link to related wiki page for each smell (default: false)') do |show_links|
|
107
|
+
options.show_links = show_links
|
106
108
|
end
|
107
109
|
end
|
108
110
|
|
109
111
|
def set_up_location_formatting_options
|
110
|
-
|
111
|
-
|
112
|
-
|
112
|
+
parser.on('-n', '--[no-]line-numbers',
|
113
|
+
'Show line numbers in the output (default: true)') do |show_numbers|
|
114
|
+
options.location_format = show_numbers ? :numbers : :plain
|
113
115
|
end
|
114
|
-
|
115
|
-
|
116
|
-
|
116
|
+
parser.on('-s', '--single-line',
|
117
|
+
'Show location in editor-compatible single-line-per-smell format') do
|
118
|
+
options.location_format = :single_line
|
117
119
|
end
|
118
120
|
end
|
119
121
|
|
120
122
|
def set_up_sorting_option
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
123
|
+
parser.on('--sort-by SORTING', [:smelliness, :none],
|
124
|
+
'Sort reported files by the given criterium:',
|
125
|
+
' smelliness ("smelliest" files first)',
|
126
|
+
' none (default - output in processing order)') do |sorting|
|
127
|
+
options.sorting = sorting
|
128
|
+
end
|
127
129
|
end
|
128
130
|
|
129
131
|
def set_utility_options
|
130
|
-
|
131
|
-
|
132
|
-
puts
|
132
|
+
parser.separator "\nUtility options:"
|
133
|
+
parser.on_tail('-h', '--help', 'Show this message') do
|
134
|
+
puts parser
|
133
135
|
exit
|
134
136
|
end
|
135
|
-
|
136
|
-
puts "#{
|
137
|
+
parser.on_tail('-v', '--version', 'Show version') do
|
138
|
+
puts "#{parser.program_name} #{Reek::Version::STRING}\n"
|
137
139
|
exit
|
138
140
|
end
|
139
141
|
end
|
@@ -10,7 +10,7 @@ module Reek
|
|
10
10
|
# @api private
|
11
11
|
class ReekCommand < Command
|
12
12
|
def execute(app)
|
13
|
-
|
13
|
+
options.sources.each do |source|
|
14
14
|
reporter.add_examiner Examiner.new(source, smell_names, configuration: app.configuration)
|
15
15
|
end
|
16
16
|
reporter.smells? ? app.report_smells : app.report_success
|
@@ -20,11 +20,11 @@ module Reek
|
|
20
20
|
private
|
21
21
|
|
22
22
|
def reporter
|
23
|
-
@reporter ||=
|
23
|
+
@reporter ||= options.reporter
|
24
24
|
end
|
25
25
|
|
26
26
|
def smell_names
|
27
|
-
@smell_names ||=
|
27
|
+
@smell_names ||= options.smells_to_detect
|
28
28
|
end
|
29
29
|
end
|
30
30
|
end
|
data/lib/reek/cli/silencer.rb
CHANGED
@@ -1,13 +1,22 @@
|
|
1
|
+
require 'stringio'
|
2
|
+
|
1
3
|
module Reek
|
2
4
|
module CLI
|
3
5
|
# CLI silencer
|
4
6
|
# @api private
|
5
7
|
module Silencer
|
6
|
-
|
7
|
-
|
8
|
-
|
8
|
+
module_function
|
9
|
+
|
10
|
+
def silently(stderr: nil, stdout: nil)
|
11
|
+
old_verbose = $VERBOSE
|
12
|
+
$VERBOSE = false
|
13
|
+
$stderr = StringIO.new if stderr
|
14
|
+
$stdout = StringIO.new if stdout
|
15
|
+
yield
|
9
16
|
ensure
|
10
17
|
$VERBOSE = old_verbose
|
18
|
+
$stderr = STDERR
|
19
|
+
$stdout = STDOUT
|
11
20
|
end
|
12
21
|
end
|
13
22
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'private_attr/everywhere'
|
1
2
|
require 'set'
|
2
3
|
|
3
4
|
module Reek
|
@@ -8,16 +9,20 @@ module Reek
|
|
8
9
|
# @api private
|
9
10
|
class WarningCollector
|
10
11
|
def initialize
|
11
|
-
@
|
12
|
+
@warnings_set = Set.new
|
12
13
|
end
|
13
14
|
|
14
15
|
def found_smell(warning)
|
15
|
-
|
16
|
+
warnings_set.add(warning)
|
16
17
|
end
|
17
18
|
|
18
19
|
def warnings
|
19
|
-
|
20
|
+
warnings_set.to_a.sort
|
20
21
|
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
private_attr_reader :warnings_set
|
21
26
|
end
|
22
27
|
end
|
23
28
|
end
|
data/lib/reek/code_comment.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'yaml'
|
2
|
+
require 'private_attr/everywhere'
|
2
3
|
|
3
4
|
module Reek
|
4
5
|
#
|
@@ -21,7 +22,7 @@ module Reek
|
|
21
22
|
end
|
22
23
|
|
23
24
|
def descriptive?
|
24
|
-
|
25
|
+
text.split(/\s+/).length >= 2
|
25
26
|
end
|
26
27
|
|
27
28
|
protected
|
@@ -32,5 +33,9 @@ module Reek
|
|
32
33
|
# TODO: extend this to all configs -------------------^
|
33
34
|
# TODO: extend to allow configuration of whole smell class, not just subclass
|
34
35
|
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
private_attr_reader :text
|
35
40
|
end
|
36
41
|
end
|
@@ -1,5 +1,10 @@
|
|
1
1
|
require 'pathname'
|
2
|
+
require 'private_attr/everywhere'
|
2
3
|
require_relative './configuration_file_finder'
|
4
|
+
require_relative './configuration_validator'
|
5
|
+
require_relative './default_directive'
|
6
|
+
require_relative './directory_directives'
|
7
|
+
require_relative './excluded_paths'
|
3
8
|
|
4
9
|
module Reek
|
5
10
|
# @api private
|
@@ -10,135 +15,95 @@ module Reek
|
|
10
15
|
#
|
11
16
|
# @api private
|
12
17
|
class AppConfiguration
|
18
|
+
include ConfigurationValidator
|
13
19
|
EXCLUDE_PATHS_KEY = 'exclude_paths'
|
14
|
-
|
20
|
+
private_attr_writer :directory_directives, :default_directive, :excluded_paths
|
15
21
|
|
16
|
-
#
|
22
|
+
# Instantiate a configuration via given path.
|
17
23
|
#
|
18
|
-
#
|
19
|
-
# IrresponsibleModule:
|
20
|
-
# enabled: false
|
21
|
-
# "app/helpers":
|
22
|
-
# UtilityFunction:
|
23
|
-
# enabled: false
|
24
|
-
# exclude_paths:
|
25
|
-
# - "app/controllers"
|
24
|
+
# @param path [Pathname] the path to the config file
|
26
25
|
#
|
27
|
-
#
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
26
|
+
# @return [AppConfiguration]
|
27
|
+
def self.from_path(path = nil)
|
28
|
+
allocate.tap do |instance|
|
29
|
+
instance.instance_eval { find_and_load(path: path) }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# Instantiate a configuration by passing everything in.
|
33
34
|
#
|
35
|
+
# @param map [Hash] can have the following 3 keys:
|
36
|
+
# 1.) directory_directives [Hash] for instance:
|
37
|
+
# { Pathname("spec/samples/three_clean_files/") =>
|
38
|
+
# { Reek::Smells::UtilityFunction => { "enabled" => false } } }
|
39
|
+
# 2.) default_directive [Hash] for instance:
|
40
|
+
# { Reek::Smells::IrresponsibleModule => { "enabled" => false } }
|
41
|
+
# 3.) excluded_paths [Array] for instance:
|
42
|
+
# [ Pathname('spec/samples/two_smelly_files') ]
|
34
43
|
#
|
35
|
-
# @
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
44
|
+
# @return [AppConfiguration]
|
45
|
+
def self.from_map(map = {})
|
46
|
+
allocate.tap do |instance|
|
47
|
+
instance.instance_eval do
|
48
|
+
self.directory_directives = map.fetch(:directory_directives, {}).
|
49
|
+
extend(DirectoryDirectives)
|
50
|
+
self.default_directive = map.fetch(:default_directive, {}).extend(DefaultDirective)
|
51
|
+
self.excluded_paths = map.fetch(:excluded_paths, []).extend(ExcludedPaths)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
46
55
|
|
47
|
-
|
56
|
+
def self.default
|
57
|
+
from_path nil
|
48
58
|
end
|
49
59
|
|
60
|
+
def self.new(*)
|
61
|
+
raise NotImplementedError,
|
62
|
+
'Calling `new` is not supported, please use one of the factory methods'
|
63
|
+
end
|
64
|
+
|
65
|
+
# Returns the directive for a given directory.
|
66
|
+
#
|
50
67
|
# @param source_via [String] - the source of the code inspected
|
68
|
+
#
|
51
69
|
# @return [Hash] the directory directive for the source or, if there is
|
52
70
|
# none, the default directive
|
53
71
|
def directive_for(source_via)
|
54
|
-
|
72
|
+
directory_directives.directive_for(source_via) || default_directive
|
73
|
+
end
|
74
|
+
|
75
|
+
def path_excluded?(path)
|
76
|
+
excluded_paths.include?(path)
|
55
77
|
end
|
56
78
|
|
57
79
|
private
|
58
80
|
|
59
|
-
|
81
|
+
def directory_directives
|
82
|
+
@directory_directives ||= {}.extend(DirectoryDirectives)
|
83
|
+
end
|
60
84
|
|
61
|
-
|
62
|
-
|
63
|
-
# when it's coming from file since a directory_directive doesn't make sense
|
64
|
-
# for anything else.
|
65
|
-
# @return [Hash | nil] the configuration for the source or nil
|
66
|
-
def directory_directive_for_source(source_via)
|
67
|
-
return unless source_via
|
68
|
-
source_base_dir = Pathname.new(source_via).dirname
|
69
|
-
hit = best_directory_match_for source_base_dir
|
70
|
-
directory_directives[hit]
|
85
|
+
def default_directive
|
86
|
+
@default_directive ||= {}.extend(DefaultDirective)
|
71
87
|
end
|
72
88
|
|
73
|
-
def
|
74
|
-
|
89
|
+
def excluded_paths
|
90
|
+
@excluded_paths ||= [].extend(ExcludedPaths)
|
91
|
+
end
|
92
|
+
|
93
|
+
def find_and_load(path: nil)
|
94
|
+
configuration_file = ConfigurationFileFinder.find_and_load(path: path)
|
75
95
|
|
76
96
|
configuration_file.each do |key, value|
|
77
97
|
case
|
78
98
|
when key == EXCLUDE_PATHS_KEY
|
79
|
-
|
99
|
+
excluded_paths.add value
|
80
100
|
when smell_type?(key)
|
81
|
-
|
101
|
+
default_directive.add key, value
|
82
102
|
else
|
83
|
-
|
103
|
+
directory_directives.add key, value
|
84
104
|
end
|
85
105
|
end
|
86
106
|
end
|
87
|
-
|
88
|
-
def handle_exclude_paths(paths)
|
89
|
-
self.exclude_paths = paths.map do |path|
|
90
|
-
pathname = Pathname.new path.chomp('/')
|
91
|
-
raise ArgumentError, "Excluded directory #{path} does not exists" unless pathname.exist?
|
92
|
-
pathname
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
def handle_default_directive(key, config)
|
97
|
-
klass = Reek::Smells.const_get(key)
|
98
|
-
default_directive[klass] = config
|
99
|
-
end
|
100
|
-
|
101
|
-
def handle_directory_directive(path, config)
|
102
|
-
pathname = Pathname.new path.chomp('/')
|
103
|
-
validate_directive pathname
|
104
|
-
|
105
|
-
directory_directives[pathname] = config.each_with_object({}) do |(key, value), hash|
|
106
|
-
abort(error_message_for_invalid_smell_type(key)) unless smell_type?(key)
|
107
|
-
hash[Reek::Smells.const_get(key)] = value
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
def best_directory_match_for(source_base_dir)
|
112
|
-
directory_directives.
|
113
|
-
keys.
|
114
|
-
select { |pathname| source_base_dir.to_s =~ /#{pathname}/ }.
|
115
|
-
max_by { |pathname| pathname.to_s.length }
|
116
|
-
end
|
117
|
-
|
118
|
-
def smell_type?(key)
|
119
|
-
Reek::Smells.const_get key
|
120
|
-
rescue NameError
|
121
|
-
false
|
122
|
-
end
|
123
|
-
|
124
|
-
def error_message_for_invalid_smell_type(klass)
|
125
|
-
"You are trying to configure smell type #{klass} but we can't find one with that name.\n" \
|
126
|
-
"Please make sure you spelled it right (see 'config/defaults.reek' in the reek\n" \
|
127
|
-
'repository for a list of all available smell types.'
|
128
|
-
end
|
129
|
-
|
130
|
-
def error_message_for_missing_directory(pathname)
|
131
|
-
"Configuration error: Directory `#{pathname}` does not exist"
|
132
|
-
end
|
133
|
-
|
134
|
-
def error_message_for_file_given(pathname)
|
135
|
-
"Configuration error: `#{pathname}` is supposed to be a directory but is a file"
|
136
|
-
end
|
137
|
-
|
138
|
-
def validate_directive(pathname)
|
139
|
-
abort(error_message_for_missing_directory(pathname)) unless pathname.exist?
|
140
|
-
abort(error_message_for_file_given(pathname)) unless pathname.directory?
|
141
|
-
end
|
142
107
|
end
|
143
108
|
end
|
144
109
|
end
|