reek 6.0.2 → 6.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (271) 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 -12
  5. data/.rubocop_todo.yml +6 -4
  6. data/CHANGELOG.md +95 -0
  7. data/CONTRIBUTING.md +10 -10
  8. data/Dockerfile +1 -1
  9. data/Gemfile +8 -7
  10. data/README.md +29 -29
  11. data/bin/code_climate_reek +56 -8
  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 +22 -7
  18. data/lib/reek/cli/command/todo_list_command.rb +3 -3
  19. data/lib/reek/cli/options.rb +6 -6
  20. data/lib/reek/{report/code_climate → code_climate}/code_climate_configuration.rb +1 -1
  21. data/lib/reek/{report/code_climate → code_climate}/code_climate_configuration.yml +41 -41
  22. data/lib/reek/{report/code_climate → code_climate}/code_climate_fingerprint.rb +2 -2
  23. data/lib/reek/{report/code_climate → code_climate}/code_climate_formatter.rb +2 -4
  24. data/lib/reek/{report/code_climate → code_climate}/code_climate_report.rb +3 -3
  25. data/lib/reek/code_comment.rb +25 -20
  26. data/lib/reek/configuration/app_configuration.rb +5 -5
  27. data/lib/reek/configuration/configuration_converter.rb +1 -1
  28. data/lib/reek/configuration/configuration_file_finder.rb +5 -4
  29. data/lib/reek/configuration/default_directive.rb +1 -1
  30. data/lib/reek/configuration/directory_directives.rb +1 -1
  31. data/lib/reek/configuration/excluded_paths.rb +3 -2
  32. data/lib/reek/configuration/schema.rb +177 -0
  33. data/lib/reek/configuration/schema_validator.rb +12 -13
  34. data/lib/reek/context/attribute_context.rb +1 -1
  35. data/lib/reek/context/code_context.rb +1 -1
  36. data/lib/reek/context/method_context.rb +1 -1
  37. data/lib/reek/context/module_context.rb +4 -0
  38. data/lib/reek/context/refinement_context.rb +16 -0
  39. data/lib/reek/context/send_context.rb +7 -1
  40. data/lib/reek/context_builder.rb +17 -3
  41. data/lib/reek/documentation_link.rb +3 -5
  42. data/lib/reek/errors/bad_detector_configuration_key_in_comment_error.rb +2 -2
  43. data/lib/reek/errors/bad_detector_in_comment_error.rb +2 -2
  44. data/lib/reek/errors/encoding_error.rb +1 -1
  45. data/lib/reek/errors/garbage_detector_configuration_in_comment_error.rb +2 -2
  46. data/lib/reek/errors/incomprehensible_source_error.rb +1 -1
  47. data/lib/reek/errors/legacy_comment_separator_error.rb +2 -2
  48. data/lib/reek/errors/syntax_error.rb +1 -1
  49. data/lib/reek/rake/task.rb +5 -5
  50. data/lib/reek/smell_detectors/base_detector.rb +1 -1
  51. data/lib/reek/smell_detectors/class_variable.rb +2 -2
  52. data/lib/reek/smell_detectors/control_parameter_helpers/candidate.rb +6 -6
  53. data/lib/reek/smell_detectors/control_parameter_helpers/control_parameter_finder.rb +1 -1
  54. data/lib/reek/smell_detectors/duplicate_method_call.rb +5 -5
  55. data/lib/reek/smell_detectors/instance_variable_assumption.rb +8 -8
  56. data/lib/reek/smell_detectors/nested_iterators.rb +4 -3
  57. data/lib/reek/smell_detectors/unused_private_method.rb +3 -2
  58. data/lib/reek/smell_warning.rb +1 -1
  59. data/lib/reek/source/source_locator.rb +1 -3
  60. data/lib/reek/spec/should_reek_of.rb +11 -9
  61. data/lib/reek/spec.rb +1 -1
  62. data/lib/reek/version.rb +2 -2
  63. data/reek.gemspec +29 -25
  64. metadata +37 -250
  65. data/.travis.yml +0 -40
  66. data/docs/API.md +0 -174
  67. data/docs/Attribute.md +0 -39
  68. data/docs/Basic-Smell-Options.md +0 -85
  69. data/docs/Boolean-Parameter.md +0 -54
  70. data/docs/Class-Variable.md +0 -40
  71. data/docs/Code-Smells.md +0 -39
  72. data/docs/Command-Line-Options.md +0 -119
  73. data/docs/Control-Couple.md +0 -26
  74. data/docs/Control-Parameter.md +0 -32
  75. data/docs/Data-Clump.md +0 -46
  76. data/docs/Duplicate-Method-Call.md +0 -264
  77. data/docs/Feature-Envy.md +0 -93
  78. data/docs/How-To-Write-New-Detectors.md +0 -132
  79. data/docs/How-reek-works-internally.md +0 -114
  80. data/docs/Instance-Variable-Assumption.md +0 -163
  81. data/docs/Irresponsible-Module.md +0 -47
  82. data/docs/Large-Class.md +0 -16
  83. data/docs/Long-Parameter-List.md +0 -39
  84. data/docs/Long-Yield-List.md +0 -37
  85. data/docs/Manual-Dispatch.md +0 -30
  86. data/docs/Missing-Safe-Method.md +0 -92
  87. data/docs/Module-Initialize.md +0 -62
  88. data/docs/Nested-Iterators.md +0 -59
  89. data/docs/Nil-Check.md +0 -47
  90. data/docs/RSpec-matchers.md +0 -129
  91. data/docs/Rake-Task.md +0 -66
  92. data/docs/Reek-4-to-Reek-5-migration.md +0 -188
  93. data/docs/Reek-Driven-Development.md +0 -46
  94. data/docs/Repeated-Conditional.md +0 -47
  95. data/docs/Simulated-Polymorphism.md +0 -16
  96. data/docs/Smell-Suppression.md +0 -96
  97. data/docs/Style-Guide.md +0 -19
  98. data/docs/Subclassed-From-Core-Class.md +0 -79
  99. data/docs/Too-Many-Constants.md +0 -37
  100. data/docs/Too-Many-Instance-Variables.md +0 -43
  101. data/docs/Too-Many-Methods.md +0 -56
  102. data/docs/Too-Many-Statements.md +0 -54
  103. data/docs/Uncommunicative-Method-Name.md +0 -94
  104. data/docs/Uncommunicative-Module-Name.md +0 -92
  105. data/docs/Uncommunicative-Name.md +0 -18
  106. data/docs/Uncommunicative-Parameter-Name.md +0 -90
  107. data/docs/Uncommunicative-Variable-Name.md +0 -96
  108. data/docs/Unused-Parameters.md +0 -28
  109. data/docs/Unused-Private-Method.md +0 -101
  110. data/docs/Utility-Function.md +0 -56
  111. data/docs/Versioning-Policy.md +0 -7
  112. data/docs/YAML-Reports.md +0 -93
  113. data/docs/defaults.reek.yml +0 -129
  114. data/docs/templates/default/docstring/html/public_api_marker.erb +0 -3
  115. data/docs/templates/default/docstring/setup.rb +0 -37
  116. data/docs/templates/default/fulldoc/html/css/common.css +0 -1
  117. data/docs/yard_plugin.rb +0 -17
  118. data/features/command_line_interface/basic_usage.feature +0 -15
  119. data/features/command_line_interface/options.feature +0 -123
  120. data/features/command_line_interface/show_progress.feature +0 -33
  121. data/features/command_line_interface/smell_selection.feature +0 -15
  122. data/features/command_line_interface/smells_count.feature +0 -38
  123. data/features/command_line_interface/stdin.feature +0 -65
  124. data/features/configuration_files/accept_setting.feature +0 -87
  125. data/features/configuration_files/directory_specific_directives.feature +0 -274
  126. data/features/configuration_files/exclude_directives.feature +0 -35
  127. data/features/configuration_files/exclude_paths_directives.feature +0 -42
  128. data/features/configuration_files/masking_smells.feature +0 -94
  129. data/features/configuration_files/mix_accept_reject_setting.feature +0 -84
  130. data/features/configuration_files/reject_setting.feature +0 -89
  131. data/features/configuration_files/schema_validation.feature +0 -59
  132. data/features/configuration_files/show_configuration_file.feature +0 -44
  133. data/features/configuration_files/unused_private_method.feature +0 -68
  134. data/features/configuration_loading.feature +0 -91
  135. data/features/configuration_via_source_comments/erroneous_source_comments.feature +0 -68
  136. data/features/configuration_via_source_comments/well_formed_source_comments.feature +0 -116
  137. data/features/locales.feature +0 -32
  138. data/features/programmatic_access.feature +0 -41
  139. data/features/rake_task/rake_task.feature +0 -138
  140. data/features/reports/codeclimate.feature +0 -59
  141. data/features/reports/json.feature +0 -59
  142. data/features/reports/reports.feature +0 -219
  143. data/features/reports/yaml.feature +0 -52
  144. data/features/rspec_matcher.feature +0 -41
  145. data/features/samples.feature +0 -305
  146. data/features/step_definitions/.rubocop.yml +0 -5
  147. data/features/step_definitions/reek_steps.rb +0 -102
  148. data/features/step_definitions/sample_file_steps.rb +0 -63
  149. data/features/support/env.rb +0 -33
  150. data/features/todo_list.feature +0 -108
  151. data/lib/reek/configuration/schema.yml +0 -210
  152. data/samples/checkstyle.xml +0 -7
  153. data/samples/clean_source/clean.rb +0 -6
  154. data/samples/configuration/accepts_rejects_and_excludes_for_detectors.reek.yml +0 -29
  155. data/samples/configuration/accepts_rejects_and_excludes_for_directory_directives.reek.yml +0 -30
  156. data/samples/configuration/corrupt.reek +0 -1
  157. data/samples/configuration/empty.reek +0 -0
  158. data/samples/configuration/full_configuration.reek +0 -13
  159. data/samples/configuration/full_mask.reek +0 -6
  160. data/samples/configuration/home/home.reek.yml +0 -4
  161. data/samples/configuration/partial_mask.reek +0 -4
  162. data/samples/configuration/regular_configuration/.reek.yml +0 -4
  163. data/samples/configuration/regular_configuration/empty_sub_directory/.gitignore +0 -0
  164. data/samples/configuration/with_excluded_paths.reek +0 -5
  165. data/samples/no_config_file/.keep +0 -0
  166. data/samples/paths.rb +0 -5
  167. data/samples/smelly_source/inline.rb +0 -704
  168. data/samples/smelly_source/optparse.rb +0 -1788
  169. data/samples/smelly_source/redcloth.rb +0 -1130
  170. data/samples/smelly_source/ruby.rb +0 -368
  171. data/samples/smelly_source/smelly.rb +0 -7
  172. data/samples/source_with_exclude_paths/ignore_me/uncommunicative_method_name.rb +0 -5
  173. data/samples/source_with_exclude_paths/nested/ignore_me_as_well/irresponsible_module.rb +0 -2
  174. data/samples/source_with_exclude_paths/nested/uncommunicative_parameter_name.rb +0 -6
  175. data/samples/source_with_exclude_paths/nested/uncommunicative_variable_name.rb +0 -6
  176. data/samples/source_with_hidden_directories/.hidden/hidden.rb +0 -1
  177. data/samples/source_with_hidden_directories/not_hidden.rb +0 -1
  178. data/samples/source_with_non_ruby_files/gibberish +0 -1
  179. data/samples/source_with_non_ruby_files/python_source.py +0 -1
  180. data/samples/source_with_non_ruby_files/ruby.rb +0 -6
  181. data/spec/performance/reek/smell_detectors/runtime_speed_spec.rb +0 -15
  182. data/spec/quality/documentation_spec.rb +0 -41
  183. data/spec/quality/reek_source_spec.rb +0 -11
  184. data/spec/reek/ast/node_spec.rb +0 -211
  185. data/spec/reek/ast/object_refs_spec.rb +0 -83
  186. data/spec/reek/ast/reference_collector_spec.rb +0 -47
  187. data/spec/reek/ast/sexp_extensions_spec.rb +0 -498
  188. data/spec/reek/cli/application_spec.rb +0 -168
  189. data/spec/reek/cli/command/report_command_spec.rb +0 -44
  190. data/spec/reek/cli/command/todo_list_command_spec.rb +0 -86
  191. data/spec/reek/cli/options_spec.rb +0 -51
  192. data/spec/reek/cli/silencer_spec.rb +0 -28
  193. data/spec/reek/code_comment_spec.rb +0 -184
  194. data/spec/reek/configuration/app_configuration_spec.rb +0 -195
  195. data/spec/reek/configuration/configuration_file_finder_spec.rb +0 -230
  196. data/spec/reek/configuration/default_directive_spec.rb +0 -13
  197. data/spec/reek/configuration/directory_directives_spec.rb +0 -122
  198. data/spec/reek/configuration/excluded_paths_spec.rb +0 -16
  199. data/spec/reek/configuration/rake_task_converter_spec.rb +0 -33
  200. data/spec/reek/configuration/schema_validator_spec.rb +0 -165
  201. data/spec/reek/context/code_context_spec.rb +0 -192
  202. data/spec/reek/context/ghost_context_spec.rb +0 -60
  203. data/spec/reek/context/method_context_spec.rb +0 -72
  204. data/spec/reek/context/module_context_spec.rb +0 -55
  205. data/spec/reek/context/root_context_spec.rb +0 -12
  206. data/spec/reek/context/statement_counter_spec.rb +0 -24
  207. data/spec/reek/context_builder_spec.rb +0 -457
  208. data/spec/reek/detector_repository_spec.rb +0 -22
  209. data/spec/reek/documentation_link_spec.rb +0 -20
  210. data/spec/reek/errors/base_error_spec.rb +0 -13
  211. data/spec/reek/examiner_spec.rb +0 -309
  212. data/spec/reek/logging_error_handler_spec.rb +0 -24
  213. data/spec/reek/rake/task_spec.rb +0 -56
  214. data/spec/reek/report/code_climate/code_climate_configuration_spec.rb +0 -22
  215. data/spec/reek/report/code_climate/code_climate_fingerprint_spec.rb +0 -126
  216. data/spec/reek/report/code_climate/code_climate_formatter_spec.rb +0 -51
  217. data/spec/reek/report/code_climate/code_climate_report_spec.rb +0 -56
  218. data/spec/reek/report/html_report_spec.rb +0 -19
  219. data/spec/reek/report/json_report_spec.rb +0 -58
  220. data/spec/reek/report/location_formatter_spec.rb +0 -32
  221. data/spec/reek/report/progress_formatter_spec.rb +0 -68
  222. data/spec/reek/report/text_report_spec.rb +0 -89
  223. data/spec/reek/report/xml_report_spec.rb +0 -24
  224. data/spec/reek/report/yaml_report_spec.rb +0 -55
  225. data/spec/reek/report_spec.rb +0 -28
  226. data/spec/reek/smell_configuration_spec.rb +0 -56
  227. data/spec/reek/smell_detectors/attribute_spec.rb +0 -197
  228. data/spec/reek/smell_detectors/base_detector_spec.rb +0 -50
  229. data/spec/reek/smell_detectors/boolean_parameter_spec.rb +0 -93
  230. data/spec/reek/smell_detectors/class_variable_spec.rb +0 -106
  231. data/spec/reek/smell_detectors/control_parameter_spec.rb +0 -300
  232. data/spec/reek/smell_detectors/data_clump_spec.rb +0 -134
  233. data/spec/reek/smell_detectors/duplicate_method_call_spec.rb +0 -211
  234. data/spec/reek/smell_detectors/feature_envy_spec.rb +0 -295
  235. data/spec/reek/smell_detectors/instance_variable_assumption_spec.rb +0 -96
  236. data/spec/reek/smell_detectors/irresponsible_module_spec.rb +0 -226
  237. data/spec/reek/smell_detectors/long_parameter_list_spec.rb +0 -61
  238. data/spec/reek/smell_detectors/long_yield_list_spec.rb +0 -49
  239. data/spec/reek/smell_detectors/manual_dispatch_spec.rb +0 -75
  240. data/spec/reek/smell_detectors/missing_safe_method_spec.rb +0 -68
  241. data/spec/reek/smell_detectors/module_initialize_spec.rb +0 -77
  242. data/spec/reek/smell_detectors/nested_iterators_spec.rb +0 -333
  243. data/spec/reek/smell_detectors/nil_check_spec.rb +0 -100
  244. data/spec/reek/smell_detectors/repeated_conditional_spec.rb +0 -100
  245. data/spec/reek/smell_detectors/subclassed_from_core_class_spec.rb +0 -77
  246. data/spec/reek/smell_detectors/too_many_constants_spec.rb +0 -144
  247. data/spec/reek/smell_detectors/too_many_instance_variables_spec.rb +0 -132
  248. data/spec/reek/smell_detectors/too_many_methods_spec.rb +0 -54
  249. data/spec/reek/smell_detectors/too_many_statements_spec.rb +0 -90
  250. data/spec/reek/smell_detectors/uncommunicative_method_name_spec.rb +0 -78
  251. data/spec/reek/smell_detectors/uncommunicative_module_name_spec.rb +0 -78
  252. data/spec/reek/smell_detectors/uncommunicative_parameter_name_spec.rb +0 -147
  253. data/spec/reek/smell_detectors/uncommunicative_variable_name_spec.rb +0 -201
  254. data/spec/reek/smell_detectors/unused_parameters_spec.rb +0 -114
  255. data/spec/reek/smell_detectors/unused_private_method_spec.rb +0 -205
  256. data/spec/reek/smell_detectors/utility_function_spec.rb +0 -293
  257. data/spec/reek/smell_warning_spec.rb +0 -137
  258. data/spec/reek/source/source_code_spec.rb +0 -79
  259. data/spec/reek/source/source_locator_spec.rb +0 -166
  260. data/spec/reek/spec/should_reek_of_spec.rb +0 -153
  261. data/spec/reek/spec/should_reek_only_of_spec.rb +0 -91
  262. data/spec/reek/spec/should_reek_spec.rb +0 -52
  263. data/spec/reek/spec/smell_matcher_spec.rb +0 -87
  264. data/spec/reek/tree_dresser_spec.rb +0 -46
  265. data/spec/spec_helper.rb +0 -110
  266. data/tasks/configuration.rake +0 -18
  267. data/tasks/console.rake +0 -5
  268. data/tasks/reek.rake +0 -6
  269. data/tasks/rubocop.rake +0 -11
  270. data/tasks/test.rake +0 -32
  271. /data/lib/reek/{report/code_climate.rb → code_climate.rb} +0 -0
