reek 3.2.1 → 3.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (112) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/Rakefile +0 -1
  4. data/config/defaults.reek +1 -1
  5. data/features/samples.feature +17 -16
  6. data/lib/reek.rb +0 -1
  7. data/lib/reek/ast/ast_node_class_map.rb +5 -1
  8. data/lib/reek/ast/node.rb +10 -3
  9. data/lib/reek/ast/object_refs.rb +11 -5
  10. data/lib/reek/ast/reference_collector.rb +6 -2
  11. data/lib/reek/ast/sexp_extensions.rb +42 -1
  12. data/lib/reek/ast/sexp_formatter.rb +2 -1
  13. data/lib/reek/cli/application.rb +12 -9
  14. data/lib/reek/cli/command.rb +6 -0
  15. data/lib/reek/cli/input.rb +4 -4
  16. data/lib/reek/cli/option_interpreter.rb +11 -7
  17. data/lib/reek/cli/options.rb +42 -40
  18. data/lib/reek/cli/reek_command.rb +3 -3
  19. data/lib/reek/cli/silencer.rb +12 -3
  20. data/lib/reek/cli/warning_collector.rb +8 -3
  21. data/lib/reek/code_comment.rb +6 -1
  22. data/lib/reek/configuration/app_configuration.rb +65 -100
  23. data/lib/reek/configuration/configuration_file_finder.rb +4 -13
  24. data/lib/reek/configuration/configuration_validator.rb +35 -0
  25. data/lib/reek/configuration/default_directive.rb +12 -0
  26. data/lib/reek/configuration/directory_directives.rb +54 -0
  27. data/lib/reek/configuration/excluded_paths.rb +18 -0
  28. data/lib/reek/context/code_context.rb +19 -17
  29. data/lib/reek/examiner.rb +9 -7
  30. data/lib/reek/rake/task.rb +12 -22
  31. data/lib/reek/report/formatter.rb +6 -1
  32. data/lib/reek/report/report.rb +22 -13
  33. data/lib/reek/smells/attribute.rb +6 -53
  34. data/lib/reek/smells/control_parameter.rb +21 -13
  35. data/lib/reek/smells/data_clump.rb +17 -9
  36. data/lib/reek/smells/duplicate_method_call.rb +12 -6
  37. data/lib/reek/smells/long_parameter_list.rb +2 -2
  38. data/lib/reek/smells/long_yield_list.rb +4 -4
  39. data/lib/reek/smells/nested_iterators.rb +4 -2
  40. data/lib/reek/smells/nil_check.rb +6 -2
  41. data/lib/reek/smells/repeated_conditional.rb +3 -3
  42. data/lib/reek/smells/smell_configuration.rb +17 -7
  43. data/lib/reek/smells/smell_detector.rb +24 -11
  44. data/lib/reek/smells/smell_repository.rb +1 -1
  45. data/lib/reek/smells/smell_warning.rb +6 -6
  46. data/lib/reek/smells/too_many_instance_variables.rb +2 -2
  47. data/lib/reek/smells/too_many_methods.rb +4 -4
  48. data/lib/reek/smells/too_many_statements.rb +4 -4
  49. data/lib/reek/smells/uncommunicative_method_name.rb +5 -5
  50. data/lib/reek/smells/uncommunicative_module_name.rb +6 -6
  51. data/lib/reek/smells/uncommunicative_parameter_name.rb +8 -4
  52. data/lib/reek/smells/uncommunicative_variable_name.rb +9 -5
  53. data/lib/reek/smells/utility_function.rb +1 -1
  54. data/lib/reek/source/source_code.rb +5 -1
  55. data/lib/reek/source/source_locator.rb +3 -2
  56. data/lib/reek/spec.rb +3 -3
  57. data/lib/reek/spec/should_reek.rb +10 -5
  58. data/lib/reek/spec/should_reek_of.rb +9 -6
  59. data/lib/reek/spec/should_reek_only_of.rb +13 -8
  60. data/lib/reek/tree_dresser.rb +6 -2
  61. data/lib/reek/tree_walker.rb +40 -32
  62. data/lib/reek/version.rb +1 -1
  63. data/reek.gemspec +1 -1
  64. data/spec/reek/ast/node_spec.rb +1 -2
  65. data/spec/reek/ast/object_refs_spec.rb +40 -42
  66. data/spec/reek/ast/sexp_extensions_spec.rb +98 -104
  67. data/spec/reek/cli/warning_collector_spec.rb +8 -12
  68. data/spec/reek/code_comment_spec.rb +3 -5
  69. data/spec/reek/configuration/app_configuration_spec.rb +43 -57
  70. data/spec/reek/configuration/configuration_file_finder_spec.rb +5 -7
  71. data/spec/reek/configuration/default_directive_spec.rb +13 -0
  72. data/spec/reek/configuration/directory_directives_spec.rb +89 -0
  73. data/spec/reek/configuration/excluded_paths_spec.rb +30 -0
  74. data/spec/reek/context/code_context_spec.rb +63 -62
  75. data/spec/reek/context/method_context_spec.rb +8 -12
  76. data/spec/reek/context/module_context_spec.rb +1 -1
  77. data/spec/reek/context/root_context_spec.rb +3 -7
  78. data/spec/reek/examiner_spec.rb +14 -25
  79. data/spec/reek/smells/attribute_spec.rb +2 -4
  80. data/spec/reek/smells/boolean_parameter_spec.rb +5 -7
  81. data/spec/reek/smells/class_variable_spec.rb +29 -44
  82. data/spec/reek/smells/control_parameter_spec.rb +7 -9
  83. data/spec/reek/smells/data_clump_spec.rb +25 -32
  84. data/spec/reek/smells/duplicate_method_call_spec.rb +8 -7
  85. data/spec/reek/smells/feature_envy_spec.rb +16 -17
  86. data/spec/reek/smells/irresponsible_module_spec.rb +2 -4
  87. data/spec/reek/smells/long_parameter_list_spec.rb +6 -9
  88. data/spec/reek/smells/long_yield_list_spec.rb +6 -9
  89. data/spec/reek/smells/nested_iterators_spec.rb +14 -16
  90. data/spec/reek/smells/repeated_conditional_spec.rb +25 -25
  91. data/spec/reek/smells/smell_configuration_spec.rb +32 -27
  92. data/spec/reek/smells/smell_detector_shared.rb +12 -13
  93. data/spec/reek/smells/smell_warning_spec.rb +54 -58
  94. data/spec/reek/smells/too_many_instance_variables_spec.rb +9 -9
  95. data/spec/reek/smells/too_many_methods_spec.rb +13 -14
  96. data/spec/reek/smells/too_many_statements_spec.rb +8 -10
  97. data/spec/reek/smells/uncommunicative_method_name_spec.rb +8 -9
  98. data/spec/reek/smells/uncommunicative_module_name_spec.rb +12 -13
  99. data/spec/reek/smells/uncommunicative_parameter_name_spec.rb +7 -10
  100. data/spec/reek/smells/uncommunicative_variable_name_spec.rb +16 -20
  101. data/spec/reek/smells/utility_function_spec.rb +11 -15
  102. data/spec/reek/source/source_code_spec.rb +6 -11
  103. data/spec/reek/spec/should_reek_of_spec.rb +19 -30
  104. data/spec/reek/spec/should_reek_only_of_spec.rb +28 -34
  105. data/spec/reek/tree_walker_spec.rb +14 -2
  106. data/spec/spec_helper.rb +2 -3
  107. data/tasks/test.rake +0 -5
  108. metadata +10 -6
  109. data/docs/Configuration-Files.md +0 -49
  110. data/spec/gem/updates_spec.rb +0 -25
  111. data/spec/gem/yard_spec.rb +0 -11
  112. data/spec/reek/smells/behaves_like_variable_detector.rb +0 -39
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fe2528f9142f9b45b13b25d3c5b05913ef16f190
4
- data.tar.gz: b3d969d1feedbe459e2f073f86cbb4d2fb6774da
3
+ metadata.gz: e18d9d5bd7b07494f2c0d1cf7f5bf271d87a918d
4
+ data.tar.gz: efebbdb49a7872897956b6c1ddf59aadee6dc158
5
5
  SHA512:
6
- metadata.gz: d7a4a4ea2e5bf9cff1a99fa6ca67cc2709bc9cb806f0296acdc7b91ab3a8f7a59217b5d680cad008e33cf0f7887fd62299660f9efde81a978da6ea6b633eae41
7
- data.tar.gz: 86b336f6aa1c9d9a4e3db2734ac01b35406bd389cef54fa1f67f1b7bbc707847ddabbbc318c257a0f16a8573a96ed08c12a2b9c06d9ee66a0ace9cfd9e03c5e3
6
+ metadata.gz: 6b8306b98fe28fa272395083b7c77a58572501780a2147a582320e433942ec18fa7b81b602a4043aa0cd421f691f2dc177c6a5e9a990ce78282130ee91fa5b99
7
+ data.tar.gz: f8d76ee8f1f8510b5357f0fa0e2031065d8759837ce05d0351f3bf622b7e286e8af30148482f07a9f2a1c4b35002fe78cb3f19326aae8a784c1605b55d449a21
@@ -2,6 +2,11 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 3.3.0 (2015-08-23)
6
+
7
+ * (HParker / Adam Hess) add support for or-assign constants
8
+ * (troessner) Update TooManyMethods default value to 15
9
+
5
10
  ## 3.2.1 (2015-08-17)
