reek 1.4.0 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +5 -0
  3. data/README.md +70 -92
  4. data/config/defaults.reek +3 -0
  5. data/features/samples.feature +24 -20
  6. data/features/step_definitions/reek_steps.rb +1 -1
  7. data/features/support/env.rb +7 -7
  8. data/lib/reek/core/code_context.rb +1 -1
  9. data/lib/reek/core/code_parser.rb +19 -18
  10. data/lib/reek/core/method_context.rb +8 -7
  11. data/lib/reek/core/module_context.rb +1 -1
  12. data/lib/reek/core/smell_repository.rb +1 -0
  13. data/lib/reek/core/sniffer.rb +3 -1
  14. data/lib/reek/rake/task.rb +1 -5
  15. data/lib/reek/smell_description.rb +26 -0
  16. data/lib/reek/smell_warning.rb +35 -49
  17. data/lib/reek/smells.rb +1 -0
  18. data/lib/reek/smells/attribute.rb +1 -1
  19. data/lib/reek/smells/control_parameter.rb +14 -7
  20. data/lib/reek/smells/data_clump.rb +1 -1
  21. data/lib/reek/smells/duplicate_method_call.rb +2 -9
  22. data/lib/reek/smells/module_initialize.rb +38 -0
  23. data/lib/reek/smells/nested_iterators.rb +1 -1
  24. data/lib/reek/smells/nil_check.rb +3 -3
  25. data/lib/reek/smells/repeated_conditional.rb +3 -2
  26. data/lib/reek/smells/smell_detector.rb +1 -1
  27. data/lib/reek/smells/too_many_instance_variables.rb +1 -1
  28. data/lib/reek/smells/too_many_methods.rb +1 -1
  29. data/lib/reek/smells/uncommunicative_method_name.rb +0 -4
  30. data/lib/reek/smells/uncommunicative_parameter_name.rb +0 -4
  31. data/lib/reek/smells/uncommunicative_variable_name.rb +11 -9
  32. data/lib/reek/smells/utility_function.rb +2 -2
  33. data/lib/reek/source/ast_node.rb +40 -0
  34. data/lib/reek/source/ast_node_class_map.rb +37 -0
  35. data/lib/reek/source/reference_collector.rb +3 -3
  36. data/lib/reek/source/sexp_extensions.rb +133 -59
  37. data/lib/reek/source/sexp_formatter.rb +10 -4
  38. data/lib/reek/source/sexp_node.rb +25 -17
  39. data/lib/reek/source/source_code.rb +21 -9
  40. data/lib/reek/source/tree_dresser.rb +10 -33
  41. data/lib/reek/version.rb +1 -1
  42. data/reek.gemspec +2 -4
  43. data/spec/matchers/smell_of_matcher.rb +9 -1
  44. data/spec/quality/reek_source_spec.rb +0 -35
  45. data/spec/reek/core/code_context_spec.rb +22 -8
  46. data/spec/reek/core/method_context_spec.rb +10 -10
  47. data/spec/reek/smell_description_spec.rb +43 -0
  48. data/spec/reek/smell_warning_spec.rb +0 -3
  49. data/spec/reek/smells/control_parameter_spec.rb +24 -0
  50. data/spec/reek/smells/feature_envy_spec.rb +50 -17
  51. data/spec/reek/smells/irresponsible_module_spec.rb +25 -17
  52. data/spec/reek/smells/module_initialize_spec.rb +20 -0
  53. data/spec/reek/smells/prima_donna_method_spec.rb +2 -2
  54. data/spec/reek/smells/repeated_conditional_spec.rb +10 -4
  55. data/spec/reek/smells/too_many_instance_variables_spec.rb +47 -21
  56. data/spec/reek/smells/too_many_statements_spec.rb +11 -1
  57. data/spec/reek/smells/uncommunicative_variable_name_spec.rb +1 -1
  58. data/spec/reek/smells/utility_function_spec.rb +26 -25
  59. data/spec/reek/source/sexp_extensions_spec.rb +164 -91
  60. data/spec/reek/source/sexp_formatter_spec.rb +13 -1
  61. data/spec/reek/source/sexp_node_spec.rb +5 -5
  62. data/spec/reek/source/source_code_spec.rb +18 -6
  63. data/spec/reek/source/tree_dresser_spec.rb +5 -5
  64. data/spec/spec_helper.rb +8 -4
  65. metadata +16 -50
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6002373fce680e5b27b465fef2e8809c9cc0301a
4
- data.tar.gz: abf6a5e6e1ab36e4d940bcea6f83893df1c230a5
3
+ metadata.gz: 2bd3b362caed94f8eec563376a0542677d215b9c
4
+ data.tar.gz: 85af0be0c7132c4718b145b114d2013a836a8880
5
5
  SHA512:
6
- metadata.gz: 3b6d532b9a3e596ce386b1edd8e389dffb31a4b9276cbc584d3c216d9a21d67b5cf84dc69f9cf99ec7f27abc4ea0e2fb1fd63153bd9772ba2d8a47a86e7444d5
7
- data.tar.gz: 9db171e0f2a6096d8d5f0093feb9d7a42a119d300d19403e689caaef6444287ca1401a4e0df0338e38caf8b7ddcdd0d72908baeb1446ec499bb15b382ca2fb6a
6
+ metadata.gz: e933370d907c7d45079a56e513c88363b3b6faeb8244651e6ac4a6f3e08242087e705490c8a5d86eee80fb585f5f74a3af7f5d2d49e42e672081b0e9d861f32c
7
+ data.tar.gz: c0bcc02e84cd9475db5f2c59c1d74c9fc42e983ff79e373f951092224df4df8784fd00b2ce8d43a306d4ebe42e742dba2507e42893aa88a4798a47dc7874d726
data/CHANGELOG CHANGED
@@ -1,3 +1,8 @@
1
+ == 1.5.0
2
+
3
+ * (mvz) Parse with the parse gem
4
+ * (mvz) Add ModuleInitialize smell
5
+
1
6
  == 1.4.0
2
7
 
3
8
  * (Gilles Leblanc) Corrects UnusedParameter with keyword arguments with splat
data/README.md CHANGED
@@ -1,7 +1,6 @@
1
1
  # Reek -- code smell detection for Ruby
2
2
 
3
-
4
- ### Overview
3
+ ## Overview
5
4
 
6
5
 
