reek 5.6.0 → 6.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (250) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +9 -0
  3. data/.github/workflows/ruby.yml +52 -0
  4. data/.gitignore +1 -0
  5. data/.rubocop.yml +3 -1
  6. data/.rubocop_todo.yml +27 -20
  7. data/.simplecov +1 -0
  8. data/CHANGELOG.md +29 -0
  9. data/CONTRIBUTING.md +3 -0
  10. data/Dockerfile +2 -1
  11. data/Gemfile +14 -17
  12. data/README.md +11 -11
  13. data/bin/code_climate_reek +12 -2
  14. data/lib/reek.rb +1 -0
  15. data/lib/reek/ast/ast_node_class_map.rb +1 -1
  16. data/lib/reek/ast/node.rb +1 -1
  17. data/lib/reek/ast/sexp_extensions/arguments.rb +11 -0
  18. data/lib/reek/cli/options.rb +3 -3
  19. data/lib/reek/code_comment.rb +36 -29
  20. data/lib/reek/configuration/app_configuration.rb +4 -3
  21. data/lib/reek/configuration/configuration_converter.rb +2 -2
  22. data/lib/reek/configuration/directory_directives.rb +9 -3
  23. data/lib/reek/configuration/excluded_paths.rb +2 -1
  24. data/lib/reek/context/code_context.rb +1 -1
  25. data/lib/reek/context/module_context.rb +3 -1
  26. data/lib/reek/context/refinement_context.rb +16 -0
  27. data/lib/reek/context_builder.rb +16 -2
  28. data/lib/reek/errors/legacy_comment_separator_error.rb +36 -0
  29. data/lib/reek/report.rb +5 -7
  30. data/lib/reek/report/code_climate/code_climate_configuration.yml +1 -1
  31. data/lib/reek/report/code_climate/code_climate_formatter.rb +1 -3
  32. data/lib/reek/report/code_climate/code_climate_report.rb +2 -1
  33. data/lib/reek/report/simple_warning_formatter.rb +0 -7
  34. data/lib/reek/smell_detectors/base_detector.rb +2 -10
  35. data/lib/reek/smell_detectors/boolean_parameter.rb +3 -1
  36. data/lib/reek/smell_detectors/data_clump.rb +23 -56
  37. data/lib/reek/smell_detectors/nil_check.rb +1 -12
  38. data/lib/reek/smell_detectors/uncommunicative_variable_name.rb +1 -1
  39. data/lib/reek/smell_warning.rb +2 -3
  40. data/lib/reek/source/source_locator.rb +14 -13
  41. data/lib/reek/spec/smell_matcher.rb +2 -1
  42. data/lib/reek/version.rb +1 -1
  43. data/reek.gemspec +17 -7
  44. metadata +23 -246
  45. data/.travis.yml +0 -35
  46. data/docs/API.md +0 -174
  47. data/docs/Attribute.md +0 -39
  48. data/docs/Basic-Smell-Options.md +0 -85
  49. data/docs/Boolean-Parameter.md +0 -54
  50. data/docs/Class-Variable.md +0 -40
  51. data/docs/Code-Smells.md +0 -39
  52. data/docs/Command-Line-Options.md +0 -119
  53. data/docs/Control-Couple.md +0 -26
  54. data/docs/Control-Parameter.md +0 -32
  55. data/docs/Data-Clump.md +0 -46
  56. data/docs/Duplicate-Method-Call.md +0 -264
  57. data/docs/Feature-Envy.md +0 -93
  58. data/docs/How-To-Write-New-Detectors.md +0 -132
  59. data/docs/How-reek-works-internally.md +0 -114
  60. data/docs/Instance-Variable-Assumption.md +0 -163
  61. data/docs/Irresponsible-Module.md +0 -47
  62. data/docs/Large-Class.md +0 -16
  63. data/docs/Long-Parameter-List.md +0 -39
  64. data/docs/Long-Yield-List.md +0 -37
  65. data/docs/Manual-Dispatch.md +0 -30
  66. data/docs/Missing-Safe-Method.md +0 -92
  67. data/docs/Module-Initialize.md +0 -62
  68. data/docs/Nested-Iterators.md +0 -59
  69. data/docs/Nil-Check.md +0 -44
  70. data/docs/RSpec-matchers.md +0 -129
  71. data/docs/Rake-Task.md +0 -66
  72. data/docs/Reek-4-to-Reek-5-migration.md +0 -188
  73. data/docs/Reek-Driven-Development.md +0 -46
  74. data/docs/Repeated-Conditional.md +0 -47
  75. data/docs/Simulated-Polymorphism.md +0 -16
  76. data/docs/Smell-Suppression.md +0 -96
  77. data/docs/Style-Guide.md +0 -19
  78. data/docs/Subclassed-From-Core-Class.md +0 -79
  79. data/docs/Too-Many-Constants.md +0 -37
  80. data/docs/Too-Many-Instance-Variables.md +0 -43
  81. data/docs/Too-Many-Methods.md +0 -56
  82. data/docs/Too-Many-Statements.md +0 -54
  83. data/docs/Uncommunicative-Method-Name.md +0 -94
  84. data/docs/Uncommunicative-Module-Name.md +0 -92
  85. data/docs/Uncommunicative-Name.md +0 -18
  86. data/docs/Uncommunicative-Parameter-Name.md +0 -90
  87. data/docs/Uncommunicative-Variable-Name.md +0 -96
  88. data/docs/Unused-Parameters.md +0 -28
  89. data/docs/Unused-Private-Method.md +0 -101
  90. data/docs/Utility-Function.md +0 -56
  91. data/docs/Versioning-Policy.md +0 -7
  92. data/docs/YAML-Reports.md +0 -93
  93. data/docs/defaults.reek.yml +0 -129
  94. data/docs/templates/default/docstring/html/public_api_marker.erb +0 -3
  95. data/docs/templates/default/docstring/setup.rb +0 -37
  96. data/docs/templates/default/fulldoc/html/css/common.css +0 -1
  97. data/docs/yard_plugin.rb +0 -17
  98. data/features/command_line_interface/basic_usage.feature +0 -15
  99. data/features/command_line_interface/options.feature +0 -124
  100. data/features/command_line_interface/show_progress.feature +0 -33
  101. data/features/command_line_interface/smell_selection.feature +0 -15
  102. data/features/command_line_interface/smells_count.feature +0 -38
  103. data/features/command_line_interface/stdin.feature +0 -65
  104. data/features/configuration_files/accept_setting.feature +0 -87
  105. data/features/configuration_files/directory_specific_directives.feature +0 -274
  106. data/features/configuration_files/exclude_directives.feature +0 -35
  107. data/features/configuration_files/exclude_paths_directives.feature +0 -42
  108. data/features/configuration_files/masking_smells.feature +0 -94
  109. data/features/configuration_files/mix_accept_reject_setting.feature +0 -84
  110. data/features/configuration_files/reject_setting.feature +0 -89
  111. data/features/configuration_files/schema_validation.feature +0 -59
  112. data/features/configuration_files/show_configuration_file.feature +0 -44
  113. data/features/configuration_files/unused_private_method.feature +0 -68
  114. data/features/configuration_loading.feature +0 -91
  115. data/features/configuration_via_source_comments/erroneous_source_comments.feature +0 -68
  116. data/features/configuration_via_source_comments/well_formed_source_comments.feature +0 -116
  117. data/features/locales.feature +0 -32
  118. data/features/programmatic_access.feature +0 -41
  119. data/features/rake_task/rake_task.feature +0 -138
  120. data/features/reports/codeclimate.feature +0 -59
  121. data/features/reports/json.feature +0 -59
  122. data/features/reports/reports.feature +0 -219
  123. data/features/reports/yaml.feature +0 -52
  124. data/features/rspec_matcher.feature +0 -41
  125. data/features/samples.feature +0 -305
  126. data/features/step_definitions/.rubocop.yml +0 -5
  127. data/features/step_definitions/reek_steps.rb +0 -98
  128. data/features/step_definitions/sample_file_steps.rb +0 -63
  129. data/features/support/env.rb +0 -34
  130. data/features/todo_list.feature +0 -108
  131. data/samples/checkstyle.xml +0 -7
  132. data/samples/clean_source/clean.rb +0 -6
  133. data/samples/configuration/accepts_rejects_and_excludes_for_detectors.reek.yml +0 -29
  134. data/samples/configuration/accepts_rejects_and_excludes_for_directory_directives.reek.yml +0 -30
  135. data/samples/configuration/corrupt.reek +0 -1
  136. data/samples/configuration/empty.reek +0 -0
  137. data/samples/configuration/full_configuration.reek +0 -13
  138. data/samples/configuration/full_mask.reek +0 -6
  139. data/samples/configuration/home/home.reek.yml +0 -4
  140. data/samples/configuration/partial_mask.reek +0 -4
  141. data/samples/configuration/regular_configuration/.reek.yml +0 -4
  142. data/samples/configuration/regular_configuration/empty_sub_directory/.gitignore +0 -0
  143. data/samples/configuration/with_excluded_paths.reek +0 -5
  144. data/samples/no_config_file/.keep +0 -0
  145. data/samples/paths.rb +0 -5
  146. data/samples/smelly_source/inline.rb +0 -704
  147. data/samples/smelly_source/optparse.rb +0 -1788
  148. data/samples/smelly_source/redcloth.rb +0 -1130
  149. data/samples/smelly_source/ruby.rb +0 -368
  150. data/samples/smelly_source/smelly.rb +0 -7
  151. data/samples/source_with_exclude_paths/ignore_me/uncommunicative_method_name.rb +0 -5
  152. data/samples/source_with_exclude_paths/nested/ignore_me_as_well/irresponsible_module.rb +0 -2
  153. data/samples/source_with_exclude_paths/nested/uncommunicative_parameter_name.rb +0 -6
  154. data/samples/source_with_exclude_paths/nested/uncommunicative_variable_name.rb +0 -6
  155. data/samples/source_with_hidden_directories/.hidden/hidden.rb +0 -1
  156. data/samples/source_with_hidden_directories/not_hidden.rb +0 -1
  157. data/samples/source_with_non_ruby_files/gibberish +0 -1
  158. data/samples/source_with_non_ruby_files/python_source.py +0 -1
  159. data/samples/source_with_non_ruby_files/ruby.rb +0 -6
  160. data/spec/factories/factories.rb +0 -37
  161. data/spec/performance/reek/smell_detectors/runtime_speed_spec.rb +0 -17
  162. data/spec/quality/documentation_spec.rb +0 -40
  163. data/spec/quality/reek_source_spec.rb +0 -11
  164. data/spec/reek/ast/node_spec.rb +0 -211
  165. data/spec/reek/ast/object_refs_spec.rb +0 -83
  166. data/spec/reek/ast/reference_collector_spec.rb +0 -47
  167. data/spec/reek/ast/sexp_extensions_spec.rb +0 -516
  168. data/spec/reek/cli/application_spec.rb +0 -168
  169. data/spec/reek/cli/command/report_command_spec.rb +0 -44
  170. data/spec/reek/cli/command/todo_list_command_spec.rb +0 -86
  171. data/spec/reek/cli/options_spec.rb +0 -51
  172. data/spec/reek/cli/silencer_spec.rb +0 -28
  173. data/spec/reek/code_comment_spec.rb +0 -185
  174. data/spec/reek/configuration/app_configuration_spec.rb +0 -195
  175. data/spec/reek/configuration/configuration_file_finder_spec.rb +0 -230
  176. data/spec/reek/configuration/default_directive_spec.rb +0 -13
  177. data/spec/reek/configuration/directory_directives_spec.rb +0 -116
  178. data/spec/reek/configuration/excluded_paths_spec.rb +0 -16
  179. data/spec/reek/configuration/rake_task_converter_spec.rb +0 -33
  180. data/spec/reek/configuration/schema_validator_spec.rb +0 -165
  181. data/spec/reek/context/code_context_spec.rb +0 -192
  182. data/spec/reek/context/ghost_context_spec.rb +0 -60
  183. data/spec/reek/context/method_context_spec.rb +0 -72
  184. data/spec/reek/context/module_context_spec.rb +0 -55
  185. data/spec/reek/context/root_context_spec.rb +0 -12
  186. data/spec/reek/context/statement_counter_spec.rb +0 -24
  187. data/spec/reek/context_builder_spec.rb +0 -460
  188. data/spec/reek/detector_repository_spec.rb +0 -22
  189. data/spec/reek/documentation_link_spec.rb +0 -20
  190. data/spec/reek/errors/base_error_spec.rb +0 -13
  191. data/spec/reek/examiner_spec.rb +0 -309
  192. data/spec/reek/logging_error_handler_spec.rb +0 -24
  193. data/spec/reek/rake/task_spec.rb +0 -56
  194. data/spec/reek/report/code_climate/code_climate_configuration_spec.rb +0 -24
  195. data/spec/reek/report/code_climate/code_climate_fingerprint_spec.rb +0 -126
  196. data/spec/reek/report/code_climate/code_climate_formatter_spec.rb +0 -51
  197. data/spec/reek/report/code_climate/code_climate_report_spec.rb +0 -56
  198. data/spec/reek/report/html_report_spec.rb +0 -19
  199. data/spec/reek/report/json_report_spec.rb +0 -58
  200. data/spec/reek/report/location_formatter_spec.rb +0 -32
  201. data/spec/reek/report/progress_formatter_spec.rb +0 -68
  202. data/spec/reek/report/text_report_spec.rb +0 -89
  203. data/spec/reek/report/xml_report_spec.rb +0 -24
  204. data/spec/reek/report/yaml_report_spec.rb +0 -55
  205. data/spec/reek/report_spec.rb +0 -28
  206. data/spec/reek/smell_configuration_spec.rb +0 -56
  207. data/spec/reek/smell_detectors/attribute_spec.rb +0 -197
  208. data/spec/reek/smell_detectors/base_detector_spec.rb +0 -60
  209. data/spec/reek/smell_detectors/boolean_parameter_spec.rb +0 -93
  210. data/spec/reek/smell_detectors/class_variable_spec.rb +0 -106
  211. data/spec/reek/smell_detectors/control_parameter_spec.rb +0 -300
  212. data/spec/reek/smell_detectors/data_clump_spec.rb +0 -120
  213. data/spec/reek/smell_detectors/duplicate_method_call_spec.rb +0 -211
  214. data/spec/reek/smell_detectors/feature_envy_spec.rb +0 -295
  215. data/spec/reek/smell_detectors/instance_variable_assumption_spec.rb +0 -96
  216. data/spec/reek/smell_detectors/irresponsible_module_spec.rb +0 -226
  217. data/spec/reek/smell_detectors/long_parameter_list_spec.rb +0 -61
  218. data/spec/reek/smell_detectors/long_yield_list_spec.rb +0 -49
  219. data/spec/reek/smell_detectors/manual_dispatch_spec.rb +0 -75
  220. data/spec/reek/smell_detectors/missing_safe_method_spec.rb +0 -62
  221. data/spec/reek/smell_detectors/module_initialize_spec.rb +0 -77
  222. data/spec/reek/smell_detectors/nested_iterators_spec.rb +0 -333
  223. data/spec/reek/smell_detectors/nil_check_spec.rb +0 -100
  224. data/spec/reek/smell_detectors/repeated_conditional_spec.rb +0 -100
  225. data/spec/reek/smell_detectors/subclassed_from_core_class_spec.rb +0 -77
  226. data/spec/reek/smell_detectors/too_many_constants_spec.rb +0 -144
  227. data/spec/reek/smell_detectors/too_many_instance_variables_spec.rb +0 -132
  228. data/spec/reek/smell_detectors/too_many_methods_spec.rb +0 -54
  229. data/spec/reek/smell_detectors/too_many_statements_spec.rb +0 -90
  230. data/spec/reek/smell_detectors/uncommunicative_method_name_spec.rb +0 -78
  231. data/spec/reek/smell_detectors/uncommunicative_module_name_spec.rb +0 -78
  232. data/spec/reek/smell_detectors/uncommunicative_parameter_name_spec.rb +0 -147
  233. data/spec/reek/smell_detectors/uncommunicative_variable_name_spec.rb +0 -201
  234. data/spec/reek/smell_detectors/unused_parameters_spec.rb +0 -114
  235. data/spec/reek/smell_detectors/unused_private_method_spec.rb +0 -205
  236. data/spec/reek/smell_detectors/utility_function_spec.rb +0 -293
  237. data/spec/reek/smell_warning_spec.rb +0 -137
  238. data/spec/reek/source/source_code_spec.rb +0 -66
  239. data/spec/reek/source/source_locator_spec.rb +0 -166
  240. data/spec/reek/spec/should_reek_of_spec.rb +0 -154
  241. data/spec/reek/spec/should_reek_only_of_spec.rb +0 -91
  242. data/spec/reek/spec/should_reek_spec.rb +0 -52
  243. data/spec/reek/spec/smell_matcher_spec.rb +0 -87
  244. data/spec/reek/tree_dresser_spec.rb +0 -46
  245. data/spec/spec_helper.rb +0 -96
  246. data/tasks/configuration.rake +0 -19
  247. data/tasks/console.rake +0 -5
  248. data/tasks/reek.rake +0 -6
  249. data/tasks/rubocop.rake +0 -11
  250. data/tasks/test.rake +0 -32
