reek 6.0.2 → 6.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +9 -0
  3. data/.github/workflows/ruby.yml +57 -0
  4. data/.rubocop.yml +5 -3
  5. data/.rubocop_todo.yml +6 -4
  6. data/CHANGELOG.md +26 -0
  7. data/CONTRIBUTING.md +3 -0
  8. data/Dockerfile +1 -1
  9. data/Gemfile +7 -7
  10. data/README.md +1 -1
  11. data/bin/code_climate_reek +2 -3
  12. data/lib/reek/ast/ast_node_class_map.rb +1 -1
  13. data/lib/reek/ast/node.rb +1 -1
  14. data/lib/reek/ast/sexp_extensions/arguments.rb +11 -0
  15. data/lib/reek/ast/sexp_extensions/case.rb +1 -1
  16. data/lib/reek/ast/sexp_extensions/if.rb +1 -1
  17. data/lib/reek/ast/sexp_extensions/send.rb +1 -1
  18. data/lib/reek/cli/command/todo_list_command.rb +1 -1
  19. data/lib/reek/cli/options.rb +1 -1
  20. data/lib/reek/code_comment.rb +22 -17
  21. data/lib/reek/configuration/excluded_paths.rb +2 -1
  22. data/lib/reek/context/code_context.rb +1 -1
  23. data/lib/reek/context/refinement_context.rb +16 -0
  24. data/lib/reek/context_builder.rb +17 -3
  25. data/lib/reek/rake/task.rb +1 -1
  26. data/lib/reek/report/code_climate/code_climate_formatter.rb +1 -3
  27. data/lib/reek/smell_detectors/base_detector.rb +1 -1
  28. data/lib/reek/smell_warning.rb +1 -1
  29. data/lib/reek/source/source_locator.rb +1 -3
  30. data/lib/reek/spec/should_reek_of.rb +6 -4
  31. data/lib/reek/version.rb +2 -2
  32. data/reek.gemspec +28 -25
  33. metadata +13 -240
  34. data/.travis.yml +0 -40
  35. data/docs/API.md +0 -174
  36. data/docs/Attribute.md +0 -39
  37. data/docs/Basic-Smell-Options.md +0 -85
  38. data/docs/Boolean-Parameter.md +0 -54
  39. data/docs/Class-Variable.md +0 -40
  40. data/docs/Code-Smells.md +0 -39
  41. data/docs/Command-Line-Options.md +0 -119
  42. data/docs/Control-Couple.md +0 -26
  43. data/docs/Control-Parameter.md +0 -32
  44. data/docs/Data-Clump.md +0 -46
  45. data/docs/Duplicate-Method-Call.md +0 -264
  46. data/docs/Feature-Envy.md +0 -93
  47. data/docs/How-To-Write-New-Detectors.md +0 -132
  48. data/docs/How-reek-works-internally.md +0 -114
  49. data/docs/Instance-Variable-Assumption.md +0 -163
  50. data/docs/Irresponsible-Module.md +0 -47
  51. data/docs/Large-Class.md +0 -16
  52. data/docs/Long-Parameter-List.md +0 -39
  53. data/docs/Long-Yield-List.md +0 -37
  54. data/docs/Manual-Dispatch.md +0 -30
  55. data/docs/Missing-Safe-Method.md +0 -92
  56. data/docs/Module-Initialize.md +0 -62
  57. data/docs/Nested-Iterators.md +0 -59
  58. data/docs/Nil-Check.md +0 -47
  59. data/docs/RSpec-matchers.md +0 -129
  60. data/docs/Rake-Task.md +0 -66
  61. data/docs/Reek-4-to-Reek-5-migration.md +0 -188
  62. data/docs/Reek-Driven-Development.md +0 -46
  63. data/docs/Repeated-Conditional.md +0 -47
  64. data/docs/Simulated-Polymorphism.md +0 -16
  65. data/docs/Smell-Suppression.md +0 -96
  66. data/docs/Style-Guide.md +0 -19
  67. data/docs/Subclassed-From-Core-Class.md +0 -79
  68. data/docs/Too-Many-Constants.md +0 -37
  69. data/docs/Too-Many-Instance-Variables.md +0 -43
  70. data/docs/Too-Many-Methods.md +0 -56
  71. data/docs/Too-Many-Statements.md +0 -54
  72. data/docs/Uncommunicative-Method-Name.md +0 -94
  73. data/docs/Uncommunicative-Module-Name.md +0 -92
  74. data/docs/Uncommunicative-Name.md +0 -18
  75. data/docs/Uncommunicative-Parameter-Name.md +0 -90
  76. data/docs/Uncommunicative-Variable-Name.md +0 -96
  77. data/docs/Unused-Parameters.md +0 -28
  78. data/docs/Unused-Private-Method.md +0 -101
  79. data/docs/Utility-Function.md +0 -56
  80. data/docs/Versioning-Policy.md +0 -7
  81. data/docs/YAML-Reports.md +0 -93
  82. data/docs/defaults.reek.yml +0 -129
  83. data/docs/templates/default/docstring/html/public_api_marker.erb +0 -3
  84. data/docs/templates/default/docstring/setup.rb +0 -37
  85. data/docs/templates/default/fulldoc/html/css/common.css +0 -1
  86. data/docs/yard_plugin.rb +0 -17
  87. data/features/command_line_interface/basic_usage.feature +0 -15
  88. data/features/command_line_interface/options.feature +0 -123
  89. data/features/command_line_interface/show_progress.feature +0 -33
  90. data/features/command_line_interface/smell_selection.feature +0 -15
  91. data/features/command_line_interface/smells_count.feature +0 -38
  92. data/features/command_line_interface/stdin.feature +0 -65
  93. data/features/configuration_files/accept_setting.feature +0 -87
  94. data/features/configuration_files/directory_specific_directives.feature +0 -274
  95. data/features/configuration_files/exclude_directives.feature +0 -35
  96. data/features/configuration_files/exclude_paths_directives.feature +0 -42
  97. data/features/configuration_files/masking_smells.feature +0 -94
  98. data/features/configuration_files/mix_accept_reject_setting.feature +0 -84
  99. data/features/configuration_files/reject_setting.feature +0 -89
  100. data/features/configuration_files/schema_validation.feature +0 -59
  101. data/features/configuration_files/show_configuration_file.feature +0 -44
  102. data/features/configuration_files/unused_private_method.feature +0 -68
  103. data/features/configuration_loading.feature +0 -91
  104. data/features/configuration_via_source_comments/erroneous_source_comments.feature +0 -68
  105. data/features/configuration_via_source_comments/well_formed_source_comments.feature +0 -116
  106. data/features/locales.feature +0 -32
  107. data/features/programmatic_access.feature +0 -41
  108. data/features/rake_task/rake_task.feature +0 -138
  109. data/features/reports/codeclimate.feature +0 -59
  110. data/features/reports/json.feature +0 -59
  111. data/features/reports/reports.feature +0 -219
  112. data/features/reports/yaml.feature +0 -52
  113. data/features/rspec_matcher.feature +0 -41
  114. data/features/samples.feature +0 -305
  115. data/features/step_definitions/.rubocop.yml +0 -5
  116. data/features/step_definitions/reek_steps.rb +0 -102
  117. data/features/step_definitions/sample_file_steps.rb +0 -63
  118. data/features/support/env.rb +0 -33
  119. data/features/todo_list.feature +0 -108
  120. data/samples/checkstyle.xml +0 -7
  121. data/samples/clean_source/clean.rb +0 -6
  122. data/samples/configuration/accepts_rejects_and_excludes_for_detectors.reek.yml +0 -29
  123. data/samples/configuration/accepts_rejects_and_excludes_for_directory_directives.reek.yml +0 -30
  124. data/samples/configuration/corrupt.reek +0 -1
  125. data/samples/configuration/empty.reek +0 -0
  126. data/samples/configuration/full_configuration.reek +0 -13
  127. data/samples/configuration/full_mask.reek +0 -6
  128. data/samples/configuration/home/home.reek.yml +0 -4
  129. data/samples/configuration/partial_mask.reek +0 -4
  130. data/samples/configuration/regular_configuration/.reek.yml +0 -4
  131. data/samples/configuration/regular_configuration/empty_sub_directory/.gitignore +0 -0
  132. data/samples/configuration/with_excluded_paths.reek +0 -5
  133. data/samples/no_config_file/.keep +0 -0
  134. data/samples/paths.rb +0 -5
  135. data/samples/smelly_source/inline.rb +0 -704
  136. data/samples/smelly_source/optparse.rb +0 -1788
  137. data/samples/smelly_source/redcloth.rb +0 -1130
  138. data/samples/smelly_source/ruby.rb +0 -368
  139. data/samples/smelly_source/smelly.rb +0 -7
  140. data/samples/source_with_exclude_paths/ignore_me/uncommunicative_method_name.rb +0 -5
  141. data/samples/source_with_exclude_paths/nested/ignore_me_as_well/irresponsible_module.rb +0 -2
  142. data/samples/source_with_exclude_paths/nested/uncommunicative_parameter_name.rb +0 -6
  143. data/samples/source_with_exclude_paths/nested/uncommunicative_variable_name.rb +0 -6
  144. data/samples/source_with_hidden_directories/.hidden/hidden.rb +0 -1
  145. data/samples/source_with_hidden_directories/not_hidden.rb +0 -1
  146. data/samples/source_with_non_ruby_files/gibberish +0 -1
  147. data/samples/source_with_non_ruby_files/python_source.py +0 -1
  148. data/samples/source_with_non_ruby_files/ruby.rb +0 -6
  149. data/spec/performance/reek/smell_detectors/runtime_speed_spec.rb +0 -15
  150. data/spec/quality/documentation_spec.rb +0 -41
  151. data/spec/quality/reek_source_spec.rb +0 -11
  152. data/spec/reek/ast/node_spec.rb +0 -211
  153. data/spec/reek/ast/object_refs_spec.rb +0 -83
  154. data/spec/reek/ast/reference_collector_spec.rb +0 -47
  155. data/spec/reek/ast/sexp_extensions_spec.rb +0 -498
  156. data/spec/reek/cli/application_spec.rb +0 -168
  157. data/spec/reek/cli/command/report_command_spec.rb +0 -44
  158. data/spec/reek/cli/command/todo_list_command_spec.rb +0 -86
  159. data/spec/reek/cli/options_spec.rb +0 -51
  160. data/spec/reek/cli/silencer_spec.rb +0 -28
  161. data/spec/reek/code_comment_spec.rb +0 -184
  162. data/spec/reek/configuration/app_configuration_spec.rb +0 -195
  163. data/spec/reek/configuration/configuration_file_finder_spec.rb +0 -230
  164. data/spec/reek/configuration/default_directive_spec.rb +0 -13
  165. data/spec/reek/configuration/directory_directives_spec.rb +0 -122
  166. data/spec/reek/configuration/excluded_paths_spec.rb +0 -16
  167. data/spec/reek/configuration/rake_task_converter_spec.rb +0 -33
  168. data/spec/reek/configuration/schema_validator_spec.rb +0 -165
  169. data/spec/reek/context/code_context_spec.rb +0 -192
  170. data/spec/reek/context/ghost_context_spec.rb +0 -60
  171. data/spec/reek/context/method_context_spec.rb +0 -72
  172. data/spec/reek/context/module_context_spec.rb +0 -55
  173. data/spec/reek/context/root_context_spec.rb +0 -12
  174. data/spec/reek/context/statement_counter_spec.rb +0 -24
  175. data/spec/reek/context_builder_spec.rb +0 -457
  176. data/spec/reek/detector_repository_spec.rb +0 -22
  177. data/spec/reek/documentation_link_spec.rb +0 -20
  178. data/spec/reek/errors/base_error_spec.rb +0 -13
  179. data/spec/reek/examiner_spec.rb +0 -309
  180. data/spec/reek/logging_error_handler_spec.rb +0 -24
  181. data/spec/reek/rake/task_spec.rb +0 -56
  182. data/spec/reek/report/code_climate/code_climate_configuration_spec.rb +0 -22
  183. data/spec/reek/report/code_climate/code_climate_fingerprint_spec.rb +0 -126
  184. data/spec/reek/report/code_climate/code_climate_formatter_spec.rb +0 -51
  185. data/spec/reek/report/code_climate/code_climate_report_spec.rb +0 -56
  186. data/spec/reek/report/html_report_spec.rb +0 -19
  187. data/spec/reek/report/json_report_spec.rb +0 -58
  188. data/spec/reek/report/location_formatter_spec.rb +0 -32
  189. data/spec/reek/report/progress_formatter_spec.rb +0 -68
  190. data/spec/reek/report/text_report_spec.rb +0 -89
  191. data/spec/reek/report/xml_report_spec.rb +0 -24
  192. data/spec/reek/report/yaml_report_spec.rb +0 -55
  193. data/spec/reek/report_spec.rb +0 -28
  194. data/spec/reek/smell_configuration_spec.rb +0 -56
  195. data/spec/reek/smell_detectors/attribute_spec.rb +0 -197
  196. data/spec/reek/smell_detectors/base_detector_spec.rb +0 -50
  197. data/spec/reek/smell_detectors/boolean_parameter_spec.rb +0 -93
  198. data/spec/reek/smell_detectors/class_variable_spec.rb +0 -106
  199. data/spec/reek/smell_detectors/control_parameter_spec.rb +0 -300
  200. data/spec/reek/smell_detectors/data_clump_spec.rb +0 -134
  201. data/spec/reek/smell_detectors/duplicate_method_call_spec.rb +0 -211
  202. data/spec/reek/smell_detectors/feature_envy_spec.rb +0 -295
  203. data/spec/reek/smell_detectors/instance_variable_assumption_spec.rb +0 -96
  204. data/spec/reek/smell_detectors/irresponsible_module_spec.rb +0 -226
  205. data/spec/reek/smell_detectors/long_parameter_list_spec.rb +0 -61
  206. data/spec/reek/smell_detectors/long_yield_list_spec.rb +0 -49
  207. data/spec/reek/smell_detectors/manual_dispatch_spec.rb +0 -75
  208. data/spec/reek/smell_detectors/missing_safe_method_spec.rb +0 -68
  209. data/spec/reek/smell_detectors/module_initialize_spec.rb +0 -77
  210. data/spec/reek/smell_detectors/nested_iterators_spec.rb +0 -333
  211. data/spec/reek/smell_detectors/nil_check_spec.rb +0 -100
  212. data/spec/reek/smell_detectors/repeated_conditional_spec.rb +0 -100
  213. data/spec/reek/smell_detectors/subclassed_from_core_class_spec.rb +0 -77
  214. data/spec/reek/smell_detectors/too_many_constants_spec.rb +0 -144
  215. data/spec/reek/smell_detectors/too_many_instance_variables_spec.rb +0 -132
  216. data/spec/reek/smell_detectors/too_many_methods_spec.rb +0 -54
  217. data/spec/reek/smell_detectors/too_many_statements_spec.rb +0 -90
  218. data/spec/reek/smell_detectors/uncommunicative_method_name_spec.rb +0 -78
  219. data/spec/reek/smell_detectors/uncommunicative_module_name_spec.rb +0 -78
  220. data/spec/reek/smell_detectors/uncommunicative_parameter_name_spec.rb +0 -147
  221. data/spec/reek/smell_detectors/uncommunicative_variable_name_spec.rb +0 -201
  222. data/spec/reek/smell_detectors/unused_parameters_spec.rb +0 -114
  223. data/spec/reek/smell_detectors/unused_private_method_spec.rb +0 -205
  224. data/spec/reek/smell_detectors/utility_function_spec.rb +0 -293
  225. data/spec/reek/smell_warning_spec.rb +0 -137
  226. data/spec/reek/source/source_code_spec.rb +0 -79
  227. data/spec/reek/source/source_locator_spec.rb +0 -166
  228. data/spec/reek/spec/should_reek_of_spec.rb +0 -153
  229. data/spec/reek/spec/should_reek_only_of_spec.rb +0 -91
  230. data/spec/reek/spec/should_reek_spec.rb +0 -52
  231. data/spec/reek/spec/smell_matcher_spec.rb +0 -87
  232. data/spec/reek/tree_dresser_spec.rb +0 -46
  233. data/spec/spec_helper.rb +0 -110
  234. data/tasks/configuration.rake +0 -18
  235. data/tasks/console.rake +0 -5
  236. data/tasks/reek.rake +0 -6
  237. data/tasks/rubocop.rake +0 -11
  238. data/tasks/test.rake +0 -32