7
6
  [![Build Status](https://secure.travis-ci.org/troessner/reek.png?branch=master)](http://travis-ci.org/troessner/reek?branch=master)
@@ -9,59 +8,25 @@
9
8
  [![Dependency Status](https://gemnasium.com/troessner/reek.png)](https://gemnasium.com/troessner/reek)
10
9
  [![Inline docs](http://inch-ci.org/github/troessner/reek.png)](http://inch-ci.org/github/troessner/reek)
11
10
 
11
+ ## Quickstart
12
12
 
13
- ### Synopsis
14
-
13
+ `reek` is a tool that examines Ruby classes, modules and methods and reports any [Code Smells](https://github.com/troessner/reek/wiki/Code-Smells) it finds. Install it like this:
15
14
 
16
- Reek is a tool that examines Ruby classes, modules and methods and
17
- reports any code smells it finds. Install it like this:
18
-
19
- ```bash
20
- $ gem install reek
15
+ ```Bash
16
+ gem install reek
21
17
  ```
22
18
 
23
19
  and run it like this:
24
20
 
25
- ```bash
26
- $ reek [options] [dir_or_source_file]*
21
+ ```Bash
22
+ reek [options] [dir_or_source_file]*
27
23
  ```
28
24
 
29
- For a full list of command-line options see the
30
- [Reek wiki](https://github.com/troessner/reek/wiki/command-line-options)
31
- or run
32
-
33
- ```bash
34
- $ reek --help
35
- ```
36
-
37
- ## Usage
38
-
39
- For scanning the current directory you're in do a
40
-
41
- ```bash
42
- $ reek .
43
- ```
25
+ ## Example
44
26
 
45
- (Mind the "." at the end to indicate the current directory)
27
+ Imagine a source file <tt>demo.rb</tt> containing:
46
28
 
47
-
48
- Likewise you can scan specific directories like this
49
-
50
- ```bash
51
- $ reek lib/your/files
52
- ```
53
-
54
- Note that if you just call
55
-
56
- ```bash
57
- $ reek
58
- ```
59
-
60
- without any arguments reek will wait for input from STDIN.
61
-
62
- Given a source file <tt>demo.rb</tt> containing:
63
-
64
- ```ruby
29
+ ```Ruby
65
30
  class Dirty
66
31
  # This method smells of :reek:NestedIterators but ignores them
67
32
  def awful(x, y, offset = 0, log = false)
@@ -74,7 +39,7 @@ end
74
39
 
75
40
  Reek will report the following code smells in this file:
76
41
 
77
- ```bash
42
+ ```
78
43
  $ reek demo.rb
79
44
  spec/samples/demo/demo.rb -- 6 warnings:
80
45
  Dirty has no descriptive comment (IrresponsibleModule)
@@ -83,48 +48,55 @@ spec/samples/demo/demo.rb -- 6 warnings:
83
48
  Dirty#awful has the parameter name 'x' (UncommunicativeName)
84
49
  Dirty#awful has the parameter name 'y' (UncommunicativeName)
85
50
  Dirty#awful has the variable name 'w' (UncommunicativeName)
51
+ Dirty#awful has unused parameter 'log' (UnusedParameters)
52
+ Dirty#awful has unused parameter 'offset' (UnusedParameters)
53
+ Dirty#awful has unused parameter 'x' (UnusedParameters)
54
+ Dirty#awful has unused parameter 'y' (UnusedParameters)
86
55
  ```
87
56
 
88
- ## Features
57
+ ## Code smells
89
58
 
90
- Reek currently includes checks for some aspects of Control Couple,
91
- Data Clump, Feature Envy, Large Class, Long Method, Long Parameter List,
92
- Simulated Polymorphism, Uncommunicative Name and more.
93
- See the [Reek wiki](https://github.com/troessner/reek/wiki/code-smells)
94
- for up to date details of exactly what Reek will check in your code.
59
+ `reek` currently includes checks for some aspects of [Control Couple](https://github.com/troessner/reek/wiki/Control-Couple), [Data Clump](https://github.com/troessner/reek/wiki/Data-Clump), [Feature Envy](https://github.com/troessner/reek/wiki/Feature-Envy), [Large Class](https://github.com/troessner/reek/wiki/Large-Class), [Long Parameter List](https://github.com/troessner/reek/wiki/Long-Parameter-List), [Simulated Polymorphism](https://github.com/troessner/reek/wiki/Simulated-Polymorphism), [Too Many Statements](https://github.com/troessner/reek/wiki/Too-Many-Statements), [Uncommunicative Name](https://github.com/troessner/reek/wiki/Uncommunicative-Name), [Unused Parameters](https://github.com/troessner/reek/wiki/Unused-Parameters) and more. See the [Code Smells](https://github.com/troessner/reek/wiki/Code-Smells) for up to date details of exactly what `reek` will check in your code.
95
60
 
96
- ### Integration
61
+ ## Configuration
97
62
 
98
- Basically there are two ways to use reek in your project except for the obvious
99
- static code analysis:
63
+ For a basic overview, run
100
64
 
101
- 1. Use Reek's [Rake Task](https://github.com/troessner/reek/wiki/Rake-Task) to
102
- easily add Reek to your Rakefile
65
+ ```Ruby
66
+ reek --help
67
+ ```
103
68
 
104
- 2. Add Reek's custom matcher to your Rspec examples like this:
69
+ For a summary of those CLI options see [Command-Line Options](https://github.com/troessner/reek/wiki/Command-Line-Options).
105
70
 
106
- ```Ruby
107
- require 'rubygems'
108
- require 'spec'
109
- require 'reek'
110
- require 'reek/spec'
71
+ Apart from that, `reek` offers quite a few ways for configuring it:
72
+
73
+ * The first thing you probably want to check out are the [Basic Smell Options](https://github.com/troessner/reek/wiki/Basic-Smell-Options)
74
+ * `reek` is not the police. In case you need to suppress a smell warning for whatever reasons have a look at [Smell Suppression](https://github.com/troessner/reek/wiki/Smell-Suppression)
75
+ * Lastly there are a couple of ways to configure `reek` via [Configuration Files](https://github.com/troessner/reek/wiki/Configuration-Files)
76
+
77
+ ## Integration
111
78
 
112
- include Reek::Spec
79
+ Besides the obvious
113
80
 
114
- my_precious_code = 'class C; def m; end; end'
115
- my_precious_code.should_not reek # Well, it does.
81
+ ```Bash
82
+ reek [options] [dir_or_source_file]*
116
83
  ```
117
84
 
118
- ## Contributing
85
+ there are quite a few other ways how to use reek in your projects:
119
86
 
120
- * Fork the repo
121
- * Create a feature branch
122
- * Make sure the tests pass (see below)
123
- * Submit a pull request
87
+ * Use `reek`'s [Rake Task](https://github.com/troessner/reek/wiki/Rake-Task) to automate detecting code smells
88
+ * Add `reek`'s custom matcher to your [RSpec examples](https://github.com/troessner/reek/wiki/RSpec-Integration)
89
+ * Include `reek` using the [Developer API](https://github.com/troessner/reek/wiki/Developer-Api)
124
90
 
125
- ### Running the tests
91
+ ## Developing reek / Contributing
126
92
 
127
- Either just `bundle exec rake` to run all or, if you want to be specific:
93
+ The first thing you want to do after checking out the source code is to run bundler
94
+
95
+ ```
96
+ bundle install
97
+ ```
98
+
99
+ and then to run the tests:
128
100
 
129
101
  ```bash
130
102
  bundle exec rspec spec/your/file_spec.rb # Runs all tests in spec/your/file_spec.rb
@@ -133,7 +105,28 @@ bundle exec cucumber features/your_file.feature # Runs all scenarios in your
133
105
  bundle exec cucumber features/your_file.feature:23 # Runs scenario at line 23
134
106
  ```
135
107
 
136
- ## Miscellaneous
108
+ Or just run the whole test suite by running
109
+
110
+ ```
111
+ bundle exec rake
112
+ ```
113
+
114
+ From then on continue by following the establish [pull request workflow](https://help.github.com/articles/using-pull-requests/).
115
+
116
+ If you don't feel like getting your hands dirty with code there a still other ways you can help us:
117
+
118
+ * Work on the [wiki](https://github.com/troessner/reek/wiki)
119
+ * Open up an [issue](https://github.com/troessner/reek/issues) and report bugs or suggest other improvements
120
+
121
+ ## Output formats
122
+
123
+ `reek` supports 3 output formats:
124
+
125
+ * plain text (default)
126
+ * html (-H, --html)
127
+ * yaml (-y, --yaml)
128
+
129
+ ## Additional resources
137
130
 
138
131
  ### Tools
139
132
 
@@ -146,22 +139,7 @@ TextMate Bundle for `reek`:
146
139
  Colorful output for `reek`: [Preek](https://github.com/joenas/preek) (also with
147
140
  [Guard::Preek](https://github.com/joenas/guard-preek))
148
141
 
149
- ### Dependencies
150
-
151
- Reek makes use of the following other gems:
152
-
153
- * ruby_parser
154
- * sexp_processor
155
- * ruby2ruby
156
- * rainbow
157
-
158
- ### Learn More
159
-
160
- Find out more about Reek from any of the following sources:
142
+ ### Find out more:
161
143
 
162
- * Browse the Reek documentation at
163
- [https://github.com/troessner/reek/wiki](https://github.com/troessner/reek/wiki)
164
- * Browse the code or install the latest development version from
165
- [https://github.com/troessner/reek/tree](https://github.com/troessner/reek/tree)
166
- * Read the code API at
167
- [http://rdoc.info/projects/troessner/reek](http://rdoc.info/projects/troessner/reek)
144
+ * [Stack Overflow](http://stackoverflow.com/questions/tagged/reek)
145
+ * [RDoc](http://rdoc.info/projects/troessner/reek)
data/config/defaults.reek CHANGED
@@ -38,6 +38,9 @@ LongYieldList:
38
38
  enabled: true
39
39
  exclude: []
40
40
  max_params: 3
41
+ ModuleInitialize:
42
+ enabled: true
43
+ exclude: []
41
44
  NestedIterators:
42
45
  enabled: true
43
46
  exclude: []
@@ -10,7 +10,8 @@ Feature: Basic smell detection
10
10
  Then the exit status indicates smells
11
11
  And it reports:
12
12
  """
13
- spec/samples/inline.rb -- 41 warnings:
13
+ spec/samples/inline.rb -- 43 warnings:
14
+ CompilationError has no descriptive comment (IrresponsibleModule)
14
15
  File has no descriptive comment (IrresponsibleModule)
15
16
  File#self.write_with_backup has approx 6 statements (TooManyStatements)
16
17
  Inline declares the class variable @@directory (ClassVariable)
@@ -24,7 +25,7 @@ Feature: Basic smell detection
24
25
  Inline::C tests $DEBUG at least 7 times (RepeatedConditional)
25
26
  Inline::C tests $TESTING at least 4 times (RepeatedConditional)
26
27
  Inline::C tests @@type_map.has_key?(type) at least 3 times (RepeatedConditional)
27
- Inline::C#build calls ($? != 0) twice (DuplicateMethodCall)
28
+ Inline::C#build calls $? != 0 twice (DuplicateMethodCall)
28
29
  Inline::C#build calls Inline.directory 5 times (DuplicateMethodCall)
29
30
  Inline::C#build calls io.puts 6 times (DuplicateMethodCall)
30
31
  Inline::C#build calls io.puts("#endif") twice (DuplicateMethodCall)
@@ -51,6 +52,7 @@ Feature: Basic smell detection
51
52
  Inline::C#strip_comments doesn't depend on instance state (UtilityFunction)
52
53
  Inline::C#strip_comments refers to src more than self (FeatureEnvy)
53
54
  Module#inline calls Inline.const_get(lang) twice (DuplicateMethodCall)
55
+ Module#inline calls options[:testing] twice (DuplicateMethodCall)
54
56
  Module#inline has approx 12 statements (TooManyStatements)
55
57
  """
56
58
 
@@ -59,14 +61,14 @@ Feature: Basic smell detection
59
61
  Then the exit status indicates smells
60
62
  And it reports:
61
63
  """
62
- spec/samples/optparse.rb -- 109 warnings:
64
+ spec/samples/optparse.rb -- 111 warnings:
63
65
  OptionParser has at least 42 methods (TooManyMethods)
64
66
  OptionParser has the variable name 'f' (UncommunicativeVariableName)
65
67
  OptionParser has the variable name 'k' (UncommunicativeVariableName)
66
68
  OptionParser has the variable name 'o' (UncommunicativeVariableName)
67
69
  OptionParser has the variable name 's' (UncommunicativeVariableName)
68
70
  OptionParser has the variable name 'v' (UncommunicativeVariableName)
69
- OptionParser tests (argv.size == 1) and Array.===(argv[0]) at least 3 times (RepeatedConditional)
71
+ OptionParser tests (argv.size == 1) && (Array === argv[0]) at least 3 times (RepeatedConditional)
70
72
  OptionParser tests a at least 7 times (RepeatedConditional)
71
73
  OptionParser tests default_pattern at least 7 times (RepeatedConditional)
72
74
  OptionParser tests not_style at least 3 times (RepeatedConditional)
@@ -79,15 +81,15 @@ Feature: Basic smell detection
79
81
  OptionParser#getopts has approx 18 statements (TooManyStatements)
80
82
  OptionParser#load has approx 6 statements (TooManyStatements)
81
83
  OptionParser#load has the variable name 's' (UncommunicativeVariableName)
82
- OptionParser#make_switch calls (long << (o = q.downcase)) twice (DuplicateMethodCall)
83
- OptionParser#make_switch calls (sdesc << "-#{q}") twice (DuplicateMethodCall)
84
- OptionParser#make_switch calls default_style.guess((arg = a)) 4 times (DuplicateMethodCall)
85
- OptionParser#make_switch calls notwice((a ? (Object) : (TrueClass)), klass, "type") twice (DuplicateMethodCall)
84
+ OptionParser#make_switch calls default_style.guess(arg = a) 4 times (DuplicateMethodCall)
85
+ OptionParser#make_switch calls long << (o = q.downcase) twice (DuplicateMethodCall)
86
86
  OptionParser#make_switch calls notwice(NilClass, klass, "type") twice (DuplicateMethodCall)
87
+ OptionParser#make_switch calls notwice(if a ... end, klass, "type") twice (DuplicateMethodCall)
87
88
  OptionParser#make_switch calls pattern.method(:convert) twice (DuplicateMethodCall)
88
89
  OptionParser#make_switch calls pattern.method(:convert).to_proc twice (DuplicateMethodCall)
89
90
  OptionParser#make_switch calls pattern.respond_to?(:convert) twice (DuplicateMethodCall)
90
91
  OptionParser#make_switch calls q.downcase 3 times (DuplicateMethodCall)
92
+ OptionParser#make_switch calls sdesc << "-#{q}" twice (DuplicateMethodCall)
91
93
  OptionParser#make_switch calls search(:atype, FalseClass) twice (DuplicateMethodCall)
92
94
  OptionParser#make_switch calls search(:atype, o) 6 times (DuplicateMethodCall)
93
95
  OptionParser#make_switch contains iterators nested 3 deep (NestedIterators)
@@ -120,7 +122,9 @@ Feature: Basic smell detection
120
122
  OptionParser#self.inc performs a nil-check. (NilCheck)
121
123
  OptionParser#summarize has 4 parameters (LongParameterList)
122
124
  OptionParser#summarize has the variable name 'l' (UncommunicativeVariableName)
125
+ OptionParser#summarize is controlled by argument blk (ControlParameter)
123
126
  OptionParser#ver has the variable name 'v' (UncommunicativeVariableName)
127
+ OptionParser::Arguable has initialize method (ModuleInitialize)
124
128
  OptionParser::Arguable#options has approx 6 statements (TooManyStatements)
125
129
  OptionParser::Arguable#options= is controlled by argument opt (ControlParameter)
126
130
  OptionParser::CompletingHash#match contains iterators nested 2 deep (NestedIterators)
@@ -152,13 +156,13 @@ Feature: Basic smell detection
152
156
  OptionParser::Switch#self.guess has approx 6 statements (TooManyStatements)
153
157
  OptionParser::Switch#self.guess has the variable name 't' (UncommunicativeVariableName)
154
158
  OptionParser::Switch#self.incompatible_argument_styles has the parameter name 't' (UncommunicativeParameterName)
155
- OptionParser::Switch#summarize calls (indent + l) twice (DuplicateMethodCall)
159
+ OptionParser::Switch#summarize calls indent + l twice (DuplicateMethodCall)
160
+ OptionParser::Switch#summarize calls left.collect do |s| ... end twice (DuplicateMethodCall)
161
+ OptionParser::Switch#summarize calls left.collect do |s| ... end.max twice (DuplicateMethodCall)
162
+ OptionParser::Switch#summarize calls left.collect do |s| ... end.max.to_i twice (DuplicateMethodCall)
156
163
  OptionParser::Switch#summarize calls left.collect twice (DuplicateMethodCall)
157
- OptionParser::Switch#summarize calls left.collect { |s| s.length } twice (DuplicateMethodCall)
158
- OptionParser::Switch#summarize calls left.collect { |s| s.length }.max twice (DuplicateMethodCall)
159
- OptionParser::Switch#summarize calls left.collect { |s| s.length }.max.to_i twice (DuplicateMethodCall)
160
164
  OptionParser::Switch#summarize calls left.shift twice (DuplicateMethodCall)
161
- OptionParser::Switch#summarize calls left[-1] 3 times (DuplicateMethodCall)
165
+ OptionParser::Switch#summarize calls left[(-1)] 3 times (DuplicateMethodCall)
162
166
  OptionParser::Switch#summarize calls s.length 3 times (DuplicateMethodCall)
163
167
  OptionParser::Switch#summarize contains iterators nested 2 deep (NestedIterators)
164
168
  OptionParser::Switch#summarize has 5 parameters (LongParameterList)
@@ -190,11 +194,11 @@ Feature: Basic smell detection
190
194
  RedCloth#block_markdown_lists has unused parameter 'text' (UnusedParameters)
191
195
  RedCloth#block_markdown_rule refers to text more than self (FeatureEnvy)
192
196
  RedCloth#block_markdown_setext refers to text more than self (FeatureEnvy)
193
- RedCloth#block_textile_lists calls (line_id - 1) twice (DuplicateMethodCall)
194
197
  RedCloth#block_textile_lists calls depth.last 5 times (DuplicateMethodCall)
195
198
  RedCloth#block_textile_lists calls depth.last.length twice (DuplicateMethodCall)
196
199
  RedCloth#block_textile_lists calls depth[i] twice (DuplicateMethodCall)
197
- RedCloth#block_textile_lists calls lines[(line_id - 1)] twice (DuplicateMethodCall)
200
+ RedCloth#block_textile_lists calls line_id - 1 twice (DuplicateMethodCall)
201
+ RedCloth#block_textile_lists calls lines[line_id - 1] twice (DuplicateMethodCall)
198
202
  RedCloth#block_textile_lists calls tl.length 3 times (DuplicateMethodCall)
199
203
  RedCloth#block_textile_lists contains iterators nested 3 deep (NestedIterators)
200
204
  RedCloth#block_textile_lists has approx 21 statements (TooManyStatements)
@@ -208,6 +212,7 @@ Feature: Basic smell detection
208
212
  RedCloth#blocks has approx 19 statements (TooManyStatements)
209
213
  RedCloth#blocks has boolean parameter 'deep_code' (BooleanParameter)
210
214
  RedCloth#blocks is controlled by argument deep_code (ControlParameter)
215
+ RedCloth#blocks refers to blk more than self (FeatureEnvy)
211
216
  RedCloth#clean_html calls tags[tag] twice (DuplicateMethodCall)
212
217
  RedCloth#clean_html contains iterators nested 3 deep (NestedIterators)
213
218
  RedCloth#clean_html doesn't depend on instance state (UtilityFunction)
@@ -219,7 +224,6 @@ Feature: Basic smell detection
219
224
  RedCloth#clean_white_space has approx 7 statements (TooManyStatements)
220
225
  RedCloth#clean_white_space refers to text more than self (FeatureEnvy)
221
226
  RedCloth#flush_left doesn't depend on instance state (UtilityFunction)
222
- RedCloth#flush_left refers to indt more than self (FeatureEnvy)
223
227
  RedCloth#flush_left refers to text more than self (FeatureEnvy)
224
228
  RedCloth#footnote_ref refers to text more than self (FeatureEnvy)
225
229
  RedCloth#glyphs_textile has approx 10 statements (TooManyStatements)
@@ -245,21 +249,21 @@ Feature: Basic smell detection
245
249
  RedCloth#inline_textile_span has the variable name 'm' (UncommunicativeVariableName)
246
250
  RedCloth#lT has the name 'lT' (UncommunicativeMethodName)
247
251
  RedCloth#lT is controlled by argument text (ControlParameter)
252
+ RedCloth#lT refers to text more than self (FeatureEnvy)
248
253
  RedCloth#no_textile doesn't depend on instance state (UtilityFunction)
249
254
  RedCloth#no_textile refers to text more than self (FeatureEnvy)
250
255
  RedCloth#pba calls $1.length twice (DuplicateMethodCall)
251
256
  RedCloth#pba has approx 21 statements (TooManyStatements)
252
257
  RedCloth#pba is controlled by argument element (ControlParameter)
253
- RedCloth#pba refers to style more than self (FeatureEnvy)
254
258
  RedCloth#pba refers to text more than self (FeatureEnvy)
255
259
  RedCloth#refs_markdown has the variable name 'm' (UncommunicativeVariableName)
256
260
  RedCloth#refs_textile has the variable name 'm' (UncommunicativeVariableName)
257
261
  RedCloth#retrieve has the variable name 'i' (UncommunicativeVariableName)
258
262
  RedCloth#retrieve has the variable name 'r' (UncommunicativeVariableName)
259
- RedCloth#rip_offtags calls ((codepre - used_offtags.length) > 0) twice (DuplicateMethodCall)
260
- RedCloth#rip_offtags calls (@pre_list.last << line) twice (DuplicateMethodCall)
261
- RedCloth#rip_offtags calls (codepre - used_offtags.length) twice (DuplicateMethodCall)
263
+ RedCloth#rip_offtags calls (codepre - used_offtags.length) > 0 twice (DuplicateMethodCall)
264
+ RedCloth#rip_offtags calls @pre_list.last << line twice (DuplicateMethodCall)
262
265
  RedCloth#rip_offtags calls @pre_list.last twice (DuplicateMethodCall)
266
+ RedCloth#rip_offtags calls codepre - used_offtags.length twice (DuplicateMethodCall)
263
267
  RedCloth#rip_offtags calls codepre.zero? twice (DuplicateMethodCall)
264
268
  RedCloth#rip_offtags calls htmlesc(line, :NoQuotes) twice (DuplicateMethodCall)
265
269
  RedCloth#rip_offtags calls used_offtags.length twice (DuplicateMethodCall)
@@ -57,7 +57,7 @@ Then /^it reports the error ['"](.*)['"]$/ do |string|
57
57
  end
58
58
 
59
59
  Then /^it reports a parsing error$/ do
60
- expect(@last_stderr.chomp).to match(/Racc::ParseError/)
60
+ expect(@last_stderr.chomp).to match(/Parser::SyntaxError/)
61
61
  end
62
62
 
63
63
  Then /^it should indicate the line numbers of those smells$/ do
@@ -1,4 +1,3 @@
1
- require 'rubygems'
2
1
  require 'tempfile'
3
2
  require 'fileutils'
4
3
  require 'open3'
@@ -6,18 +5,19 @@ require 'reek/cli/application'
6
5
 
7
6
  class ReekWorld
8
7
  def run(cmd)
9
- out, err, status = Open3.capture3(cmd)
10
- @last_stdout = out
11
- @last_stderr = err
12
- @last_exit_status = status.exitstatus
8
+ stderr_file = Tempfile.new('reek-world')
9
+ stderr_file.close
10
+ @last_stdout = `#{cmd} 2> #{stderr_file.path}`
11
+ @last_exit_status = $?.exitstatus
12
+ @last_stderr = IO.read(stderr_file.path)
13
13
  end
14
14
 
15
15
  def reek(args)
16
- run("ruby -Ilib -rubygems bin/reek --no-color #{args}")
16
+ run("ruby -Ilib bin/reek --no-color #{args}")
17
17
  end
18
18
 
19
19
  def reek_with_pipe(stdin, args)
20
- run("echo \"#{stdin}\" | ruby -Ilib -rubygems bin/reek --no-color #{args}")
20
+ run("echo \"#{stdin}\" | ruby -Ilib bin/reek --no-color #{args}")
21
21
  end
22
22
 
23
23
  def rake(name, task_def)
@@ -20,7 +20,7 @@ module Reek
20
20
  end
21
21
 
22
22
  def node_instance_methods
23
- local_nodes(:defn)
23
+ local_nodes(:def)
24
24
  end
25
25
 
26
26
  def local_nodes(type, &blk)