reek 6.0.3 → 6.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (217) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -1
  3. data/CONTRIBUTING.md +3 -0
  4. data/Dockerfile +1 -1
  5. data/Gemfile +6 -6
  6. data/lib/reek/ast/ast_node_class_map.rb +1 -1
  7. data/lib/reek/report/code_climate/code_climate_formatter.rb +1 -3
  8. data/lib/reek/smell_detectors/base_detector.rb +1 -1
  9. data/lib/reek/smell_warning.rb +1 -1
  10. data/lib/reek/source/source_locator.rb +1 -3
  11. data/lib/reek/version.rb +1 -1
  12. data/reek.gemspec +4 -1
  13. metadata +3 -208
  14. data/docs/API.md +0 -174
  15. data/docs/Attribute.md +0 -39
  16. data/docs/Basic-Smell-Options.md +0 -85
  17. data/docs/Boolean-Parameter.md +0 -54
  18. data/docs/Class-Variable.md +0 -40
  19. data/docs/Code-Smells.md +0 -39
  20. data/docs/Command-Line-Options.md +0 -119
  21. data/docs/Control-Couple.md +0 -26
  22. data/docs/Control-Parameter.md +0 -32
  23. data/docs/Data-Clump.md +0 -46
  24. data/docs/Duplicate-Method-Call.md +0 -264
  25. data/docs/Feature-Envy.md +0 -93
  26. data/docs/How-To-Write-New-Detectors.md +0 -132
  27. data/docs/How-reek-works-internally.md +0 -114
  28. data/docs/Instance-Variable-Assumption.md +0 -163
  29. data/docs/Irresponsible-Module.md +0 -47
  30. data/docs/Large-Class.md +0 -16
  31. data/docs/Long-Parameter-List.md +0 -39
  32. data/docs/Long-Yield-List.md +0 -37
  33. data/docs/Manual-Dispatch.md +0 -30
  34. data/docs/Missing-Safe-Method.md +0 -92
  35. data/docs/Module-Initialize.md +0 -62
  36. data/docs/Nested-Iterators.md +0 -59
  37. data/docs/Nil-Check.md +0 -47
  38. data/docs/RSpec-matchers.md +0 -129
  39. data/docs/Rake-Task.md +0 -66
  40. data/docs/Reek-4-to-Reek-5-migration.md +0 -188
  41. data/docs/Reek-Driven-Development.md +0 -46
  42. data/docs/Repeated-Conditional.md +0 -47
  43. data/docs/Simulated-Polymorphism.md +0 -16
  44. data/docs/Smell-Suppression.md +0 -96
  45. data/docs/Style-Guide.md +0 -19
  46. data/docs/Subclassed-From-Core-Class.md +0 -79
  47. data/docs/Too-Many-Constants.md +0 -37
  48. data/docs/Too-Many-Instance-Variables.md +0 -43
  49. data/docs/Too-Many-Methods.md +0 -56
  50. data/docs/Too-Many-Statements.md +0 -54
  51. data/docs/Uncommunicative-Method-Name.md +0 -94
  52. data/docs/Uncommunicative-Module-Name.md +0 -92
  53. data/docs/Uncommunicative-Name.md +0 -18
  54. data/docs/Uncommunicative-Parameter-Name.md +0 -90
  55. data/docs/Uncommunicative-Variable-Name.md +0 -96
  56. data/docs/Unused-Parameters.md +0 -28
  57. data/docs/Unused-Private-Method.md +0 -101
  58. data/docs/Utility-Function.md +0 -56
  59. data/docs/Versioning-Policy.md +0 -7
  60. data/docs/YAML-Reports.md +0 -93
  61. data/docs/defaults.reek.yml +0 -129
  62. data/docs/templates/default/docstring/html/public_api_marker.erb +0 -3
  63. data/docs/templates/default/docstring/setup.rb +0 -35
  64. data/docs/templates/default/fulldoc/html/css/common.css +0 -1
  65. data/docs/yard_plugin.rb +0 -17
  66. data/features/command_line_interface/basic_usage.feature +0 -15
  67. data/features/command_line_interface/options.feature +0 -123
  68. data/features/command_line_interface/show_progress.feature +0 -33
  69. data/features/command_line_interface/smell_selection.feature +0 -15
  70. data/features/command_line_interface/smells_count.feature +0 -38
  71. data/features/command_line_interface/stdin.feature +0 -65
  72. data/features/configuration_files/accept_setting.feature +0 -87
  73. data/features/configuration_files/directory_specific_directives.feature +0 -274
  74. data/features/configuration_files/exclude_directives.feature +0 -35
  75. data/features/configuration_files/exclude_paths_directives.feature +0 -42
  76. data/features/configuration_files/masking_smells.feature +0 -94
  77. data/features/configuration_files/mix_accept_reject_setting.feature +0 -84
  78. data/features/configuration_files/reject_setting.feature +0 -89
  79. data/features/configuration_files/schema_validation.feature +0 -59
  80. data/features/configuration_files/show_configuration_file.feature +0 -44
  81. data/features/configuration_files/unused_private_method.feature +0 -68
  82. data/features/configuration_loading.feature +0 -91
  83. data/features/configuration_via_source_comments/erroneous_source_comments.feature +0 -68
  84. data/features/configuration_via_source_comments/well_formed_source_comments.feature +0 -116
  85. data/features/locales.feature +0 -32
  86. data/features/programmatic_access.feature +0 -41
  87. data/features/rake_task/rake_task.feature +0 -138
  88. data/features/reports/codeclimate.feature +0 -59
  89. data/features/reports/json.feature +0 -59
  90. data/features/reports/reports.feature +0 -219
  91. data/features/reports/yaml.feature +0 -52
  92. data/features/rspec_matcher.feature +0 -41
  93. data/features/samples.feature +0 -305
  94. data/features/step_definitions/.rubocop.yml +0 -5
  95. data/features/step_definitions/reek_steps.rb +0 -102
  96. data/features/step_definitions/sample_file_steps.rb +0 -63
  97. data/features/support/env.rb +0 -33
  98. data/features/todo_list.feature +0 -108
  99. data/samples/checkstyle.xml +0 -7
  100. data/samples/clean_source/clean.rb +0 -6
  101. data/samples/configuration/accepts_rejects_and_excludes_for_detectors.reek.yml +0 -29
  102. data/samples/configuration/accepts_rejects_and_excludes_for_directory_directives.reek.yml +0 -30
  103. data/samples/configuration/corrupt.reek +0 -1
  104. data/samples/configuration/empty.reek +0 -0
  105. data/samples/configuration/full_configuration.reek +0 -13
  106. data/samples/configuration/full_mask.reek +0 -6
  107. data/samples/configuration/home/home.reek.yml +0 -4
  108. data/samples/configuration/partial_mask.reek +0 -4
  109. data/samples/configuration/regular_configuration/.reek.yml +0 -4
  110. data/samples/configuration/regular_configuration/empty_sub_directory/.gitignore +0 -0
  111. data/samples/configuration/with_excluded_paths.reek +0 -5
  112. data/samples/no_config_file/.keep +0 -0
  113. data/samples/paths.rb +0 -5
  114. data/samples/smelly_source/inline.rb +0 -704
  115. data/samples/smelly_source/optparse.rb +0 -1788
  116. data/samples/smelly_source/redcloth.rb +0 -1130
  117. data/samples/smelly_source/ruby.rb +0 -368
  118. data/samples/smelly_source/smelly.rb +0 -7
  119. data/samples/source_with_exclude_paths/ignore_me/uncommunicative_method_name.rb +0 -5
  120. data/samples/source_with_exclude_paths/nested/ignore_me_as_well/irresponsible_module.rb +0 -2
  121. data/samples/source_with_exclude_paths/nested/uncommunicative_parameter_name.rb +0 -6
  122. data/samples/source_with_exclude_paths/nested/uncommunicative_variable_name.rb +0 -6
  123. data/samples/source_with_hidden_directories/.hidden/hidden.rb +0 -1
  124. data/samples/source_with_hidden_directories/not_hidden.rb +0 -1
  125. data/samples/source_with_non_ruby_files/gibberish +0 -1
  126. data/samples/source_with_non_ruby_files/python_source.py +0 -1
  127. data/samples/source_with_non_ruby_files/ruby.rb +0 -6
  128. data/spec/performance/reek/smell_detectors/runtime_speed_spec.rb +0 -15
  129. data/spec/quality/documentation_spec.rb +0 -41
  130. data/spec/quality/reek_source_spec.rb +0 -11
  131. data/spec/reek/ast/node_spec.rb +0 -211
  132. data/spec/reek/ast/object_refs_spec.rb +0 -83
  133. data/spec/reek/ast/reference_collector_spec.rb +0 -47
  134. data/spec/reek/ast/sexp_extensions_spec.rb +0 -498
  135. data/spec/reek/cli/application_spec.rb +0 -168
  136. data/spec/reek/cli/command/report_command_spec.rb +0 -44
  137. data/spec/reek/cli/command/todo_list_command_spec.rb +0 -86
  138. data/spec/reek/cli/options_spec.rb +0 -51
  139. data/spec/reek/cli/silencer_spec.rb +0 -28
  140. data/spec/reek/code_comment_spec.rb +0 -184
  141. data/spec/reek/configuration/app_configuration_spec.rb +0 -195
  142. data/spec/reek/configuration/configuration_file_finder_spec.rb +0 -230
  143. data/spec/reek/configuration/default_directive_spec.rb +0 -13
  144. data/spec/reek/configuration/directory_directives_spec.rb +0 -122
  145. data/spec/reek/configuration/excluded_paths_spec.rb +0 -25
  146. data/spec/reek/configuration/rake_task_converter_spec.rb +0 -33
  147. data/spec/reek/configuration/schema_validator_spec.rb +0 -165
  148. data/spec/reek/context/code_context_spec.rb +0 -192
  149. data/spec/reek/context/ghost_context_spec.rb +0 -60
  150. data/spec/reek/context/method_context_spec.rb +0 -72
  151. data/spec/reek/context/module_context_spec.rb +0 -55
  152. data/spec/reek/context/root_context_spec.rb +0 -12
  153. data/spec/reek/context/statement_counter_spec.rb +0 -24
  154. data/spec/reek/context_builder_spec.rb +0 -457
  155. data/spec/reek/detector_repository_spec.rb +0 -22
  156. data/spec/reek/documentation_link_spec.rb +0 -20
  157. data/spec/reek/errors/base_error_spec.rb +0 -13
  158. data/spec/reek/examiner_spec.rb +0 -309
  159. data/spec/reek/logging_error_handler_spec.rb +0 -24
  160. data/spec/reek/rake/task_spec.rb +0 -56
  161. data/spec/reek/report/code_climate/code_climate_configuration_spec.rb +0 -22
  162. data/spec/reek/report/code_climate/code_climate_fingerprint_spec.rb +0 -126
  163. data/spec/reek/report/code_climate/code_climate_formatter_spec.rb +0 -51
  164. data/spec/reek/report/code_climate/code_climate_report_spec.rb +0 -56
  165. data/spec/reek/report/html_report_spec.rb +0 -19
  166. data/spec/reek/report/json_report_spec.rb +0 -58
  167. data/spec/reek/report/location_formatter_spec.rb +0 -32
  168. data/spec/reek/report/progress_formatter_spec.rb +0 -68
  169. data/spec/reek/report/text_report_spec.rb +0 -89
  170. data/spec/reek/report/xml_report_spec.rb +0 -24
  171. data/spec/reek/report/yaml_report_spec.rb +0 -55
  172. data/spec/reek/report_spec.rb +0 -28
  173. data/spec/reek/smell_configuration_spec.rb +0 -56
  174. data/spec/reek/smell_detectors/attribute_spec.rb +0 -197
  175. data/spec/reek/smell_detectors/base_detector_spec.rb +0 -50
  176. data/spec/reek/smell_detectors/boolean_parameter_spec.rb +0 -93
  177. data/spec/reek/smell_detectors/class_variable_spec.rb +0 -106
  178. data/spec/reek/smell_detectors/control_parameter_spec.rb +0 -300
  179. data/spec/reek/smell_detectors/data_clump_spec.rb +0 -134
  180. data/spec/reek/smell_detectors/duplicate_method_call_spec.rb +0 -211
  181. data/spec/reek/smell_detectors/feature_envy_spec.rb +0 -295
  182. data/spec/reek/smell_detectors/instance_variable_assumption_spec.rb +0 -96
  183. data/spec/reek/smell_detectors/irresponsible_module_spec.rb +0 -226
  184. data/spec/reek/smell_detectors/long_parameter_list_spec.rb +0 -61
  185. data/spec/reek/smell_detectors/long_yield_list_spec.rb +0 -49
  186. data/spec/reek/smell_detectors/manual_dispatch_spec.rb +0 -75
  187. data/spec/reek/smell_detectors/missing_safe_method_spec.rb +0 -68
  188. data/spec/reek/smell_detectors/module_initialize_spec.rb +0 -77
  189. data/spec/reek/smell_detectors/nested_iterators_spec.rb +0 -333
  190. data/spec/reek/smell_detectors/nil_check_spec.rb +0 -100
  191. data/spec/reek/smell_detectors/repeated_conditional_spec.rb +0 -100
  192. data/spec/reek/smell_detectors/subclassed_from_core_class_spec.rb +0 -77
  193. data/spec/reek/smell_detectors/too_many_constants_spec.rb +0 -144
  194. data/spec/reek/smell_detectors/too_many_instance_variables_spec.rb +0 -132
  195. data/spec/reek/smell_detectors/too_many_methods_spec.rb +0 -54
  196. data/spec/reek/smell_detectors/too_many_statements_spec.rb +0 -90
  197. data/spec/reek/smell_detectors/uncommunicative_method_name_spec.rb +0 -78
  198. data/spec/reek/smell_detectors/uncommunicative_module_name_spec.rb +0 -78
  199. data/spec/reek/smell_detectors/uncommunicative_parameter_name_spec.rb +0 -147
  200. data/spec/reek/smell_detectors/uncommunicative_variable_name_spec.rb +0 -201
  201. data/spec/reek/smell_detectors/unused_parameters_spec.rb +0 -114
  202. data/spec/reek/smell_detectors/unused_private_method_spec.rb +0 -205
  203. data/spec/reek/smell_detectors/utility_function_spec.rb +0 -309
  204. data/spec/reek/smell_warning_spec.rb +0 -137
  205. data/spec/reek/source/source_code_spec.rb +0 -79
  206. data/spec/reek/source/source_locator_spec.rb +0 -166
  207. data/spec/reek/spec/should_reek_of_spec.rb +0 -153
  208. data/spec/reek/spec/should_reek_only_of_spec.rb +0 -91
  209. data/spec/reek/spec/should_reek_spec.rb +0 -52
  210. data/spec/reek/spec/smell_matcher_spec.rb +0 -87
  211. data/spec/reek/tree_dresser_spec.rb +0 -46
  212. data/spec/spec_helper.rb +0 -110
  213. data/tasks/configuration.rake +0 -18
  214. data/tasks/console.rake +0 -5
  215. data/tasks/reek.rake +0 -6
  216. data/tasks/rubocop.rake +0 -11
  217. data/tasks/test.rake +0 -32
