reek 3.1 → 3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -2
  3. data/{CHANGELOG → CHANGELOG.md} +150 -123
  4. data/README.md +61 -21
  5. data/Rakefile +2 -1
  6. data/bin/reek +1 -0
  7. data/config/defaults.reek +2 -2
  8. data/docs/Attribute.md +9 -13
  9. data/docs/Basic-Smell-Options.md +2 -2
  10. data/docs/Command-Line-Options.md +2 -2
  11. data/docs/Too-Many-Instance-Variables.md +1 -1
  12. data/features/samples.feature +22 -31
  13. data/features/step_definitions/sample_file_steps.rb +2 -2
  14. data/features/support/env.rb +1 -0
  15. data/lib/reek.rb +1 -0
  16. data/lib/reek/ast/ast_node_class_map.rb +5 -1
  17. data/lib/reek/ast/node.rb +4 -2
  18. data/lib/reek/ast/object_refs.rb +9 -5
  19. data/lib/reek/ast/reference_collector.rb +4 -2
  20. data/lib/reek/cli/application.rb +12 -9
  21. data/lib/reek/cli/command.rb +4 -0
  22. data/lib/reek/cli/input.rb +4 -4
  23. data/lib/reek/cli/option_interpreter.rb +11 -7
  24. data/lib/reek/cli/options.rb +42 -40
  25. data/lib/reek/cli/reek_command.rb +3 -3
  26. data/lib/reek/cli/warning_collector.rb +7 -3
  27. data/lib/reek/code_comment.rb +5 -1
  28. data/lib/reek/configuration/app_configuration.rb +4 -4
  29. data/lib/reek/context/code_context.rb +19 -17
  30. data/lib/reek/examiner.rb +8 -6
  31. data/lib/reek/rake/task.rb +13 -22
  32. data/lib/reek/report/formatter.rb +5 -1
  33. data/lib/reek/report/report.rb +46 -44
  34. data/lib/reek/smells/attribute.rb +42 -24
  35. data/lib/reek/smells/control_parameter.rb +21 -13
  36. data/lib/reek/smells/data_clump.rb +17 -9
  37. data/lib/reek/smells/duplicate_method_call.rb +12 -6
  38. data/lib/reek/smells/long_parameter_list.rb +2 -2
  39. data/lib/reek/smells/long_yield_list.rb +4 -4
  40. data/lib/reek/smells/nested_iterators.rb +4 -2
  41. data/lib/reek/smells/nil_check.rb +6 -2
  42. data/lib/reek/smells/repeated_conditional.rb +2 -2
  43. data/lib/reek/smells/smell_configuration.rb +15 -7
  44. data/lib/reek/smells/smell_detector.rb +23 -10
  45. data/lib/reek/smells/smell_repository.rb +9 -16
  46. data/lib/reek/smells/smell_warning.rb +6 -6
  47. data/lib/reek/smells/too_many_instance_variables.rb +4 -4
  48. data/lib/reek/smells/too_many_methods.rb +2 -2
  49. data/lib/reek/smells/too_many_statements.rb +4 -4
  50. data/lib/reek/smells/uncommunicative_method_name.rb +5 -5
  51. data/lib/reek/smells/uncommunicative_module_name.rb +5 -5
  52. data/lib/reek/smells/uncommunicative_parameter_name.rb +8 -4
  53. data/lib/reek/smells/uncommunicative_variable_name.rb +8 -4
  54. data/lib/reek/source/source_code.rb +6 -2
  55. data/lib/reek/source/source_locator.rb +4 -4
  56. data/lib/reek/spec/should_reek.rb +9 -4
  57. data/lib/reek/spec/should_reek_of.rb +8 -5
  58. data/lib/reek/spec/should_reek_only_of.rb +12 -8
  59. data/lib/reek/tree_dresser.rb +6 -2
  60. data/lib/reek/tree_walker.rb +28 -22
  61. data/lib/reek/version.rb +1 -1
  62. data/reek.gemspec +6 -5
  63. data/spec/gem/yard_spec.rb +6 -9
  64. data/spec/reek/code_comment_spec.rb +1 -1
  65. data/spec/reek/report/xml_report_spec.rb +11 -21
  66. data/spec/reek/smells/attribute_spec.rb +73 -57
  67. data/spec/reek/smells/too_many_instance_variables_spec.rb +26 -12
  68. data/spec/reek/source/source_locator_spec.rb +2 -2
  69. data/spec/samples/checkstyle.xml +12 -1
  70. data/spec/spec_helper.rb +1 -0
  71. metadata +20 -7
  72. data/spec/samples/unusual_syntax.rb +0 -21
