reek 6.0.2 → 6.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (228) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +9 -0
  3. data/.github/workflows/ruby.yml +52 -0
  4. data/.rubocop_todo.yml +6 -4
  5. data/CHANGELOG.md +20 -0
  6. data/CONTRIBUTING.md +3 -0
  7. data/Dockerfile +1 -1
  8. data/Gemfile +6 -6
  9. data/bin/code_climate_reek +2 -3
  10. data/lib/reek/ast/ast_node_class_map.rb +1 -1
  11. data/lib/reek/ast/node.rb +1 -1
  12. data/lib/reek/code_comment.rb +22 -17
  13. data/lib/reek/configuration/excluded_paths.rb +2 -1
  14. data/lib/reek/context/code_context.rb +1 -1
  15. data/lib/reek/context/refinement_context.rb +16 -0
  16. data/lib/reek/context_builder.rb +16 -2
  17. data/lib/reek/report/code_climate/code_climate_formatter.rb +1 -3
  18. data/lib/reek/smell_detectors/base_detector.rb +1 -1
  19. data/lib/reek/smell_warning.rb +1 -1
  20. data/lib/reek/source/source_locator.rb +1 -3
  21. data/lib/reek/version.rb +2 -2
  22. data/reek.gemspec +5 -3
  23. metadata +11 -239
  24. data/.travis.yml +0 -40
  25. data/docs/API.md +0 -174
  26. data/docs/Attribute.md +0 -39
  27. data/docs/Basic-Smell-Options.md +0 -85
  28. data/docs/Boolean-Parameter.md +0 -54
  29. data/docs/Class-Variable.md +0 -40
  30. data/docs/Code-Smells.md +0 -39
  31. data/docs/Command-Line-Options.md +0 -119
  32. data/docs/Control-Couple.md +0 -26
  33. data/docs/Control-Parameter.md +0 -32
  34. data/docs/Data-Clump.md +0 -46
  35. data/docs/Duplicate-Method-Call.md +0 -264
  36. data/docs/Feature-Envy.md +0 -93
  37. data/docs/How-To-Write-New-Detectors.md +0 -132
  38. data/docs/How-reek-works-internally.md +0 -114
  39. data/docs/Instance-Variable-Assumption.md +0 -163
  40. data/docs/Irresponsible-Module.md +0 -47
  41. data/docs/Large-Class.md +0 -16
  42. data/docs/Long-Parameter-List.md +0 -39
  43. data/docs/Long-Yield-List.md +0 -37
  44. data/docs/Manual-Dispatch.md +0 -30
  45. data/docs/Missing-Safe-Method.md +0 -92
  46. data/docs/Module-Initialize.md +0 -62
  47. data/docs/Nested-Iterators.md +0 -59
  48. data/docs/Nil-Check.md +0 -47
  49. data/docs/RSpec-matchers.md +0 -129
  50. data/docs/Rake-Task.md +0 -66
  51. data/docs/Reek-4-to-Reek-5-migration.md +0 -188
  52. data/docs/Reek-Driven-Development.md +0 -46
  53. data/docs/Repeated-Conditional.md +0 -47
  54. data/docs/Simulated-Polymorphism.md +0 -16
  55. data/docs/Smell-Suppression.md +0 -96
  56. data/docs/Style-Guide.md +0 -19
  57. data/docs/Subclassed-From-Core-Class.md +0 -79
  58. data/docs/Too-Many-Constants.md +0 -37
  59. data/docs/Too-Many-Instance-Variables.md +0 -43
  60. data/docs/Too-Many-Methods.md +0 -56
  61. data/docs/Too-Many-Statements.md +0 -54
  62. data/docs/Uncommunicative-Method-Name.md +0 -94
  63. data/docs/Uncommunicative-Module-Name.md +0 -92
  64. data/docs/Uncommunicative-Name.md +0 -18
  65. data/docs/Uncommunicative-Parameter-Name.md +0 -90
  66. data/docs/Uncommunicative-Variable-Name.md +0 -96
  67. data/docs/Unused-Parameters.md +0 -28
  68. data/docs/Unused-Private-Method.md +0 -101
  69. data/docs/Utility-Function.md +0 -56
  70. data/docs/Versioning-Policy.md +0 -7
  71. data/docs/YAML-Reports.md +0 -93
  72. data/docs/defaults.reek.yml +0 -129
  73. data/docs/templates/default/docstring/html/public_api_marker.erb +0 -3
  74. data/docs/templates/default/docstring/setup.rb +0 -37
  75. data/docs/templates/default/fulldoc/html/css/common.css +0 -1
  76. data/docs/yard_plugin.rb +0 -17
  77. data/features/command_line_interface/basic_usage.feature +0 -15
  78. data/features/command_line_interface/options.feature +0 -123
  79. data/features/command_line_interface/show_progress.feature +0 -33
  80. data/features/command_line_interface/smell_selection.feature +0 -15
  81. data/features/command_line_interface/smells_count.feature +0 -38
  82. data/features/command_line_interface/stdin.feature +0 -65
  83. data/features/configuration_files/accept_setting.feature +0 -87
  84. data/features/configuration_files/directory_specific_directives.feature +0 -274
  85. data/features/configuration_files/exclude_directives.feature +0 -35
  86. data/features/configuration_files/exclude_paths_directives.feature +0 -42
  87. data/features/configuration_files/masking_smells.feature +0 -94
  88. data/features/configuration_files/mix_accept_reject_setting.feature +0 -84
  89. data/features/configuration_files/reject_setting.feature +0 -89
  90. data/features/configuration_files/schema_validation.feature +0 -59
  91. data/features/configuration_files/show_configuration_file.feature +0 -44
  92. data/features/configuration_files/unused_private_method.feature +0 -68
  93. data/features/configuration_loading.feature +0 -91
  94. data/features/configuration_via_source_comments/erroneous_source_comments.feature +0 -68
  95. data/features/configuration_via_source_comments/well_formed_source_comments.feature +0 -116
  96. data/features/locales.feature +0 -32
  97. data/features/programmatic_access.feature +0 -41
  98. data/features/rake_task/rake_task.feature +0 -138
  99. data/features/reports/codeclimate.feature +0 -59
  100. data/features/reports/json.feature +0 -59
  101. data/features/reports/reports.feature +0 -219
  102. data/features/reports/yaml.feature +0 -52
  103. data/features/rspec_matcher.feature +0 -41
  104. data/features/samples.feature +0 -305
  105. data/features/step_definitions/.rubocop.yml +0 -5
  106. data/features/step_definitions/reek_steps.rb +0 -102
  107. data/features/step_definitions/sample_file_steps.rb +0 -63
  108. data/features/support/env.rb +0 -33
  109. data/features/todo_list.feature +0 -108
  110. data/samples/checkstyle.xml +0 -7
  111. data/samples/clean_source/clean.rb +0 -6
  112. data/samples/configuration/accepts_rejects_and_excludes_for_detectors.reek.yml +0 -29
  113. data/samples/configuration/accepts_rejects_and_excludes_for_directory_directives.reek.yml +0 -30
  114. data/samples/configuration/corrupt.reek +0 -1
  115. data/samples/configuration/empty.reek +0 -0
  116. data/samples/configuration/full_configuration.reek +0 -13
  117. data/samples/configuration/full_mask.reek +0 -6
  118. data/samples/configuration/home/home.reek.yml +0 -4
  119. data/samples/configuration/partial_mask.reek +0 -4
  120. data/samples/configuration/regular_configuration/.reek.yml +0 -4
  121. data/samples/configuration/regular_configuration/empty_sub_directory/.gitignore +0 -0
  122. data/samples/configuration/with_excluded_paths.reek +0 -5
  123. data/samples/no_config_file/.keep +0 -0
  124. data/samples/paths.rb +0 -5
  125. data/samples/smelly_source/inline.rb +0 -704
  126. data/samples/smelly_source/optparse.rb +0 -1788
  127. data/samples/smelly_source/redcloth.rb +0 -1130
  128. data/samples/smelly_source/ruby.rb +0 -368
  129. data/samples/smelly_source/smelly.rb +0 -7
  130. data/samples/source_with_exclude_paths/ignore_me/uncommunicative_method_name.rb +0 -5
  131. data/samples/source_with_exclude_paths/nested/ignore_me_as_well/irresponsible_module.rb +0 -2
  132. data/samples/source_with_exclude_paths/nested/uncommunicative_parameter_name.rb +0 -6
  133. data/samples/source_with_exclude_paths/nested/uncommunicative_variable_name.rb +0 -6
  134. data/samples/source_with_hidden_directories/.hidden/hidden.rb +0 -1
  135. data/samples/source_with_hidden_directories/not_hidden.rb +0 -1
  136. data/samples/source_with_non_ruby_files/gibberish +0 -1
  137. data/samples/source_with_non_ruby_files/python_source.py +0 -1
  138. data/samples/source_with_non_ruby_files/ruby.rb +0 -6
  139. data/spec/performance/reek/smell_detectors/runtime_speed_spec.rb +0 -15
  140. data/spec/quality/documentation_spec.rb +0 -41
  141. data/spec/quality/reek_source_spec.rb +0 -11
  142. data/spec/reek/ast/node_spec.rb +0 -211
  143. data/spec/reek/ast/object_refs_spec.rb +0 -83
  144. data/spec/reek/ast/reference_collector_spec.rb +0 -47
  145. data/spec/reek/ast/sexp_extensions_spec.rb +0 -498
  146. data/spec/reek/cli/application_spec.rb +0 -168
  147. data/spec/reek/cli/command/report_command_spec.rb +0 -44
  148. data/spec/reek/cli/command/todo_list_command_spec.rb +0 -86
  149. data/spec/reek/cli/options_spec.rb +0 -51
  150. data/spec/reek/cli/silencer_spec.rb +0 -28
  151. data/spec/reek/code_comment_spec.rb +0 -184
  152. data/spec/reek/configuration/app_configuration_spec.rb +0 -195
  153. data/spec/reek/configuration/configuration_file_finder_spec.rb +0 -230
  154. data/spec/reek/configuration/default_directive_spec.rb +0 -13
  155. data/spec/reek/configuration/directory_directives_spec.rb +0 -122
  156. data/spec/reek/configuration/excluded_paths_spec.rb +0 -16
  157. data/spec/reek/configuration/rake_task_converter_spec.rb +0 -33
  158. data/spec/reek/configuration/schema_validator_spec.rb +0 -165
  159. data/spec/reek/context/code_context_spec.rb +0 -192
  160. data/spec/reek/context/ghost_context_spec.rb +0 -60
  161. data/spec/reek/context/method_context_spec.rb +0 -72
  162. data/spec/reek/context/module_context_spec.rb +0 -55
  163. data/spec/reek/context/root_context_spec.rb +0 -12
  164. data/spec/reek/context/statement_counter_spec.rb +0 -24
  165. data/spec/reek/context_builder_spec.rb +0 -457
  166. data/spec/reek/detector_repository_spec.rb +0 -22
  167. data/spec/reek/documentation_link_spec.rb +0 -20
  168. data/spec/reek/errors/base_error_spec.rb +0 -13
  169. data/spec/reek/examiner_spec.rb +0 -309
  170. data/spec/reek/logging_error_handler_spec.rb +0 -24
  171. data/spec/reek/rake/task_spec.rb +0 -56
  172. data/spec/reek/report/code_climate/code_climate_configuration_spec.rb +0 -22
  173. data/spec/reek/report/code_climate/code_climate_fingerprint_spec.rb +0 -126
  174. data/spec/reek/report/code_climate/code_climate_formatter_spec.rb +0 -51
  175. data/spec/reek/report/code_climate/code_climate_report_spec.rb +0 -56
  176. data/spec/reek/report/html_report_spec.rb +0 -19
  177. data/spec/reek/report/json_report_spec.rb +0 -58
  178. data/spec/reek/report/location_formatter_spec.rb +0 -32
  179. data/spec/reek/report/progress_formatter_spec.rb +0 -68
  180. data/spec/reek/report/text_report_spec.rb +0 -89
  181. data/spec/reek/report/xml_report_spec.rb +0 -24
  182. data/spec/reek/report/yaml_report_spec.rb +0 -55
  183. data/spec/reek/report_spec.rb +0 -28
  184. data/spec/reek/smell_configuration_spec.rb +0 -56
  185. data/spec/reek/smell_detectors/attribute_spec.rb +0 -197
  186. data/spec/reek/smell_detectors/base_detector_spec.rb +0 -50
  187. data/spec/reek/smell_detectors/boolean_parameter_spec.rb +0 -93
  188. data/spec/reek/smell_detectors/class_variable_spec.rb +0 -106
  189. data/spec/reek/smell_detectors/control_parameter_spec.rb +0 -300
  190. data/spec/reek/smell_detectors/data_clump_spec.rb +0 -134
  191. data/spec/reek/smell_detectors/duplicate_method_call_spec.rb +0 -211
  192. data/spec/reek/smell_detectors/feature_envy_spec.rb +0 -295
  193. data/spec/reek/smell_detectors/instance_variable_assumption_spec.rb +0 -96
  194. data/spec/reek/smell_detectors/irresponsible_module_spec.rb +0 -226
  195. data/spec/reek/smell_detectors/long_parameter_list_spec.rb +0 -61
  196. data/spec/reek/smell_detectors/long_yield_list_spec.rb +0 -49
  197. data/spec/reek/smell_detectors/manual_dispatch_spec.rb +0 -75
  198. data/spec/reek/smell_detectors/missing_safe_method_spec.rb +0 -68
  199. data/spec/reek/smell_detectors/module_initialize_spec.rb +0 -77
  200. data/spec/reek/smell_detectors/nested_iterators_spec.rb +0 -333
  201. data/spec/reek/smell_detectors/nil_check_spec.rb +0 -100
  202. data/spec/reek/smell_detectors/repeated_conditional_spec.rb +0 -100
  203. data/spec/reek/smell_detectors/subclassed_from_core_class_spec.rb +0 -77
  204. data/spec/reek/smell_detectors/too_many_constants_spec.rb +0 -144
  205. data/spec/reek/smell_detectors/too_many_instance_variables_spec.rb +0 -132
  206. data/spec/reek/smell_detectors/too_many_methods_spec.rb +0 -54
  207. data/spec/reek/smell_detectors/too_many_statements_spec.rb +0 -90
  208. data/spec/reek/smell_detectors/uncommunicative_method_name_spec.rb +0 -78
  209. data/spec/reek/smell_detectors/uncommunicative_module_name_spec.rb +0 -78
  210. data/spec/reek/smell_detectors/uncommunicative_parameter_name_spec.rb +0 -147
  211. data/spec/reek/smell_detectors/uncommunicative_variable_name_spec.rb +0 -201
  212. data/spec/reek/smell_detectors/unused_parameters_spec.rb +0 -114
  213. data/spec/reek/smell_detectors/unused_private_method_spec.rb +0 -205
  214. data/spec/reek/smell_detectors/utility_function_spec.rb +0 -293
  215. data/spec/reek/smell_warning_spec.rb +0 -137
  216. data/spec/reek/source/source_code_spec.rb +0 -79
  217. data/spec/reek/source/source_locator_spec.rb +0 -166
  218. data/spec/reek/spec/should_reek_of_spec.rb +0 -153
  219. data/spec/reek/spec/should_reek_only_of_spec.rb +0 -91
  220. data/spec/reek/spec/should_reek_spec.rb +0 -52
  221. data/spec/reek/spec/smell_matcher_spec.rb +0 -87
  222. data/spec/reek/tree_dresser_spec.rb +0 -46
  223. data/spec/spec_helper.rb +0 -110
  224. data/tasks/configuration.rake +0 -18
  225. data/tasks/console.rake +0 -5
  226. data/tasks/reek.rake +0 -6
  227. data/tasks/rubocop.rake +0 -11
  228. data/tasks/test.rake +0 -32
