reek 6.0.2 → 6.1.4

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 (247) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +13 -0
  3. data/.github/workflows/ruby.yml +57 -0
  4. data/.rubocop.yml +6 -4
  5. data/.rubocop_todo.yml +6 -4
  6. data/CHANGELOG.md +42 -0
  7. data/CONTRIBUTING.md +4 -1
  8. data/Dockerfile +1 -1
  9. data/Gemfile +7 -7
  10. data/README.md +2 -2
  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 +20 -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 +2 -2
  19. data/lib/reek/cli/options.rb +6 -6
  20. data/lib/reek/code_comment.rb +22 -17
  21. data/lib/reek/configuration/configuration_file_finder.rb +2 -1
  22. data/lib/reek/configuration/excluded_paths.rb +2 -1
  23. data/lib/reek/context/code_context.rb +1 -1
  24. data/lib/reek/context/module_context.rb +4 -0
  25. data/lib/reek/context/refinement_context.rb +16 -0
  26. data/lib/reek/context/send_context.rb +6 -0
  27. data/lib/reek/context_builder.rb +17 -3
  28. data/lib/reek/rake/task.rb +5 -5
  29. data/lib/reek/report/code_climate/code_climate_configuration.yml +3 -3
  30. data/lib/reek/report/code_climate/code_climate_formatter.rb +1 -3
  31. data/lib/reek/smell_detectors/base_detector.rb +1 -1
  32. data/lib/reek/smell_detectors/class_variable.rb +2 -2
  33. data/lib/reek/smell_detectors/control_parameter_helpers/candidate.rb +6 -6
  34. data/lib/reek/smell_detectors/duplicate_method_call.rb +5 -5
  35. data/lib/reek/smell_detectors/unused_private_method.rb +1 -0
  36. data/lib/reek/smell_warning.rb +1 -1
  37. data/lib/reek/source/source_locator.rb +1 -3
  38. data/lib/reek/spec/should_reek_of.rb +11 -9
  39. data/lib/reek/spec.rb +1 -1
  40. data/lib/reek/version.rb +2 -2
  41. data/reek.gemspec +28 -25
  42. metadata +13 -240
  43. data/.travis.yml +0 -40
  44. data/docs/API.md +0 -174
  45. data/docs/Attribute.md +0 -39
  46. data/docs/Basic-Smell-Options.md +0 -85
  47. data/docs/Boolean-Parameter.md +0 -54
  48. data/docs/Class-Variable.md +0 -40
  49. data/docs/Code-Smells.md +0 -39
  50. data/docs/Command-Line-Options.md +0 -119
  51. data/docs/Control-Couple.md +0 -26
  52. data/docs/Control-Parameter.md +0 -32
  53. data/docs/Data-Clump.md +0 -46
  54. data/docs/Duplicate-Method-Call.md +0 -264
  55. data/docs/Feature-Envy.md +0 -93
  56. data/docs/How-To-Write-New-Detectors.md +0 -132
  57. data/docs/How-reek-works-internally.md +0 -114
  58. data/docs/Instance-Variable-Assumption.md +0 -163
  59. data/docs/Irresponsible-Module.md +0 -47
  60. data/docs/Large-Class.md +0 -16
  61. data/docs/Long-Parameter-List.md +0 -39
  62. data/docs/Long-Yield-List.md +0 -37
  63. data/docs/Manual-Dispatch.md +0 -30
  64. data/docs/Missing-Safe-Method.md +0 -92
  65. data/docs/Module-Initialize.md +0 -62
  66. data/docs/Nested-Iterators.md +0 -59
  67. data/docs/Nil-Check.md +0 -47
  68. data/docs/RSpec-matchers.md +0 -129
  69. data/docs/Rake-Task.md +0 -66
  70. data/docs/Reek-4-to-Reek-5-migration.md +0 -188
  71. data/docs/Reek-Driven-Development.md +0 -46
  72. data/docs/Repeated-Conditional.md +0 -47
  73. data/docs/Simulated-Polymorphism.md +0 -16
  74. data/docs/Smell-Suppression.md +0 -96
  75. data/docs/Style-Guide.md +0 -19
  76. data/docs/Subclassed-From-Core-Class.md +0 -79
  77. data/docs/Too-Many-Constants.md +0 -37
  78. data/docs/Too-Many-Instance-Variables.md +0 -43
  79. data/docs/Too-Many-Methods.md +0 -56
  80. data/docs/Too-Many-Statements.md +0 -54
  81. data/docs/Uncommunicative-Method-Name.md +0 -94
  82. data/docs/Uncommunicative-Module-Name.md +0 -92
  83. data/docs/Uncommunicative-Name.md +0 -18
  84. data/docs/Uncommunicative-Parameter-Name.md +0 -90
  85. data/docs/Uncommunicative-Variable-Name.md +0 -96
  86. data/docs/Unused-Parameters.md +0 -28
  87. data/docs/Unused-Private-Method.md +0 -101
  88. data/docs/Utility-Function.md +0 -56
  89. data/docs/Versioning-Policy.md +0 -7
  90. data/docs/YAML-Reports.md +0 -93
  91. data/docs/defaults.reek.yml +0 -129
  92. data/docs/templates/default/docstring/html/public_api_marker.erb +0 -3
  93. data/docs/templates/default/docstring/setup.rb +0 -37
  94. data/docs/templates/default/fulldoc/html/css/common.css +0 -1
  95. data/docs/yard_plugin.rb +0 -17
  96. data/features/command_line_interface/basic_usage.feature +0 -15
  97. data/features/command_line_interface/options.feature +0 -123
  98. data/features/command_line_interface/show_progress.feature +0 -33
  99. data/features/command_line_interface/smell_selection.feature +0 -15
  100. data/features/command_line_interface/smells_count.feature +0 -38
  101. data/features/command_line_interface/stdin.feature +0 -65
  102. data/features/configuration_files/accept_setting.feature +0 -87
  103. data/features/configuration_files/directory_specific_directives.feature +0 -274
  104. data/features/configuration_files/exclude_directives.feature +0 -35
  105. data/features/configuration_files/exclude_paths_directives.feature +0 -42
  106. data/features/configuration_files/masking_smells.feature +0 -94
  107. data/features/configuration_files/mix_accept_reject_setting.feature +0 -84
  108. data/features/configuration_files/reject_setting.feature +0 -89
  109. data/features/configuration_files/schema_validation.feature +0 -59
  110. data/features/configuration_files/show_configuration_file.feature +0 -44
  111. data/features/configuration_files/unused_private_method.feature +0 -68
  112. data/features/configuration_loading.feature +0 -91
  113. data/features/configuration_via_source_comments/erroneous_source_comments.feature +0 -68
  114. data/features/configuration_via_source_comments/well_formed_source_comments.feature +0 -116
  115. data/features/locales.feature +0 -32
  116. data/features/programmatic_access.feature +0 -41
  117. data/features/rake_task/rake_task.feature +0 -138
  118. data/features/reports/codeclimate.feature +0 -59
  119. data/features/reports/json.feature +0 -59
  120. data/features/reports/reports.feature +0 -219
  121. data/features/reports/yaml.feature +0 -52
  122. data/features/rspec_matcher.feature +0 -41
  123. data/features/samples.feature +0 -305
  124. data/features/step_definitions/.rubocop.yml +0 -5
  125. data/features/step_definitions/reek_steps.rb +0 -102
  126. data/features/step_definitions/sample_file_steps.rb +0 -63
  127. data/features/support/env.rb +0 -33
  128. data/features/todo_list.feature +0 -108
  129. data/samples/checkstyle.xml +0 -7
  130. data/samples/clean_source/clean.rb +0 -6
  131. data/samples/configuration/accepts_rejects_and_excludes_for_detectors.reek.yml +0 -29
  132. data/samples/configuration/accepts_rejects_and_excludes_for_directory_directives.reek.yml +0 -30
  133. data/samples/configuration/corrupt.reek +0 -1
  134. data/samples/configuration/empty.reek +0 -0
  135. data/samples/configuration/full_configuration.reek +0 -13
  136. data/samples/configuration/full_mask.reek +0 -6
  137. data/samples/configuration/home/home.reek.yml +0 -4
  138. data/samples/configuration/partial_mask.reek +0 -4
  139. data/samples/configuration/regular_configuration/.reek.yml +0 -4
  140. data/samples/configuration/regular_configuration/empty_sub_directory/.gitignore +0 -0
  141. data/samples/configuration/with_excluded_paths.reek +0 -5
  142. data/samples/no_config_file/.keep +0 -0
  143. data/samples/paths.rb +0 -5
  144. data/samples/smelly_source/inline.rb +0 -704
  145. data/samples/smelly_source/optparse.rb +0 -1788
  146. data/samples/smelly_source/redcloth.rb +0 -1130
  147. data/samples/smelly_source/ruby.rb +0 -368
  148. data/samples/smelly_source/smelly.rb +0 -7
  149. data/samples/source_with_exclude_paths/ignore_me/uncommunicative_method_name.rb +0 -5
  150. data/samples/source_with_exclude_paths/nested/ignore_me_as_well/irresponsible_module.rb +0 -2
  151. data/samples/source_with_exclude_paths/nested/uncommunicative_parameter_name.rb +0 -6
  152. data/samples/source_with_exclude_paths/nested/uncommunicative_variable_name.rb +0 -6
  153. data/samples/source_with_hidden_directories/.hidden/hidden.rb +0 -1
  154. data/samples/source_with_hidden_directories/not_hidden.rb +0 -1
  155. data/samples/source_with_non_ruby_files/gibberish +0 -1
  156. data/samples/source_with_non_ruby_files/python_source.py +0 -1
  157. data/samples/source_with_non_ruby_files/ruby.rb +0 -6
  158. data/spec/performance/reek/smell_detectors/runtime_speed_spec.rb +0 -15
  159. data/spec/quality/documentation_spec.rb +0 -41
  160. data/spec/quality/reek_source_spec.rb +0 -11
  161. data/spec/reek/ast/node_spec.rb +0 -211
  162. data/spec/reek/ast/object_refs_spec.rb +0 -83
  163. data/spec/reek/ast/reference_collector_spec.rb +0 -47
  164. data/spec/reek/ast/sexp_extensions_spec.rb +0 -498
  165. data/spec/reek/cli/application_spec.rb +0 -168
  166. data/spec/reek/cli/command/report_command_spec.rb +0 -44
  167. data/spec/reek/cli/command/todo_list_command_spec.rb +0 -86
  168. data/spec/reek/cli/options_spec.rb +0 -51
  169. data/spec/reek/cli/silencer_spec.rb +0 -28
  170. data/spec/reek/code_comment_spec.rb +0 -184
  171. data/spec/reek/configuration/app_configuration_spec.rb +0 -195
  172. data/spec/reek/configuration/configuration_file_finder_spec.rb +0 -230
  173. data/spec/reek/configuration/default_directive_spec.rb +0 -13
  174. data/spec/reek/configuration/directory_directives_spec.rb +0 -122
  175. data/spec/reek/configuration/excluded_paths_spec.rb +0 -16
  176. data/spec/reek/configuration/rake_task_converter_spec.rb +0 -33
  177. data/spec/reek/configuration/schema_validator_spec.rb +0 -165
  178. data/spec/reek/context/code_context_spec.rb +0 -192
  179. data/spec/reek/context/ghost_context_spec.rb +0 -60
  180. data/spec/reek/context/method_context_spec.rb +0 -72
  181. data/spec/reek/context/module_context_spec.rb +0 -55
  182. data/spec/reek/context/root_context_spec.rb +0 -12
  183. data/spec/reek/context/statement_counter_spec.rb +0 -24
  184. data/spec/reek/context_builder_spec.rb +0 -457
  185. data/spec/reek/detector_repository_spec.rb +0 -22
  186. data/spec/reek/documentation_link_spec.rb +0 -20
  187. data/spec/reek/errors/base_error_spec.rb +0 -13
  188. data/spec/reek/examiner_spec.rb +0 -309
  189. data/spec/reek/logging_error_handler_spec.rb +0 -24
  190. data/spec/reek/rake/task_spec.rb +0 -56
  191. data/spec/reek/report/code_climate/code_climate_configuration_spec.rb +0 -22
  192. data/spec/reek/report/code_climate/code_climate_fingerprint_spec.rb +0 -126
  193. data/spec/reek/report/code_climate/code_climate_formatter_spec.rb +0 -51
  194. data/spec/reek/report/code_climate/code_climate_report_spec.rb +0 -56
  195. data/spec/reek/report/html_report_spec.rb +0 -19
  196. data/spec/reek/report/json_report_spec.rb +0 -58
  197. data/spec/reek/report/location_formatter_spec.rb +0 -32
  198. data/spec/reek/report/progress_formatter_spec.rb +0 -68
  199. data/spec/reek/report/text_report_spec.rb +0 -89
  200. data/spec/reek/report/xml_report_spec.rb +0 -24
  201. data/spec/reek/report/yaml_report_spec.rb +0 -55
  202. data/spec/reek/report_spec.rb +0 -28
  203. data/spec/reek/smell_configuration_spec.rb +0 -56
  204. data/spec/reek/smell_detectors/attribute_spec.rb +0 -197
  205. data/spec/reek/smell_detectors/base_detector_spec.rb +0 -50
  206. data/spec/reek/smell_detectors/boolean_parameter_spec.rb +0 -93
  207. data/spec/reek/smell_detectors/class_variable_spec.rb +0 -106
  208. data/spec/reek/smell_detectors/control_parameter_spec.rb +0 -300
  209. data/spec/reek/smell_detectors/data_clump_spec.rb +0 -134
  210. data/spec/reek/smell_detectors/duplicate_method_call_spec.rb +0 -211
  211. data/spec/reek/smell_detectors/feature_envy_spec.rb +0 -295
  212. data/spec/reek/smell_detectors/instance_variable_assumption_spec.rb +0 -96
  213. data/spec/reek/smell_detectors/irresponsible_module_spec.rb +0 -226
  214. data/spec/reek/smell_detectors/long_parameter_list_spec.rb +0 -61
  215. data/spec/reek/smell_detectors/long_yield_list_spec.rb +0 -49
  216. data/spec/reek/smell_detectors/manual_dispatch_spec.rb +0 -75
  217. data/spec/reek/smell_detectors/missing_safe_method_spec.rb +0 -68
  218. data/spec/reek/smell_detectors/module_initialize_spec.rb +0 -77
  219. data/spec/reek/smell_detectors/nested_iterators_spec.rb +0 -333
  220. data/spec/reek/smell_detectors/nil_check_spec.rb +0 -100
  221. data/spec/reek/smell_detectors/repeated_conditional_spec.rb +0 -100
  222. data/spec/reek/smell_detectors/subclassed_from_core_class_spec.rb +0 -77
  223. data/spec/reek/smell_detectors/too_many_constants_spec.rb +0 -144
  224. data/spec/reek/smell_detectors/too_many_instance_variables_spec.rb +0 -132
  225. data/spec/reek/smell_detectors/too_many_methods_spec.rb +0 -54
  226. data/spec/reek/smell_detectors/too_many_statements_spec.rb +0 -90
  227. data/spec/reek/smell_detectors/uncommunicative_method_name_spec.rb +0 -78
  228. data/spec/reek/smell_detectors/uncommunicative_module_name_spec.rb +0 -78
  229. data/spec/reek/smell_detectors/uncommunicative_parameter_name_spec.rb +0 -147
  230. data/spec/reek/smell_detectors/uncommunicative_variable_name_spec.rb +0 -201
  231. data/spec/reek/smell_detectors/unused_parameters_spec.rb +0 -114
  232. data/spec/reek/smell_detectors/unused_private_method_spec.rb +0 -205
  233. data/spec/reek/smell_detectors/utility_function_spec.rb +0 -293
  234. data/spec/reek/smell_warning_spec.rb +0 -137
  235. data/spec/reek/source/source_code_spec.rb +0 -79
  236. data/spec/reek/source/source_locator_spec.rb +0 -166
  237. data/spec/reek/spec/should_reek_of_spec.rb +0 -153
  238. data/spec/reek/spec/should_reek_only_of_spec.rb +0 -91
  239. data/spec/reek/spec/should_reek_spec.rb +0 -52
  240. data/spec/reek/spec/smell_matcher_spec.rb +0 -87
  241. data/spec/reek/tree_dresser_spec.rb +0 -46
  242. data/spec/spec_helper.rb +0 -110
  243. data/tasks/configuration.rake +0 -18
  244. data/tasks/console.rake +0 -5
  245. data/tasks/reek.rake +0 -6
  246. data/tasks/rubocop.rake +0 -11
  247. data/tasks/test.rake +0 -32