data/README.md CHANGED
@@ -218,7 +218,7 @@ end
218
218
  This is further explained under [Smell Suppresion](docs/Smell-Suppression.md).
219
219
 
220
220
 
221
- ## Integration
221
+ ## Usage
222
222
 
223
223
  Besides the obvious
224
224
 
@@ -277,23 +277,73 @@ If you don't feel like getting your hands dirty with code there are still other
277
277
 
278
278
  ## Working with Rails
279
279
 
280
- With current versions of `reek` it's best to examine only your `app/models` folder, because `reek` raises false positives against views and controllers.
280
+ Making `reek` "Rails"-friendly is fairly simple since we support directory specific configurations (`directory directives` in `reek` talk).
281
+ Just add this to your configuration file:
281
282
 
282
- For example, `params` is a kind of DTO (data transfer object) close to the system boundary, and so its characteristics should be different than regular code. But Reek doesn't know that (yet); `reek` thinks that all those `params[:something]` calls are a problem, and reports them as smells.
283
+ ```Yaml
284
+ "app/controllers":
285
+ IrresponsibleModule:
286
+ enabled: false
287
+ NestedIterators:
288
+ max_allowed_nesting: 2
289
+ "app/helpers":
290
+ IrresponsibleModule:
291
+ enabled: false
292
+ UtilityFunction:
293
+ enabled: false
294
+ ```
283
295
 
284
- We plan to improve Reek in the near future so that it plays better with Rails. For now though, your best bet is to restrict it to looking at `app/models` and `lib`.
296
+ Be careful though, `reek` does not merge your configuration entries, so if you already have a directory directive for "app/controllers" or "app/helpers" you need to update those directives instead of copying the above YAML sample into your configuration file.
285
297
 
286
- ## Additional resources
298
+ ## Integrations
287
299
 