data/docs/Rake-Task.md DELETED
@@ -1,66 +0,0 @@
1
- # Rake Task
2
-
3
- ## Introduction
4
-
5
- Reek provides a Rake task that runs Reek on a set of source files. In its most simple form you just include something like that in your Rakefile:
6
-
7
- ```Ruby
8
- require 'reek/rake/task'
9
-
10
- Reek::Rake::Task.new do |t|
11
- t.fail_on_error = false
12
- end
13
- ```
14
-
15
- In its most simple form, that's it.
16
-
17
- When you now run:
18
-
19
- ```Bash
20
- rake -T
21
- ```
22
-
23
- you should see
24
-
25
- ```Bash
26
- rake reek # Check for code smells
27
- ```
28
-
29
- ## Configuration via task
30
-
31
- An more sophisticated rake task that would make use of all available configuration options could look like this:
32
-
33
- ```Ruby
34
- Reek::Rake::Task.new do |t|
35
- t.name = 'custom_rake' # Whatever name you want. Defaults to "reek".
36
- t.config_file = 'config/.reek.yml' # Defaults to nothing.
37
- t.source_files = 'vendor/**/*.rb' # Glob pattern to match source files. Defaults to lib/**/*.rb
38
- t.reek_opts = '-U' # Defaults to ''. You can pass all the options here in that are shown by "reek -h"
39
- t.fail_on_error = false # Defaults to true
40
- t.verbose = true # Defaults to false
41
- end
42
- ```
43
-
44
- Alternatively, you can create your own [Rake::FileList](http://rake.rubyforge.org/classes/Rake/FileList.html) and use that for `source_files`:
45
-
46
- ```Ruby
47
- Reek::Rake::Task.new do |t|
48
- t.source_files = FileList['lib/**/*.rb'].exclude('lib/templates/**/*.rb')
49
- end
50
- ```
51
-
52
- ## Configuration via environment variables
53
-
54
- You can overwrite the following attributes by environment variables:
55
-
56
- - "reek_opts" by using REEK_OPTS
57
- - "config_file" by using REEK_CFG
58
- - "source_files" by using REEK_SRC
59
-
60
- An example rake call using environment variables could look like this:
61
-
62
- ```Bash
63
- REEK_CFG="config/custom.reek" REEK_OPTS="-s" rake reek
64
- ```
65
-
66
- See also: [Reek-Driven-Development](Reek-Driven-Development.md)
@@ -1,188 +0,0 @@
1
- ## Reek 4 to Reek 5 migration
2
-
3
- ### Schema validation
4
-
5
- Reek now uses a schema to validate your configuration against on start up and will faily loudly in
6
- case you misspelled an option or used the wrong data type for a value like this:
7
-
8
- ```
9
- Error: We found some problems with your configuration file: [/detectors/DetectorWithTypo] key 'DetectorWithTypo:' is undefined.
10
- ```
11
-
12
- Obviously this might affect existing configuration files that until now contained an error nobody noticed.
13
-
14
- ### Scoping detectors under `detectors`
15
-
16
- In Reek 4 you could just configure your detectors on top level like this:
17
-
18
- ```yaml
19
- UncommunicativeMethodName:
20
- accept:
21
- - foobar
22
- UnusedPrivateMethod:
23
- exclude:
24
- - app/controllers
25
- ```
26
-
27
- In Reek 5 you have to scope your detector configurations under the `detectors` key:
28
-
29
- ```yaml
30
- detectors:
31
- UncommunicativeMethodName:
32
- accept:
33
- - foobar
34
- UnusedPrivateMethod:
35
- exclude:
36
- - app/controllers
37
- ```
38
-
39
- ### Move directory directives under a special key
40
-
41
- In Reek 4 you could apply directory specific directives like this:
42
-
43
- ```Yaml
44
- ---
45
- "web_app/app/controllers":
46
- NestedIterators:
47
- enabled: false
48
- "web_app/app/helpers":
49
- UtilityFunction:
50
- enabled: false
51
- ```
52
-
53
- which was nice and easy but also quite messy. With Reek 5 you'll have to scope this under a `directories`
54
- key like this:
55
-
56
- ```Yaml
57
- ---
58
- directories:
59
- "web_app/app/controllers":
60
- NestedIterators:
61
- enabled: false
62
- "web_app/app/helpers":
63
- UtilityFunction:
64
- enabled: false
65
- ```
66
-
67
- ### No more regular expressions in Reeks configuration
68
-
69
- In Reek 4 you could pass regular expressions to the `accept` or `reject` settings of
70
-
71
- * [Uncommunicative Method Name](Uncommunicative-Method-Name.md)
72
- * [Uncommunicative Module Name](Uncommunicative-Module-Name.md)
73
- * [Uncommunicative Parameter Name](Uncommunicative-Parameter-Name.md)
74
- * [Uncommunicative Variable Name](Uncommunicative-Variable-Name.md)
75
-
76
- and to the `exclude` settings which are part of our [Basic Smell Options](docs/Basic-Smell-Options.md).
77
-
78
- This means that this configuration was perfectly valid:
79
-
80
- ```yaml
81
- detectors:
82
- UncommunicativeMethodName:
83
- accept:
84
- - !ruby/regexp /foobar/
85
- UnusedPrivateMethod:
86
- exclude:
87
- - !ruby/regexp /i am(.*)unused/
88
- ```
89
-
90
- Support for this has been scrapped with Reek 5 to make the Reek configuration more yaml standard compliant.
91
- You can still pass in regexes, you just have to wrap them into a string using a forward slash at the
92
- beginning and at the end of the string like this:
93
-
94
- ```Yaml
95
- ---
96
- UncommunicativeMethodName:
97
- accept:
98
- - "/^foobar$/"
99
- UnusedPrivateMethod:
100
- exclude:
101
- - "/i am(.*)unused/"
102
- ```
103
-
104
- Everything within the forward slashes will be loaded as a regex.
105
-
106
- ### No more single item shortcuts for list items
107
-
108
- You cant use a configuration option that is supposed to be a list with a single element like this anymore:
109
-
110
- ```Yaml
111
- ---
112
- UncommunicativeMethodName:
113
- accept: foobar
114
- UnusedPrivateMethod:
115
- exclude: omg
116
- ```
117
-
118
- You'll have to use a proper list here like this:
119
-
120
- ```Yaml
121
- ---
122
- UncommunicativeMethodName:
123
- accept:
124
- - foobar
125
- UnusedPrivateMethod:
126
- exclude:
127
- - omg
128
- ```
129
-
130
- ## Failing on syntax errors in source files
131
-
132
- Previously Reek would just continue on syntax errors in source files which might have been convenient but
133
- not necessarily fitting for a tool that's all about code quality. With Reek 5, Reek will fail hard on
134
- invalid source files.
135
-
136
- ### API changes
137
-
138
- This is something that will only affect very advanced users. In case you have no idea what this might be about
139
- you can just skip it or check out our [Developer API](docs/API.md).
140
-
141
- #### Allow only detector names in configuration hash
142
-
143
- In Reek 4 you could build your configuration like this:
144
-
145
- ```ruby
146
- config_hash = { Reek::SmellDetectors::IrresponsibleModule => { 'enabled' => false } }
147
- ```
148
-
149
- or like this:
150
-
151
- ```ruby
152
- config_hash = { 'IrresponsibleModule' => { 'enabled' => false } }
153
- ```
154
-
155
- Starting with Reek 5, the first way is not working anymore and the latter one is what you'll have to use.
156
-
157
- #### Do not accept a class as parameter for reek_of
158
-
159
- In the same vein as the change above you also can't use fully qualified detector names like this:
160
-
161
- ```Ruby
162
- reek_of(Reek::SmellDetectors::DuplicateMethodCall)
163
- ```
164
-
165
- The only supported way now is either as symbol or string:
166
-
167
- ```Ruby
168
- reek_of(:DuplicateMethodCall)
169
- reek_of('DuplicateMethodCall')
170
- ```
171
-
172
- ## Smaller changes
173
-
174
- * `PrimaDonnaMethod` has been given the better name `MissingSafeMethod`
175
- * `wiki-links` flag has been renamed to `documentation` flag
176
- * Reek assumes the default configuration file to be named ".reek.yml" and will ignore all other files. You can
177
- still use any name you want though by passing in a name via the `-c` flag
178
- * We have dropped the legacy code comment separator `:` at the end of a detector name. Before this release,
179
- to configure a smell detector via comment, you had to end with a colon after the detector name.
180
- This syntax is disallowed with Reek 5 - now you have to drop the `:` at the end, like this:
181
-
182
- ```diff
183
- -# :reek:UnusedPrivateMethod: { exclude: [ bravo ] }
184
- +# :reek:UnusedPrivateMethod { exclude: [ bravo ] }
185
- ```
186
-
187
- * We have dropped support for Ruby 2.1 and 2.2 since they are officially not supported by the Ruby core team anymore
188
-
@@ -1,46 +0,0 @@
1
- # Reek-Driven Development
2
-
3
- One way to drive quality into your code from the very beginning of a project is to run Reek as a part of your testing process.
4
-
5
- ## Rake: `Reek::Rake::Task`
6
-
7
- You can add a [Rake Task] to your Rakefile, which will run Reek on all your source files.
8
-
9
- ```Ruby
10
- require 'reek/rake/task'
11
-
12
- Reek::Rake::Task.new do |t|
13
- t.fail_on_error = true
14
- t.verbose = false
15
- t.source_files = 'lib/**/*.rb'
16
- end
17
- ```
18
-
19
- Now, `rake reek` will run Reek on your source code. And, in this case, it fails if it finds any smells.
20
-
21
- For more detailed information about Reek's integration with Rake, see [Rake Task].
22
-
23
- [Rake Task]: Rake-Task.md
24
-
25
- ## RSpec: `reek/spec`
26
-
27
- You can add Reek expectations directly into your RSpec specs.
28
-
29
- This example is from Reek's own source code:
30
-
31
- ```Ruby
32
- require 'reek/spec'
33
-
34
- it 'contains no code smells' do
35
- Pathname.glob('lib/**/*.rb').each do |file|
36
- expect(file).not_to reek
37
- end
38
- end
39
- ```
40
-
41
- By requiring [`reek/spec`] you gain access to the `reek` matcher.
42
-
43
- The `reek` matcher returns true if and only if Reek finds smells in your code. If the test fails, the matcher produces an error message that includes details of all the smells it found.
44
-
45
- [`reek/spec`]: ../lib/reek/spec.rb
46
-
@@ -1,47 +0,0 @@
1
- # Repeated Conditional
2
-
3
- ## Introduction
4
-
5
- _Repeated Conditional_ is a case of
6
- [Simulated Polymorphism](Simulated-Polymorphism.md). Basically it means you are
7
- checking the same value throughout a single class and take decisions based on
8
- this.
9
-
10
- ## Example
11
-
12
- Given
13
-
14
- ```Ruby
15
- class RepeatedConditionals
16
- attr_accessor :switch
17
-
18
- def repeat_1
19
- puts "Repeat 1!" if switch
20
- end
21
-
22
- def repeat_2
23
- puts "Repeat 2!" if switch
24
- end
25
-
26
- def repeat_3
27
- puts "Repeat 3!" if switch
28
- end
29
- end
30
- ```
31
-
32
- Reek would emit the following warning:
33
-
34
- ```
35
- test.rb -- 4 warnings:
36
- [5, 9, 13]:RepeatedConditionals tests switch at least 3 times (RepeatedConditional)
37
- ```
38
-
39
- If you get this warning then you are probably not using the right abstraction or even more probable, missing an additional abstraction.
40
-
41
- ## Configuration
42
-
43
- Reek's _Repeated Conditional_ detector offers the [Basic Smell Options](Basic-Smell-Options.md), plus:
44
-
45
- | Option | Value | Effect |
46
- | ---------------|-------------|---------|
47
- | `max_ifs` | integer | The maximum number of identical conditional tests permitted before Reek raises a warning. Defaults to 2. |
@@ -1,16 +0,0 @@
1
- # Simulated Polymorphism
2
-
3
- ## Introduction
4
-
5
- Simulated Polymorphism occurs when
6
-
7
- * code uses a case statement (especially on a type field);
8
- * or code has several if statements in a row (especially if they're comparing against the same value);
9
- * or code uses instance_of?, kind_of?, is_a?, or === to decide what type it's working with;
10
- * or multiple conditionals in different places test the same value.
11
-
12
- Conditional code is hard to read and understand, because the reader must hold more state in their head. When the same value is tested in multiple places throughout an application, any change to the set of possible values will require many methods and classes to change. Tests for the type of an object may indicate that the abstraction represented by that type is not completely defined (or understood).
13
-
14
- ## Current Support in Reek
15
-
16
- Reek checks for [Manual Dispatch](Manual-Dispatch.md), [Repeated Conditional](Repeated-Conditional.md) and for [Nil Check](Nil-Check.md).
@@ -1,96 +0,0 @@
1
- ## Introduction
2
-
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.
5
-
6
- Possible reasons for this could be:
7
-
8
- * The code is outside of your control and you can't fix it
9
- * Reek is not the police. You might have legit reasons why your source code
10
- is good as it is.
11
-
12
- ## How to disable smell detection
13
-
14
- There are always the [Basic Smell Options](Basic-Smell-Options.md)
15
- you can use in your configuration file.
16
-
17
- But in this document we would like to focus on a completely different
18
- way - via special comments.
19
-
20
- A simple example:
21
-
22
- ```ruby
23
- # This method smells of :reek:NestedIterators
24
- def smelly_method foo
25
- foo.each {|bar| bar.each {|baz| baz.qux}}
26
- end
27
- ```
28
-
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
- ```
53
-
54
- It is also possible to specify options for a particular smell detector in hash-style:
55
-
56
- ```ruby
57
- # :reek:LongParameterList { max_params: 4 }
58
- def many_parameters_it_has foo, bar, baz, qux
59
- # ...
60
- end
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.