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,123 +0,0 @@
1
- Feature: Reek can be controlled using command-line options
2
- In order to change Reek's default behaviour
3
- As a developer
4
- I want to supply options on the command line
5
-
6
- Scenario: return non-zero status on bad option
7
- When I run reek --no-such-option
8
- Then the exit status indicates an error
9
- And it reports the error "Error: invalid option: --no-such-option"
10
- And there is no output on stdout
11
-
12
- Scenario: display the current version number
13
- When I run reek --version
14
- Then it succeeds
15
- And it reports the current version
16
-
17
- Scenario: return given status code when using --failure-exit-code
18
- Given the smelly file 'smelly.rb'
19
- When I run reek smelly.rb --failure-exit-code 23
20
- Then the exit status is 23
21
-
22
- Scenario: return given status code when using --success-exit-code
23
- Given the clean file "clean.rb"
24
- When I run reek clean.rb --success-exit-code 42
25
- Then the exit status is 42
26
-
27
- Scenario: display the help information
28
- When I run reek --help
29
- Then it succeeds
30
- And it reports:
31
- """
32
- Usage: reek [options] [files]
33
-
34
- Examples:
35
-
36
- reek lib/*.rb
37
- reek -s lib
38
- cat my_class.rb | reek
39
-
40
- See https://github.com/troessner/reek for detailed help.
41
-
42
- Configuration:
43
- -c, --config FILE Read configuration options from FILE
44
- --smell SMELL Only look for a specific smell.
45
- Call it like this: reek --smell MissingSafeMethod source.rb
46
- Check out https://github.com/troessner/reek/blob/v6.0.2/docs/Code-Smells.md for a list of smells
47
- --stdin-filename FILE When passing code in via pipe, assume this filename when checking file or directory rules in the config.
48
-
49
- Generate a todo list:
50
- -t, --todo Generate a todo list
51
-
52
- Report format:
53
- -f, --format FORMAT Report smells in the given format:
54
- html
55
- text (default)
56
- yaml
57
- json
58
- xml
59
-
60
- Text format options:
61
- --[no-]color Use colors for the output (default: true)
62
- -V, --[no-]empty-headings Show headings for smell-free source files (default: false)
63
- -U, --[no-]documentation Show link to related documentation page for each smell (default: true)
64
- --[no-]show-configuration-path
65
- Show which configuration file Reek is using (default: false)
66
- -n, --[no-]line-numbers Show line numbers in the output (default: true)
67
- -s, --single-line Show location in editor-compatible single-line-per-smell format
68
- -P, --[no-]progress Show progress of each source as it is examined (default: true)
69
- --sort-by SORTING Sort reported files by the given criterium:
70
- smelliness ("smelliest" files first)
71
- none (default - output in processing order)
72
- --force-exclusion Force excluding files specified in the configuration `exclude_paths`
73
- even if they are explicitly passed as arguments
74
-
75
- Exit codes:
76
- --success-exit-code CODE The exit code when no smells are found (default: 0)
77
- --failure-exit-code CODE The exit code when smells are found (default: 2)
78
-
79
- Utility options:
80
- -h, --help Show this message
81
- -l, --list List all available smell detectors
82
- -v, --version Show version
83
- """
84
-
85
- Scenario: List all available smell detectors
86
- When I run reek --list
87
- Then it succeeds
88
- And it reports:
89
- """
90
- All available smell detectors:
91
-
92
- Attribute
93
- BooleanParameter
94
- ClassVariable
95
- ControlParameter
96
- DataClump
97
- DuplicateMethodCall
98
- FeatureEnvy
99
- InstanceVariableAssumption
100
- IrresponsibleModule
101
- LongParameterList
102
- LongYieldList
103
- ManualDispatch
104
- MissingSafeMethod
105
- ModuleInitialize
106
- NestedIterators
107
- NilCheck
108
- RepeatedConditional
109
- SubclassedFromCoreClass
110
- TooManyConstants
111
- TooManyInstanceVariables
112
- TooManyMethods
113
- TooManyStatements
114
- UncommunicativeMethodName
115
- UncommunicativeModuleName
116
- UncommunicativeParameterName
117
- UncommunicativeVariableName
118
- UnusedParameters
119
- UnusedPrivateMethod
120
- UtilityFunction
121
-
122
- Check out https://github.com/troessner/reek/blob/v6.0.2/docs/Code-Smells.md for a details on each detector
123
- """
@@ -1,33 +0,0 @@
1
- Feature: Show progress
2
- In order to see the progress of the examiners
3
- As a developer
4
- I want to be able to selectively activate progress reporting
5
-
6
- # Note that --progress is the default on TTYs, but needs to be explicitely
7
- # enabled here because output in the cucumber scenarios does not go to a TTY.
8
- Scenario: shows progress output on mixed files by default
9
- Given a directory called 'mixed_files' containing some clean and smelly files
10
- When I run reek --progress mixed_files
11
- Then the exit status indicates smells
12
- And it reports:
13
- """
14
- Inspecting 2 file(s):
15
- .S
16
-
17
- mixed_files/dirty.rb -- 2 warnings:
18
- [4]:UncommunicativeMethodName: Smelly#x has the name 'x'
19
- [5]:UncommunicativeVariableName: Smelly#x has the variable name 'y'
20
- 2 total warnings
21
- """
22
-
23
- Scenario: --no-progress disables progress output
24
- Given a directory called 'mixed_files' containing some clean and smelly files
25
- When I run reek --no-progress mixed_files
26
- Then the exit status indicates smells
27
- And it reports:
28
- """
29
- mixed_files/dirty.rb -- 2 warnings:
30
- [4]:UncommunicativeMethodName: Smelly#x has the name 'x'
31
- [5]:UncommunicativeVariableName: Smelly#x has the variable name 'y'
32
- 2 total warnings
33
- """
@@ -1,15 +0,0 @@
1
- Feature: Smell selection
2
- In order to focus on particular code smells
3
- As a developer
4
- I want to be able to selectively activate smell detectors
5
-
6
- Scenario: --smell selects a smell to detect
7
- Given the smelly file 'smelly.rb'
8
- And a configuration file 'partial_mask.reek'
9
- When I run reek --no-line-numbers --smell UncommunicativeVariableName smelly.rb
10
- Then the exit status indicates smells
11
- And it reports:
12
- """
13
- smelly.rb -- 1 warning:
14
- UncommunicativeVariableName: Smelly#x has the variable name 'y'
15
- """
@@ -1,38 +0,0 @@
1
- Feature: Reports total number of code smells
2
- In order to monitor the total number of smells
3
- Reek outputs the total number of smells among all files inspected.
4
-
5
- Scenario: Does not output total number of smells when inspecting single file
6
- Given the smelly file 'smelly.rb'
7
- When I run reek smelly.rb
8
- Then the exit status indicates smells
9
- And it reports:
10
- """
11
- smelly.rb -- 2 warnings:
12
- [4]:UncommunicativeMethodName: Smelly#x has the name 'x'
13
- [5]:UncommunicativeVariableName: Smelly#x has the variable name 'y'
14
- """
15
-
16
- Scenario: Output total number of smells when inspecting multiple files
17
- Given a directory called 'smelly' containing two smelly files
18
- When I run reek smelly
19
- Then the exit status indicates smells
20
- And it reports:
21
- """
22
- smelly/dirty_one.rb -- 2 warnings:
23
- [4]:UncommunicativeMethodName: Smelly#x has the name 'x'
24
- [5]:UncommunicativeVariableName: Smelly#x has the variable name 'y'
25
- smelly/dirty_two.rb -- 2 warnings:
26
- [4]:UncommunicativeMethodName: Smelly#x has the name 'x'
27
- [5]:UncommunicativeVariableName: Smelly#x has the variable name 'y'
28
- 4 total warnings
29
- """
30
-
31
- Scenario: Output total number of smells even if total equals 0
32
- Given a directory called 'clean' containing two clean files
33
- When I run reek clean
34
- Then it succeeds
35
- And it reports:
36
- """
37
- 0 total warnings
38
- """
@@ -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
- """