288
- ### Tools
300
+ ### Editor integrations
301
+
302
+ * [Vim plugin](https://github.com/rainerborene/vim-reek)
303
+ * [TextMate Bundle](https://github.com/peeyush1234/reek.tmbundle)
304
+ * [Atom plugin](https://atom.io/packages/linter-reek)
305
+
306
+ ### Projects that use or support us
307
+
308
+ * [overcommit](https://github.com/brigade/overcommit) - a Git commit hook manager with support for
309
+ `reek`
310
+ * [ruby-critic](https://github.com/whitesmith/rubycritic) - gem that wraps around static analysis gems such as `reek`, [flay](https://github.com/seattlerb/flay) and [flog](https://github.com/seattlerb/flog)
311
+ * [pronto-reek](https://github.com/mmozuras/pronto-reek) - `reek` integration for [pronto](https://github.com/mmozuras/pronto)
312
+
313
+ ### Misc
289
314
 
290
- * [Vim plugin for `reek`](https://github.com/rainerborene/vim-reek)
291
- * [TextMate Bundle for `reek`](https://github.com/peeyush1234/reek.tmbundle)
292
315
  * [Colorful output for `reek`](https://github.com/joenas/preek)
293
316
  (also with [Guard::Preek](https://github.com/joenas/guard-preek))
294
- * [Atom plugin for `reek`](https://atom.io/packages/linter-reek)
295
- * [overcommit, a Git commit hook manager with support for
296
- `reek`](https://github.com/brigade/overcommit)
317
+
318
+ ## Brothers and sisters
319
+
320
+ A non-exhaustive list of other static code analyzers you might want to look into:
321
+
322
+ * [debride](https://github.com/seattlerb/debride) - analyze code for potentially uncalled / dead methods
323
+ * [flay](https://github.com/seattlerb/flay) - analyze code for structural similarities
324
+ * [flog](https://github.com/seattlerb/flog) - reports the most tortured code in an easy to read pain
325
+ report
326
+ * [SandiMeter](https://github.com/makaroni4/sandi_meter) - checking your Ruby code for Sandi Metz' four rules
327
+ * [ruby-lint](https://github.com/YorickPeterse/ruby-lint) - static code analysis tool
328
+ * [Fasterer](https://github.com/DamirSvrtan/fasterer) - Fasterer will suggest some speed improvements based on [fast-ruby](https://github.com/JuanitoFatas/fast-ruby)
329
+
330
+ ## Contributors
331
+
332
+ The `reek` core team consists of:
333
+
334
+ * [Matijs van Zuijlen](https://github.com/mvz)
335
+ * [Piotr Szotkowski](https://github.com/chastell)
336
+ * [Timo Rößner](https://github.com/troessner)
337
+
338
+ The original author of `reek` is [Kevin Rutherford](https://github.com/kevinrutherford).
339
+
340
+ Notable contributions came from:
341
+
342
+ * [Andrew Wagner](https://github.com/arwagner)
343
+ * [Gilles Leblanc](https://github.com/gilles-leblanc)
344
+ * [Emil Rehnberg](https://github.com/EmilRehnberg)
345
+
346
+ ## Additional resources
297
347
 
298
348
  ### Miscellaneous
299
349
 
@@ -304,13 +354,3 @@ We plan to improve Reek in the near future so that it plays better with Rails. F
304
354
 
305
355
  * [Stack Overflow](https://stackoverflow.com/questions/tagged/reek)
306
356
  * [RubyDoc.info](http://www.rubydoc.info/gems/reek)
307
-
308
- ## Contributors
309
-
310
- A non-exhaustive list:
311
-
312
- * Kevin Rutherford
313
- * Matijs van Zuijlen
314
- * Andrew Wagner
315
- * Gilles Leblanc
316
- * Timo Rößner
data/Rakefile CHANGED
@@ -1,5 +1,6 @@
1
- require 'rake/clean'
2
1
  require 'bundler/gem_tasks'
2
+ require 'private_attr/everywhere'
3
+ require 'rake/clean'
3
4
 
4
5
  Dir['tasks/**/*.rake'].each { |t| load t }
5
6
 
data/bin/reek CHANGED
@@ -6,6 +6,7 @@
6
6
  # Author: Kevin Rutherford
7
7
  #
8
8
 
9
+ require_relative '../lib/reek'
9
10
  require_relative '../lib/reek/cli/application'
10
11
 
11
12
  exit Reek::CLI::Application.new(ARGV).execute
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  Attribute:
3
- enabled: false
3
+ enabled: true
4
4
  exclude: []
5
5
  BooleanParameter:
6
6
  enabled: true
@@ -59,7 +59,7 @@ RepeatedConditional:
59
59
  TooManyInstanceVariables:
60
60
  enabled: true
61
61
  exclude: []
62
- max_instance_variables: 9
62
+ max_instance_variables: 4
63
63
  TooManyMethods:
64
64
  enabled: true
65
65
  exclude: []
@@ -2,7 +2,11 @@
2
2
 
3
3
  ## Introduction
4
4
 
5
- A class that publishes a getter or setter for an instance variable invites client classes to become too intimate with its inner workings, and in particular with its representation of state.
5
+ A class that publishes a setter for an instance variable invites
6
+ client classes to become too intimate with its inner workings, and in
7
+ particular with its representation of state.
8
+
9
+ The same holds to a lesser extent for getters, but Reek doesn't flag those.
6
10
 
7
11
  ## Example
8
12
 
@@ -20,24 +24,16 @@ end
20
24
  reek test.rb
21
25
 
22
26
  test.rb -- 1 warning:
23
- [2]:Klass declares the attribute dummy (Attribute)
27
+ [2]:Klass declares the writable attribute dummy (Attribute)
24
28
  ```
25
29
 
26
30
  ## Support in Reek
27
31
 
28
- Right now this smell is disabled by default since it is highly subjective.
32
+ This detector it raises a warning for every public `attr_writer`,
33
+ `attr_accessor`, and `attr` with the writable flag set to `true`.
29
34
 
30
- When this detector is enabled it raises a warning for every `attr`, `attr_reader`, `attr_writer` and `attr_accessor` -- including those that are private.
35
+ Reek does not raise warnings for read-only attributes.
31
36
 
32
37
  ## Configuration
33
38
 
34
- If you want to enable it you can do so by placing
35
-
36
- ```yaml
37
- Attribute:
38
- enabled: true
39
- ```
40
-
41
- in your reek configuration file.
42
-
43
39
  `Attribute` supports only the [Basic Smell Options](Basic-Smell-Options.md).
@@ -23,7 +23,7 @@ ControlCouple:
23
23
  - write
24
24
  ```
25
25
 
26
- Or a little more sophisticated using a ruby regex like this:
26
+ Or a little more sophisticated using a Ruby regex like this:
27
27
 
28
28
  ```yaml
29
29
  ControlCouple:
@@ -41,4 +41,4 @@ FeatureEnvy:
41
41
  - "ApplicationController#respond"
42
42
  ```
43
43
 
44
- This would not report FeatureEnvy for the instance method `MyModel#do_things`, the whole module `MyHelper` and the `respond` instance method of `ApplicationController`
44
+ This would not report FeatureEnvy for the instance method `MyModel#do_things`, the whole module `MyHelper` and the `respond` instance method of `ApplicationController`
@@ -14,7 +14,7 @@ for details.
14
14
 
15
15
  ## Telling Reek Which Code to Check
16
16
 
17
- Probably the most standard use case would be to check all ruby files in the lib directory:
17
+ Probably the most standard use case would be to check all Ruby files in the lib directory:
18
18
 
19
19
  ```Bash
20
20
  reek lib/*.rb
@@ -81,4 +81,4 @@ test.rb -- 1 warning:
81
81
  [2]:Dummy declares the class variable @@class_variable (ClassVariable) [https://github.com/troessner/reek/wiki/Class-Variable]
82
82
  ```
83
83
 
84
- Note the link at the end.
84
+ Note the link at the end.
@@ -40,4 +40,4 @@ test.rb -- 5 warnings:
40
40
 
41
41
  | Option | Value | Effect |
42
42
  | ---------------|-------------|---------|
43
- | max_instance_variables | integer | The maximum number of instance variables that are permitted. Defaults to 9 |
43
+ | max_instance_variables | integer | The maximum number of instance variables that are permitted. Defaults to 4 |
@@ -5,7 +5,9 @@ Feature: Basic smell detection
5
5
 
6
6
  Scenario: Correct smells from inline.rb
7
7
  Given the "inline.rb" sample file exists
8
- When I run reek --no-line-numbers inline.rb
8
+ And the "optparse.rb" sample file exists
9
+ And the "redcloth.rb" sample file exists
10
+ When I run reek --no-line-numbers inline.rb optparse.rb redcloth.rb
9
11
  Then the exit status indicates smells
10
12
  And it reports:
11
13
  """
@@ -55,16 +57,16 @@ Feature: Basic smell detection
55
57
  Module#inline calls Inline.const_get(lang) 2 times (DuplicateMethodCall)
56
58
  Module#inline calls options[:testing] 2 times (DuplicateMethodCall)
57
59
  Module#inline has approx 12 statements (TooManyStatements)
58
- """
59
-
60
- Scenario: Correct smells from optparse.rb
61
- Given the "optparse.rb" sample file exists
62
- When I run reek --no-line-numbers optparse.rb
63
- Then the exit status indicates smells
64
- And it reports:
65
- """
66
- optparse.rb -- 111 warnings:
60
+ optparse.rb -- 121 warnings:
61
+ OptionParser declares the writable attribute banner (Attribute)
62
+ OptionParser declares the writable attribute default_argv (Attribute)
63
+ OptionParser declares the writable attribute program_name (Attribute)
64
+ OptionParser declares the writable attribute release (Attribute)
65
+ OptionParser declares the writable attribute summary_indent (Attribute)
66
+ OptionParser declares the writable attribute summary_width (Attribute)
67
+ OptionParser declares the writable attribute version (Attribute)
67
68
  OptionParser has at least 42 methods (TooManyMethods)
69
+ OptionParser has at least 6 instance variables (TooManyInstanceVariables)
68
70
  OptionParser has the variable name 'f' (UncommunicativeVariableName)
69
71
  OptionParser has the variable name 'k' (UncommunicativeVariableName)
70
72
  OptionParser has the variable name 'o' (UncommunicativeVariableName)
@@ -148,7 +150,9 @@ Feature: Basic smell detection
148
150
  OptionParser::List#update has 5 parameters (LongParameterList)
149
151
  OptionParser::List#update has approx 10 statements (TooManyStatements)
150
152
  OptionParser::List#update has the variable name 'o' (UncommunicativeVariableName)
153
+ OptionParser::ParseError declares the writable attribute reason (Attribute)
151
154
  OptionParser::ParseError#set_option is controlled by argument eq (ControlParameter)
155
+ OptionParser::Switch has at least 7 instance variables (TooManyInstanceVariables)
152
156
  OptionParser::Switch#add_banner has the variable name 's' (UncommunicativeVariableName)
153
157
  OptionParser::Switch#initialize has 7 parameters (LongParameterList)
154
158
  OptionParser::Switch#parse_arg calls s.length 2 times (DuplicateMethodCall)
@@ -175,15 +179,13 @@ Feature: Basic smell detection
175
179
  OptionParser::Switch::NoArgument#parse has unused parameter 'argv' (UnusedParameters)
176
180
  OptionParser::Switch::OptionalArgument#parse has unused parameter 'argv' (UnusedParameters)
177
181
  OptionParser::Switch::PlacedArgument#parse has approx 6 statements (TooManyStatements)
178
- """
179
-
180
- Scenario: Correct smells from redcloth.rb
181
- Given the "redcloth.rb" sample file exists
182
- When I run reek --no-line-numbers redcloth.rb
183
- Then the exit status indicates smells
184
- And it reports:
185
- """
186
- redcloth.rb -- 95 warnings:
182
+ redcloth.rb -- 101 warnings:
183
+ RedCloth declares the writable attribute filter_html (Attribute)
184
+ RedCloth declares the writable attribute filter_styles (Attribute)
185
+ RedCloth declares the writable attribute hard_breaks (Attribute)
186
+ RedCloth declares the writable attribute lite_mode (Attribute)
187
+ RedCloth declares the writable attribute no_span_caps (Attribute)
188
+ RedCloth declares the writable attribute rules (Attribute)
187
189
  RedCloth has at least 44 methods (TooManyMethods)
188
190
  RedCloth has the variable name 'a' (UncommunicativeVariableName)
189
191
  RedCloth has the variable name 'b' (UncommunicativeVariableName)
@@ -279,16 +281,5 @@ Feature: Basic smell detection
279
281
  RedCloth#textile_popup_help has the parameter name 'windowW' (UncommunicativeParameterName)
280
282
  RedCloth#to_html has approx 26 statements (TooManyStatements)
281
283
  RedCloth#v_align doesn't depend on instance state (UtilityFunction)
282
- """
283
-
284
- Scenario: Correct smells from a source file with unusual syntax samples
285
- Given the "unusual_syntax.rb" sample file exists
286
- When I run reek unusual_syntax.rb
287
- Then the exit status indicates smells
288
- And it reports:
289
- """
290
- unusual_syntax.rb -- 3 warnings:
291
- [1]:SomeClass has no descriptive comment (IrresponsibleModule)
292
- [18]:SomeClass#method_with_array_decomposition has the parameter name 'a' (UncommunicativeParameterName)
293
- [18]:SomeClass#method_with_array_decomposition has the parameter name 'b' (UncommunicativeParameterName)
284
+ 267 total warnings
294
285
  """
@@ -27,7 +27,7 @@ end
27
27
 
28
28
  Given(/^the "(.*?)" sample file exists$/) do |file_name|
29
29
  full_path = Pathname.new("#{__dir__}/../../spec/samples/#{file_name}")
30
- in_current_directory { FileUtils.cp full_path, file_name }
30
+ cd('.') { FileUtils.cp full_path, file_name }
31
31
  end
32
32
 
33
33
  Given(/^a directory called 'clean_files' containing some clean files$/) do
@@ -135,7 +135,7 @@ When(/^I run "reek (.*?)" in the subdirectory$/) do |args|
135
135
  end
136
136
 
137
137
  Given(/^a masking configuration file in the HOME directory$/) do
138
- set_env 'HOME', Pathname.new("#{current_directory}/home").expand_path.to_s
138
+ set_environment_variable 'HOME', Pathname.new("#{expand_path('.')}/home")
139
139
  write_file('home/config.reek', <<-EOS.strip_heredoc)
140
140
  ---
141
141
  DuplicateMethodCall:
@@ -1,3 +1,4 @@
1
+ require_relative '../../lib/reek'
1
2
  require_relative '../../lib/reek/cli/application'
2
3
  require 'aruba/cucumber'
3
4
  require 'active_support/core_ext/string/strip'
@@ -1,6 +1,7 @@
1
1
  #
2
2
  # Reek's core functionality
3
3
  #
4
+ require 'private_attr/everywhere'
4
5
  require_relative 'reek/version'
5
6
  require_relative 'reek/examiner'
6
7
  require_relative 'reek/report/report'
@@ -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,6 +31,10 @@ module Reek
31
31
  Hash[assoc]
32
32
  end
33
33
  end
34
+
35
+ private
36
+
37
+ private_attr_reader :klass_map
34
38
  end
35
39
  end
36
40
  end
@@ -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,6 +120,8 @@ module Reek
120
120
 
121
121
  private
122
122
 
123
+ private_attr_reader :comments
124
+
123
125
  def each_sexp
124
126
  children.each { |elem| yield elem if elem.is_a? ::Parser::AST::Node }
125
127
  end
@@ -11,21 +11,25 @@ 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
29
33
  end
30
34
  end
31
35
  end
@@ -18,14 +18,16 @@ module Reek
18
18
 
19
19
  private
20
20
 
21
+ private_attr_reader :ast
22
+
21
23
  def explicit_self_calls
22
24
  [:self, :zsuper, :ivar, :ivasgn].flat_map do |node_type|
23
- @ast.each_node(node_type, STOP_NODES)
25
+ ast.each_node(node_type, STOP_NODES)
24
26
  end
25
27
  end
26
28
 
27
29
  def implicit_self_calls
28
- @ast.each_node(:send, STOP_NODES).reject(&:receiver)
30
+ ast.each_node(:send, STOP_NODES).reject(&:receiver)
29
31
  end
30
32
  end
31
33
  end
@@ -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 @options
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,17 +40,20 @@ module Reek
40
40
  end
41
41
 
42
42
  def report_success
43
- @status = STATUS_SUCCESS
43
+ self.status = STATUS_SUCCESS
44
44
  end
45
45
 
46
46
  def report_smells
47
- @status = STATUS_SMELLS
47
+ self.status = STATUS_SMELLS
48
48
  end
49
49
 
50
50
  private
51
51
 
52
+ private_attr_accessor :status
53
+ private_attr_reader :command
54
+
52
55
  def error_occured?
53
- @status == STATUS_ERROR
56
+ status == STATUS_ERROR
54
57
  end
55
58
  end
56
59
  end