reek 3.3.1 → 3.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (123) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +4 -0
  3. data/CHANGELOG.md +6 -0
  4. data/CONTRIBUTING.md +3 -0
  5. data/README.md +12 -4
  6. data/Rakefile +1 -0
  7. data/config/defaults.reek +1 -2
  8. data/docs/Nested-Iterators.md +6 -1
  9. data/docs/Smell-Suppression.md +69 -5
  10. data/docs/Uncommunicative-Module-Name.md +1 -1
  11. data/docs/Utility-Function.md +13 -1
  12. data/docs/style-guide.md +18 -0
  13. data/docs/templates/default/docstring/html/public_api_marker.erb +3 -0
  14. data/docs/templates/default/docstring/setup.rb +41 -0
  15. data/docs/templates/default/fulldoc/html/css/common.css +1 -0
  16. data/docs/yard_plugin.rb +2 -0
  17. data/features/command_line_interface/smell_selection.feature +1 -0
  18. data/features/configuration_files/masking_smells.feature +12 -0
  19. data/features/samples.feature +27 -26
  20. data/features/step_definitions/sample_file_steps.rb +25 -30
  21. data/lib/reek/ast/ast_node_class_map.rb +1 -1
  22. data/lib/reek/ast/node.rb +3 -4
  23. data/lib/reek/ast/object_refs.rb +2 -2
  24. data/lib/reek/ast/reference_collector.rb +0 -1
  25. data/lib/reek/ast/sexp_extensions.rb +1 -2
  26. data/lib/reek/ast/sexp_formatter.rb +1 -2
  27. data/lib/reek/cli/application.rb +0 -1
  28. data/lib/reek/cli/command.rb +0 -1
  29. data/lib/reek/cli/input.rb +2 -1
  30. data/lib/reek/cli/option_interpreter.rb +0 -1
  31. data/lib/reek/cli/options.rb +3 -1
  32. data/lib/reek/cli/reek_command.rb +0 -1
  33. data/lib/reek/cli/silencer.rb +4 -4
  34. data/lib/reek/cli/warning_collector.rb +0 -1
  35. data/lib/reek/code_comment.rb +6 -11
  36. data/lib/reek/configuration/app_configuration.rb +0 -3
  37. data/lib/reek/configuration/configuration_file_finder.rb +4 -1
  38. data/lib/reek/configuration/configuration_validator.rb +1 -0
  39. data/lib/reek/configuration/directory_directives.rb +4 -0
  40. data/lib/reek/configuration/excluded_paths.rb +2 -1
  41. data/lib/reek/context/code_context.rb +11 -4
  42. data/lib/reek/context/method_context.rb +1 -6
  43. data/lib/reek/context/module_context.rb +0 -1
  44. data/lib/reek/context/root_context.rb +0 -1
  45. data/lib/reek/context/singleton_method_context.rb +0 -1
  46. data/lib/reek/examiner.rb +15 -15
  47. data/lib/reek/rake/task.rb +14 -0
  48. data/lib/reek/report.rb +0 -8
  49. data/lib/reek/report/formatter.rb +13 -12
  50. data/lib/reek/report/heading_formatter.rb +2 -1
  51. data/lib/reek/report/location_formatter.rb +0 -3
  52. data/lib/reek/report/report.rb +34 -14
  53. data/lib/reek/smells/attribute.rb +6 -6
  54. data/lib/reek/smells/boolean_parameter.rb +8 -8
  55. data/lib/reek/smells/class_variable.rb +7 -6
  56. data/lib/reek/smells/control_parameter.rb +8 -7
  57. data/lib/reek/smells/data_clump.rb +18 -20
  58. data/lib/reek/smells/duplicate_method_call.rb +10 -6
  59. data/lib/reek/smells/feature_envy.rb +17 -9
  60. data/lib/reek/smells/irresponsible_module.rb +6 -6
  61. data/lib/reek/smells/long_parameter_list.rb +7 -7
  62. data/lib/reek/smells/long_yield_list.rb +10 -9
  63. data/lib/reek/smells/module_initialize.rb +7 -6
  64. data/lib/reek/smells/nested_iterators.rb +5 -6
  65. data/lib/reek/smells/nil_check.rb +4 -5
  66. data/lib/reek/smells/prima_donna_method.rb +5 -5
  67. data/lib/reek/smells/repeated_conditional.rb +9 -6
  68. data/lib/reek/smells/smell_configuration.rb +1 -7
  69. data/lib/reek/smells/smell_detector.rb +28 -25
  70. data/lib/reek/smells/smell_repository.rb +18 -19
  71. data/lib/reek/smells/smell_warning.rb +34 -21
  72. data/lib/reek/smells/too_many_instance_variables.rb +5 -6
  73. data/lib/reek/smells/too_many_methods.rb +6 -6
  74. data/lib/reek/smells/too_many_statements.rb +5 -6
  75. data/lib/reek/smells/uncommunicative_method_name.rb +6 -6
  76. data/lib/reek/smells/uncommunicative_module_name.rb +36 -22
  77. data/lib/reek/smells/uncommunicative_parameter_name.rb +27 -19
  78. data/lib/reek/smells/uncommunicative_variable_name.rb +13 -7
  79. data/lib/reek/smells/unused_parameters.rb +10 -9
  80. data/lib/reek/smells/utility_function.rb +22 -11
  81. data/lib/reek/source/source_code.rb +11 -12
  82. data/lib/reek/source/source_locator.rb +6 -1
  83. data/lib/reek/spec.rb +11 -0
  84. data/lib/reek/spec/should_reek.rb +0 -3
  85. data/lib/reek/spec/should_reek_of.rb +1 -1
  86. data/lib/reek/spec/should_reek_only_of.rb +0 -1
  87. data/lib/reek/tree_dresser.rb +3 -1
  88. data/lib/reek/tree_walker.rb +4 -5
  89. data/lib/reek/version.rb +4 -1
  90. data/reek.gemspec +1 -1
  91. data/spec/factories/factories.rb +17 -6
  92. data/spec/quality/reek_source_spec.rb +3 -1
  93. data/spec/reek/cli/warning_collector_spec.rb +3 -2
  94. data/spec/reek/code_comment_spec.rb +8 -10
  95. data/spec/reek/configuration/directory_directives_spec.rb +2 -2
  96. data/spec/reek/configuration/excluded_paths_spec.rb +2 -2
  97. data/spec/reek/context/method_context_spec.rb +0 -26
  98. data/spec/reek/report/json_report_spec.rb +83 -6
  99. data/spec/reek/report/yaml_report_spec.rb +76 -6
  100. data/spec/reek/smells/attribute_spec.rb +1 -1
  101. data/spec/reek/smells/boolean_parameter_spec.rb +2 -3
  102. data/spec/reek/smells/class_variable_spec.rb +1 -1
  103. data/spec/reek/smells/control_parameter_spec.rb +1 -1
  104. data/spec/reek/smells/data_clump_spec.rb +1 -1
  105. data/spec/reek/smells/duplicate_method_call_spec.rb +1 -1
  106. data/spec/reek/smells/feature_envy_spec.rb +1 -0
  107. data/spec/reek/smells/irresponsible_module_spec.rb +1 -1
  108. data/spec/reek/smells/long_parameter_list_spec.rb +1 -1
  109. data/spec/reek/smells/long_yield_list_spec.rb +1 -1
  110. data/spec/reek/smells/nested_iterators_spec.rb +1 -1
  111. data/spec/reek/smells/repeated_conditional_spec.rb +1 -1
  112. data/spec/reek/smells/smell_configuration_spec.rb +9 -9
  113. data/spec/reek/smells/smell_detector_shared.rb +0 -9
  114. data/spec/reek/smells/smell_repository_spec.rb +1 -8
  115. data/spec/reek/smells/smell_warning_spec.rb +3 -2
  116. data/spec/reek/smells/too_many_instance_variables_spec.rb +1 -1
  117. data/spec/reek/smells/too_many_methods_spec.rb +2 -4
  118. data/spec/reek/smells/uncommunicative_method_name_spec.rb +1 -1
  119. data/spec/reek/smells/uncommunicative_module_name_spec.rb +22 -5
  120. data/spec/reek/smells/uncommunicative_parameter_name_spec.rb +1 -1
  121. data/spec/reek/smells/uncommunicative_variable_name_spec.rb +1 -1
  122. data/spec/reek/smells/utility_function_spec.rb +49 -0
  123. metadata +9 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 18055c0f9c08fb0e795cb4417885156291c9f5b7