data/docs/Attribute.md DELETED
@@ -1,39 +0,0 @@
1
- # Attribute
2
-
3
- ## Introduction
4
-
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.
10
-
11
- ## Example
12
-
13
- Given:
14
-
15
- ```Ruby
16
- class Klass
17
- attr_accessor :dummy
18
- end
19
- ```
20
-
21
- Reek would emit the following warning:
22
-
23
- ```
24
- reek test.rb
25
-
26
- test.rb -- 1 warning:
27
- [2]:Attribute: Klass#dummy is a writable attribute
28
- ```
29
-
30
- ## Support in Reek
31
-
32
- This detector raises a warning for every public `attr_writer`,
33
- `attr_accessor`, and `attr` with the writable flag set to `true`.
34
-
35
- Reek does not raise warnings for read-only attributes.
36
-
37
- ## Configuration
38
-
39
- _Attribute_ supports only the [Basic Smell Options](Basic-Smell-Options.md).
@@ -1,85 +0,0 @@
1
- # Basic Smell Options
2
-
3
- ## Introduction
4
-
5
- Every smell detector in Reek offers at least the following configuration options:
6
-
7
- | Option | Value | Effect |
8
- | ---------------|-------------|---------|
9
- | `enabled` | Boolean | Determines whether the smell detector is active. Defaults to `true` |
10
- | `exclude` | an array of strings that will be converted into regular expressions | Ignores any context whose full description matches any element of this array. |
11
-
12
- The file `docs/defaults.reek.yml` (shipped with the Reek gem) lists any default
13
- exclusions for each smell.
14
-
15
- ## Examples
16
-
17
- **An easy one:**
18
-
19
- To stop Reek reporting smells in any method called `write` you might create a configuration file containing this:
20
-
21
- ```yaml
22
- DuplicateMethodCall:
23
- exclude:
24
- - write
25
- ```
26
-
27
- Internally Reek will convert this to the Regexp /write/.
28
-
29
- **A more sophisticated one:**
30
-
31
- ```yaml
32
- FeatureEnvy:
33
- exclude:
34
- - "MyModel#do_things"
35
- - "MyHelper"
36
- - "ApplicationController#respond"
37
- ```
38
-
39
- This would not report FeatureEnvy for the instance method `MyModel#do_things`, the whole module `MyHelper` and the `respond` instance method of `ApplicationController`
40
-
41
- ## Advanced configuration
42
-
43
- Sometimes just strings are not enough for configuration. E.g. consider this code sample:
44
-
45
- ```Ruby
46
- class Klass
47
- def foo1; end
48
- def foo1bar; end
49
- end
50
- ```
51
- Both "Klass#foo1" and "Klass#foo1bar" will smell of UncommunicativeMethodName. Now let's assume
52
- you are ok with "Klass#foo1" but not "Klass#foo1bar".
53
- Just having this configuration
54
-
55
- ```yaml
56
- UncommunicativeMethodName:
57
- exclude:
58
- - "Klass#foo1"
59
- ```
60
-
61
- wouldn't work because now "Klass#foo1bar" wouldn't smell as well.
62
-
63
- For this reason Reek has a special syntax that allows you to use regexes by using a forward slash at the beginning and the end of the string.
64
- Everything within the forward slashes will be loaded as a regex.
65
-
66
- A possible configuration that hat excludes "Klass#foo1" from this scan but not "Klass#foo1bar" could look like this:
67
-
68
- ```yaml
69
- UncommunicativeMethodName:
70
- exclude:
71
- - "/Klass#foo1$/"
72
- ```
73
-
74
- ## Reek 4
75
-
76
- In Reek 4 you could also pass regexes to `exclude`, meaning this was perfectly valid as well:
77
-
78
- ```yaml
79
- DuplicateMethodCall:
80
- exclude:
81
- - !ruby/regexp /write/
82
- ```
83
-
84
- Support for this has been scrapped with Reek 5 to make the Reek configuration more yaml standard compliant.
85
- You can still pass in regexes, you just have to wrap them into a string. Please see "Advanced configuration" above.
@@ -1,54 +0,0 @@
1
- # Boolean Parameter
2
-
3
- ## Introduction
4
-
5
- _Boolean Parameter_ is a case of [Control Couple](Control-Couple.md), where a
6
- method parameter is defaulted to true or false. A _Boolean Parameter_
7
- effectively permits a method's caller to decide which execution path to take.
8
- This is a case of bad cohesion. You're creating a dependency between methods
9
- that is not really necessary, thus increasing coupling.
10
-
11
- ## Example
12
-
13
- Given
14
-
15
- ```Ruby
16
- class Dummy
17
- def hit_the_switch(switch = true)
18
- if switch
19
- puts 'Hitting the switch'
20
- # do other things...
21
- else
22
- puts 'Not hitting the switch'
23
- # do other things...
24
- end
25
- end
26
- end
27
- ```
28
-
29
- Reek would emit the following warning:
30
-
31
- ```
32
- test.rb -- 3 warnings:
33
- [1]:Dummy#hit_the_switch has boolean parameter 'switch' (BooleanParameter)
34
- [2]:Dummy#hit_the_switch is controlled by argument switch (ControlParameter)
35
- ```
36
-
37
- Note that both smells are reported, _Boolean Parameter_ and _Control Parameter_.
38
-
39
- ## Getting rid of the smell
40
-
41
- This is highly dependent on your exact architecture, but looking at the example above what you could do is:
42
-
43
- * Move everything in the `if` branch into a separate method
44
- * Move everything in the `else` branch into a separate method
45
- * Get rid of the `hit_the_switch` method alltogether
46
- * Make the decision what method to call in the initial caller of `hit_the_switch`
47
-
48
- ## Current support in Reek
49
-
50
- Reek can only detect a _Boolean Parameter_ when it has a default initializer like in the example above.
51
-
52
- ## Configuration
53
-
54
- _Boolean Parameter_ supports the [Basic Smell Options](Basic-Smell-Options.md).
@@ -1,40 +0,0 @@
1
- # Class Variable
2
-
3
- ## Introduction
4
-
5
- Class variables form part of the global runtime state, and as such make it easy for one part of the system to accidentally or inadvertently depend on another part of the system. So the system becomes more prone to problems where changing something over here breaks something over there. In particular, class variables can make it hard to set up tests (because the context of the test includes all global state).
6
-
7
- For a detailed explanation, check out [this article](http://4thmouse.com/index.php/2011/03/20/why-class-variables-in-ruby-are-a-bad-idea/).
8
-
9
- ## Example
10
-
11
- Given
12
-
13
- ```Ruby
14
- class Dummy
15
- @@class_variable = :whatever
16
- end
17
- ```
18
-
19
- Reek would emit the following warning:
20
-
21
- ```
22
- reek test.rb
23
-
24
- test.rb -- 1 warning:
25
- [2]:Dummy declares the class variable @@class_variable (ClassVariable)
26
- ```
27
-
28
- ## Getting rid of the smell
29
-
30
- You can use class-instance variable to mitigate the problem (as also suggested in the linked article above):
31
-
32
- ```Ruby
33
- class Dummy
34
- @class_variable = :whatever
35
- end
36
- ```
37
-
38
- ## Configuration
39
-
40
- _Class Variable_ supports the [Basic Smell Options](Basic-Smell-Options.md).
data/docs/Code-Smells.md DELETED
@@ -1,39 +0,0 @@
1
- # Code Smells
2
-
3
- Smells are indicators of where your code might be hard to read, maintain or evolve, rather than things that are specifically _wrong_. Naturally this means that Reek is looking towards your code's future (and that can make its reports seem somewhat subjective, of course).
4
-
5
- Reek currently includes checks for the following smells:
6
-
7
- * [Attribute](Attribute.md)
8
- * [Class Variable](Class-Variable.md)
9
- * [Control Couple](Control-Couple.md), including
10
- * [Boolean Parameter](Boolean-Parameter.md)
11
- * [Control Parameter](Control-Parameter.md)
12
- * [Data Clump](Data-Clump.md)
13
- * [Duplicate Method Call](Duplicate-Method-Call.md)
14
- * [Instance Variable Assumption](Instance-Variable-Assumption.md)
15
- * [Irresponsible Module](Irresponsible-Module.md)
16
- * [Large Class](Large-Class.md), including
17
- * [Too Many Constants](Too-Many-Constants.md)
18
- * [Too Many Instance Variables](Too-Many-Instance-Variables.md)
19
- * [Too Many Methods](Too-Many-Methods.md)
20
- * [Long Parameter List](Long-Parameter-List.md), and its special case [Long Yield List](Long-Yield-List.md)
21
- * Low Cohesion, including
22
- * [Feature Envy](Feature-Envy.md)
23
- * [Utility Function](Utility-Function.md)
24
- * [Module Initialize](Module-Initialize.md)
25
- * [Nested Iterators](Nested-Iterators.md)
26
- * [Missing Safe Method](Missing-Safe-Method.md), formerly known as Prima Donna Method
27
- * [Simulated Polymorphism](Simulated-Polymorphism.md), including
28
- * [Manual Dispatch](Manual-Dispatch.md)
29
- * [Nil Check](Nil-Check.md)
30
- * [Repeated Conditional](Repeated-Conditional.md)
31
- * [Subclassed From Core Class](Subclassed-From-Core-Class.md)
32
- * [Too Many Statements](Too-Many-Statements.md)
33
- * [Uncommunicative Name](Uncommunicative-Name.md), including
34
- * [Uncommunicative Method Name](Uncommunicative-Method-Name.md)
35
- * [Uncommunicative Module Name](Uncommunicative-Module-Name.md)
36
- * [Uncommunicative Parameter Name](Uncommunicative-Parameter-Name.md)
37
- * [Uncommunicative Variable Name](Uncommunicative-Variable-Name.md)
38
- * [Unused Parameters](Unused-Parameters.md)
39
- * [Unused Private Method](Unused-Private-Method.md)
@@ -1,119 +0,0 @@
1
- # Command Line Options
2
-
3
- ## Introduction
4
-
5
- Reek follows standard Unix convention for passing arguments.
6
-
7
- Check out
8
-
9
- ```Bash
10
- reek -h
11
- ```
12
-
13
- for details.
14
-
15
- ## Telling Reek to use a specific configuration file
16
-
17
- In case your configuration file is not in the standard location (that would be your project directory or
18
- whatever directory you're running Reek from) you can specify a configuration file with the `-c` option
19
- like this:
20
-
21
- ```Bash
22
- reek -c /somewhere/on/your/filesystem/reek_config.yml lib/
23
- ```
24
-
25
- ## Telling Reek Which Code to Check
26
-
27
- Probably the most standard use case would be to check all Ruby files in the lib directory:
28
-
29
- ```Bash
30
- reek lib/*.rb
31
- ```
32
-
33
- In general, if any command-line argument is a directory, Reek searches that directory and all sub-directories for Ruby source files. Thus
34
-
35
- ```Bash
36
- reek lib
37
- ```
38
-
39
- would be equivalent to
40
-
41
- ```Bash
42
- reek lib/**/*.rb
43
- ```
44
-
45
- Occasionally you may want to quickly check a code snippet without going to the trouble of creating a file to hold it. You can pass the snippet directly to Reek's standard input:
46
-
47
- ```Bash
48
- echo "def x() true end" | reek
49
- ```
50
-
51
- To just check all Ruby files in the current directory, you can simply run it
52
- with no parameters:
53
-
54
- ```Bash
55
- reek
56
- ```
57
-
58
- ## Telling Reek Which Smells to Detect
59
-
60
- You can tell Reek to only check particular smells by using the `--smell`
61
- option and passing in the smell name.
62
-
63
- For example, to only check for [Utility Function](Utility-Function.md), you
64
- would use:
65
-
66
- ```Bash
67
- reek --smell UtilityFunction
68
- ```
69
-
70
- You can select several smells by repeating the `--smell` option like so:
71
-
72
- ```Bash
73
- reek --smell UtilityFunction --smell UncommunicativeMethodName
74
- ```
75
-
76
- ## Output options
77
-
78
- ### Output smell's line number
79
-
80
- By passing in a "-n" flag to the _reek_ command, the output will suppress the line numbers:
81
-
82
- ```Bash
83
- $ reek -n mess.rb
84
- ```
85
-
86
- ```
87
- mess.rb -- 2 warnings:
88
- x doesn't depend on instance state (UtilityFunction)
89
- x has the name 'x' (UncommunicativeMethodName)
90
- ```
91
-
92
- Otherwise line numbers will be shown as default at the beginning of each warning in square brackets:
93
-
94
- ```Bash
95
- $ reek mess.rb
96
- ```
97
-
98
- ```
99
- mess.rb -- 2 warnings:
100
- [2]:x doesn't depend on instance state (UtilityFunction)
101
- [2]:x has the name 'x' (UncommunicativeMethodName)
102
- ```
103
-
104
- ### Enable the verbose mode
105
-
106
- _reek_ has a verbose mode which you might find helpful as a beginner. "verbose" just means that behind each warning a helpful link will be displayed which leads directly to the corresponding _reek_ documentation page.
107
- This mode can be enabled via the "-U" or "--documentation" flag.
108
-
109
- So for instance, if your test file would smell of _ClassVariable_, this is what the _reek_ output would look like:
110
-
111
- ```Bash
112
- reek -U test.rb
113
- ```
114
- ```
115
- test.rb -- 1 warning:
116
- [2]:Dummy declares the class variable @@class_variable (ClassVariable) [https://github.com/troessner/reek/blob/master/docs/Class-Variable.md]
117
- ```
118
-
119
- Note the link at the end.
@@ -1,26 +0,0 @@
1
- # Control Couple
2
-
3
- ## Introduction
4
-
5
- Control coupling occurs when a method or block checks the value of a parameter
6
- in order to decide which execution path to take. The offending parameter is
7
- often called a _Control Couple_.
8
-
9
- Control Coupling is a kind of duplication, because the calling method already knows which path should be taken.
10
-
11
- Control Coupling reduces the code's flexibility by creating a dependency
12
- between the caller and callee: any change to the possible values of the
13
- controlling parameter must be reflected on both sides of the call. A _Control
14
- Couple_ also reveals a loss of simplicity: the called method probably has more
15
- than one responsibility, because it includes at least two different code paths.
16
-
17
- You can find a good write-up regarding this problem [here](https://solnic.codes/2012/04/11/get-rid-of-that-code-smell-control-couple/).
18
-
19
- ## Current Support in Reek
20
-
21
- Reek performs the following checks that fall in this category:
22
-
23
- * [Control-Parameter](Control-Parameter.md) - a method parameter or block
24
- parameter is the tested value in a conditional statement
25
- * [Boolean-Parameter](Boolean-Parameter.md) - a method parameter is defaulted
26
- to `true` or `false`.
@@ -1,32 +0,0 @@
1
- # Control Parameter
2
-
3
- ## Introduction
4
-
5
- _Control Parameter_ is a case of [Control Couple](Control-Couple.md).
6
-
7
- ## Example
8
-
9
- A simple example would be the `quoted` parameter in the following method:
10
-
11
- ```Ruby
12
- def write(quoted)
13
- if quoted
14
- write_quoted @value
15
- else
16
- write_unquoted @value
17
- end
18
- end
19
- ```
20
-
21
- Fixing those problems is out of the scope of this document but an easy solution
22
- could be to remove the `write` method altogether and to move the calls to
23
- `write_quoted` and `write_unquoted` to the caller of `write`.
24
-
25
- ## Current Support in Reek
26
-
27
- Reek warns about _Control Parameter_ when a method parameter or block parameter is
28
- the tested value in a conditional statement.
29
-
30
- ## Configuration
31
-
32
- _Control Parameter_ supports the [Basic Smell Options](Basic-Smell-Options.md).
data/docs/Data-Clump.md DELETED
@@ -1,46 +0,0 @@
1
- # Data Clump
2
-
3
- ## Introduction
4
-
5
- In general, a _Data Clump_ occurs when the same two or three items frequently
6
- appear together in classes and parameter lists, or when a group of instance
7
- variable names start or end with similar substrings.
8
-
9
- The recurrence of the items often means there is duplicate code spread around to handle them. There may be an abstraction missing from the code, making the system harder to understand.
10
-
11
- ## Example
12
-
13
- Given
14
-
15
- ```Ruby
16
- class Dummy
17
- def x(y1,y2); end
18
- def y(y1,y2); end
19
- def z(y1,y2); end
20
- end
21
- ```
22
-
23
- Reek would emit the following warning:
24
-
25
- ```
26
- test.rb -- 1 warning:
27
- [2, 3, 4]:Dummy takes parameters [y1, y2] to 3 methods (DataClump)
28
- ```
29
-
30
- A possible way to fix this problem (quoting from [Martin Fowler](http://martinfowler.com/bliki/DataClump.html)):
31
-
32
- > The first step is to replace data clumps with objects and use the objects whenever you see them. An immediate benefit is that you'll shrink some parameter lists. The interesting stuff happens as you begin to look for behavior to move into the new objects.
33
-
34
- ## Current Support in Reek
35
-
36
- Reek looks for a group of two or more parameters with the same names that are expected by three or more methods of a class.
37
-
38
- ## Configuration
39
-
40
- Reek's _Data Clump_ detector offers the [Basic Smell Options](Basic-Smell-Options.md), plus:
41
-
42
- | Option | Value | Effect |
43
- | -----------------|-------------|---------|
44
- | `max_copies` | integer | The maximum number of methods that are permitted to take the same group of parameters. Defaults to 2. |
45
- | `min_clump_size` | integer | The smallest number of parameters that can be reported as a clump. Defaults to 2. |
46
-