@@ -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.
data/docs/Style-Guide.md DELETED
@@ -1,19 +0,0 @@
1
- # Style guide
2
-
3
- ## Instance variables and getters / setters
4
-
5
- We use instance vars only:
6
-
7
- - in the constructor
8
- - for [memoization](http://gavinmiller.io/2013/basics-of-ruby-memoization/)
9
-
10
- For everything else we use proper getters / setters.
11
-
12
- If possible those should be private.
13
-
14
- ## Data types
15
-
16
- - Class or module names that are carried around in hashes and configuration and what
17
- not should be designated by constants. So `DuplicateMethodCall`, not `:DuplicateMethodCall` or `"DuplicateMethodCall"`
18
- - Hash keys should be all symbols unless they designate classes / modules - see above.
19
- - Everything else like messages or parameters in smell warnings should be strings, nothing else.
@@ -1,79 +0,0 @@
1
- # Subclassed From Core Class
2
-
3
- ## Introduction
4
-
5
- Candidate classes for the _Subclassed From Core Class_ smell are classes which inherit from Core Classes like Hash, String and Array.
6
-
7
- Inheriting from Core Classes means that you are going to have a bad time debugging (the explanation below is taken from [here](http://words.steveklabnik.com/beware-subclassing-ruby-core-classes)):
8
-
9
- > What do you think this code should do?
10
-
11
- ```Ruby
12
- List = Class.new(Array)
13
-
14
- l = List.new
15
- l << 1
16
- l << 2
17
- puts l.reverse.class # => Array
18
- ```
19
-
20
- > If you said “it prints Array” you’d be right.
21
- > Let’s talk about a more pernicious issue: Strings.
22
-
23
- ```Ruby
24
- class MyString < String
25
- def to_s
26
- "lol"
27
- end
28
- end
29
-
30
- s = MyString.new
31
- s.concat "Hey"
32
-
33
- puts s # => Hey
34
- puts s.to_s # => lol
35
- puts "#{s}" # => Hey
36
- ```
37
-
38
- > That’s right! With Strings, Ruby doesn’t call #to_s: it puts the value in directly.
39
- > Generally speaking, subclassing isn’t the right idea here.
40
-
41
- ## Example
42
-
43
- Given
44
-
45
- ```Ruby
46
- class Ary < Array
47
- end
48
-
49
- class Str < String
50
- end
51
- ```
52
-
53
- Reek would report the _Subclassed From Core Class_ smell for both classes. Instead of subclassing them you want a data structure that uses one of these core classes internally, but isn’t exactly like one. For instance:
54
-
55
- ```Ruby
56
- require 'forwardable'
57
-
58
- class List
59
- extend Forwardable
60
- def_delegators :@list, :<<, :length # and anything else
61
-
62
- def initialize(list = [])
63
- @list = list
64
- end
65
-
66
- def reverse
67
- List.new(@list.reverse)
68
- end
69
- end
70
-
71
- l = List.new
72
- l << 1
73
- l << 2
74
- puts l.reverse.class # => List
75
- ```
76
-
77
- ## Configuration
78
-
79
- _Subclassed From Core Class_ offers the [Basic Smell Options](Basic-Smell-Options.md).