4
- data.tar.gz: b2d41cb4510dd092450c82bae4664bbbb7a10d50
3
+ metadata.gz: c8492565566dc33ddd04e6474399de644c050c31
4
+ data.tar.gz: 40d22b046c4c8a9be279dae6aacd3859d7534d46
5
5
  SHA512:
6
- metadata.gz: 92722d3bdd09267e2c5858414b6f91cf066a6f9c3596033a3845d1c2d7cd768d17eb29e932af6d7ea8a432081f77b6f77092051288903b0377f11f6137c292ff
7
- data.tar.gz: 0124c0f5b7d1c4f0f580b545757d1f94d51c2f93310b2dfe922abaa9ef241fc91a4ddadbad07832d6d5e92e99b0d4186b70f194f54f68f995693fbc70afc15e5
6
+ metadata.gz: e929fb9f9a89fddb7383ed8fd606b22f31977ed43360160a3359cb325b7a56adbd4801ba7ded8993f90aae42f7369cda18be10b1ff2d44ed9181a2711affea84
7
+ data.tar.gz: ece84cae1ab3d23b457f7f31f6ce47ba48ea65683a82291645803020b418609137fbe5eae6185d1e706ae840a3cbc87a27de4d6abbbef624177cfc13373947e2
data/.rubocop.yml CHANGED
@@ -18,6 +18,10 @@ Metrics/MethodLength:
18
18
  Metrics/LineLength:
19
19
  Max: 120
20
20
 
21
+ # Keyword arguments make long parameter lists readable
22
+ Metrics/ParameterLists:
23
+ CountKeywordArgs: false
24
+
21
25
  # Indent one level for follow-up lines
22
26
  Style/MultilineOperationIndentation:
23
27
  EnforcedStyle: indented
data/CHANGELOG.md CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 3.4.0 (2015-09-16)
6
+
7
+ * (troessner) Make UtilityFunction configurable for non-public methods
8
+ * (troessner) Make FeatureEnvy and UtilityFunction messages more helpful
9
+ * (mvz) Mark public API @public
10
+
5
11
  ## 3.3.1 (2015-09-03)
6
12
 
7
13
  * (troessner) Fix file list as argument in rake task
data/CONTRIBUTING.md CHANGED
@@ -51,6 +51,9 @@ Once you’re sure your copy of reek works create your own feature branch from o
51
51
  git checkout -b your_feature_or_fix_name
52
52
  ```
53
53
 
54
+ Make sure you have read our [style guide](docs/style-guide.md) before you
55
+ start contributing.
56
+
54
57
  Then start hacking and add new tests which make sure that your new feature works or
55
58
  demonstrate that your fix was needed; please also [write good commit
56
59
  messages](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html).
data/README.md CHANGED
@@ -204,9 +204,9 @@ configurations you can also check out [the `config/default.reek` file in this re
204
204
 
205
205
  ### Source code comments
206
206
 
207
- `reek` is not the police. In case you need to suppress a smell
208
- warning and you can't or don't want to use configuration files for
209
- whatever reasons you can also use source code comments like this:
207
+ In case you need to suppress a smell warning and you can't or don't want to
208
+ use configuration files for whatever reasons you can also use special
209
+ source code comments like this:
210
210
 
211
211
  ```Ruby
212
212
  # This method smells of :reek:NestedIterators
@@ -215,8 +215,16 @@ def smelly_method foo
215
215
  end