@@ -1,90 +0,0 @@
1
- # Uncommunicative Parameter Name
2
-
3
- ## Introduction
4
-
5
- An _Uncommunicative Parameter Name_ is a parameter name that doesn't
6
- communicate its intent well enough. This code smell is a case of
7
- [Uncommunicative Name](Uncommunicative-Name.md).
8
-
9
- ## Current Support in Reek
10
-
11
- _Uncommunicative Parameter Name_ checks for:
12
-
13
- * single-character names
14
- * any name ending with a number
15
- * camelCaseParameterNames
16
-
17
- ## Configuration
18
-
19
- Reek's _Uncommunicative Parameter Name_ detector supports the [Basic Smell Options](Basic-Smell-Options.md), plus:
20
-
21
- | Option | Value | Effect |
22
- | ---------|-------------|---------|
23
- | `reject` | array of strings | The set of names that Reek uses to check for bad names. Defaults to single-letter names, names containing an uppercase letter, names with a number at the end and '_'. |
24
- | `accept` | array of strings | The set of names that Reek will accept (and not report) even if they match one of the `reject` expressions. |
25
-
26
-
27
- An example configuration could look like this:
28
-
29
- ```Yaml
30
- ---
31
- UncommunicativeParameterName:
32
- accept:
33
- - x
34
- - arg1
35
- reject:
36
- - foobar
37
- ```
38
-
39
- Reek will convert whatever you give it as a string to the corresponding regex, so "foobar" from above will be converted to /foobar/ internally.
40
-
41
- Applying a configuration to a source file like this:
42
-
43
- ```Ruby
44
- def omg(x); x; end # Should not be reported
45
- def omg(arg1); arg1; end # Should not be reported
46
- def omg(foobar); foobar; end # Should be reported
47
- ```
48
-
49
- Reek would report:
50
-
51
- ```
52
- smelly.rb -- 1 warning:
53
- [3]:UncommunicativeParameterName: omg has the parameter name 'foobar'
54
- ```
55
-
56
- ## Advanced configuration
57
-
58
- Sometimes just strings are not enough for configuration. E.g. consider this code sample:
59
-
60
- ```Ruby
61
- class Klass
62
- def my_method(foo, foobar); end
63
- end
64
- ```
65
-
66
- and now imagine that you want to reject the name "foo" but not "foobar". This wouldn't be possible with just using strings.
67
- 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.
68
- Everything within the forward slashes will be loaded as a regex.
69
-
70
- A possible configuration that allows "foobar" but rejects "foo" could look like this:
71
-
72
- ```Yaml
73
- ---
74
- UncommunicativeParameterName:
75
- reject:
76
- - "/^foo$/"
77
- ```
78
-
79
- ## Reek 4
80
-
81
- In Reek 4 you could also pass regexes to `accept` or `reject`, meaning this was perfectly valid as well:
82
-
83
- ```yaml
84
- UncommunicativeParameterName:
85
- accept:
86
- - !ruby/regexp /foobar/
87
- ```
88
-
89
- Support for this has been scrapped with Reek 5 to make the Reek configuration more yaml standard compliant.
90
- You can still pass in regexes, you just have to wrap them into a string. Please see "Advanced configuration" above.
@@ -1,96 +0,0 @@
1
- # Uncommunicative Variable Name
2
-
3
- ## Introduction
4
-
5
- An _Uncommunicative Variable Name_ is a variable name that doesn't communicate
6
- its intent well enough. This code smell is a case of
7
- [Uncommunicative Name](Uncommunicative-Name.md).
8
-
9
- ## Current Support in Reek
10
-
11
- _Uncommunicative Variable Name_ checks for:
12
-
13
- * single-character names
14
- * any name ending with a number
15
- * camelCaseVariableNames
16
-
17
- ## Configuration
18
-
19
- Reek's _Uncommunicative Variable Name_ detector supports the
20
- [Basic Smell Options](Basic-Smell-Options.md), plus:
21
-
22
- | Option | Value | Effect |
23
- | ---------------|-------------|---------|
24
- | `reject` | array of strings | The set of names that Reek uses to check for bad names. Defaults to single-letter names, names ending with a number or names containing upper case letters. |
25
- | `accept` | array of strings | Names that will be accepted (not reported) even if they match one of the `reject` expressions. Defaults to `_`.|
26
-
27
- An example configuration could look like this:
28
-
29
- ```Yaml
30
- ---
31
- UncommunicativeVariableName:
32
- accept:
33
- - x
34
- - var1
35
- reject:
36
- - helper
37
- - foobar
38
- ```
39
-
40
- Reek will convert whatever you give it as a string to the corresponding regex, so "foobar" from above will be converted to /foobar/ internally.
41
-
42
- Applying a configuration to a source file like this:
43
-
44
- ```Ruby
45
- def omg
46
- x = 5 # Should not be reported
47
- var1 = true # Should not be reported
48
- helper = 42 # Should be reported
49
- foobar = false # Should be reported
50
- end
51
- ```
52
-
53
- Reek would report:
54
-
55
- ```
56
- smelly.rb -- 2 warnings:
57
- [5]:UncommunicativeVariableName: omg has the variable name 'foobar' [https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Variable-Name.md]
58
- [4]:UncommunicativeVariableName: omg has the variable name 'helper' [https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Variable-Name.md]
59
- ```
60
-
61
- ## Advanced configuration
62
-
63
- Sometimes just strings are not enough for configuration. E.g. consider this code sample:
64
-
65
- ```Ruby
66
- def omg
67
- foo = 42
68
- foobar = 4242
69
- end
70
- ```
71
-
72
- and now imagine that you want to reject the name "foo" but not "foobar". This wouldn't be possible with just using strings.
73
- 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.
74
- Everything within the forward slashes will be loaded as a regex.
75
-
76
- A possible configuration that allows "foobar" but rejects "foo" could look like this:
77
-
78
- ```Yaml
79
- ---
80
- UncommunicativeVariableName:
81
- reject:
82
- - "/^foo$/"
83
- ```
84
-
85
- ## Reek 4
86
-
87
- In Reek 4 you could also pass regexes to `accept` or `reject`, meaning this was perfectly valid as well:
88
-
89
- ```yaml
90
- UncommunicativeVariableName:
91
- accept:
92
- - !ruby/regexp /write/
93
- ```
94
-
95
- Support for this has been scrapped with Reek 5 to make the Reek configuration more yaml standard compliant.
96
- You can still pass in regexes, you just have to wrap them into a string. Please see "Advanced configuration" above.
@@ -1,28 +0,0 @@
1
- ## Introduction
2
-
3
- _Unused Parameter_ refers to methods with parameters that are unused in scope of the method.
4
-
5
- Having unused parameters in a method is code smell because leaving dead code in
6
- a method can never improve the method and it makes the code confusing to read.
7
-
8
- ## Example
9
-
10
- Given:
11
-
12
- ```Ruby
13
- class Klass
14
- def unused_parameters(x,y,z)
15
- puts x,y # but not z
16
- end
17
- end
18
- ```
19
-
20
- Reek would emit the following warning:
21
-
22
- ```
23
- [2]:UnusedParameters: Klass#unused_parameters has unused parameter 'z'
24
- ```
25
-
26
- ## Configuration
27
-
28
- _Unused Parameter_ offers the [Basic Smell Options](Basic-Smell-Options.md).
@@ -1,101 +0,0 @@
1
- ## Introduction
2
-
3
- Classes should use their private methods. Otherwise this is dead
4
- code which is confusing and bad for maintenance.
5
-
6
- The _Unused Private Method_ detector reports unused private instance
7
- methods and instance methods only - class methods are ignored.
8
-
9
- ## Example
10
-
11
- Given:
12
-
13
- ```Ruby
14
- class Car
15
- private
16
- def drive; end
17
- def start; end
18
- end
19
- ```
20
-
21
- Reek would emit the following warning:
22
-
23
- ```
24
- 2 warnings:
25
- [3]:Car has the unused private instance method `drive` (UnusedPrivateMethod)
26
- [4]:Car has the unused private instance method `start` (UnusedPrivateMethod)
27
- ```
28
-
29
- ## Configuration
30
-
31
- _Unused Private Method_ offers the [Basic Smell Options](Basic-Smell-Options.md).
32
-
33
- Private methods that are called via dynamic dispatch
34
- will trigger a false alarm since detecting something like this is far out of
35
- scope for Reek. In this case you can disable this detector via the `exclude`
36
- configuration option (which is part of the [Basic Smell Options](Basic-Smell-Options.md))
37
- for instance like this (an example from Reek's own codebase):
38
-
39
- ```Ruby
40
- # :reek:UnusedPrivateMethod { exclude: [ process_ ] }
41
- class ContextBuilder
42
- def process_begin
43
- # ....
44
- end
45
- end
46
- ```
47
-
48
- Note that disabling this detector via comment works on a class scope, not
49
- a method scope (like you can see above).
50
-
51
- Another simple example would be:
52
-
53
- ```Ruby
54
- class Alfa
55
- private
56
- def bravo
57
- end
58
- end
59
- ```
60
-
61
- This would report:
62
-
63
- >>
64
- ruby.rb -- 1 warning:
65
- [3]:UnusedPrivateMethod: Alfa has the unused private instance method 'bravo'
66
-
67
- If you want to suppress this warning you can do this via source comment like this:
68
-
69
- ```Ruby
70
- # :reek:UnusedPrivateMethod: { exclude: bravo }
71
- class Alfa
72
- private
73
- def bravo
74
- end
75
- end
76
- ```
77
-
78
- ## Known limitations
79
-
80
- * Method calls via dynamic dispatch (e.g. via `send`) is something Reek (or any other
81
- static tool for that matter) cannot detect.
82
- * Method calls via callback like [Rails filters](http://guides.rubyonrails.org/action_controller_overview.html#filters)
83
- will trigger this as well, e.g.:
84
-
85
- ```Ruby
86
- class BankController < ActionController::Base
87
- before_action :audit
88
-
89
- private
90
- def audit
91
- # ....
92
- end
93
- end
94
- ```
95
- * Reek works on a per-file base. This means that using something like the [template pattern](https://en.wikipedia.org/wiki/Template_method_pattern)
96
- with private methods will trigger this detector.
97
- We do believe though that using private methods to fill out a template in a
98
- superclass is not a good idea in general so this probably isn't really a problem
99
- but still worth mentioning it.
100
-
101
-
@@ -1,56 +0,0 @@
1
- # Utility Function
2
-
3
- ## Introduction
4
-
5
- A _Utility Function_ is any instance method that has no dependency on the state of the instance.
6
-
7
- _Utility Function_ is heavily related to _[Feature Envy](Feature-Envy.md)_, please check out the explanation there why _Utility Function_ is something you should care about.
8
-
9
- ## Example
10
-
11
- Given
12
-
13
- ```Ruby
14
- class UtilityFunction
15
- def showcase(argument)
16
- argument.to_s + argument.to_i
17
- end
18
- end
19
- ```
20
-
21
- Reek would report:
22
-
23
- ```
24
- test.rb -- 2 warnings:
25
- [2]:UtilityFunction#showcase doesn't depend on instance state (UtilityFunction)
26
- ```
27
-
28
- ## Current Support in Reek
29
-
30
- _Utility Function_ will warn about any method that:
31
-
32
- * is non-empty
33
- * does not override an inherited method
34
- * calls at least one method on another object
35
- * doesn't use any of self's instance variables
36
- * doesn't use any of self's methods
37
-
38
- ## Differences to _Feature Envy_
39
-
40
- _[Feature Envy](Feature-Envy.md)_ is only triggered if there are some references to self and _Utility Function_ is triggered if there are no references to self.
41
-
42
- ## Configuration
43
-
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
- ```
@@ -1,7 +0,0 @@
1
- # Versioning Policy
2
-
3
- * CLI interface: Adding options is a non-breaking change, and would warrant an update of the minor version. Removing options is a breaking change and requires a major version update (we did this going to Reek 2). Adding a report format probably also warrents a minor version upgrade.
4
- * API: We haven't really defined a 'public' API for using Reek programmatically, and we've only just started testing it. So, this is basically a blank slate at the moment. We will work on this as a part of the Reek 3 release.
5
- * List of detected smells: Adding a smell warrants a minor release, removing a smell is a breaking change. This makes sense if you consider that the CLI allows running a single smell detector.
6
- * Consistency of detected smells: This is very hard to guarantee. If we fix a bug in one of the detectors, some fragrant code may become smelly, or vice versa. Right now we don't bother with this.
7
- * Smell configuration: The detectors are quite tolerant regarding configuration options that they don't recognize, so we regard any change here as only requiring a minor release.
data/docs/YAML-Reports.md DELETED
@@ -1,93 +0,0 @@
1
- # YAML Reports
2
-
3
- ## Introduction
4
-
5
- Reek's `--yaml` option writes on $stdout a YAML dump of the smells found. Each reported smell has a number of standard fields and a number of fields that are specific to the smell's type. The common fields are as follows:
6
-
7
- | Field | Type | Value |
8
- | ---------------|-------------|---------|
9
- | source | string | The name of the source file containing the smell, or `$stdin` |
10
- | lines | array | The source file line number(s) that contribute to this smell |
11
- | context | string | The name of the class, module or method containing the smell |
12
- | class | string | The class to which this smell belongs |
13
- | subclass | string | This smell's subclass within the above class |
14
- | message | string | The message that would have been printed in a standard Reek report |
15
- | is_active | boolean | `false` if the smell is masked by a config file; `true` otherwise |
16
-
17
- All of these fields are grouped into hashes `location`, `smell` and `status` (see the examples below).
18
-
19
- ## Examples
20
-
21
- Duplication:
22
-
23
- <pre>
24
- - !ruby/object:Reek::SmellWarning
25
- location:
26
- source: spec/samples/masked/dirty.rb
27
- lines:
28
- - 5
29
- - 7
30
- context: Dirty#a
31
- smell:
32
- class: Duplication
33
- subclass: DuplicateMethodCall
34
- occurrences: 2
35
- call: puts(@s.title)
36
- message: calls puts(@s.title) twice
37
- status:
38
- is_active: true
39
- </pre>
40
-
41
- [Nested Iterators](Nested-Iterators.md):
42
-
43
- <pre>
44
- - !ruby/object:Reek::SmellWarning
45
- location:
46
- source: spec/samples/masked/dirty.rb
47
- lines:
48
- - 5
49
- context: Dirty#a
50
- smell:
51
- class: NestedIterators
52
- subclass: ""
53
- depth: 2
54
- message: contains iterators nested 2 deep
55
- status:
56
- is_active: true
57
- </pre>
58
-
59
- [Uncommunicative Method Name](Uncommunicative-Method-Name.md):
60
-
61
- <pre>
62
- - !ruby/object:Reek::SmellWarning
63
- location:
64
- source: spec/samples/masked/dirty.rb
65
- lines:
66
- - 3
67
- context: Dirty#a
68
- smell:
69
- class: UncommunicativeName
70
- subclass: UncommunicativeMethodName
71
- method_name: a
72
- message: has the name 'a'
73
- status:
74
- is_active: false
75
- </pre>
76
-
77
- [Uncommunicative Variable Name](Uncommunicative-Variable-Name.md):
78
-
79
- <pre>
80
- - !ruby/object:Reek::SmellWarning
81
- location:
82
- source: spec/samples/masked/dirty.rb
83
- lines:
84
- - 5
85
- context: Dirty#a
86
- smell:
87
- class: UncommunicativeName
88
- subclass: UncommunicativeVariableName
89
- variable_name: x
90
- message: has the variable name 'x'
91
- status:
92
- is_active: true
93
- </pre>
@@ -1,129 +0,0 @@
1
- ---
2
- detectors:
3
- Attribute:
4
- enabled: true
5
- exclude: []
6
- BooleanParameter:
7
- enabled: true
8
- exclude: []
9
- ClassVariable:
10
- enabled: true
11
- exclude: []
12
- ControlParameter:
13
- enabled: true
14
- exclude: []
15
- DataClump:
16
- enabled: true
17
- exclude: []
18
- max_copies: 2
19
- min_clump_size: 2
20
- DuplicateMethodCall:
21
- enabled: true
22
- exclude: []
23
- max_calls: 1
24
- allow_calls: []
25
- FeatureEnvy:
26
- enabled: true
27
- exclude: []
28
- InstanceVariableAssumption:
29
- enabled: true
30
- exclude: []
31
- IrresponsibleModule:
32
- enabled: true
33
- exclude: []
34
- LongParameterList:
35
- enabled: true
36
- exclude: []
37
- max_params: 3
38
- overrides:
39
- initialize:
40
- max_params: 5
41
- LongYieldList:
42
- enabled: true
43
- exclude: []
44
- max_params: 3
45
- ManualDispatch:
46
- enabled: true
47
- exclude: []
48
- MissingSafeMethod:
49
- enabled: true
50
- exclude: []
51
- ModuleInitialize:
52
- enabled: true
53
- exclude: []
54
- NestedIterators:
55
- enabled: true
56
- exclude: []
57
- max_allowed_nesting: 1
58
- ignore_iterators:
59
- - tap
60
- NilCheck:
61
- enabled: true
62
- exclude: []
63
- RepeatedConditional:
64
- enabled: true
65
- exclude: []
66
- max_ifs: 2
67
- SubclassedFromCoreClass:
68
- enabled: true
69
- exclude: []
70
- TooManyConstants:
71
- enabled: true
72
- exclude: []
73
- max_constants: 5
74
- TooManyInstanceVariables:
75
- enabled: true
76
- exclude: []
77
- max_instance_variables: 4
78
- TooManyMethods:
79
- enabled: true
80
- exclude: []
81
- max_methods: 15
82
- TooManyStatements:
83
- enabled: true
84
- exclude:
85
- - initialize
86
- max_statements: 5
87
- UncommunicativeMethodName:
88
- enabled: true
89
- exclude: []
90
- reject:
91
- - "/^[a-z]$/"
92
- - "/[0-9]$/"
93
- - "/[A-Z]/"
94
- accept: []
95
- UncommunicativeModuleName:
96
- enabled: true
97
- exclude: []
98
- reject:
99
- - "/^.$/"
100
- - "/[0-9]$/"
101
- accept: []
102
- UncommunicativeParameterName:
103
- enabled: true
104
- exclude: []
105
- reject:
106
- - "/^.$/"
107
- - "/[0-9]$/"
108
- - "/[A-Z]/"
109
- - "/^_/"
110
- accept: []
111
- UncommunicativeVariableName:
112
- enabled: true
113
- exclude: []
114
- reject:
115
- - "/^.$/"
116
- - "/[0-9]$/"
117
- - "/[A-Z]/"
118
- accept:
119
- - "/^_$/"
120
- UnusedParameters:
121
- enabled: true
122
- exclude: []
123
- UnusedPrivateMethod:
124
- enabled: false
125
- exclude: []
126
- UtilityFunction:
127
- enabled: true
128
- exclude: []
129
- public_methods_only: false
@@ -1,3 +0,0 @@
1
- <div class="note public">
2
- <div class="inline"><p>This <%= object.type %> is part of Reek's public API.</p></div>
3
- </div>
@@ -1,37 +0,0 @@
1
- def init
2
- super
3
- return unless show_api_marker_section?
4
-
5
- if sections.first
6
- sections.first.place(:api_marker).before(:private)
7
- else
8
- sections :index, [:api_marker]
9
- end
10
- end
11
-
12
- def api_marker
13
- return if object.type == :root
14
-
15
- erb(:private) unless ['public', 'private'].include? api_text
16
- end
17
-
18
- private
19
-
20
- def api_text
21
- api_text = object.has_tag?(:api) && object.tag(:api).text
22
- api_text = 'public' if object.has_tag?(:public)
23
- api_text
24
- end
25
-
26
- def show_api_marker_section?
27
- return false if object.type == :root
28
-
29
- case api_text
30
- when 'public'
31
- false
32
- when 'private'
33
- false
34
- else
35
- true
36
- end
37
- end
@@ -1 +0,0 @@
1
- .note.public { background: #c5ffc5; border-color: #aaecaa; }
data/docs/yard_plugin.rb DELETED
@@ -1,17 +0,0 @@
1
- require 'yard'
2
-
3
- # Template helper to modify processing of links in HTML generated from our
4
- # markdown files.
5
- module LocalLinkHelper
6
- # Rewrites links to (assumed local) markdown files so they're processed as
7
- # {file: } directives.
8
- def resolve_links(text)
9
- text = text.gsub(%r{<a href="([^"]*.md)">([^<]*)</a>}, '{file:\1 \2}')
10
- super text
11
- end
12
- end
13
-
14
- YARD::Templates::Template.extra_includes << LocalLinkHelper
15
- YARD::Tags::Library.define_tag('Guaranteed public API', :public)
16
- YARD::Tags::Library.define_tag('Code quality configuration', :quality)
17
- YARD::Templates::Engine.register_template_path File.join(File.dirname(__FILE__), 'templates')
@@ -1,15 +0,0 @@
1
- Feature: The Reek CLI maintains backwards compatibility
2
- In order to use Reek without fuss
3
- As a developer
4
- I want to have a stable basic command line interface
5
-
6
- Scenario: the example from README reports as expected
7
- Given the smelly file 'smelly.rb'
8
- When I run reek smelly.rb
9
- Then the exit status indicates smells
10
- And it reports:
11
- """
12
- smelly.rb -- 2 warnings:
13
- [4]:UncommunicativeMethodName: Smelly#x has the name 'x'
14
- [5]:UncommunicativeVariableName: Smelly#x has the variable name 'y'
15
- """