@@ -1,65 +0,0 @@
1
- Feature: Reek reads from $stdin when no files are given
2
- In order to use reek with pipelines
3
- As a developer
4
- I want to pipe source code on stdin
5
-
6
- Scenario: return zero status with no smells
7
- When I pass "def simple() @fred = 3 end" to reek
8
- Then it succeeds
9
- And it reports nothing
10
-
11
- Scenario: outputs nothing on empty stdin
12
- When I pass "" to reek
13
- Then it succeeds
14
- And it reports nothing
15
-
16
- Scenario: outputs header only on empty stdin in verbose mode
17
- When I pass "" to reek -V
18
- Then it succeeds
19
- And it reports:
20
- """
21
- STDIN -- 0 warnings
22
- """
23
-
24
- Scenario: return non-zero status when there are smells
25
- When I pass "class Turn; def y() @x = 3; end end" to reek
26
- Then the exit status indicates smells
27
- And it reports:
28
- """
29
- STDIN -- 3 warnings:
30
- [1]:IrresponsibleModule: Turn has no descriptive comment
31
- [1]:UncommunicativeMethodName: Turn#y has the name 'y'
32
- [1]:UncommunicativeVariableName: Turn has the variable name '@x'
33
- """
34
-
35
- Scenario: syntax error causes the source to be ignored
36
- When I pass "= invalid syntax =" to reek
37
- Then it succeeds
38
- And it reports the error "Parser::SyntaxError: unexpected token tEQL"
39
-
40
- Scenario: providing a filename to use for the config to match against
41
- Given a file named "web_app/config.reek" with:
42
- """
43
- ---
44
- directories:
45
- "web_app/app/controllers":
46
- IrresponsibleModule:
47
- enabled: false
48
- NestedIterators:
49
- enabled: false
50
- InstanceVariableAssumption:
51
- enabled: false
52
- """
53
- When I pass a stdin to reek --config web_app/config.reek --stdin-filename web_app/app/controllers/users_controller with:
54
- """
55
- class UsersController < ApplicationController
56
- def show
57
- respond_with do |format|
58
- format.json { |json| @user.to_custom_json }
59
- format.xml { |xml| @user.to_fancy_xml }
60
- end
61
- end
62
- end
63
- """
64
- Then it succeeds
65
- And it reports nothing
@@ -1,87 +0,0 @@
1
- Feature: `accept` configuration setting
2
- In order to have a more fine-grained control over what Reek reports
3
- As a user
4
- I want to be able to accept specific patterns and names to exclude them from reporting
5
-
6
- Scenario: Accept names
7
- Given a file named "config.reek" with:
8
- """
9
- ---
10
- detectors:
11
- UncommunicativeMethodName:
12
- accept:
13
- - m1
14
- - m2
15
- UncommunicativeParameterName:
16
- accept:
17
- - a1
18
- - a2
19
- UncommunicativeModuleName:
20
- accept:
21
- - C1
22
- UncommunicativeVariableName:
23
- accept:
24
- - var1
25
- """
26
- And a file named "smelly.rb" with:
27
- """
28
- # Should not report UncommunicativeModuleName
29
- class C1
30
- # Should not report UncommunicativeMethodName and UncommunicativeParameterName
31
- def m1(a1); a1; end
32
- # Should not report UncommunicativeMethodName and UncommunicativeParameterName
33
- def m2(a2); a2; end
34
- # Should report UncommunicativeMethodName and UncommunicativeParameterName
35
- def m3(a3); a3; end
36
- var1 = 2 # Should not report UncommunicativeVariableName
37
- myvar1 = 2 # Should not report UncommunicativeVariableName
38
- var2 = 2 # Should report UncommunicativeVariableName
39
- end
40
- """
41
- When I run reek -c config.reek smelly.rb
42
- Then it reports:
43
- """
44
- smelly.rb -- 3 warnings:
45
- [8]:UncommunicativeMethodName: C1#m3 has the name 'm3'
46
- [8]:UncommunicativeParameterName: C1#m3 has the parameter name 'a3'
47
- [11]:UncommunicativeVariableName: C1 has the variable name 'var2'
48
- """
49
-
50
- Scenario: Accept regexes
51
- Given a file named "config.reek" with:
52
- """
53
- ---
54
- detectors:
55
- UncommunicativeMethodName:
56
- accept:
57
- - /oobar/
58
- UncommunicativeParameterName:
59
- accept:
60
- - /ola/
61
- UncommunicativeModuleName:
62
- accept:
63
- - /lassy/
64
- UncommunicativeVariableName:
65
- accept:
66
- - /^var1/
67
- """
68
- And a file named "smelly.rb" with:
69
- """
70
- # Should not report UncommunicativeModuleName
71
- class Classy1
72
- # Should not report UncommunicativeMethodName and UncommunicativeParameterName
73
- def foobar1(hola1); hola1; end
74
- # Should report UncommunicativeMethodName and UncommunicativeParameterName
75
- def m2(a2); a2; end
76
- var1 = 2 # Should not report UncommunicativeVariableName
77
- myvar1 = 2 # Should report UncommunicativeVariableName
78
- end
79
- """
80
- When I run reek -c config.reek smelly.rb
81
- Then it reports:
82
- """
83
- smelly.rb -- 3 warnings:
84
- [6]:UncommunicativeMethodName: Classy1#m2 has the name 'm2'
85
- [6]:UncommunicativeParameterName: Classy1#m2 has the parameter name 'a2'
86
- [8]:UncommunicativeVariableName: Classy1 has the variable name 'myvar1'
87
- """
@@ -1,274 +0,0 @@
1
- Feature: Directory directives
2
- In order to have a more fine-grained control over what Reek reports
3
- And to enable domain specific modes (like a Ruby on Rails mode)
4
- As a user
5
- I want to be able to configure Reek using directory directives
6
-
7
- Scenario: Configure multiple directories
8
- Given a file named "web_app/config.reek" with:
9
- """
10
- ---
11
- directories:
12
- "web_app/app/controllers":
13
- IrresponsibleModule:
14
- enabled: false
15
- NestedIterators:
16
- enabled: false
17
- "web_app/app/helpers":
18
- IrresponsibleModule:
19
- enabled: false
20
- UtilityFunction:
21
- enabled: false
22
- """
23
- And a file named "web_app/app/controllers/users_controller.rb" with:
24
- """
25
- class UsersController < ApplicationController
26
- def show
27
- respond_with do |format|
28
- format.json { |json| @user.to_custom_json }
29
- format.xml { |xml| @user.to_fancy_xml }
30
- end
31
- end
32
- end
33
- """
34
- And a file named "web_app/app/helpers/application_helper.rb" with:
35
- """
36
- module ApplicationHelper
37
- def current_year
38
- Time.zone.now.year
39
- end
40
- end
41
- """
42
- And a file named "web_app/app/models/user.rb" with:
43
- """
44
- class User < ActiveRecord::Base
45
- def logged_in_with_role(role)
46
- true
47
- end
48
- end
49
- """
50
- When I run reek -c web_app/config.reek web_app/
51
- Then it reports:
52
- """
53
- web_app/app/controllers/users_controller.rb -- 1 warning:
54
- [1]:InstanceVariableAssumption: UsersController assumes too much for instance variable '@user'
55
- web_app/app/models/user.rb -- 2 warnings:
56
- [1]:IrresponsibleModule: User has no descriptive comment
57
- [2]:UnusedParameters: User#logged_in_with_role has unused parameter 'role'
58
- 3 total warnings
59
- """
60
-
61
- Scenario: Ignore trailing slashes
62
- Given a file named "web_app/config.reek" with:
63
- """
64
- ---
65
- directories:
66
- "controllers/":
67
- IrresponsibleModule:
68
- enabled: false
69
- """
70
- And a file named "controllers/users_controller.rb" with:
71
- """
72
- class UsersController
73
- def show
74
- end
75
- end
76
- """
77
- When I run reek -c web_app/config.reek controllers
78
- Then it reports nothing
79
-
80
- Scenario: Partially mask smells in different directories
81
- Given a file named "web_app/config.reek" with:
82
- """
83
- ---
84
- directories:
85
- "web_app/app/controllers":
86
- IrresponsibleModule:
87
- enabled: true
88
- "web_app/app/helpers":
89
- IrresponsibleModule:
90
- enabled: false
91
- UtilityFunction:
92
- enabled: false
93
- "web_app/app/models":
94
- IrresponsibleModule:
95
- enabled: false
96
- """
97
- And a file named "web_app/app/controllers/users_controller.rb" with:
98
- """
99
- class UsersController < ApplicationController
100
- def show
101
- respond_with do |format|
102
- format.json { |json| @user.to_custom_json }
103
- end
104
- end
105
- end
106
- """
107
- And a file named "web_app/app/helpers/application_helper.rb" with:
108
- """
109
- module ApplicationHelper
110
- def current_year
111
- Time.zone.now.year
112
- end
113
- end
114
- """
115
- And a file named "web_app/app/models/user.rb" with:
116
- """
117
- class User < ActiveRecord::Base
118
- def logged_in_with_role(role)
119
- true
120
- end
121
- end
122
- """
123
- When I run reek -c web_app/config.reek web_app/
124
- Then it reports:
125
- """
126
- web_app/app/controllers/users_controller.rb -- 3 warnings:
127
- [1]:InstanceVariableAssumption: UsersController assumes too much for instance variable '@user'
128
- [1]:IrresponsibleModule: UsersController has no descriptive comment
129
- [4]:NestedIterators: UsersController#show contains iterators nested 2 deep
130
- web_app/app/models/user.rb -- 1 warning:
131
- [2]:UnusedParameters: User#logged_in_with_role has unused parameter 'role'
132
- 4 total warnings
133
- """
134
-
135
- Scenario: Use the default directive if there is no directory directive
136
- Given a file named "config.reek" with:
137
- """
138
- ---
139
- directories:
140
- "web_app/app/controllers":
141
- IrresponsibleModule:
142
- enabled: true
143
- NestedIterators:
144
- enabled: false
145
- detectors:
146
- IrresponsibleModule:
147
- enabled: false
148
- NestedIterators:
149
- enabled: true
150
- """
151
- And a file named "web_app/app/controllers/users_controller.rb" with:
152
- """
153
- class UsersController < ApplicationController
154
- def show
155
- respond_with do |format|
156
- format.json { |json| @user.to_custom_json }
157
- end
158
- end
159
- end
160
- """
161
- And a file named "other/projects_controller.rb" with:
162
- """
163
- class ProjectController < ApplicationController
164
- def show
165
- respond_with do |format|
166
- format.json { |json| @project.to_custom_json }
167
- end
168
- end
169
- end
170
- """
171
- When I run reek -c config.reek other/ web_app/
172
- Then it reports:
173
- """
174
- other/projects_controller.rb -- 2 warnings:
175
- [1]:InstanceVariableAssumption: ProjectController assumes too much for instance variable '@project'
176
- [4]:NestedIterators: ProjectController#show contains iterators nested 2 deep
177
- web_app/app/controllers/users_controller.rb -- 2 warnings:
178
- [1]:InstanceVariableAssumption: UsersController assumes too much for instance variable '@user'
179
- [1]:IrresponsibleModule: UsersController has no descriptive comment
180
- 4 total warnings
181
- """
182
-
183
- Scenario: Abort on non-existent smell type in directory directive
184
- Given a file named "config.reek" with:
185
- """
186
- ---
187
- directories:
188
- "dummy_directory":
189
- # Typo: Should be NestedIterators
190
- IteratorsNested:
191
- enabled: false
192
- """
193
- And a file named "dummy_directory/dummy.rb" with:
194
- """
195
- class Dummy
196
- end
197
- """
198
-
199
- When I run reek -c config.reek dummy_directory/
200
- Then the exit status indicates an error
201
- And stderr reports:
202
- """
203
- Error: We found some problems with your configuration file: [/directories/dummy_directory/IteratorsNested] key 'IteratorsNested:' is undefined.
204
- """
205
-
206
- Scenario: Abort on file as directory directive
207
- Given a file named "config.reek" with:
208
- """
209
- ---
210
- directories:
211
- "dummy_directory/dummy.rb":
212
- NestedIterators:
213
- enabled: false
214
- """
215
- And a file named "dummy_directory/dummy.rb" with:
216
- """
217
- class Dummy
218
- end
219
- """
220
- When I run reek -c config.reek dummy_directory/
221
- Then the exit status indicates an error
222
- And stderr reports:
223
- """
224
- Error: `dummy_directory/dummy.rb` is supposed to be a directory but is a file
225
-
226
- """
227
-
228
- Scenario: In case of overlapping configurations, pick the most appropriate one
229
- Given a file named "config.reek" with:
230
- """
231
- ---
232
- directories:
233
- "foo/bar/baz":
234
- IrresponsibleModule:
235
- enabled: false
236
- NestedIterators:
237
- enabled: true
238
- "foo/bar":
239
- IrresponsibleModule:
240
- enabled: true
241
- NestedIterators:
242
- enabled: false
243
- """
244
- And a file named "foo/bar/baz/klass.rb" with:
245
- """
246
- class Klass
247
- def meth
248
- respond_to do |arg|
249
- answer_to do |arg|
250
- end
251
- end
252
- end
253
- end
254
- """
255
- And a file named "foo/bar/klazz.rb" with:
256
- """
257
- class Klazz
258
- def meth
259
- respond_to do |arg|
260
- answer_to do |arg|
261
- end
262
- end
263
- end
264
- end
265
- """
266
- When I run reek -c config.reek foo/
267
- Then it reports:
268
- """
269
- foo/bar/baz/klass.rb -- 1 warning:
270
- [4]:NestedIterators: Klass#meth contains iterators nested 2 deep
271
- foo/bar/klazz.rb -- 1 warning:
272
- [1]:IrresponsibleModule: Klazz has no descriptive comment
273
- 2 total warnings
274
- """
@@ -1,35 +0,0 @@
1
- Feature: Exclude directives
2
- In order to have a more fine-grained control over what Reek reports
3
- As a user
4
- I want to be able to exclude specific contexts from reporting
5
-
6
- Scenario: Exclude multiple contexts
7
- Given a file named "config.reek" with:
8
- """
9
- ---
10
- detectors:
11
- UncommunicativeMethodName:
12
- exclude:
13
- - "Smelly#x"
14
- UnusedPrivateMethod:
15
- enabled: true
16
- exclude:
17
- - "Smelly#foobar"
18
- """
19
- And a file named "smelly.rb" with:
20
- """
21
- class Smelly
22
- # Should report IrresponsibleModule
23
- def foo(arg); end # Should report UnusedParameter
24
- def x; end # Should not report UncommunicativeMethodName
25
- private
26
- def foobar; end # Should not report UnusedPrivateMethod
27
- end
28
- """
29
- When I run reek -c config.reek smelly.rb
30
- Then it reports:
31
- """
32
- smelly.rb -- 2 warnings:
33
- [1]:IrresponsibleModule: Smelly has no descriptive comment
34
- [3]:UnusedParameters: Smelly#foo has unused parameter 'arg'
35
- """
@@ -1,42 +0,0 @@
1
- Feature: Exclude paths directives
2
- In order to avoid Reek wasting time on files that cannot be fixed
3
- As a user
4
- I want to be able to exclude specific paths from being checked
5
-
6
- Scenario: Exclude paths
7
- Given the smelly file "smelly.rb" in the directory "smelly_sources"
8
- And the smelly file "smelly.rb" in the directory "smelly_as_well"
9
- And the smelly file "smelly.rb" in the directory "smelly_as_well_2"
10
- When I run reek .
11
- Then the exit status indicates smells
12
- Given a file named "config.reek" with:
13
- """
14
- ---
15
- exclude_paths:
16
- - smelly_sources/smelly.rb
17
- - smelly_as_well/
18
- - smelly_as_well_2
19
- """
20
- When I run reek -c config.reek .
21
- Then it succeeds
22
- And it reports nothing
23
-
24
- Scenario: Using a file name within an excluded directory
25
- Given a file named "bad_files_live_here/smelly.rb" with:
26
- """
27
- # A smelly example class
28
- class Smelly
29
- def alfa(bravo); end
30
- end
31
- """
32
- And a file named "config.reek" with:
33
- """
34
- ---
35
- exclude_paths:
36
- - bad_files_live_here
37
- """
38
- When I run reek -c config.reek bad_files_live_here/smelly.rb
39
- Then the exit status indicates smells
40
- When I run reek -c config.reek --force-exclusion bad_files_live_here/smelly.rb
41
- Then it succeeds
42
- And it reports nothing
@@ -1,94 +0,0 @@
1
- Feature: Masking smells using config files
2
- In order to keep my reports meaningful
3
- As a developer
4
- I want to mask some smells using config files
5
-
6
- Scenario: corrupt config file prevents normal output
7
- Given the smelly file 'smelly.rb'
8
- And a configuration file 'corrupt.reek'
9
- When I run reek -c corrupt.reek smelly.rb
10
- And stderr reports:
11
- """
12
- Error: We found some problems with your configuration file: [/] 'Not a valid configuration file': not a mapping.
13
- """
14
- And the exit status indicates an error
15
- And it reports nothing
16
-
17
- Scenario: missing source file is an error
18
- When I run reek not_here.rb
19
- Then it reports the error "Error: No such file - not_here.rb"
20
-
21
- Scenario: masking smells in the configuration file
22
- Given the smelly file 'smelly.rb'
23
- And a configuration file 'full_mask.reek'
24
- When I run reek -c full_mask.reek smelly.rb
25
- Then it succeeds
26
- And it reports nothing
27
-
28
- Scenario: allow masking some calls for duplication smell
29
- Given the smelly file 'smelly.rb'
30
- And a configuration file 'partial_mask.reek'
31
- When I run reek -c partial_mask.reek smelly.rb
32
- Then the exit status indicates smells
33
- And it reports:
34
- """
35
- smelly.rb -- 1 warning:
36
- [5]:UncommunicativeVariableName: Smelly#x has the variable name 'y'
37
- """
38
-
39
- Scenario: provide extra masking inline in comments
40
- Given a file named "smelly_with_inline_mask.rb" with:
41
- """
42
- # Smelly class
43
- # disables :reek:UncommunicativeVariableName
44
- class Smelly
45
- # This will reek of UncommunicativeMethodName
46
- def x
47
- y = 10 # This will NOT reek of UncommunicativeVariableName
48
- end
49
- end
50
- """
51
- And a configuration file 'partial_mask.reek'
52
- When I run reek -c partial_mask.reek smelly_with_inline_mask.rb
53
- Then it succeeds
54
- And it reports nothing
55
-
56
- Scenario: empty config file outputs normally
57
- Given the smelly file 'smelly.rb'
58
- And a configuration file 'empty.reek'
59
- When I run reek -c empty.reek smelly.rb
60
- Then the exit status indicates smells
61
- And it reports:
62
- """
63
- smelly.rb -- 2 warnings:
64
- [4]:UncommunicativeMethodName: Smelly#x has the name 'x'
65
- [5]:UncommunicativeVariableName: Smelly#x has the variable name 'y'
66
- """
67
-
68
- Scenario: Disable UtilityFunction for non-public methods
69
- Given a file named "smelly_with_modifiers.rb" with:
70
- """
71
- # Smelly class for testing purposes
72
- class Klass
73
- def public_method(arg) arg.to_s; end
74
- protected
75
- def protected_method(arg) arg.to_s; end
76
- private
77
- def private_method(arg) arg.to_s; end
78
- end
79
- """
80
- And a file named "non_public_modifiers_mask.reek.yml" with:
81
- """
82
- ---
83
- detectors:
84
- UtilityFunction:
85
- public_methods_only: true
86
- """
87
- When I run reek -c non_public_modifiers_mask.reek.yml smelly_with_modifiers.rb
88
- Then the exit status indicates smells
89
- And it reports:
90
- """
91
- smelly_with_modifiers.rb -- 1 warning:
92
- [3]:UtilityFunction: Klass#public_method doesn't depend on instance state (maybe move it to another class?)
93
- """
94
- But it does not report private or protected methods
@@ -1,84 +0,0 @@
1
- Feature: Mix `accept` and `reject` configuration settings
2
- In order to have a more fine-grained control over what Reek reports
3
- As a user
4
- I want to be able to mix the `accept` and `reject` setting
5
-
6
- Scenario: UncommunicativeMethodName
7
- Given a file named "config.reek" with:
8
- """
9
- ---
10
- detectors:
11
- UncommunicativeMethodName:
12
- accept:
13
- - x
14
- - meth1
15
- reject:
16
- - helper
17
- - foobar
18
- """
19
- And a file named "smelly.rb" with:
20
- """
21
- def x; end # Should not be reported
22
- def meth1; end # Should not be reported
23
- def foobar; end # Should be reported
24
- def awesome_helper; end # Should be reported
25
- """
26
- When I run reek -c config.reek smelly.rb
27
- Then it reports:
28
- """
29
- smelly.rb -- 2 warnings:
30
- [4]:UncommunicativeMethodName: awesome_helper has the name 'awesome_helper'
31
- [3]:UncommunicativeMethodName: foobar has the name 'foobar'
32
- """
33
-
34
- Scenario: UncommunicativeModuleName
35
- Given a file named "config.reek" with:
36
- """
37
- ---
38
- detectors:
39
- IrresponsibleModule:
40
- enabled: false
41
- UncommunicativeModuleName:
42
- accept:
43
- - lassy
44
- - M
45
- reject:
46
- - Helper
47
- """
48
- And a file named "smelly.rb" with:
49
- """
50
- class Classy1; end # Should not be reported
51
- class M; end # Should not be reported
52
- class BaseHelper; end # Should be reported
53
- """
54
- When I run reek -c config.reek smelly.rb
55
- Then it reports:
56
- """
57
- smelly.rb -- 1 warning:
58
- [3]:UncommunicativeModuleName: BaseHelper has the name 'BaseHelper'
59
- """
60
-
61
- Scenario: UncommunicativeParameterName
62
- Given a file named "config.reek" with:
63
- """
64
- ---
65
- detectors:
66
- UncommunicativeParameterName:
67
- accept:
68
- - x
69
- - arg1
70
- reject:
71
- - foobar
72
- """
73
- And a file named "smelly.rb" with:
74
- """
75
- def omg(x); x; end # Should not be reported
76
- def omg(arg1); arg1; end # Should not be reported
77
- def omg(foobar); foobar; end # Should be reported
78
- """
79
- When I run reek -c config.reek smelly.rb
80
- Then it reports:
81
- """
82
- smelly.rb -- 1 warning:
83
- [3]:UncommunicativeParameterName: omg has the parameter name 'foobar'
84
- """