6
11
 
7
12
  * Revert 864f0a9 to hotfix issues/642
data/Rakefile CHANGED
@@ -1,5 +1,4 @@
1
1
  require 'bundler/gem_tasks'
2
- require 'private_attr/everywhere'
3
2
  require 'rake/clean'
4
3
 
5
4
  Dir['tasks/**/*.rake'].each { |t| load t }
@@ -63,7 +63,7 @@ TooManyInstanceVariables:
63
63
  TooManyMethods:
64
64
  enabled: true
65
65
  exclude: []
66
- max_methods: 25
66
+ max_methods: 15
67
67
  TooManyStatements:
68
68
  enabled: true
69
69
  exclude:
@@ -11,7 +11,7 @@ Feature: Basic smell detection
11
11
  Then the exit status indicates smells
12
12
  And it reports:
13
13
  """
14
- inline.rb -- 45 warnings:
14
+ inline.rb -- 46 warnings:
15
15
  CompilationError has no descriptive comment (IrresponsibleModule)
16
16
  Dir has no descriptive comment (IrresponsibleModule)
17
17
  File has no descriptive comment (IrresponsibleModule)
@@ -23,6 +23,7 @@ Feature: Basic smell detection
23
23
  Inline#self.rootdir performs a nil-check (NilCheck)
24
24
  Inline::C declares the class variable @@type_map (ClassVariable)
25
25
  Inline::C has at least 13 instance variables (TooManyInstanceVariables)
26
+ Inline::C has at least 25 methods (TooManyMethods)
26
27
  Inline::C takes parameters [options, src] to 5 methods (DataClump)
27
28
  Inline::C tests $DEBUG at least 7 times (RepeatedConditional)
28
29
  Inline::C tests $TESTING at least 4 times (RepeatedConditional)
@@ -58,13 +59,6 @@ Feature: Basic smell detection
58
59
  Module#inline calls options[:testing] 2 times (DuplicateMethodCall)
59
60
  Module#inline has approx 12 statements (TooManyStatements)
60
61
  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)
68
62
  OptionParser has at least 42 methods (TooManyMethods)
69
63
  OptionParser has at least 6 instance variables (TooManyInstanceVariables)
70
64
  OptionParser has the variable name 'f' (UncommunicativeVariableName)
@@ -77,10 +71,12 @@ Feature: Basic smell detection
77
71
  OptionParser tests default_pattern at least 7 times (RepeatedConditional)
78
72
  OptionParser tests not_style at least 3 times (RepeatedConditional)
79
73
  OptionParser tests s at least 7 times (RepeatedConditional)
74
+ OptionParser#banner is a writable attribute (Attribute)
80
75
  OptionParser#complete contains iterators nested 2 deep (NestedIterators)
81
76
  OptionParser#complete has 4 parameters (LongParameterList)
82
77
  OptionParser#complete has approx 6 statements (TooManyStatements)
83
78
  OptionParser#complete has boolean parameter 'icase' (BooleanParameter)
79
+ OptionParser#default_argv is a writable attribute (Attribute)
84
80
  OptionParser#getopts calls result[opt] = false 2 times (DuplicateMethodCall)
85
81
  OptionParser#getopts has approx 18 statements (TooManyStatements)
86
82
  OptionParser#load has approx 6 statements (TooManyStatements)
@@ -122,12 +118,17 @@ Feature: Basic smell detection
122
118
  OptionParser#permute calls argv[0] 2 times (DuplicateMethodCall)
123
119
  OptionParser#permute refers to argv more than self (FeatureEnvy)
124
120
  OptionParser#permute! has approx 6 statements (TooManyStatements)
121
+ OptionParser#program_name is a writable attribute (Attribute)
122
+ OptionParser#release is a writable attribute (Attribute)
125
123
  OptionParser#search has the variable name 'k' (UncommunicativeVariableName)
126
124
  OptionParser#self.inc performs a nil-check (NilCheck)
127
125
  OptionParser#summarize has 4 parameters (LongParameterList)
128
126
  OptionParser#summarize has the variable name 'l' (UncommunicativeVariableName)
129
127
  OptionParser#summarize is controlled by argument blk (ControlParameter)
128
+ OptionParser#summary_indent is a writable attribute (Attribute)
129
+ OptionParser#summary_width is a writable attribute (Attribute)
130
130
  OptionParser#ver has the variable name 'v' (UncommunicativeVariableName)
131
+ OptionParser#version is a writable attribute (Attribute)
131
132
  OptionParser::Arguable has initialize method (ModuleInitialize)
132
133
  OptionParser::Arguable#options has approx 6 statements (TooManyStatements)
133
134
  OptionParser::Arguable#options= is controlled by argument opt (ControlParameter)
@@ -150,7 +151,7 @@ Feature: Basic smell detection
150
151
  OptionParser::List#update has 5 parameters (LongParameterList)
151
152
  OptionParser::List#update has approx 10 statements (TooManyStatements)
152
153
  OptionParser::List#update has the variable name 'o' (UncommunicativeVariableName)
153
- OptionParser::ParseError declares the writable attribute reason (Attribute)
154
+ OptionParser::ParseError#reason is a writable attribute (Attribute)
154
155
  OptionParser::ParseError#set_option is controlled by argument eq (ControlParameter)
155
156
  OptionParser::Switch has at least 7 instance variables (TooManyInstanceVariables)
156
157
  OptionParser::Switch#add_banner has the variable name 's' (UncommunicativeVariableName)
@@ -180,12 +181,6 @@ Feature: Basic smell detection
180
181
  OptionParser::Switch::OptionalArgument#parse has unused parameter 'argv' (UnusedParameters)
181
182
  OptionParser::Switch::PlacedArgument#parse has approx 6 statements (TooManyStatements)
182
183
  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)
189
184
  RedCloth has at least 44 methods (TooManyMethods)
190
185
  RedCloth has the variable name 'a' (UncommunicativeVariableName)
191
186
  RedCloth has the variable name 'b' (UncommunicativeVariableName)
@@ -226,10 +221,13 @@ Feature: Basic smell detection
226
221
  RedCloth#clean_html has the variable name 'q2' (UncommunicativeVariableName)
227
222
  RedCloth#clean_white_space has approx 7 statements (TooManyStatements)
228
223
  RedCloth#clean_white_space refers to text more than self (FeatureEnvy)
224
+ RedCloth#filter_html is a writable attribute (Attribute)
225
+ RedCloth#filter_styles is a writable attribute (Attribute)
229
226
  RedCloth#flush_left doesn't depend on instance state (UtilityFunction)
230
227
  RedCloth#footnote_ref doesn't depend on instance state (UtilityFunction)
231
228
  RedCloth#glyphs_textile has approx 10 statements (TooManyStatements)
232
229
  RedCloth#h_align doesn't depend on instance state (UtilityFunction)
230
+ RedCloth#hard_breaks is a writable attribute (Attribute)
233
231
  RedCloth#htmlesc doesn't depend on instance state (UtilityFunction)
234
232
  RedCloth#htmlesc is controlled by argument mode (ControlParameter)
235
233
  RedCloth#incoming_entities doesn't depend on instance state (UtilityFunction)
@@ -252,6 +250,8 @@ Feature: Basic smell detection
252
250
  RedCloth#lT doesn't depend on instance state (UtilityFunction)
253
251
  RedCloth#lT has the name 'lT' (UncommunicativeMethodName)
254
252
  RedCloth#lT is controlled by argument text (ControlParameter)
253
+ RedCloth#lite_mode is a writable attribute (Attribute)
254
+ RedCloth#no_span_caps is a writable attribute (Attribute)
255
255
  RedCloth#no_textile doesn't depend on instance state (UtilityFunction)
256
256
  RedCloth#pba calls $1.length 2 times (DuplicateMethodCall)
257
257
  RedCloth#pba has approx 21 statements (TooManyStatements)
@@ -270,6 +270,7 @@ Feature: Basic smell detection
270
270
  RedCloth#rip_offtags calls used_offtags.length 2 times (DuplicateMethodCall)
271
271
  RedCloth#rip_offtags calls used_offtags["notextile"] 3 times (DuplicateMethodCall)
272
272
  RedCloth#rip_offtags has approx 18 statements (TooManyStatements)
273
+ RedCloth#rules is a writable attribute (Attribute)
273
274
  RedCloth#textile_bq has 4 parameters (LongParameterList)
274
275
  RedCloth#textile_bq has unused parameter 'tag' (UnusedParameters)
275
276
  RedCloth#textile_fn_ has 5 parameters (LongParameterList)
@@ -281,5 +282,5 @@ Feature: Basic smell detection
281
282
  RedCloth#textile_popup_help has the parameter name 'windowW' (UncommunicativeParameterName)
282
283
  RedCloth#to_html has approx 26 statements (TooManyStatements)
283
284
  RedCloth#v_align doesn't depend on instance state (UtilityFunction)
284
- 267 total warnings
285
+ 268 total warnings
285
286
  """
