reek 4.7.0 → 4.7.1
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/.rubocop.yml +4 -0
- data/CHANGELOG.md +4 -0
- data/README.md +1 -1
- data/features/reports/codeclimate.feature +59 -0
- data/features/step_definitions/reek_steps.rb +12 -0
- data/lib/reek/ast/node.rb +9 -0
- data/lib/reek/ast/sexp_extensions.rb +1 -0
- data/lib/reek/ast/sexp_extensions/begin.rb +17 -0
- data/lib/reek/ast/sexp_extensions/module.rb +54 -8
- data/lib/reek/context/module_context.rb +6 -3
- data/lib/reek/smell_detectors/syntax.rb +8 -4
- data/lib/reek/spec/should_reek_of.rb +3 -10
- data/lib/reek/version.rb +1 -1
- data/spec/reek/smell_detectors/irresponsible_module_spec.rb +64 -15
- data/spec/reek/smell_detectors/syntax_spec.rb +17 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: baf611107a9ba063fb9882a312ae27c556f4a4f6
|
4
|
+
data.tar.gz: f56386a2775e1a178a1df9af568055c5ac63c80f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d108db6dd4064eced4dfe277238771246120f73874f89ae3800e7bbef91b101d946861cb1793b7a138ce761bf4b26e854ee05b13ca5d39287c46b7c64027436a
|
7
|
+
data.tar.gz: 2005c56063bdc5a62f3ec3fe53b73d99158b8b124bdbbb45a3d8ff5ab64ab35e2863afdace05d05b5538855fdc80ed4ca138e073b415ac38f7d9dab95ccbc382
|
data/.rubocop.yml
CHANGED
@@ -113,6 +113,10 @@ Style/AccessorMethodName:
|
|
113
113
|
Exclude:
|
114
114
|
- 'lib/reek/context/visibility_tracker.rb'
|
115
115
|
|
116
|
+
# Allow and/or for control flow only
|
117
|
+
Style/AndOr:
|
118
|
+
EnforcedStyle: conditionals
|
119
|
+
|
116
120
|
Style/Documentation:
|
117
121
|
Exclude:
|
118
122
|
- 'lib/reek/ast/sexp_extensions/send.rb'
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -53,7 +53,7 @@ Reek is a tool that examines Ruby classes, modules and methods and reports any
|
|
53
53
|
|
54
54
|
For an excellent introduction to
|
55
55
|
[Code Smells](docs/Code-Smells.md) and Reek check out [this blog post](https://blog.codeship.com/how-to-find-ruby-code-smells-with-reek/)
|
56
|
-
or [that one](https://troessner.svbtle.com/the-latest-and-greatest-additions-to-reek). There is also [this talk](https://www.youtube.com/watch?v=
|
56
|
+
or [that one](https://troessner.svbtle.com/the-latest-and-greatest-additions-to-reek). There is also [this talk](https://www.youtube.com/watch?v=pazYe7WRWRU) from [RubyConfBY](http://rubyconference.by/) (there is also a [slide deck](http://talks.chastell.net/rubyconf-by-lt-2016/) if you prefer that).
|
57
57
|
|
58
58
|
Install it via rubygems:
|
59
59
|
|
@@ -0,0 +1,59 @@
|
|
1
|
+
Feature: Report smells using Code Climate format
|
2
|
+
In order to run as an Engine on Code Climate, output format following their
|
3
|
+
spec.
|
4
|
+
|
5
|
+
Scenario: output is empty when there are no smells
|
6
|
+
Given a directory called 'clean' containing two clean files
|
7
|
+
When I run reek --format code_climate clean
|
8
|
+
Then it succeeds
|
9
|
+
And it reports this Code Climate output:
|
10
|
+
"""
|
11
|
+
"""
|
12
|
+
|
13
|
+
Scenario: Indicate smells and print them as JSON when using files
|
14
|
+
Given the smelly file 'smelly.rb'
|
15
|
+
When I run reek --format code_climate smelly.rb
|
16
|
+
Then it reports this Code Climate output:
|
17
|
+
"""
|
18
|
+
{
|
19
|
+
"type": "issue",
|
20
|
+
"check_name": "UncommunicativeMethodName",
|
21
|
+
"description": "Smelly#x has the name 'x'",
|
22
|
+
"categories": [
|
23
|
+
"Complexity"
|
24
|
+
],
|
25
|
+
"location": {
|
26
|
+
"path": "smelly.rb",
|
27
|
+
"lines": {
|
28
|
+
"begin": 4,
|
29
|
+
"end": 4
|
30
|
+
}
|
31
|
+
},
|
32
|
+
"remediation_points": 150000,
|
33
|
+
"content": {
|
34
|
+
"body": "An `Uncommunicative Method Name` is a method name that doesn't communicate its intent well enough.\n\nPoor names make it hard for the reader to build a mental picture of what's going on in the code. They can also be mis-interpreted; and they hurt the flow of reading, because the reader must slow down to interpret the names.\n"
|
35
|
+
},
|
36
|
+
"fingerprint": "2b41a3a4bb7de31ac4f5944bf68b7f5f"
|
37
|
+
}
|
38
|
+
NULL_BYTE_CHARACTER
|
39
|
+
{
|
40
|
+
"type": "issue",
|
41
|
+
"check_name": "UncommunicativeVariableName",
|
42
|
+
"description": "Smelly#x has the variable name 'y'",
|
43
|
+
"categories": [
|
44
|
+
"Complexity"
|
45
|
+
],
|
46
|
+
"location": {
|
47
|
+
"path": "smelly.rb",
|
48
|
+
"lines": {
|
49
|
+
"begin": 5,
|
50
|
+
"end": 5
|
51
|
+
}
|
52
|
+
},
|
53
|
+
"remediation_points": 150000,
|
54
|
+
"content": {
|
55
|
+
"body": "An `Uncommunicative Variable Name` is a variable name that doesn't communicate its intent well enough.\n\nPoor names make it hard for the reader to build a mental picture of what's going on in the code. They can also be mis-interpreted; and they hurt the flow of reading, because the reader must slow down to interpret the names.\n"
|
56
|
+
},
|
57
|
+
"fingerprint": "72f0dc8f8da5f9d7b8b29318636e5609"
|
58
|
+
}
|
59
|
+
"""
|
@@ -84,3 +84,15 @@ end
|
|
84
84
|
Then /^it reports the current version$/ do
|
85
85
|
expect(last_command_started).to have_output("reek #{Reek::Version::STRING}")
|
86
86
|
end
|
87
|
+
|
88
|
+
Then /^it reports this Code Climate output:$/ do |expected_output|
|
89
|
+
expected_issues = expected_output.split('NULL_BYTE_CHARACTER').map do |issue|
|
90
|
+
JSON.parse(issue)
|
91
|
+
end
|
92
|
+
|
93
|
+
actual_issues = last_command_started.stdout.split("\0").map do |issue|
|
94
|
+
JSON.parse(issue)
|
95
|
+
end
|
96
|
+
|
97
|
+
expect(actual_issues).to eq(expected_issues)
|
98
|
+
end
|
data/lib/reek/ast/node.rb
CHANGED
@@ -107,6 +107,15 @@ module Reek
|
|
107
107
|
1
|
108
108
|
end
|
109
109
|
|
110
|
+
# Most nodes represent only one statement (although they can have nested
|
111
|
+
# statements). The special type :begin exists primarily to contain more
|
112
|
+
# statements.
|
113
|
+
#
|
114
|
+
# @return Array of unique outer-level statements contained in this node
|
115
|
+
def statements
|
116
|
+
[self]
|
117
|
+
end
|
118
|
+
|
110
119
|
def source
|
111
120
|
loc.expression.source_buffer.name
|
112
121
|
end
|
@@ -4,6 +4,7 @@ require_relative 'reference_collector'
|
|
4
4
|
|
5
5
|
require_relative 'sexp_extensions/arguments'
|
6
6
|
require_relative 'sexp_extensions/attribute_assignments'
|
7
|
+
require_relative 'sexp_extensions/begin'
|
7
8
|
require_relative 'sexp_extensions/block'
|
8
9
|
require_relative 'sexp_extensions/case'
|
9
10
|
require_relative 'sexp_extensions/constant'
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Reek
|
4
|
+
module AST
|
5
|
+
module SexpExtensions
|
6
|
+
# Utility methods for :begin nodes.
|
7
|
+
module BeginNode
|
8
|
+
# The special type :begin exists primarily to contain more statements.
|
9
|
+
# Therefore, this method overrides the default implementation to return
|
10
|
+
# this node's children.
|
11
|
+
def statements
|
12
|
+
children
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -3,9 +3,10 @@
|
|
3
3
|
module Reek
|
4
4
|
module AST
|
5
5
|
module SexpExtensions
|
6
|
-
# Base module for utility methods for module
|
7
|
-
|
8
|
-
|
6
|
+
# Base module for utility methods for nodes that define constants: module
|
7
|
+
# definition, class definition and constant assignment.
|
8
|
+
module ConstantDefiningNodeBase
|
9
|
+
# The full name of the constant, including the name of any
|
9
10
|
# module or class it is nested inside of.
|
10
11
|
#
|
11
12
|
# For example, given code like this:
|
@@ -16,7 +17,8 @@ module Reek
|
|
16
17
|
# end
|
17
18
|
#
|
18
19
|
# The full name for the inner class will be 'Foo::Bar::Baz'. To return
|
19
|
-
# the correct name, the name of the outer context has to be passed into
|
20
|
+
# the correct name, the name of the outer context has to be passed into
|
21
|
+
# this method.
|
20
22
|
#
|
21
23
|
# @param outer [String] full name of the wrapping module or class
|
22
24
|
# @return the module's full name
|
@@ -32,27 +34,71 @@ module Reek
|
|
32
34
|
def simple_name
|
33
35
|
name.split('::').last
|
34
36
|
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# Base module for utility methods for module nodes.
|
40
|
+
module ModuleNodeBase
|
41
|
+
include ConstantDefiningNodeBase
|
35
42
|
|
36
43
|
def name
|
37
44
|
children.first.format_to_ruby
|
38
45
|
end
|
46
|
+
|
47
|
+
# In the AST, the set of children of a module that a human might identify
|
48
|
+
# is coded in three different ways.
|
49
|
+
#
|
50
|
+
# If there are no children, the last element of the module node is nil,
|
51
|
+
# like so:
|
52
|
+
#
|
53
|
+
# s(:class,
|
54
|
+
# s(:const, nil, :C),
|
55
|
+
# nil,
|
56
|
+
# nil)
|
57
|
+
#
|
58
|
+
# If there is one child, the last element of the module node is that
|
59
|
+
# child, like so:
|
60
|
+
#
|
61
|
+
# s(:class,
|
62
|
+
# s(:const, nil, :C),
|
63
|
+
# nil,
|
64
|
+
# s(:def, :f, s(:args), nil))
|
65
|
+
#
|
66
|
+
# If there is more than one child, those are wrapped as children in a
|
67
|
+
# node of type :begin, like so:
|
68
|
+
#
|
69
|
+
# s(:class,
|
70
|
+
# s(:const, nil, :Alfa),
|
71
|
+
# nil,
|
72
|
+
# s(:begin,
|
73
|
+
# s(:def, :bravo, s(:args), nil),
|
74
|
+
# s(:class, s(:const, nil, :Charlie), nil, nil)))
|
75
|
+
#
|
76
|
+
# This method unifies those three ways to avoid having to handle them
|
77
|
+
# differently.
|
78
|
+
#
|
79
|
+
# @return an array of directly visible children of the module
|
80
|
+
#
|
81
|
+
def direct_children
|
82
|
+
contents = children.last or return []
|
83
|
+
contents.statements
|
84
|
+
end
|
39
85
|
end
|
40
86
|
|
41
|
-
# Utility methods for :module nodes.
|
87
|
+
# Utility methods for module definition (:module) nodes.
|
42
88
|
module ModuleNode
|
43
89
|
include ModuleNodeBase
|
44
90
|
end
|
45
91
|
|
46
|
-
# Utility methods for :class nodes.
|
92
|
+
# Utility methods for class definition (:class) nodes.
|
47
93
|
module ClassNode
|
48
94
|
include ModuleNodeBase
|
49
95
|
|
50
96
|
def superclass() children[1] end
|
51
97
|
end
|
52
98
|
|
53
|
-
# Utility methods for :casgn nodes.
|
99
|
+
# Utility methods for constant assignment (:casgn) nodes.
|
54
100
|
module CasgnNode
|
55
|
-
include
|
101
|
+
include ConstantDefiningNodeBase
|
56
102
|
|
57
103
|
def defines_module?
|
58
104
|
call = constant_definition
|
@@ -10,7 +10,6 @@ module Reek
|
|
10
10
|
#
|
11
11
|
# A context wrapper for any module found in a syntax tree.
|
12
12
|
#
|
13
|
-
# :reek:FeatureEnvy
|
14
13
|
class ModuleContext < CodeContext
|
15
14
|
attr_reader :visibility_tracker
|
16
15
|
|
@@ -74,10 +73,12 @@ module Reek
|
|
74
73
|
# However, if the module is empty, it is not considered a namespace module.
|
75
74
|
#
|
76
75
|
# @return true if the module is a namespace module
|
76
|
+
#
|
77
|
+
# :reek:FeatureEnvy
|
77
78
|
def namespace_module?
|
78
79
|
return false if exp.type == :casgn
|
79
|
-
|
80
|
-
|
80
|
+
children = exp.direct_children
|
81
|
+
children.any? && children.all? { |child| [:casgn, :class, :module].include? child.type }
|
81
82
|
end
|
82
83
|
|
83
84
|
def track_visibility(visibility, names)
|
@@ -92,6 +93,8 @@ module Reek
|
|
92
93
|
names: names
|
93
94
|
end
|
94
95
|
|
96
|
+
private
|
97
|
+
|
95
98
|
def instance_method_children
|
96
99
|
children.select(&:instance_method?)
|
97
100
|
end
|
@@ -7,9 +7,10 @@ module Reek
|
|
7
7
|
# Check syntax errors.
|
8
8
|
# Note: this detector is called by examiner directly unlike other detectors.
|
9
9
|
class Syntax < BaseDetector
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
# Context duck type for this atypical smell detector
|
11
|
+
DummyContext = Struct.new(:exp, :full_name)
|
12
|
+
# Exp duck type for this atypical smell detector
|
13
|
+
DummyExp = Struct.new(:source)
|
13
14
|
|
14
15
|
def self.contexts
|
15
16
|
[]
|
@@ -21,9 +22,12 @@ module Reek
|
|
21
22
|
|
22
23
|
# :reek:FeatureEnvy
|
23
24
|
def smells_from_source(source)
|
25
|
+
context = DummyContext.new(
|
26
|
+
DummyExp.new(source.origin),
|
27
|
+
'This file')
|
24
28
|
source.diagnostics.map do |diagnostic|
|
25
29
|
smell_warning(
|
26
|
-
context:
|
30
|
+
context: context,
|
27
31
|
lines: [diagnostic.location.line],
|
28
32
|
message: "has #{diagnostic.message}")
|
29
33
|
end
|
@@ -12,13 +12,6 @@ module Reek
|
|
12
12
|
class ShouldReekOf
|
13
13
|
include RSpec::Matchers::Composable
|
14
14
|
|
15
|
-
# Variant of Examiner that doesn't swallow exceptions
|
16
|
-
class UnsafeExaminer < Examiner
|
17
|
-
def run
|
18
|
-
examine_tree
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
15
|
attr_reader :failure_message, :failure_message_when_negated
|
23
16
|
|
24
17
|
def initialize(smell_type_or_class,
|
@@ -32,9 +25,9 @@ module Reek
|
|
32
25
|
|
33
26
|
def matches?(source)
|
34
27
|
@matching_smell_types = nil
|
35
|
-
self.examiner =
|
36
|
-
|
37
|
-
|
28
|
+
self.examiner = Examiner.new(source,
|
29
|
+
filter_by_smells: [smell_type],
|
30
|
+
configuration: configuration)
|
38
31
|
set_failure_messages
|
39
32
|
matching_smell_details?
|
40
33
|
end
|
data/lib/reek/version.rb
CHANGED
@@ -18,7 +18,7 @@ RSpec.describe Reek::SmellDetectors::IrresponsibleModule do
|
|
18
18
|
it 'does count all occurences' do
|
19
19
|
src = <<-EOS
|
20
20
|
class Alfa
|
21
|
-
# Method is necessary because we don't count
|
21
|
+
# Method is necessary because we don't count namespace classes.
|
22
22
|
def bravo; end
|
23
23
|
class Charlie
|
24
24
|
end
|
@@ -40,21 +40,21 @@ RSpec.describe Reek::SmellDetectors::IrresponsibleModule do
|
|
40
40
|
expect(src).to reek_of(:IrresponsibleModule)
|
41
41
|
end
|
42
42
|
|
43
|
-
it "does not report
|
43
|
+
it "does not report a #{scope} having a comment" do
|
44
44
|
src = <<-EOS
|
45
|
-
#
|
45
|
+
# Do not report me, I'm responsible!
|
46
46
|
#{scope} Alfa; end
|
47
|
-
|
48
|
-
#{scope} Alfa; def bravo; end; end
|
49
47
|
EOS
|
50
48
|
|
51
49
|
expect(src).not_to reek_of(:IrresponsibleModule)
|
52
50
|
end
|
53
51
|
|
54
|
-
it "does not report
|
52
|
+
it "does not report re-opened #{scope} in the same file" do
|
55
53
|
src = <<-EOS
|
56
|
-
#
|
54
|
+
# This comment describes Alfa
|
57
55
|
#{scope} Alfa; end
|
56
|
+
|
57
|
+
#{scope} Alfa; def bravo; end; end
|
58
58
|
EOS
|
59
59
|
|
60
60
|
expect(src).not_to reek_of(:IrresponsibleModule)
|
@@ -73,7 +73,7 @@ RSpec.describe Reek::SmellDetectors::IrresponsibleModule do
|
|
73
73
|
|
74
74
|
it "reports a #{scope} with a preceding comment with intermittent material" do
|
75
75
|
src = <<-EOS
|
76
|
-
# This is a
|
76
|
+
# This is a comment that should not be related to Bravo
|
77
77
|
|
78
78
|
require 'alfa'
|
79
79
|
|
@@ -87,13 +87,13 @@ RSpec.describe Reek::SmellDetectors::IrresponsibleModule do
|
|
87
87
|
it "reports a #{scope} with only a trailing comment" do
|
88
88
|
src = <<-EOS
|
89
89
|
#{scope} Alfa
|
90
|
-
end #
|
90
|
+
end # This belongs to Alfa but doesn't count
|
91
91
|
EOS
|
92
92
|
|
93
93
|
expect(src).to reek_of(:IrresponsibleModule)
|
94
94
|
end
|
95
95
|
|
96
|
-
it "does not report #{scope} used only as
|
96
|
+
it "does not report #{scope} used only as a namespace" do
|
97
97
|
src = <<-EOS
|
98
98
|
#{scope} Alfa
|
99
99
|
# Describes Bravo
|
@@ -104,10 +104,28 @@ RSpec.describe Reek::SmellDetectors::IrresponsibleModule do
|
|
104
104
|
end
|
105
105
|
EOS
|
106
106
|
|
107
|
-
expect(src).not_to reek_of(:IrresponsibleModule)
|
107
|
+
expect(src).not_to reek_of(:IrresponsibleModule, context: 'Alfa')
|
108
108
|
end
|
109
109
|
|
110
|
-
it "
|
110
|
+
it "does not report #{scope} used only as a namespace for several nested moduless" do
|
111
|
+
src = <<-EOS
|
112
|
+
#{scope} Alfa
|
113
|
+
# Describes Bravo
|
114
|
+
class Bravo
|
115
|
+
def charlie
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
# Describes Delta
|
120
|
+
module Delta
|
121
|
+
end
|
122
|
+
end
|
123
|
+
EOS
|
124
|
+
|
125
|
+
expect(src).not_to reek_of(:IrresponsibleModule, context: 'Alfa')
|
126
|
+
end
|
127
|
+
|
128
|
+
it "reports #{scope} that is used as a namespace but also has methods" do
|
111
129
|
src = <<-EOS
|
112
130
|
#{scope} Alfa
|
113
131
|
def bravo
|
@@ -122,7 +140,7 @@ RSpec.describe Reek::SmellDetectors::IrresponsibleModule do
|
|
122
140
|
expect(src).to reek_of(:IrresponsibleModule, context: 'Alfa')
|
123
141
|
end
|
124
142
|
|
125
|
-
it "reports #{scope} that
|
143
|
+
it "reports #{scope} that is used as a namespace but also has singleton methods" do
|
126
144
|
src = <<-EOS
|
127
145
|
#{scope} Alfa
|
128
146
|
def self.bravo
|
@@ -147,10 +165,40 @@ RSpec.describe Reek::SmellDetectors::IrresponsibleModule do
|
|
147
165
|
end
|
148
166
|
EOS
|
149
167
|
|
150
|
-
expect(src).not_to reek_of(:IrresponsibleModule)
|
168
|
+
expect(src).not_to reek_of(:IrresponsibleModule, context: 'Alfa')
|
169
|
+
end
|
170
|
+
|
171
|
+
it "does not report #{scope} only containing constants" do
|
172
|
+
src = <<-EOS
|
173
|
+
#{scope} Alfa
|
174
|
+
Bravo = 23
|
175
|
+
end
|
176
|
+
EOS
|
177
|
+
|
178
|
+
expect(src).not_to reek_of(:IrresponsibleModule, context: 'Alfa')
|
179
|
+
end
|
180
|
+
|
181
|
+
it "reports #{scope} that contains method calls" do
|
182
|
+
src = <<-EOS
|
183
|
+
#{scope} Alfa
|
184
|
+
bravo :charlie
|
185
|
+
end
|
186
|
+
EOS
|
187
|
+
|
188
|
+
expect(src).to reek_of(:IrresponsibleModule, context: 'Alfa')
|
189
|
+
end
|
190
|
+
|
191
|
+
it "reports #{scope} that contains non-constant assignments" do
|
192
|
+
src = <<-EOS
|
193
|
+
#{scope} Alfa
|
194
|
+
bravo = charlie
|
195
|
+
end
|
196
|
+
EOS
|
197
|
+
|
198
|
+
expect(src).to reek_of(:IrresponsibleModule, context: 'Alfa')
|
151
199
|
end
|
152
200
|
|
153
|
-
it "reports
|
201
|
+
it "reports an irresponsible #{scope} defined through assignment" do
|
154
202
|
src = <<-EOS
|
155
203
|
# Alfa is responsible, but Bravo is not
|
156
204
|
#{scope} Alfa
|
@@ -174,6 +222,7 @@ RSpec.describe Reek::SmellDetectors::IrresponsibleModule do
|
|
174
222
|
|
175
223
|
it 'does not report constants that are not classes' do
|
176
224
|
src = <<-EOS
|
225
|
+
# Alfa is responsible
|
177
226
|
#{scope} Alfa
|
178
227
|
Bravo = 23
|
179
228
|
Charlie = Hash.new
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require_relative '../../spec_helper'
|
2
|
+
require_lib 'reek/smell_detectors/syntax'
|
3
|
+
|
4
|
+
RSpec.describe Reek::SmellDetectors::Syntax do
|
5
|
+
it 'reports the right values' do
|
6
|
+
src = <<-EOS
|
7
|
+
class Alfa
|
8
|
+
edn
|
9
|
+
EOS
|
10
|
+
|
11
|
+
expect(src).to reek_of(:Syntax,
|
12
|
+
lines: [3],
|
13
|
+
context: 'This file',
|
14
|
+
message: 'has unexpected token $end',
|
15
|
+
source: 'string')
|
16
|
+
end
|
17
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: reek
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.7.
|
4
|
+
version: 4.7.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kevin Rutherford
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2017-
|
14
|
+
date: 2017-06-12 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: codeclimate-engine-rb
|
@@ -162,6 +162,7 @@ files:
|
|
162
162
|
- features/configuration_via_source_comments/well_formed_source_comments.feature
|
163
163
|
- features/programmatic_access.feature
|
164
164
|
- features/rake_task/rake_task.feature
|
165
|
+
- features/reports/codeclimate.feature
|
165
166
|
- features/reports/json.feature
|
166
167
|
- features/reports/reports.feature
|
167
168
|
- features/reports/yaml.feature
|
@@ -180,6 +181,7 @@ files:
|
|
180
181
|
- lib/reek/ast/sexp_extensions.rb
|
181
182
|
- lib/reek/ast/sexp_extensions/arguments.rb
|
182
183
|
- lib/reek/ast/sexp_extensions/attribute_assignments.rb
|
184
|
+
- lib/reek/ast/sexp_extensions/begin.rb
|
183
185
|
- lib/reek/ast/sexp_extensions/block.rb
|
184
186
|
- lib/reek/ast/sexp_extensions/case.rb
|
185
187
|
- lib/reek/ast/sexp_extensions/constant.rb
|
@@ -390,6 +392,7 @@ files:
|
|
390
392
|
- spec/reek/smell_detectors/prima_donna_method_spec.rb
|
391
393
|
- spec/reek/smell_detectors/repeated_conditional_spec.rb
|
392
394
|
- spec/reek/smell_detectors/subclassed_from_core_class_spec.rb
|
395
|
+
- spec/reek/smell_detectors/syntax_spec.rb
|
393
396
|
- spec/reek/smell_detectors/too_many_constants_spec.rb
|
394
397
|
- spec/reek/smell_detectors/too_many_instance_variables_spec.rb
|
395
398
|
- spec/reek/smell_detectors/too_many_methods_spec.rb
|