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,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"
@@ -1,116 +0,0 @@
1
- Feature: Well formed source comments are handled properly
2
- As a developer I want to be able to have a fine-grained control
3
- over how Reek handles smells via source code comments.
4
-
5
- Scenario: Disable smell detector implicitly
6
- Given a file named "disable_detector_implicitly.rb" with:
7
- """
8
- # Test class
9
- # :reek:TooManyInstanceVariables
10
- class Alfa
11
- def initialize
12
- @charlie = @delta = @echo = @foxtrot = @hotel = 1
13
- end
14
- end
15
- """
16
- When I run reek disable_detector_implicitly.rb
17
- Then it succeeds
18
- And it reports nothing
19
-
20
- Scenario: Disable smell detector explicitly
21
- Given a file named "disable_detector_explicitly.rb" with:
22
- """
23
- # Test class
24
- # :reek:TooManyInstanceVariables { enabled: false }
25
- class Alfa
26
- def initialize
27
- @charlie = @delta = @echo = @foxtrot = @hotel = 1
28
- end
29
- end
30
- """
31
- When I run reek disable_detector_explicitly.rb
32
- Then it succeeds
33
- And it reports nothing
34
-
35
- Scenario: Enable smell detector explicitly
36
- Given a file named "enable_detector_explicitly.rb" with:
37
- """
38
- # Test class
39
- # :reek:TooManyInstanceVariables { enabled: true }
40
- class Alfa
41
- def initialize
42
- @charlie = @delta = @echo = @foxtrot = @hotel = 1
43
- end
44
- end
45
- """
46
- When I run reek enable_detector_explicitly.rb
47
- Then the exit status indicates smells
48
- And it reports:
49
- """
50
- enable_detector_explicitly.rb -- 1 warning:
51
- [3]:TooManyInstanceVariables: Alfa has at least 5 instance variables
52
- """
53
-
54
- Scenario: Configure smell detector with the basic exclude option as string
55
- Given a file named "configure_exclude_option.rb" with:
56
- """
57
- # Test class
58
- # :reek:TooManyInstanceVariables { exclude: '@hotel' }
59
- class Alfa
60
- def initialize
61
- @charlie = @delta = @echo = @foxtrot = @hotel = 1
62
- end
63
- end
64
- """
65
- When I run reek configure_exclude_option.rb
66
- Then it succeeds
67
- And it reports nothing
68
-
69
- Scenario: Configure smell detector with the basic exclude option as regex
70
- Given a file named "configure_exclude_option.rb" with:
71
- """
72
- # Test class
73
- # :reek:TooManyInstanceVariables { exclude: /hotel/ }
74
- class Alfa
75
- def initialize
76
- @charlie = @delta = @echo = @foxtrot = @hotel = 1
77
- end
78
- end
79
- """
80
- When I run reek configure_exclude_option.rb
81
- Then it succeeds
82
- And it reports nothing
83
-
84
- Scenario: Configure smell detector with a detector specific option that silences it
85
- Given a file named "configure_detector_specific_option.rb" with:
86
- """
87
- # Test class
88
- # :reek:TooManyInstanceVariables { max_instance_variables: 5 }
89
- class Alfa
90
- def initialize
91
- @charlie = @delta = @echo = @foxtrot = @hotel = 1
92
- end
93
- end
94
- """
95
- When I run reek configure_detector_specific_option.rb
96
- Then it succeeds
97
- And it reports nothing
98
-
99
- Scenario: Configure smell detector with a detector specific option that makes it report again
100
- Given a file named "configure_detector_specific_option.rb" with:
101
- """
102
- # Test class
103
- # :reek:TooManyInstanceVariables { max_instance_variables: 2 }
104
- class Alfa
105
- def initialize
106
- @charlie = @delta = @echo = 1
107
- end
108
- end
109
- """
110
- When I run reek configure_detector_specific_option.rb
111
- Then the exit status indicates smells
112
- And it reports:
113
- """
114
- configure_detector_specific_option.rb -- 1 warning:
115
- [3]:TooManyInstanceVariables: Alfa has at least 3 instance variables
116
- """
@@ -1,32 +0,0 @@
1
- Feature: Handling different locales
2
- In order to work in a variety of environments
3
- As a developer
4
- I want Reek to work properly in any locale
5
-
6
- Scenario: Running Reek in an UTF-8 locale
7
- Given I set the environment variable "LANG" to "en_US.utf8"
8
- And a file "konnichiwa.rb" with:
9
- """
10
- puts 'こんにちは世界'
11
- """
12
- When I run reek -V konnichiwa.rb
13
- Then it succeeds
14
- And it reports no errors
15
- And it reports:
16
- """
17
- konnichiwa.rb -- 0 warnings
18
- """
19
-
20
- Scenario: Running Reek in the POSIX locale
21
- Given I set the environment variable "LANG" to "POSIX"
22
- And a file "konnichiwa.rb" with:
23
- """
24
- puts 'こんにちは世界'
25
- """
26
- When I run reek -V konnichiwa.rb
27
- Then it succeeds
28
- And it reports no errors
29
- And it reports:
30
- """
31
- konnichiwa.rb -- 0 warnings
32
- """
@@ -1,41 +0,0 @@
1
- Feature: Using Reek programmatically
2
- In order to use Reek from inside my program
3
- As a developer
4
- I want to be able to use its classes
5
-
6
- Scenario: Accessing smells found by an examiner
7
- Given the smelly file 'smelly.rb'
8
- And a file named "examine.rb" with:
9
- """
10
- require 'reek'
11
- examiner = Reek::Examiner.new(File.new('smelly.rb'))
12
- examiner.smells.each do |smell|
13
- puts smell.message
14
- end
15
- """
16
- When I run `ruby examine.rb`
17
- Then it reports no errors
18
- And it reports:
19
- """
20
- has the name 'x'
21
- has the variable name 'y'
22
- """
23
-
24
- Scenario: Using Reek's built-in report classes
25
- Given the smelly file 'smelly.rb'
26
- And a file named "examine.rb" with:
27
- """
28
- require 'reek'
29
- examiner = Reek::Examiner.new(File.new('smelly.rb'))
30
- report = Reek::Report::TextReport.new
31
- report.add_examiner examiner
32
- report.show
33
- """
34
- When I run `ruby examine.rb`
35
- Then it reports no errors
36
- And it reports:
37
- """
38
- smelly.rb -- 2 warnings:
39
- UncommunicativeMethodName: Smelly#x has the name 'x'
40
- UncommunicativeVariableName: Smelly#x has the variable name 'y'
41
- """