reek 3.2 → 3.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/lib/reek/ast/ast_node_class_map.rb +1 -5
- data/lib/reek/ast/node.rb +2 -4
- data/lib/reek/ast/object_refs.rb +5 -9
- data/lib/reek/ast/reference_collector.rb +2 -4
- data/lib/reek/cli/application.rb +9 -12
- data/lib/reek/cli/command.rb +0 -4
- data/lib/reek/cli/input.rb +4 -4
- data/lib/reek/cli/option_interpreter.rb +7 -11
- data/lib/reek/cli/options.rb +40 -42
- data/lib/reek/cli/reek_command.rb +3 -3
- data/lib/reek/cli/warning_collector.rb +3 -7
- data/lib/reek/code_comment.rb +1 -5
- data/lib/reek/context/code_context.rb +17 -19
- data/lib/reek/examiner.rb +6 -8
- data/lib/reek/rake/task.rb +22 -12
- data/lib/reek/report/formatter.rb +1 -5
- data/lib/reek/report/report.rb +13 -22
- data/lib/reek/smells/attribute.rb +6 -9
- data/lib/reek/smells/control_parameter.rb +13 -21
- data/lib/reek/smells/data_clump.rb +9 -17
- data/lib/reek/smells/duplicate_method_call.rb +6 -12
- 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 +2 -4
- data/lib/reek/smells/nil_check.rb +2 -6
- data/lib/reek/smells/repeated_conditional.rb +2 -2
- data/lib/reek/smells/smell_configuration.rb +7 -15
- data/lib/reek/smells/smell_detector.rb +10 -23
- 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 +2 -2
- 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 +5 -5
- data/lib/reek/smells/uncommunicative_parameter_name.rb +4 -8
- data/lib/reek/smells/uncommunicative_variable_name.rb +4 -8
- data/lib/reek/source/source_code.rb +1 -5
- data/lib/reek/spec/should_reek.rb +4 -9
- data/lib/reek/spec/should_reek_of.rb +5 -8
- data/lib/reek/spec/should_reek_only_of.rb +8 -12
- data/lib/reek/tree_dresser.rb +2 -6
- data/lib/reek/tree_walker.rb +22 -28
- data/lib/reek/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fe2528f9142f9b45b13b25d3c5b05913ef16f190
|
4
|
+
data.tar.gz: b3d969d1feedbe459e2f073f86cbb4d2fb6774da
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d7a4a4ea2e5bf9cff1a99fa6ca67cc2709bc9cb806f0296acdc7b91ab3a8f7a59217b5d680cad008e33cf0f7887fd62299660f9efde81a978da6ea6b633eae41
|
7
|
+
data.tar.gz: 86b336f6aa1c9d9a4e3db2734ac01b35406bd389cef54fa1f67f1b7bbc707847ddabbbc318c257a0f16a8573a96ed08c12a2b9c06d9ee66a0ace9cfd9e03c5e3
|
data/CHANGELOG.md
CHANGED
@@ -13,7 +13,7 @@ module Reek
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def klass_for(type)
|
16
|
-
klass_map[type] ||= Class.new(Node).tap do |klass|
|
16
|
+
@klass_map[type] ||= Class.new(Node).tap do |klass|
|
17
17
|
extension = extension_map[type]
|
18
18
|
klass.send :include, extension if extension
|
19
19
|
end
|
@@ -31,10 +31,6 @@ module Reek
|
|
31
31
|
Hash[assoc]
|
32
32
|
end
|
33
33
|
end
|
34
|
-
|
35
|
-
private
|
36
|
-
|
37
|
-
private_attr_reader :klass_map
|
38
34
|
end
|
39
35
|
end
|
40
36
|
end
|
data/lib/reek/ast/node.rb
CHANGED
@@ -17,12 +17,12 @@ module Reek
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def full_comment
|
20
|
-
comments.map(&:text).join("\n")
|
20
|
+
@comments.map(&:text).join("\n")
|
21
21
|
end
|
22
22
|
|
23
23
|
def leading_comment
|
24
24
|
line = location.line
|
25
|
-
comment_lines = comments.select do |comment|
|
25
|
+
comment_lines = @comments.select do |comment|
|
26
26
|
comment.location.line < line
|
27
27
|
end
|
28
28
|
comment_lines.map(&:text).join("\n")
|
@@ -120,8 +120,6 @@ module Reek
|
|
120
120
|
|
121
121
|
private
|
122
122
|
|
123
|
-
private_attr_reader :comments
|
124
|
-
|
125
123
|
def each_sexp
|
126
124
|
children.each { |elem| yield elem if elem.is_a? ::Parser::AST::Node }
|
127
125
|
end
|
data/lib/reek/ast/object_refs.rb
CHANGED
@@ -11,25 +11,21 @@ module Reek
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def most_popular
|
14
|
-
max = refs.values.map(&:size).max
|
15
|
-
refs.select { |_name, refs| refs.size == max }
|
14
|
+
max = @refs.values.map(&:size).max
|
15
|
+
@refs.select { |_name, refs| refs.size == max }
|
16
16
|
end
|
17
17
|
|
18
18
|
def record_reference_to(name, line: nil)
|
19
|
-
refs[name] << ObjectRef.new(name, line)
|
19
|
+
@refs[name] << ObjectRef.new(name, line)
|
20
20
|
end
|
21
21
|
|
22
22
|
def references_to(name)
|
23
|
-
refs[name]
|
23
|
+
@refs[name]
|
24
24
|
end
|
25
25
|
|
26
26
|
def self_is_max?
|
27
|
-
refs.empty? || most_popular.keys.include?(:self)
|
27
|
+
@refs.empty? || most_popular.keys.include?(:self)
|
28
28
|
end
|
29
|
-
|
30
|
-
private
|
31
|
-
|
32
|
-
private_attr_reader :refs
|
33
29
|
end
|
34
30
|
end
|
35
31
|
end
|
@@ -18,16 +18,14 @@ module Reek
|
|
18
18
|
|
19
19
|
private
|
20
20
|
|
21
|
-
private_attr_reader :ast
|
22
|
-
|
23
21
|
def explicit_self_calls
|
24
22
|
[:self, :zsuper, :ivar, :ivasgn].flat_map do |node_type|
|
25
|
-
ast.each_node(node_type, STOP_NODES)
|
23
|
+
@ast.each_node(node_type, STOP_NODES)
|
26
24
|
end
|
27
25
|
end
|
28
26
|
|
29
27
|
def implicit_self_calls
|
30
|
-
ast.each_node(:send, STOP_NODES).reject(&:receiver)
|
28
|
+
@ast.each_node(:send, STOP_NODES).reject(&:receiver)
|
31
29
|
end
|
32
30
|
end
|
33
31
|
end
|
data/lib/reek/cli/application.rb
CHANGED
@@ -20,9 +20,9 @@ module Reek
|
|
20
20
|
@status = STATUS_SUCCESS
|
21
21
|
options_parser = Options.new(argv)
|
22
22
|
begin
|
23
|
-
options = options_parser.parse
|
24
|
-
@command = ReekCommand.new(OptionInterpreter.new(options))
|
25
|
-
@configuration = Configuration::AppConfiguration.new
|
23
|
+
@options = options_parser.parse
|
24
|
+
@command = ReekCommand.new(OptionInterpreter.new(@options))
|
25
|
+
@configuration = Configuration::AppConfiguration.new @options
|
26
26
|
rescue OptionParser::InvalidOption, Reek::Configuration::ConfigFileException => error
|
27
27
|
$stderr.puts "Error: #{error}"
|
28
28
|
@status = STATUS_ERROR
|
@@ -30,9 +30,9 @@ module Reek
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def execute
|
33
|
-
return status if error_occured?
|
34
|
-
command.execute self
|
35
|
-
status
|
33
|
+
return @status if error_occured?
|
34
|
+
@command.execute self
|
35
|
+
@status
|
36
36
|
end
|
37
37
|
|
38
38
|
def output(text)
|
@@ -40,20 +40,17 @@ module Reek
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def report_success
|
43
|
-
|
43
|
+
@status = STATUS_SUCCESS
|
44
44
|
end
|
45
45
|
|
46
46
|
def report_smells
|
47
|
-
|
47
|
+
@status = STATUS_SMELLS
|
48
48
|
end
|
49
49
|
|
50
50
|
private
|
51
51
|
|
52
|
-
private_attr_accessor :status
|
53
|
-
private_attr_reader :command
|
54
|
-
|
55
52
|
def error_occured?
|
56
|
-
status == STATUS_ERROR
|
53
|
+
@status == STATUS_ERROR
|
57
54
|
end
|
58
55
|
end
|
59
56
|
end
|
data/lib/reek/cli/command.rb
CHANGED
data/lib/reek/cli/input.rb
CHANGED
@@ -26,9 +26,9 @@ module Reek
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def no_source_files_given?
|
29
|
-
# At this point we have deleted all options from argv. The only remaining entries
|
30
|
-
# are paths to the source files. If argv is empty, this means that no files were given.
|
31
|
-
argv.empty?
|
29
|
+
# At this point we have deleted all options from @argv. The only remaining entries
|
30
|
+
# are paths to the source files. If @argv is empty, this means that no files were given.
|
31
|
+
@argv.empty?
|
32
32
|
end
|
33
33
|
|
34
34
|
def working_directory_as_source
|
@@ -36,7 +36,7 @@ module Reek
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def sources_from_argv
|
39
|
-
Source::SourceLocator.new(argv).sources
|
39
|
+
Source::SourceLocator.new(@argv).sources
|
40
40
|
end
|
41
41
|
|
42
42
|
def source_from_pipe
|
@@ -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 = options.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(options.report_format)
|
33
|
+
Report.report_class(@options.report_format)
|
34
34
|
end
|
35
35
|
|
36
36
|
def warning_formatter
|
@@ -38,24 +38,20 @@ module Reek
|
|
38
38
|
end
|
39
39
|
|
40
40
|
def warning_formatter_class
|
41
|
-
Report.warning_formatter_class(options.show_links ? :wiki_links : :simple)
|
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(options.location_format)
|
45
|
+
Report.location_formatter(@options.location_format)
|
46
46
|
end
|
47
47
|
|
48
48
|
def heading_formatter
|
49
|
-
Report.heading_formatter(options.show_empty ? :verbose : :quiet)
|
49
|
+
Report.heading_formatter(@options.show_empty ? :verbose : :quiet)
|
50
50
|
end
|
51
51
|
|
52
52
|
def sort_by_issue_count
|
53
|
-
options.sorting == :smelliness
|
53
|
+
@options.sorting == :smelliness
|
54
54
|
end
|
55
|
-
|
56
|
-
private
|
57
|
-
|
58
|
-
private_attr_reader :argv, :options
|
59
55
|
end
|
60
56
|
end
|
61
57
|
end
|
data/lib/reek/cli/options.rb
CHANGED
@@ -23,16 +23,14 @@ module Reek
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def parse
|
26
|
-
parser.parse!(argv)
|
27
|
-
options.argv = argv
|
28
|
-
Rainbow.enabled = options.colored
|
29
|
-
options
|
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
|
-
|
36
34
|
def color_support?
|
37
35
|
$stdout.tty?
|
38
36
|
end
|
@@ -46,8 +44,8 @@ module Reek
|
|
46
44
|
end
|
47
45
|
|
48
46
|
def set_banner
|
49
|
-
program_name = parser.program_name
|
50
|
-
parser.banner = <<-EOB.gsub(/^[ ]+/, '')
|
47
|
+
program_name = @parser.program_name
|
48
|
+
@parser.banner = <<-EOB.gsub(/^[ ]+/, '')
|
51
49
|
Usage: #{program_name} [options] [files]
|
52
50
|
|
53
51
|
Examples:
|
@@ -62,29 +60,29 @@ module Reek
|
|
62
60
|
end
|
63
61
|
|
64
62
|
def set_alternative_formatter_options
|
65
|
-
parser.separator "\nReport format:"
|
66
|
-
parser.on(
|
63
|
+
@parser.separator "\nReport format:"
|
64
|
+
@parser.on(
|
67
65
|
'-f', '--format FORMAT', [:html, :text, :yaml, :json, :xml],
|
68
66
|
'Report smells in the given format:',
|
69
67
|
' html', ' text (default)', ' yaml', ' json', ' xml'
|
70
68
|
) do |opt|
|
71
|
-
options.report_format = opt
|
69
|
+
@options.report_format = opt
|
72
70
|
end
|
73
71
|
end
|
74
72
|
|
75
73
|
def set_configuration_options
|
76
|
-
parser.separator 'Configuration:'
|
77
|
-
parser.on('-c', '--config FILE', 'Read configuration options from FILE') do |file|
|
74
|
+
@parser.separator 'Configuration:'
|
75
|
+
@parser.on('-c', '--config FILE', 'Read configuration options from FILE') do |file|
|
78
76
|
raise ArgumentError, "Config file #{file} doesn't exist" unless File.exist?(file)
|
79
|
-
options.config_file = Pathname.new(file)
|
77
|
+
@options.config_file = Pathname.new(file)
|
80
78
|
end
|
81
|
-
parser.on('--smell SMELL', 'Detect smell SMELL (default: all enabled smells)') do |smell|
|
82
|
-
options.smells_to_detect << smell
|
79
|
+
@parser.on('--smell SMELL', 'Detect smell SMELL (default: all enabled smells)') do |smell|
|
80
|
+
@options.smells_to_detect << smell
|
83
81
|
end
|
84
82
|
end
|
85
83
|
|
86
84
|
def set_report_formatting_options
|
87
|
-
parser.separator "\nText format options:"
|
85
|
+
@parser.separator "\nText format options:"
|
88
86
|
set_up_color_option
|
89
87
|
set_up_verbosity_options
|
90
88
|
set_up_location_formatting_options
|
@@ -92,50 +90,50 @@ module Reek
|
|
92
90
|
end
|
93
91
|
|
94
92
|
def set_up_color_option
|
95
|
-
parser.on('--[no-]color', 'Use colors for the output (default: true)') do |opt|
|
96
|
-
options.colored = opt
|
93
|
+
@parser.on('--[no-]color', 'Use colors for the output (default: true)') do |opt|
|
94
|
+
@options.colored = opt
|
97
95
|
end
|
98
96
|
end
|
99
97
|
|
100
98
|
def set_up_verbosity_options
|
101
|
-
parser.on('-V', '--[no-]empty-headings',
|
102
|
-
|
103
|
-
options.show_empty = show_empty
|
99
|
+
@parser.on('-V', '--[no-]empty-headings',
|
100
|
+
'Show headings for smell-free source files (default: false)') do |show_empty|
|
101
|
+
@options.show_empty = show_empty
|
104
102
|
end
|
105
|
-
parser.on('-U', '--[no-]wiki-links',
|
106
|
-
|
107
|
-
options.show_links = show_links
|
103
|
+
@parser.on('-U', '--[no-]wiki-links',
|
104
|
+
'Show link to related wiki page for each smell (default: false)') do |show_links|
|
105
|
+
@options.show_links = show_links
|
108
106
|
end
|
109
107
|
end
|
110
108
|
|
111
109
|
def set_up_location_formatting_options
|
112
|
-
parser.on('-n', '--[no-]line-numbers',
|
113
|
-
|
114
|
-
options.location_format = show_numbers ? :numbers : :plain
|
110
|
+
@parser.on('-n', '--[no-]line-numbers',
|
111
|
+
'Show line numbers in the output (default: true)') do |show_numbers|
|
112
|
+
@options.location_format = show_numbers ? :numbers : :plain
|
115
113
|
end
|
116
|
-
parser.on('-s', '--single-line',
|
117
|
-
|
118
|
-
options.location_format = :single_line
|
114
|
+
@parser.on('-s', '--single-line',
|
115
|
+
'Show location in editor-compatible single-line-per-smell format') do
|
116
|
+
@options.location_format = :single_line
|
119
117
|
end
|
120
118
|
end
|
121
119
|
|
122
120
|
def set_up_sorting_option
|
123
|
-
parser.on('--sort-by SORTING', [:smelliness, :none],
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
121
|
+
@parser.on('--sort-by SORTING', [:smelliness, :none],
|
122
|
+
'Sort reported files by the given criterium:',
|
123
|
+
' smelliness ("smelliest" files first)',
|
124
|
+
' none (default - output in processing order)') do |sorting|
|
125
|
+
@options.sorting = sorting
|
126
|
+
end
|
129
127
|
end
|
130
128
|
|
131
129
|
def set_utility_options
|
132
|
-
parser.separator "\nUtility options:"
|
133
|
-
parser.on_tail('-h', '--help', 'Show this message') do
|
134
|
-
puts parser
|
130
|
+
@parser.separator "\nUtility options:"
|
131
|
+
@parser.on_tail('-h', '--help', 'Show this message') do
|
132
|
+
puts @parser
|
135
133
|
exit
|
136
134
|
end
|
137
|
-
parser.on_tail('-v', '--version', 'Show version') do
|
138
|
-
puts "#{parser.program_name} #{Reek::Version::STRING}\n"
|
135
|
+
@parser.on_tail('-v', '--version', 'Show version') do
|
136
|
+
puts "#{@parser.program_name} #{Reek::Version::STRING}\n"
|
139
137
|
exit
|
140
138
|
end
|
141
139
|
end
|
@@ -10,7 +10,7 @@ module Reek
|
|
10
10
|
# @api private
|
11
11
|
class ReekCommand < Command
|
12
12
|
def execute(app)
|
13
|
-
options.sources.each do |source|
|
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 ||= options.reporter
|
23
|
+
@reporter ||= @options.reporter
|
24
24
|
end
|
25
25
|
|
26
26
|
def smell_names
|
27
|
-
@smell_names ||= options.smells_to_detect
|
27
|
+
@smell_names ||= @options.smells_to_detect
|
28
28
|
end
|
29
29
|
end
|
30
30
|
end
|
@@ -8,20 +8,16 @@ module Reek
|
|
8
8
|
# @api private
|
9
9
|
class WarningCollector
|
10
10
|
def initialize
|
11
|
-
@
|
11
|
+
@warnings = Set.new
|
12
12
|
end
|
13
13
|
|
14
14
|
def found_smell(warning)
|
15
|
-
|
15
|
+
@warnings.add(warning)
|
16
16
|
end
|
17
17
|
|
18
18
|
def warnings
|
19
|
-
|
19
|
+
@warnings.to_a.sort
|
20
20
|
end
|
21
|
-
|
22
|
-
private
|
23
|
-
|
24
|
-
private_attr_reader :warnings_set
|
25
21
|
end
|
26
22
|
end
|
27
23
|
end
|