@@ -1,7 +1,6 @@
1
1
  #
2
2
  # Reek's core functionality
3
3
  #
4
- require 'private_attr/everywhere'
5
4
  require_relative 'reek/version'
6
5
  require_relative 'reek/examiner'
7
6
  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
@@ -1,4 +1,9 @@
1
- require 'parser'
1
+ require 'private_attr/everywhere'
2
+ require_relative '../cli/silencer'
3
+
4
+ Reek::CLI::Silencer.silently stderr: true, stdout: true do
5
+ require 'parser'
6
+ end
2
7
 
3
8
  module Reek
4
9
  # @api private
@@ -17,12 +22,12 @@ module Reek
17
22
  end
18
23
 
19
24
  def full_comment
20
- @comments.map(&:text).join("\n")
25
+ comments.map(&:text).join("\n")
21
26
  end
22
27
 
23
28
  def leading_comment
24
29
  line = location.line
25
- comment_lines = @comments.select do |comment|
30
+ comment_lines = comments.select do |comment|
26
31
  comment.location.line < line
27
32
  end
28
33
  comment_lines.map(&:text).join("\n")
@@ -120,6 +125,8 @@ module Reek
120
125
 
121
126
  private
122
127
 
128
+ private_attr_reader :comments
129
+
123
130
  def each_sexp