216
216
  ```
217
217
 
218
- This is further explained under [Smell Suppresion](docs/Smell-Suppression.md).
218
+ You can even pass in smell specific configuration settings:
219
219
 
220
+ ```Ruby
221
+ # :reek:NestedIterators: { max_allowed_nesting: 2 }
222
+ def smelly_method foo
223
+ foo.each {|bar| bar.each {|baz| baz.qux}}
224
+ end
225
+ ```
226
+
227
+ This is an incredible powerful feature and further explained under [Smell Suppresion](docs/Smell-Suppression.md).
220
228
 
221
229
  ## Usage
222
230
 
data/Rakefile CHANGED
@@ -5,3 +5,4 @@ Dir['tasks/**/*.rake'].each { |t| load t }
5
5
 
6
6
  task default: :test
7
7
  task default: :rubocop unless RUBY_ENGINE == 'rbx'
8
+ task default: 'test:quality'
data/config/defaults.reek CHANGED
@@ -84,8 +84,7 @@ UncommunicativeModuleName:
84
84
  reject:
85
85
  - !ruby/regexp /^.$/
86
86
  - !ruby/regexp /[0-9]$/
87
- accept:
88
- - Inline::C
87
+ accept: []
89
88
  UncommunicativeParameterName:
90
89
  enabled: true
91
90
  exclude: []
@@ -36,4 +36,9 @@ Nested Iterators reports failing methods only once.
36
36
 
37
37
  ## Configuration
38
38
 
39
- `Nested Iterators` offers the [Basic Smell Options](Basic-Smell-Options.md).
39
+ `Nested Iterators` offers the [Basic Smell Options](Basic-Smell-Options.md), plus:
40
+
41
+ | Option | Value | Effect |
42
+ | ---------------|-------------|---------|
43
+ | max_allowed_nesting | integer | The maximum depth of nested iterators. Defaults to 1 |
44
+ | ignore_iterators | Array | List of iterators to be excluded from the smell check. Includes only `tap` at the moment|
@@ -1,17 +1,23 @@
1
1
  ## Introduction
2
2
 
3
- In some cases, it might be necessary to suppress one or more of `reek`'s smell warnings for a particular method or class.
3
+ In some cases, it might be necessary to suppress one or more of `reek`'s smell
4
+ warnings for a particular method or class.
4
5
 
5
6
  Possible reasons for this could be:
6
7
 
7
8
  * The code is outside of your control and you can't fix it
8
- * `reek` is not the police. You might have legit reasons why your source code is good as it is.
9
+ * `reek` is not the police. You might have legit reasons why your source code
10
+ is good as it is.
9
11
 
10
12
  ## How to disable smell detection
11
13
 
12
- First and foremost, there are the [Basic Smell Options](Basic-Smell-Options.md) you can use.
14
+ There are always the [Basic Smell Options](Basic-Smell-Options.md)
15
+ you can use in your configuration file.
13
16
 
14
- Besides from that, you can use special comments, like so:
17
+ But in this document we would like to focus on a completely different
18
+ way - via special comments.
19
+
20
+ A simple example:
15
21
 
16
22
  ```ruby
17
23
  # This method smells of :reek:NestedIterators
@@ -20,7 +26,30 @@ def smelly_method foo
20
26
  end
21
27
  ```
22
28
 
23
- The method `smelly_method` will not be reported. The general pattern is to put the string ':reek:', followed by the smell class, in a comment before the method or class.
29
+ The method `smelly_method` will not be reported. The general pattern is to put
30
+ the string ':reek:', followed by the smell class, in a comment before the
31
+ method or class.
32
+
33
+ ## Extended examples
34
+
35
+ Multiple smells may be configured for the same method or class:
36
+
37
+ ```ruby
38
+ # :reek:LongParameterList and :reek:NestedIterators
39
+ def many_parameters_it_has foo, bar, baz, qux
40
+ foo.each {|bar| bar.each {|baz| baz.qux(qux)}}
41
+ end
42
+ ```
43
+
44
+ Or across several lines which is arguably more readable:
45
+
46
+ ```ruby
47
+ # :reek:LongParameterList
48
+ # :reek:NestedIterators
49
+ def many_parameters_it_has foo, bar, baz, qux
50
+ foo.each {|bar| bar.each {|baz| baz.qux(qux)}}
51
+ end
52
+ ```
24
53
 
25
54
  It is also possible to specify options for a particular smell detector, like so:
26
55
 
@@ -30,3 +59,38 @@ def many_parameters_it_has foo, bar, baz, qux
30
59
  # ...
31
60
  end
32
61
  ```
62
+
63
+ Every configuration setting that you can pass via configuration file you can
64
+ also use via comment.
65
+
66
+ E.g.:
67
+
68
+ ```ruby
69
+ # :reek:TooManyStatements: { max_statements: 6 }
70
+ def too_many
71
+ # ...
72
+ end
73
+
74
+ # :reek:NestedIterators: { max_allowed_nesting: 2 }
75
+ def quax
76
+ foo.each {|bar| bar.each {|baz| baz.qux(qux)}}
77
+ end
78
+
79
+ # :reek:DuplicateMethodCall: { max_calls: 3 }
80
+ def quax
81
+ foo.to_i + foo.to_i + foo.to_i
82
+ end
83
+ ```
84
+
85
+ Keep in mind that there are also smell detectors that operate on a class or
86
+ module level, e.g.:
87
+
88
+ ```ruby
89
+ # :reek:TooManyInstanceVariables: { max_instance_variables: 8 }
90
+ class Klass
91
+ # ...
92
+ end
93
+ ```
94
+
95
+ To see what smell detector takes what special configuration just check out the
96
+ dedicated documentation for this smell detector.
@@ -20,4 +20,4 @@ Poor names make it hard for the reader to build a mental picture of what's going
20
20
  | Option | Value | Effect |
21
21
  | ---------------|-------------|---------|
22
22
  | `reject` | array of regular expressions | The set of regular expressions that `reek` uses to check for bad names. Defaults to `[/^.$/, /[0-9]$/]`. |
