reek 2.0.0 → 2.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +5 -0
- data/README.md +13 -2
- data/Rakefile +2 -1
- data/features/command_line_interface/options.feature +2 -3
- data/features/command_line_interface/smell_selection.feature +0 -1
- data/features/command_line_interface/smells_count.feature +0 -2
- data/features/command_line_interface/stdin.feature +3 -10
- data/features/configuration_files/masking_smells.feature +1 -5
- data/features/configuration_files/overrides_defaults.feature +0 -1
- data/features/rake_task/rake_task.feature +1 -4
- data/features/reports/json.feature +73 -0
- data/features/reports/reports.feature +0 -3
- data/features/reports/yaml.feature +0 -1
- data/features/ruby_api/api.feature +0 -1
- data/features/samples.feature +0 -4
- data/features/step_definitions/reek_steps.rb +14 -4
- data/features/support/env.rb +3 -0
- data/lib/reek/cli/option_interpreter.rb +2 -0
- data/lib/reek/cli/options.rb +3 -3
- data/lib/reek/cli/report/formatter.rb +1 -1
- data/lib/reek/cli/report/location_formatter.rb +11 -0
- data/lib/reek/cli/report/report.rb +11 -2
- data/lib/reek/core/code_context.rb +49 -10
- data/lib/reek/core/sniffer.rb +2 -2
- data/lib/reek/core/{code_parser.rb → tree_walker.rb} +16 -7
- data/lib/reek/examiner.rb +0 -39
- data/lib/reek/smells.rb +3 -25
- data/lib/reek/smells/feature_envy.rb +0 -2
- data/lib/reek/smells/smell_detector.rb +0 -6
- data/lib/reek/source/sexp_extensions.rb +17 -6
- data/lib/reek/source/sexp_node.rb +1 -1
- data/lib/reek/spec.rb +66 -0
- data/lib/reek/spec/should_reek.rb +0 -6
- data/lib/reek/spec/should_reek_of.rb +0 -49
- data/lib/reek/spec/should_reek_only_of.rb +0 -11
- data/lib/reek/version.rb +6 -1
- data/reek.gemspec +3 -2
- data/spec/reek/cli/json_report_spec.rb +20 -0
- data/spec/reek/core/code_context_spec.rb +6 -0
- data/spec/reek/core/smell_configuration_spec.rb +3 -3
- data/spec/reek/core/{code_parser_spec.rb → tree_walker_spec.rb} +4 -4
- data/spec/reek/examiner_spec.rb +0 -19
- data/spec/reek/smells/attribute_spec.rb +6 -9
- data/spec/reek/smells/boolean_parameter_spec.rb +13 -15
- data/spec/reek/smells/class_variable_spec.rb +17 -17
- data/spec/reek/smells/control_parameter_spec.rb +44 -46
- data/spec/reek/smells/data_clump_spec.rb +73 -70
- data/spec/reek/smells/duplicate_method_call_spec.rb +39 -37
- data/spec/reek/smells/feature_envy_spec.rb +53 -57
- data/spec/reek/smells/irresponsible_module_spec.rb +12 -11
- data/spec/reek/smells/long_parameter_list_spec.rb +33 -26
- data/spec/reek/smells/long_yield_list_spec.rb +15 -19
- data/spec/reek/smells/module_initialize_spec.rb +4 -6
- data/spec/reek/smells/nested_iterators_spec.rb +28 -28
- data/spec/reek/smells/nil_check_spec.rb +18 -20
- data/spec/reek/smells/prima_donna_method_spec.rb +6 -9
- data/spec/reek/smells/repeated_conditional_spec.rb +41 -43
- data/spec/reek/smells/too_many_instance_variables_spec.rb +6 -11
- data/spec/reek/smells/too_many_methods_spec.rb +44 -61
- data/spec/reek/smells/too_many_statements_spec.rb +14 -41
- data/spec/reek/smells/uncommunicative_method_name_spec.rb +6 -11
- data/spec/reek/smells/uncommunicative_module_name_spec.rb +10 -14
- data/spec/reek/smells/uncommunicative_parameter_name_spec.rb +15 -16
- data/spec/reek/smells/uncommunicative_variable_name_spec.rb +33 -36
- data/spec/reek/smells/unused_parameters_spec.rb +16 -19
- data/spec/reek/smells/utility_function_spec.rb +7 -10
- metadata +22 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f4119a0e66c059ea4a0d565bfab3ecfaeef3c722
|
4
|
+
data.tar.gz: 60149f1e3dda3e9f1b9f1e03f2287817ab9715ce
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: de5e40087670fc35f74a341f9e50c477aa1deaeb914abe7466afe4ce53efaf9fb38633b814424cc50cc20aa08e1563f1e65169d159bc29b6e720f012d11b628b
|
7
|
+
data.tar.gz: ed3e2bddfbc5e369f1079da7e1a7684dc6ab28d1ad6d64625541587ec47c0173b7596de15ac4b26737401a6cb0d9ec82a8c0696cd88603e57772530254ead51f
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
== 2.0.1
|
2
|
+
|
3
|
+
* (leonelgalan) Add support for json reports
|
4
|
+
* (chastell) Escape Regexp-like Strings on CodeContext matches (Bug https://github.com/troessner/reek/pull/397)
|
5
|
+
|
1
6
|
== 2.0.0
|
2
7
|
|
3
8
|
* (troessner) Revise, improve & refactor our Rspec matcher and remove smell_of
|
data/README.md
CHANGED
@@ -209,8 +209,9 @@ If you don't feel like getting your hands dirty with code there are still other
|
|
209
209
|
`reek` supports 3 output formats:
|
210
210
|
|
211
211
|
* plain text (default)
|
212
|
-
* html (
|
213
|
-
* yaml (
|
212
|
+
* html (`--format html`)
|
213
|
+
* yaml (`--format yaml`)
|
214
|
+
* json (`--format json`)
|
214
215
|
|
215
216
|
## Additional resources
|
216
217
|
|
@@ -229,3 +230,13 @@ Colorful output for `reek`: [Preek](https://github.com/joenas/preek) (also with
|
|
229
230
|
|
230
231
|
* [Stack Overflow](http://stackoverflow.com/questions/tagged/reek)
|
231
232
|
* [RDoc](http://rdoc.info/projects/troessner/reek)
|
233
|
+
|
234
|
+
## Contributors
|
235
|
+
|
236
|
+
A non exhaustive list:
|
237
|
+
|
238
|
+
* Kevin Rutherford
|
239
|
+
* Matijs van Zuijlen
|
240
|
+
* Andrew Wagner
|
241
|
+
* Gilles Leblanc
|
242
|
+
* Timo Rößner
|
data/Rakefile
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
@options
|
2
1
|
Feature: Reek can be controlled using command-line options
|
3
2
|
In order to change reek's default behaviour
|
4
3
|
As a developer
|
@@ -8,7 +7,7 @@ Feature: Reek can be controlled using command-line options
|
|
8
7
|
When I run reek --no-such-option
|
9
8
|
Then the exit status indicates an error
|
10
9
|
And it reports the error "Error: invalid option: --no-such-option"
|
11
|
-
And
|
10
|
+
And there is no output on stdout
|
12
11
|
|
13
12
|
Scenario: display the current version number
|
14
13
|
When I run reek --version
|
@@ -39,6 +38,7 @@ Feature: Reek can be controlled using command-line options
|
|
39
38
|
html
|
40
39
|
text (default)
|
41
40
|
yaml
|
41
|
+
json
|
42
42
|
|
43
43
|
Text format options:
|
44
44
|
--[no-]color Use colors for the output (this is the default)
|
@@ -53,5 +53,4 @@ Feature: Reek can be controlled using command-line options
|
|
53
53
|
Utility options:
|
54
54
|
-h, --help Show this message
|
55
55
|
-v, --version Show version
|
56
|
-
|
57
56
|
"""
|
@@ -1,4 +1,3 @@
|
|
1
|
-
@smells_count
|
2
1
|
Feature: Reports total number of code smells
|
3
2
|
In order to monitor the total number of smells
|
4
3
|
Reek outputs the total number of smells among all files inspected.
|
@@ -44,6 +43,5 @@ Feature: Reports total number of code smells
|
|
44
43
|
Then it succeeds
|
45
44
|
And it reports:
|
46
45
|
"""
|
47
|
-
|
48
46
|
0 total warnings
|
49
47
|
"""
|
@@ -1,4 +1,3 @@
|
|
1
|
-
@stdin
|
2
1
|
Feature: Reek reads from $stdin when no files are given
|
3
2
|
In order to use reek with pipelines
|
4
3
|
As a developer
|
@@ -7,14 +6,12 @@ Feature: Reek reads from $stdin when no files are given
|
|
7
6
|
Scenario: return zero status with no smells
|
8
7
|
When I pass "def simple() @fred = 3 end" to reek
|
9
8
|
Then it succeeds
|
10
|
-
And it reports
|
11
|
-
"""
|
12
|
-
"""
|
9
|
+
And it reports nothing
|
13
10
|
|
14
11
|
Scenario: outputs nothing on empty stdin
|
15
12
|
When I pass "" to reek
|
16
13
|
Then it succeeds
|
17
|
-
And
|
14
|
+
And it reports nothing
|
18
15
|
|
19
16
|
Scenario: outputs header only on empty stdin in verbose mode
|
20
17
|
When I pass "" to reek -V
|
@@ -22,7 +19,6 @@ Feature: Reek reads from $stdin when no files are given
|
|
22
19
|
And it reports:
|
23
20
|
"""
|
24
21
|
$stdin -- 0 warnings
|
25
|
-
|
26
22
|
"""
|
27
23
|
|
28
24
|
Scenario: return non-zero status when there are smells
|
@@ -34,13 +30,10 @@ Feature: Reek reads from $stdin when no files are given
|
|
34
30
|
[1]:Turn has no descriptive comment (IrresponsibleModule)
|
35
31
|
[1]:Turn has the variable name '@x' (UncommunicativeVariableName)
|
36
32
|
[1]:Turn#y has the name 'y' (UncommunicativeMethodName)
|
37
|
-
|
38
33
|
"""
|
39
34
|
|
40
|
-
@stderr
|
41
35
|
Scenario: syntax error causes the source to be ignored
|
42
36
|
When I pass "def incomplete" to reek
|
43
37
|
Then it reports a parsing error
|
44
38
|
Then it succeeds
|
45
|
-
And
|
46
|
-
|
39
|
+
And it reports nothing
|
@@ -1,4 +1,3 @@
|
|
1
|
-
@masking
|
2
1
|
Feature: Masking smells using config files
|
3
2
|
In order to keep my reports meaningful
|
4
3
|
As a developer
|
@@ -23,9 +22,7 @@ Feature: Masking smells using config files
|
|
23
22
|
When I run reek -c spec/samples/corrupt_config_file/corrupt.reek spec/samples/corrupt_config_file
|
24
23
|
Then it reports the error 'Error: Invalid configuration file "corrupt.reek" -- Not a hash'
|
25
24
|
And the exit status indicates an error
|
26
|
-
And it reports
|
27
|
-
"""
|
28
|
-
"""
|
25
|
+
And it reports nothing
|
29
26
|
|
30
27
|
Scenario: missing source file is an error
|
31
28
|
When I run reek spec/samples/missing_source_file/dirty.rb
|
@@ -65,7 +62,6 @@ Feature: Masking smells using config files
|
|
65
62
|
[5]:Dirty#a contains iterators nested 2 deep (NestedIterators)
|
66
63
|
"""
|
67
64
|
|
68
|
-
@comments
|
69
65
|
Scenario: provide extra masking inline in comments
|
70
66
|
When I run reek -c spec/samples/inline_config/masked.reek spec/samples/inline_config
|
71
67
|
Then the exit status indicates smells
|
@@ -1,4 +1,3 @@
|
|
1
|
-
@rake
|
2
1
|
Feature: Reek can be driven through its Task
|
3
2
|
Reek provides an easy way to integrate its use into Rakefiles,
|
4
3
|
via the Task class. These scenarios test its various options.
|
@@ -79,6 +78,4 @@ Feature: Reek can be driven through its Task
|
|
79
78
|
end
|
80
79
|
"""
|
81
80
|
Then it succeeds
|
82
|
-
And it reports
|
83
|
-
"""
|
84
|
-
"""
|
81
|
+
And it reports nothing
|
@@ -0,0 +1,73 @@
|
|
1
|
+
Feature: Report smells using simple JSON layout
|
2
|
+
In order to parse reek's output simply and consistently, simply
|
3
|
+
output a list of smells in JSON.
|
4
|
+
|
5
|
+
Scenario: output is empty when there are no smells
|
6
|
+
When I run reek --format json spec/samples/three_clean_files
|
7
|
+
Then it succeeds
|
8
|
+
And it reports this JSON:
|
9
|
+
"""
|
10
|
+
[]
|
11
|
+
"""
|
12
|
+
|
13
|
+
Scenario: Indicate smells and print them as JSON when using files
|
14
|
+
When I run reek --format json spec/samples/standard_smelly/minimal_dirty.rb
|
15
|
+
Then the exit status indicates smells
|
16
|
+
And it reports this JSON:
|
17
|
+
"""
|
18
|
+
[
|
19
|
+
{
|
20
|
+
"smell_category": "IrresponsibleModule",
|
21
|
+
"smell_type": "IrresponsibleModule",
|
22
|
+
"source": "spec/samples/standard_smelly/minimal_dirty.rb",
|
23
|
+
"context": "C",
|
24
|
+
"lines": [
|
25
|
+
1
|
26
|
+
],
|
27
|
+
"message": "has no descriptive comment",
|
28
|
+
"name": "C"
|
29
|
+
},
|
30
|
+
{
|
31
|
+
"smell_category": "UncommunicativeName",
|
32
|
+
"smell_type": "UncommunicativeModuleName",
|
33
|
+
"source": "spec/samples/standard_smelly/minimal_dirty.rb",
|
34
|
+
"context": "C",
|
35
|
+
"lines": [
|
36
|
+
1
|
37
|
+
],
|
38
|
+
"message": "has the name 'C'",
|
39
|
+
"name": "C"
|
40
|
+
},
|
41
|
+
{
|
42
|
+
"smell_category": "UncommunicativeName",
|
43
|
+
"smell_type": "UncommunicativeMethodName",
|
44
|
+
"source": "spec/samples/standard_smelly/minimal_dirty.rb",
|
45
|
+
"context": "C#m",
|
46
|
+
"lines": [
|
47
|
+
2
|
48
|
+
],
|
49
|
+
"message": "has the name 'm'",
|
50
|
+
"name": "m"
|
51
|
+
}
|
52
|
+
]
|
53
|
+
"""
|
54
|
+
|
55
|
+
Scenario: Indicate smells and print them as JSON when using STDIN
|
56
|
+
When I pass "class Turn; end" to reek --format json
|
57
|
+
Then the exit status indicates smells
|
58
|
+
And it reports this JSON:
|
59
|
+
"""
|
60
|
+
[
|
61
|
+
{
|
62
|
+
"smell_category": "IrresponsibleModule",
|
63
|
+
"smell_type": "IrresponsibleModule",
|
64
|
+
"source": "$stdin",
|
65
|
+
"context": "Turn",
|
66
|
+
"lines": [
|
67
|
+
1
|
68
|
+
],
|
69
|
+
"message": "has no descriptive comment",
|
70
|
+
"name": "Turn"
|
71
|
+
}
|
72
|
+
]
|
73
|
+
"""
|
@@ -1,4 +1,3 @@
|
|
1
|
-
@reports
|
2
1
|
Feature: Correctly formatted reports
|
3
2
|
In order to get the most out of reek
|
4
3
|
As a developer
|
@@ -87,7 +86,6 @@ Feature: Correctly formatted reports
|
|
87
86
|
Then it succeeds
|
88
87
|
And it reports:
|
89
88
|
"""
|
90
|
-
|
91
89
|
0 total warnings
|
92
90
|
"""
|
93
91
|
|
@@ -117,7 +115,6 @@ Feature: Correctly formatted reports
|
|
117
115
|
Then it succeeds
|
118
116
|
And it reports:
|
119
117
|
"""
|
120
|
-
|
121
118
|
0 total warnings
|
122
119
|
"""
|
123
120
|
|
data/features/samples.feature
CHANGED
@@ -1,10 +1,8 @@
|
|
1
|
-
@samples
|
2
1
|
Feature: Basic smell detection
|
3
2
|
In order to write better software
|
4
3
|
As a developer
|
5
4
|
I want to detect the smells in my Ruby code
|
6
5
|
|
7
|
-
@inline
|
8
6
|
Scenario: Correct smells from inline.rb
|
9
7
|
When I run reek --no-line-numbers spec/samples/inline.rb
|
10
8
|
Then the exit status indicates smells
|
@@ -282,7 +280,6 @@ Feature: Basic smell detection
|
|
282
280
|
RedCloth#to_html has approx 26 statements (TooManyStatements)
|
283
281
|
"""
|
284
282
|
|
285
|
-
@ruby20
|
286
283
|
Scenario: Correct smells from a source file with Ruby 2.0 specific syntax
|
287
284
|
When I run reek spec/samples/ruby20_syntax.rb
|
288
285
|
Then the exit status indicates smells
|
@@ -292,7 +289,6 @@ Feature: Basic smell detection
|
|
292
289
|
[1]:SomeClass has no descriptive comment (IrresponsibleModule)
|
293
290
|
"""
|
294
291
|
|
295
|
-
@ruby21
|
296
292
|
Scenario: Correct smells from a source file with Ruby 2.1 specific syntax
|
297
293
|
When I run reek spec/samples/ruby21_syntax.rb
|
298
294
|
Then the exit status indicates smells
|
@@ -10,8 +10,12 @@ When /^I run rake (\w*) with:$/ do |name, task_def|
|
|
10
10
|
rake(name, task_def)
|
11
11
|
end
|
12
12
|
|
13
|
-
Then /^
|
14
|
-
expect(@last_stdout).to eq
|
13
|
+
Then /^it reports nothing$/ do
|
14
|
+
expect(@last_stdout).to eq ''
|
15
|
+
end
|
16
|
+
|
17
|
+
Then /^there is no output on stdout$/ do
|
18
|
+
expect(@last_stdout).to eq ''
|
15
19
|
end
|
16
20
|
|
17
21
|
Then /^stdout includes "(.*)"$/ do |text|
|
@@ -31,7 +35,7 @@ Then /^the exit status indicates smells$/ do
|
|
31
35
|
end
|
32
36
|
|
33
37
|
Then /^it reports:$/ do |report|
|
34
|
-
expect(@last_stdout
|
38
|
+
expect(@last_stdout).to eq "#{report}\n"
|
35
39
|
end
|
36
40
|
|
37
41
|
Then /^it reports this yaml:$/ do |expected_yaml|
|
@@ -40,6 +44,12 @@ Then /^it reports this yaml:$/ do |expected_yaml|
|
|
40
44
|
expect(actual_warnings).to eq expected_warnings
|
41
45
|
end
|
42
46
|
|
47
|
+
Then /^it reports this JSON:$/ do |expected_json|
|
48
|
+
expected_warnings = JSON.parse(expected_json.chomp)
|
49
|
+
actual_warnings = JSON.parse(@last_stdout)
|
50
|
+
expect(actual_warnings).to eq expected_warnings
|
51
|
+
end
|
52
|
+
|
43
53
|
Then /^stderr reports:$/ do |report|
|
44
54
|
expect(@last_stderr).to eq report
|
45
55
|
end
|
@@ -65,7 +75,7 @@ Then /^it should indicate the line numbers of those smells$/ do
|
|
65
75
|
end
|
66
76
|
|
67
77
|
Then /^it reports the current version$/ do
|
68
|
-
expect(@last_stdout).to eq "reek #{Reek::
|
78
|
+
expect(@last_stdout).to eq "reek #{Reek::Version::STRING}\n"
|
69
79
|
end
|
70
80
|
|
71
81
|
Given(/^"(.*?)" exists in the working directory$/) do |path|
|
data/features/support/env.rb
CHANGED
data/lib/reek/cli/options.rb
CHANGED
@@ -52,9 +52,9 @@ module Reek
|
|
52
52
|
def set_alternative_formatter_options
|
53
53
|
@parser.separator "\nReport format:"
|
54
54
|
@parser.on(
|
55
|
-
'-f', '--format FORMAT', [:html, :text, :yaml],
|
55
|
+
'-f', '--format FORMAT', [:html, :text, :yaml, :json],
|
56
56
|
'Report smells in the given format:',
|
57
|
-
' html', ' text (default)', ' yaml'
|
57
|
+
' html', ' text (default)', ' yaml', ' json'
|
58
58
|
) do |opt|
|
59
59
|
@options.report_format = opt
|
60
60
|
end
|
@@ -122,7 +122,7 @@ module Reek
|
|
122
122
|
exit
|
123
123
|
end
|
124
124
|
@parser.on_tail('-v', '--version', 'Show version') do
|
125
|
-
puts "#{@parser.program_name} #{Reek::
|
125
|
+
puts "#{@parser.program_name} #{Reek::Version::STRING}\n"
|
126
126
|
exit
|
127
127
|
end
|
128
128
|
end
|
@@ -1,18 +1,29 @@
|
|
1
1
|
module Reek
|
2
2
|
module Cli
|
3
3
|
module Report
|
4
|
+
#
|
5
|
+
# Formats the location of a warning as an empty string.
|
6
|
+
#
|
4
7
|
module BlankLocationFormatter
|
5
8
|
def self.format(_warning)
|
6
9
|
''
|
7
10
|
end
|
8
11
|
end
|
9
12
|
|
13
|
+
#
|
14
|
+
# Formats the location of a warning as an array of line numbers.
|
15
|
+
#
|
10
16
|
module DefaultLocationFormatter
|
11
17
|
def self.format(warning)
|
12
18
|
"#{warning.lines.inspect}:"
|
13
19
|
end
|
14
20
|
end
|
15
21
|
|
22
|
+
#
|
23
|
+
# Formats the location of a warning as a combination of source file name
|
24
|
+
# and line number. In this format, it is not possible to show more than
|
25
|
+
# one line number, so the first number is displayed.
|
26
|
+
#
|
16
27
|
module SingleLineLocationFormatter
|
17
28
|
def self.format(warning)
|
18
29
|
"#{warning.source}:#{warning.lines.first}: "
|