124
131
  children.each { |elem| yield elem if elem.is_a? ::Parser::AST::Node }
125
132
  end
@@ -1,3 +1,5 @@
1
+ require 'private_attr/everywhere'
2
+
1
3
  module Reek
2
4
  # @api private
3
5
  module AST
@@ -11,21 +13,25 @@ module Reek
11
13
  end
12
14
 
13
15
  def most_popular
14
- max = @refs.values.map(&:size).max
15
- @refs.select { |_name, refs| refs.size == max }
16
+ max = refs.values.map(&:size).max
17
+ refs.select { |_name, refs| refs.size == max }
16
18
  end
17
19
 
18
20
  def record_reference_to(name, line: nil)
19
- @refs[name] << ObjectRef.new(name, line)
21
+ refs[name] << ObjectRef.new(name, line)
20
22
  end
21
23
 
22
24
  def references_to(name)
23
- @refs[name]
25
+ refs[name]
24
26
  end
25
27
 
26
28
  def self_is_max?
27
- @refs.empty? || most_popular.keys.include?(:self)
29
+ refs.empty? || most_popular.keys.include?(:self)
28
30
  end
31
+
32
+ private
33
+
34
+ private_attr_reader :refs
29
35
  end
30
36
  end
31
37
  end
@@ -1,3 +1,5 @@
1
+ require 'private_attr/everywhere'
2
+
1
3
  module Reek