@@ -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
- """
@@ -1,89 +0,0 @@
1
- Feature: `reject` 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 reject specific patterns and names to include them into reporting
5
-
6
- Scenario: reject names
7
- Given a file named "config.reek" with:
8
- """
9
- ---
10
- detectors:
11
- UncommunicativeMethodName:
12
- reject:
13
- - awesome_helper
14
- - little_helper
15
- UncommunicativeParameterName:
16
- reject:
17
- - solid_argument
18
- - nifty_argument
19
- UncommunicativeModuleName:
20
- reject:
21
- - Dummy
22
- UncommunicativeVariableName:
23
- reject:
24
- - fine_name
25
- """
26
- And a file named "smelly.rb" with:
27
- """
28
- # Should report UncommunicativeModuleName
29
- class Dummy
30
- # Should report UncommunicativeMethodName and UncommunicativeParameterName
31
- def awesome_helper(solid_argument); solid_argument; end
32
- # Should report UncommunicativeMethodName and UncommunicativeParameterName
33
- def little_helper(nifty_argument); nifty_argument; end
34
- # Should not report UncommunicativeMethodName and UncommunicativeParameterName
35
- def meth(argument); argument; end
36
- fine_name = 2 # Should report UncommunicativeMethodName
37
- other_name = 2 # Should not report UncommunicativeMethodName
38
- end
39
- """
40
- When I run reek -c config.reek smelly.rb
41
- Then it reports:
42
- """
43
- smelly.rb -- 6 warnings:
44
- [4]:UncommunicativeMethodName: Dummy#awesome_helper has the name 'awesome_helper'
45
- [6]:UncommunicativeMethodName: Dummy#little_helper has the name 'little_helper'
46
- [2]:UncommunicativeModuleName: Dummy has the name 'Dummy'
47
- [4]:UncommunicativeParameterName: Dummy#awesome_helper has the parameter name 'solid_argument'
48
- [6]:UncommunicativeParameterName: Dummy#little_helper has the parameter name 'nifty_argument'
49
- [9]:UncommunicativeVariableName: Dummy has the variable name 'fine_name'
50
- """
51
-
52
- Scenario: Reject regexes
53
- Given a file named "config.reek" with:
54
- """
55
- ---
56
- detectors:
57
- UncommunicativeMethodName:
58
- accept:
59
- - /oobar/
60
- UncommunicativeParameterName:
61
- accept:
62
- - /ola/
63
- UncommunicativeModuleName:
64
- accept:
65
- - /lassy/
66
- UncommunicativeVariableName:
67
- reject:
68
- - /^fine_name/
69
- """
70
- And a file named "smelly.rb" with:
71
- """
72
- # Should not report UncommunicativeModuleName
73
- class Classy1
74
- # Should not report UncommunicativeMethodName and UncommunicativeParameterName
75
- def foobar1(hola1); hola1; end
76
- # Should report UncommunicativeMethodName and UncommunicativeParameterName
77
- def m2(a2); a2; end
78
- fine_name = 2 # Should report UncommunicativeMethodName
79
- my_fine_name = 2 # Should not report UncommunicativeMethodName
80
- end
81
- """
82
- When I run reek -c config.reek smelly.rb
83
- Then it reports:
84
- """
85
- smelly.rb -- 3 warnings:
86
- [6]:UncommunicativeMethodName: Classy1#m2 has the name 'm2'
87
- [6]:UncommunicativeParameterName: Classy1#m2 has the parameter name 'a2'
88
- [7]:UncommunicativeVariableName: Classy1 has the variable name 'fine_name'
89
- """
@@ -1,59 +0,0 @@
1
- Feature: Validate schema
2
- In order to ensure that I am using the right configuration
3
- As a user
4
- I want to be notified when I am using a configuration that violates our schema
5
-
6
- Scenario: Our generated default configuration
7
- Given our default configuration file
8
- And the clean file "clean.rb"
9
- When I run reek -c defaults.reek.yml clean.rb
10
- Then it succeeds
11
- And it reports nothing
12
-
13
- Scenario: Detectors, directories and exclude paths all mixed
14
- Given a file named "config.reek" with:
15
- """
16
- ---
17
- detectors:
18
- IrresponsibleModule:
19
- enabled: false
20
- NestedIterators:
21
- exclude:
22
- - "MyWorker#self.class_method"
23
- - "AnotherWorker#instance_method"
24
- DataClump:
25
- max_copies: 3
26
- min_clump_size: 3
27
-
28
- directories:
29
- "web_app/app/controllers":
30
- NestedIterators:
31
- enabled: false
32
- "web_app/app/helpers":
33
- UtilityFunction:
34
- enabled: false
35
-
36
- exclude_paths:
37
- - lib/legacy
38
- """
39
- And a directory named "lib/legacy"
40
- And the clean file "clean.rb"
41
- When I run reek -c config.reek clean.rb
42
- Then it succeeds
43
- And it reports nothing
44
-
45
- Scenario: Invalid detector name
46
- Given a file named "config.reek" with:
47
- """
48
- ---
49
- detectors:
50
- DoesNotExist:
51
- enabled: true
52
- """
53
- And the clean file "clean.rb"
54
- When I run reek -c config.reek clean.rb
55
- Then the exit status indicates an error
56
- And stderr reports:
57
- """
58
- Error: We found some problems with your configuration file: [/detectors/DoesNotExist] key 'DoesNotExist:' is undefined.
59
- """
@@ -1,44 +0,0 @@
1
- Feature: Show configuration file
2
- With Reeks dynamic mechanism of finding a configuration file you might run into a situation where you are not
3
- 100% sure what configuration file Reek is using. E.g. you have a project specific configuration file in your
4
- project root and also another Reek configuration in your HOME directory that you use for all your other projects
5
- and for whatever reasons Reek seems to be using another configuration file than the one you assumed it would.
6
- In this case you can pass the flag `--show-configuration-path` to Reek which will cause Reek to output the path
7
- to the configuration file it is using.
8
-
9
- Scenario: Default configuration file present
10
- Given the clean file "clean.rb"
11
- And an empty file named ".reek.yml"
12
- When I run reek --show-configuration-path clean.rb
13
- Then it reports:
14
- """
15
- Using '.reek.yml' as configuration file.
16
- """
17
-
18
- Scenario: Non-default configuration file passed via CLI
19
- Given the clean file "clean.rb"
20
- And an empty file named "config.reek"
21
- When I run reek --show-configuration-path -c config.reek clean.rb
22
- Then it reports:
23
- """
24
- Using 'config.reek' as configuration file.
25
- """
26
-
27
- Scenario: Display the right configuration file even when there are multiple files present
28
- Given the clean file "clean.rb"
29
- And an empty file named ".reek.yml"
30
- And an empty file named "config.reek"
31
- When I run reek --show-configuration-path -c config.reek clean.rb
32
- Then it reports:
33
- """
34
- Using 'config.reek' as configuration file.
35
- """
36
-
37
- Scenario: Use configuration file we find when traversing up the directory tree
38
- Given the clean file "clean.rb"
39
- And with a configuration file that is further up in the directory tree
40
- When I run reek --show-configuration-path clean.rb
41
- Then it reports:
42
- """
43
- Using '../../.reek.yml' as configuration file.
44
- """
@@ -1,68 +0,0 @@
1
- Feature: Unused Private Method detector
2
- This detector is a little special in the sense that it takes class contexts but analyzes
3
- methods (and thus, is configured in regards to methods) so we need to make sure
4
- that our configuration handling still works.
5
-
6
- Scenario: Differentiate between contexts when excluding them
7
- Given a file named "config.reek" with:
8
- """
9
- ---
10
- detectors:
11
- IrresponsibleModule:
12
- enabled: false
13
- UnusedPrivateMethod:
14
- enabled: true
15
- exclude:
16
- - Outer::Awesome#foobar
17
- """
18
- And a file named "sample.rb" with:
19
- """
20
- module Outer
21
- class Smelly
22
- private
23
- def foobar; end # Should report UnusedPrivateMethod
24
- end
25
- class Awesome
26
- private
27
- def foobar; end # Should not report UnusedPrivateMethod
28
- end
29
- end
30
- """
31
- When I run reek -c config.reek sample.rb
32
- Then it reports:
33
- """
34
- sample.rb -- 1 warning:
35
- [4]:UnusedPrivateMethod: Outer::Smelly has the unused private instance method 'foobar'
36
- """
37
-
38
- Scenario: Use regexes for excluding contexts
39
- Given a file named "config.reek" with:
40
- """
41
- ---
42
- detectors:
43
- IrresponsibleModule:
44
- enabled: false
45
- UnusedPrivateMethod:
46
- enabled: true
47
- exclude:
48
- - wesome#foo
49
- """
50
- And a file named "sample.rb" with:
51
- """
52
- module Outer
53
- class Smelly
54
- private
55
- def foobar; end # Should report UnusedPrivateMethod
56
- end
57
- class Awesome
58
- private
59
- def foobar; end # Should not report UnusedPrivateMethod
60
- end
61
- end
62
- """
63
- When I run reek -c config.reek sample.rb
64
- Then it reports:
65
- """
66
- sample.rb -- 1 warning:
67
- [4]:UnusedPrivateMethod: Outer::Smelly has the unused private instance method 'foobar'
68
- """
@@ -1,91 +0,0 @@
1
- Feature: Offer different ways how to load configuration
2
-
3
- Reek can be configured in two ways:
4
- - Using the cli "-c" switch to pass a configuration file on the command line.
5
- - Having a Reek configuration file that is automatically found. Reek will
6
- look for a file ending in .reek.yml in the following places, in order:
7
- - The current working directory
8
- - The working directory's ancestor directories, traversing all the way up
9
- to the root.
10
- - Your HOME directory
11
- Reek will check these in order and stop after the first file found.
12
-
13
- Scenario: Default configuration
14
- Given the smelly file 'smelly.rb'
15
- When I run reek smelly.rb
16
- Then the exit status indicates smells
17
- And it reports:
18
- """
19
- smelly.rb -- 2 warnings:
20
- [4]:UncommunicativeMethodName: Smelly#x has the name 'x'
21
- [5]:UncommunicativeVariableName: Smelly#x has the variable name 'y'
22
- """
23
-
24
- Scenario: Configuration via CLI
25
- Given the smelly file 'smelly.rb'
26
- And a configuration file 'full_mask.reek'
27
- When I run reek -c full_mask.reek smelly.rb
28
- Then it reports no errors
29
- And it succeeds
30
-
31
- Scenario: Configuration file in working directory
32
- Given the smelly file 'smelly.rb'
33
- And a file named ".reek.yml" with:
34
- """
35
- ---
36
- detectors:
37
- UncommunicativeMethodName:
38
- enabled: false
39
- UncommunicativeVariableName:
40
- enabled: false
41
- """
42
- When I run reek smelly.rb
43
- Then it reports no errors
44
- And it succeeds
45
-
46
- Scenario: Do not use the default config file when we explicitly specify one configuration file
47
- Given the smelly file 'smelly.rb'
48
- And a file named "config.reek" with:
49
- """
50
- ---
51
- detectors:
52
- UncommunicativeMethodName:
53
- enabled: false
54
- """
55
- And a file named ".reek.yml" with:
56
- """
57
- ---
58
- UncommunicativeVariableName:
59
- enabled: false
60
- """
61
- When I run reek -c config.reek smelly.rb
62
- Then the exit status indicates smells
63
- And it reports:
64
- """
65
- smelly.rb -- 1 warning:
66
- [5]:UncommunicativeVariableName: Smelly#x has the variable name 'y'
67
- """
68
-
69
- Scenario: Prefer the default config file over other configuration files
70
- Given the smelly file 'smelly.rb'
71
- And a file named "config.reek" with:
72
- """
73
- ---
74
- detectors:
75
- UncommunicativeMethodName:
76
- enabled: false
77
- """
78
- And a file named ".reek.yml" with:
79
- """
80
- ---
81
- detectors:
82
- UncommunicativeVariableName:
83
- enabled: false
84
- """
85
- When I run reek smelly.rb
86
- Then the exit status indicates smells
87
- And it reports:
88
- """
89
- smelly.rb -- 1 warning:
90
- [4]:UncommunicativeMethodName: Smelly#x has the name 'x'
91
- """
@@ -1,68 +0,0 @@
1
- Feature: Erroneous source comments are handled properly
2
- Erroneous source comments should be handled in a way that is intuitive and helpful
3
- for the user. Reek should neither crash nor silently swallow it.
4
- If there is something wrong - no matter how small it is - Reek should report it back
5
- to the user right away so the user can actually do something about it.
6
- If a user tries to deactivate an unknown smell detector (e.g. because he made a typo)
7
- we should just skip this file and tell the user about it so he can fix it and then
8
- re-run Reek.
9
-
10
- Scenario: Unknown smell detector
11
- Given a file named "bad_comment.rb" with:
12
- """
13
- # Test class
14
- # :reek:UnknownDetectorName
15
- def x
16
- end
17
- """
18
- When I run reek bad_comment.rb
19
- Then it reports the error "Error: You are trying to configure an unknown smell detector 'UnknownDetectorName'"
20
-
21
- Scenario: One good file, one bad file
22
- Given a file named "bad_comment.rb" with:
23
- """
24
- # Test class
25
- # :reek:UnknownDetectorName
26
- def x
27
- end
28
- """
29
- Given the smelly file 'smelly.rb'
30
- When I run reek bad_comment.rb smelly.rb
31
- Then it reports the error "Error: You are trying to configure an unknown smell detector 'UnknownDetectorName'"
32
- And the exit status indicates smells
33
- And it reports:
34
- """
35
- smelly.rb -- 2 warnings:
36
- [4]:UncommunicativeMethodName: Smelly#x has the name 'x'
37
- [5]:UncommunicativeVariableName: Smelly#x has the variable name 'y'
38
- 2 total warnings
39
- """
40
-
41
- Scenario: Garbage as content
42
- Given a file named "bad_comment.rb" with:
43
- """
44
- # Test class
45
- # :reek:UncommunicativeMethodName { thats: a: bad: config }
46
- def x
47
- end
48
- """
49
- When I run reek bad_comment.rb
50
- Then it reports the error "Error: You are trying to configure the smell detector 'UncommunicativeMethodName'"
51
- And it reports the error "Unfortunately we cannot parse the configuration you have given."
52
- And it reports the error "The source is 'bad_comment.rb'"
53
- And it reports the error "the comment belongs to the expression starting in line 3"
54
-
55
- Scenario: Bad configuration key
56
- Given a file named "bad_comment.rb" with:
57
- """
58
- # Test class
59
- # exclude -> elude and accept -> accipt are bad keys
60
- # :reek:UncommunicativeMethodName { elude: 'foo', accipt: 'bar' }
61
- def x
62
- end
63
- """
64
- When I run reek bad_comment.rb
65
- Then it reports the error "Error: You are trying to configure the smell detector 'UncommunicativeMethodName'"
66
- And it reports the error "in one of your source code comments with the unknown option 'elude', 'accipt'"
67
- And it reports the error "The source is 'bad_comment.rb'"
68
- And it reports the error "the comment belongs to the expression starting in line 4"