23
- | `accept` | array of strings or regular expressions | Name that will be accepted (not reported) even if they match one of the `reject` expressions. Defaults to `['Inline::C']`.|
23
+ | `accept` | array of names as strings | List of names that will be accepted (not reported) even if they match one of the `reject` expressions. Empty by default.|
@@ -41,4 +41,16 @@ _[Feature Envy](Feature-Envy.md)_ is only triggered if there are some references
41
41
 
42
42
  ## Configuration
43
43
 
44
- `reek`'s _Utility Function_ detector supports the [Basic Smell Options](Basic-Smell-Options.md).
44
+ `reek`'s _Utility Function_ detector supports the [Basic Smell Options](Basic-Smell-Options.md), plus:
45
+
46
+ | Option | Value | Effect |
47
+ | ---------------|-------------|---------|
48
+ | public_methods_only | Boolean | Disable this smell detector for non-public methods (which means "private" and "protected") |
49
+
50
+ A sample configuration file would look like this:
51
+
52
+ ```Yaml
53
+ ---
54
+ UtilityFunction:
55
+ public_methods_only: true
56
+ ``
@@ -0,0 +1,18 @@
1
+ # Style guide
2
+
3
+ ## Instance variables and getters / setters
4
+
5
+ We use instance vars only:
6
+
7
+ - in the constructor
8
+ - for [memoization](http://gavinmiller.io/2013/basics-of-ruby-memoization/)
9
+
10
+ For everything else we use proper getters / setters.
11
+
12
+ If possible those should be private. We use the [private_attr](https://github.com/jswanner/private_attr) for this, e.g.:
13
+
14
+ ```Ruby
15
+ private_attr_reader :configuration
16
+ private_attr_writer :failure_message
17
+ private_attr_accessor :examiner
18
+ ```
@@ -0,0 +1,3 @@
1
+ <div class="note public">
2
+ <div class="inline"><p>This <%= object.type %> is part of Reek's public API.</p></div>
3
+ </div>
@@ -0,0 +1,41 @@
1
+ def init
2
+ super
3
+ return unless show_api_marker_section?
4
+ if sections.first
5
+ sections.first.place(:api_marker).before(:private)
6
+ else
7
+ sections :index, [:api_marker]
8
+ end
9
+ end
10
+
11
+ def api_marker
12
+ return if object.type == :root
13
+ case api_text
14
+ when 'public'
15
+ # erb(:public_api_marker)
16
+ when 'private'
17
+ # Let section 'private' handle this.
18
+ else
19
+ erb(:private)
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def api_text
26
+ api_text = object.has_tag?(:api) && object.tag(:api).text
27
+ api_text = 'public' if object.has_tag?(:public)
28
+ api_text
29
+ end
30
+
31
+ def show_api_marker_section?
32
+ return false if object.type == :root
33
+ case api_text
34
+ when 'public'
35
+ false
36
+ when 'private'
37
+ false
38
+ else
39
+ true
40
+ end
41
+ end
@@ -0,0 +1 @@
1
+ .note.public { background: #c5ffc5; border-color: #aaecaa; }
data/docs/yard_plugin.rb CHANGED
@@ -12,3 +12,5 @@ module LocalLinkHelper
12
12
  end
13
13
 
14
14
  YARD::Templates::Template.extra_includes << LocalLinkHelper
15
+ YARD::Tags::Library.define_tag('Guaranteed public API', :public)
16
+ YARD::Templates::Engine.register_template_path File.join(File.dirname(__FILE__), 'templates')
@@ -5,6 +5,7 @@ Feature: Smell selection
5
5
 
6
6
  Scenario: --smell selects a smell to detect
7
7
  Given a smelly file called 'smelly.rb'
8
+ And a configuration file masking some duplication smells called 'config.reek'
8
9
  When I run reek --no-line-numbers --smell UncommunicativeMethodName smelly.rb
9
10
  Then the exit status indicates smells
10
11
  And it reports:
@@ -45,3 +45,15 @@ Feature: Masking smells using config files
45
45
  [5]:Dirty has the variable name '@s' (UncommunicativeVariableName)
46
46
  [5]:Dirty#a has the variable name 'x' (UncommunicativeVariableName)
47
47
  """
48
+
49
+ Scenario: Disable UtilityFunction for non-public methods
50
+ Given a smelly file called 'smelly.rb' with private, protected and public UtilityFunction methods
51
+ And a configuration file disabling UtilityFunction for non-public methods called 'config.reek'
52
+ When I run reek -c config.reek smelly.rb
53
+ Then the exit status indicates smells
54
+ And it reports:
55
+ """
56
+ smelly.rb -- 1 warning:
57
+ [3]:Klass#public_method doesn't depend on instance state (maybe move it to another class?) (UtilityFunction)
58
+ """
59
+ But it does not report private or protected methods
@@ -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 -- 46 warnings:
14
+ inline.rb -- 47 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)
@@ -24,6 +24,7 @@ Feature: Basic smell detection
24
24
  Inline::C declares the class variable @@type_map (ClassVariable)
25
25
  Inline::C has at least 13 instance variables (TooManyInstanceVariables)
26
26
  Inline::C has at least 25 methods (TooManyMethods)
27
+ Inline::C has the name 'C' (UncommunicativeModuleName)
27
28
  Inline::C takes parameters [options, src] to 5 methods (DataClump)
28
29
  Inline::C tests $DEBUG at least 7 times (RepeatedConditional)
29
30
  Inline::C tests $TESTING at least 4 times (RepeatedConditional)
@@ -53,7 +54,7 @@ Feature: Basic smell detection
53
54
  Inline::C#parse_signature has boolean parameter 'raw' (BooleanParameter)
54
55
  Inline::C#parse_signature has the variable name 'x' (UncommunicativeVariableName)
55
56
  Inline::C#parse_signature is controlled by argument raw (ControlParameter)
56
- Inline::C#strip_comments doesn't depend on instance state (UtilityFunction)
57
+ Inline::C#strip_comments doesn't depend on instance state (maybe move it to another class?) (UtilityFunction)
57
58
  Module has no descriptive comment (IrresponsibleModule)
58
59
  Module#inline calls Inline.const_get(lang) 2 times (DuplicateMethodCall)
59
60
  Module#inline calls options[:testing] 2 times (DuplicateMethodCall)
@@ -103,9 +104,9 @@ Feature: Basic smell detection
103
104
  OptionParser#make_switch has the variable name 'v' (UncommunicativeVariableName)
104
105
  OptionParser#make_switch performs a nil-check (NilCheck)
105
106
  OptionParser#order calls argv[0] 2 times (DuplicateMethodCall)
106
- OptionParser#order refers to argv more than self (FeatureEnvy)
107
+ OptionParser#order refers to argv more than self (maybe move it to another class?) (FeatureEnvy)
107
108
  OptionParser#parse calls argv[0] 2 times (DuplicateMethodCall)
108
- OptionParser#parse refers to argv more than self (FeatureEnvy)
109
+ OptionParser#parse refers to argv more than self (maybe move it to another class?) (FeatureEnvy)
109
110
  OptionParser#parse_in_order calls $!.set_option(arg, true) 2 times (DuplicateMethodCall)
110
111
  OptionParser#parse_in_order calls cb.call(val) 2 times (DuplicateMethodCall)
111
112
  OptionParser#parse_in_order calls raise($!.set_option(arg, true)) 2 times (DuplicateMethodCall)
@@ -116,7 +117,7 @@ Feature: Basic smell detection
116
117
  OptionParser#parse_in_order contains iterators nested 3 deep (NestedIterators)
117
118
  OptionParser#parse_in_order has approx 35 statements (TooManyStatements)
118
119
  OptionParser#permute calls argv[0] 2 times (DuplicateMethodCall)
119
- OptionParser#permute refers to argv more than self (FeatureEnvy)
120
+ OptionParser#permute refers to argv more than self (maybe move it to another class?) (FeatureEnvy)
120
121
  OptionParser#permute! has approx 6 statements (TooManyStatements)
121
122
  OptionParser#program_name is a writable attribute (Attribute)
122
123
  OptionParser#release is a writable attribute (Attribute)
@@ -139,15 +140,15 @@ Feature: Basic smell detection
139
140
  OptionParser::Completion#complete has boolean parameter 'icase' (BooleanParameter)
140
141
  OptionParser::Completion#complete has the variable name 'k' (UncommunicativeVariableName)
141
142
  OptionParser::Completion#complete has the variable name 'v' (UncommunicativeVariableName)
142
- OptionParser::Completion#complete refers to candidates more than self (FeatureEnvy)
143
+ OptionParser::Completion#complete refers to candidates more than self (maybe move it to another class?) (FeatureEnvy)
143
144
  OptionParser::Completion#convert has unused parameter 'opt' (UnusedParameters)
144
145
  OptionParser::List#accept has the parameter name 't' (UncommunicativeParameterName)
145
- OptionParser::List#accept refers to pat more than self (FeatureEnvy)
146
- OptionParser::List#add_banner refers to opt more than self (FeatureEnvy)
146
+ OptionParser::List#accept refers to pat more than self (maybe move it to another class?) (FeatureEnvy)
147
+ OptionParser::List#add_banner refers to opt more than self (maybe move it to another class?) (FeatureEnvy)
147
148
  OptionParser::List#complete has 4 parameters (LongParameterList)
148
149
  OptionParser::List#complete has boolean parameter 'icase' (BooleanParameter)
149
150
  OptionParser::List#reject has the parameter name 't' (UncommunicativeParameterName)
150
- OptionParser::List#summarize refers to opt more than self (FeatureEnvy)
151
+ OptionParser::List#summarize refers to opt more than self (maybe move it to another class?) (FeatureEnvy)
151
152
  OptionParser::List#update has 5 parameters (LongParameterList)
152
153
  OptionParser::List#update has approx 10 statements (TooManyStatements)
153
154
  OptionParser::List#update has the variable name 'o' (UncommunicativeVariableName)
@@ -189,11 +190,11 @@ Feature: Basic smell detection
189
190
  RedCloth tests codepre.zero? at least 3 times (RepeatedConditional)
190
191
  RedCloth tests href at least 3 times (RepeatedConditional)
191
192
  RedCloth tests title at least 4 times (RepeatedConditional)
192
- RedCloth#block_markdown_atx refers to text more than self (FeatureEnvy)
193
+ RedCloth#block_markdown_atx refers to text more than self (maybe move it to another class?) (FeatureEnvy)
193
194
  RedCloth#block_markdown_bq has approx 6 statements (TooManyStatements)
194
195
  RedCloth#block_markdown_lists has unused parameter 'text' (UnusedParameters)
195
- RedCloth#block_markdown_rule doesn't depend on instance state (UtilityFunction)
196
- RedCloth#block_markdown_setext refers to text more than self (FeatureEnvy)
196
+ RedCloth#block_markdown_rule doesn't depend on instance state (maybe move it to another class?) (UtilityFunction)
197
+ RedCloth#block_markdown_setext refers to text more than self (maybe move it to another class?) (FeatureEnvy)
197
198
  RedCloth#block_textile_lists calls depth.last 5 times (DuplicateMethodCall)
198
199
  RedCloth#block_textile_lists calls depth.last.length 2 times (DuplicateMethodCall)
199
200
  RedCloth#block_textile_lists calls depth[i] 2 times (DuplicateMethodCall)
@@ -204,7 +205,7 @@ Feature: Basic smell detection
204
205
  RedCloth#block_textile_lists has approx 21 statements (TooManyStatements)
205
206
  RedCloth#block_textile_lists has the variable name 'i' (UncommunicativeVariableName)
206
207
  RedCloth#block_textile_lists has the variable name 'v' (UncommunicativeVariableName)
207
- RedCloth#block_textile_lists refers to depth more than self (FeatureEnvy)
208
+ RedCloth#block_textile_lists refers to depth more than self (maybe move it to another class?) (FeatureEnvy)
208
209
  RedCloth#block_textile_table contains iterators nested 3 deep (NestedIterators)
209
210
  RedCloth#block_textile_table has approx 19 statements (TooManyStatements)
210
211
  RedCloth#block_textile_table has the variable name 'x' (UncommunicativeVariableName)
@@ -212,25 +213,25 @@ Feature: Basic smell detection
212
213
  RedCloth#blocks has approx 19 statements (TooManyStatements)
213
214
  RedCloth#blocks has boolean parameter 'deep_code' (BooleanParameter)
214
215
  RedCloth#blocks is controlled by argument deep_code (ControlParameter)
215
- RedCloth#blocks refers to blk more than self (FeatureEnvy)
216
+ RedCloth#blocks refers to blk more than self (maybe move it to another class?) (FeatureEnvy)
216
217
  RedCloth#clean_html calls tags[tag] 2 times (DuplicateMethodCall)
217
218
  RedCloth#clean_html contains iterators nested 3 deep (NestedIterators)
218
- RedCloth#clean_html doesn't depend on instance state (UtilityFunction)
219
+ RedCloth#clean_html doesn't depend on instance state (maybe move it to another class?) (UtilityFunction)
219
220
  RedCloth#clean_html has approx 15 statements (TooManyStatements)
220
221
  RedCloth#clean_html has the variable name 'q' (UncommunicativeVariableName)
221
222
  RedCloth#clean_html has the variable name 'q2' (UncommunicativeVariableName)
222
223
  RedCloth#clean_white_space has approx 7 statements (TooManyStatements)
223
- RedCloth#clean_white_space refers to text more than self (FeatureEnvy)
224
+ RedCloth#clean_white_space refers to text more than self (maybe move it to another class?) (FeatureEnvy)
224
225
  RedCloth#filter_html is a writable attribute (Attribute)
225
226
  RedCloth#filter_styles is a writable attribute (Attribute)
226
- RedCloth#flush_left doesn't depend on instance state (UtilityFunction)
227
- RedCloth#footnote_ref doesn't depend on instance state (UtilityFunction)
227
+ RedCloth#flush_left doesn't depend on instance state (maybe move it to another class?) (UtilityFunction)
228
+ RedCloth#footnote_ref doesn't depend on instance state (maybe move it to another class?) (UtilityFunction)
228
229
  RedCloth#glyphs_textile has approx 10 statements (TooManyStatements)
229
- RedCloth#h_align doesn't depend on instance state (UtilityFunction)
230
+ RedCloth#h_align doesn't depend on instance state (maybe move it to another class?) (UtilityFunction)
230
231
  RedCloth#hard_breaks is a writable attribute (Attribute)
231
- RedCloth#htmlesc doesn't depend on instance state (UtilityFunction)
232
+ RedCloth#htmlesc doesn't depend on instance state (maybe move it to another class?) (UtilityFunction)
232
233
  RedCloth#htmlesc is controlled by argument mode (ControlParameter)
233
- RedCloth#incoming_entities doesn't depend on instance state (UtilityFunction)
234
+ RedCloth#incoming_entities doesn't depend on instance state (maybe move it to another class?) (UtilityFunction)
234
235
  RedCloth#initialize has the variable name 'r' (UncommunicativeVariableName)
235
236
  RedCloth#inline contains iterators nested 2 deep (NestedIterators)
236
237
  RedCloth#inline_markdown_link has approx 6 statements (TooManyStatements)
@@ -247,16 +248,16 @@ Feature: Basic smell detection
247
248
  RedCloth#inline_textile_span contains iterators nested 2 deep (NestedIterators)
248
249
  RedCloth#inline_textile_span has approx 9 statements (TooManyStatements)
249
250
  RedCloth#inline_textile_span has the variable name 'm' (UncommunicativeVariableName)
250
- RedCloth#lT doesn't depend on instance state (UtilityFunction)
251
+ RedCloth#lT doesn't depend on instance state (maybe move it to another class?) (UtilityFunction)
251
252
  RedCloth#lT has the name 'lT' (UncommunicativeMethodName)
252
253
  RedCloth#lT is controlled by argument text (ControlParameter)
253
254
  RedCloth#lite_mode is a writable attribute (Attribute)
254
255
  RedCloth#no_span_caps is a writable attribute (Attribute)
255
- RedCloth#no_textile doesn't depend on instance state (UtilityFunction)
256
+ RedCloth#no_textile doesn't depend on instance state (maybe move it to another class?) (UtilityFunction)
256
257
  RedCloth#pba calls $1.length 2 times (DuplicateMethodCall)
257
258
  RedCloth#pba has approx 21 statements (TooManyStatements)
258
259
  RedCloth#pba is controlled by argument element (ControlParameter)
259
- RedCloth#pba refers to text more than self (FeatureEnvy)
260
+ RedCloth#pba refers to text more than self (maybe move it to another class?) (FeatureEnvy)
260
261
  RedCloth#refs_markdown has the variable name 'm' (UncommunicativeVariableName)
261
262
  RedCloth#refs_textile has the variable name 'm' (UncommunicativeVariableName)
262
263
  RedCloth#retrieve has the variable name 'i' (UncommunicativeVariableName)
@@ -281,6 +282,6 @@ Feature: Basic smell detection
281
282
  RedCloth#textile_popup_help has the parameter name 'windowH' (UncommunicativeParameterName)
282
283
  RedCloth#textile_popup_help has the parameter name 'windowW' (UncommunicativeParameterName)
283
284
  RedCloth#to_html has approx 26 statements (TooManyStatements)
284
- RedCloth#v_align doesn't depend on instance state (UtilityFunction)
285
- 268 total warnings
285
+ RedCloth#v_align doesn't depend on instance state (maybe move it to another class?) (UtilityFunction)
286
+ 269 total warnings
286
287
  """