2
4
  module AST
3
5
  #
@@ -18,14 +20,16 @@ module Reek
18
20
 
19
21
  private
20
22
 
23
+ private_attr_reader :ast
24
+
21
25
  def explicit_self_calls
22
26
  [:self, :zsuper, :ivar, :ivasgn].flat_map do |node_type|
23
- @ast.each_node(node_type, STOP_NODES)
27
+ ast.each_node(node_type, STOP_NODES)
24
28
  end
25
29
  end
26
30
 
27
31
  def implicit_self_calls
28
- @ast.each_node(:send, STOP_NODES).reject(&:receiver)
32
+ ast.each_node(:send, STOP_NODES).reject(&:receiver)
29
33
  end
30
34
  end
31
35
  end
@@ -184,6 +184,24 @@ module Reek
184
184
  def object_creation_call?
185
185
  method_name == :new
186
186
  end
187
+
188
+ def visibility_modifier?
189
+ VISIBILITY_MODIFIERS.include?(method_name)
190
+ end
191
+
192
+ def attribute_writer?
193
+ ATTR_DEFN_METHODS.include?(method_name) ||
194
+ attr_with_writable_flag?
195
+ end
196
+
197
+ # Handles the case where we create an attribute writer via:
198
+ # attr :foo, true
199
+ def attr_with_writable_flag?
200
+ method_name == :attr && args.last.type == :true
201
+ end
202
+
203
+ VISIBILITY_MODIFIERS = [:private, :public, :protected, :module_function]
204
+ ATTR_DEFN_METHODS = [:attr_writer, :attr_accessor]
187
205
  end
188
206
 
189
207
  Op_AsgnNode = SendNode
@@ -405,6 +423,7 @@ module Reek
405
423
  MODULE_DEFINERS = [:Class, :Struct]
406
424
 
407
425
  def defines_module?
426
+ return false if value.nil?
408
427
  call = case value.type
409
428
  when :block
410
429
  value.call
@@ -420,8 +439,18 @@ module Reek
420
439
  SexpFormatter.format(children[1])
421
440
  end
422
441
 
442
+ # there are two valid forms of the casgn sexp
443
+ # (casgn <namespace> <name> <value>) and
444
+ # (casgn <namespace> <name>) used in or-asgn and mlhs
445
+ #
446
+ # source = "class Hi; THIS ||= 3; end"
447
+ # (class
448
+ # (const nil :Hi) nil
449
+ # (or-asgn
450
+ # (casgn nil :THIS)
451
+ # (int 3)))
423
452
  def value
424
- children.last
453
+ children[2]
425
454
  end
426
455
  end
427
456
 
@@ -442,6 +471,18 @@ module Reek
442
471
  end
443
472
 
444
473
  ZsuperNode = SuperNode
474
+
475
+ # Utility methods for :sym nodes.
476
+ module SymNode
477
+ def name
478
+ children.first
479
+ end
480
+
481
+ def full_name(outer)
482
+ prefix = outer == '' ? '' : "#{outer}#"
483
+ "#{prefix}#{name}"
484
+ end
485
+ end
445
486
  end
446
487
  end
447
488
  end
@@ -1,5 +1,6 @@
1
1
  require_relative '../cli/silencer'
2
- Reek::CLI::Silencer.silently do
2
+
3
+ Reek::CLI::Silencer.silently stderr: true, stdout: true do
3
4
  require 'unparser'
4
5
  end
5
6
 
@@ -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.from_path(options.config_file)
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
@@ -1,3 +1,5 @@
1
+ require 'private_attr/everywhere'
2
+
1
3
  module Reek
2
4
  module CLI
3
5
  #
@@ -10,6 +12,10 @@ module Reek
10
12
  def initialize(options)
11
13
  @options = options
12
14
  end
15
+
16
+ private
17
+
18
+ private_attr_reader :options
13
19
  end
14
20
  end
15
21
  end
@@ -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